mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	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> | ||||
|  | @ -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> | ||||
|  |  | |||
|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue