mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Merge branch 'recloudstream:master' into master
This commit is contained in:
commit
4ee339e609
88 changed files with 1496 additions and 582 deletions
|
@ -50,14 +50,15 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
// https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading
|
||||
compileSdk = 34 // android 14 is fucked
|
||||
compileSdk = 34
|
||||
buildToolsVersion = "34.0.0"
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.lagradost.cloudstream3"
|
||||
minSdk = 21
|
||||
targetSdk = 33
|
||||
|
||||
// https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading
|
||||
targetSdk = 33 // android 14 is fucked
|
||||
|
||||
versionCode = 62
|
||||
versionName = "4.2.1"
|
||||
|
@ -157,16 +158,14 @@ dependencies {
|
|||
implementation("androidx.test.ext:junit-ktx:1.1.5")
|
||||
testImplementation("org.json:json:20230618")
|
||||
|
||||
implementation("androidx.core:core-ktx:1.12.0") // need 34 for higher
|
||||
implementation("androidx.appcompat:appcompat:1.6.1") // need target 32 for 1.5.0
|
||||
implementation("androidx.core:core-ktx:1.12.0")
|
||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||
|
||||
// dont change this to 1.6.0 it looks ugly af
|
||||
implementation("com.google.android.material:material:1.5.0")
|
||||
implementation("com.google.android.material:material:1.10.0")
|
||||
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
||||
|
||||
// need 34 for higher
|
||||
implementation("androidx.navigation:navigation-fragment-ktx:2.7.4")
|
||||
implementation("androidx.navigation:navigation-ui-ktx:2.7.4")
|
||||
implementation("androidx.navigation:navigation-fragment-ktx:2.7.5")
|
||||
implementation("androidx.navigation:navigation-ui-ktx:2.7.5")
|
||||
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")
|
||||
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
|
||||
|
||||
|
@ -180,7 +179,7 @@ dependencies {
|
|||
// DONT UPDATE, WILL CRASH ANDROID TV ????
|
||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1")
|
||||
|
||||
implementation("androidx.preference:preference-ktx:1.2.0")
|
||||
implementation("androidx.preference:preference-ktx:1.2.1")
|
||||
|
||||
implementation("com.github.bumptech.glide:glide:4.13.1")
|
||||
kapt("com.github.bumptech.glide:compiler:4.13.1")
|
||||
|
|
|
@ -96,12 +96,6 @@
|
|||
android:launchMode="singleTask"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true">
|
||||
<intent-filter android:exported="true">
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- cloudstreamplayer://encodedUrl?name=Dune -->
|
||||
<intent-filter>
|
||||
|
@ -165,6 +159,22 @@
|
|||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ui.account.AccountSelectActivity"
|
||||
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation"
|
||||
android:exported="true"
|
||||
android:resizeableActivity="true">
|
||||
<intent-filter android:exported="true">
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ui.EasterEggMonke"
|
||||
android:exported="true" />
|
||||
|
|
|
@ -1246,6 +1246,18 @@ interface LoadResponse {
|
|||
return this.syncData[aniListIdPrefix]
|
||||
}
|
||||
|
||||
fun LoadResponse.getImdbId(): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(this.syncData[simklIdPrefix])?.get(SimklApi.Companion.SyncServices.Imdb)
|
||||
}
|
||||
}
|
||||
|
||||
fun LoadResponse.getTMDbId(): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(this.syncData[simklIdPrefix])?.get(SimklApi.Companion.SyncServices.Tmdb)
|
||||
}
|
||||
}
|
||||
|
||||
fun LoadResponse.addMalId(id: Int?) {
|
||||
this.syncData[malIdPrefix] = (id ?: return).toString()
|
||||
this.addSimklId(SimklApi.Companion.SyncServices.Mal, id.toString())
|
||||
|
|
|
@ -1306,7 +1306,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
|||
this@MainActivity.getString(R.string.action_add_to_bookmarks),
|
||||
showApply = false,
|
||||
{}) {
|
||||
viewModel.updateWatchStatus(WatchType.values()[it])
|
||||
viewModel.updateWatchStatus(WatchType.values()[it], this@MainActivity)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,73 +0,0 @@
|
|||
package com.lagradost.cloudstream3.metaproviders
|
||||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.aniListApi
|
||||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||
import com.lagradost.cloudstream3.syncproviders.providers.AniListApi
|
||||
import com.lagradost.cloudstream3.syncproviders.providers.MALApi
|
||||
import com.lagradost.cloudstream3.utils.SyncUtil
|
||||
|
||||
// wont be implemented
|
||||
class MultiAnimeProvider : MainAPI() {
|
||||
override var name = "MultiAnime"
|
||||
override var lang = "en"
|
||||
override val usesWebView = true
|
||||
override val supportedTypes = setOf(TvType.Anime)
|
||||
private val syncApi: SyncAPI = aniListApi
|
||||
|
||||
private val syncUtilType by lazy {
|
||||
when (syncApi) {
|
||||
is AniListApi -> "anilist"
|
||||
is MALApi -> "myanimelist"
|
||||
else -> throw ErrorLoadingException("Invalid Api")
|
||||
}
|
||||
}
|
||||
|
||||
private val validApis
|
||||
get() =
|
||||
synchronized(APIHolder.apis) {
|
||||
APIHolder.apis.filter {
|
||||
it.lang == this.lang && it::class.java != this::class.java && it.supportedTypes.contains(
|
||||
TvType.Anime
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun filterName(name: String): String {
|
||||
return Regex("""[^a-zA-Z0-9-]""").replace(name, "")
|
||||
}
|
||||
|
||||
override suspend fun search(query: String): List<SearchResponse>? {
|
||||
return syncApi.search(query)?.map {
|
||||
AnimeSearchResponse(it.name, it.url, this.name, TvType.Anime, it.posterUrl)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun load(url: String): LoadResponse? {
|
||||
return syncApi.getResult(url)?.let { res ->
|
||||
val data = SyncUtil.getUrlsFromId(res.id, syncUtilType).amap { url ->
|
||||
validApis.firstOrNull { api -> url.startsWith(api.mainUrl) }?.load(url)
|
||||
}.filterNotNull()
|
||||
|
||||
val type =
|
||||
if (data.any { it.type == TvType.AnimeMovie }) TvType.AnimeMovie else TvType.Anime
|
||||
|
||||
newAnimeLoadResponse(
|
||||
res.title ?: throw ErrorLoadingException("No Title found"),
|
||||
url,
|
||||
type
|
||||
) {
|
||||
posterUrl = res.posterUrl
|
||||
plot = res.synopsis
|
||||
tags = res.genres
|
||||
rating = res.publicScore
|
||||
addTrailer(res.trailers)
|
||||
addAniListId(res.id.toIntOrNull())
|
||||
recommendations = res.recommendations
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -203,7 +203,7 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
|
|||
}
|
||||
|
||||
/** Read the id string to get all other ids */
|
||||
private fun readIdFromString(idString: String?): Map<SyncServices, String> {
|
||||
fun readIdFromString(idString: String?): Map<SyncServices, String> {
|
||||
return tryParseJson(idString) ?: return emptyMap()
|
||||
}
|
||||
|
||||
|
|
|
@ -55,7 +55,6 @@ class WhoIsWatchingAdapter(
|
|||
editCallBack = editCallBack,
|
||||
)
|
||||
|
||||
|
||||
override fun onBindViewHolder(holder: WhoIsWatchingHolder, position: Int) =
|
||||
holder.bind(currentList.getOrNull(position))
|
||||
|
||||
|
@ -70,10 +69,15 @@ class WhoIsWatchingAdapter(
|
|||
fun bind(card: DataStoreHelper.Account?) {
|
||||
when (binding) {
|
||||
is WhoIsWatchingAccountBinding -> binding.apply {
|
||||
if(card == null) return@apply
|
||||
if (card == null) return@apply
|
||||
outline.isVisible = card.keyIndex == DataStoreHelper.selectedKeyIndex
|
||||
profileText.text = card.name
|
||||
profileImageBackground.setImage(card.image)
|
||||
|
||||
// Handle the lock indicator
|
||||
val isLocked = card.lockPin != null
|
||||
lockIcon.isVisible = isLocked
|
||||
|
||||
root.setOnClickListener {
|
||||
selectCallBack(card)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package com.lagradost.cloudstream3.ui.account
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lagradost.cloudstream3.databinding.AccountListItemBinding
|
||||
import com.lagradost.cloudstream3.ui.result.setImage
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||
|
||||
class AccountAdapter(
|
||||
private val accounts: List<DataStoreHelper.Account>,
|
||||
private val onItemClick: (DataStoreHelper.Account) -> Unit
|
||||
) : RecyclerView.Adapter<AccountAdapter.AccountViewHolder>() {
|
||||
|
||||
inner class AccountViewHolder(private val binding: AccountListItemBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(account: DataStoreHelper.Account) {
|
||||
val isLastUsedAccount = account.keyIndex == DataStoreHelper.selectedKeyIndex
|
||||
|
||||
binding.accountName.text = account.name
|
||||
binding.accountImage.setImage(account.image)
|
||||
binding.lockIcon.isVisible = account.lockPin != null
|
||||
binding.outline.isVisible = isLastUsedAccount
|
||||
|
||||
if (isTvSettings()) {
|
||||
binding.root.isFocusableInTouchMode = true
|
||||
if (isLastUsedAccount) {
|
||||
binding.root.requestFocus()
|
||||
}
|
||||
}
|
||||
|
||||
binding.root.setOnClickListener {
|
||||
onItemClick(account)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccountViewHolder {
|
||||
val binding = AccountListItemBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
)
|
||||
|
||||
return AccountViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: AccountViewHolder, position: Int) {
|
||||
holder.bind(accounts[position])
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return accounts.size
|
||||
}
|
||||
}
|
|
@ -0,0 +1,132 @@
|
|||
package com.lagradost.cloudstream3.ui.account
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.databinding.LockPinDialogBinding
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.showInputMethod
|
||||
|
||||
object AccountDialog {
|
||||
// TODO add account creation dialog to allow creating accounts directly from AccountSelectActivity
|
||||
|
||||
fun showPinInputDialog(
|
||||
context: Context,
|
||||
currentPin: String?,
|
||||
editAccount: Boolean,
|
||||
errorText: String? = null,
|
||||
callback: (String?) -> Unit
|
||||
) {
|
||||
fun TextView.visibleWithText(@StringRes textRes: Int) {
|
||||
isVisible = true
|
||||
setText(textRes)
|
||||
}
|
||||
|
||||
fun TextView.visibleWithText(text: String?) {
|
||||
isVisible = true
|
||||
setText(text)
|
||||
}
|
||||
|
||||
val binding = LockPinDialogBinding.inflate(LayoutInflater.from(context))
|
||||
|
||||
val isPinSet = currentPin != null
|
||||
val isNewPin = editAccount && !isPinSet
|
||||
val isEditPin = editAccount && isPinSet
|
||||
|
||||
val titleRes = if (isEditPin) R.string.enter_current_pin else R.string.enter_pin
|
||||
|
||||
var isPinValid = false
|
||||
|
||||
val builder = AlertDialog.Builder(context, R.style.AlertDialogCustom)
|
||||
.setView(binding.root)
|
||||
.setTitle(titleRes)
|
||||
.setNegativeButton(R.string.cancel) { _, _ ->
|
||||
callback.invoke(null)
|
||||
}
|
||||
.setOnCancelListener {
|
||||
callback.invoke(null)
|
||||
}
|
||||
.setOnDismissListener {
|
||||
if (!isPinValid) {
|
||||
callback.invoke(null)
|
||||
}
|
||||
}
|
||||
|
||||
if (isNewPin) {
|
||||
if (errorText != null) binding.pinEditTextError.visibleWithText(errorText)
|
||||
builder.setPositiveButton(R.string.setup_done) { _, _ ->
|
||||
if (!isPinValid) {
|
||||
// If the done button is pressed and there is an error,
|
||||
// ask again, and mention the error that caused this.
|
||||
showPinInputDialog(
|
||||
context = binding.root.context,
|
||||
currentPin = null,
|
||||
editAccount = true,
|
||||
errorText = binding.pinEditTextError.text.toString(),
|
||||
callback = callback
|
||||
)
|
||||
} else {
|
||||
val enteredPin = binding.pinEditText.text.toString()
|
||||
callback.invoke(enteredPin)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val dialog = builder.create()
|
||||
|
||||
binding.pinEditText.doOnTextChanged { text, _, _, _ ->
|
||||
val enteredPin = text.toString()
|
||||
val isEnteredPinValid = enteredPin.length == 4
|
||||
|
||||
if (isEnteredPinValid) {
|
||||
if (isPinSet) {
|
||||
if (enteredPin != currentPin) {
|
||||
binding.pinEditTextError.visibleWithText(R.string.pin_error_incorrect)
|
||||
binding.pinEditText.text = null
|
||||
isPinValid = false
|
||||
} else {
|
||||
binding.pinEditTextError.isVisible = false
|
||||
isPinValid = true
|
||||
|
||||
callback.invoke(enteredPin)
|
||||
dialog.dismissSafe()
|
||||
}
|
||||
} else {
|
||||
binding.pinEditTextError.isVisible = false
|
||||
isPinValid = true
|
||||
}
|
||||
} else if (isNewPin) {
|
||||
binding.pinEditTextError.visibleWithText(R.string.pin_error_length)
|
||||
isPinValid = false
|
||||
}
|
||||
}
|
||||
|
||||
// Detect IME_ACTION_DONE
|
||||
binding.pinEditText.setOnEditorActionListener { _, actionId, _ ->
|
||||
if (actionId == EditorInfo.IME_ACTION_DONE && isPinValid) {
|
||||
val enteredPin = binding.pinEditText.text.toString()
|
||||
callback.invoke(enteredPin)
|
||||
dialog.dismissSafe()
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
// We don't want to accidentally have the dialog dismiss when clicking outside of it.
|
||||
// That is what the cancel button is for.
|
||||
dialog.setCanceledOnTouchOutside(false)
|
||||
|
||||
dialog.show()
|
||||
|
||||
// Auto focus on PIN input and show keyboard
|
||||
binding.pinEditText.requestFocus()
|
||||
binding.pinEditText.postDelayed({
|
||||
showInputMethod(binding.pinEditText)
|
||||
}, 200)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
package com.lagradost.cloudstream3.ui.account
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lagradost.cloudstream3.CommonActivity
|
||||
import com.lagradost.cloudstream3.CommonActivity.loadThemes
|
||||
import com.lagradost.cloudstream3.MainActivity
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.databinding.ActivityAccountSelectBinding
|
||||
import com.lagradost.cloudstream3.ui.account.AccountDialog.showPinInputDialog
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAccounts
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||
|
||||
class AccountSelectActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val accounts = getAccounts(this@AccountSelectActivity)
|
||||
|
||||
// Don't show account selection if there is only
|
||||
// one account that exists
|
||||
if (accounts.count() <= 1) {
|
||||
navigateToMainActivity()
|
||||
return
|
||||
}
|
||||
|
||||
CommonActivity.init(this)
|
||||
loadThemes(this)
|
||||
|
||||
window.navigationBarColor = colorFromAttribute(R.attr.primaryBlackBackground)
|
||||
|
||||
val binding = ActivityAccountSelectBinding.inflate(layoutInflater)
|
||||
|
||||
setContentView(binding.root)
|
||||
|
||||
val recyclerView: RecyclerView = binding.accountRecyclerView
|
||||
|
||||
|
||||
val adapter = AccountAdapter(accounts) { selectedAccount ->
|
||||
// Handle the selected account
|
||||
onAccountSelected(selectedAccount)
|
||||
}
|
||||
recyclerView.adapter = adapter
|
||||
|
||||
if (isTvSettings()) {
|
||||
val spanSize = if (accounts.count() <= 6) {
|
||||
accounts.count()
|
||||
} else 6
|
||||
|
||||
recyclerView.layoutManager = GridLayoutManager(this, spanSize)
|
||||
}
|
||||
}
|
||||
|
||||
private fun onAccountSelected(selectedAccount: DataStoreHelper.Account) {
|
||||
if (selectedAccount.lockPin != null) {
|
||||
// The selected account has a PIN set, prompt the user to enter the PIN
|
||||
showPinInputDialog(this@AccountSelectActivity, selectedAccount.lockPin, false) { pin ->
|
||||
if (pin == null) return@showPinInputDialog
|
||||
// Pin is correct, proceed to main activity
|
||||
setAccount(selectedAccount)
|
||||
navigateToMainActivity()
|
||||
}
|
||||
} else {
|
||||
// No PIN set for the selected account, proceed to main activity
|
||||
setAccount(selectedAccount)
|
||||
navigateToMainActivity()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setAccount(account: DataStoreHelper.Account) {
|
||||
// Don't reload if it is the same account
|
||||
if (DataStoreHelper.selectedKeyIndex == account.keyIndex) {
|
||||
return
|
||||
}
|
||||
|
||||
DataStoreHelper.selectedKeyIndex = account.keyIndex
|
||||
|
||||
MainActivity.bookmarksUpdatedEvent(true)
|
||||
MainActivity.reloadHomeEvent(true)
|
||||
}
|
||||
|
||||
private fun navigateToMainActivity() {
|
||||
val mainIntent = Intent(this, MainActivity::class.java)
|
||||
startActivity(mainIntent)
|
||||
finish() // Finish the account selection activity
|
||||
}
|
||||
}
|
|
@ -378,21 +378,25 @@ class HomeParentItemAdapterPreview(
|
|||
showApply = false,
|
||||
{}) {
|
||||
val newValue = WatchType.values()[it]
|
||||
homePreviewBookmark.setCompoundDrawablesWithIntrinsicBounds(
|
||||
null,
|
||||
ContextCompat.getDrawable(
|
||||
homePreviewBookmark.context,
|
||||
newValue.iconRes
|
||||
),
|
||||
null,
|
||||
null
|
||||
)
|
||||
homePreviewBookmark.setText(newValue.stringRes)
|
||||
|
||||
ResultViewModel2.updateWatchStatus(
|
||||
item,
|
||||
newValue
|
||||
)
|
||||
ResultViewModel2().updateWatchStatus(
|
||||
newValue,
|
||||
fab.context,
|
||||
item
|
||||
) { statusChanged: Boolean ->
|
||||
if (!statusChanged) return@updateWatchStatus
|
||||
|
||||
homePreviewBookmark.setCompoundDrawablesWithIntrinsicBounds(
|
||||
null,
|
||||
ContextCompat.getDrawable(
|
||||
homePreviewBookmark.context,
|
||||
newValue.iconRes
|
||||
),
|
||||
null,
|
||||
null
|
||||
)
|
||||
homePreviewBookmark.setText(newValue.stringRes)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,6 @@ import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
|||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllBookmarkedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllResumeStateIds
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllResumeStateIds
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllWatchStateIds
|
||||
|
@ -102,11 +101,6 @@ class HomeViewModel : ViewModel() {
|
|||
loadStoredData()
|
||||
}
|
||||
|
||||
fun deleteBookmarks() {
|
||||
deleteAllBookmarkedData()
|
||||
loadStoredData()
|
||||
}
|
||||
|
||||
var repo: APIRepository? = null
|
||||
|
||||
private val _apiName = MutableLiveData<String>()
|
||||
|
|
|
@ -27,6 +27,7 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.viewpager2.widget.ViewPager2
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import com.lagradost.cloudstream3.APIHolder
|
||||
|
@ -62,7 +63,7 @@ const val LIBRARY_FOLDER = "library_folder"
|
|||
|
||||
|
||||
enum class LibraryOpenerType(@StringRes val stringRes: Int) {
|
||||
Default(R.string.default_subtitles), // TODO FIX AFTER MERGE
|
||||
Default(R.string.action_default),
|
||||
Provider(R.string.none),
|
||||
Browser(R.string.browser),
|
||||
Search(R.string.search),
|
||||
|
@ -137,6 +138,10 @@ class LibraryFragment : Fragment() {
|
|||
|
||||
binding?.libraryRoot?.findViewById<TextView>(R.id.search_src_text)?.apply {
|
||||
tag = "tv_no_focus_tag"
|
||||
//Expand the Appbar when search bar is focused, fixing scroll up issue
|
||||
setOnFocusChangeListener { _, _ ->
|
||||
binding?.searchBar?.setExpanded(true)
|
||||
}
|
||||
}
|
||||
|
||||
// Set the color for the search exit icon to the correct theme text color
|
||||
|
@ -342,6 +347,7 @@ class LibraryFragment : Fragment() {
|
|||
binding?.apply {
|
||||
viewpager.offscreenPageLimit = 2
|
||||
viewpager.reduceDragSensitivity()
|
||||
searchBar.setExpanded(true)
|
||||
}
|
||||
|
||||
val startLoading = Runnable {
|
||||
|
@ -441,6 +447,10 @@ class LibraryFragment : Fragment() {
|
|||
val distance = abs(position - currentItem)
|
||||
hideViewpager(distance)
|
||||
}
|
||||
//Expand the appBar on tab focus
|
||||
tab.view.setOnFocusChangeListener { view, b ->
|
||||
binding?.searchBar?.setExpanded(true)
|
||||
}
|
||||
}.attach()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
package com.lagradost.cloudstream3.ui.library
|
||||
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.view.doOnAttach
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.RecyclerView.OnFlingListener
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.databinding.LibraryViewpagerPageBinding
|
||||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||
import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount
|
||||
|
||||
class ViewpagerAdapter(
|
||||
|
@ -67,6 +71,17 @@ class ViewpagerAdapter(
|
|||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
|
||||
val diff = scrollY - oldScrollY
|
||||
|
||||
//Expand the top Appbar based on scroll direction up/down, simulate phone behavior
|
||||
if (SettingsFragment.isTvSettings()) {
|
||||
binding.root.rootView.findViewById<AppBarLayout>(R.id.search_bar)
|
||||
.apply {
|
||||
if (diff <= 0)
|
||||
setExpanded(true)
|
||||
else
|
||||
setExpanded(false)
|
||||
}
|
||||
}
|
||||
if (diff == 0) return@setOnScrollChangeListener
|
||||
|
||||
scrollCallback.invoke(diff > 0)
|
||||
|
@ -80,8 +95,6 @@ class ViewpagerAdapter(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -430,34 +430,36 @@ open class ResultFragmentPhone : FullScreenPlayer() {
|
|||
}
|
||||
})
|
||||
resultSubscribe.setOnClickListener {
|
||||
val isSubscribed =
|
||||
viewModel.toggleSubscriptionStatus() ?: return@setOnClickListener
|
||||
viewModel.toggleSubscriptionStatus(context) { newStatus: Boolean? ->
|
||||
if (newStatus == null) return@toggleSubscriptionStatus
|
||||
|
||||
val message = if (isSubscribed) {
|
||||
// Kinda icky to have this here, but it works.
|
||||
SubscriptionWorkManager.enqueuePeriodicWork(context)
|
||||
R.string.subscription_new
|
||||
} else {
|
||||
R.string.subscription_deleted
|
||||
val message = if (newStatus) {
|
||||
// Kinda icky to have this here, but it works.
|
||||
SubscriptionWorkManager.enqueuePeriodicWork(context)
|
||||
R.string.subscription_new
|
||||
} else {
|
||||
R.string.subscription_deleted
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
}
|
||||
resultFavorite.setOnClickListener {
|
||||
val isFavorite =
|
||||
viewModel.toggleFavoriteStatus() ?: return@setOnClickListener
|
||||
viewModel.toggleFavoriteStatus(context) { newStatus: Boolean? ->
|
||||
if (newStatus == null) return@toggleFavoriteStatus
|
||||
|
||||
val message = if (isFavorite) {
|
||||
R.string.favorite_added
|
||||
} else {
|
||||
R.string.favorite_removed
|
||||
val message = if (newStatus) {
|
||||
R.string.favorite_added
|
||||
} else {
|
||||
R.string.favorite_removed
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
}
|
||||
mediaRouteButton.apply {
|
||||
val chromecastSupport = api?.hasChromecastSupport == true
|
||||
|
@ -960,7 +962,7 @@ open class ResultFragmentPhone : FullScreenPlayer() {
|
|||
fab.context.getString(R.string.action_add_to_bookmarks),
|
||||
showApply = false,
|
||||
{}) {
|
||||
viewModel.updateWatchStatus(WatchType.values()[it])
|
||||
viewModel.updateWatchStatus(WatchType.values()[it], context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import com.lagradost.cloudstream3.databinding.FragmentResultTvBinding
|
|||
import com.lagradost.cloudstream3.mvvm.Resource
|
||||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
import com.lagradost.cloudstream3.mvvm.observeNullable
|
||||
import com.lagradost.cloudstream3.services.SubscriptionWorkManager
|
||||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup
|
||||
import com.lagradost.cloudstream3.ui.player.ExtractorLinkGenerator
|
||||
|
@ -37,6 +38,7 @@ import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent
|
|||
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED
|
||||
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isEmulatorSettings
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isRtl
|
||||
|
@ -287,7 +289,8 @@ class ResultFragmentTv : Fragment() {
|
|||
resultResumeSeries,
|
||||
resultPlayTrailer,
|
||||
resultBookmarkButton,
|
||||
resultFavoriteButton
|
||||
resultFavoriteButton,
|
||||
resultSubscribeButton
|
||||
)
|
||||
for (requestView in views) {
|
||||
if (!requestView.isVisible) continue
|
||||
|
@ -429,6 +432,7 @@ class ResultFragmentTv : Fragment() {
|
|||
binding?.resultEpisodesShow,
|
||||
binding?.resultBookmarkButton,
|
||||
binding?.resultFavoriteButton,
|
||||
binding?.resultSubscribeButton,
|
||||
).firstOrNull {
|
||||
it?.isVisible == true
|
||||
}
|
||||
|
@ -531,7 +535,7 @@ class ResultFragmentTv : Fragment() {
|
|||
view.context.getString(R.string.action_add_to_bookmarks),
|
||||
showApply = false,
|
||||
{}) {
|
||||
viewModel.updateWatchStatus(WatchType.values()[it])
|
||||
viewModel.updateWatchStatus(WatchType.values()[it], context)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -557,17 +561,58 @@ class ResultFragmentTv : Fragment() {
|
|||
setIconResource(drawable)
|
||||
setText(text)
|
||||
setOnClickListener {
|
||||
val isFavorite = viewModel.toggleFavoriteStatus() ?: return@setOnClickListener
|
||||
viewModel.toggleFavoriteStatus(context) { newStatus: Boolean? ->
|
||||
if (newStatus == null) return@toggleFavoriteStatus
|
||||
|
||||
val message = if (isFavorite) {
|
||||
R.string.favorite_added
|
||||
} else {
|
||||
R.string.favorite_removed
|
||||
val message = if (newStatus) {
|
||||
R.string.favorite_added
|
||||
} else {
|
||||
R.string.favorite_removed
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
observeNullable(viewModel.subscribeStatus) { isSubscribed ->
|
||||
binding?.resultSubscribeButton?.apply {
|
||||
isVisible = isSubscribed != null && context.isEmulatorSettings()
|
||||
if (isSubscribed == null) return@observeNullable
|
||||
|
||||
val drawable = if (isSubscribed) {
|
||||
R.drawable.ic_baseline_notifications_active_24
|
||||
} else {
|
||||
R.drawable.baseline_notifications_none_24
|
||||
}
|
||||
|
||||
val text = if (isSubscribed) {
|
||||
R.string.action_unsubscribe
|
||||
} else {
|
||||
R.string.action_subscribe
|
||||
}
|
||||
|
||||
setIconResource(drawable)
|
||||
setText(text)
|
||||
setOnClickListener {
|
||||
viewModel.toggleSubscriptionStatus(context) { newStatus: Boolean? ->
|
||||
if (newStatus == null) return@toggleSubscriptionStatus
|
||||
|
||||
val message = if (newStatus) {
|
||||
// Kinda icky to have this here, but it works.
|
||||
SubscriptionWorkManager.enqueuePeriodicWork(context)
|
||||
R.string.subscription_new
|
||||
} else {
|
||||
R.string.subscription_deleted
|
||||
}
|
||||
|
||||
val name = (viewModel.page.value as? Resource.Success)?.value?.title
|
||||
?: txt(R.string.no_data).asStringNull(context) ?: ""
|
||||
CommonActivity.showToast(txt(message, name), Toast.LENGTH_SHORT)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,8 @@ import android.os.Build
|
|||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.MainThread
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.FileProvider
|
||||
import androidx.core.net.toUri
|
||||
import androidx.lifecycle.LiveData
|
||||
|
@ -31,6 +33,7 @@ import com.lagradost.cloudstream3.mvvm.*
|
|||
import com.lagradost.cloudstream3.syncproviders.AccountManager
|
||||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||
import com.lagradost.cloudstream3.syncproviders.providers.Kitsu
|
||||
import com.lagradost.cloudstream3.syncproviders.providers.SimklApi
|
||||
import com.lagradost.cloudstream3.ui.APIRepository
|
||||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
|
||||
|
@ -45,22 +48,37 @@ import com.lagradost.cloudstream3.utils.*
|
|||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isConnectedToChromecast
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.CastHelper.startCast
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioWork
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioWorkSafe
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteBookmarkedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllBookmarkedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllFavorites
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllSubscriptions
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getBookmarkedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getDub
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getFavoritesData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getLastWatched
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultEpisode
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultSeason
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultWatchState
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getSubscribedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getVideoWatchState
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.removeFavoritesData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.removeSubscribedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setBookmarkedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setDub
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setFavoritesData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultEpisode
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultSeason
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setSubscribedData
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setVideoWatchState
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.updateSubscribedData
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
||||
import kotlinx.coroutines.*
|
||||
import java.io.File
|
||||
|
@ -113,6 +131,18 @@ data class ResultData(
|
|||
val plotHeaderText: UiText,
|
||||
)
|
||||
|
||||
data class CheckDuplicateData(
|
||||
val name: String,
|
||||
val year: Int?,
|
||||
val syncData: Map<String, String>?
|
||||
)
|
||||
|
||||
enum class LibraryListType {
|
||||
BOOKMARKS,
|
||||
FAVORITES,
|
||||
SUBSCRIPTIONS
|
||||
}
|
||||
|
||||
fun txt(status: DubStatus?): UiText? {
|
||||
return txt(
|
||||
when (status) {
|
||||
|
@ -441,33 +471,6 @@ class ResultViewModel2 : ViewModel() {
|
|||
return this?.firstOrNull { it.season == season }
|
||||
}
|
||||
|
||||
fun updateWatchStatus(currentResponse: LoadResponse, status: WatchType) {
|
||||
val currentId = currentResponse.getId()
|
||||
|
||||
val currentWatchType = getResultWatchState(currentId)
|
||||
|
||||
DataStoreHelper.setResultWatchState(currentId, status.internalId)
|
||||
val current = DataStoreHelper.getBookmarkedData(currentId)
|
||||
val currentTime = System.currentTimeMillis()
|
||||
DataStoreHelper.setBookmarkedData(
|
||||
currentId,
|
||||
DataStoreHelper.BookmarkedData(
|
||||
currentId,
|
||||
current?.bookmarkedTime ?: currentTime,
|
||||
currentTime,
|
||||
currentResponse.name,
|
||||
currentResponse.url,
|
||||
currentResponse.apiName,
|
||||
currentResponse.type,
|
||||
currentResponse.posterUrl,
|
||||
currentResponse.year
|
||||
)
|
||||
)
|
||||
if (currentWatchType != status) {
|
||||
MainActivity.bookmarksUpdatedEvent(true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun filterName(name: String?): String? {
|
||||
if (name == null) return null
|
||||
Regex("[eE]pisode [0-9]*(.*)").find(name)?.groupValues?.get(1)?.let {
|
||||
|
@ -822,9 +825,77 @@ class ResultViewModel2 : ViewModel() {
|
|||
val selectPopup: LiveData<SelectPopup?> = _selectPopup
|
||||
|
||||
|
||||
fun updateWatchStatus(status: WatchType) {
|
||||
updateWatchStatus(currentResponse ?: return, status)
|
||||
_watchStatus.postValue(status)
|
||||
fun updateWatchStatus(
|
||||
status: WatchType,
|
||||
context: Context?,
|
||||
loadResponse: LoadResponse? = null,
|
||||
statusChangedCallback: ((statusChanged: Boolean) -> Unit)? = null
|
||||
) {
|
||||
val response = loadResponse ?: currentResponse ?: return
|
||||
|
||||
val currentId = response.getId()
|
||||
|
||||
val currentStatus = getResultWatchState(currentId)
|
||||
|
||||
// If the current status is "NONE" and the new status is not "NONE",
|
||||
// fetch the bookmarked data to check for duplicates, otherwise set this
|
||||
// to an empty list, so that we don't show the duplicate warning dialog,
|
||||
// but we still want to update the current bookmark and refresh the data anyway.
|
||||
val bookmarkedData = if (currentStatus == WatchType.NONE && status != WatchType.NONE) {
|
||||
getAllBookmarkedData()
|
||||
} else emptyList()
|
||||
|
||||
checkAndWarnDuplicates(
|
||||
context,
|
||||
LibraryListType.BOOKMARKS,
|
||||
CheckDuplicateData(
|
||||
name = response.name,
|
||||
year = response.year,
|
||||
syncData = response.syncData,
|
||||
),
|
||||
bookmarkedData
|
||||
) { shouldContinue: Boolean, duplicateIds: List<Int?> ->
|
||||
if (!shouldContinue) return@checkAndWarnDuplicates
|
||||
|
||||
if (duplicateIds.isNotEmpty()) {
|
||||
duplicateIds.forEach { duplicateId ->
|
||||
deleteBookmarkedData(duplicateId)
|
||||
}
|
||||
}
|
||||
|
||||
setResultWatchState(currentId, status.internalId)
|
||||
|
||||
// We don't need to store if WatchType.NONE.
|
||||
// The key is removed in setResultWatchState, we don't want to
|
||||
// re-add it again here if it was just removed.
|
||||
if (status != WatchType.NONE) {
|
||||
val current = getBookmarkedData(currentId)
|
||||
|
||||
setBookmarkedData(
|
||||
currentId,
|
||||
DataStoreHelper.BookmarkedData(
|
||||
current?.bookmarkedTime ?: unixTimeMS,
|
||||
currentId,
|
||||
unixTimeMS,
|
||||
response.name,
|
||||
response.url,
|
||||
response.apiName,
|
||||
response.type,
|
||||
response.posterUrl,
|
||||
response.year,
|
||||
response.syncData
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
if (currentStatus != status) {
|
||||
MainActivity.bookmarksUpdatedEvent(true)
|
||||
}
|
||||
|
||||
_watchStatus.postValue(status)
|
||||
|
||||
statusChangedCallback?.invoke(true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun startChromecast(
|
||||
|
@ -839,73 +910,255 @@ class ResultViewModel2 : ViewModel() {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return true if the new status is Subscribed, false if not. Null if not possible to subscribe.
|
||||
**/
|
||||
fun toggleSubscriptionStatus(): Boolean? {
|
||||
val isSubscribed = _subscribeStatus.value ?: return null
|
||||
val response = currentResponse ?: return null
|
||||
if (response !is EpisodeResponse) return null
|
||||
* Toggles the subscription status of an item.
|
||||
*
|
||||
* @param context The context to use for operations.
|
||||
* @param statusChangedCallback A callback that is invoked when the subscription status changes.
|
||||
* It provides the new subscription status (true if subscribed, false if unsubscribed, null if action was canceled).
|
||||
*/
|
||||
fun toggleSubscriptionStatus(
|
||||
context: Context?,
|
||||
statusChangedCallback: ((newStatus: Boolean?) -> Unit)? = null
|
||||
) {
|
||||
val isSubscribed = _subscribeStatus.value ?: return
|
||||
val response = currentResponse ?: return
|
||||
if (response !is EpisodeResponse) return
|
||||
|
||||
val currentId = response.getId()
|
||||
|
||||
if (isSubscribed) {
|
||||
DataStoreHelper.removeSubscribedData(currentId)
|
||||
removeSubscribedData(currentId)
|
||||
statusChangedCallback?.invoke(false)
|
||||
_subscribeStatus.postValue(false)
|
||||
} else {
|
||||
val current = DataStoreHelper.getSubscribedData(currentId)
|
||||
checkAndWarnDuplicates(
|
||||
context,
|
||||
LibraryListType.SUBSCRIPTIONS,
|
||||
CheckDuplicateData(
|
||||
name = response.name,
|
||||
year = response.year,
|
||||
syncData = response.syncData,
|
||||
),
|
||||
getAllSubscriptions(),
|
||||
) { shouldContinue: Boolean, duplicateIds: List<Int?> ->
|
||||
if (!shouldContinue) {
|
||||
statusChangedCallback?.invoke(null)
|
||||
return@checkAndWarnDuplicates
|
||||
}
|
||||
|
||||
DataStoreHelper.setSubscribedData(
|
||||
currentId,
|
||||
DataStoreHelper.SubscribedData(
|
||||
if (duplicateIds.isNotEmpty()) {
|
||||
duplicateIds.forEach { duplicateId ->
|
||||
removeSubscribedData(duplicateId)
|
||||
}
|
||||
}
|
||||
|
||||
val current = getSubscribedData(currentId)
|
||||
|
||||
setSubscribedData(
|
||||
currentId,
|
||||
current?.bookmarkedTime ?: unixTimeMS,
|
||||
unixTimeMS,
|
||||
response.getLatestEpisodes(),
|
||||
response.name,
|
||||
response.url,
|
||||
response.apiName,
|
||||
response.type,
|
||||
response.posterUrl,
|
||||
response.year
|
||||
DataStoreHelper.SubscribedData(
|
||||
current?.subscribedTime ?: unixTimeMS,
|
||||
response.getLatestEpisodes(),
|
||||
currentId,
|
||||
unixTimeMS,
|
||||
response.name,
|
||||
response.url,
|
||||
response.apiName,
|
||||
response.type,
|
||||
response.posterUrl,
|
||||
response.year,
|
||||
response.syncData
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
_subscribeStatus.postValue(!isSubscribed)
|
||||
return !isSubscribed
|
||||
_subscribeStatus.postValue(true)
|
||||
|
||||
statusChangedCallback?.invoke(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if added to favorites, false if not. Null if not possible to favorite.
|
||||
**/
|
||||
fun toggleFavoriteStatus(): Boolean? {
|
||||
val isFavorite = _favoriteStatus.value ?: return null
|
||||
val response = currentResponse ?: return null
|
||||
* Toggles the favorite status of an item.
|
||||
*
|
||||
* @param context The context to use.
|
||||
* @param statusChangedCallback A callback that is invoked when the favorite status changes.
|
||||
* It provides the new favorite status (true if added to favorites, false if removed, null if action was canceled).
|
||||
*/
|
||||
fun toggleFavoriteStatus(
|
||||
context: Context?,
|
||||
statusChangedCallback: ((newStatus: Boolean?) -> Unit)? = null
|
||||
) {
|
||||
val isFavorite = _favoriteStatus.value ?: return
|
||||
val response = currentResponse ?: return
|
||||
|
||||
val currentId = response.getId()
|
||||
|
||||
if (isFavorite) {
|
||||
removeFavoritesData(currentId)
|
||||
statusChangedCallback?.invoke(false)
|
||||
_favoriteStatus.postValue(false)
|
||||
} else {
|
||||
val current = getFavoritesData(currentId)
|
||||
checkAndWarnDuplicates(
|
||||
context,
|
||||
LibraryListType.FAVORITES,
|
||||
CheckDuplicateData(
|
||||
name = response.name,
|
||||
year = response.year,
|
||||
syncData = response.syncData,
|
||||
),
|
||||
getAllFavorites(),
|
||||
) { shouldContinue: Boolean, duplicateIds: List<Int?> ->
|
||||
if (!shouldContinue) {
|
||||
statusChangedCallback?.invoke(null)
|
||||
return@checkAndWarnDuplicates
|
||||
}
|
||||
|
||||
setFavoritesData(
|
||||
currentId,
|
||||
DataStoreHelper.FavoritesData(
|
||||
if (duplicateIds.isNotEmpty()) {
|
||||
duplicateIds.forEach { duplicateId ->
|
||||
removeFavoritesData(duplicateId)
|
||||
}
|
||||
}
|
||||
|
||||
val current = getFavoritesData(currentId)
|
||||
|
||||
setFavoritesData(
|
||||
currentId,
|
||||
current?.favoritesTime ?: unixTimeMS,
|
||||
unixTimeMS,
|
||||
response.name,
|
||||
response.url,
|
||||
response.apiName,
|
||||
response.type,
|
||||
response.posterUrl,
|
||||
response.year
|
||||
DataStoreHelper.FavoritesData(
|
||||
current?.favoritesTime ?: unixTimeMS,
|
||||
currentId,
|
||||
unixTimeMS,
|
||||
response.name,
|
||||
response.url,
|
||||
response.apiName,
|
||||
response.type,
|
||||
response.posterUrl,
|
||||
response.year,
|
||||
response.syncData
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
_favoriteStatus.postValue(true)
|
||||
|
||||
statusChangedCallback?.invoke(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@MainThread
|
||||
private fun checkAndWarnDuplicates(
|
||||
context: Context?,
|
||||
listType: LibraryListType,
|
||||
checkDuplicateData: CheckDuplicateData,
|
||||
data: List<DataStoreHelper.LibrarySearchResponse>,
|
||||
checkDuplicatesCallback: (shouldContinue: Boolean, duplicateIds: List<Int?>) -> Unit
|
||||
) {
|
||||
val whitespaceRegex = "\\s+".toRegex()
|
||||
fun normalizeString(input: String): String {
|
||||
/**
|
||||
* Trim the input string and replace consecutive spaces with a single space.
|
||||
* This covers some edge-cases where the title does not match exactly across providers,
|
||||
* and one provider has the title with an extra whitespace. This is minor enough that
|
||||
* it should still match in this case.
|
||||
*/
|
||||
return input.trim().replace(whitespaceRegex, " ")
|
||||
}
|
||||
|
||||
_favoriteStatus.postValue(!isFavorite)
|
||||
return !isFavorite
|
||||
val syncData = checkDuplicateData.syncData
|
||||
|
||||
val imdbId = getImdbIdFromSyncData(syncData)
|
||||
val tmdbId = getTMDbIdFromSyncData(syncData)
|
||||
val malId = syncData?.get(AccountManager.malApi.idPrefix)
|
||||
val aniListId = syncData?.get(AccountManager.aniListApi.idPrefix)
|
||||
val normalizedName = normalizeString(checkDuplicateData.name)
|
||||
val year = checkDuplicateData.year
|
||||
|
||||
val duplicateEntries = data.filter { it: DataStoreHelper.LibrarySearchResponse ->
|
||||
val librarySyncData = it.syncData
|
||||
|
||||
val checks = listOf(
|
||||
{ imdbId != null && getImdbIdFromSyncData(librarySyncData) == imdbId },
|
||||
{ tmdbId != null && getTMDbIdFromSyncData(librarySyncData) == tmdbId },
|
||||
{ malId != null && librarySyncData?.get(AccountManager.malApi.idPrefix) == malId },
|
||||
{ aniListId != null && librarySyncData?.get(AccountManager.aniListApi.idPrefix) == aniListId },
|
||||
{ normalizedName == normalizeString(it.name) && year == it.year }
|
||||
)
|
||||
|
||||
checks.any { it() }
|
||||
}
|
||||
|
||||
if (duplicateEntries.isEmpty() || context == null) {
|
||||
checkDuplicatesCallback.invoke(true, emptyList())
|
||||
return
|
||||
}
|
||||
|
||||
val replaceMessage = if (duplicateEntries.size > 1) {
|
||||
R.string.duplicate_replace_all
|
||||
} else R.string.duplicate_replace
|
||||
|
||||
val message = if (duplicateEntries.size == 1) {
|
||||
val list = when (listType) {
|
||||
LibraryListType.BOOKMARKS -> getResultWatchState(duplicateEntries[0].id ?: 0).stringRes
|
||||
LibraryListType.FAVORITES -> R.string.favorites_list_name
|
||||
LibraryListType.SUBSCRIPTIONS -> R.string.subscription_list_name
|
||||
}
|
||||
|
||||
context.getString(R.string.duplicate_message_single,
|
||||
"${normalizeString(duplicateEntries[0].name)} (${context.getString(list)}) — ${duplicateEntries[0].apiName}"
|
||||
)
|
||||
} else {
|
||||
val bulletPoints = duplicateEntries.joinToString("\n") {
|
||||
val list = when (listType) {
|
||||
LibraryListType.BOOKMARKS -> getResultWatchState(it.id ?: 0).stringRes
|
||||
LibraryListType.FAVORITES -> R.string.favorites_list_name
|
||||
LibraryListType.SUBSCRIPTIONS -> R.string.subscription_list_name
|
||||
}
|
||||
|
||||
"• ${it.apiName}: ${normalizeString(it.name)} (${context.getString(list)})"
|
||||
}
|
||||
|
||||
context.getString(R.string.duplicate_message_multiple, bulletPoints)
|
||||
}
|
||||
|
||||
val builder: AlertDialog.Builder = AlertDialog.Builder(context)
|
||||
|
||||
val dialogClickListener =
|
||||
DialogInterface.OnClickListener { _, which ->
|
||||
when (which) {
|
||||
DialogInterface.BUTTON_POSITIVE -> {
|
||||
checkDuplicatesCallback.invoke(true, emptyList())
|
||||
}
|
||||
DialogInterface.BUTTON_NEGATIVE -> {
|
||||
checkDuplicatesCallback.invoke(false, emptyList())
|
||||
}
|
||||
DialogInterface.BUTTON_NEUTRAL -> {
|
||||
checkDuplicatesCallback.invoke(true, duplicateEntries.map { it.id })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
builder.setTitle(R.string.duplicate_title)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(R.string.duplicate_add, dialogClickListener)
|
||||
.setNegativeButton(R.string.duplicate_cancel, dialogClickListener)
|
||||
.setNeutralButton(replaceMessage, dialogClickListener)
|
||||
.show().setDefaultFocus()
|
||||
}
|
||||
|
||||
private fun getImdbIdFromSyncData(syncData: Map<String, String>?): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(
|
||||
syncData?.get(AccountManager.simklApi.idPrefix)
|
||||
)[SimklApi.Companion.SyncServices.Imdb]
|
||||
}
|
||||
}
|
||||
|
||||
private fun getTMDbIdFromSyncData(syncData: Map<String, String>?): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(
|
||||
syncData?.get(AccountManager.simklApi.idPrefix)
|
||||
)[SimklApi.Companion.SyncServices.Tmdb]
|
||||
}
|
||||
}
|
||||
|
||||
private fun startChromecast(
|
||||
|
@ -1259,7 +1512,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
// Do not add mark as watched on movies
|
||||
if (!listOf(TvType.Movie, TvType.AnimeMovie).contains(click.data.tvType)) {
|
||||
val isWatched =
|
||||
DataStoreHelper.getVideoWatchState(click.data.id) == VideoWatchState.Watched
|
||||
getVideoWatchState(click.data.id) == VideoWatchState.Watched
|
||||
|
||||
val watchedText = if (isWatched) R.string.action_remove_from_watched
|
||||
else R.string.action_mark_as_watched
|
||||
|
@ -1508,12 +1761,12 @@ class ResultViewModel2 : ViewModel() {
|
|||
|
||||
ACTION_MARK_AS_WATCHED -> {
|
||||
val isWatched =
|
||||
DataStoreHelper.getVideoWatchState(click.data.id) == VideoWatchState.Watched
|
||||
getVideoWatchState(click.data.id) == VideoWatchState.Watched
|
||||
|
||||
if (isWatched) {
|
||||
DataStoreHelper.setVideoWatchState(click.data.id, VideoWatchState.None)
|
||||
setVideoWatchState(click.data.id, VideoWatchState.None)
|
||||
} else {
|
||||
DataStoreHelper.setVideoWatchState(click.data.id, VideoWatchState.Watched)
|
||||
setVideoWatchState(click.data.id, VideoWatchState.Watched)
|
||||
}
|
||||
|
||||
// Kinda dirty to reload all episodes :(
|
||||
|
@ -1722,7 +1975,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
list.subList(start, end).map {
|
||||
val posDur = getViewPos(it.id)
|
||||
val watchState =
|
||||
DataStoreHelper.getVideoWatchState(it.id) ?: VideoWatchState.None
|
||||
getVideoWatchState(it.id) ?: VideoWatchState.None
|
||||
it.copy(
|
||||
position = posDur?.position ?: 0,
|
||||
duration = posDur?.duration ?: 0,
|
||||
|
@ -1783,8 +2036,8 @@ class ResultViewModel2 : ViewModel() {
|
|||
private fun postSubscription(loadResponse: LoadResponse) {
|
||||
if (loadResponse.isEpisodeBased()) {
|
||||
val id = loadResponse.getId()
|
||||
val data = DataStoreHelper.getSubscribedData(id)
|
||||
DataStoreHelper.updateSubscribedData(id, data, loadResponse as? EpisodeResponse)
|
||||
val data = getSubscribedData(id)
|
||||
updateSubscribedData(id, data, loadResponse as? EpisodeResponse)
|
||||
val isSubscribed = data != null
|
||||
_subscribeStatus.postValue(isSubscribed)
|
||||
}
|
||||
|
@ -2174,13 +2427,13 @@ class ResultViewModel2 : ViewModel() {
|
|||
postResume()
|
||||
}
|
||||
|
||||
fun postResume() {
|
||||
private fun postResume() {
|
||||
_resumeWatching.postValue(resume())
|
||||
}
|
||||
|
||||
private fun resume(): ResumeWatchingStatus? {
|
||||
val correctId = currentId ?: return null
|
||||
val resume = DataStoreHelper.getLastWatched(correctId)
|
||||
val resume = getLastWatched(correctId)
|
||||
val resumeParentId = resume?.parentId
|
||||
if (resumeParentId != correctId) return null // is null or smth went wrong with getLastWatched
|
||||
val resumeId = resume.episodeId ?: return null// invalid episode id
|
||||
|
|
|
@ -30,6 +30,7 @@ import com.lagradost.cloudstream3.syncproviders.OAuth2API
|
|||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||
|
@ -248,6 +249,7 @@ class SettingsAccount : PreferenceFragmentCompat() {
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
setUpToolbar(R.string.category_account)
|
||||
setPaddingBottom()
|
||||
setToolBarScrollFlags()
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
|
|
|
@ -12,10 +12,12 @@ import android.widget.ImageView
|
|||
import androidx.annotation.StringRes
|
||||
import androidx.core.view.children
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.appbar.MaterialToolbar
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.databinding.MainSettingsBinding
|
||||
|
@ -54,7 +56,15 @@ class SettingsFragment : Fragment() {
|
|||
listView?.setPadding(0, 0, 0, 100.toPx)
|
||||
}
|
||||
}
|
||||
fun PreferenceFragmentCompat.setToolBarScrollFlags() {
|
||||
if (isTvSettings()) {
|
||||
val settingsAppbar = view?.findViewById<MaterialToolbar>(R.id.settings_toolbar)
|
||||
|
||||
settingsAppbar?.updateLayoutParams<AppBarLayout.LayoutParams> {
|
||||
scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL
|
||||
}
|
||||
}
|
||||
}
|
||||
fun Fragment?.setUpToolbar(title: String) {
|
||||
if (this == null) return
|
||||
val settingsToolbar = view?.findViewById<MaterialToolbar>(R.id.settings_toolbar) ?: return
|
||||
|
|
|
@ -28,6 +28,7 @@ import com.lagradost.cloudstream3.network.initClient
|
|||
import com.lagradost.cloudstream3.ui.EasterEggMonke
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
||||
|
@ -115,6 +116,7 @@ class SettingsGeneral : PreferenceFragmentCompat() {
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
setUpToolbar(R.string.category_general)
|
||||
setPaddingBottom()
|
||||
setToolBarScrollFlags()
|
||||
}
|
||||
|
||||
data class CustomSite(
|
||||
|
@ -192,7 +194,6 @@ class SettingsGeneral : PreferenceFragmentCompat() {
|
|||
return@setOnPreferenceClickListener true
|
||||
}
|
||||
|
||||
|
||||
fun showAdd() {
|
||||
val providers = synchronized(allProviders) { allProviders.distinctBy { it.javaClass }.sortedBy { it.name } }
|
||||
activity?.showDialog(
|
||||
|
|
|
@ -10,6 +10,7 @@ import com.lagradost.cloudstream3.mvvm.logError
|
|||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getFolderSize
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.ui.subtitles.ChromecastSubtitlesFragment
|
||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
||||
|
@ -23,6 +24,7 @@ class SettingsPlayer : PreferenceFragmentCompat() {
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
setUpToolbar(R.string.category_player)
|
||||
setPaddingBottom()
|
||||
setToolBarScrollFlags()
|
||||
}
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
hideKeyboard()
|
||||
|
|
|
@ -13,6 +13,7 @@ import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
|||
import com.lagradost.cloudstream3.ui.APIRepository
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog
|
||||
|
@ -25,6 +26,7 @@ class SettingsProviders : PreferenceFragmentCompat() {
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
setUpToolbar(R.string.category_providers)
|
||||
setPaddingBottom()
|
||||
setToolBarScrollFlags()
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
|
|
|
@ -11,6 +11,7 @@ import com.lagradost.cloudstream3.mvvm.logError
|
|||
import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.updateTv
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||
|
@ -23,6 +24,7 @@ class SettingsUI : PreferenceFragmentCompat() {
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
setUpToolbar(R.string.category_ui)
|
||||
setPaddingBottom()
|
||||
setToolBarScrollFlags()
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import com.lagradost.cloudstream3.network.initClient
|
|||
import com.lagradost.cloudstream3.services.BackupWorkManager
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.utils.BackupUtils
|
||||
import com.lagradost.cloudstream3.utils.BackupUtils.restorePrompt
|
||||
|
@ -42,6 +43,7 @@ class SettingsUpdates : PreferenceFragmentCompat() {
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
setUpToolbar(R.string.category_updates)
|
||||
setPaddingBottom()
|
||||
setToolBarScrollFlags()
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
|
|
|
@ -583,7 +583,7 @@ object AppUtils {
|
|||
//private val viewModel: ResultViewModel by activityViewModels()
|
||||
|
||||
private fun getResultsId(): Int {
|
||||
return if (isTrueTvSettings()) {
|
||||
return if (isTvSettings()) {
|
||||
R.id.global_to_navigation_results_tv
|
||||
} else {
|
||||
R.id.global_to_navigation_results_phone
|
||||
|
|
|
@ -6,6 +6,7 @@ import android.text.Editable
|
|||
import android.view.LayoutInflater
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
|
@ -26,8 +27,8 @@ import com.lagradost.cloudstream3.syncproviders.AccountManager
|
|||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.WhoIsWatchingAdapter
|
||||
import com.lagradost.cloudstream3.ui.account.AccountDialog.showPinInputDialog
|
||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||
import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
|
||||
import com.lagradost.cloudstream3.ui.result.UiImage
|
||||
import com.lagradost.cloudstream3.ui.result.VideoWatchState
|
||||
import com.lagradost.cloudstream3.ui.result.setImage
|
||||
|
@ -136,6 +137,8 @@ object DataStoreHelper {
|
|||
val customImage: String? = null,
|
||||
@JsonProperty("defaultImageIndex")
|
||||
val defaultImageIndex: Int,
|
||||
@JsonProperty("lockPin")
|
||||
val lockPin: String? = null,
|
||||
) {
|
||||
val image: UiImage
|
||||
get() = customImage?.let { UiImage.Image(it) } ?: UiImage.Drawable(
|
||||
|
@ -230,36 +233,86 @@ object DataStoreHelper {
|
|||
|
||||
binding.profilePic.setImage(account.image)
|
||||
binding.profilePic.setOnClickListener {
|
||||
// rolls the image forwards once
|
||||
// Roll the image forwards once
|
||||
currentEditAccount =
|
||||
currentEditAccount.copy(defaultImageIndex = (currentEditAccount.defaultImageIndex + 1) % profileImages.size)
|
||||
binding.profilePic.setImage(currentEditAccount.image)
|
||||
}
|
||||
|
||||
binding.applyBtt.setOnClickListener {
|
||||
val currentAccounts = accounts.toMutableList()
|
||||
|
||||
val overrideIndex =
|
||||
currentAccounts.indexOfFirst { it.keyIndex == currentEditAccount.keyIndex }
|
||||
|
||||
// if an account is found that has the same keyIndex then override that one, if not then append it
|
||||
if (overrideIndex != -1) {
|
||||
currentAccounts[overrideIndex] = currentEditAccount
|
||||
if (currentEditAccount.lockPin != null) {
|
||||
// Ask for the current PIN
|
||||
showPinInputDialog(context, currentEditAccount.lockPin, false) { pin ->
|
||||
if (pin == null) return@showPinInputDialog
|
||||
// PIN is correct, proceed to update the account
|
||||
performAccountUpdate(currentEditAccount)
|
||||
dialog.dismissSafe()
|
||||
}
|
||||
} else {
|
||||
currentAccounts.add(currentEditAccount)
|
||||
// No lock PIN set, proceed to update the account
|
||||
performAccountUpdate(currentEditAccount)
|
||||
dialog.dismissSafe()
|
||||
}
|
||||
|
||||
// Save the current homepage for new accounts
|
||||
val currentHomePage = DataStoreHelper.currentHomePage
|
||||
|
||||
// set the new default account as well as add the key for the new account
|
||||
setAccount(currentEditAccount, false)
|
||||
DataStoreHelper.currentHomePage = currentHomePage
|
||||
|
||||
accounts = currentAccounts.toTypedArray()
|
||||
|
||||
dialog.dismissSafe()
|
||||
}
|
||||
|
||||
// Handle setting or changing the PIN
|
||||
|
||||
if (currentEditAccount.keyIndex == getDefaultAccount(context).keyIndex) {
|
||||
binding.lockProfileCheckbox.isVisible = false
|
||||
if (currentEditAccount.lockPin != null) {
|
||||
currentEditAccount = currentEditAccount.copy(lockPin = null)
|
||||
}
|
||||
}
|
||||
|
||||
var canSetPin = true
|
||||
|
||||
binding.lockProfileCheckbox.isChecked = currentEditAccount.lockPin != null
|
||||
|
||||
binding.lockProfileCheckbox.setOnCheckedChangeListener { _, isChecked ->
|
||||
if (isChecked) {
|
||||
if (canSetPin) {
|
||||
showPinInputDialog(context, null, true) { pin ->
|
||||
if (pin == null) {
|
||||
binding.lockProfileCheckbox.isChecked = false
|
||||
return@showPinInputDialog
|
||||
}
|
||||
|
||||
currentEditAccount = currentEditAccount.copy(lockPin = pin)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (currentEditAccount.lockPin != null) {
|
||||
// Ask for the current PIN
|
||||
showPinInputDialog(context, currentEditAccount.lockPin, true) { pin ->
|
||||
if (pin == null || pin != currentEditAccount.lockPin) {
|
||||
canSetPin = false
|
||||
binding.lockProfileCheckbox.isChecked = true
|
||||
} else {
|
||||
currentEditAccount = currentEditAccount.copy(lockPin = null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
canSetPin = true
|
||||
}
|
||||
|
||||
private fun performAccountUpdate(account: Account) {
|
||||
val currentAccounts = accounts.toMutableList()
|
||||
|
||||
val overrideIndex = currentAccounts.indexOfFirst { it.keyIndex == account.keyIndex }
|
||||
|
||||
if (overrideIndex != -1) {
|
||||
currentAccounts[overrideIndex] = account
|
||||
} else {
|
||||
currentAccounts.add(account)
|
||||
}
|
||||
|
||||
val currentHomePage = this.currentHomePage
|
||||
setAccount(account, false)
|
||||
this.currentHomePage = currentHomePage
|
||||
accounts = currentAccounts.toTypedArray()
|
||||
}
|
||||
|
||||
private fun getDefaultAccount(context: Context): Account {
|
||||
|
@ -272,10 +325,18 @@ object DataStoreHelper {
|
|||
}
|
||||
}
|
||||
|
||||
fun getAccounts(context: Context): List<Account> {
|
||||
return accounts.toMutableList().apply {
|
||||
val item = getDefaultAccount(context)
|
||||
remove(item)
|
||||
add(0, item)
|
||||
}
|
||||
}
|
||||
|
||||
fun showWhoIsWatching(context: Context) {
|
||||
val binding: WhoIsWatchingBinding = WhoIsWatchingBinding.inflate(
|
||||
LayoutInflater.from(context)
|
||||
)
|
||||
val binding: WhoIsWatchingBinding = WhoIsWatchingBinding.inflate(LayoutInflater.from(context))
|
||||
val builder = BottomSheetDialog(context)
|
||||
builder.setContentView(binding.root)
|
||||
|
||||
val showAccount = accounts.toMutableList().apply {
|
||||
val item = getDefaultAccount(context)
|
||||
|
@ -283,22 +344,25 @@ object DataStoreHelper {
|
|||
add(0, item)
|
||||
}
|
||||
|
||||
val builder =
|
||||
BottomSheetDialog(context)
|
||||
builder.setContentView(binding.root)
|
||||
val accountName = context.getString(R.string.account)
|
||||
|
||||
binding.profilesRecyclerview.setLinearListLayout(
|
||||
isHorizontal = true,
|
||||
nextUp = FOCUS_SELF,
|
||||
nextDown = FOCUS_SELF,
|
||||
nextLeft = FOCUS_SELF,
|
||||
nextRight = FOCUS_SELF
|
||||
)
|
||||
binding.profilesRecyclerview.setLinearListLayout(isHorizontal = true)
|
||||
binding.profilesRecyclerview.adapter = WhoIsWatchingAdapter(
|
||||
selectCallBack = { account ->
|
||||
setAccount(account, true)
|
||||
builder.dismissSafe()
|
||||
// Check if the selected account has a lock PIN set
|
||||
if (account.lockPin != null) {
|
||||
// Prompt for the lock pin
|
||||
showPinInputDialog(context, account.lockPin, false) { pin ->
|
||||
if (pin == null) return@showPinInputDialog
|
||||
// Pin is correct, unlock the profile
|
||||
setAccount(account, true)
|
||||
builder.dismissSafe()
|
||||
}
|
||||
} else {
|
||||
// No lock PIN set, directly set the account
|
||||
setAccount(account, true)
|
||||
builder.dismissSafe()
|
||||
}
|
||||
},
|
||||
addAccountCallback = {
|
||||
val currentAccounts = accounts
|
||||
|
@ -334,7 +398,6 @@ object DataStoreHelper {
|
|||
builder.show()
|
||||
}
|
||||
|
||||
|
||||
data class PosDur(
|
||||
@JsonProperty("position") val position: Long,
|
||||
@JsonProperty("duration") val duration: Long
|
||||
|
@ -352,20 +415,35 @@ object DataStoreHelper {
|
|||
/**
|
||||
* Used to display notifications on new episodes and posters in library.
|
||||
**/
|
||||
data class SubscribedData(
|
||||
abstract class LibrarySearchResponse(
|
||||
@JsonProperty("id") override var id: Int?,
|
||||
@JsonProperty("subscribedTime") val bookmarkedTime: Long,
|
||||
@JsonProperty("latestUpdatedTime") val latestUpdatedTime: Long,
|
||||
@JsonProperty("lastSeenEpisodeCount") val lastSeenEpisodeCount: Map<DubStatus, Int?>,
|
||||
@JsonProperty("latestUpdatedTime") open val latestUpdatedTime: Long,
|
||||
@JsonProperty("name") override val name: String,
|
||||
@JsonProperty("url") override val url: String,
|
||||
@JsonProperty("apiName") override val apiName: String,
|
||||
@JsonProperty("type") override var type: TvType? = null,
|
||||
@JsonProperty("type") override var type: TvType?,
|
||||
@JsonProperty("posterUrl") override var posterUrl: String?,
|
||||
@JsonProperty("year") val year: Int?,
|
||||
@JsonProperty("quality") override var quality: SearchQuality? = null,
|
||||
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>? = null,
|
||||
) : SearchResponse {
|
||||
@JsonProperty("year") open val year: Int?,
|
||||
@JsonProperty("syncData") open val syncData: Map<String, String>?,
|
||||
@JsonProperty("quality") override var quality: SearchQuality?,
|
||||
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>?
|
||||
) : SearchResponse
|
||||
|
||||
data class SubscribedData(
|
||||
@JsonProperty("subscribedTime") val subscribedTime: Long,
|
||||
@JsonProperty("lastSeenEpisodeCount") val lastSeenEpisodeCount: Map<DubStatus, Int?>,
|
||||
override var id: Int?,
|
||||
override val latestUpdatedTime: Long,
|
||||
override val name: String,
|
||||
override val url: String,
|
||||
override val apiName: String,
|
||||
override var type: TvType?,
|
||||
override var posterUrl: String?,
|
||||
override val year: Int?,
|
||||
override val syncData: Map<String, String>? = null,
|
||||
override var quality: SearchQuality? = null,
|
||||
override var posterHeaders: Map<String, String>? = null
|
||||
) : LibrarySearchResponse(id, latestUpdatedTime, name, url, apiName, type, posterUrl, year, syncData, quality, posterHeaders) {
|
||||
fun toLibraryItem(): SyncAPI.LibraryItem? {
|
||||
return SyncAPI.LibraryItem(
|
||||
name,
|
||||
|
@ -381,18 +459,19 @@ object DataStoreHelper {
|
|||
}
|
||||
|
||||
data class BookmarkedData(
|
||||
@JsonProperty("id") override var id: Int?,
|
||||
@JsonProperty("bookmarkedTime") val bookmarkedTime: Long,
|
||||
@JsonProperty("latestUpdatedTime") val latestUpdatedTime: Long,
|
||||
@JsonProperty("name") override val name: String,
|
||||
@JsonProperty("url") override val url: String,
|
||||
@JsonProperty("apiName") override val apiName: String,
|
||||
@JsonProperty("type") override var type: TvType? = null,
|
||||
@JsonProperty("posterUrl") override var posterUrl: String?,
|
||||
@JsonProperty("year") val year: Int?,
|
||||
@JsonProperty("quality") override var quality: SearchQuality? = null,
|
||||
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>? = null,
|
||||
) : SearchResponse {
|
||||
override var id: Int?,
|
||||
override val latestUpdatedTime: Long,
|
||||
override val name: String,
|
||||
override val url: String,
|
||||
override val apiName: String,
|
||||
override var type: TvType?,
|
||||
override var posterUrl: String?,
|
||||
override val year: Int?,
|
||||
override val syncData: Map<String, String>? = null,
|
||||
override var quality: SearchQuality? = null,
|
||||
override var posterHeaders: Map<String, String>? = null
|
||||
) : LibrarySearchResponse(id, latestUpdatedTime, name, url, apiName, type, posterUrl, year, syncData, quality, posterHeaders) {
|
||||
fun toLibraryItem(id: String): SyncAPI.LibraryItem {
|
||||
return SyncAPI.LibraryItem(
|
||||
name,
|
||||
|
@ -408,18 +487,19 @@ object DataStoreHelper {
|
|||
}
|
||||
|
||||
data class FavoritesData(
|
||||
@JsonProperty("id") override var id: Int?,
|
||||
@JsonProperty("favoritesTime") val favoritesTime: Long,
|
||||
@JsonProperty("latestUpdatedTime") val latestUpdatedTime: Long,
|
||||
@JsonProperty("name") override val name: String,
|
||||
@JsonProperty("url") override val url: String,
|
||||
@JsonProperty("apiName") override val apiName: String,
|
||||
@JsonProperty("type") override var type: TvType? = null,
|
||||
@JsonProperty("posterUrl") override var posterUrl: String?,
|
||||
@JsonProperty("year") val year: Int?,
|
||||
@JsonProperty("quality") override var quality: SearchQuality? = null,
|
||||
@JsonProperty("posterHeaders") override var posterHeaders: Map<String, String>? = null,
|
||||
) : SearchResponse {
|
||||
override var id: Int?,
|
||||
override val latestUpdatedTime: Long,
|
||||
override val name: String,
|
||||
override val url: String,
|
||||
override val apiName: String,
|
||||
override var type: TvType?,
|
||||
override var posterUrl: String?,
|
||||
override val year: Int?,
|
||||
override val syncData: Map<String, String>? = null,
|
||||
override var quality: SearchQuality? = null,
|
||||
override var posterHeaders: Map<String, String>? = null
|
||||
) : LibrarySearchResponse(id, latestUpdatedTime, name, url, apiName, type, posterUrl, year, syncData, quality, posterHeaders) {
|
||||
fun toLibraryItem(): SyncAPI.LibraryItem? {
|
||||
return SyncAPI.LibraryItem(
|
||||
name,
|
||||
|
@ -466,15 +546,9 @@ object DataStoreHelper {
|
|||
removeKeys(folder)
|
||||
}
|
||||
|
||||
fun deleteAllBookmarkedData() {
|
||||
val folder1 = "$currentAccount/$RESULT_WATCH_STATE"
|
||||
val folder2 = "$currentAccount/$RESULT_WATCH_STATE_DATA"
|
||||
removeKeys(folder1)
|
||||
removeKeys(folder2)
|
||||
}
|
||||
|
||||
fun deleteBookmarkedData(id: Int?) {
|
||||
if (id == null) return
|
||||
AccountManager.localListApi.requireLibraryRefresh = true
|
||||
removeKey("$currentAccount/$RESULT_WATCH_STATE", id.toString())
|
||||
removeKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString())
|
||||
}
|
||||
|
@ -572,6 +646,12 @@ object DataStoreHelper {
|
|||
return getKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString())
|
||||
}
|
||||
|
||||
fun getAllBookmarkedData(): List<BookmarkedData> {
|
||||
return getKeys("$currentAccount/$RESULT_WATCH_STATE_DATA")?.mapNotNull {
|
||||
getKey(it)
|
||||
} ?: emptyList()
|
||||
}
|
||||
|
||||
fun getAllSubscriptions(): List<SubscribedData> {
|
||||
return getKeys("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA")?.mapNotNull {
|
||||
getKey(it)
|
||||
|
|
|
@ -7,10 +7,7 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.widget.AbsListView
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.ListView
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.view.isGone
|
||||
|
@ -20,8 +17,10 @@ import androidx.core.view.marginRight
|
|||
import androidx.core.view.marginTop
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.databinding.BottomTextDialogBinding
|
||||
import com.lagradost.cloudstream3.databinding.BottomInputDialogBinding
|
||||
import com.lagradost.cloudstream3.databinding.BottomSelectionDialogBinding
|
||||
import com.lagradost.cloudstream3.databinding.BottomTextDialogBinding
|
||||
import com.lagradost.cloudstream3.databinding.OptionsPopupTvBinding
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.popupMenuNoIconsAndNoStringRes
|
||||
|
@ -56,14 +55,14 @@ object SingleSelectionHelper {
|
|||
if (this == null) return
|
||||
|
||||
if (isTvSettings()) {
|
||||
val builder =
|
||||
AlertDialog.Builder(this, R.style.AlertDialogCustom)
|
||||
.setView(R.layout.options_popup_tv)
|
||||
val binding = OptionsPopupTvBinding.inflate(layoutInflater)
|
||||
val dialog = AlertDialog.Builder(this, R.style.AlertDialogCustom)
|
||||
.setView(binding.root)
|
||||
.create()
|
||||
|
||||
val dialog = builder.create()
|
||||
dialog.show()
|
||||
|
||||
dialog.findViewById<ListView>(R.id.listview1)?.let { listView ->
|
||||
binding.listview1.let { listView ->
|
||||
listView.choiceMode = AbsListView.CHOICE_MODE_SINGLE
|
||||
listView.adapter =
|
||||
ArrayAdapter<String>(this, R.layout.sort_bottom_single_choice_color).apply {
|
||||
|
@ -76,7 +75,7 @@ object SingleSelectionHelper {
|
|||
}
|
||||
}
|
||||
|
||||
dialog.findViewById<ImageView>(R.id.imageView)?.apply {
|
||||
binding.imageView.apply {
|
||||
isGone = poster.isNullOrEmpty()
|
||||
setImage(poster)
|
||||
}
|
||||
|
@ -107,12 +106,12 @@ object SingleSelectionHelper {
|
|||
if (this == null) return
|
||||
|
||||
val realShowApply = showApply || isMultiSelect
|
||||
val listView = binding.listview1//.findViewById<ListView>(R.id.listview1)!!
|
||||
val textView = binding.text1//.findViewById<TextView>(R.id.text1)!!
|
||||
val applyButton = binding.applyBtt//.findViewById<TextView>(R.id.apply_btt)
|
||||
val cancelButton = binding.cancelBtt//findViewById<TextView>(R.id.cancel_btt)
|
||||
val listView = binding.listview1
|
||||
val textView = binding.text1
|
||||
val applyButton = binding.applyBtt
|
||||
val cancelButton = binding.cancelBtt
|
||||
val applyHolder =
|
||||
binding.applyBttHolder//.findViewById<LinearLayout>(R.id.apply_btt_holder)
|
||||
binding.applyBttHolder
|
||||
|
||||
applyHolder.isVisible = realShowApply
|
||||
if (!realShowApply) {
|
||||
|
@ -175,8 +174,8 @@ object SingleSelectionHelper {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
private fun Activity?.showInputDialog(
|
||||
binding: BottomInputDialogBinding,
|
||||
dialog: Dialog,
|
||||
value: String,
|
||||
name: String,
|
||||
|
@ -186,11 +185,11 @@ object SingleSelectionHelper {
|
|||
) {
|
||||
if (this == null) return
|
||||
|
||||
val inputView = dialog.findViewById<EditText>(R.id.nginx_text_input)!!
|
||||
val textView = dialog.findViewById<TextView>(R.id.text1)!!
|
||||
val applyButton = dialog.findViewById<TextView>(R.id.apply_btt)!!
|
||||
val cancelButton = dialog.findViewById<TextView>(R.id.cancel_btt)!!
|
||||
val applyHolder = dialog.findViewById<LinearLayout>(R.id.apply_btt_holder)!!
|
||||
val inputView = binding.nginxTextInput
|
||||
val textView = binding.text1
|
||||
val applyButton = binding.applyBtt
|
||||
val cancelButton = binding.cancelBtt
|
||||
val applyHolder = binding.applyBttHolder
|
||||
|
||||
applyHolder.isVisible = true
|
||||
textView.text = name
|
||||
|
@ -352,11 +351,17 @@ object SingleSelectionHelper {
|
|||
dismissCallback: () -> Unit,
|
||||
callback: (String) -> Unit,
|
||||
) {
|
||||
val builder = BottomSheetDialog(this) // probably the stuff at the bottom
|
||||
builder.setContentView(R.layout.bottom_input_dialog) // input layout
|
||||
val builder = BottomSheetDialog(this)
|
||||
|
||||
val binding: BottomInputDialogBinding = BottomInputDialogBinding.inflate(
|
||||
LayoutInflater.from(this)
|
||||
)
|
||||
|
||||
builder.setContentView(binding.root)
|
||||
|
||||
builder.show()
|
||||
showInputDialog(
|
||||
binding,
|
||||
builder,
|
||||
value,
|
||||
name,
|
||||
|
|
56
app/src/main/res/layout/account_list_item.xml
Normal file
56
app/src/main/res/layout/account_list_item.xml
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/card_view"
|
||||
android:layout_width="110dp"
|
||||
android:layout_height="110dp"
|
||||
android:animateLayoutChanges="true"
|
||||
android:backgroundTint="?attr/primaryGrayBackground"
|
||||
android:foreground="?attr/selectableItemBackground"
|
||||
app:cardCornerRadius="@dimen/rounded_image_radius"
|
||||
android:layout_margin="10dp"
|
||||
android:focusable="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintDimensionRatio="1"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHeight_percent="0.4"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/account_image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:alpha="0.4"
|
||||
android:contentDescription="@string/profile_background_des"
|
||||
android:scaleType="centerCrop" />
|
||||
|
||||
<View
|
||||
android:id="@+id/outline"
|
||||
tools:visibility="visible"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/outline_card"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/lock_icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="top|end"
|
||||
android:layout_margin="4dp"
|
||||
android:src="@drawable/video_locked"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/account_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:padding="10dp"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</androidx.cardview.widget.CardView>
|
28
app/src/main/res/layout/activity_account_select.xml
Normal file
28
app/src/main/res/layout/activity_account_select.xml
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:background="?attr/primaryBlackBackground"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="36dp"
|
||||
android:gravity="center">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/select_an_account"
|
||||
android:textSize="24sp"
|
||||
android:textStyle="bold"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="16dp" />
|
||||
|
||||
<com.lagradost.cloudstream3.ui.AutofitRecyclerView
|
||||
android:id="@+id/account_recycler_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp" />
|
||||
|
||||
</LinearLayout>
|
|
@ -92,15 +92,7 @@
|
|||
android:layout_height="100dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:padding="20dp">
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/home_preview_bookmark"
|
||||
|
@ -139,7 +131,7 @@
|
|||
app:drawableTint="?attr/white"
|
||||
app:drawableTopCompat="@drawable/ic_outline_info_24"
|
||||
app:tint="?attr/white" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
||||
|
|
|
@ -27,7 +27,8 @@
|
|||
android:id="@+id/search_status_bar_padding"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
android:orientation="horizontal"
|
||||
app:layout_scrollFlags="scroll|enterAlways">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/provider_selector"
|
||||
|
@ -108,6 +109,7 @@
|
|||
</androidx.appcompat.widget.SearchView>
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/library_tab_layout"
|
||||
style="@style/Theme.Widget.Tabs"
|
||||
|
@ -117,7 +119,7 @@
|
|||
android:nextFocusDown="@id/search_result_root"
|
||||
android:background="?attr/primaryGrayBackground"
|
||||
android:paddingHorizontal="5dp"
|
||||
app:layout_scrollFlags="noScroll"
|
||||
android:focusable="true"
|
||||
app:tabGravity="center"
|
||||
app:tabIndicator="@drawable/indicator_background"
|
||||
app:tabIndicatorColor="?attr/white"
|
||||
|
@ -134,15 +136,15 @@
|
|||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<androidx.viewpager2.widget.ViewPager2
|
||||
android:id="@+id/viewpager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:paddingBottom="40dp"
|
||||
android:focusable="true"
|
||||
android:tag="@string/tv_no_focus_tag"
|
||||
tools:listitem="@layout/library_viewpager_page" />
|
||||
<androidx.viewpager2.widget.ViewPager2
|
||||
android:id="@+id/viewpager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:paddingBottom="40dp"
|
||||
android:focusable="true"
|
||||
android:tag="@string/tv_no_focus_tag"
|
||||
tools:listitem="@layout/library_viewpager_page" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/library_loading_overlay"
|
||||
|
@ -182,7 +184,6 @@
|
|||
tools:listitem="@layout/loading_poster_dynamic" />
|
||||
</com.facebook.shimmer.ShimmerFrameLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
|
|
|
@ -325,19 +325,30 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
|
|||
style="@style/ResultButtonTV"
|
||||
android:nextFocusRight="@id/result_description"
|
||||
android:nextFocusUp="@id/result_bookmark_button"
|
||||
android:nextFocusDown="@id/result_episodes_show"
|
||||
android:nextFocusDown="@id/result_subscribe_button"
|
||||
|
||||
android:text="@string/action_add_to_favorites"
|
||||
android:visibility="visible"
|
||||
app:icon="@drawable/ic_baseline_favorite_border_24" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_subscribe_button"
|
||||
style="@style/ResultButtonTV"
|
||||
android:nextFocusRight="@id/result_description"
|
||||
android:nextFocusUp="@id/result_favorite_button"
|
||||
android:nextFocusDown="@id/result_episodes_show"
|
||||
|
||||
android:text="@string/action_subscribe"
|
||||
android:visibility="visible"
|
||||
app:icon="@drawable/ic_baseline_favorite_border_24" />
|
||||
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/result_episodes_show"
|
||||
style="@style/ResultButtonTV"
|
||||
|
||||
android:nextFocusRight="@id/redirect_to_episodes"
|
||||
android:nextFocusUp="@id/result_favorite_button"
|
||||
android:nextFocusUp="@id/result_subscribe_button"
|
||||
android:nextFocusDown="@id/result_cast_items"
|
||||
|
||||
android:text="@string/episodes"
|
||||
|
|
25
app/src/main/res/layout/lock_pin_dialog.xml
Normal file
25
app/src/main/res/layout/lock_pin_dialog.xml
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/pinEditText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:hint="@string/pin"
|
||||
android:inputType="numberPassword"
|
||||
android:maxLength="4" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/pinEditTextError"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:visibility="gone" />
|
||||
|
||||
</LinearLayout>
|
|
@ -35,6 +35,15 @@
|
|||
android:background="@drawable/outline_card"
|
||||
android:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/lock_icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="top|end"
|
||||
android:layout_margin="4dp"
|
||||
android:src="@drawable/video_locked"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/profile_text"
|
||||
tools:text="@string/mobile_data"
|
||||
|
|
|
@ -77,6 +77,12 @@
|
|||
android:textColorHint="?attr/grayTextColor"
|
||||
tools:ignore="LabelFor" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/lockProfileCheckbox"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/lock_profile" />
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
|
|
@ -74,12 +74,10 @@
|
|||
<string name="popup_resume_download">ማውረድ ቀጥል</string>
|
||||
<string name="subs_text_color">የጽሑፍ ቀለም</string>
|
||||
<string name="type_completed">የተጠናቀቀ</string>
|
||||
<string name="type_none">ምንም</string>
|
||||
<string name="play_trailer_button">የፊልም ማስታወቂያ አጫውት</string>
|
||||
<string name="play_livestream_button">የቀጥታ ስርጭት አጫውት</string>
|
||||
<string name="popup_play_file">ፋይል አጫውት</string>
|
||||
<string name="type_re_watching">እንደገና በማየት ላይ</string>
|
||||
<string name="sort_cancel">ሰርዝ</string>
|
||||
<string name="go_back">ወደ ኋላ መመለሻ</string>
|
||||
<string name="home_info">መረጃ</string>
|
||||
<string name="sort_save">ያስቀምጡ</string>
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
<!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
|
||||
<string name="player_speed_text_format" formatted="true">سرعة (%.2fx)</string>
|
||||
<string name="rated_format" formatted="true">تقييم: %.1f</string>
|
||||
<string name="new_update_format" formatted="true">!تم العثور على تحديث جديد
|
||||
\n%s -> %s</string>
|
||||
<string name="new_update_format" formatted="true">يوجد تحديث جديد!
|
||||
\n%1$s -> %2$s</string>
|
||||
<string name="duration_format" formatted="true">%d دقيقة</string>
|
||||
<string name="app_name">CloudStream</string>
|
||||
<string name="play_with_app_name">تشغيل بواسطة CloudStream</string>
|
||||
|
@ -36,7 +36,6 @@
|
|||
<string name="type_completed">مكتمل</string>
|
||||
<string name="type_dropped">مهمل</string>
|
||||
<string name="type_plan_to_watch">أخطط لمشاهدته</string>
|
||||
<string name="type_none">لا شيء</string>
|
||||
<string name="type_re_watching">إعادة المشاهدة</string>
|
||||
<string name="play_movie_button">مشاهدة الفيلم</string>
|
||||
<string name="play_livestream_button">تشغيل بث حي</string>
|
||||
|
@ -74,7 +73,6 @@
|
|||
<string name="action_remove_from_bookmarks">ازالة</string>
|
||||
<string name="action_add_to_bookmarks">إعداد حالة المشاهدة</string>
|
||||
<string name="sort_apply">تطبيق</string>
|
||||
<string name="sort_cancel">إلغاء</string>
|
||||
<string name="sort_copy">نسخ</string>
|
||||
<string name="sort_close">إغلاق</string>
|
||||
<string name="sort_clear">مسح</string>
|
||||
|
@ -180,6 +178,7 @@
|
|||
<string name="no_episodes_found">لم يتم العثور على أي حلقات</string>
|
||||
<string name="delete_file">حذف الملف</string>
|
||||
<string name="delete">حذف</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="pause">إيقاف مؤقت</string>
|
||||
<string name="resume">إستئناف</string>
|
||||
<string name="go_back_30">-٣٠</string>
|
||||
|
@ -198,7 +197,7 @@
|
|||
<string name="synopsis">القصة</string>
|
||||
<string name="queued">في قائمة الانتظار</string>
|
||||
<string name="no_subtitles">الترجمة ليست موجودة</string>
|
||||
<string name="default_subtitles">الإفتراضي</string>
|
||||
<string name="action_default">الإفتراضي</string>
|
||||
<string name="free_storage">فارغ</string>
|
||||
<string name="used_storage">مستخدم</string>
|
||||
<string name="app_storage">التطبيق</string>
|
||||
|
@ -320,7 +319,7 @@
|
|||
<string name="kitsu_account_settings" translatable="false">Kitsu</string>
|
||||
<string name="trakt_account_settings" translatable="false">Trakt</string>
|
||||
-->
|
||||
<string name="login_format" formatted="true">%s %s</string>
|
||||
<string name="login_format" formatted="true">%1$s %2$s</string>
|
||||
<string name="account">حساب</string>
|
||||
<string name="logout">تسجيل الخروج</string>
|
||||
<string name="login">تسجيل الدخول</string>
|
||||
|
@ -419,8 +418,8 @@
|
|||
<string name="plugin_deleted">تم إزالة الإضافة</string>
|
||||
<string name="plugin_load_fail" formatted="true">تعذر التحميل %s</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">بدأ تنزيل %d %s …</string>
|
||||
<string name="batch_download_finish_format" formatted="true">تم التنزيل %d %s</string>
|
||||
<string name="batch_download_start_format" formatted="true">بدأ تنزيل %1$d %2$s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">تم تنزيل %1$d %2$s</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">جميع %s محملة بالفعل</string>
|
||||
<string name="batch_download">تحميل مكثف</string>
|
||||
<string name="plugin_singular">إضافة</string>
|
||||
|
@ -462,11 +461,11 @@
|
|||
<string name="history">السجل</string>
|
||||
<string name="enable_skip_op_from_database_des">عرض زر تخطي المقدمة/الخاتمة</string>
|
||||
<string name="cast_format" formatted="true">طاقم العمل: %s</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%d يوم %d ساعة %d دقيقة</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%d ساعة %d دقيقة</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%1$d يوم %2$d ساعة %3$d دقيقة</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%1$d ساعة %2$d دقيقة</string>
|
||||
<string name="filler" formatted="true">الفيلير</string>
|
||||
<string name="action_open_play">فتح(تشغيل)</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="season_format">%1$s %2$d%3$s</string>
|
||||
<string name="plugins_updated" formatted="true">المكونات الإضافية المحدثة %d</string>
|
||||
<string name="player_settings_play_in_vlc">VLC</string>
|
||||
<string name="player_settings_play_in_mpv">MPV</string>
|
||||
|
@ -483,7 +482,7 @@
|
|||
<string name="action_mark_as_watched">علّمه كفيديو تمت مشاهدته</string>
|
||||
<string name="yes">نعم</string>
|
||||
<string name="no">ﻻ</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%s الحلقة %d</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s الحلقة %2$d</string>
|
||||
<string name="next_episode_format" formatted="true">سيتم إصدار الحلقة %d في</string>
|
||||
<string name="update_notification_failed">تعذر تثبيت الإصدار الجديد من التطبيق</string>
|
||||
<string name="extension_install_first">تثبيت الإضافة أولا</string>
|
||||
|
@ -494,8 +493,8 @@
|
|||
<string name="update_notification_downloading">تنزيل تحديث التطبيق…</string>
|
||||
<string name="update_notification_installing">تثبيت تحديث التطبيق…</string>
|
||||
<string name="next_episode_time_min_format" formatted="true">%d دقيقة</string>
|
||||
<string name="episodes_range">%d-%d</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="episodes_range">%1$d-%2$d</string>
|
||||
<string name="episode_format" formatted="true">%1$d %2$s</string>
|
||||
<string name="confirm_exit_dialog">هل أنت متأكد أنك تريد الخروج؟</string>
|
||||
<string name="automatic_plugin_download_summary">قم بتثبيت جميع المكونات الإضافية التي لم يتم تثبيتها بعد تلقائيا من المستودعات المضافة.</string>
|
||||
<string name="apk_installer_settings">مثبت الحزم</string>
|
||||
|
@ -581,9 +580,34 @@
|
|||
<string name="unable_to_inflate">تعذر إنشاء واجهة المستخدم بشكل صحيح ، وهذا خطأ كبير ويجب الإبلاغ عنه على الفور %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">حدد الوضع لتصفية تنزيل المكونات الإضافية</string>
|
||||
<string name="disable">تعطيل</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="no_plugins_found_error">لا توجد اضافة في المستودع</string>
|
||||
<string name="no_repository_found_error">المستودع لم يتم العثور عليه، تحقق من العنوان اوجرب شبكة افتراضية خاصة(vpn)</string>
|
||||
<string name="already_voted">لقد صوتت بالفعل</string>
|
||||
<string name="backup_frequency">معدل النسخ الإحتياطي</string>
|
||||
<string name="favorite_removed">تمت إزالة %s من المفضلة</string>
|
||||
<string name="favorites_list_name">المفضلة</string>
|
||||
<string name="favorite_added">تمت إضافة %s إلى المفضلة</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">احتمال وجود تكرارات في مكتبتك.
|
||||
\n
|
||||
\n%s
|
||||
\n
|
||||
\nهل تريد الاضافة على اي حال مستبدلاً النسخة الموجودة بالفعل, أم تفضل إلغاء العملية؟</string>
|
||||
<string name="duplicate_title">احتمال أن يكون موجود بالفعل</string>
|
||||
<string name="lock_profile">قفل الحساب</string>
|
||||
<string name="action_add_to_favorites">اضافة الى المفضلة</string>
|
||||
<string name="duplicate_replace_all">تبديل الكل</string>
|
||||
<string name="pin_error_incorrect">رقم PIN غير صحيح. برجاء المحاولة مرة اخرى.</string>
|
||||
<string name="action_unsubscribe">إلغاء الاشتراك</string>
|
||||
<string name="pin_error_length">رقم ال PIN يجب ان يكون 4 ارقام</string>
|
||||
<string name="duplicate_replace">استبدال</string>
|
||||
<string name="duplicate_add">اضافة</string>
|
||||
<string name="action_subscribe">إشترك</string>
|
||||
<string name="action_remove_from_favorites">إزالة من المفضلة</string>
|
||||
<string name="select_an_account">اختار حساب</string>
|
||||
<string name="duplicate_message_single">من الظاهر أن \"%1$s\" موجود بالفعل في مكتبتك.
|
||||
\n
|
||||
\nهل تريد الاضافة على أي حال مستبدلاً القديم أو إلغاء العملية؟</string>
|
||||
<string name="enter_pin">ادخال ال PIN</string>
|
||||
<string name="pin">PIN</string>
|
||||
<string name="enter_current_pin">أدخل ال PIN الحالي</string>
|
||||
</resources>
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
<string name="result_tags">الأنواع</string>
|
||||
<string name="download_paused">توقف التنزيل</string>
|
||||
<string name="type_plan_to_watch">خطط للمشاهدة</string>
|
||||
<string name="type_none">لا يوجد</string>
|
||||
<string name="type_re_watching">إعادة المشاهدة</string>
|
||||
<string name="new_update_format" formatted="true">!تم العثور على تحديث جديد
|
||||
\n%s->%s</string>
|
||||
|
@ -125,6 +124,7 @@
|
|||
<string name="season">موسم</string>
|
||||
<string name="copy_link_toast">تم نسخ الرابط إلى الحافظة</string>
|
||||
<string name="delete">مسح</string>
|
||||
<string name="cancel">الغي</string>
|
||||
<string name="pause">وقف</string>
|
||||
<string name="update_notification_downloading">جارٍ تنزيل تحديث التطبيق…</string>
|
||||
<string name="subs_default_reset_toast">إعادة التعيين إلى القيمة العادية</string>
|
||||
|
@ -208,7 +208,6 @@
|
|||
<string name="popup_resume_download">استئناف تحميل</string>
|
||||
<string name="home_info">معلومات</string>
|
||||
<string name="popup_pause_download">وقفة التحميل</string>
|
||||
<string name="sort_cancel">الغي</string>
|
||||
<string name="sort_save">احفظ</string>
|
||||
<string name="subtitles_settings">إعدادات الترجمة</string>
|
||||
<string name="subs_text_color">لون الخط</string>
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
<string name="type_completed">Завършено</string>
|
||||
<string name="type_dropped">Изпуснат</string>
|
||||
<string name="type_plan_to_watch">План за гледане</string>
|
||||
<string name="type_none">Нито един</string>
|
||||
<string name="type_re_watching">Повторно гледане</string>
|
||||
<string name="play_movie_button">Пускане на филм</string>
|
||||
<string name="play_livestream_button">Възпроизвеждане на живо</string>
|
||||
|
@ -78,7 +77,6 @@
|
|||
<string name="action_remove_from_bookmarks">Премахване</string>
|
||||
<string name="action_add_to_bookmarks">Задайте статус на гледане</string>
|
||||
<string name="sort_apply">Приложи</string>
|
||||
<string name="sort_cancel">Отказ</string>
|
||||
<string name="sort_copy">Копирай</string>
|
||||
<string name="sort_close">Затвори</string>
|
||||
<string name="sort_clear">Изчисти</string>
|
||||
|
@ -187,6 +185,7 @@
|
|||
<string name="no_episodes_found">Няма намерени епизоди</string>
|
||||
<string name="delete_file">Изтрий файла</string>
|
||||
<string name="delete">Изтрий</string>
|
||||
<string name="cancel">Отказ</string>
|
||||
<string name="pause">Пауза</string>
|
||||
<string name="resume">Продължи</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -205,7 +204,7 @@
|
|||
<string name="synopsis">Синопсис</string>
|
||||
<string name="queued">На опашката</string>
|
||||
<string name="no_subtitles">Без субтитри</string>
|
||||
<string name="default_subtitles">По подразбиране</string>
|
||||
<string name="action_default">По подразбиране</string>
|
||||
<string name="free_storage">Безплатно</string>
|
||||
<string name="used_storage">Използвано</string>
|
||||
<string name="app_storage">Приложения</string>
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
<string name="type_completed">শেষ</string>
|
||||
<string name="type_dropped">বাদ</string>
|
||||
<string name="type_plan_to_watch">দেখার ইচ্ছায়</string>
|
||||
<string name="type_none">কোন কিছুই না</string>
|
||||
<string name="type_re_watching">পুনরায় দেখা হচ্ছে</string>
|
||||
<string name="play_torrent_button">টরেন্ট স্ট্রিম করুন</string>
|
||||
<string name="pick_source">উৎসসমূহ</string>
|
||||
|
@ -72,7 +71,6 @@
|
|||
<string name="action_remove_from_bookmarks">বাদ দিন</string>
|
||||
<string name="action_add_to_bookmarks">বুকমার্ক করুন</string>
|
||||
<string name="sort_apply">প্রয়োগ করুন</string>
|
||||
<string name="sort_cancel">বাদ দিন</string>
|
||||
<string name="sort_copy">কপি করুন</string>
|
||||
<string name="sort_close">বন্ধ করুন</string>
|
||||
<string name="sort_clear">মুছুন</string>
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
<string name="type_completed">Completado</string>
|
||||
<string name="type_dropped">Deixado</string>
|
||||
<string name="type_plan_to_watch">Planejando assistir</string>
|
||||
<string name="type_none">Nenhum</string>
|
||||
<string name="type_re_watching">Reassistindo</string>
|
||||
<string name="play_movie_button">Assistir Filme</string>
|
||||
<string name="play_torrent_button">Transmitir Torrent</string>
|
||||
|
@ -81,7 +80,6 @@
|
|||
<string name="action_remove_from_bookmarks">Remover</string>
|
||||
<string name="action_add_to_bookmarks">Selecionar marcador</string>
|
||||
<string name="sort_apply">Aplicar</string>
|
||||
<string name="sort_cancel">Cancelar</string>
|
||||
<string name="sort_copy">Copiar</string>
|
||||
<string name="sort_close">Fechar</string>
|
||||
<string name="sort_clear">Limpar</string>
|
||||
|
@ -185,6 +183,7 @@
|
|||
<string name="no_episodes_found">Nenhum Episódio encontrado</string>
|
||||
<string name="delete_file">Apagar Arquivo</string>
|
||||
<string name="delete">Deletar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="pause">Pausar</string>
|
||||
<string name="resume">Retomar</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -203,7 +202,7 @@
|
|||
<string name="synopsis">Sinopse</string>
|
||||
<string name="queued">Na fila</string>
|
||||
<string name="no_subtitles">Sem Legendas</string>
|
||||
<string name="default_subtitles">Padrão</string>
|
||||
<string name="action_default">Padrão</string>
|
||||
<string name="free_storage">Livre</string>
|
||||
<string name="used_storage">Usado</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -569,7 +568,6 @@
|
|||
<string name="wifi">Wi-Fi</string>
|
||||
<string name="player_settings_play_in_web">Lista de videos da web</string>
|
||||
<string name="unable_to_inflate">A interface de usuário não foi gerada corretamente. Isto se trata de um bug importante e deve ser reportado imediatamente %s</string>
|
||||
<string name="default_account">Legendas padrão da conta</string>
|
||||
<string name="pref_category_ui_features">Características da interface de usuário</string>
|
||||
<string name="category_provider_test">Provedor de teste</string>
|
||||
<string name="pref_category_player_layout">Layout</string>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<resources>
|
||||
<!-- KEYS DON'T TRANSLATE -->
|
||||
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Ep %2$d</string>
|
||||
<string name="cast_format" formatted="true">Hrají: %s</string>
|
||||
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
|
||||
<string name="result_poster_img_des">Plakát</string>
|
||||
|
@ -17,7 +17,7 @@
|
|||
<string name="player_speed_text_format" formatted="true">Rychlost (%.2fx)</string>
|
||||
<string name="rated_format" formatted="true">Hodnocení: %.1f</string>
|
||||
<string name="new_update_format" formatted="true">Nalezena nová aktualizace!
|
||||
\n%s -> %s</string>
|
||||
\n%1$s -> %2$s</string>
|
||||
<string name="filler" formatted="true">Výplň</string>
|
||||
<string name="duration_format" formatted="true">%d min</string>
|
||||
<string name="app_name">CloudStream</string>
|
||||
|
@ -40,7 +40,6 @@
|
|||
<string name="type_completed">Dokončeno</string>
|
||||
<string name="type_dropped">Zahozeno</string>
|
||||
<string name="type_plan_to_watch">Plánuji sledovat</string>
|
||||
<string name="type_none">Žádné</string>
|
||||
<string name="type_re_watching">Opětovné sledování</string>
|
||||
<string name="play_movie_button">Přehrát film</string>
|
||||
<string name="play_torrent_button">Streamovat torrent</string>
|
||||
|
@ -76,7 +75,6 @@
|
|||
<string name="action_remove_from_bookmarks">Odebrat</string>
|
||||
<string name="action_add_to_bookmarks">Nastavit stav sledování</string>
|
||||
<string name="sort_apply">Použít</string>
|
||||
<string name="sort_cancel">Zrušit</string>
|
||||
<string name="sort_copy">Kopírovat</string>
|
||||
<string name="sort_close">Zavřít</string>
|
||||
<string name="sort_clear">Vymazat</string>
|
||||
|
@ -176,6 +174,7 @@
|
|||
<string name="no_episodes_found">Nenalezeny žádné epizody</string>
|
||||
<string name="delete_file">Smazat soubor</string>
|
||||
<string name="delete">Smazat</string>
|
||||
<string name="cancel">Zrušit</string>
|
||||
<string name="pause">Pozastavit</string>
|
||||
<string name="resume">Pokračovat</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -194,7 +193,7 @@
|
|||
<string name="synopsis">Synopse</string>
|
||||
<string name="queued">ve frontě</string>
|
||||
<string name="no_subtitles">Žádné titulky</string>
|
||||
<string name="default_subtitles">Výchozí</string>
|
||||
<string name="action_default">Výchozí</string>
|
||||
<string name="free_storage">Volné</string>
|
||||
<string name="used_storage">Použito</string>
|
||||
<string name="app_storage">Aplikace</string>
|
||||
|
@ -293,7 +292,7 @@
|
|||
<string name="kitsu_account_settings" translatable="false">Kitsu</string>
|
||||
<string name="trakt_account_settings" translatable="false">Trakt</string>
|
||||
-->
|
||||
<string name="login_format" formatted="true">%s %s</string>
|
||||
<string name="login_format" formatted="true">%1$s %2$s</string>
|
||||
<string name="account">účet</string>
|
||||
<string name="logout">Odhlásit se</string>
|
||||
<string name="login">Přihlásit se</string>
|
||||
|
@ -411,17 +410,17 @@
|
|||
<string name="clipboard_too_large">Příliš mnoho textu. Nepodařilo se uložit do schránky.</string>
|
||||
<string name="yes">Ano</string>
|
||||
<string name="browser">Prohlížeč</string>
|
||||
<string name="episodes_range">%d-%d</string>
|
||||
<string name="episodes_range">%1$d-%2$d</string>
|
||||
<string name="library">Knihovna</string>
|
||||
<string name="kitsu_settings">Zobrazit plakáty z Kitsu</string>
|
||||
<string name="automatic_plugin_download">Automaticky stahovat doplňky</string>
|
||||
<string name="redo_setup_process">Znovu provést proces nastavení</string>
|
||||
<string name="apk_installer_settings">Instalátor APK</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="episode_format" formatted="true">%1$d %2$s</string>
|
||||
<string name="apk_installer_settings_des">Některé telefony nepodporují nový instalátor balíčků. Pokud se aktualizace nenainstalují, zkuste použít starší možnost.</string>
|
||||
<string name="pref_category_cache">Mezipaměť</string>
|
||||
<string name="next_episode_format" formatted="true">Epizoda %d bude vydána za</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%1$dh %2$dm</string>
|
||||
<string name="play_livestream_button">Přehrát přímý přenos</string>
|
||||
<string name="pref_category_extensions">Rozšíření</string>
|
||||
<string name="pref_category_actions">Akce</string>
|
||||
|
@ -437,7 +436,7 @@
|
|||
<string name="preferred_media_subtext">Co chcete vidět</string>
|
||||
<string name="plugin_downloaded">Doplněk stažen</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">Spuštěno stahování %d %s…</string>
|
||||
<string name="batch_download_start_format" formatted="true">Spuštěno stahování %1$d %2$s…</string>
|
||||
<string name="blank_repo_message">CloudStream nemá ve výchozím nastavení nainstalované žádné weby. Stránky je třeba nainstalovat z úložišť.
|
||||
\n
|
||||
\nKvůli nesmyslnému podání stížnosti DMCA společností Sky UK Limited 🤮 nemůžeme v aplikaci propojit stránky repozitářů.
|
||||
|
@ -506,12 +505,12 @@
|
|||
<string name="pref_category_app_updates">Aktualizace aplikace</string>
|
||||
<string name="setup_done">Hotovo</string>
|
||||
<string name="extension_types">Podporováno</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="season_format">%1$s %2$d%3$s</string>
|
||||
<string name="live_singular">Živý přenos</string>
|
||||
<string name="nsfw_singular">NSFW</string>
|
||||
<string name="extensions">Rozšíření</string>
|
||||
<string name="play_trailer_button">Přehrát trailer</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%1$dd %2$dh %3$dm</string>
|
||||
<string name="view_public_repositories_button">Zobrazit komunitní repozitáře</string>
|
||||
<string name="update_started">Aktualizace zahájena</string>
|
||||
<string name="stream">Stream</string>
|
||||
|
@ -521,7 +520,7 @@
|
|||
<string name="referer">Referent</string>
|
||||
<string name="next">Další</string>
|
||||
<string name="provider_languages_tip">Sledovat videa v těchto jazycích</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Staženo %d %s</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Staženo %1$d %2$s</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">Všechny %s jsou již staženy</string>
|
||||
<string name="batch_download">Hromadné stahování</string>
|
||||
<string name="plugin_singular">doplněk</string>
|
||||
|
@ -575,6 +574,32 @@
|
|||
<string name="automatic_plugin_download_mode_title">Výběr režimu pro filtrování stahování doplňků</string>
|
||||
<string name="no_plugins_found_error">V repozitáři nebyly nalezeny žádné doplňky</string>
|
||||
<string name="no_repository_found_error">Repozitář nenalezen, zkontrolujte adresu URL a zkuste použít VPN</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="already_voted">Již jste hlasovali</string>
|
||||
<string name="favorite_removed">%s odebráno z oblíbených</string>
|
||||
<string name="favorites_list_name">Oblíbené</string>
|
||||
<string name="favorite_added">%s přidáno do oblíbených</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">Ve vaší knihovně byl nalezen potenciální duplikát:
|
||||
\n
|
||||
\n%s
|
||||
\n
|
||||
\nChcete přesto přidat tuto položku, nahradit existující nebo zrušit akci\?</string>
|
||||
<string name="backup_frequency">Frekvence záloh</string>
|
||||
<string name="duplicate_title">Nalezena potenciální duplicita</string>
|
||||
<string name="lock_profile">Zamknout profil</string>
|
||||
<string name="action_add_to_favorites">Přidat do oblíbených</string>
|
||||
<string name="duplicate_replace_all">Nahradit vše</string>
|
||||
<string name="pin_error_incorrect">Nesprávný PIN. Zkuste to prosím znovu.</string>
|
||||
<string name="action_unsubscribe">Zrušit odběr</string>
|
||||
<string name="pin_error_length">PIN musí obsahovat 4 znaky</string>
|
||||
<string name="duplicate_replace">Nahradit</string>
|
||||
<string name="duplicate_add">Přidat</string>
|
||||
<string name="action_subscribe">Odebírat</string>
|
||||
<string name="action_remove_from_favorites">Odebrat z oblíbených</string>
|
||||
<string name="select_an_account">Vyberte účet</string>
|
||||
<string name="duplicate_message_single">Vypadá to, že ve vaší knihovně již existuje potenciální duplikát: „%1$s“.
|
||||
\n
|
||||
\nChcete přesto přidat tuto položku, nahradit existující nebo zrušit akci\?</string>
|
||||
<string name="enter_pin">Zadejte PIN</string>
|
||||
<string name="pin">PIN</string>
|
||||
<string name="enter_current_pin">Zadejte současný PIN</string>
|
||||
</resources>
|
||||
|
|
|
@ -52,7 +52,6 @@
|
|||
<string name="type_completed">Abgeschlossen</string>
|
||||
<string name="type_dropped">Abgebrochen</string>
|
||||
<string name="type_plan_to_watch">Geplant</string>
|
||||
<string name="type_none">Nichts</string>
|
||||
<string name="type_re_watching">Erneut schauen</string>
|
||||
<string name="play_movie_button">Film abspielen</string>
|
||||
<string name="play_livestream_button">Livestream abspielen</string>
|
||||
|
@ -89,7 +88,6 @@
|
|||
<string name="action_remove_from_bookmarks">Entfernen</string>
|
||||
<string name="action_add_to_bookmarks">Status setzen</string>
|
||||
<string name="sort_apply">Anwenden</string>
|
||||
<string name="sort_cancel">Abbrechen</string>
|
||||
<string name="sort_copy">Kopieren</string>
|
||||
<string name="sort_close">Schließen</string>
|
||||
<string name="sort_clear">Leeren</string>
|
||||
|
@ -192,6 +190,7 @@
|
|||
<string name="episode_short">E</string>
|
||||
<string name="no_episodes_found">Keine Episoden gefunden</string>
|
||||
<string name="delete">Löschen</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
<string name="pause">Pause</string>
|
||||
<string name="resume">Fortsetzen</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -210,7 +209,7 @@
|
|||
<string name="synopsis">Zusammenfassung</string>
|
||||
<string name="queued">In Warteschlange eingereiht</string>
|
||||
<string name="no_subtitles">Keine Untertitel</string>
|
||||
<string name="default_subtitles">Standard</string>
|
||||
<string name="action_default">Standard</string>
|
||||
<string name="free_storage">Frei</string>
|
||||
<string name="used_storage">Belegt</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -552,5 +551,4 @@
|
|||
<string name="no_repository_found_error">Repository nicht gefunden, überprüf die URL und versuch ein VPN</string>
|
||||
<string name="unable_to_inflate">Die Benutzeroberfläche konnte nicht korrekt erstellt werden. Dies ist ein SCHWERWIEGENDER FEHLER und sollte sofort gemeldet werden. %s</string>
|
||||
<string name="disable">Deaktivieren</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
</resources>
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
<string name="type_completed">Ολοκληρώθηκε</string>
|
||||
<string name="type_dropped">Διακόπηκε</string>
|
||||
<string name="type_plan_to_watch">Για παρακολούθηση</string>
|
||||
<string name="type_none">Τίποτα</string>
|
||||
<string name="play_movie_button">Αναπαραγωγή ταινίας</string>
|
||||
<string name="play_torrent_button">Μετάδοση Torrent</string>
|
||||
<string name="pick_source">Πηγές</string>
|
||||
|
@ -58,7 +57,6 @@
|
|||
<string name="action_remove_from_bookmarks">Αφαίρεση</string>
|
||||
<string name="play_episode_toast">Αναπαραγωγή επεισοδίου</string>
|
||||
<string name="sort_apply">Υποβολή</string>
|
||||
<string name="sort_cancel">Ακύρωση</string>
|
||||
<string name="player_speed">Ταχύτητα αναπαραγωγής</string>
|
||||
<string name="subtitles_settings">Ρυθμίσεις υπότιτλων</string>
|
||||
<string name="subs_text_color">Χρώμα κειμένου</string>
|
||||
|
@ -155,6 +153,7 @@
|
|||
<string name="no_episodes_found">Δεν βρέθηκαν επεισόδια</string>
|
||||
<string name="delete_file">Διαγραφή αρχείου</string>
|
||||
<string name="delete">Διαγραφή</string>
|
||||
<string name="cancel">Ακύρωση</string>
|
||||
<string name="pause">Παύση</string>
|
||||
<string name="resume">Συνέχιση</string>
|
||||
<string name="delete_message" formatted="true">Αυτό θα διαγράψει μόνιμα το %s
|
||||
|
@ -169,7 +168,7 @@
|
|||
<string name="synopsis">Περίληψη</string>
|
||||
<string name="queued">προστέθηκε στην ουρά</string>
|
||||
<string name="no_subtitles">Δεν υπάρχουν διαθέσιμοι υπότιτλοι</string>
|
||||
<string name="default_subtitles">Προεπιλεγμένοι υπότιτλοι</string>
|
||||
<string name="action_default">Προεπιλεγμένοι υπότιτλοι</string>
|
||||
<string name="free_storage">Ελεύθερος</string>
|
||||
<string name="used_storage">Σε χρήση</string>
|
||||
<string name="app_storage">Εφαρμογή</string>
|
||||
|
@ -547,6 +546,5 @@
|
|||
<string name="unable_to_inflate">Το UI δεν ήταν σε θέση να δημιουργηθεί σωστά, είναι ένα σφάλμα και θα πρέπει να αναφερθεί αμέσως %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Επιλέξτε κατάσταση για φιλτράρισμα επεκτάσεων για λήψη</string>
|
||||
<string name="disable">Απενεργοποιημένο</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="stop">Τέλος</string>
|
||||
</resources>
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
<string name="extension_description">Priskribo</string>
|
||||
<string name="extension_version">Versio</string>
|
||||
<string name="extension_status">Stato</string>
|
||||
<string name="sort_cancel">Nuligi</string>
|
||||
<string name="sort_clear">Forviŝi</string>
|
||||
<string name="yes">Jes</string>
|
||||
<string name="no">Ne</string>
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
<string name="setup_extensions_subtext">Descargue la lista de sitios que quiera utilizar</string>
|
||||
<string name="plugins_downloaded" formatted="true">Descargado:%d</string>
|
||||
<string name="downloaded">Descargado</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Descargado %d %s</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Descargado %1$d %2$s</string>
|
||||
<string name="delete_repository">Borrar repositorio</string>
|
||||
<string name="next_episode_format" formatted="true">El episodio %d se lanzará en</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%1$dh %2$dm</string>
|
||||
<string name="next_episode_time_min_format" formatted="true">%dm</string>
|
||||
<string name="result_poster_img_des">Poster</string>
|
||||
<string name="extensions">Extensiones</string>
|
||||
|
@ -45,7 +45,7 @@
|
|||
<string name="player_load_subtitles_online">Cargar desde Internet</string>
|
||||
<string name="autoplay_next_settings">Reproducir automáticamente episodio siguiente</string>
|
||||
<string name="chromecast_subtitles_settings_des">Configuración de subtítulos de Chromecast</string>
|
||||
<string name="default_subtitles">Predeterminado</string>
|
||||
<string name="action_default">Predeterminado</string>
|
||||
<string name="subtitles_outline">Contorno</string>
|
||||
<string name="no_subtitles">Sin Subtítulos</string>
|
||||
<string name="subtitles_raised">Elevado</string>
|
||||
|
@ -97,12 +97,12 @@
|
|||
<string name="search_poster_img_des">Poster</string>
|
||||
<string name="home_next_random_img_des">Siguiente al azar</string>
|
||||
<string name="all_languages_preference">Todos los Idiomas</string>
|
||||
<string name="go_back_img_des">Volver</string>
|
||||
<string name="go_back_img_des">Regresar</string>
|
||||
<string name="home_change_provider_img_des">Cambiar proveedor</string>
|
||||
<string name="preview_background_img_des">Vista previa del fondo</string>
|
||||
<string name="rated_format" formatted="true">Nota:%.1f</string>
|
||||
<string name="new_update_format" formatted="true">Nueva actualización encontrada!
|
||||
\n%s -> %s</string>
|
||||
<string name="new_update_format" formatted="true">¡Nueva actualización encontrada!
|
||||
\n%1$s -> %2$s</string>
|
||||
<string name="download">Descargar</string>
|
||||
<string name="popup_pause_download">Pausar Descarga</string>
|
||||
<string name="subs_font">Formato de fuente</string>
|
||||
|
@ -110,8 +110,8 @@
|
|||
<string name="subs_font_size">Tamaño de Fuente</string>
|
||||
<string name="player_speed_text_format" formatted="true">Velocidad (%.2fx)</string>
|
||||
<string name="skip_loading">Omitir carga</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Ep. %2$d</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%1$dd %2$dh %3$dm</string>
|
||||
<string name="cast_format" formatted="true">Elenco %s</string>
|
||||
<string name="filler" formatted="true">Relleno</string>
|
||||
<string name="duration_format" formatted="true">%d min</string>
|
||||
|
@ -138,7 +138,6 @@
|
|||
<string name="type_completed">Completado</string>
|
||||
<string name="type_dropped">Descartado</string>
|
||||
<string name="type_plan_to_watch">Planeando ver</string>
|
||||
<string name="type_none">Ninguno</string>
|
||||
<string name="type_re_watching">Volviendo a mirar</string>
|
||||
<string name="play_movie_button">Reproducir película</string>
|
||||
<string name="play_trailer_button">Reproducir Trailer</string>
|
||||
|
@ -146,7 +145,7 @@
|
|||
<string name="play_torrent_button">Transmitir Torrent</string>
|
||||
<string name="pick_source">Fuentes</string>
|
||||
<string name="reload_error">Reintentar conexión…</string>
|
||||
<string name="go_back">Volver</string>
|
||||
<string name="go_back">Regresar</string>
|
||||
<string name="downloading">Descargando</string>
|
||||
<string name="download_paused">Descarga pausada</string>
|
||||
<string name="download_started">Descarga iniciada</string>
|
||||
|
@ -167,7 +166,6 @@
|
|||
<string name="error_bookmarks_text">Marcadores</string>
|
||||
<string name="action_remove_from_bookmarks">Remover</string>
|
||||
<string name="action_add_to_bookmarks">Seleccionar estado de visualización</string>
|
||||
<string name="sort_cancel">Cancelar</string>
|
||||
<string name="sort_copy">Copiar</string>
|
||||
<string name="sort_close">Cerrar</string>
|
||||
<string name="sort_clear">Limpiar</string>
|
||||
|
@ -220,8 +218,8 @@
|
|||
<string name="play_episode_toast">Reproducir Episodio</string>
|
||||
<string name="episode">Episodio</string>
|
||||
<string name="episodes">Episodios</string>
|
||||
<string name="episodes_range">%d-%d</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="episodes_range">%1$d-%2$d</string>
|
||||
<string name="episode_format" formatted="true">%1$d %2$s</string>
|
||||
<string name="episode_short">E</string>
|
||||
<string name="restore_failed_format" formatted="true">Falló la restauración de los datos desde el archivo %s</string>
|
||||
<string name="backup_success">Datos guardados</string>
|
||||
|
@ -235,7 +233,7 @@
|
|||
<string name="advanced_search_des">Mostrar los resultados de la búsqueda por proveedor</string>
|
||||
<string name="bug_report_settings_off">Solo envíar los datos si la App se cierra / falla inesperadamente</string>
|
||||
<string name="bug_report_settings_on">No enviar datos</string>
|
||||
<string name="show_trailers_settings">Mostrar Trailers (avances)</string>
|
||||
<string name="show_trailers_settings">Mostrar los trailers</string>
|
||||
<string name="kitsu_settings">Mostrar pósters de Kitsu</string>
|
||||
<string name="uprereleases_settings">Actualizar a las versiones preliminares</string>
|
||||
<string name="uprereleases_settings_des">Buscar actualizaciones preliminares (beta) en lugar de solo versiones completas (stable releases)</string>
|
||||
|
@ -251,11 +249,12 @@
|
|||
<string name="subs_default_reset_toast">Reiniciar a valores predefinidos</string>
|
||||
<string name="acra_report_toast">Lo sentimos, la aplicación se bloqueó. Se enviará un informe de error anónimo a los desarrolladores</string>
|
||||
<string name="season">Temporada</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="season_format">%1$s %2$d%3$s</string>
|
||||
<string name="no_season">Ninguna Temporada</string>
|
||||
<string name="season_short">T</string>
|
||||
<string name="delete_file">Borrar Archivo</string>
|
||||
<string name="delete">Borrar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="unexpected_error">Error inesperado del reproductor</string>
|
||||
<string name="episode_action_chromecast_episode">Episodio en Chromecast</string>
|
||||
<string name="episode_action_play_in_app">Reproducir en la aplicación</string>
|
||||
|
@ -312,7 +311,7 @@
|
|||
<string name="switch_account">Cambiar cuenta</string>
|
||||
<string name="add_account">Añadir cuenta</string>
|
||||
<string name="upload_sync">Sincronizar</string>
|
||||
<string name="sync_score">Calificación</string>
|
||||
<string name="sync_score">Clasificado</string>
|
||||
<string name="authenticated_user" formatted="true">%s autenticado</string>
|
||||
<string name="authenticated_user_fail" formatted="true">No se pudo autenticar a %s</string>
|
||||
<string name="recommended">Recomendado</string>
|
||||
|
@ -346,7 +345,7 @@
|
|||
<string name="primary_color_settings">Color primario</string>
|
||||
<string name="app_theme_settings">Tema de la aplicación</string>
|
||||
<string name="example_email">hola@mundo.com</string>
|
||||
<string name="login_format" formatted="true">%s %s</string>
|
||||
<string name="login_format" formatted="true">%1$s %2$s</string>
|
||||
<string name="all">Todo</string>
|
||||
<string name="subtitle_offset_hint">1000ms</string>
|
||||
<string name="subtitle_offset_extra_hint_none_format">Sin retraso de subtítulos</string>
|
||||
|
@ -449,7 +448,7 @@
|
|||
<string name="setup_done">Hecho</string>
|
||||
<string name="plugin_loaded">Plugin Cargado</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">Iniciada la descarga %d %s…</string>
|
||||
<string name="batch_download_start_format" formatted="true">Comenzó la descarga de %1$d %2$s…</string>
|
||||
<string name="batch_download">Descarga por lotes</string>
|
||||
<string name="plugin_singular">plugin</string>
|
||||
<string name="plugin">plugins</string>
|
||||
|
@ -549,9 +548,34 @@
|
|||
<string name="unable_to_inflate">La interfaz de usuario no se ha podido crear correctamente, se trata de un GRAN BUG y debe ser reportado inmediatamente %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Seleccionar modo para filtrar los plugins descargados</string>
|
||||
<string name="disable">Deshabilitar</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="no_plugins_found_error">No se encontraron complementos en el repositorio</string>
|
||||
<string name="no_repository_found_error">Repositorio no encontrado, comprueba la URL y prueba la VPN</string>
|
||||
<string name="already_voted">Ya has votado</string>
|
||||
<string name="backup_frequency">Frecuencia de la copia de seguridad</string>
|
||||
<string name="favorite_removed">%s eliminado de favoritos</string>
|
||||
<string name="favorites_list_name">Favoritos</string>
|
||||
<string name="favorite_added">%s añadido a favoritos</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">Se han encontrado posibles elementos duplicados en su biblioteca:
|
||||
\n
|
||||
\n%s
|
||||
\n
|
||||
\n¿Desea añadir este elemento de todos modos, sustituir los existentes o cancelar la acción\?</string>
|
||||
<string name="duplicate_title">Posible duplicado encontrado</string>
|
||||
<string name="lock_profile">Perfil de bloqueo</string>
|
||||
<string name="action_add_to_favorites">Añadido a favoritos</string>
|
||||
<string name="duplicate_replace_all">Sustituir todo</string>
|
||||
<string name="pin_error_incorrect">PIN incorrecto. Por favor, inténtelo de nuevo.</string>
|
||||
<string name="action_unsubscribe">Cancelar la suscripción</string>
|
||||
<string name="pin_error_length">El PIN debe tener 4 caracteres</string>
|
||||
<string name="duplicate_replace">Sustituir</string>
|
||||
<string name="duplicate_add">Añadir</string>
|
||||
<string name="action_subscribe">Suscríbase</string>
|
||||
<string name="action_remove_from_favorites">Eliminar de favoritos</string>
|
||||
<string name="select_an_account">Seleccione una cuenta</string>
|
||||
<string name="duplicate_message_single">Parece que ya existe un elemento potencialmente duplicado en su biblioteca: \'%s.\'
|
||||
\n
|
||||
\n¿Desea añadir este elemento de todos modos, sustituir el existente o cancelar la acción\?</string>
|
||||
<string name="enter_pin">Introducir el PIN</string>
|
||||
<string name="pin">PIN</string>
|
||||
<string name="enter_current_pin">Introduzca el PIN actual</string>
|
||||
</resources>
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
<string name="type_completed">Terminé</string>
|
||||
<string name="type_dropped">Abandonné</string>
|
||||
<string name="type_plan_to_watch">À regarder</string>
|
||||
<string name="type_none">Aucun</string>
|
||||
<string name="play_movie_button">Lire</string>
|
||||
<string name="play_torrent_button">Streamer le Torrent</string>
|
||||
<string name="pick_source">Sources</string>
|
||||
|
@ -60,7 +59,6 @@
|
|||
<string name="error_bookmarks_text">Marque-pages</string>
|
||||
<string name="action_remove_from_bookmarks">Supprimer</string>
|
||||
<string name="sort_apply">Appliquer</string>
|
||||
<string name="sort_cancel">Annuler</string>
|
||||
<string name="player_speed">Vitesse de lecture</string>
|
||||
<string name="preview_background_img_des">Aperçu de l\'arrière-plan</string>
|
||||
<string name="benene">Donner une benene aux devs</string>
|
||||
|
@ -80,6 +78,7 @@
|
|||
<string name="episode_short">E</string>
|
||||
<string name="delete_file">Supprimer le Fichier</string>
|
||||
<string name="delete">Supprimer</string>
|
||||
<string name="cancel">Annuler</string>
|
||||
<string name="pause">Pause</string>
|
||||
<string name="resume">Reprendre</string>
|
||||
<string name="delete_message">Cela va supprimer définitivement %s
|
||||
|
@ -94,7 +93,7 @@
|
|||
<string name="synopsis">Synopsis</string>
|
||||
<string name="queued">Liste d\'attente</string>
|
||||
<string name="no_subtitles">Pas de sous-titres</string>
|
||||
<string name="default_subtitles">Défault</string>
|
||||
<string name="action_default">Défault</string>
|
||||
<string name="free_storage">Libre</string>
|
||||
<string name="used_storage">Utilisé</string>
|
||||
<string name="app_storage">Application</string>
|
||||
|
@ -553,5 +552,4 @@
|
|||
<string name="unable_to_inflate">L\'interface utilisateur n\'a pas pu être créée correctement. Il s\'agit d\'un bogue majeur qui doit être signalé immédiatement %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Sélectionnez le mode pour filtrer le téléchargement des plugins</string>
|
||||
<string name="profile_background_des">Fond de profil</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
</resources>
|
||||
|
|
|
@ -29,13 +29,11 @@
|
|||
<string name="type_completed">Completado</string>
|
||||
<string name="type_dropped">Descartado</string>
|
||||
<string name="type_plan_to_watch">Planeando ver</string>
|
||||
<string name="type_none">Ningún</string>
|
||||
<string name="type_re_watching">Remirando</string>
|
||||
<string name="error_bookmarks_text">Marcadores</string>
|
||||
<string name="action_remove_from_bookmarks">Borrar</string>
|
||||
<string name="action_add_to_bookmarks">Seleccionar estado de visualización</string>
|
||||
<string name="sort_apply">Aplicar</string>
|
||||
<string name="sort_cancel">Cancelar</string>
|
||||
<string name="sort_copy">Copiar</string>
|
||||
<string name="sort_close">Cerrar</string>
|
||||
<string name="sort_clear">Limpar</string>
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
<string name="error_bookmarks_text">बुकमार्क्स</string>
|
||||
<string name="action_remove_from_bookmarks">हटाएँ</string>
|
||||
<string name="sort_apply">लागू करें</string>
|
||||
<string name="sort_cancel">रद्द करें</string>
|
||||
<string name="player_speed">प्लेयर स्पीड</string>
|
||||
<string name="search_provider_text_providers">प्रोवाइडरों का उपयोग कर खोजें</string>
|
||||
<string name="search_provider_text_types">प्रकार का उपयोग करके खोजें</string>
|
||||
|
@ -91,6 +90,7 @@
|
|||
<string name="acra_report_toast">क्षमा करें, एप्प क्रैश हो गया है । निर्माताओं को एक अनाम बग रिपोर्ट भेजी जाएगी</string>
|
||||
<string name="delete_file">फ़ाइल डिलीट करें</string>
|
||||
<string name="delete">डिलीट</string>
|
||||
<string name="cancel">रद्द करें</string>
|
||||
<string name="pause">रोकें</string>
|
||||
<string name="resume">फिर से चलाएं</string>
|
||||
<string name="delete_message">इससे %s स्थायी रूप से हट जाएगा
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
<string name="type_completed">Dovršeno</string>
|
||||
<string name="type_dropped">Ispušteno</string>
|
||||
<string name="type_plan_to_watch">Planiram pogledati</string>
|
||||
<string name="type_none">Ništa</string>
|
||||
<string name="type_re_watching">Ponovno gledam</string>
|
||||
<string name="play_movie_button">Pokreni Film</string>
|
||||
<string name="play_livestream_button">Pokreni LiveStream</string>
|
||||
|
@ -92,7 +91,6 @@
|
|||
<string name="action_remove_from_bookmarks">Ukloni</string>
|
||||
<string name="action_add_to_bookmarks">Postavi status gledanja</string>
|
||||
<string name="sort_apply">Primijeni</string>
|
||||
<string name="sort_cancel">Poništi</string>
|
||||
<string name="sort_copy">Kopiraj</string>
|
||||
<string name="sort_close">Zatvori</string>
|
||||
<string name="sort_clear">Očisti</string>
|
||||
|
@ -200,6 +198,7 @@
|
|||
<string name="no_episodes_found">Nisu pronađene epizode</string>
|
||||
<string name="delete_file">Izbriši datoteku</string>
|
||||
<string name="delete">Izbriši</string>
|
||||
<string name="cancel">Poništi</string>
|
||||
<string name="pause">Pauziraj</string>
|
||||
<string name="resume">Nastavi</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -218,7 +217,7 @@
|
|||
<string name="synopsis">Sinopsis</string>
|
||||
<string name="queued">u redu čekanja</string>
|
||||
<string name="no_subtitles">Bez titlova</string>
|
||||
<string name="default_subtitles">Zadano</string>
|
||||
<string name="action_default">Zadano</string>
|
||||
<string name="free_storage">Slobodno</string>
|
||||
<string name="used_storage">Iskorišteno</string>
|
||||
<string name="app_storage">Aplikacija</string>
|
||||
|
@ -567,7 +566,6 @@
|
|||
<string name="unable_to_inflate">Nije bilo moguće ispravno izraditi korisničko sučelje. Ovo je ZNAČAJNA GREŠKA i treba se odmah prijaviti %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Odaberi modus za filtriranje preuzimanja dodataka</string>
|
||||
<string name="disable">Onemogući</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="no_plugins_found_error">U repozitoriju nisu pronađeni dodaci</string>
|
||||
<string name="no_repository_found_error">Repozitorij nije pronađen, provjerite URL i pokušajte koristiti VPN</string>
|
||||
<string name="quality_profile_help">Ovdje možete promijeniti način na koji su izvori poredani. Ako video ima viši prioritet, pojavit će se više u odabiru izvora. Zbroj prioriteta izvora i prioriteta kvalitete je video prioritet.
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
<string name="download">Letöltés</string>
|
||||
<string name="search">Keresés</string>
|
||||
<string name="delete">Törlés</string>
|
||||
<string name="cancel">Mégse</string>
|
||||
<string name="pause">Szüneteltetés</string>
|
||||
<string name="queued">sorba állítva</string>
|
||||
<string name="resize_fit">Igazítás</string>
|
||||
|
@ -61,7 +62,6 @@
|
|||
<string name="type_watching">Nézés</string>
|
||||
<string name="type_completed">Befejezve</string>
|
||||
<string name="type_plan_to_watch">Később megnézés</string>
|
||||
<string name="type_none">Nincs</string>
|
||||
<string name="type_re_watching">Újranézés</string>
|
||||
<string name="play_movie_button">Film lejátszása</string>
|
||||
<string name="play_trailer_button">Előzetes lejátszása</string>
|
||||
|
@ -90,7 +90,6 @@
|
|||
<string name="action_remove_from_bookmarks">Eltávolítás</string>
|
||||
<string name="action_add_to_bookmarks">Megtekintés állapotának beállítása</string>
|
||||
<string name="sort_apply">Alkalmazás</string>
|
||||
<string name="sort_cancel">Mégse</string>
|
||||
<string name="sort_copy">Másolás</string>
|
||||
<string name="sort_close">Bezárás</string>
|
||||
<string name="sort_clear">Törlés</string>
|
||||
|
@ -162,7 +161,7 @@
|
|||
<string name="rating">Értékelés</string>
|
||||
<string name="cartoons">Rajzfilmek</string>
|
||||
<string name="livestreams">Élőadások</string>
|
||||
<string name="default_subtitles">Alapértelmezett</string>
|
||||
<string name="action_default">Alapértelmezett</string>
|
||||
<string name="movies">Filmek</string>
|
||||
<string name="tv_series">TV sorozat</string>
|
||||
<string name="anime">Anime</string>
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
<string name="type_completed">Selesai</string>
|
||||
<string name="type_dropped">Dihentikan</string>
|
||||
<string name="type_plan_to_watch">Rencana untuk Menonton</string>
|
||||
<string name="type_none">Tidak Ada</string>
|
||||
<string name="type_re_watching">Menonton Ulang</string>
|
||||
<string name="play_movie_button">Putar Movie</string>
|
||||
<string name="play_torrent_button">Streaming Torrent</string>
|
||||
|
@ -75,7 +74,6 @@
|
|||
<string name="action_remove_from_bookmarks">Hapus</string>
|
||||
<string name="action_add_to_bookmarks">Atur status tontonan</string>
|
||||
<string name="sort_apply">Terapkan</string>
|
||||
<string name="sort_cancel">Batalkan</string>
|
||||
<string name="sort_copy">Salin</string>
|
||||
<string name="sort_close">Tutup</string>
|
||||
<string name="sort_clear">Bersihkan</string>
|
||||
|
@ -174,6 +172,7 @@
|
|||
<string name="no_episodes_found">Episode Tidak Ditemukan</string>
|
||||
<string name="delete_file">Hapus File</string>
|
||||
<string name="delete">Hapus</string>
|
||||
<string name="cancel">Batalkan</string>
|
||||
<string name="pause">Jeda</string>
|
||||
<string name="resume">Lanjutkan</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -192,7 +191,7 @@
|
|||
<string name="synopsis">Sinopsis</string>
|
||||
<string name="queued">antri</string>
|
||||
<string name="no_subtitles">Tidak Ada Subtitle</string>
|
||||
<string name="default_subtitles">Default</string>
|
||||
<string name="action_default">Default</string>
|
||||
<string name="free_storage">Tersedia</string>
|
||||
<string name="used_storage">Terpakai</string>
|
||||
<string name="app_storage">Aplikasi</string>
|
||||
|
@ -575,5 +574,4 @@
|
|||
<string name="no_plugins_found_error">Tidak ada plugin yang ditemukan di repositori</string>
|
||||
<string name="no_repository_found_error">Repositori tidak ditemukan, periksa URL dan coba VPN</string>
|
||||
<string name="already_voted">Kamu sudah voting</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
</resources>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<string name="player_speed_text_format" formatted="true">Velocità (%.2fx)</string>
|
||||
<string name="rated_format" formatted="true">Valutato: %.1f</string>
|
||||
<string name="new_update_format" formatted="true">Nuovo aggiornamento trovato!
|
||||
\n%s -> %s</string>
|
||||
\n%1$s -> %2$s</string>
|
||||
<string name="filler" formatted="true">Filler</string>
|
||||
<string name="duration_format" formatted="true">%d min</string>
|
||||
<!-- <string name="app_name">CloudStream</string> -->
|
||||
|
@ -44,7 +44,6 @@
|
|||
<string name="type_completed">Completato</string>
|
||||
<string name="type_dropped">Abbandonato</string>
|
||||
<string name="type_plan_to_watch">Da guardare</string>
|
||||
<string name="type_none">Nessuno</string>
|
||||
<string name="type_re_watching">Riguardando</string>
|
||||
<string name="play_movie_button">Riproduci film</string>
|
||||
<string name="play_livestream_button">Riproduci Livestream</string>
|
||||
|
@ -81,7 +80,6 @@
|
|||
<string name="action_remove_from_bookmarks">Rimuovi</string>
|
||||
<string name="action_add_to_bookmarks">Imposta stato riproduzione</string>
|
||||
<string name="sort_apply">Applica</string>
|
||||
<string name="sort_cancel">Cancella</string>
|
||||
<string name="sort_copy">Copia</string>
|
||||
<string name="sort_close">Chiudi</string>
|
||||
<string name="sort_clear">Cancella</string>
|
||||
|
@ -190,6 +188,7 @@
|
|||
<string name="no_episodes_found">Nessun episodio trovato</string>
|
||||
<string name="delete_file">Elimina file</string>
|
||||
<string name="delete">Elimina</string>
|
||||
<string name="cancel">Cancella</string>
|
||||
<string name="pause">Pausa</string>
|
||||
<string name="resume">Riprendi</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -208,7 +207,7 @@
|
|||
<string name="synopsis">Sinossi</string>
|
||||
<string name="queued">In coda</string>
|
||||
<string name="no_subtitles">Nessun sottotiolo</string>
|
||||
<string name="default_subtitles">Default</string>
|
||||
<string name="action_default">Default</string>
|
||||
<string name="free_storage">Libero</string>
|
||||
<string name="used_storage">Usato</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -410,8 +409,8 @@
|
|||
<string name="plugin_deleted">Plugin eliminato</string>
|
||||
<string name="plugin_load_fail" formatted="true">Impossibile caricare %s</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">Download iniziato %d %s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Scaricato %d %s</string>
|
||||
<string name="batch_download_start_format" formatted="true">Download iniziato %1$d %2$s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Scaricato %1$d %2$s</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">Tutti %s già scaricati</string>
|
||||
<string name="batch_download">Download in blocco</string>
|
||||
<string name="plugin_singular">plugin</string>
|
||||
|
@ -572,7 +571,32 @@
|
|||
<string name="no_repository_found_error">Repository non trovato, controlla l\'URL e prova la VPN</string>
|
||||
<string name="unable_to_inflate">Non è stato possibile creare correttamente l\'interfaccia utente, questo è un GRANDE BUG e dovrebbe essere segnalato immediatamente %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Seleziona la modalità per filtrare il download dei plugin</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="disable">Disabilita</string>
|
||||
<string name="already_voted">Hai già votato</string>
|
||||
<string name="favorite_removed">%s rimosso dai preferiti</string>
|
||||
<string name="favorites_list_name">Preferiti</string>
|
||||
<string name="favorite_added">%s aggiunto ai preferiti</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">Dei possibili duplicati sono stati trovati nella tua libreria:
|
||||
\n
|
||||
\n%s
|
||||
\n
|
||||
\nVorresti aggiungere l\'oggetto alla libreria comunque, rimpiazzare l\'esistente, o cancellare l\'azione\?</string>
|
||||
<string name="backup_frequency">Frequenza di backup</string>
|
||||
<string name="duplicate_title">Trovato Possibile Duplicato</string>
|
||||
<string name="action_add_to_favorites">Aggiungi ai preferiti</string>
|
||||
<string name="duplicate_replace_all">Rimpiazza tutti</string>
|
||||
<string name="pin_error_incorrect">PIN non corretto. Riprova.</string>
|
||||
<string name="action_unsubscribe">Disiscriviti</string>
|
||||
<string name="pin_error_length">Il PIN deve essere almeno di 4 caratteri</string>
|
||||
<string name="duplicate_replace">Rimpiazza</string>
|
||||
<string name="duplicate_add">Aggiungi</string>
|
||||
<string name="action_subscribe">Iscriviti</string>
|
||||
<string name="action_remove_from_favorites">Rimuovi dai preferiti</string>
|
||||
<string name="select_an_account">Seleziona un Account</string>
|
||||
<string name="duplicate_message_single">Sembra che un oggetto potenziale duplicato sia già presente nella tua libreria: \'%1$s.\'
|
||||
\n
|
||||
\nVorresti aggiungere l\'oggetto lo stesso, rimpiazzare l\'esistente, o cancellare l\'azione\?</string>
|
||||
<string name="enter_pin">Inserisci PIN</string>
|
||||
<string name="pin">PIN</string>
|
||||
<string name="enter_current_pin">Inserisci PIN Corrente</string>
|
||||
</resources>
|
||||
|
|
|
@ -66,7 +66,6 @@
|
|||
<string name="action_remove_from_bookmarks">הסר</string>
|
||||
<string name="action_add_to_bookmarks">הגדר מצב צפייה</string>
|
||||
<string name="sort_apply">ליישם</string>
|
||||
<string name="sort_cancel">בטל</string>
|
||||
<string name="sort_copy">העתק</string>
|
||||
<string name="sort_close">לסגור</string>
|
||||
<string name="sort_clear">נקה</string>
|
||||
|
@ -78,7 +77,6 @@
|
|||
<string name="type_watching">צופה</string>
|
||||
<string name="pick_subtitle">כתוביות</string>
|
||||
<string name="type_on_hold">בהמתנה</string>
|
||||
<string name="type_none">ללא</string>
|
||||
<string name="download">להוריד</string>
|
||||
<string name="app_dubbed_text">מדובב</string>
|
||||
<string name="home_more_info">יותר מידע</string>
|
||||
|
@ -146,6 +144,7 @@
|
|||
<string name="no_episodes_found">לא נמצאו פרקים</string>
|
||||
<string name="delete_file">מחק קובץ</string>
|
||||
<string name="delete">מחק</string>
|
||||
<string name="cancel">בטל</string>
|
||||
<string name="pause">השהה</string>
|
||||
<string name="resume">המשך</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -159,7 +158,7 @@
|
|||
<string name="rating">דירוג</string>
|
||||
<string name="year">שנה</string>
|
||||
<string name="no_subtitles">ללא כתוביות</string>
|
||||
<string name="default_subtitles">ברירת מחדל</string>
|
||||
<string name="action_default">ברירת מחדל</string>
|
||||
<string name="free_storage">חינם</string>
|
||||
<string name="used_storage">משומש</string>
|
||||
<string name="tv_series">סדרת טלוויזיה</string>
|
||||
|
@ -519,7 +518,6 @@
|
|||
<string name="edit">עריכה</string>
|
||||
<string name="wifi">Wi-Fi</string>
|
||||
<string name="profile_background_des">רקע הפרופיל</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="test_log">רשומה</string>
|
||||
<string name="help">עזרה</string>
|
||||
<string name="start">התחלה</string>
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
<string name="asian_drama_singular">アジアドラマ</string>
|
||||
<string name="live_singular">ライブ配信</string>
|
||||
<string name="nsfw_singular">NSFW</string>
|
||||
<string name="sort_cancel">キャンセル</string>
|
||||
<string name="anime">アニメ</string>
|
||||
<string name="video_lock">ロック</string>
|
||||
<string name="video_source">ソース</string>
|
||||
|
@ -71,7 +70,6 @@
|
|||
<string name="home_source">ソース</string>
|
||||
<string name="history">履歴</string>
|
||||
<string name="result_poster_img_des">ポスター</string>
|
||||
<string name="type_none">なし</string>
|
||||
<string name="sort_copy">コピー</string>
|
||||
<string name="sort_close">閉じる</string>
|
||||
<string name="sort_save">保存</string>
|
||||
|
@ -135,6 +133,7 @@
|
|||
<string name="pause">一時停止</string>
|
||||
<string name="play_episode_toast">再生エピソード</string>
|
||||
<string name="delete">削除</string>
|
||||
<string name="cancel">キャンセル</string>
|
||||
<string name="start">開始</string>
|
||||
<string name="status">状態</string>
|
||||
<string name="year">年</string>
|
||||
|
@ -155,7 +154,7 @@
|
|||
<string name="extension_version">バージョン</string>
|
||||
<string name="extension_rating" formatted="true">視聴率 %s</string>
|
||||
<string name="rating">視聴率</string>
|
||||
<string name="default_subtitles">デフォルト</string>
|
||||
<string name="action_default">デフォルト</string>
|
||||
<string name="download_failed">ダウンロード失敗</string>
|
||||
<string name="download_started">ダウンロード開始</string>
|
||||
<string name="download_done">ダウンロード完了</string>
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
<string name="home_info">ಮಾಹಿತಿ</string>
|
||||
<string name="action_add_to_bookmarks">ಸೆಟ್ ವಾಚ್ ಸ್ಟೇಟಸ್</string>
|
||||
<string name="sort_apply">ಅನ್ವಯಿಸು</string>
|
||||
<string name="sort_cancel">ರದ್ದುಮಾಡು</string>
|
||||
<string name="subs_subtitle_elevation">ಸಬ್ ಟೈಟಲ್ಸ್ ಎಲೆವಷನ್</string>
|
||||
<string name="subs_font_size">ಫಾಂಟ್ ಸೈಜ್</string>
|
||||
<string name="subs_subtitle_languages">ಸಬ್ ಟೈಟಲ್ಸ್ ಭಾಷೆ</string>
|
||||
|
@ -108,7 +107,6 @@
|
|||
<string name="result_tags">ಪ್ರಕಾರಗಳು</string>
|
||||
<string name="result_open_in_browser">ಬ್ರೌಸರ್ ತೆರೆಯಿರಿ</string>
|
||||
<string name="type_on_hold">ಆನ್-ಹೋಲ್ಡ್</string>
|
||||
<string name="type_none">ನನ್</string>
|
||||
<string name="reload_error">ಸಂಪರ್ಕವನ್ನು ಮರುಪ್ರಯತ್ನಿಸಿ…</string>
|
||||
<string name="download_paused">ಡೌನ್ಲೋಡ್ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ</string>
|
||||
<string name="download_failed">ಡೌನ್ಲೋಡ್ ವಿಫಲವಾಗಿದೆ</string>
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
<string name="type_completed">시청 완료</string>
|
||||
<string name="type_dropped">포기</string>
|
||||
<string name="type_plan_to_watch">시청 예정</string>
|
||||
<string name="type_none">없음</string>
|
||||
<string name="type_re_watching">다시보기</string>
|
||||
<string name="play_movie_button">영화 재생</string>
|
||||
<string name="play_trailer_button">예고편 재생</string>
|
||||
|
@ -95,7 +94,6 @@
|
|||
<string name="pref_category_backup">백업</string>
|
||||
<string name="app_dubbed_text">더빙</string>
|
||||
<string name="app_subbed_text">자막</string>
|
||||
<string name="sort_cancel">취소</string>
|
||||
<string name="filter_bookmarks">북마크 필터</string>
|
||||
<string name="error_bookmarks_text">북마크</string>
|
||||
<string name="sort_clear">제거</string>
|
||||
|
@ -177,7 +175,7 @@
|
|||
<string name="synopsis">개요</string>
|
||||
<string name="queued">대기중</string>
|
||||
<string name="no_subtitles">자막 없음</string>
|
||||
<string name="default_subtitles">기본</string>
|
||||
<string name="action_default">기본</string>
|
||||
<string name="free_storage">남음</string>
|
||||
<string name="used_storage">사용됨</string>
|
||||
<string name="app_storage">앱</string>
|
||||
|
@ -352,6 +350,7 @@
|
|||
<string name="asian_drama_singular">아시아 드라마</string>
|
||||
<string name="season">시즌</string>
|
||||
<string name="delete">삭제</string>
|
||||
<string name="cancel">취소</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="delete_file">파일 삭제</string>
|
||||
<string name="pause">일시정지</string>
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
<string name="documentaries">Dokumentika</string>
|
||||
<string name="play_torrent_button">Transliuoti Torrentą</string>
|
||||
<string name="delete">Ištrinti</string>
|
||||
<string name="cancel">Atšaukti</string>
|
||||
<string name="start">Pradėti</string>
|
||||
<string name="eigengraumode_settings_des">Prideda greičio pasirinkti grotuve</string>
|
||||
<string name="cartoons_singular">Filmukas</string>
|
||||
|
@ -95,7 +96,6 @@
|
|||
<string name="subs_text_color">Teksto spalva</string>
|
||||
<string name="type_completed">Užbaigta</string>
|
||||
<string name="use_system_brightness_settings_des">Naudoti sistemos ryškumą programos grotuve vietoj tamsumo</string>
|
||||
<string name="type_none">Tuščia</string>
|
||||
<string name="restore_failed_format" formatted="true">Nepavyko atstatyti duomenis iš failo %s</string>
|
||||
<string name="play_trailer_button">Paleisti anonsa</string>
|
||||
<string name="play_livestream_button">Paleisti gyva transliacija</string>
|
||||
|
@ -107,7 +107,6 @@
|
|||
<string name="type_re_watching">Peržiūrima</string>
|
||||
<string name="result_open_in_browser">Atidaryti Naršyklėje</string>
|
||||
<string name="use_system_brightness_settings">Naudoti sistemos ryškumą</string>
|
||||
<string name="sort_cancel">Atšaukti</string>
|
||||
<string name="no_data">Nėra duomenų</string>
|
||||
<string name="subs_font">Šriftas</string>
|
||||
<string name="redo_setup_process">Perdaryti nustatymo procesą</string>
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
<string name="type_completed">Pabeigts</string>
|
||||
<string name="type_dropped">Atmests</string>
|
||||
<string name="type_plan_to_watch">Plāno skatīties</string>
|
||||
<string name="type_none">Neviena</string>
|
||||
<string name="type_re_watching">Atkārtoti skatities</string>
|
||||
<string name="play_movie_button">Palaist Filmu</string>
|
||||
<string name="play_trailer_button">Palaist Trelleri</string>
|
||||
|
@ -67,7 +66,6 @@
|
|||
<string name="action_remove_from_bookmarks">Noņemt</string>
|
||||
<string name="action_add_to_bookmarks">Ieliec skatīšanās statusu</string>
|
||||
<string name="sort_apply">Izmantot</string>
|
||||
<string name="sort_cancel">Atcelt</string>
|
||||
<string name="sort_copy">Kopēt</string>
|
||||
<string name="sort_save">Saglabāt</string>
|
||||
<string name="player_speed">Atskaņošanas ātrums</string>
|
||||
|
@ -192,6 +190,7 @@
|
|||
<string name="no_episodes_found">Epizodes netika atrastas</string>
|
||||
<string name="delete_file">Dzēsti faili</string>
|
||||
<string name="delete">Dzēst</string>
|
||||
<string name="cancel">Atcelt</string>
|
||||
<string name="pause">Pauzēt</string>
|
||||
<string name="start">Sākt</string>
|
||||
<string name="test_failed">Neizdevās</string>
|
||||
|
@ -483,7 +482,7 @@
|
|||
<string name="status_ongoing">Iet</string>
|
||||
<string name="free_storage">Bezmaksas</string>
|
||||
<string name="poster_ui_settings">Ieslēgt elementus uz plakātiem</string>
|
||||
<string name="default_subtitles">Parastais</string>
|
||||
<string name="action_default">Parastais</string>
|
||||
<string name="no_update_found">Nav atjauninājumi atrasti</string>
|
||||
<string name="video_buffer_clear_settings">Izdzēst video un bildes atkritne</string>
|
||||
<string name="watch_quality_pref_data">Izvēlētā skatīšanās kvalitāte (Mobilie Dati)</string>
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
<string name="type_completed">Завршени</string>
|
||||
<string name="type_dropped">Отфрлени</string>
|
||||
<string name="type_plan_to_watch">Планирани за гледање</string>
|
||||
<string name="type_none">Ништо одбрано</string>
|
||||
<string name="type_re_watching">Повторно гледање</string>
|
||||
<string name="play_movie_button">Пушти филм</string>
|
||||
<string name="play_torrent_button">Стримај торент</string>
|
||||
|
@ -58,7 +57,6 @@
|
|||
<string name="error_bookmarks_text">Обележувачи</string>
|
||||
<string name="action_remove_from_bookmarks">Отстрани</string>
|
||||
<string name="sort_apply">Активирај</string>
|
||||
<string name="sort_cancel">Откажи</string>
|
||||
<string name="player_speed">Брзина на плеер</string>
|
||||
<string name="subtitles_settings">Поставки за преводи</string>
|
||||
<string name="subs_text_color">Боја на текстот</string>
|
||||
|
@ -133,6 +131,7 @@
|
|||
<string name="episode_short">Е</string>
|
||||
<string name="delete_file">Избриши датотека</string>
|
||||
<string name="delete">Избриши</string>
|
||||
<string name="cancel">Откажи</string>
|
||||
<string name="pause">Паузирај</string>
|
||||
<string name="resume">Продолжи</string>
|
||||
<string name="delete_message">Ова трајно ќе го избрише %s
|
||||
|
@ -147,7 +146,7 @@
|
|||
<string name="synopsis">Крат</string>
|
||||
<string name="queued">во редица</string>
|
||||
<string name="no_subtitles">Нема преводи</string>
|
||||
<string name="default_subtitles">Стандардно</string>
|
||||
<string name="action_default">Стандардно</string>
|
||||
<string name="free_storage">Слободен простор</string>
|
||||
<string name="used_storage">Искористен простор</string>
|
||||
<string name="app_storage">Апликациски простор</string>
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
<string name="error_bookmarks_text">ബുക്മാർക്</string>
|
||||
<string name="action_remove_from_bookmarks">നീക്കം ചെയ്യുക</string>
|
||||
<string name="sort_apply">പ്രയോഗിക്കുക</string>
|
||||
<string name="sort_cancel">റദ്ദാക്കുക</string>
|
||||
<string name="player_speed">പ്ലേയർ വേഗത</string>
|
||||
<!-- <string name="subtitles_settings">Subtitle Settings</string>
|
||||
<string name="subs_text_color">Text Color</string>
|
||||
|
@ -121,6 +120,7 @@
|
|||
<string name="episodes">എപ്പിസോഡുകൾ</string>
|
||||
<string name="delete_file">ഫയൽ ഡിലീറ്റ് ചെയ്യുക</string>
|
||||
<string name="delete">ഡിലീറ്റ്</string>
|
||||
<string name="cancel">റദ്ദാക്കുക</string>
|
||||
<string name="pause">നിർത്തുക</string>
|
||||
<string name="resume">തുടരുക</string>
|
||||
<string name="delete_message">സ്ഥിരമായി %sനെ ഡിലീറ്റ് ചെയ്യുക
|
||||
|
@ -135,7 +135,7 @@
|
|||
<string name="synopsis">സംഗ്രഹം</string>
|
||||
<!-- <string name="queued">queued</string>
|
||||
<string name="no_subtitles">No Subtitles</string>
|
||||
<string name="default_subtitles">Default</string> -->
|
||||
<string name="action_default">Default</string> -->
|
||||
<string name="free_storage">ഒഴിവ്</string>
|
||||
<string name="used_storage">ഉപയോഗത്തിൽ</string>
|
||||
<string name="app_storage">ആപ്പ്</string>
|
||||
|
@ -197,7 +197,6 @@
|
|||
<string name="home_change_provider_img_des">ദാതാവിനെ മാറ്റുക</string>
|
||||
<string name="loading">ലോഡിംഗ്…</string>
|
||||
<string name="browser">ബ്രൗസർ</string>
|
||||
<string name="type_none">ഒന്നുമില്ല</string>
|
||||
<string name="type_re_watching">വീണ്ടും കാണുക</string>
|
||||
<string name="stream">സ്ട്രീം</string>
|
||||
</resources>
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
<string name="open_with">Buka dengan</string>
|
||||
<string name="popup_delete_file">Padam Fail</string>
|
||||
<string name="result_open_in_browser">Buka Dalam Pelayar</string>
|
||||
<string name="sort_cancel">Batal</string>
|
||||
<string name="no_data">Tiada Data</string>
|
||||
<string name="home_info">Info</string>
|
||||
<string name="sort_save">Simpan</string>
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
<string name="type_watching">ကြည့်နေသည်</string>
|
||||
<string name="type_completed">ကြည့်ပြီး</string>
|
||||
<string name="type_dropped">ကြည့်ခြင်းရပ်ထားသော</string>
|
||||
<string name="type_none">ဘာမျှ</string>
|
||||
<string name="error_loading_links_toast">လင့်များချိတ်ဆက်ရာတွင်အချို့အယွင်း</string>
|
||||
<string name="download_storage_text">ဖုန်း သိုလှောင်ရုံ</string>
|
||||
<string name="filter_bookmarks">စာမှတ်များ စစ်ထုတ်မှု</string>
|
||||
|
@ -127,8 +126,7 @@
|
|||
<string name="synopsis">အကျဥ်းချုပ်</string>
|
||||
<string name="queued">နောက်အစီအစဥ်</string>
|
||||
<string name="no_subtitles">စာတန်းထိုးမထည့်</string>
|
||||
<string name="default_subtitles">ပုံသေ</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="action_default">ပုံသေ</string>
|
||||
<string name="free_storage">ကျန်ရှိသော</string>
|
||||
<string name="app_storage">အက်ပ်</string>
|
||||
<string name="movies">ရုပ်ရှင်များ</string>
|
||||
|
@ -253,7 +251,6 @@
|
|||
<string name="subs_subtitle_languages">စာတန်းထိုး ဘာသာစကား</string>
|
||||
<string name="subs_import_text" formatted="true">ဒီမှာနေရာချခြင်းဖြင့်ဖောင့်များကိုသွင်းပါ %s</string>
|
||||
<string name="sort_apply">အတည်ပြု</string>
|
||||
<string name="sort_cancel">ပယ်ဖျက်ရန်</string>
|
||||
<string name="subtitles_settings">စာတန်းထိုး ပြုပြင်ခြင်း</string>
|
||||
<string name="subs_text_color">စာသား အရောင်</string>
|
||||
<string name="subs_outline_color">အနားကွပ် အရောင်</string>
|
||||
|
@ -301,6 +298,7 @@
|
|||
<string name="no_episodes_found">အပိုင်းများမတွေ့ပါ</string>
|
||||
<string name="delete_file">ဖိုင်ကိုဖျက်ရန်</string>
|
||||
<string name="delete">ဖျက်ရန်</string>
|
||||
<string name="cancel">ပယ်ဖျက်ရန်</string>
|
||||
<string name="pause">ရပ်ရန်</string>
|
||||
<string name="start">စရန်</string>
|
||||
<string name="test_failed">မအောင်မြင်ပါ</string>
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
<string name="type_completed">Voltooid</string>
|
||||
<string name="type_dropped">Dropped</string>
|
||||
<string name="type_plan_to_watch">Plan om te kijken</string>
|
||||
<string name="type_none">Geen</string>
|
||||
<string name="type_re_watching">Opnieuw kijken</string>
|
||||
<string name="play_movie_button">Film afspelen</string>
|
||||
<string name="play_livestream_button">Livestream afspelen</string>
|
||||
|
@ -82,7 +81,6 @@
|
|||
<string name="action_remove_from_bookmarks">Verwijder</string>
|
||||
<string name="action_add_to_bookmarks">Zet kijkstatus</string>
|
||||
<string name="sort_apply">Toepassen</string>
|
||||
<string name="sort_cancel">annuleer</string>
|
||||
<string name="sort_copy">Kopiëren</string>
|
||||
<string name="sort_close">Sluit</string>
|
||||
<string name="sort_clear">Wissen</string>
|
||||
|
@ -186,6 +184,7 @@
|
|||
<string name="no_episodes_found">Geen afleveringen gevonden</string>
|
||||
<string name="delete_file">Verwijder bestand</string>
|
||||
<string name="delete">Verwijder</string>
|
||||
<string name="cancel">annuleer</string>
|
||||
<string name="pause">Pauze</string>
|
||||
<string name="resume">Hervatten</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -204,7 +203,7 @@
|
|||
<string name="synopsis">Korte inhoud</string>
|
||||
<string name="queued">wachtrij</string>
|
||||
<string name="no_subtitles">Geen ondertiteling</string>
|
||||
<string name="default_subtitles">Standaard</string>
|
||||
<string name="action_default">Standaard</string>
|
||||
<string name="free_storage">Vrij</string>
|
||||
<string name="used_storage">Gebruikt</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -573,6 +572,5 @@
|
|||
<string name="automatic_plugin_download_mode_title">Selecteer een modus om het downloaden van plug-ins te filteren</string>
|
||||
<string name="disable">Uitzetten</string>
|
||||
<string name="unable_to_inflate">De gebruikersinterface kon niet correct worden gemaakt, dit is een ERNSTIG PROBLEEM en moet onmiddellijk gerapporteerd worden %s</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="already_voted">Je hebt al gestemd</string>
|
||||
</resources>
|
||||
|
|
|
@ -63,7 +63,6 @@
|
|||
<string name="action_remove_from_bookmarks">Fjern</string>
|
||||
<string name="action_add_to_bookmarks">Sett visingstatus</string>
|
||||
<string name="sort_apply">Bruk</string>
|
||||
<string name="sort_cancel">Avbryt</string>
|
||||
<string name="sort_copy">Kopier</string>
|
||||
<string name="sort_clear">Tøm</string>
|
||||
<string name="sort_save">Lagre</string>
|
||||
|
@ -113,6 +112,7 @@
|
|||
<string name="no_episodes_found">Ingen episodar blei funnen</string>
|
||||
<string name="delete_file">Slett fil</string>
|
||||
<string name="delete">Slett</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="pause">Pause</string>
|
||||
<string name="resume">Gjenoppta</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -129,7 +129,7 @@
|
|||
<string name="synopsis">Om</string>
|
||||
<string name="queued">i kø</string>
|
||||
<string name="no_subtitles">Ingen undertekstar</string>
|
||||
<string name="default_subtitles">Standard</string>
|
||||
<string name="action_default">Standard</string>
|
||||
<string name="used_storage">Brukt</string>
|
||||
<string name="app_storage">Program</string>
|
||||
<string name="movies">Filmar</string>
|
||||
|
@ -166,7 +166,6 @@
|
|||
<string name="go_back_img_des">Gå tilbake</string>
|
||||
<string name="result_tags">Sjangrar</string>
|
||||
<string name="result_share">Dele</string>
|
||||
<string name="type_none">Ingen</string>
|
||||
<string name="type_re_watching">Ser om igjen</string>
|
||||
<string name="update_started">Oppdatering starta</string>
|
||||
<string name="popup_resume_download">Fortsett nedlasting</string>
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
<string name="type_completed">Fullført</string>
|
||||
<string name="type_dropped">Falt</string>
|
||||
<string name="type_plan_to_watch">Planlegg å se</string>
|
||||
<string name="type_none">Ingen</string>
|
||||
<string name="play_movie_button">Spill filmer</string>
|
||||
<string name="play_torrent_button">Strøm Torrent</string>
|
||||
<string name="pick_source">Kilder</string>
|
||||
|
@ -67,7 +66,6 @@
|
|||
<string name="error_bookmarks_text">Bokmerker</string>
|
||||
<string name="action_remove_from_bookmarks">Ta bort</string>
|
||||
<string name="sort_apply">Søke om</string>
|
||||
<string name="sort_cancel">Avbryt</string>
|
||||
<string name="player_speed">Spillerhastighet</string>
|
||||
<string name="subtitles_settings">Innstillinger for teksting</string>
|
||||
<string name="subs_text_color">Tekstfarge</string>
|
||||
|
@ -141,6 +139,7 @@
|
|||
<string name="episode_short">E</string>
|
||||
<string name="delete_file">Slett fil</string>
|
||||
<string name="delete">Slett</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="pause">Stopp</string>
|
||||
<string name="resume">Gjenoppta</string>
|
||||
<string name="delete_message">Dette vil slette %s
|
||||
|
@ -155,7 +154,7 @@
|
|||
<string name="synopsis">Om</string>
|
||||
<string name="queued">I kø</string>
|
||||
<string name="no_subtitles">Ingen undertekster</string>
|
||||
<string name="default_subtitles">Misligholde</string>
|
||||
<string name="action_default">Misligholde</string>
|
||||
<string name="free_storage">Tilgjengelig</string>
|
||||
<string name="used_storage">Brukt</string>
|
||||
<string name="app_storage">applikasjon</string>
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
<string name="player_speed_text_format" formatted="true">ଵେଗ (%.2fଗୁଣ)</string>
|
||||
<string name="type_dropped">ତ୍ୟାଗିଛନ୍ତି</string>
|
||||
<string name="type_plan_to_watch">ଦେଖିବା ପାଇଁ ଇଚ୍ଛୁକ</string>
|
||||
<string name="type_none">କିଛି ନାହିଁ</string>
|
||||
<string name="home_more_info">ଅଧିକ ସୂଚନା</string>
|
||||
<string name="cast_format" formatted="true">ପାତ୍ର: %s</string>
|
||||
<string name="result_poster_img_des">ପୋଷ୍ଟର୍</string>
|
||||
|
@ -42,7 +41,7 @@
|
|||
<string name="episode_short">ଅ</string>
|
||||
<string name="episode_poster_img_des">ଅଧ୍ୟାୟର ପୋଷ୍ଟର୍</string>
|
||||
<string name="home_main_poster_img_des">ମୁଖ୍ୟ ପୋଷ୍ଟର୍</string>
|
||||
<string name="default_subtitles">ଡିଫଲ୍ଟ</string>
|
||||
<string name="action_default">ଡିଫଲ୍ଟ</string>
|
||||
<string name="extension_language">ଭାଷା</string>
|
||||
<string name="no">ନାହିଁ</string>
|
||||
<string name="extension_description">ଵର୍ଣ୍ଣନା</string>
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
<string name="type_completed">Zakończone</string>
|
||||
<string name="type_dropped">Porzucone</string>
|
||||
<string name="type_plan_to_watch">Planowane</string>
|
||||
<string name="type_none">Brak</string>
|
||||
<string name="type_re_watching">Ponowne oglądanie</string>
|
||||
<string name="play_movie_button">Odtwórz film</string>
|
||||
<string name="play_livestream_button">Odtwórz transmisję na żywo</string>
|
||||
|
@ -72,7 +71,6 @@
|
|||
<string name="action_remove_from_bookmarks">Usuń</string>
|
||||
<string name="action_add_to_bookmarks">Ustaw status oglądania</string>
|
||||
<string name="sort_apply">Zastosuj</string>
|
||||
<string name="sort_cancel">Anuluj</string>
|
||||
<string name="sort_copy">Kopiuj</string>
|
||||
<string name="sort_close">Zamknij</string>
|
||||
<string name="sort_clear">Wyczyść</string>
|
||||
|
@ -181,6 +179,7 @@
|
|||
<string name="no_episodes_found">Nie znaleziono odcinków</string>
|
||||
<string name="delete_file">Usuń plik</string>
|
||||
<string name="delete">Usuń</string>
|
||||
<string name="cancel">Anuluj</string>
|
||||
<string name="pause">Wstrzymaj</string>
|
||||
<string name="resume">Odtwórz</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -199,7 +198,7 @@
|
|||
<string name="synopsis">Streszczenie</string>
|
||||
<string name="queued">W kolejce</string>
|
||||
<string name="no_subtitles">Brak napisów</string>
|
||||
<string name="default_subtitles">Domyślne</string>
|
||||
<string name="action_default">Domyślne</string>
|
||||
<string name="free_storage">Wolne</string>
|
||||
<string name="used_storage">W użyciu</string>
|
||||
<string name="app_storage">Aplikacja</string>
|
||||
|
@ -552,7 +551,6 @@
|
|||
<string name="unable_to_inflate">Nie można było poprawnie utworzyć interfejsu użytkownika, jest to POWAŻNY BŁĄD i należy go natychmiast zgłosić %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Wybierz tryb filtrowania pobieranych rozszerzeń</string>
|
||||
<string name="disable">Wyłączać</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="no_plugins_found_error">Nie znaleziono żadnych wtyczek w repozytorium</string>
|
||||
<string name="already_voted">Już oddano głos</string>
|
||||
<string name="no_repository_found_error">Nie znaleziono tego repozytorium, sprawdź adres URL lub spróbuj połączyć się przez VPN</string>
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
<string name="type_completed">Concluído</string>
|
||||
<string name="type_dropped">Desistido</string>
|
||||
<string name="type_plan_to_watch">Pretendo assistir</string>
|
||||
<string name="type_none">Nenhum</string>
|
||||
<string name="type_re_watching">Reassistindo</string>
|
||||
<string name="play_movie_button">Reproduzir filme</string>
|
||||
<string name="play_livestream_button">Reproduzir transmissão ao vivo</string>
|
||||
|
@ -78,7 +77,6 @@
|
|||
<string name="error_bookmarks_text">Marcadores</string>
|
||||
<string name="action_remove_from_bookmarks">Remover</string>
|
||||
<string name="sort_apply">Aplicar</string>
|
||||
<string name="sort_cancel">Cancelar</string>
|
||||
<string name="sort_copy">Copiar</string>
|
||||
<string name="sort_close">Fechar</string>
|
||||
<string name="sort_clear">Limpar</string>
|
||||
|
@ -182,6 +180,7 @@
|
|||
<string name="no_episodes_found">Nenhum Episódio encontrado</string>
|
||||
<string name="delete_file">Eliminar Ficheiro</string>
|
||||
<string name="delete">Eliminar</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="pause">Pôr em Pausa</string>
|
||||
<string name="resume">Retomar</string>
|
||||
<string name="delete_message" formatted="true">Isto apagará %s permanentemente
|
||||
|
@ -198,7 +197,7 @@
|
|||
<string name="synopsis">Sinopse</string>
|
||||
<string name="queued">Na fila</string>
|
||||
<string name="no_subtitles">Sem Legendas</string>
|
||||
<string name="default_subtitles">Padrão</string>
|
||||
<string name="action_default">Padrão</string>
|
||||
<string name="free_storage">Livre</string>
|
||||
<string name="used_storage">Usado</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -548,7 +547,6 @@
|
|||
\nNOTA: Se a soma for 10 ou mais, o leitor saltará automaticamente o carregamento quando essa ligação for carregada!</string>
|
||||
<string name="automatic_plugin_download_mode_title">Selecionar o modo para filtrar a transferência de plug-ins</string>
|
||||
<string name="unable_to_inflate">Não foi possível criar corretamente a interface do utilizador, trata-se de um GRANDE BUG e deve ser comunicado imediatamente %s</string>
|
||||
<string name="default_account">\@ string/legendas_padrão</string>
|
||||
<string name="disable">Desativar</string>
|
||||
<string name="no_plugins_found_error">Não foram encontrados plugins no repositório</string>
|
||||
<string name="no_repository_found_error">Repositório não encontrado, verifique o URL e tente a VPN</string>
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
<string name="type_completed">ahhahooo</string>
|
||||
<string name="type_dropped">ooooo haa</string>
|
||||
<string name="type_plan_to_watch">aaahhuoh</string>
|
||||
<string name="type_none">aaaghh</string>
|
||||
<string name="play_movie_button">aaaaa aaaghh</string>
|
||||
<string name="play_torrent_button">aaaghhaaahhu aaaaa</string>
|
||||
<string name="pick_source">oha aauuh</string>
|
||||
|
@ -51,7 +50,6 @@
|
|||
<string name="error_bookmarks_text">oouuh ooh</string>
|
||||
<string name="action_remove_from_bookmarks">aauuh ooh</string>
|
||||
<string name="sort_apply">oouuhaooo-ahah</string>
|
||||
<string name="sort_cancel">oooohh</string>
|
||||
<string name="player_speed">oouuh aauuh oha</string>
|
||||
<string name="subtitles_settings">ouuhhhooooooh ooo-ahah</string>
|
||||
<string name="subs_text_color">ohaouuhhh</string>
|
||||
|
@ -122,6 +120,7 @@
|
|||
<string name="episode_short">A</string>
|
||||
<string name="delete_file">ooha ohahaaahoooa ahahooo</string>
|
||||
<string name="delete">oooooah</string>
|
||||
<string name="cancel">oooohh</string>
|
||||
<string name="delete_message">aahhaaaaaahooo aauuh aaahhuaooo-ahahoooohh aoouuhoohoohooo-ahah %s</string>
|
||||
<string name="status_ongoing">aaaghhaaaaa</string>
|
||||
<string name="status_completed">aauuhaauuh</string>
|
||||
|
@ -133,7 +132,7 @@
|
|||
<string name="synopsis">aauugghh ohaaauugghh</string>
|
||||
<string name="queued">haaouuhhh</string>
|
||||
<string name="no_subtitles">ahaaaaaaaaaahaaaauugghh</string>
|
||||
<string name="default_subtitles">ahooooh</string>
|
||||
<string name="action_default">ahooooh</string>
|
||||
<string name="free_storage">ooo-ahahaaaaa</string>
|
||||
<string name="used_storage">ahhahhh</string>
|
||||
<string name="app_storage">aauugghh</string>
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
<string name="type_completed">Finalizat</string>
|
||||
<string name="type_dropped">Renunțat</string>
|
||||
<string name="type_plan_to_watch">Planificare pentru a urmări</string>
|
||||
<string name="type_none">Anuleaza</string>
|
||||
<string name="type_re_watching">Reurmat</string>
|
||||
<string name="play_movie_button">Urmărește</string>
|
||||
<string name="play_torrent_button">Stream Torrent</string>
|
||||
|
@ -79,7 +78,6 @@
|
|||
<string name="action_remove_from_bookmarks">Eliminează</string>
|
||||
<string name="action_add_to_bookmarks">Adaugă</string>
|
||||
<string name="sort_apply">Aplică</string>
|
||||
<string name="sort_cancel">Anulează</string>
|
||||
<string name="sort_copy">Copiază</string>
|
||||
<string name="sort_close">Închide</string>
|
||||
<string name="sort_clear">Elimină</string>
|
||||
|
@ -181,6 +179,7 @@
|
|||
<string name="no_episodes_found">Nu s-au găsit episoade</string>
|
||||
<string name="delete_file">Ștergeți fișierul</string>
|
||||
<string name="delete">Ștergeți</string>
|
||||
<string name="cancel">Anulează</string>
|
||||
<string name="pause">Pauză</string>
|
||||
<string name="resume">Continuă</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -199,7 +198,7 @@
|
|||
<string name="synopsis">Rezumat</string>
|
||||
<string name="queued">În coada de așteptare</string>
|
||||
<string name="no_subtitles">Nu există subtitrare</string>
|
||||
<string name="default_subtitles">Implicit</string>
|
||||
<string name="action_default">Implicit</string>
|
||||
<string name="free_storage">Liber</string>
|
||||
<string name="used_storage">Folosit</string>
|
||||
<string name="app_storage">Aplicație</string>
|
||||
|
@ -569,6 +568,5 @@
|
|||
<string name="use">Utilizați</string>
|
||||
<string name="unable_to_inflate">UI nu a putut fi creată corect, acesta este un BUG MAJOR și trebuie raportat imediat %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Selectați modul de filtrare a descărcării plugin-urilor</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="already_voted">Ați votat deja</string>
|
||||
</resources>
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
<string name="download_failed">Скачать неудачный</string>
|
||||
<string name="resize_fit">Подогнать</string>
|
||||
<string name="delete">Удалить</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="all">Все</string>
|
||||
<string name="pause">Пауза</string>
|
||||
<string name="cast_format" formatted="true">Актёрский состав: %s</string>
|
||||
|
@ -58,7 +59,6 @@
|
|||
<string name="type_completed">Завершено</string>
|
||||
<string name="type_dropped">Брошенный</string>
|
||||
<string name="type_plan_to_watch">План посмотреть</string>
|
||||
<string name="type_none">Нет</string>
|
||||
<string name="type_re_watching">Пересмотрю</string>
|
||||
<string name="play_movie_button">Смотреть фильм</string>
|
||||
<string name="play_trailer_button">Смотреть трейлер</string>
|
||||
|
@ -82,7 +82,6 @@
|
|||
<string name="filter_bookmarks">Фильтр закладки</string>
|
||||
<string name="error_bookmarks_text">Закладки</string>
|
||||
<string name="sort_apply">Применить</string>
|
||||
<string name="sort_cancel">Отмена</string>
|
||||
<string name="sort_copy">Копия</string>
|
||||
<string name="sort_close">Закрыть</string>
|
||||
<string name="sort_clear">Очистить</string>
|
||||
|
@ -186,7 +185,7 @@
|
|||
<string name="rating">Рейтинг</string>
|
||||
<string name="duration">Продолжительность</string>
|
||||
<string name="no_subtitles">Нет субтитров</string>
|
||||
<string name="default_subtitles">По умолчанию</string>
|
||||
<string name="action_default">По умолчанию</string>
|
||||
<string name="app_storage">Приложение</string>
|
||||
<string name="anime">Аниме</string>
|
||||
<string name="torrent">Торренты</string>
|
||||
|
@ -535,7 +534,6 @@
|
|||
<string name="edit">Изменить</string>
|
||||
<string name="wifi">Интернет</string>
|
||||
<string name="profile_background_des">Задний фон профиля</string>
|
||||
<string name="default_account">\@строка/обычные_субтитры</string>
|
||||
<string name="help">Помощь</string>
|
||||
<string name="profile_number">Профиль %d</string>
|
||||
<string name="automatic_plugin_download_mode_title">Выберите режим фильтера плагинов для загрузки</string>
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
<string name="search_hint">Hľadať…</string>
|
||||
<string name="title_downloads">Sťahovanie</string>
|
||||
<string name="no_data">Žiadne dáta</string>
|
||||
<string name="sort_cancel">Zrušiť</string>
|
||||
<string name="sort_copy">Kopírovať</string>
|
||||
<string name="sort_close">Zavrieť</string>
|
||||
<string name="sort_save">Uložiť</string>
|
||||
|
@ -60,7 +59,6 @@
|
|||
<string name="download_canceled">Sťahovanie zrušené</string>
|
||||
<string name="app_dubbed_text">Dab</string>
|
||||
<string name="popup_delete_file">Zmazať súbor</string>
|
||||
<string name="type_none">Žiadny</string>
|
||||
<string name="app_subbed_text">Tit</string>
|
||||
<string name="type_re_watching">Opätovné sledovanie</string>
|
||||
<string name="popup_play_file">Prehrať súbor</string>
|
||||
|
@ -265,7 +263,7 @@
|
|||
<string name="preferred_media_settings">Preferované médiá</string>
|
||||
<string name="nginx_url_pref">URL servera NGINX</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="default_subtitles">Predvolené</string>
|
||||
<string name="action_default">Predvolené</string>
|
||||
<string name="add_sync">Pridať sledovanie</string>
|
||||
<string name="no_season">Žiadna sezóna</string>
|
||||
<string name="episode">Epizóda</string>
|
||||
|
@ -293,6 +291,7 @@
|
|||
<string name="year">Rok</string>
|
||||
<string name="resize_fit">Prispôsobiť obrazovke</string>
|
||||
<string name="delete">Zmazať</string>
|
||||
<string name="cancel">Zrušiť</string>
|
||||
<string name="used_storage">Využité</string>
|
||||
<string name="show_hd">Štítok kvality</string>
|
||||
<string name="android_tv_interface_off_seek_settings">Prehrávač skrytý - dĺžka pretočenia</string>
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
<string name="download_failed">Dejintii ma guulaysan</string>
|
||||
<string name="search">Raadi</string>
|
||||
<string name="delete">Tirtir</string>
|
||||
<string name="cancel">Jooji</string>
|
||||
<string name="pause">Haki</string>
|
||||
<string name="queued">Horran</string>
|
||||
<string name="resize_fit">Le-ekaysii shaashadda</string>
|
||||
|
@ -46,7 +47,6 @@
|
|||
<string name="type_completed">Dhamaystirmay</string>
|
||||
<string name="type_dropped">Soo dhacay</string>
|
||||
<string name="type_plan_to_watch">Ku talo jira</string>
|
||||
<string name="type_none">Midna</string>
|
||||
<string name="play_movie_button">Daaro filinka</string>
|
||||
<string name="play_trailer_button">Daar goos-gooska</string>
|
||||
<string name="subs_window_color">Midabka daaqadda</string>
|
||||
|
@ -56,7 +56,6 @@
|
|||
<string name="play_torrent_button">Daalaco toorentiga</string>
|
||||
<string name="pick_subtitle">Qrl-hoosaadka</string>
|
||||
<string name="popup_resume_download">Dib u bilow dejinta</string>
|
||||
<string name="sort_cancel">Jooji</string>
|
||||
<string name="subs_background_color">Midabka dambeedka</string>
|
||||
<string name="pick_source">Xigashooyinka</string>
|
||||
<string name="reload_error">Dib u xidhiidhinaya…</string>
|
||||
|
@ -202,7 +201,7 @@
|
|||
<string name="duration">Muddada</string>
|
||||
<string name="used_storage">La isticmaalay</string>
|
||||
<string name="no_subtitles">Qrl-hoosaad ma leh</string>
|
||||
<string name="default_subtitles">Sidiisaa</string>
|
||||
<string name="action_default">Sidiisaa</string>
|
||||
<string name="free_storage">Bilaash</string>
|
||||
<string name="app_storage">Appka</string>
|
||||
<string name="cartoons_singular">Kartoob</string>
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
<string name="type_completed">Avslutad</string>
|
||||
<string name="type_dropped">Dropped</string>
|
||||
<string name="type_plan_to_watch">Plannerad</string>
|
||||
<string name="type_none">Ingen</string>
|
||||
<string name="play_movie_button">Spela Upp</string>
|
||||
<string name="play_torrent_button">Strömma Torrent</string>
|
||||
<string name="pick_source">Källor</string>
|
||||
|
@ -53,7 +52,6 @@
|
|||
<string name="error_bookmarks_text">Bokmärken</string>
|
||||
<string name="action_remove_from_bookmarks">Ta bort</string>
|
||||
<string name="sort_apply">Tillämpa</string>
|
||||
<string name="sort_cancel">Avbryt</string>
|
||||
<string name="player_speed">Spelarhastighet</string>
|
||||
<string name="subtitles_settings">Undertextinställningar</string>
|
||||
<string name="subs_text_color">Textfärg</string>
|
||||
|
@ -125,6 +123,7 @@
|
|||
<string name="episode_short">A</string>
|
||||
<string name="delete_file">Ta bort nerladdad fil</string>
|
||||
<string name="delete">Ta bort</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="delete_message">%s kommer att raderas permanent
|
||||
\nÄr du helt säker\?</string>
|
||||
<string name="status_ongoing">Pågående</string>
|
||||
|
@ -137,7 +136,7 @@
|
|||
<string name="synopsis">Sammanfattning</string>
|
||||
<string name="queued">på kö</string>
|
||||
<string name="no_subtitles">Inga undertexter</string>
|
||||
<string name="default_subtitles">Standard</string>
|
||||
<string name="action_default">Standard</string>
|
||||
<string name="free_storage">Tillgängligt</string>
|
||||
<string name="used_storage">Använtt</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
<string name="home_more_info">மேலும் தகவல்கள்</string>
|
||||
<string name="home_expanded_hide">மறை</string>
|
||||
<string name="action_remove_from_bookmarks">நீக்கு</string>
|
||||
<string name="sort_cancel">ரத்து செய்க</string>
|
||||
<string name="sort_clear">நீக்கு</string>
|
||||
<string name="sort_save">சேமிக்கவும்</string>
|
||||
<string name="subs_text_color">உரை வண்ணம்</string>
|
||||
|
@ -63,7 +62,6 @@
|
|||
<string name="cast_format" formatted="true">நடிகர்கள்: %s</string>
|
||||
<string name="go_back_img_des">பின் செல்</string>
|
||||
<string name="title_settings">அமைப்புகள்</string>
|
||||
<string name="type_none">ஏதும் இல்லை</string>
|
||||
<string name="loading">ஏற்றுகிறது…</string>
|
||||
<string name="type_dropped">கைவிடப்பட்டது</string>
|
||||
<string name="download_done">பதிவிறக்கம் முடிந்தது</string>
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
<string name="type_completed">Tapos nang panoorin</string>
|
||||
<string name="type_dropped">Ayaw nang panoorin</string>
|
||||
<string name="type_plan_to_watch">Balak panoorin</string>
|
||||
<string name="type_none">None</string>
|
||||
<string name="play_movie_button">I-play ang Movie</string>
|
||||
<string name="play_torrent_button">Stream Torrent</string>
|
||||
<string name="pick_source">Sources</string>
|
||||
|
@ -70,7 +69,6 @@
|
|||
<string name="error_bookmarks_text">Bookmark</string>
|
||||
<string name="action_remove_from_bookmarks">Tanggalin</string>
|
||||
<string name="sort_apply">Kumpirmahin</string>
|
||||
<string name="sort_cancel">Kanselahin</string>
|
||||
<string name="player_speed">Bilis ng Playback</string>
|
||||
<string name="subtitles_settings">Subtitle Setting</string>
|
||||
<string name="subs_text_color">Kulay ng Teksto</string>
|
||||
|
@ -144,6 +142,7 @@
|
|||
<string name="episode_short">E</string>
|
||||
<string name="delete_file">Burahin ang file</string>
|
||||
<string name="delete">Tanggalin</string>
|
||||
<string name="cancel">Kanselahin</string>
|
||||
<string name="pause">I-pause</string>
|
||||
<string name="resume">I-resume</string>
|
||||
<string name="delete_message">This will permanently delete %s
|
||||
|
@ -158,7 +157,7 @@
|
|||
<string name="synopsis">Sinopsis</string>
|
||||
<string name="queued">nakapila</string>
|
||||
<string name="no_subtitles">walang subtitles</string>
|
||||
<string name="default_subtitles">Default</string>
|
||||
<string name="action_default">Default</string>
|
||||
<string name="free_storage">Bakante</string>
|
||||
<string name="used_storage">Gamit</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
<string name="type_completed">Tamamlandı</string>
|
||||
<string name="type_dropped">Bırakıldı</string>
|
||||
<string name="type_plan_to_watch">Planlandı</string>
|
||||
<string name="type_none">Hiçbiri</string>
|
||||
<string name="type_re_watching">Yeniden izleniyor</string>
|
||||
<string name="play_movie_button">Filmi oynat</string>
|
||||
<string name="play_livestream_button">Canlı yayını oynat</string>
|
||||
|
@ -96,7 +95,6 @@
|
|||
<string name="action_remove_from_bookmarks">Kaldır</string>
|
||||
<string name="action_add_to_bookmarks">İzleme durumunu ayarla</string>
|
||||
<string name="sort_apply">Uygula</string>
|
||||
<string name="sort_cancel">İptal et</string>
|
||||
<string name="sort_copy">Kopyala</string>
|
||||
<string name="sort_close">Kapat</string>
|
||||
<string name="sort_clear">Temizle</string>
|
||||
|
@ -205,7 +203,7 @@
|
|||
<string name="no_episodes_found">Bölüm bulunamadı</string>
|
||||
<string name="delete_file">Dosyayı sil</string>
|
||||
<string name="delete">Sil</string>
|
||||
<string name="cancel" translatable="false">@string/sort_cancel</string>
|
||||
<string name="cancel">İptal et</string>
|
||||
<string name="pause">Durdur</string>
|
||||
<string name="resume">Sürdür</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -224,7 +222,7 @@
|
|||
<string name="synopsis">Özet</string>
|
||||
<string name="queued">Sıraya alındı</string>
|
||||
<string name="no_subtitles">Alt yazı yok</string>
|
||||
<string name="default_subtitles">Varsayılan</string>
|
||||
<string name="action_default">Varsayılan</string>
|
||||
<string name="free_storage">Boş</string>
|
||||
<string name="used_storage">Kullanılan</string>
|
||||
<string name="app_storage">Uygulama</string>
|
||||
|
|
|
@ -9,16 +9,16 @@
|
|||
<string name="cast_format" formatted="true">Актори: %s</string>
|
||||
<string name="next_episode_format" formatted="true">Епізод %d вийде через</string>
|
||||
<string name="result_poster_img_des">Poster</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%s Еп. %d</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%dд %dгод %dхв</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%dгод %dхв</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Еп. %2$d</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%1$dд %2$dгод %3$dхв</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%1$dгод %2$dхв</string>
|
||||
<string name="next_episode_time_min_format" formatted="true">%dхв</string>
|
||||
<string name="home_main_poster_img_des">Головний постер</string>
|
||||
<string name="home_next_random_img_des">Наступний випадковий</string>
|
||||
<string name="preview_background_img_des">Попередній перегляд фону</string>
|
||||
<string name="player_speed_text_format" formatted="true">Швидкість (%.2fx)</string>
|
||||
<string name="new_update_format" formatted="true">Знайдено нове оновлення!
|
||||
\n%s –> %s</string>
|
||||
\n%1$s –> %2$s</string>
|
||||
<string name="title_search">Пошук</string>
|
||||
<string name="title_downloads">Завантаження</string>
|
||||
<string name="duration_format" formatted="true">%d хв</string>
|
||||
|
@ -112,8 +112,6 @@
|
|||
<string name="popup_play_file">Переглянути файл</string>
|
||||
<string name="home_more_info">Детальніше</string>
|
||||
<string name="filter_bookmarks">Фільтр закладок</string>
|
||||
<string name="type_none">Нічого</string>
|
||||
<string name="sort_cancel">Скасувати</string>
|
||||
<string name="sort_clear">Очистити</string>
|
||||
<string name="subtitles_settings">Налаштування субтитрів</string>
|
||||
<string name="subs_background_color">Колір фону</string>
|
||||
|
@ -169,11 +167,12 @@
|
|||
<string name="subs_default_reset_toast">Скинути до значення за замовчуванням</string>
|
||||
<string name="no_season">Немає сезону</string>
|
||||
<string name="episodes">епізодів</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="episode_format" formatted="true">%1$d %2$s</string>
|
||||
<string name="season_short">С</string>
|
||||
<string name="episode_short">Е</string>
|
||||
<string name="delete_file">Видалити файл</string>
|
||||
<string name="delete">Видалити</string>
|
||||
<string name="cancel">Скасувати</string>
|
||||
<string name="resume">Відновити</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
<string name="delete_message" formatted="true">Це назавжди видалить %s
|
||||
|
@ -186,7 +185,7 @@
|
|||
<string name="duration">Тривалість</string>
|
||||
<string name="queued">у черзі</string>
|
||||
<string name="no_subtitles">Без субтитрів</string>
|
||||
<string name="default_subtitles">За замовчуванням</string>
|
||||
<string name="action_default">За замовчуванням</string>
|
||||
<string name="free_storage">Вільно</string>
|
||||
<string name="used_storage">Зайнято</string>
|
||||
<string name="app_storage">Застосунок</string>
|
||||
|
@ -239,9 +238,9 @@
|
|||
<string name="year">Рік</string>
|
||||
<string name="go_forward_30">+30</string>
|
||||
<string name="acra_report_toast">Вибачте, у застосунку стався збій. Анонімне повідомлення про помилку буде відправлено розробникам</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="season_format">%1$s %2$d%3$s</string>
|
||||
<string name="episode">Епізод</string>
|
||||
<string name="episodes_range">%d-%d</string>
|
||||
<string name="episodes_range">%1$d-%2$d</string>
|
||||
<string name="no_episodes_found">Епізодів не знайдено</string>
|
||||
<string name="pause">Пауза</string>
|
||||
<string name="season">Сезон</string>
|
||||
|
@ -365,7 +364,7 @@
|
|||
<string name="category_ui">Макет</string>
|
||||
<string name="category_providers">Постачальники</string>
|
||||
<string name="example_site_url">example.com</string>
|
||||
<string name="login_format" formatted="true">%s %s</string>
|
||||
<string name="login_format" formatted="true">%2$s %1$s</string>
|
||||
<string name="subtitles_depressed">Депресивний</string>
|
||||
<string name="account">обліковий запис</string>
|
||||
<string name="create_account">Створити</string>
|
||||
|
@ -415,8 +414,8 @@
|
|||
<string name="plugin_loaded">Плагін завантажено</string>
|
||||
<string name="plugin_downloaded">Плагін завантажено</string>
|
||||
<string name="plugin_load_fail" formatted="true">Не вдалося завантажити %s</string>
|
||||
<string name="batch_download_start_format" formatted="true">Почалося завантаження %d %s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Завантажено %d %s</string>
|
||||
<string name="batch_download_start_format" formatted="true">Почалося завантаження %1$d %2$s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Завантажено %1$d %2$s</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">Всі %s вже завантажено</string>
|
||||
<string name="batch_download">Завантажити пакети</string>
|
||||
<string name="plugin_singular">плагін</string>
|
||||
|
@ -500,7 +499,7 @@
|
|||
<string name="empty_library_no_accounts_message">Ваша бібліотека порожня :(
|
||||
\nУвійдіть в обліковий запис бібліотеки або додайте фільми до вашої локальної бібліотеки.</string>
|
||||
<string name="sort_alphabetical_z">Алфавітом (від Я до А)</string>
|
||||
<string name="select_library">Виберіть бібліотеку</string>
|
||||
<string name="select_library">Оберіть бібліотеку</string>
|
||||
<string name="open_with">Відкрити</string>
|
||||
<string name="browser">Браузер</string>
|
||||
<string name="empty_library_logged_in_message">Цей список порожній. Спробуйте перейти до іншого.</string>
|
||||
|
@ -547,11 +546,36 @@
|
|||
<string name="qualities">Якості</string>
|
||||
<string name="profile_background_des">Фон профілю</string>
|
||||
<string name="unable_to_inflate">Не вдалося створити UI коректно, це ВАЖЛИВА ПОМИЛКА, про яку слід негайно повідомити %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Виберіть режим для фільтрації завантаження плагінів</string>
|
||||
<string name="automatic_plugin_download_mode_title">Оберіть режим для фільтрації завантаження плагінів</string>
|
||||
<string name="disable">Вимкнути</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="no_repository_found_error">Репозиторій не знайдено, перевірте URL-адресу та спробуйте VPN</string>
|
||||
<string name="no_plugins_found_error">Не знайдено жодних плагінів у репозиторії</string>
|
||||
<string name="already_voted">Ви вже проголосували</string>
|
||||
<string name="backup_frequency">Частота резервного копіювання</string>
|
||||
<string name="favorite_removed">%s вилучено з обраного</string>
|
||||
<string name="favorites_list_name">Обране</string>
|
||||
<string name="favorite_added">%s додано до обраного</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">У вашій бібліотеці знайдено потенційні дублікати:
|
||||
\n
|
||||
\n%s
|
||||
\n
|
||||
\nВсе одно хочете додати цей елемент, замінити наявні чи скасувати дію\?</string>
|
||||
<string name="duplicate_title">Знайдено потенційний дублікат</string>
|
||||
<string name="lock_profile">Розблокувати профіль</string>
|
||||
<string name="action_add_to_favorites">Додати до обраного</string>
|
||||
<string name="duplicate_replace_all">Замінити усе</string>
|
||||
<string name="pin_error_incorrect">Неправильний PIN-код. Спробуйте ще раз.</string>
|
||||
<string name="action_unsubscribe">Відписатись</string>
|
||||
<string name="pin_error_length">PIN-код повинен складатися з 4 символів</string>
|
||||
<string name="duplicate_replace">Замінити</string>
|
||||
<string name="duplicate_add">Додати</string>
|
||||
<string name="action_subscribe">Підписатись</string>
|
||||
<string name="action_remove_from_favorites">Вилучити з обраного</string>
|
||||
<string name="select_an_account">Оберіть обліковий запис</string>
|
||||
<string name="duplicate_message_single">Виявилося, що у вашій бібліотеці вже є потенційно повторюваний елемент: \'%1$s.\'
|
||||
\n
|
||||
\nВсе одно хочете додати цей елемент, замінити наявний чи скасувати дію\?</string>
|
||||
<string name="enter_pin">Введіть PIN-код</string>
|
||||
<string name="pin">PIN-код</string>
|
||||
<string name="enter_current_pin">Введіть поточний PIN-код</string>
|
||||
</resources>
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
<string name="type_on_hold">معطل</string>
|
||||
<string name="type_dropped">چھوڑ دیا گیا</string>
|
||||
<string name="type_plan_to_watch">دیکھنے کا منصوبہ</string>
|
||||
<string name="type_none">کوئی نہیں</string>
|
||||
<string name="type_re_watching">دوبارہ دیکھنا</string>
|
||||
<string name="play_movie_button">مووی لگائے</string>
|
||||
<string name="play_trailer_button">ٹریلر چلائیں</string>
|
||||
|
@ -67,7 +66,6 @@
|
|||
<string name="action_remove_from_bookmarks">ریمو</string>
|
||||
<string name="action_add_to_bookmarks">واچ اسٹیٹس کو سیٹ کریں</string>
|
||||
<string name="sort_apply">لاگو کریں</string>
|
||||
<string name="sort_cancel">منسوخ کریں</string>
|
||||
<string name="sort_copy">کاپی</string>
|
||||
<string name="sort_close">بند کریں</string>
|
||||
<string name="sort_clear">صاف کریں</string>
|
||||
|
@ -193,6 +191,7 @@
|
|||
<string name="no_episodes_found">کوئی اقساط نہیں ملی</string>
|
||||
<string name="delete_file">فائل کو ڈیلیٹ کریں</string>
|
||||
<string name="delete">مٹا دیں</string>
|
||||
<string name="cancel">منسوخ کریں</string>
|
||||
<string name="pause">توقف</string>
|
||||
<string name="resume">از سر نو شروع کریں</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -211,7 +210,7 @@
|
|||
<string name="synopsis">خلاصہ</string>
|
||||
<string name="queued">قطار میں</string>
|
||||
<string name="no_subtitles">کوئی سب ٹائٹلز نہیں</string>
|
||||
<string name="default_subtitles">ڈیفالٹ</string>
|
||||
<string name="action_default">ڈیفالٹ</string>
|
||||
<string name="free_storage">مفت</string>
|
||||
<string name="used_storage">استعمال شُدہ</string>
|
||||
<string name="cartoons">کارٹون</string>
|
||||
|
@ -535,7 +534,6 @@
|
|||
<string name="edit">ترتیب دیں</string>
|
||||
<string name="wifi">وائی فائی</string>
|
||||
<string name="profile_background_des">پروفائل پس منظر</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="help">مدد</string>
|
||||
<string name="profile_number">پروفائل %d</string>
|
||||
<string name="automatic_plugin_download_mode_title">پلگ انز کو ڈاؤن لوڈ کرنے کے لئے موڈ منتخب کریں</string>
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
<string name="type_completed">Đã xem</string>
|
||||
<string name="type_dropped">Bỏ qua</string>
|
||||
<string name="type_plan_to_watch">Xem sau</string>
|
||||
<string name="type_none">Mặc định</string>
|
||||
<string name="type_re_watching">Xem lại</string>
|
||||
<string name="play_movie_button">Xem Ngay</string>
|
||||
<string name="play_livestream_button">Phát trực tiếp</string>
|
||||
|
@ -83,7 +82,6 @@
|
|||
<string name="action_remove_from_bookmarks">Xóa</string>
|
||||
<string name="action_add_to_bookmarks">Đặt trạng thái xem</string>
|
||||
<string name="sort_apply">Áp dụng</string>
|
||||
<string name="sort_cancel">Hủy bỏ</string>
|
||||
<string name="sort_copy">Sao lưu</string>
|
||||
<string name="sort_close">Đóng</string>
|
||||
<string name="sort_clear">Huỷ bỏ</string>
|
||||
|
@ -190,6 +188,7 @@
|
|||
<string name="no_episodes_found">Không có tập nào</string>
|
||||
<string name="delete_file">Xóa Tệp</string>
|
||||
<string name="delete">Xóa</string>
|
||||
<string name="cancel">Hủy bỏ</string>
|
||||
<string name="pause">Tạm Dừng</string>
|
||||
<string name="resume">Tiếp Tục</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -208,7 +207,7 @@
|
|||
<string name="synopsis">Thông tin</string>
|
||||
<string name="queued">Hàng chờ</string>
|
||||
<string name="no_subtitles">Không có phụ đề</string>
|
||||
<string name="default_subtitles">Mặc Định</string>
|
||||
<string name="action_default">Mặc Định</string>
|
||||
<string name="free_storage">Còn trống</string>
|
||||
<string name="used_storage">Đã sử dụng</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -410,8 +409,8 @@
|
|||
<string name="plugin_deleted">Plugin đã xoá</string>
|
||||
<string name="plugin_load_fail" formatted="true">Không tải được %s</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">Bắt đầu tải %d %s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Tải xuống %d %s thành công</string>
|
||||
<string name="batch_download_start_format" formatted="true">Đã bắt đầu tải xuống %1$d %2$s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Đã tải xuống %1$d %2$s</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">Toàn bộ %s đã được tải xuống</string>
|
||||
<string name="batch_download">Tải hàng loạt</string>
|
||||
<string name="plugin_singular">plugin</string>
|
||||
|
@ -567,5 +566,31 @@
|
|||
<string name="no_plugins_found_error">Không tìm thấy plugin</string>
|
||||
<string name="unable_to_inflate">Không thể khởi tạo UI, đây là một LỖI LỚN và cần được báo cáo ngay lập tức tới %s</string>
|
||||
<string name="automatic_plugin_download_mode_title">Chọn chế độ để lọc plugin tải xuống</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="favorite_removed">%s đã loại bỏ khỏi mục yêu thích</string>
|
||||
<string name="favorites_list_name">Yêu thích</string>
|
||||
<string name="favorite_added">%s đã thêm vào mục yêu thích</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">Các mục có thể trùng lặp đã được tìm thấy trong thư viện của bạn:
|
||||
\n
|
||||
\n%s
|
||||
\n
|
||||
\nBạn vẫn muốn thêm mục này, thay thế những mục hiện có hay hủy hành động\?</string>
|
||||
<string name="backup_frequency">Tần suất sao lưu</string>
|
||||
<string name="duplicate_title">Đã tìm thấy bản sao tiềm năng</string>
|
||||
<string name="lock_profile">Khóa hồ sơ</string>
|
||||
<string name="action_add_to_favorites">Thêm vào mục yêu thích</string>
|
||||
<string name="duplicate_replace_all">Thay thế tất cả</string>
|
||||
<string name="pin_error_incorrect">Mã PIN không chính xác. Vui lòng thử lại.</string>
|
||||
<string name="action_unsubscribe">Hủy đăng ký</string>
|
||||
<string name="pin_error_length">Mã PIN phải có 4 ký tự</string>
|
||||
<string name="duplicate_replace">Thay thế</string>
|
||||
<string name="duplicate_add">Thêm vào</string>
|
||||
<string name="action_subscribe">Đăng ký</string>
|
||||
<string name="action_remove_from_favorites">Loại bỏ khỏi mục yêu thích</string>
|
||||
<string name="select_an_account">Chọn một tài khoản</string>
|
||||
<string name="duplicate_message_single">Có vẻ như một mục có khả năng trùng lặp đã tồn tại trong thư viện của bạn: \'%1$s.\'
|
||||
\n
|
||||
\nBạn vẫn muốn thêm mục này, thay thế mục hiện có hay hủy hành động\?</string>
|
||||
<string name="enter_pin">Nhập PIN</string>
|
||||
<string name="pin">PIN</string>
|
||||
<string name="enter_current_pin">Nhập mã PIN hiện tại</string>
|
||||
</resources>
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
<string name="type_completed">觀看完畢</string>
|
||||
<string name="type_dropped">放棄觀看</string>
|
||||
<string name="type_plan_to_watch">計畫觀看</string>
|
||||
<string name="type_none">無</string>
|
||||
<string name="type_re_watching">重新觀看</string>
|
||||
<string name="play_movie_button">播放電影</string>
|
||||
<string name="play_livestream_button">播放直播</string>
|
||||
|
@ -96,7 +95,6 @@
|
|||
<string name="action_remove_from_bookmarks">移除</string>
|
||||
<string name="action_add_to_bookmarks">設定觀看狀態</string>
|
||||
<string name="sort_apply">套用</string>
|
||||
<string name="sort_cancel">取消</string>
|
||||
<string name="sort_copy">複製</string>
|
||||
<string name="sort_close">關閉</string>
|
||||
<string name="sort_clear">清除</string>
|
||||
|
@ -205,7 +203,7 @@
|
|||
<string name="no_episodes_found">未找到劇集</string>
|
||||
<string name="delete_file">刪除文件</string>
|
||||
<string name="delete">刪除</string>
|
||||
<string name="cancel" translatable="false">@string/sort_cancel</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="pause">暫停</string>
|
||||
<string name="resume">繼續</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -224,7 +222,7 @@
|
|||
<string name="synopsis">簡介</string>
|
||||
<string name="queued">已加入佇列</string>
|
||||
<string name="no_subtitles">無字幕</string>
|
||||
<string name="default_subtitles">預設</string>
|
||||
<string name="action_default">預設</string>
|
||||
<string name="free_storage">空閒</string>
|
||||
<string name="used_storage">已使用</string>
|
||||
<string name="app_storage">應用程式</string>
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
<string name="type_completed">观看完毕</string>
|
||||
<string name="type_dropped">放弃观看</string>
|
||||
<string name="type_plan_to_watch">计划观看</string>
|
||||
<string name="type_none">无</string>
|
||||
<string name="type_re_watching">重新观看</string>
|
||||
<string name="play_movie_button">播放电影</string>
|
||||
<string name="play_livestream_button">播放直播</string>
|
||||
|
@ -96,7 +95,6 @@
|
|||
<string name="action_remove_from_bookmarks">移除</string>
|
||||
<string name="action_add_to_bookmarks">设置观看状态</string>
|
||||
<string name="sort_apply">应用</string>
|
||||
<string name="sort_cancel">取消</string>
|
||||
<string name="sort_copy">复制</string>
|
||||
<string name="sort_close">关闭</string>
|
||||
<string name="sort_clear">清除</string>
|
||||
|
@ -206,7 +204,7 @@
|
|||
<string name="no_episodes_found">未找到剧集</string>
|
||||
<string name="delete_file">删除文件</string>
|
||||
<string name="delete">删除</string>
|
||||
<string name="cancel" translatable="false">@string/sort_cancel</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="pause">暂停</string>
|
||||
<string name="resume">继续</string>
|
||||
<string name="go_back_30">-30</string>
|
||||
|
@ -225,7 +223,7 @@
|
|||
<string name="synopsis">简介</string>
|
||||
<string name="queued">已加入队列</string>
|
||||
<string name="no_subtitles">无字幕</string>
|
||||
<string name="default_subtitles">默认</string>
|
||||
<string name="action_default">默认</string>
|
||||
<string name="free_storage">空闲</string>
|
||||
<string name="used_storage">已使用</string>
|
||||
<string name="app_storage">应用</string>
|
||||
|
|
|
@ -77,11 +77,11 @@
|
|||
<string name="rew_text_regular_format" formatted="true" translatable="false">%d</string>
|
||||
<string name="rating_format" formatted="true" translatable="false">%.1f/10.0</string>
|
||||
<string name="year_format" formatted="true" translatable="false">%d</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%s Ep %d</string>
|
||||
<string name="app_dub_sub_episode_text_format" formatted="true">%1$s Ep %2$d</string>
|
||||
<string name="cast_format" formatted="true">Cast: %s</string>
|
||||
<string name="next_episode_format" formatted="true">Episode %d will be released in</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%dd %dh %dm</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%dh %dm</string>
|
||||
<string name="next_episode_time_day_format" formatted="true">%1$dd %2$dh %3$dm</string>
|
||||
<string name="next_episode_time_hour_format" formatted="true">%1$dh %2$dm</string>
|
||||
<string name="next_episode_time_min_format" formatted="true">%dm</string>
|
||||
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
|
||||
<string name="result_poster_img_des">Poster</string>
|
||||
|
@ -97,7 +97,7 @@
|
|||
<!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
|
||||
<string name="player_speed_text_format" formatted="true">Speed (%.2fx)</string>
|
||||
<string name="rated_format" formatted="true">Rated: %.1f</string>
|
||||
<string name="new_update_format" formatted="true">New update found!\n%s -> %s</string>
|
||||
<string name="new_update_format" formatted="true">New update found!\n%1$s -> %2$s</string>
|
||||
<string name="filler" formatted="true">Filler</string>
|
||||
<string name="duration_format" formatted="true">%d min</string>
|
||||
<string name="app_name">CloudStream</string>
|
||||
|
@ -123,7 +123,7 @@
|
|||
<string name="type_completed">Completed</string>
|
||||
<string name="type_dropped">Dropped</string>
|
||||
<string name="type_plan_to_watch">Plan to Watch</string>
|
||||
<string name="type_none">None</string>
|
||||
<string name="type_none" translatable="false">@string/none</string>
|
||||
<string name="type_re_watching">Rewatching</string>
|
||||
<string name="play_movie_button">Play Movie</string>
|
||||
<string name="play_trailer_button">Play Trailer</string>
|
||||
|
@ -164,7 +164,7 @@
|
|||
<string name="action_remove_from_bookmarks">Remove</string>
|
||||
<string name="action_add_to_bookmarks">Set watch status</string>
|
||||
<string name="sort_apply">Apply</string>
|
||||
<string name="sort_cancel">Cancel</string>
|
||||
<string name="sort_cancel" translatable="false">@string/cancel</string>
|
||||
<string name="sort_copy">Copy</string>
|
||||
<string name="sort_close">Close</string>
|
||||
<string name="sort_clear">Clear</string>
|
||||
|
@ -276,18 +276,18 @@
|
|||
developers
|
||||
</string>
|
||||
<string name="season">Season</string>
|
||||
<string name="season_format">%s %d%s</string>
|
||||
<string name="season_format">%1$s %2$d%3$s</string>
|
||||
<string name="no_season">No Season</string>
|
||||
<string name="episode">Episode</string>
|
||||
<string name="episodes">Episodes</string>
|
||||
<string name="episodes_range">%d-%d</string>
|
||||
<string name="episode_format" formatted="true">%d %s</string>
|
||||
<string name="episodes_range">%1$d-%2$d</string>
|
||||
<string name="episode_format" formatted="true">%1$d %2$s</string>
|
||||
<string name="season_short">S</string>
|
||||
<string name="episode_short">E</string>
|
||||
<string name="no_episodes_found">No Episodes found</string>
|
||||
<string name="delete_file">Delete File</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="cancel" translatable="false">@string/sort_cancel</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="pause">Pause</string>
|
||||
<string name="start">Start</string>
|
||||
<string name="test_failed">Failed</string>
|
||||
|
@ -307,8 +307,9 @@
|
|||
<string name="synopsis">Synopsis</string>
|
||||
<string name="queued">queued</string>
|
||||
<string name="no_subtitles">No Subtitles</string>
|
||||
<string name="default_subtitles">Default</string>
|
||||
<string name="default_account">@string/default_subtitles</string>
|
||||
<string name="action_default">Default</string>
|
||||
<string name="default_subtitles" translatable="false">@string/action_default</string>
|
||||
<string name="default_account" translatable="false">@string/action_default</string>
|
||||
<string name="free_storage">Free</string>
|
||||
<string name="used_storage">Used</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
@ -470,7 +471,7 @@
|
|||
<string name="kitsu_account_settings" translatable="false">Kitsu</string>
|
||||
<string name="trakt_account_settings" translatable="false">Trakt</string>
|
||||
-->
|
||||
<string name="login_format" formatted="true">%s %s</string>
|
||||
<string name="login_format" formatted="true">%1$s %2$s</string>
|
||||
<string name="account">account</string>
|
||||
<string name="logout">Log out</string>
|
||||
<string name="login">Log in</string>
|
||||
|
@ -571,8 +572,8 @@
|
|||
<string name="plugin_deleted">Plugin Deleted</string>
|
||||
<string name="plugin_load_fail" formatted="true">Could not load %s</string>
|
||||
<string name="is_adult">18+</string>
|
||||
<string name="batch_download_start_format" formatted="true">Started downloading %d %s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Downloaded %d %s</string>
|
||||
<string name="batch_download_start_format" formatted="true">Started downloading %1$d %2$s…</string>
|
||||
<string name="batch_download_finish_format" formatted="true">Downloaded %1$d %2$s</string>
|
||||
<string name="batch_download_nothing_to_download_format" formatted="true">All %s already downloaded</string>
|
||||
<string name="no_plugins_found_error">No plugins found in repository</string>
|
||||
<string name="no_repository_found_error">Repository not found, check the URL and try VPN</string>
|
||||
|
@ -666,6 +667,8 @@
|
|||
<string name="subscription_new">Subscribed to %s</string>
|
||||
<string name="subscription_deleted">Unsubscribed from %s</string>
|
||||
<string name="subscription_episode_released">Episode %d released!</string>
|
||||
<string name="action_subscribe">Subscribe</string>
|
||||
<string name="action_unsubscribe">Unsubscribe</string>
|
||||
<string name="profile_number">Profile %d</string>
|
||||
<string name="wifi">Wi-Fi</string>
|
||||
<string name="mobile_data">Mobile data</string>
|
||||
|
@ -686,13 +689,41 @@
|
|||
<string name="qualities">Qualities</string>
|
||||
<string name="profile_background_des">Profile background</string>
|
||||
<string name="unable_to_inflate">UI was unable to be created correctly, this is a MAJOR BUG and should be reported immediately %s</string>
|
||||
|
||||
|
||||
<string name="tv_no_focus_tag" translatable="false">tv_no_focus_tag</string>
|
||||
<string name="already_voted">You have already voted</string>
|
||||
|
||||
<string name="favorites_list_name">Favorites</string>
|
||||
<string name="favorite_added">%s added to favorites</string>
|
||||
<string name="favorite_removed">%s removed from favorites</string>
|
||||
<string name="action_add_to_favorites">Add to favorites</string>
|
||||
<string name="action_remove_from_favorites">Remove from favorites</string>
|
||||
|
||||
<string name="duplicate_title">Potential Duplicate Found</string>
|
||||
<string name="duplicate_add">Add</string>
|
||||
<string name="duplicate_replace">Replace</string>
|
||||
<string name="duplicate_replace_all">Replace All</string>
|
||||
<string name="duplicate_cancel" translatable="false">@string/cancel</string>
|
||||
<string name="duplicate_message_single" formatted="true">
|
||||
It appears that a potentially duplicate item already exists in your library: \'%s.\'
|
||||
|
||||
\n\nWould you like to add this item anyway, replace the existing one, or cancel the action?
|
||||
</string>
|
||||
<string name="duplicate_message_multiple" formatted="true">
|
||||
Potential duplicate items have been found in your library:
|
||||
|
||||
\n\n%s
|
||||
|
||||
\n\nWould you like to add this item anyway, replace the existing ones, or cancel the action?
|
||||
</string>
|
||||
|
||||
|
||||
<string name="tv_no_focus_tag" translatable="false">tv_no_focus_tag</string>
|
||||
|
||||
|
||||
<string name="enter_pin">Enter PIN</string>
|
||||
<string name="enter_current_pin">Enter Current PIN</string>
|
||||
<string name="lock_profile">Lock Profile</string>
|
||||
<string name="pin">PIN</string>
|
||||
<string name="pin_error_incorrect">Incorrect PIN. Please try again.</string>
|
||||
<string name="pin_error_length">PIN must be 4 characters</string>
|
||||
<string name="select_an_account">Select an Account</string>
|
||||
</resources>
|
||||
|
|
1
fastlane/metadata/android/es-ES/changelogs/2.txt
Normal file
1
fastlane/metadata/android/es-ES/changelogs/2.txt
Normal file
|
@ -0,0 +1 @@
|
|||
- ¡Cambios añadidos!
|
10
fastlane/metadata/android/es-ES/full_description.txt
Normal file
10
fastlane/metadata/android/es-ES/full_description.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
CloudStream-3 te permite ver y descargar películas, series de TV y anime.
|
||||
|
||||
La aplicación viene sin ningún tipo de anuncios y análisis y
|
||||
soporta múltiples tráilers y páginas de películas, y más, por ejemplo
|
||||
|
||||
Marcadores
|
||||
|
||||
Descargas de subtítulos
|
||||
|
||||
Compatible con Chromecast
|
1
fastlane/metadata/android/es-ES/short_description.txt
Normal file
1
fastlane/metadata/android/es-ES/short_description.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Vea y descargue películas, series de televisión y anime.
|
1
fastlane/metadata/android/es-ES/title.txt
Normal file
1
fastlane/metadata/android/es-ES/title.txt
Normal file
|
@ -0,0 +1 @@
|
|||
CloudStream
|
Loading…
Add table
Add a link
Reference in a new issue