1.8.1 fr this time

This commit is contained in:
deniscerri 2024-11-26 22:24:14 +01:00
parent 266c148585
commit 0f6d8d6494
No known key found for this signature in database
GPG key ID: 95C43D517D830350
24 changed files with 162 additions and 113 deletions

View file

@ -14,7 +14,8 @@
- Made the app remember the last used scheduled time so it can suggest you that time for the next download - Made the app remember the last used scheduled time so it can suggest you that time for the next download
- #618, made all preferences with a description show their values - #618, made all preferences with a description show their values
- Fixed bug that prevented app from loading all urls from text file - Fixed bug that prevented app from loading all urls from text file
- Added ability to write info json when downloading so when you resume an - Added ability to stop an observed source but not delete it
-
## Custom yt-dlp source ## Custom yt-dlp source

View file

@ -12,8 +12,6 @@ import androidx.work.Data
import androidx.work.ExistingWorkPolicy import androidx.work.ExistingWorkPolicy
import androidx.work.NetworkType import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequestBuilder import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.PeriodicWorkRequest
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import com.deniscerri.ytdl.database.DBManager import com.deniscerri.ytdl.database.DBManager
import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem
@ -50,7 +48,7 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
return repository.getByID(id) return repository.getByID(id)
} }
suspend fun insert(item: ObserveSourcesItem) : Long { suspend fun insertUpdate(item: ObserveSourcesItem) : Long {
if (item.id > 0) { if (item.id > 0) {
repository.update(item) repository.update(item)
observeTask(item) observeTask(item)
@ -63,6 +61,12 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
return id return id
} }
suspend fun stopObserving(item: ObserveSourcesItem) {
item.status = ObserveSourcesRepository.SourceStatus.STOPPED
repository.update(item)
cancelObservationTaskByID(item.id)
}
fun delete(item: ObserveSourcesItem) = viewModelScope.launch(Dispatchers.IO) { fun delete(item: ObserveSourcesItem) = viewModelScope.launch(Dispatchers.IO) {
runCatching { cancelObservationTaskByID(item.id) } runCatching { cancelObservationTaskByID(item.id) }
repository.delete(item) repository.delete(item)
@ -81,7 +85,7 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
} }
private fun cancelObservationTaskByID(id: Long){ private fun cancelObservationTaskByID(id: Long){
workManager.cancelAllWorkByTag(id.toString()) workManager.cancelAllWorkByTag("observation_$id")
} }
@ -136,7 +140,7 @@ class ObserveSourcesViewModel(private val application: Application) : AndroidVie
val workRequest = OneTimeWorkRequestBuilder<ObserveSourceWorker>() val workRequest = OneTimeWorkRequestBuilder<ObserveSourceWorker>()
.addTag("observeSources") .addTag("observeSources")
.addTag(it.id.toString()) .addTag("observation_${it.id}")
.setConstraints(workConstraints.build()) .setConstraints(workConstraints.build())
.setInitialDelay(timeInMillis - System.currentTimeMillis(), TimeUnit.MILLISECONDS) .setInitialDelay(timeInMillis - System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.setInputData(Data.Builder().putLong("id", it.id).build()) .setInputData(Data.Builder().putLong("id", it.id).build())

View file

@ -17,6 +17,7 @@ import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem
import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository
import com.deniscerri.ytdl.util.Extensions.calculateNextTimeForObserving import com.deniscerri.ytdl.util.Extensions.calculateNextTimeForObserving
import com.deniscerri.ytdl.util.Extensions.popup import com.deniscerri.ytdl.util.Extensions.popup
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
@ -93,29 +94,35 @@ class ObserveSourcesAdapter(onItemClickListener: OnItemClickListener, activity:
progressBar.isVisible = false progressBar.isVisible = false
// BUTTON ---------------------------------- // BUTTON ----------------------------------
val btn = card.findViewById<FloatingActionButton>(R.id.search) val searchBtn = card.findViewById<MaterialButton>(R.id.search)
btn.isEnabled = true val pauseBtn = card.findViewById<MaterialButton>(R.id.pause_resume)
searchBtn.isEnabled = true
pauseBtn.isEnabled = true
if (item.status == ObserveSourcesRepository.SourceStatus.STOPPED){ if (item.status == ObserveSourcesRepository.SourceStatus.STOPPED){
info.isVisible = false info.isVisible = false
checkMissing.isVisible = false searchBtn.isVisible = false
btn.setImageResource(R.drawable.exomedia_ic_play_arrow_white) pauseBtn.setIconResource(R.drawable.exomedia_ic_play_arrow_white)
btn.setOnClickListener { pauseBtn.setOnClickListener {
btn.isEnabled = false pauseBtn.isEnabled = false
progressBar.isVisible = true
progressBar.animate()
onItemClickListener.onItemStart(item, position) onItemClickListener.onItemStart(item, position)
} }
}else{ }else{
info.isVisible = true info.isVisible = true
searchBtn.isVisible = true
btn.setImageResource(R.drawable.ic_search) searchBtn.setOnClickListener {
btn.setOnClickListener { searchBtn.isEnabled = false
btn.isEnabled = false
progressBar.isVisible = true progressBar.isVisible = true
progressBar.animate() progressBar.animate()
onItemClickListener.onItemSearch(item) onItemClickListener.onItemSearch(item)
} }
pauseBtn.setIconResource(R.drawable.exomedia_ic_pause_white)
pauseBtn.setOnClickListener {
pauseBtn.isEnabled = false
onItemClickListener.onItemPaused(item, position)
}
} }
@ -132,6 +139,7 @@ class ObserveSourcesAdapter(onItemClickListener: OnItemClickListener, activity:
fun onItemSearch(item: ObserveSourcesItem) fun onItemSearch(item: ObserveSourcesItem)
fun onItemStart(item: ObserveSourcesItem, position: Int) fun onItemStart(item: ObserveSourcesItem, position: Int)
fun onItemPaused(item: ObserveSourcesItem, position: Int)
fun onItemClick(item: ObserveSourcesItem) fun onItemClick(item: ObserveSourcesItem)
fun onDelete(item: ObserveSourcesItem) fun onDelete(item: ObserveSourcesItem)
} }

View file

@ -535,7 +535,7 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() {
) )
withContext(Dispatchers.IO){ withContext(Dispatchers.IO){
observeSourcesViewModel.insert(observeItem) observeSourcesViewModel.insertUpdate(observeItem)
} }
dismiss() dismiss()
} }

View file

@ -2,7 +2,6 @@ package com.deniscerri.ytdl.ui.more
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -153,13 +152,22 @@ class ObserveSourcesFragment : Fragment(), ObserveSourcesAdapter.OnItemClickList
withContext(Dispatchers.IO){ withContext(Dispatchers.IO){
item.status = ObserveSourcesRepository.SourceStatus.ACTIVE item.status = ObserveSourcesRepository.SourceStatus.ACTIVE
item.runCount = 0 item.runCount = 0
observeSourcesViewModel.insert(item) observeSourcesViewModel.insertUpdate(item)
} }
listAdapter.notifyItemChanged(position) listAdapter.notifyItemChanged(position)
} }
} }
override fun onItemPaused(item: ObserveSourcesItem, position: Int) {
lifecycleScope.launch {
withContext(Dispatchers.IO){
observeSourcesViewModel.stopObserving(item)
}
listAdapter.notifyItemChanged(position)
}
}
override fun onItemClick(item: ObserveSourcesItem) { override fun onItemClick(item: ObserveSourcesItem) {
showDialog(item.url) showDialog(item.url)
} }

View file

@ -5,7 +5,6 @@ import android.app.Activity
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
@ -13,12 +12,9 @@ import android.util.LayoutDirection
import android.util.Log import android.util.Log
import android.view.Gravity import android.view.Gravity
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.TextView import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.os.LocaleListCompat import androidx.core.os.LocaleListCompat
@ -31,7 +27,6 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.work.WorkInfo import androidx.work.WorkInfo
import androidx.work.WorkManager import androidx.work.WorkManager
import com.afollestad.materialdialogs.utils.MDUtil.getStringArray
import com.deniscerri.ytdl.BuildConfig import com.deniscerri.ytdl.BuildConfig
import com.deniscerri.ytdl.MainActivity import com.deniscerri.ytdl.MainActivity
import com.deniscerri.ytdl.R import com.deniscerri.ytdl.R
@ -52,17 +47,13 @@ import com.deniscerri.ytdl.database.viewmodel.ResultViewModel
import com.deniscerri.ytdl.util.FileUtil import com.deniscerri.ytdl.util.FileUtil
import com.deniscerri.ytdl.util.UiUtil import com.deniscerri.ytdl.util.UiUtil
import com.deniscerri.ytdl.util.UpdateUtil import com.deniscerri.ytdl.util.UpdateUtil
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputLayout
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.google.gson.JsonArray import com.google.gson.JsonArray
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.google.gson.JsonParser import com.google.gson.JsonParser
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -754,7 +745,7 @@ class MainSettingsFragment : PreferenceFragmentCompat() {
withContext(Dispatchers.IO){ withContext(Dispatchers.IO){
if (resetData) observeSourcesViewModel.deleteAll() if (resetData) observeSourcesViewModel.deleteAll()
data.observeSources!!.forEach { data.observeSources!!.forEach {
observeSourcesViewModel.insert(it) observeSourcesViewModel.insertUpdate(it)
} }
} }
} }

View file

@ -134,7 +134,7 @@ class UpdateSettingsFragment : BaseSettingsFragment() {
private fun setYTDLPVersion() { private fun setYTDLPVersion() {
lifecycleScope.launch { lifecycleScope.launch {
ytdlVersion!!.summary = "" ytdlVersion!!.summary = getString(R.string.loading)
val version = withContext(Dispatchers.IO){ val version = withContext(Dispatchers.IO){
ytdlpUtil.getVersion() ytdlpUtil.getVersion()
} }

View file

@ -165,7 +165,7 @@ class YTDLPUtil(private val context: Context) {
if (url.isYoutubeURL()) { if (url.isYoutubeURL()) {
authorTags.addAll(0, listOf("artists", "artist")) authorTags.addAll(0, listOf("artists", "artist"))
} }
var author = jsonObject.getStringByAny(*authorTags.map { it }.toTypedArray()) var author = jsonObject.getStringByAny(*authorTags.map { it }.toTypedArray()).removeSuffix(" - Topic")
var duration = jsonObject.getIntByAny("duration").toString() var duration = jsonObject.getIntByAny("duration").toString()
if (duration != "-1"){ if (duration != "-1"){
duration = jsonObject.getInt("duration").toStringDuration(Locale.US) duration = jsonObject.getInt("duration").toStringDuration(Locale.US)
@ -447,8 +447,9 @@ class YTDLPUtil(private val context: Context) {
} }
val formatProper = Gson().fromJson(format.toString(), Format::class.java) val formatProper = Gson().fromJson(format.toString(), Format::class.java)
if (formatProper.format_note == null) continue if (formatProper.format_note == null) formatProper.format_note = ""
val resolution = format.getString("resolution")
if (format.has("format_note")){ if (format.has("format_note")){
if (!formatProper!!.format_note.contains("audio only", true)) { if (!formatProper!!.format_note.contains("audio only", true)) {
formatProper.format_note = format.getString("format_note") formatProper.format_note = format.getString("format_note")
@ -457,12 +458,18 @@ class YTDLPUtil(private val context: Context) {
formatProper.format_note = format.getString("format_note").uppercase().removeSuffix("AUDIO") + " AUDIO" formatProper.format_note = format.getString("format_note").uppercase().removeSuffix("AUDIO") + " AUDIO"
} }
} }
if (!resolution.isNullOrBlank() && resolution != "audio only") {
formatProper.format_note = "${formatProper.format_note} (${resolution})"
}
} }
if (formatProper.format_note == "storyboard") continue
if (formatProper.format_note.contains("storyboard", ignoreCase = true)) continue
formatProper.container = format.getString("ext") formatProper.container = format.getString("ext")
if (formatProper.tbr == "None") formatProper.tbr = "" if (formatProper.tbr == "None") formatProper.tbr = ""
if (!formatProper.tbr.isNullOrBlank()){ if (!formatProper.tbr.isNullOrBlank()){
formatProper.tbr = formatProper.tbr + "k" formatProper.tbr += "k"
} }
if(formatProper.vcodec.isNullOrEmpty() || formatProper.vcodec == "null"){ if(formatProper.vcodec.isNullOrEmpty() || formatProper.vcodec == "null"){
@ -1173,9 +1180,13 @@ class YTDLPUtil(private val context: Context) {
} }
val lang = Locale.getDefault().language val lang = Locale.getDefault().language
val langTag = Locale.getDefault().toLanguageTag()
if (context.getStringArray(R.array.subtitle_langs).contains(lang)) { if (context.getStringArray(R.array.subtitle_langs).contains(lang)) {
extractorArgs.add("lang=$lang") extractorArgs.add("lang=$lang")
} }
if (context.getStringArray(R.array.subtitle_langs).contains(langTag)) {
extractorArgs.add("lang=$langTag")
}
if (poToken.isNotBlank()) { if (poToken.isNotBlank()) {
extractorArgs.add("po_token=web+$poToken") extractorArgs.add("po_token=web+$poToken")
} }

View file

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M6,6h12v12H6z"/>
</vector>

View file

@ -10,7 +10,7 @@
<RelativeLayout <RelativeLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintDimensionRatio="H,2:1" app:layout_constraintDimensionRatio="H,2.7:1"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -43,48 +43,43 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <TextView
android:id="@+id/title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="wrap_content"
android:dividerPadding="5dp" android:ellipsize="end"
android:orientation="vertical" android:maxLines="2"
android:layout_marginEnd="10dp" android:paddingStart="10dp"
app:layout_constraintBottom_toTopOf="@+id/search" android:paddingTop="10dp"
app:layout_constraintEnd_toStartOf="@id/check_missing" android:paddingEnd="10dp"
android:scrollbars="none"
android:shadowRadius="2"
android:textColor="#FFF"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@+id/check_missing"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/title" android:id="@+id/url"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:gravity="bottom"
android:paddingStart="10dp" android:maxLines="1"
android:paddingTop="10dp" android:paddingStart="10dp"
android:paddingEnd="10dp" android:paddingEnd="10dp"
android:scrollbars="none" android:scrollbars="none"
android:shadowRadius="2" android:shadowRadius="1.5"
android:textColor="#FFF" android:textColor="#FFF"
android:textSize="17sp" android:textSize="12sp"
android:textStyle="bold" /> android:textStyle="bold"
app:layout_constraintVertical_bias="0.0"
<TextView app:layout_constraintBottom_toTopOf="@+id/buttons"
android:id="@+id/url" app:layout_constraintEnd_toStartOf="@+id/check_missing"
android:layout_width="match_parent" app:layout_constraintStart_toStartOf="parent"
android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/title" />
android:ellipsize="end"
android:gravity="bottom"
android:maxLines="1"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:scrollbars="none"
android:shadowRadius="1.5"
android:textColor="#FFF"
android:textSize="12sp"
android:textStyle="bold" />
</LinearLayout>
<Button <Button
@ -98,7 +93,7 @@
android:padding="0dp" android:padding="0dp"
android:minHeight="0dp" android:minHeight="0dp"
app:icon="@drawable/ic_restore" app:icon="@drawable/ic_restore"
app:layout_constraintBottom_toTopOf="@+id/search" app:layout_constraintBottom_toTopOf="@+id/buttons"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@ -107,26 +102,52 @@
style="@style/Widget.Material3.Chip.Assist.Elevated" style="@style/Widget.Material3.Chip.Assist.Elevated"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_margin="10dp" android:layout_margin="12dp"
app:chipMinTouchTargetSize="0dp"
app:chipIcon="@drawable/baseline_loop_24" app:chipIcon="@drawable/baseline_loop_24"
app:chipIconVisible="true" app:chipIconVisible="true"
app:chipMinTouchTargetSize="0dp"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/buttons"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <LinearLayout
android:id="@+id/search" android:id="@+id/buttons"
style="@style/Widget.Material3.ExtendedFloatingActionButton.Icon.Secondary" android:layout_width="0dp"
android:layout_width="55dp" android:layout_height="wrap_content"
android:layout_height="55dp"
android:layout_margin="10dp" android:layout_margin="10dp"
app:elevation="0dp" android:orientation="horizontal"
android:elevation="0dp"
app:borderWidth="0dp"
android:src="@drawable/ic_search"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/pause_resume"
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="0dp"
app:borderWidth="0dp"
app:cornerRadius="10dp"
app:elevation="0dp"
app:icon="@drawable/exomedia_ic_pause_white"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/search"
style="@style/Widget.Material3.Button.IconButton.Filled.Tonal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="0dp"
android:src="@drawable/ic_search"
app:borderWidth="0dp"
app:cornerRadius="10dp"
app:elevation="0dp"
app:icon="@drawable/ic_search"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -50,7 +50,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:autoLink="all" android:autoLink="all"
android:text="@string/add" android:text="@string/add"
app:icon="@drawable/ic_check" app:icon="@drawable/ic_plus"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />

View file

@ -177,7 +177,7 @@
<string name="ignore_battery_optimization">تجاهل تحسين البطارية</string> <string name="ignore_battery_optimization">تجاهل تحسين البطارية</string>
<string name="log_downloads_summary">إنشاء ملف سجل للتنزيل المكتمل</string> <string name="log_downloads_summary">إنشاء ملف سجل للتنزيل المكتمل</string>
<string name="shortcuts_desc">طريقة وصول أسرع للأوامر كثيرة الاستخدام</string> <string name="shortcuts_desc">طريقة وصول أسرع للأوامر كثيرة الاستخدام</string>
<string name="restrict_filenames_summary"><![CDATA[تقييد أسماء الملفات لتشمل أحرف ASCII فقط، وتجنب \"&\" والمسافات في أسماء الملفات]]></string> <string name="restrict_filenames_summary">تقييد أسماء الملفات لتشمل أحرف ASCII فقط، وتجنب \"&amp;\" والمسافات في أسماء الملفات</string>
<string name="add_chapters_summary">تعليم أجزاء مقطع اليوتيوب و/أو حاجب شرائح الإعلانات كفصول للفيديو</string> <string name="add_chapters_summary">تعليم أجزاء مقطع اليوتيوب و/أو حاجب شرائح الإعلانات كفصول للفيديو</string>
<string name="container">الصيغة</string> <string name="container">الصيغة</string>
<string name="cut">قص</string> <string name="cut">قص</string>
@ -381,7 +381,7 @@
<string name="disabled">معطّل</string> <string name="disabled">معطّل</string>
<string name="subtitles">الترجمات</string> <string name="subtitles">الترجمات</string>
<string name="prevent_duplicate_downloads">منع التنزيلات المكررة</string> <string name="prevent_duplicate_downloads">منع التنزيلات المكررة</string>
<string name="prevent_duplicate_url_type"><![CDATA[عنوان URL ونوع التنزيل]]></string> <string name="prevent_duplicate_url_type">عنوان URL ونوع التنزيل</string>
<string name="prevent_duplicate_config">التكوين كاملًا</string> <string name="prevent_duplicate_config">التكوين كاملًا</string>
<string name="copy_url">نسخ الرابط</string> <string name="copy_url">نسخ الرابط</string>
<string name="move_bottom">نقل للأسفل</string> <string name="move_bottom">نقل للأسفل</string>

View file

@ -172,7 +172,7 @@
<string name="best_quality">Ən Yaxşı Keyfiyyət</string> <string name="best_quality">Ən Yaxşı Keyfiyyət</string>
<string name="worst_quality">Ən Pis Keyfiyyət</string> <string name="worst_quality">Ən Pis Keyfiyyət</string>
<string name="restrict_filenames">Fayl adların məhdudlaşdır</string> <string name="restrict_filenames">Fayl adların məhdudlaşdır</string>
<string name="restrict_filenames_summary"><![CDATA[Fayl adların ancaq ASCII simvollarıyla məhdudlaşdır və fayl adlarında \"&"\ və boşluqlar yaratma]]></string> <string name="restrict_filenames_summary">Fayl adların ancaq ASCII simvollarıyla məhdudlaşdır və fayl adlarında \"&amp;"\ və boşluqlar yaratma</string>
<string name="kill_app">Tətbiqi Dayandır</string> <string name="kill_app">Tətbiqi Dayandır</string>
<string name="confirm_terminate">Bütün yükləmələri dayandırır və tətbiqi zorla bağlayır</string> <string name="confirm_terminate">Bütün yükləmələri dayandırır və tətbiqi zorla bağlayır</string>
<string name="dont_ask_again">Təkrar soruşma</string> <string name="dont_ask_again">Təkrar soruşma</string>
@ -381,7 +381,7 @@
<string name="disabled">Qeyri-aktiv</string> <string name="disabled">Qeyri-aktiv</string>
<string name="subtitles">Titrlər</string> <string name="subtitles">Titrlər</string>
<string name="prevent_duplicate_downloads">Eyni Yükləmələrin Qarşısını Al</string> <string name="prevent_duplicate_downloads">Eyni Yükləmələrin Qarşısını Al</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL və Yükləmə Növü]]></string> <string name="prevent_duplicate_url_type">URL və Yükləmə Növü</string>
<string name="prevent_duplicate_config">Tam Konfiqurasiya</string> <string name="prevent_duplicate_config">Tam Konfiqurasiya</string>
<string name="copy_url">URL-i Köçür</string> <string name="copy_url">URL-i Köçür</string>
<string name="move_top">Yuxarıya keçin</string> <string name="move_top">Yuxarıya keçin</string>

View file

@ -172,7 +172,7 @@
<string name="best_quality">Mejor Calidad</string> <string name="best_quality">Mejor Calidad</string>
<string name="worst_quality">Peor Calidad</string> <string name="worst_quality">Peor Calidad</string>
<string name="restrict_filenames">Restringir nombres de archivos</string> <string name="restrict_filenames">Restringir nombres de archivos</string>
<string name="restrict_filenames_summary"><![CDATA[Restringe los nombres de archivo a sólo caracteres ASCII y evita \"&\" y espacios en los nombres de archivo]]></string> <string name="restrict_filenames_summary">Restringe los nombres de archivo a sólo caracteres ASCII y evita \"&amp;\" y espacios en los nombres de archivo</string>
<string name="kill_app">Terminar la aplicación</string> <string name="kill_app">Terminar la aplicación</string>
<string name="confirm_terminate">Detiene todas las descargas y fuerza el cierre de la aplicación</string> <string name="confirm_terminate">Detiene todas las descargas y fuerza el cierre de la aplicación</string>
<string name="dont_ask_again">No vuelvas a preguntar</string> <string name="dont_ask_again">No vuelvas a preguntar</string>
@ -381,7 +381,7 @@
<string name="disabled">Desactivado</string> <string name="disabled">Desactivado</string>
<string name="subtitles">Subtítulos</string> <string name="subtitles">Subtítulos</string>
<string name="prevent_duplicate_downloads">Evitar descargas duplicadas</string> <string name="prevent_duplicate_downloads">Evitar descargas duplicadas</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL y Tipo de descarga]]></string> <string name="prevent_duplicate_url_type">URL y Tipo de descarga</string>
<string name="prevent_duplicate_config">Configuración completa</string> <string name="prevent_duplicate_config">Configuración completa</string>
<string name="copy_url">Copiar la URL</string> <string name="copy_url">Copiar la URL</string>
<string name="move_top">Mover de primero</string> <string name="move_top">Mover de primero</string>

View file

@ -265,7 +265,7 @@
<string name="cancelled">Anulowane</string> <string name="cancelled">Anulowane</string>
<string name="access_all_directories_summary">Zezwól aplikacji na pobieranie do katalogów, które są domyślnie ograniczone</string> <string name="access_all_directories_summary">Zezwól aplikacji na pobieranie do katalogów, które są domyślnie ograniczone</string>
<string name="clear_temporary_files_summary">Usuń pliki pamięci podręcznej z pobrań zakończonych awarią, błędem bądź anulowaniem</string> <string name="clear_temporary_files_summary">Usuń pliki pamięci podręcznej z pobrań zakończonych awarią, błędem bądź anulowaniem</string>
<string name="restrict_filenames_summary"><![CDATA[Ogranicz nazwy plików tylko do znaków ASCII i unikaj \„&\” i spacji w nazwach plików]]></string> <string name="restrict_filenames_summary">Ogranicz nazwy plików tylko do znaków ASCII i unikaj \„&amp;\” i spacji w nazwach plików</string>
<string name="confirm_terminate">Zatrzymuje wszystkie pobierania i wymusza zamknięcie aplikacji</string> <string name="confirm_terminate">Zatrzymuje wszystkie pobierania i wymusza zamknięcie aplikacji</string>
<string name="download_over_metered_networks_summary">Umożliwia pobieranie przez dowolną sieć. Jeśli opcja nie jest wybrana, aplikacja czeka na sieć bez planu taryfowego</string> <string name="download_over_metered_networks_summary">Umożliwia pobieranie przez dowolną sieć. Jeśli opcja nie jest wybrana, aplikacja czeka na sieć bez planu taryfowego</string>
<string name="format_filtering_hint">Aby można było użyć tej opcji, wszystkie elementy muszą być tego samego typu</string> <string name="format_filtering_hint">Aby można było użyć tej opcji, wszystkie elementy muszą być tego samego typu</string>
@ -389,7 +389,7 @@
<string name="disabled">Wyłączone</string> <string name="disabled">Wyłączone</string>
<string name="subtitles">Napisy</string> <string name="subtitles">Napisy</string>
<string name="prevent_duplicate_downloads">Zapobieganie pobieraniu duplikatów</string> <string name="prevent_duplicate_downloads">Zapobieganie pobieraniu duplikatów</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL i typ pobierania]]></string> <string name="prevent_duplicate_url_type">URL i typ pobierania</string>
<string name="prevent_duplicate_config">Pełna konfiguracja</string> <string name="prevent_duplicate_config">Pełna konfiguracja</string>
<string name="copy_url">Kopiuj adres URL</string> <string name="copy_url">Kopiuj adres URL</string>
<string name="scheduled">Zaplanowane</string> <string name="scheduled">Zaplanowane</string>

View file

@ -248,7 +248,7 @@
<string name="kill_app">Encerrar Aplicativo</string> <string name="kill_app">Encerrar Aplicativo</string>
<string name="freespace">Espaço livre</string> <string name="freespace">Espaço livre</string>
<string name="dont_ask_again">Não perguntar novamente</string> <string name="dont_ask_again">Não perguntar novamente</string>
<string name="restrict_filenames_summary"><![CDATA[Restringir nomes de arquivos apenas a caracteres ASCII e evite \"&\" e espaços em nomes de arquivos]]></string> <string name="restrict_filenames_summary">Restringir nomes de arquivos apenas a caracteres ASCII e evite \"&amp;\" e espaços em nomes de arquivos</string>
<string name="template">Modelo</string> <string name="template">Modelo</string>
<string name="sponsorblock_nonmusic">Partes sem música e sem relação com o tema</string> <string name="sponsorblock_nonmusic">Partes sem música e sem relação com o tema</string>
<string name="container">Contêiner</string> <string name="container">Contêiner</string>

View file

@ -179,7 +179,7 @@
<string name="share">Поделиться</string> <string name="share">Поделиться</string>
<string name="confirm_delete_cookies_desc">Удалить все Cookies без возможности восстановления</string> <string name="confirm_delete_cookies_desc">Удалить все Cookies без возможности восстановления</string>
<string name="restrict_filenames">Ограничение имён файлов</string> <string name="restrict_filenames">Ограничение имён файлов</string>
<string name="restrict_filenames_summary"><![CDATA[Ограничивайте имена файлов только символами ASCII и избегайте \"&\" пробелы в именах файлов]]></string> <string name="restrict_filenames_summary">Ограничивайте имена файлов только символами ASCII и избегайте \"&amp;\" пробелы в именах файлов</string>
<string name="download_over_metered_networks">Загружать через сети с тарифным планом</string> <string name="download_over_metered_networks">Загружать через сети с тарифным планом</string>
<string name="metered_network_download_start_info">Загрузка начнется при подключении к безлимитной сети</string> <string name="metered_network_download_start_info">Загрузка начнется при подключении к безлимитной сети</string>
<string name="kill_app">Завершить работу</string> <string name="kill_app">Завершить работу</string>
@ -381,7 +381,7 @@
<string name="disabled">Отключено</string> <string name="disabled">Отключено</string>
<string name="subtitles">Субтитры</string> <string name="subtitles">Субтитры</string>
<string name="prevent_duplicate_downloads">Предотвращение дублирования загрузок</string> <string name="prevent_duplicate_downloads">Предотвращение дублирования загрузок</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL & Тип загрузки]]></string> <string name="prevent_duplicate_url_type">URL &amp; Тип загрузки</string>
<string name="prevent_duplicate_config">Полная конфигурация</string> <string name="prevent_duplicate_config">Полная конфигурация</string>
<string name="copy_url">Копировать URL</string> <string name="copy_url">Копировать URL</string>
<string name="move_top">Перейти вверх</string> <string name="move_top">Перейти вверх</string>

View file

@ -172,7 +172,7 @@
<string name="freespace">Hapësirë e lirë</string> <string name="freespace">Hapësirë e lirë</string>
<string name="link_you_copied">Linku i kopjuar</string> <string name="link_you_copied">Linku i kopjuar</string>
<string name="restrict_filenames">Limito Titujt</string> <string name="restrict_filenames">Limito Titujt</string>
<string name="restrict_filenames_summary"><![CDATA[Kufizoni emrat e skedarëve vetëm në karaktere ASCII dhe shmangni \"&\" dhe hapësirat në emrat e skedarëve]]></string> <string name="restrict_filenames_summary">Kufizoni emrat e skedarëve vetëm në karaktere ASCII dhe shmangni \"&amp;\" dhe hapësirat në emrat e skedarëve</string>
<string name="kill_app">Ndalo Aplikacionin</string> <string name="kill_app">Ndalo Aplikacionin</string>
<string name="confirm_terminate">Ndalon të gjithë shkarkimet dhe mbyll me forcë aplikacionin</string> <string name="confirm_terminate">Ndalon të gjithë shkarkimet dhe mbyll me forcë aplikacionin</string>
<string name="end">Fundi</string> <string name="end">Fundi</string>
@ -381,7 +381,7 @@
<string name="no_download_fragments_summary">Mos përdorni skedarë .part dhe shkruani direkt në skedarin dalës</string> <string name="no_download_fragments_summary">Mos përdorni skedarë .part dhe shkruani direkt në skedarin dalës</string>
<string name="subtitles">Titrat</string> <string name="subtitles">Titrat</string>
<string name="prevent_duplicate_downloads">Parandalo Shkarkimet Duplikate</string> <string name="prevent_duplicate_downloads">Parandalo Shkarkimet Duplikate</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL &Lloji i shkarkimit]]></string> <string name="prevent_duplicate_url_type">URL &amp; Lloji i shkarkimit</string>
<string name="prevent_duplicate_config">Konfigurimi i plotë</string> <string name="prevent_duplicate_config">Konfigurimi i plotë</string>
<string name="copy_url">Kopjo URL</string> <string name="copy_url">Kopjo URL</string>
<string name="move_top">Vendose në fillim</string> <string name="move_top">Vendose në fillim</string>

View file

@ -243,7 +243,7 @@
<string name="search">Претрага</string> <string name="search">Претрага</string>
<string name="keep_cache">Задржи фрагменте</string> <string name="keep_cache">Задржи фрагменте</string>
<string name="file_size">Величина фајла</string> <string name="file_size">Величина фајла</string>
<string name="restrict_filenames_summary"><![CDATA[Ограничите називе фајлова само на ASCII знакове и избегавајте \"&\" и размаке у називима фајлова]]></string> <string name="restrict_filenames_summary">Ограничите називе фајлова само на ASCII знакове и избегавајте \"&amp;\" и размаке у називима фајлова</string>
<string name="auto">Аутоматски</string> <string name="auto">Аутоматски</string>
<string name="configure_download">Прилагођавање преузимања</string> <string name="configure_download">Прилагођавање преузимања</string>
<string name="shortcuts">Пречице</string> <string name="shortcuts">Пречице</string>
@ -379,7 +379,7 @@
<string name="hour">Час</string> <string name="hour">Час</string>
<string name="display_over_apps">Приказуј преко апликација</string> <string name="display_over_apps">Приказуј преко апликација</string>
<string name="subtitles">Титлови</string> <string name="subtitles">Титлови</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL адреса и тип преузимања]]></string> <string name="prevent_duplicate_url_type">URL адреса и тип преузимања</string>
<string name="prevent_duplicate_config">Потпуна конфигурација</string> <string name="prevent_duplicate_config">Потпуна конфигурација</string>
<string name="copy_url">Копирај URL адресу</string> <string name="copy_url">Копирај URL адресу</string>
<string name="move_bottom">Помери на дно</string> <string name="move_bottom">Помери на дно</string>

View file

@ -109,7 +109,7 @@
<string name="freespace">வெற்று இடம்</string> <string name="freespace">வெற்று இடம்</string>
<string name="link_you_copied">நீங்கள் நகலெடுத்த இணைப்பு</string> <string name="link_you_copied">நீங்கள் நகலெடுத்த இணைப்பு</string>
<string name="restrict_filenames">கோப்பு பெயர்களைக் கட்டுப்படுத்து</string> <string name="restrict_filenames">கோப்பு பெயர்களைக் கட்டுப்படுத்து</string>
<string name="restrict_filenames_summary"><![CDATA[கோப்புப் பெயர்களை ASCII எழுத்துகளுக்கு மட்டும் கட்டுப்படுத்தவும், மேலும் கோப்புப்பெயர்களில் \"&\" மற்றும் இடைவெளிகளைத் தவிர்க்கவும்]]></string> <string name="restrict_filenames_summary">கோப்புப் பெயர்களை ASCII எழுத்துகளுக்கு மட்டும் கட்டுப்படுத்தவும், மேலும் கோப்புப்பெயர்களில் \"&amp;\" மற்றும் இடைவெளிகளைத் தவிர்க்கவும்</string>
<string name="kill_app">பயன்பாட்டை நிறுத்து</string> <string name="kill_app">பயன்பாட்டை நிறுத்து</string>
<string name="confirm_terminate">எல்லா பதிவிறக்கங்களையும் நிறுத்தி, பயன்பாட்டை வலுக்கட்டாயமாக மூடுகிறது</string> <string name="confirm_terminate">எல்லா பதிவிறக்கங்களையும் நிறுத்தி, பயன்பாட்டை வலுக்கட்டாயமாக மூடுகிறது</string>
<string name="dont_ask_again">மீண்டும் கேட்காதே</string> <string name="dont_ask_again">மீண்டும் கேட்காதே</string>
@ -253,7 +253,7 @@
<string name="on_time">ஆன்</string> <string name="on_time">ஆன்</string>
<string name="display_over_apps_summary">பதிவிறக்க அட்டையை எப்போதும் மேலே காண்பிக்கவும். பதிவிறக்க அட்டை காண்பிக்கப்படும் போது தற்போது இயங்கும் பயன்பாடு மூடப்பட்டால் இதை இயக்கவும்</string> <string name="display_over_apps_summary">பதிவிறக்க அட்டையை எப்போதும் மேலே காண்பிக்கவும். பதிவிறக்க அட்டை காண்பிக்கப்படும் போது தற்போது இயங்கும் பயன்பாடு மூடப்பட்டால் இதை இயக்கவும்</string>
<string name="hour">மணி</string> <string name="hour">மணி</string>
<string name="prevent_duplicate_url_type"><![CDATA[முகவரி & பதிவிறக்கம் வகை]]></string> <string name="prevent_duplicate_url_type">முகவரி &amp; பதிவிறக்கம் வகை</string>
<string name="prevent_duplicate_config">முழு உள்ளமைவு</string> <string name="prevent_duplicate_config">முழு உள்ளமைவு</string>
<string name="copy_url">முகவரியை நகலெடு</string> <string name="copy_url">முகவரியை நகலெடு</string>
<string name="move_top">மேலே செல்</string> <string name="move_top">மேலே செல்</string>

View file

@ -153,7 +153,7 @@
<string name="select">Вибрати</string> <string name="select">Вибрати</string>
<string name="all_items_selected">Вибрано всі елементи</string> <string name="all_items_selected">Вибрано всі елементи</string>
<string name="redownload">Повторне завантаження</string> <string name="redownload">Повторне завантаження</string>
<string name="restrict_filenames_summary"><![CDATA[Обмежуйте імена файлів лише символами ASCII та уникайте \"&\" прогалини в іменах файлів]]></string> <string name="restrict_filenames_summary">Обмежуйте імена файлів лише символами ASCII та уникайте \"&amp;\" прогалини в іменах файлів</string>
<string name="selected">Вибрано</string> <string name="selected">Вибрано</string>
<string name="access_all_directories_summary">Дозволити застосунку завантажувати в каталоги, обмежених за замовчуванням</string> <string name="access_all_directories_summary">Дозволити застосунку завантажувати в каталоги, обмежених за замовчуванням</string>
<string name="download_rescheduled_to">Завантаження перенесено на:</string> <string name="download_rescheduled_to">Завантаження перенесено на:</string>
@ -381,7 +381,7 @@
<string name="disabled">Вимкнено</string> <string name="disabled">Вимкнено</string>
<string name="subtitles">Субтитри</string> <string name="subtitles">Субтитри</string>
<string name="prevent_duplicate_downloads">Запобігання повторним завантаженням</string> <string name="prevent_duplicate_downloads">Запобігання повторним завантаженням</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL & Тип завантаження]]></string> <string name="prevent_duplicate_url_type">URL &amp; Тип завантаження</string>
<string name="prevent_duplicate_config">Повна конфігурація</string> <string name="prevent_duplicate_config">Повна конфігурація</string>
<string name="copy_url">Копіювати URL</string> <string name="copy_url">Копіювати URL</string>
<string name="move_top">Перейти вгору</string> <string name="move_top">Перейти вгору</string>

View file

@ -217,7 +217,7 @@
<string name="cache_cleared">临时文件已清除</string> <string name="cache_cleared">临时文件已清除</string>
<string name="ytdl_version">yt-dlp 版本</string> <string name="ytdl_version">yt-dlp 版本</string>
<string name="link_you_copied">您复制的链接</string> <string name="link_you_copied">您复制的链接</string>
<string name="restrict_filenames_summary"><![CDATA[将文件名限制为仅 ASCII 字符,并避免在文件名中使用\"&\"和空格]]></string> <string name="restrict_filenames_summary">将文件名限制为仅 ASCII 字符,并避免在文件名中使用\"&amp;\"和空格</string>
<string name="kill_app">结束应用</string> <string name="kill_app">结束应用</string>
<string name="confirm_terminate">停止所有下载并强制关闭应用</string> <string name="confirm_terminate">停止所有下载并强制关闭应用</string>
<string name="new_cut">新剪辑</string> <string name="new_cut">新剪辑</string>

View file

@ -235,7 +235,7 @@
<string name="clear_temporary_files_summary">從崩潰/錯誤/取消的下載中刪除快取檔案</string> <string name="clear_temporary_files_summary">從崩潰/錯誤/取消的下載中刪除快取檔案</string>
<string name="download_rescheduled_to">下載已重新安排至:</string> <string name="download_rescheduled_to">下載已重新安排至:</string>
<string name="freespace">可用空間</string> <string name="freespace">可用空間</string>
<string name="restrict_filenames_summary"><![CDATA[限制檔名只使用 ASCII 字元,避免在檔名中使用 \"&\" 和空格]]></string> <string name="restrict_filenames_summary">限制檔名只使用 ASCII 字元,避免在檔名中使用 \"&amp;\" 和空格</string>
<string name="cut">剪下</string> <string name="cut">剪下</string>
<string name="update_formats_summary">當下載卡片顯示時,立刻獲取可用的格式</string> <string name="update_formats_summary">當下載卡片顯示時,立刻獲取可用的格式</string>
<string name="download_over_metered_networks_summary">使用任何網路類型進行下載。否則等待非計量網路</string> <string name="download_over_metered_networks_summary">使用任何網路類型進行下載。否則等待非計量網路</string>
@ -381,7 +381,7 @@
<string name="disabled">關閉</string> <string name="disabled">關閉</string>
<string name="subtitles">字幕</string> <string name="subtitles">字幕</string>
<string name="prevent_duplicate_downloads">防止重複下載</string> <string name="prevent_duplicate_downloads">防止重複下載</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL 和下載類型]]></string> <string name="prevent_duplicate_url_type">URL 和下載類型</string>
<string name="prevent_duplicate_config">完整設定</string> <string name="prevent_duplicate_config">完整設定</string>
<string name="copy_url">複製 URL</string> <string name="copy_url">複製 URL</string>
<string name="move_top">移至頂部</string> <string name="move_top">移至頂部</string>

View file

@ -176,7 +176,7 @@
<string name="freespace">Free space</string> <string name="freespace">Free space</string>
<string name="link_you_copied">Link you copied</string> <string name="link_you_copied">Link you copied</string>
<string name="restrict_filenames">Restrict Filenames</string> <string name="restrict_filenames">Restrict Filenames</string>
<string name="restrict_filenames_summary"><![CDATA[Restrict filenames to only ASCII characters, and avoid \"&\" and spaces in filenames]]></string> <string name="restrict_filenames_summary">Restrict filenames to only ASCII characters, and avoid \"&amp;\" and spaces in filenames</string>
<string name="kill_app">Terminate App</string> <string name="kill_app">Terminate App</string>
<string name="confirm_terminate">Stops all downloads and force closes the app</string> <string name="confirm_terminate">Stops all downloads and force closes the app</string>
<string name="dont_ask_again">Don\'t ask again</string> <string name="dont_ask_again">Don\'t ask again</string>
@ -384,7 +384,7 @@
<string name="hour">Hour</string> <string name="hour">Hour</string>
<string name="subtitles">Subtitles</string> <string name="subtitles">Subtitles</string>
<string name="prevent_duplicate_downloads">Prevent Duplicate Downloads</string> <string name="prevent_duplicate_downloads">Prevent Duplicate Downloads</string>
<string name="prevent_duplicate_url_type"><![CDATA[URL & Download Type]]></string> <string name="prevent_duplicate_url_type">URL &amp; Download Type</string>
<string name="prevent_duplicate_config">Full Configuration</string> <string name="prevent_duplicate_config">Full Configuration</string>
<string name="copy_url">Copy URL</string> <string name="copy_url">Copy URL</string>
<string name="move_top">Move to the Top</string> <string name="move_top">Move to the Top</string>