forked from recloudstream/cloudstream
locale changes
This commit is contained in:
parent
a5834db72f
commit
6cc3bcc1dd
23 changed files with 244 additions and 142 deletions
|
@ -32,19 +32,16 @@ object DownloadButtonSetup {
|
|||
}
|
||||
}
|
||||
|
||||
builder.setTitle("Delete File")
|
||||
builder.setMessage(
|
||||
"This will permanently delete ${
|
||||
getNameFull(
|
||||
builder.setTitle(R.string.delete_file)
|
||||
.setMessage(
|
||||
ctx.getString(R.string.delete_message).format(ctx.getNameFull(
|
||||
click.data.name,
|
||||
click.data.episode,
|
||||
click.data.season
|
||||
)
|
||||
}\nAre you sure?"
|
||||
)
|
||||
.setTitle("Delete")
|
||||
.setPositiveButton("Delete", dialogClickListener)
|
||||
.setNegativeButton("Cancel", dialogClickListener)
|
||||
))
|
||||
)
|
||||
.setPositiveButton(R.string.delete, dialogClickListener)
|
||||
.setNegativeButton(R.string.cancel, dialogClickListener)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.lagradost.cloudstream3.ui.download
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
@ -102,7 +101,6 @@ class DownloadChildAdapter(
|
|||
|
||||
var localCard: VisualDownloadChildCached? = null
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun bind(card: VisualDownloadChildCached) {
|
||||
localCard = card
|
||||
val d = card.data
|
||||
|
@ -117,7 +115,7 @@ class DownloadChildAdapter(
|
|||
progressBar.visibility = View.GONE
|
||||
}
|
||||
|
||||
title.text = getNameFull(d.name, d.episode, d.season)
|
||||
title.text = title.context.getNameFull(d.name, d.episode, d.season)
|
||||
title.isSelected = true // is needed for text repeating
|
||||
|
||||
downloadButton.setUpButton(
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.lagradost.cloudstream3.ui.download
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
|
@ -12,12 +11,12 @@ import androidx.navigation.findNavController
|
|||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||
import com.lagradost.cloudstream3.isMovieType
|
||||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
|
||||
import com.lagradost.cloudstream3.utils.DOWNLOAD_EPISODE_CACHE
|
||||
import com.lagradost.cloudstream3.utils.DataStore.getFolderName
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
||||
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
||||
|
@ -56,7 +55,6 @@ class DownloadFragment : Fragment() {
|
|||
super.onDestroy()
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
|
@ -71,15 +69,18 @@ class DownloadFragment : Fragment() {
|
|||
setList(it)
|
||||
}
|
||||
observe(downloadsViewModel.availableBytes) {
|
||||
download_free_txt?.text = "Free • ${getBytesAsText(it)}GB"
|
||||
download_free_txt?.text =
|
||||
getString(R.string.storage_size_format).format(getString(R.string.free_storage), getBytesAsText(it))
|
||||
download_free?.setLayoutWidth(it)
|
||||
}
|
||||
observe(downloadsViewModel.usedBytes) {
|
||||
download_used_txt?.text = "Used • ${getBytesAsText(it)}GB"
|
||||
download_used_txt?.text =
|
||||
getString(R.string.storage_size_format).format(getString(R.string.used_storage), getBytesAsText(it))
|
||||
download_used?.setLayoutWidth(it)
|
||||
}
|
||||
observe(downloadsViewModel.downloadBytes) {
|
||||
download_app_txt?.text = "App • ${getBytesAsText(it)}GB"
|
||||
download_app_txt?.text =
|
||||
getString(R.string.storage_size_format).format(getString(R.string.app_storage), getBytesAsText(it))
|
||||
download_app?.setLayoutWidth(it)
|
||||
download_storage_appbar?.visibility = View.VISIBLE
|
||||
}
|
||||
|
|
|
@ -101,7 +101,6 @@ class DownloadHeaderAdapter(
|
|||
private val normalImage: ImageView = itemView.download_header_goto_child
|
||||
var localCard: VisualDownloadHeaderCached? = null
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun bind(card: VisualDownloadHeaderCached) {
|
||||
localCard = card
|
||||
val d = card.data
|
||||
|
@ -135,7 +134,13 @@ class DownloadHeaderAdapter(
|
|||
normalImage.visibility = View.VISIBLE
|
||||
|
||||
extraInfo.text =
|
||||
"${card.totalDownloads} Episode${if (card.totalDownloads == 1) "" else "s"} | ${mbString}MB"
|
||||
extraInfo.context.getString(R.string.extra_info_format).format(
|
||||
card.totalDownloads,
|
||||
if (card.totalDownloads == 1) extraInfo.context.getString(R.string.episode) else extraInfo.context.getString(
|
||||
R.string.episodes
|
||||
),
|
||||
mbString
|
||||
)
|
||||
|
||||
holder.setOnClickListener {
|
||||
clickCallback.invoke(DownloadHeaderClickEvent(0, d))
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.lagradost.cloudstream3.ui.download
|
||||
|
||||
import android.animation.ObjectAnimator
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.View
|
||||
import android.view.animation.DecelerateInterpolator
|
||||
import android.widget.ImageView
|
||||
|
@ -16,7 +15,7 @@ import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
|||
|
||||
class EasyDownloadButton : IDisposable {
|
||||
interface IMinimumData {
|
||||
val id : Int
|
||||
val id: Int
|
||||
}
|
||||
|
||||
override fun dispose() {
|
||||
|
@ -93,7 +92,6 @@ class EasyDownloadButton : IDisposable {
|
|||
downloadImageChangeCallback.invoke(img)
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun fixDownloadedBytes(setCurrentBytes: Long, setTotalBytes: Long, animate: Boolean) {
|
||||
currentBytes = setCurrentBytes
|
||||
totalBytes = setTotalBytes
|
||||
|
@ -112,7 +110,7 @@ class EasyDownloadButton : IDisposable {
|
|||
val totalMbString = "%.1f".format(setTotalBytes / 1000000f)
|
||||
|
||||
textView?.text =
|
||||
"${currentMbString}MB / ${totalMbString}MB"
|
||||
textView?.context?.getString(R.string.download_size_format)?.format(currentMbString, totalMbString)
|
||||
|
||||
progressBar.let { bar ->
|
||||
bar.max = (setTotalBytes / 1000).toInt()
|
||||
|
|
|
@ -618,7 +618,6 @@ class PlayerFragment : Fragment() {
|
|||
this.visibility = if (visible) VISIBLE else GONE
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun changeSkip(position: Long? = null) {
|
||||
val data = localData
|
||||
|
||||
|
@ -903,7 +902,7 @@ class PlayerFragment : Fragment() {
|
|||
}
|
||||
|
||||
private fun handlePlayerEvent(event: Int) {
|
||||
if(!this::exoPlayer.isInitialized) return
|
||||
if (!this::exoPlayer.isInitialized) return
|
||||
when (event) {
|
||||
PlayerEventType.Play.value -> exoPlayer.play()
|
||||
PlayerEventType.Pause.value -> exoPlayer.pause()
|
||||
|
@ -1152,10 +1151,10 @@ class PlayerFragment : Fragment() {
|
|||
}
|
||||
}
|
||||
}
|
||||
val fastForwardTime = settingsManager.getInt("fast_forward_button_time", 10)
|
||||
exo_rew_text.text = fastForwardTime.toString()
|
||||
exo_ffwd_text.text = fastForwardTime.toString()
|
||||
fun rewnd() {
|
||||
val fastForwardTime = settingsManager.getInt(getString(R.string.fast_forward_button_time_key), 10)
|
||||
exo_rew_text.text = getString(R.string.rew_text_regular_format).format(fastForwardTime)
|
||||
exo_ffwd_text.text = getString(R.string.ffw_text_regular_format).format(fastForwardTime)
|
||||
fun rewind() {
|
||||
val rotateLeft = AnimationUtils.loadAnimation(context, R.anim.rotate_left)
|
||||
exo_rew.startAnimation(rotateLeft)
|
||||
|
||||
|
@ -1166,19 +1165,21 @@ class PlayerFragment : Fragment() {
|
|||
override fun onAnimationRepeat(animation: Animation?) {}
|
||||
|
||||
override fun onAnimationEnd(animation: Animation?) {
|
||||
exo_rew_text.post { exo_rew_text.text = "$fastForwardTime" }
|
||||
exo_rew_text.post {
|
||||
exo_rew_text.text = getString(R.string.rew_text_format).format(fastForwardTime)
|
||||
}
|
||||
}
|
||||
})
|
||||
exo_rew_text.startAnimation(goLeft)
|
||||
exo_rew_text.text = "-$fastForwardTime"
|
||||
exo_rew_text.text = getString(R.string.rew_text_regular_format).format(fastForwardTime)
|
||||
seekTime(fastForwardTime * -1000L)
|
||||
}
|
||||
|
||||
exo_rew.setOnClickListener {
|
||||
rewnd()
|
||||
rewind()
|
||||
}
|
||||
|
||||
fun ffwrd() {
|
||||
fun fastForward() {
|
||||
val rotateRight = AnimationUtils.loadAnimation(context, R.anim.rotate_right)
|
||||
exo_ffwd.startAnimation(rotateRight)
|
||||
|
||||
|
@ -1189,16 +1190,18 @@ class PlayerFragment : Fragment() {
|
|||
override fun onAnimationRepeat(animation: Animation?) {}
|
||||
|
||||
override fun onAnimationEnd(animation: Animation?) {
|
||||
exo_ffwd_text.post { exo_ffwd_text.text = "$fastForwardTime" }
|
||||
exo_ffwd_text.post {
|
||||
exo_ffwd_text.text = getString(R.string.ffw_text_format).format(fastForwardTime)
|
||||
}
|
||||
}
|
||||
})
|
||||
exo_ffwd_text.startAnimation(goRight)
|
||||
exo_ffwd_text.text = "+$fastForwardTime"
|
||||
exo_ffwd_text.text = getString(R.string.ffw_text_regular_format).format(fastForwardTime)
|
||||
seekTime(fastForwardTime * 1000L)
|
||||
}
|
||||
|
||||
exo_ffwd.setOnClickListener {
|
||||
ffwrd()
|
||||
fastForward()
|
||||
}
|
||||
|
||||
overlay_loading_skip_button.setOnClickListener {
|
||||
|
@ -1241,13 +1244,13 @@ class PlayerFragment : Fragment() {
|
|||
|
||||
override fun onDoubleClickRight(clicks: Int) {
|
||||
if (!isLocked) {
|
||||
ffwrd()
|
||||
fastForward()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDoubleClickLeft(clicks: Int) {
|
||||
if (!isLocked) {
|
||||
rewnd()
|
||||
rewind()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1285,19 +1288,21 @@ class PlayerFragment : Fragment() {
|
|||
val speedsNumbers = listOf(0.5f, 0.75f, 1f, 1.25f, 1.5f, 1.75f, 2f)
|
||||
val speedIndex = speedsNumbers.indexOf(playbackSpeed)
|
||||
|
||||
context?.showDialog(speedsText, speedIndex, "Player Speed", false, {
|
||||
context?.showDialog(speedsText, speedIndex, getString(R.string.player_speed), false, {
|
||||
activity?.hideSystemUI()
|
||||
}) { index ->
|
||||
playbackSpeed = speedsNumbers[index]
|
||||
requireContext().setKey(PLAYBACK_SPEED_KEY, playbackSpeed)
|
||||
val param = PlaybackParameters(playbackSpeed)
|
||||
exoPlayer.playbackParameters = param
|
||||
player_speed_text.text = "Speed (${playbackSpeed}x)".replace(".0x", "x")
|
||||
player_speed_text.text =
|
||||
getString(R.string.player_speed_text_format).format(playbackSpeed).replace(".0x", "x")
|
||||
}
|
||||
}
|
||||
|
||||
sources_btt.setOnClickListener {
|
||||
val isPlaying = exoPlayer.isPlaying
|
||||
if (!this::exoPlayer.isInitialized) return@setOnClickListener
|
||||
//val isPlaying = exoPlayer.isPlaying
|
||||
exoPlayer.pause()
|
||||
val currentSubtitles = activeSubtitles
|
||||
|
||||
|
@ -1355,7 +1360,7 @@ class PlayerFragment : Fragment() {
|
|||
sourceDialog.findViewById<LinearLayout>(R.id.sort_subtitles_holder)?.visibility = GONE
|
||||
} else {
|
||||
val subsArrayAdapter = ArrayAdapter<String>(view.context, R.layout.sort_bottom_single_choice)
|
||||
subsArrayAdapter.add("No Subtitles")
|
||||
subsArrayAdapter.add(getString(R.string.no_subtitles))
|
||||
subsArrayAdapter.addAll(currentSubtitles)
|
||||
|
||||
subtitleList.adapter = subsArrayAdapter
|
||||
|
@ -1464,7 +1469,12 @@ class PlayerFragment : Fragment() {
|
|||
.removeSuffix(".vtt")
|
||||
.removeSuffix(".srt")
|
||||
.removeSuffix(".txt")
|
||||
list.add(SubtitleFile(realName.ifBlank { "Default" }, file.second.toString()))
|
||||
list.add(
|
||||
SubtitleFile(
|
||||
realName.ifBlank { getString(R.string.default_subtitles) },
|
||||
file.second.toString()
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
return list
|
||||
|
@ -1811,7 +1821,8 @@ class PlayerFragment : Fragment() {
|
|||
player_view.player = exoPlayer
|
||||
// Sets the speed
|
||||
exoPlayer.playbackParameters = PlaybackParameters(playbackSpeed)
|
||||
player_speed_text?.text = "Speed (${playbackSpeed}x)".replace(".0x", "x")
|
||||
player_speed_text?.text =
|
||||
getString(R.string.player_speed_text_format).format(playbackSpeed).replace(".0x", "x")
|
||||
|
||||
var hName: String? = null
|
||||
var epEpisode: Int? = null
|
||||
|
@ -1843,9 +1854,9 @@ class PlayerFragment : Fragment() {
|
|||
video_title?.text = hName +
|
||||
if (isEpisodeBased)
|
||||
if (epSeason == null)
|
||||
" - Episode $epEpisode"
|
||||
" - ${getString(R.string.episode)} $epEpisode"
|
||||
else
|
||||
" \"S${epSeason}:E${epEpisode}\""
|
||||
" \"${getString(R.string.season_short)}${epSeason}:${getString(R.string.episode_short)}${epEpisode}\""
|
||||
else ""
|
||||
|
||||
/*
|
||||
|
@ -1944,26 +1955,26 @@ class PlayerFragment : Fragment() {
|
|||
if (currentUrl?.url != "") {
|
||||
showToast(
|
||||
activity,
|
||||
"Source error\n" + error.sourceException.message,
|
||||
"${getString(R.string.source_error)}\n" + error.sourceException.message,
|
||||
LENGTH_SHORT
|
||||
)
|
||||
tryNextMirror()
|
||||
}
|
||||
}
|
||||
ExoPlaybackException.TYPE_REMOTE -> {
|
||||
showToast(activity, "Remote error", LENGTH_SHORT)
|
||||
showToast(activity, getString(R.string.remote_error), LENGTH_SHORT)
|
||||
}
|
||||
ExoPlaybackException.TYPE_RENDERER -> {
|
||||
showToast(
|
||||
activity,
|
||||
"Renderer error\n" + error.rendererException.message,
|
||||
"${getString(R.string.render_error)}\n" + error.rendererException.message,
|
||||
LENGTH_SHORT
|
||||
)
|
||||
}
|
||||
ExoPlaybackException.TYPE_UNEXPECTED -> {
|
||||
showToast(
|
||||
activity,
|
||||
"Unexpected player error\n" + error.unexpectedException.message,
|
||||
"${getString(R.string.unexpected_error)}\n" + error.unexpectedException.message,
|
||||
LENGTH_SHORT
|
||||
)
|
||||
}
|
||||
|
@ -1986,7 +1997,7 @@ class PlayerFragment : Fragment() {
|
|||
}
|
||||
|
||||
//http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4
|
||||
@SuppressLint("SetTextI18n")
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
private fun initPlayer() {
|
||||
if (isDownloadedFile) {
|
||||
initPlayer(null, uriData.uri.removePrefix("file://").replace("%20", " ")) // FIX FILE PERMISSION
|
||||
|
@ -2011,7 +2022,7 @@ class PlayerFragment : Fragment() {
|
|||
initPlayer(getCurrentUrl())
|
||||
}
|
||||
} else {
|
||||
showToast(activity, "No Links Found", LENGTH_SHORT)
|
||||
showToast(activity, R.string.no_links_found_toast, LENGTH_SHORT)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -139,7 +139,7 @@ class EpisodeAdapter(
|
|||
@SuppressLint("SetTextI18n")
|
||||
fun bind(card: ResultEpisode) {
|
||||
localCard = card
|
||||
val name = if (card.name == null) "Episode ${card.episode}" else "${card.episode}. ${card.name}"
|
||||
val name = if (card.name == null) "${episodeText.context.getString(R.string.episode)} ${card.episode}" else "${card.episode}. ${card.name}"
|
||||
episodeText.text = name
|
||||
|
||||
val displayPos = card.getDisplayPosition()
|
||||
|
|
|
@ -228,9 +228,9 @@ class ResultFragment : Fragment() {
|
|||
|
||||
private fun fromIndexToSeasonText(selection: Int?): String {
|
||||
return when (selection) {
|
||||
null -> "No Season"
|
||||
-2 -> "No Season"
|
||||
else -> "Season $selection"
|
||||
null -> getString(R.string.no_season)
|
||||
-2 -> getString(R.string.no_season)
|
||||
else -> "${getString(R.string.season)} $selection"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -282,7 +282,7 @@ class ResultFragment : Fragment() {
|
|||
media_route_button?.alpha = if (chromecastSupport) 1f else 0.3f
|
||||
if (!chromecastSupport) {
|
||||
media_route_button.setOnClickListener {
|
||||
showToast(activity, "This provider has no chromecast support", Toast.LENGTH_LONG)
|
||||
showToast(activity, R.string.no_chomecast_support_toast, Toast.LENGTH_LONG)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -331,7 +331,11 @@ class ResultFragment : Fragment() {
|
|||
var currentLinks: ArrayList<ExtractorLink>? = null
|
||||
var currentSubs: ArrayList<SubtitleFile>? = null
|
||||
|
||||
val showTitle = episodeClick.data.name ?: "Episode ${episodeClick.data.episode}"
|
||||
val showTitle =
|
||||
episodeClick.data.name ?: getString(R.string.episode_name_format).format(
|
||||
getString(R.string.episode),
|
||||
episodeClick.data.episode
|
||||
)
|
||||
|
||||
suspend fun requireLinks(isCasting: Boolean): Boolean {
|
||||
val currentLinksTemp =
|
||||
|
@ -501,7 +505,7 @@ class ResultFragment : Fragment() {
|
|||
subsList.filter { downloadList.contains(SubtitleHelper.fromLanguageToTwoLetters(it.lang)) }
|
||||
.map { ExtractorSubtitleLink(it.lang, it.url, "") }
|
||||
.forEach { link ->
|
||||
val epName = meta.name ?: "Episode ${meta.episode}"
|
||||
val epName = meta.name ?: "${context?.getString(R.string.episode)} ${meta.episode}"
|
||||
val fileName =
|
||||
sanitizeFilename(epName + if (downloadList.size > 1) " ${link.name}" else "")
|
||||
val topFolder = "$folder"
|
||||
|
@ -593,18 +597,18 @@ class ResultFragment : Fragment() {
|
|||
dialog.show()
|
||||
}
|
||||
ACTION_COPY_LINK -> {
|
||||
acquireSingeExtractorLink("Copy Link") { link ->
|
||||
acquireSingeExtractorLink(getString(R.string.episode_action_copy_link)) { link ->
|
||||
val serviceClipboard =
|
||||
(requireContext().getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?)
|
||||
?: return@acquireSingeExtractorLink
|
||||
val clip = ClipData.newPlainText(link.name, link.url)
|
||||
serviceClipboard.setPrimaryClip(clip)
|
||||
showToast(activity, "Link copied to clipboard", Toast.LENGTH_SHORT)
|
||||
showToast(activity, R.string.copy_link_toast, Toast.LENGTH_SHORT)
|
||||
}
|
||||
}
|
||||
|
||||
ACTION_PLAY_EPISODE_IN_BROWSER -> {
|
||||
acquireSingeExtractorLink("Play in Browser") { link ->
|
||||
acquireSingeExtractorLink(getString(R.string.episode_action_play_in_browser)) { link ->
|
||||
val i = Intent(ACTION_VIEW)
|
||||
i.data = Uri.parse(link.url)
|
||||
startActivity(i)
|
||||
|
@ -612,7 +616,7 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
|
||||
ACTION_CHROME_CAST_MIRROR -> {
|
||||
acquireSingeExtractorLink("Cast Mirror") { link ->
|
||||
acquireSingeExtractorLink(getString(R.string.episode_action_chomecast_mirror)) { link ->
|
||||
val mirrorIndex = currentLinks?.indexOf(link) ?: -1
|
||||
startChromecast(if (mirrorIndex == -1) 0 else mirrorIndex)
|
||||
}
|
||||
|
@ -707,11 +711,13 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
|
||||
ACTION_DOWNLOAD_MIRROR -> {
|
||||
acquireSingeExtractorLink(
|
||||
(currentLinks ?: return@main).filter { !it.isM3u8 },
|
||||
"Download Mirror"
|
||||
) { link ->
|
||||
startDownload(listOf(link), currentSubs)
|
||||
currentLinks?.let { links ->
|
||||
acquireSingeExtractorLink(
|
||||
links,//(currentLinks ?: return@main).filter { !it.isM3u8 },
|
||||
getString(R.string.episode_action_download_mirror)
|
||||
) { link ->
|
||||
startDownload(listOf(link), currentSubs)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -830,7 +836,8 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
|
||||
observe(viewModel.publicEpisodesCount) { count ->
|
||||
result_episodes_text.text = "$count Episode${if (count == 1) "" else "s"}"
|
||||
result_episodes_text.text =
|
||||
"$count ${if (count == 1) getString(R.string.episode) else getString(R.string.episodes)}"
|
||||
}
|
||||
|
||||
observe(viewModel.id) {
|
||||
|
@ -851,7 +858,7 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
result_vpn?.visibility = if (api.vpnStatus == VPNStatus.None) GONE else VISIBLE
|
||||
|
||||
result_bookmark_button.text = "Watching"
|
||||
//result_bookmark_button.text = getString(R.string.type_watching)
|
||||
|
||||
currentHeaderName = d.name
|
||||
currentType = d.type
|
||||
|
@ -877,29 +884,29 @@ class ResultFragment : Fragment() {
|
|||
startActivity(createChooser(i, d.name))
|
||||
}
|
||||
|
||||
val metadataInfoArray = ArrayList<Pair<String, String>>()
|
||||
val metadataInfoArray = ArrayList<Pair<Int, String>>()
|
||||
if (d is AnimeLoadResponse) {
|
||||
val status = when (d.showStatus) {
|
||||
null -> null
|
||||
ShowStatus.Ongoing -> "Ongoing"
|
||||
ShowStatus.Completed -> "Completed"
|
||||
ShowStatus.Ongoing -> R.string.status_ongoing
|
||||
ShowStatus.Completed -> R.string.status_completed
|
||||
}
|
||||
if (status != null) {
|
||||
metadataInfoArray.add(Pair("Status", status))
|
||||
metadataInfoArray.add(Pair(R.string.status, getString(status)))
|
||||
}
|
||||
}
|
||||
if (d.year != null) metadataInfoArray.add(Pair("Year", d.year.toString()))
|
||||
if (d.year != null) metadataInfoArray.add(Pair(R.string.year, d.year.toString()))
|
||||
val rating = d.rating
|
||||
if (rating != null) metadataInfoArray.add(
|
||||
Pair(
|
||||
"Rating",
|
||||
R.string.rating,
|
||||
"%.1f/10.0".format(rating.toFloat() / 10f).replace(",", ".")
|
||||
)
|
||||
)
|
||||
val duration = d.duration
|
||||
if (duration != null) metadataInfoArray.add(Pair("Duration", duration))
|
||||
if (duration != null) metadataInfoArray.add(Pair(R.string.duration, duration))
|
||||
|
||||
metadataInfoArray.add(Pair("Site", d.apiName))
|
||||
metadataInfoArray.add(Pair(R.string.site, d.apiName))
|
||||
|
||||
if (metadataInfoArray.size > 0) {
|
||||
result_metadata.visibility = VISIBLE
|
||||
|
@ -929,7 +936,7 @@ class ResultFragment : Fragment() {
|
|||
}
|
||||
result_descript.setOnClickListener {
|
||||
val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext())
|
||||
builder.setMessage(d.plot).setTitle("Synopsis")
|
||||
builder.setMessage(d.plot).setTitle(R.string.synopsis)
|
||||
.show()
|
||||
}
|
||||
result_descript.text = syno
|
||||
|
|
|
@ -103,12 +103,12 @@ class SearchFragment : Fragment() {
|
|||
val searchMagIcon = main_search.findViewById<ImageView>(androidx.appcompat.R.id.search_mag_icon)
|
||||
searchMagIcon.scaleX = 0.65f
|
||||
searchMagIcon.scaleY = 0.65f
|
||||
search_filter.setOnClickListener { view ->
|
||||
search_filter.setOnClickListener { searchView ->
|
||||
val apiNamesSetting = activity?.getApiSettings()
|
||||
if (apiNamesSetting != null) {
|
||||
val apiNames = apis.map { it.name }
|
||||
val builder =
|
||||
AlertDialog.Builder(view.context, R.style.AlertDialogCustom).setView(R.layout.provider_list)
|
||||
AlertDialog.Builder(searchView.context, R.style.AlertDialogCustom).setView(R.layout.provider_list)
|
||||
|
||||
val dialog = builder.create()
|
||||
dialog.show()
|
||||
|
@ -120,22 +120,22 @@ class SearchFragment : Fragment() {
|
|||
val cancelButton = dialog.findViewById<TextView>(R.id.cancel_btt)!!
|
||||
// val applyHolder = dialog.findViewById<LinearLayout>(R.id.apply_btt_holder)!!
|
||||
|
||||
val arrayAdapter = ArrayAdapter<String>(view.context, R.layout.sort_bottom_single_choice)
|
||||
val arrayAdapter = ArrayAdapter<String>(searchView.context, R.layout.sort_bottom_single_choice)
|
||||
arrayAdapter.addAll(apiNames)
|
||||
|
||||
listView.adapter = arrayAdapter
|
||||
listView.choiceMode = AbsListView.CHOICE_MODE_MULTIPLE
|
||||
|
||||
val typeChoices = listOf(
|
||||
Pair("Movies", listOf(TvType.Movie)),
|
||||
Pair("TvSeries", listOf(TvType.TvSeries)),
|
||||
Pair("Cartoons", listOf(TvType.Cartoon)),
|
||||
Pair("Anime", listOf(TvType.Anime, TvType.ONA, TvType.AnimeMovie)),
|
||||
Pair("Torrent", listOf(TvType.Torrent)),
|
||||
Pair(R.string.movies, listOf(TvType.Movie)),
|
||||
Pair(R.string.tv_series, listOf(TvType.TvSeries)),
|
||||
Pair(R.string.cartoons, listOf(TvType.Cartoon)),
|
||||
Pair(R.string.anime, listOf(TvType.Anime, TvType.ONA, TvType.AnimeMovie)),
|
||||
Pair(R.string.torrent, listOf(TvType.Torrent)),
|
||||
)
|
||||
|
||||
val arrayAdapter2 = ArrayAdapter<String>(view.context, R.layout.sort_bottom_single_choice)
|
||||
arrayAdapter2.addAll(typeChoices.map { it.first })
|
||||
val arrayAdapter2 = ArrayAdapter<String>(searchView.context, R.layout.sort_bottom_single_choice)
|
||||
arrayAdapter2.addAll(typeChoices.map { getString(it.first) })
|
||||
|
||||
listView2.adapter = arrayAdapter2
|
||||
listView2.choiceMode = AbsListView.CHOICE_MODE_MULTIPLE
|
||||
|
@ -229,7 +229,7 @@ class SearchFragment : Fragment() {
|
|||
val settingsManagerLocal = PreferenceManager.getDefaultSharedPreferences(activity)
|
||||
|
||||
val activeTypes = HashSet<TvType>()
|
||||
for ((index, name) in typeChoices.withIndex()) {
|
||||
for ((index, _) in typeChoices.withIndex()) {
|
||||
if (listView2.checkedItemPositions[index]) {
|
||||
activeTypes.addAll(typeChoices[index].second)
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ object SearchResultBuilder {
|
|||
playImg?.visibility = View.VISIBLE
|
||||
|
||||
if (!card.type.isMovieType()) {
|
||||
cardText.text = getNameFull(card.name, card.episode, card.season)
|
||||
cardText.text = cardText.context.getNameFull(card.name, card.episode, card.season)
|
||||
}
|
||||
}
|
||||
is AnimeSearchResponse -> {
|
||||
|
|
|
@ -47,23 +47,28 @@ object AppUtils {
|
|||
* | Season 1 - Episode 2
|
||||
* | Episode 2
|
||||
* **/
|
||||
fun getNameFull(name: String?, episode: Int?, season: Int?): String {
|
||||
fun Context.getNameFull(name: String?, episode: Int?, season: Int?): String {
|
||||
val rEpisode = if (episode == 0) null else episode
|
||||
val rSeason = if (season == 0) null else season
|
||||
|
||||
val seasonName = getString(R.string.season)
|
||||
val episodeName = getString(R.string.episode)
|
||||
val seasonNameShort = getString(R.string.season_short)
|
||||
val episodeNameShort = getString(R.string.episode_short)
|
||||
|
||||
if (name != null) {
|
||||
return if (rEpisode != null && rSeason != null) {
|
||||
"S${rSeason}:E${rEpisode} $name"
|
||||
"$seasonNameShort${rSeason}:$episodeNameShort${rEpisode} $name"
|
||||
} else if (rEpisode != null) {
|
||||
"Episode $rEpisode. $name"
|
||||
"$episodeName $rEpisode. $name"
|
||||
} else {
|
||||
name
|
||||
}
|
||||
} else {
|
||||
if (rEpisode != null && rSeason != null) {
|
||||
return "Season $rSeason - Episode $rEpisode"
|
||||
return "$seasonName $rSeason - $episodeName $rEpisode"
|
||||
} else if (rSeason == null) {
|
||||
return "Episode $rEpisode"
|
||||
return "$episodeName $rEpisode"
|
||||
}
|
||||
}
|
||||
return ""
|
||||
|
|
|
@ -1413,7 +1413,7 @@ object VideoDownloadManager {
|
|||
main {
|
||||
showToast( // can be replaced with regular Toast
|
||||
context,
|
||||
"${pkg.item.ep.mainName}${pkg.item.ep.episode?.let { " Episode $it " } ?: " "}queued",
|
||||
"${pkg.item.ep.mainName}${pkg.item.ep.episode?.let { " ${context.getString(R.string.episode)} $it " } ?: " "}${context.getString(R.string.queued)}",
|
||||
Toast.LENGTH_SHORT
|
||||
)
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
android:layout_gravity="center_vertical"
|
||||
android:id="@+id/download_child_episode_play"
|
||||
android:src="@drawable/ic_baseline_play_arrow_24"
|
||||
android:contentDescription="@string/episode_play_descript"/>
|
||||
android:contentDescription="@string/episode_play_des"/>
|
||||
<LinearLayout
|
||||
android:layout_gravity="center_vertical"
|
||||
android:orientation="vertical"
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
android:layout_margin="10dp"
|
||||
android:layout_gravity="end|center_vertical"
|
||||
app:tint="?attr/textColor"
|
||||
android:contentDescription="@string/change_providers_descript">
|
||||
android:contentDescription="@string/change_providers_des">
|
||||
</ImageView>
|
||||
</FrameLayout>
|
||||
|
||||
|
|
|
@ -22,14 +22,14 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:foreground="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/search_poster_descript"/>
|
||||
android:contentDescription="@string/search_poster_des"/>
|
||||
<ImageView
|
||||
android:focusable="false"
|
||||
android:clickable="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:src="@drawable/title_shadow"
|
||||
android:layout_gravity="bottom" android:contentDescription="@string/shadow_descript">
|
||||
android:layout_gravity="bottom" android:contentDescription="@string/shadow_des">
|
||||
</ImageView>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
android:layout_gravity="center_vertical"
|
||||
android:id="@+id/episode_play"
|
||||
android:src="@drawable/ic_baseline_play_arrow_24"
|
||||
android:contentDescription="@string/episode_play_descript"/>
|
||||
android:contentDescription="@string/episode_play_des"/>
|
||||
<TextView
|
||||
android:id="@+id/episode_text"
|
||||
android:layout_marginStart="10dp"
|
||||
|
|
|
@ -29,14 +29,14 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:foreground="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/search_poster_descript"/>
|
||||
android:contentDescription="@string/search_poster_des"/>
|
||||
<ImageView
|
||||
android:focusable="false"
|
||||
android:clickable="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:src="@drawable/title_shadow"
|
||||
android:layout_gravity="bottom" android:contentDescription="@string/shadow_descript">
|
||||
android:layout_gravity="bottom" android:contentDescription="@string/shadow_des">
|
||||
</ImageView>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:foreground="?android:attr/selectableItemBackgroundBorderless"
|
||||
tools:ignore="RtlHardcoded" android:contentDescription="@string/search_poster_descript"/>
|
||||
tools:ignore="RtlHardcoded" android:contentDescription="@string/search_poster_des"/>
|
||||
</androidx.cardview.widget.CardView>
|
||||
|
||||
<LinearLayout
|
||||
|
|
|
@ -6,15 +6,15 @@
|
|||
<string name="title_downloads">Λήψεις</string>
|
||||
<string name="title_settings">Ρυθμίσεις</string>
|
||||
<string name="search_hint">Ψάξε…</string>
|
||||
<string name="change_providers_descript">Αλλαγή Παροχών</string>
|
||||
<string name="change_providers_des">Αλλαγή Παροχών</string>
|
||||
<string name="search_providers_list_key">search_providers_list</string>
|
||||
<string name="search_types_list_key">search_type_list</string>
|
||||
<string name="grid_format_key">grid_format</string>
|
||||
<string name="search_poster_descript">Πόστερ</string>
|
||||
<string name="search_poster_des">Πόστερ</string>
|
||||
<string name="no_data">Χωρίς δεδομένα</string>
|
||||
<string name="shadow_descript">Σκιά</string>
|
||||
<string name="episode_more_options_descript">Περισσότερες Επιλογές</string>
|
||||
<string name="episode_play_descript">Αναπαραγωγή Επισοδείου</string>
|
||||
<string name="shadow_des">Σκιά</string>
|
||||
<string name="episode_more_options_des">Περισσότερες Επιλογές</string>
|
||||
<string name="episode_play_des">Αναπαραγωγή Επισοδείου</string>
|
||||
<string name="go_back">Πίσω</string>
|
||||
<string name="next_episode">Επόμενο Επισόδειο</string>
|
||||
<string name="player_skip_button_text">10</string>
|
||||
|
|
|
@ -6,15 +6,15 @@
|
|||
<string name="title_downloads">Downloads</string>
|
||||
<string name="title_settings">Instellingen</string>
|
||||
<string name="search_hint">Zoeken…</string>
|
||||
<string name="change_providers_descript">Aanbieders wijzigen</string>
|
||||
<string name="change_providers_des">Aanbieders wijzigen</string>
|
||||
<string name="search_providers_list_key">search_providers_list</string>
|
||||
<string name="search_types_list_key">search_type_list</string>
|
||||
<string name="grid_format_key">grid_format</string>
|
||||
<string name="search_poster_descript">Poster</string>
|
||||
<string name="search_poster_des">Poster</string>
|
||||
<string name="no_data">Geen gegevens</string>
|
||||
<string name="shadow_descript">Schaduw</string>
|
||||
<string name="episode_more_options_descript">Meer Opties</string>
|
||||
<string name="episode_play_descript">Aflevering afspelen</string>
|
||||
<string name="shadow_des">Schaduw</string>
|
||||
<string name="episode_more_options_des">Meer Opties</string>
|
||||
<string name="episode_play_des">Aflevering afspelen</string>
|
||||
<string name="go_back">Ga terug</string>
|
||||
<string name="next_episode">Volgende aflevering</string>
|
||||
<string name="player_skip_button_text">10</string>
|
||||
|
|
|
@ -15,15 +15,15 @@
|
|||
</array>
|
||||
|
||||
<array name="episode_long_click_options">
|
||||
<item>Chromecast Episode</item>
|
||||
<item>Chromecast Mirror</item>
|
||||
<item>Play In App</item>
|
||||
<item>Play In VLC</item>
|
||||
<item>Play In Browser</item>
|
||||
<item>Copy Link</item>
|
||||
<item>Auto Download</item>
|
||||
<item>Download Mirror</item>
|
||||
<item>Reload Links</item>
|
||||
<item>@string/episode_action_chomecast_episode</item>
|
||||
<item>@string/episode_action_chomecast_mirror</item>
|
||||
<item>@string/episode_action_play_in_app</item>
|
||||
<item>@string/episode_action_play_in_vlc</item>
|
||||
<item>@string/episode_action_play_in_browser</item>
|
||||
<item>@string/episode_action_copy_link</item>
|
||||
<item>@string/episode_action_auto_download</item>
|
||||
<item>@string/episode_action_download_mirror</item>
|
||||
<item>@string/episode_action_reload_links</item>
|
||||
</array>
|
||||
<array name="episode_long_click_options_values">
|
||||
<item>4</item>
|
||||
|
|
|
@ -1,20 +1,38 @@
|
|||
<!--https://newbedev.com/concatenate-multiple-strings-in-xml-->
|
||||
<resources>
|
||||
<!-- KEYS DON'T TRANSLATE -->
|
||||
<string name="search_providers_list_key" translatable="false">search_providers_list</string>
|
||||
<string name="locale_key" translatable="false">app_locale</string>
|
||||
<string name="search_types_list_key" translatable="false">search_type_list</string>
|
||||
<string name="grid_format_key" translatable="false">grid_format</string>
|
||||
<string name="auto_update_key" translatable="false">auto_update</string>
|
||||
<string name="prerelease_update_key" translatable="false">prerelease_update</string>
|
||||
<string name="manual_check_update_key" translatable="false">manual_check_update</string>
|
||||
<string name="fast_forward_button_time_key" translatable="false">fast_forward_button_time</string>
|
||||
|
||||
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
|
||||
<string name="extra_info_format" translatable="false">%d %s | %sMB</string>
|
||||
<string name="storage_size_format" translatable="false">%s • %sGB</string>
|
||||
<string name="download_size_format" translatable="false">%sMB / %sMB</string>
|
||||
<string name="episode_name_format" translatable="false">%s %s</string>
|
||||
<string name="ffw_text_format" translatable="false">+%d</string>
|
||||
<string name="rew_text_format" translatable="false">-%d</string>
|
||||
<string name="ffw_text_regular_format" translatable="false">%d</string>
|
||||
<string name="rew_text_regular_format" translatable="false">%d</string>
|
||||
<string name="player_speed_text_format" translatable="false">Speed (%fx)</string>
|
||||
|
||||
<string name="app_name">CloudStream</string>
|
||||
<string name="title_home">Home</string>
|
||||
<string name="title_search">Search</string>
|
||||
<string name="title_downloads">Downloads</string>
|
||||
<string name="title_settings">Settings</string>
|
||||
<string name="search_hint">Search…</string>
|
||||
<string name="change_providers_descript">Change Providers</string>
|
||||
<string name="search_providers_list_key">search_providers_list</string>
|
||||
<string name="search_types_list_key">search_type_list</string>
|
||||
<string name="grid_format_key">grid_format</string>
|
||||
<string name="search_poster_descript">Poster</string>
|
||||
<string name="change_providers_des">Change Providers</string>
|
||||
<string name="search_poster_des">Poster</string>
|
||||
<string name="no_data">No Data</string>
|
||||
<string name="shadow_descript">Shadow</string>
|
||||
<string name="episode_more_options_descript">More Options</string>
|
||||
<string name="episode_play_descript">Play Episode</string>
|
||||
<string name="shadow_des">Shadow</string>
|
||||
<string name="episode_more_options_des">More Options</string>
|
||||
<string name="episode_play_des">Play Episode</string>
|
||||
<string name="go_back">Go back</string>
|
||||
<string name="next_episode">Next episode</string>
|
||||
<string name="player_skip_button_text">10</string>
|
||||
|
@ -55,7 +73,6 @@
|
|||
<string name="popup_resume_download">Resume Download</string>
|
||||
<string name="popup_pause_download">Pause Download</string>
|
||||
|
||||
<string name="acra_report_toast">Sorry, the application crashed. An anonymous bug report will be sent to the developers</string>
|
||||
<string name="pref_disable_acra">Disable automatic bug reporting</string>
|
||||
<string name="home_more_info">More info</string>
|
||||
<string name="home_expanded_hide">Hide</string>
|
||||
|
@ -69,7 +86,6 @@
|
|||
<string name="filter_bookmarks">Filter Bookmarks</string>
|
||||
<string name="error_bookmarks_text">Bookmarks</string>
|
||||
<string name="action_remove_from_bookmarks">Remove</string>
|
||||
<string name="play_episode_toast">Play Episode</string>
|
||||
<string name="sort_apply">Apply</string>
|
||||
<string name="sort_cancel">Cancel</string>
|
||||
<string name="player_speed">Player Speed</string>
|
||||
|
@ -80,14 +96,11 @@
|
|||
<string name="subs_window_color">Window Color</string>
|
||||
<string name="subs_edge_type">Edge Type</string>
|
||||
<string name="subs_subtitle_elevation">Subtitle Elevation</string>
|
||||
<string name="subs_default_reset_toast">Reset to default value</string>
|
||||
<string name="preview_background">Preview Background</string>
|
||||
<string name="subs_font">Font</string>
|
||||
<string name="search_provider_text_providers">Search using providers</string>
|
||||
<string name="search_provider_text_types">Search using types</string>
|
||||
<string name="auto_update_key">auto_update</string>
|
||||
<string name="prerelease_update_key">prerelease_update</string>
|
||||
<string name="manual_check_update_key">manual_check_update</string>
|
||||
|
||||
<string name="benene_count">benene_count</string>
|
||||
<string name="benene_count_text">%d Benenes given to devs</string>
|
||||
<string name="benene_count_text_none">No Benenes given</string>
|
||||
|
@ -120,7 +133,8 @@
|
|||
<string name="swipe_to_change_settings">Swipe to change settings</string>
|
||||
<string name="swipe_to_change_settings_des">Swipe on the left or right side to change brightness or volume</string>
|
||||
<string name="double_tap_to_seek_setthings">Double tap to seek</string>
|
||||
<string name="double_tap_to_seek_setthings_des">Tap twice on the right or left side to seek forwards or backwards</string>
|
||||
<string name="double_tap_to_seek_setthings_des">Tap twice on the right or left side to seek forwards or backwards
|
||||
</string>
|
||||
<string name="search">Search</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="advanced_search">Advanced Search</string>
|
||||
|
@ -137,4 +151,65 @@
|
|||
<string name="discord">Join Discord</string>
|
||||
<string name="benene">Give a benene to the devs</string>
|
||||
<string name="benene_des">Given benene</string>
|
||||
|
||||
<string name="app_language">App Language</string>
|
||||
|
||||
<string name="no_chomecast_support_toast">This provider has no chromecast support</string>
|
||||
<string name="no_links_found_toast">"No Links Found"</string>
|
||||
<string name="copy_link_toast">Link copied to clipboard</string>
|
||||
<string name="play_episode_toast">Play Episode</string>
|
||||
<string name="subs_default_reset_toast">Reset to default value</string>
|
||||
<string name="acra_report_toast">Sorry, the application crashed. An anonymous bug report will be sent to the
|
||||
developers
|
||||
</string>
|
||||
|
||||
<string name="season">Season</string>
|
||||
<string name="no_season">No Season</string>
|
||||
<string name="episode">Episode</string>
|
||||
<string name="episodes">Episodes</string>
|
||||
<string name="season_short">S</string>
|
||||
<string name="episode_short">E</string>
|
||||
|
||||
<string name="delete_file">Delete File</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="delete_message">This will permanently delete %s\nAre you sure?</string>
|
||||
|
||||
<string name="status_ongoing">Ongoing</string>
|
||||
<string name="status_completed">Completed</string>
|
||||
<string name="status">Status</string>
|
||||
<string name="year">Year</string>
|
||||
<string name="rating">Rating</string>
|
||||
<string name="duration">Duration</string>
|
||||
<string name="site">Site</string>
|
||||
<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="free_storage">Free</string>
|
||||
<string name="used_storage">Used</string>
|
||||
<string name="app_storage">App</string>
|
||||
|
||||
<string name="movies">Movies</string>
|
||||
<string name="tv_series">TvSeries</string>
|
||||
<string name="cartoons">Cartoons</string>
|
||||
<string name="anime">Anime</string>
|
||||
<string name="torrent">Torrent</string>
|
||||
|
||||
<string name="source_error">Source error</string>
|
||||
<string name="remote_error">Remote error</string>
|
||||
<string name="render_error">Renderer error</string>
|
||||
<string name="unexpected_error">Unexpected player error</string>
|
||||
|
||||
<string name="episode_action_chomecast_episode">Chromecast Episode</string>
|
||||
<string name="episode_action_chomecast_mirror">Chromecast Mirror</string>
|
||||
<string name="episode_action_play_in_app">Play In App</string>
|
||||
<string name="episode_action_play_in_vlc">Play In VLC</string>
|
||||
<string name="episode_action_play_in_browser">Play in browser</string>
|
||||
<string name="episode_action_copy_link">Copy Link</string>
|
||||
<string name="episode_action_auto_download">Auto Download</string>
|
||||
<string name="episode_action_download_mirror">Download Mirror</string>
|
||||
<string name="episode_action_reload_links">Reload Links</string>
|
||||
</resources>
|
||||
|
|
|
@ -77,6 +77,11 @@
|
|||
android:title="@string/info"
|
||||
app:isPreferenceVisible="true"
|
||||
>
|
||||
<Preference
|
||||
android:key="@string/locale_key"
|
||||
android:title="@string/app_language"
|
||||
android:icon="@drawable/ic_outline_subtitles_24">
|
||||
</Preference>
|
||||
<SwitchPreference
|
||||
android:key="acra.disable"
|
||||
android:icon="@drawable/ic_baseline_bug_report_24"
|
||||
|
|
Loading…
Reference in a new issue