locale changes

This commit is contained in:
LagradOst 2021-09-02 15:19:50 +02:00
parent a5834db72f
commit 6cc3bcc1dd
23 changed files with 244 additions and 142 deletions

View file

@ -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()
}
}

View file

@ -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(

View file

@ -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
}

View file

@ -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))

View file

@ -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()

View file

@ -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)
}
}
}

View file

@ -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()

View file

@ -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

View file

@ -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)
}

View file

@ -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 -> {

View file

@ -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 ""

View file

@ -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
)
}

View file

@ -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"

View file

@ -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>

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>
@ -106,7 +119,7 @@
<string name="torrent_plot">Description</string>
<string name="normal_no_plot">No Plot Found</string>
<string name="torrent_no_plot">No Description Found</string>
<string name="picture_in_picture">Picture-in-picture</string>
<string name="picture_in_picture_des">Continues playback in a miniature player on top of other apps</string>
<string name="player_size_settings">Player resize button</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>

View file

@ -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"