forked from recloudstream/cloudstream
		
	added flags
This commit is contained in:
		
							parent
							
								
									f9b151ea8c
								
							
						
					
					
						commit
						8b097938a6
					
				
					 10 changed files with 277 additions and 613 deletions
				
			
		|  | @ -79,6 +79,7 @@ object CommonActivity { | ||||||
|             toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx) |             toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx) | ||||||
|             toast.duration = duration ?: Toast.LENGTH_SHORT |             toast.duration = duration ?: Toast.LENGTH_SHORT | ||||||
|             toast.view = layout |             toast.view = layout | ||||||
|  |             //https://github.com/PureWriter/ToastCompat | ||||||
|             toast.show() |             toast.show() | ||||||
|             currentToast = toast |             currentToast = toast | ||||||
|         } catch (e: Exception) { |         } catch (e: Exception) { | ||||||
|  |  | ||||||
|  | @ -13,10 +13,12 @@ class APIRepository(val api: MainAPI) { | ||||||
|         val noneApi = object : MainAPI() { |         val noneApi = object : MainAPI() { | ||||||
|             override var name = "None" |             override var name = "None" | ||||||
|             override val supportedTypes = emptySet<TvType>() |             override val supportedTypes = emptySet<TvType>() | ||||||
|  |             override val lang = "" | ||||||
|         } |         } | ||||||
|         val randomApi = object : MainAPI() { |         val randomApi = object : MainAPI() { | ||||||
|             override var name = "Random" |             override var name = "Random" | ||||||
|             override val supportedTypes = emptySet<TvType>() |             override val supportedTypes = emptySet<TvType>() | ||||||
|  |             override val lang = "" | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         fun isInvalidData(data: String): Boolean { |         fun isInvalidData(data: String): Boolean { | ||||||
|  |  | ||||||
|  | @ -25,6 +25,7 @@ import com.lagradost.cloudstream3.* | ||||||
| import com.lagradost.cloudstream3.APIHolder.apis | import com.lagradost.cloudstream3.APIHolder.apis | ||||||
| import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia | import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia | ||||||
| import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull | import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull | ||||||
|  | import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings | ||||||
| import com.lagradost.cloudstream3.AcraApplication.Companion.getKey | import com.lagradost.cloudstream3.AcraApplication.Companion.getKey | ||||||
| import com.lagradost.cloudstream3.AcraApplication.Companion.setKey | import com.lagradost.cloudstream3.AcraApplication.Companion.setKey | ||||||
| import com.lagradost.cloudstream3.mvvm.Resource | import com.lagradost.cloudstream3.mvvm.Resource | ||||||
|  | @ -50,6 +51,7 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState | ||||||
| import com.lagradost.cloudstream3.utils.Event | import com.lagradost.cloudstream3.utils.Event | ||||||
| import com.lagradost.cloudstream3.utils.HOMEPAGE_API | import com.lagradost.cloudstream3.utils.HOMEPAGE_API | ||||||
| import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectStringRes | import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectStringRes | ||||||
|  | import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe | import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar | import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarView | import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarView | ||||||
|  | @ -60,7 +62,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.setImageBlur | ||||||
| import com.lagradost.cloudstream3.widget.CenterZoomLayoutManager | import com.lagradost.cloudstream3.widget.CenterZoomLayoutManager | ||||||
| import kotlinx.android.synthetic.main.fragment_home.* | import kotlinx.android.synthetic.main.fragment_home.* | ||||||
| import kotlinx.android.synthetic.main.fragment_home.home_api_fab | import kotlinx.android.synthetic.main.fragment_home.home_api_fab | ||||||
| import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_child_more_info |  | ||||||
| import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_child_recyclerview | import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_child_recyclerview | ||||||
| import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_holder | import kotlinx.android.synthetic.main.fragment_home.home_bookmarked_holder | ||||||
| import kotlinx.android.synthetic.main.fragment_home.home_change_api | import kotlinx.android.synthetic.main.fragment_home.home_change_api | ||||||
|  | @ -169,6 +170,7 @@ class HomeFragment : Fragment() { | ||||||
|             builder.setContentView(R.layout.home_select_mainpage) |             builder.setContentView(R.layout.home_select_mainpage) | ||||||
|             builder.show() |             builder.show() | ||||||
|             builder.let { dialog -> |             builder.let { dialog -> | ||||||
|  |                 val isMultiLang = getApiProviderLangSettings().size > 1 | ||||||
|                 //dialog.window?.setGravity(Gravity.BOTTOM) |                 //dialog.window?.setGravity(Gravity.BOTTOM) | ||||||
| 
 | 
 | ||||||
|                 var currentApiName = selectedApiName |                 var currentApiName = selectedApiName | ||||||
|  | @ -223,10 +225,10 @@ class HomeFragment : Fragment() { | ||||||
|                         api.hasMainPage && api.supportedTypes.any { |                         api.hasMainPage && api.supportedTypes.any { | ||||||
|                             preSelectedTypes.contains(it) |                             preSelectedTypes.contains(it) | ||||||
|                         } |                         } | ||||||
|                     }.sortedBy { it.name }.toMutableList() |                     }.sortedBy { it.name.lowercase() }.toMutableList() | ||||||
|                     currentValidApis.addAll(0, validAPIs.subList(0, 2)) |                     currentValidApis.addAll(0, validAPIs.subList(0, 2)) | ||||||
| 
 | 
 | ||||||
|                     val names = currentValidApis.map { it.name } |                     val names = currentValidApis.map { if(isMultiLang) "${getFlagFromIso(it.lang)?.plus(" ") ?: ""}${it.name}" else it.name } | ||||||
|                     val index = names.indexOf(currentApiName) |                     val index = names.indexOf(currentApiName) | ||||||
|                     listView?.setItemChecked(index, true) |                     listView?.setItemChecked(index, true) | ||||||
|                     arrayAdapter.notifyDataSetChanged() |                     arrayAdapter.notifyDataSetChanged() | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ import com.google.android.material.button.MaterialButton | ||||||
| import com.lagradost.cloudstream3.* | import com.lagradost.cloudstream3.* | ||||||
| import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia | import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia | ||||||
| import com.lagradost.cloudstream3.APIHolder.getApiFromName | import com.lagradost.cloudstream3.APIHolder.getApiFromName | ||||||
|  | import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings | ||||||
| import com.lagradost.cloudstream3.APIHolder.getApiSettings | import com.lagradost.cloudstream3.APIHolder.getApiSettings | ||||||
| import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey | import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey | ||||||
| import com.lagradost.cloudstream3.mvvm.Resource | import com.lagradost.cloudstream3.mvvm.Resource | ||||||
|  | @ -35,6 +36,7 @@ import com.lagradost.cloudstream3.ui.home.ParentItemAdapter | ||||||
| import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings | import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings | ||||||
| import com.lagradost.cloudstream3.utils.DataStore.getKey | import com.lagradost.cloudstream3.utils.DataStore.getKey | ||||||
| import com.lagradost.cloudstream3.utils.DataStore.setKey | import com.lagradost.cloudstream3.utils.DataStore.setKey | ||||||
|  | import com.lagradost.cloudstream3.utils.SubtitleHelper | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe | import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar | import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount | import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount | ||||||
|  | @ -156,6 +158,8 @@ class SearchFragment : Fragment() { | ||||||
|                 builder.setContentView(R.layout.home_select_mainpage) |                 builder.setContentView(R.layout.home_select_mainpage) | ||||||
|                 builder.show() |                 builder.show() | ||||||
|                 builder.let { dialog -> |                 builder.let { dialog -> | ||||||
|  |                     val isMultiLang = ctx.getApiProviderLangSettings().size > 1 | ||||||
|  | 
 | ||||||
|                     val anime = dialog.findViewById<MaterialButton>(R.id.home_select_anime) |                     val anime = dialog.findViewById<MaterialButton>(R.id.home_select_anime) | ||||||
|                     val cartoons = dialog.findViewById<MaterialButton>(R.id.home_select_cartoons) |                     val cartoons = dialog.findViewById<MaterialButton>(R.id.home_select_cartoons) | ||||||
|                     val tvs = dialog.findViewById<MaterialButton>(R.id.home_select_tv_series) |                     val tvs = dialog.findViewById<MaterialButton>(R.id.home_select_tv_series) | ||||||
|  | @ -219,9 +223,13 @@ class SearchFragment : Fragment() { | ||||||
|                             api.supportedTypes.any { |                             api.supportedTypes.any { | ||||||
|                                 selectedSearchTypes.contains(it) |                                 selectedSearchTypes.contains(it) | ||||||
|                             } |                             } | ||||||
|                         }.sortedBy { it.name } |                         }.sortedBy { it.name.lowercase() } | ||||||
| 
 | 
 | ||||||
|                         val names = currentValidApis.map { it.name } |                         val names = currentValidApis.map {  if(isMultiLang) "${ | ||||||
|  |                             SubtitleHelper.getFlagFromIso( | ||||||
|  |                                 it.lang | ||||||
|  |                             )?.plus(" ") ?: "" | ||||||
|  |                         }${it.name}" else it.name } | ||||||
| 
 | 
 | ||||||
|                         for ((index, api) in names.withIndex()) { |                         for ((index, api) in names.withIndex()) { | ||||||
|                             listView?.setItemChecked(index, currentSelectedApis.contains(api)) |                             listView?.setItemChecked(index, currentSelectedApis.contains(api)) | ||||||
|  |  | ||||||
|  | @ -47,6 +47,7 @@ import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog | ||||||
| import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog | import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog | ||||||
| import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog | import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog | ||||||
| import com.lagradost.cloudstream3.utils.SubtitleHelper | import com.lagradost.cloudstream3.utils.SubtitleHelper | ||||||
|  | import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe | import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard | import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard | ||||||
| import com.lagradost.cloudstream3.utils.UIHelper.setImage | import com.lagradost.cloudstream3.utils.UIHelper.setImage | ||||||
|  | @ -124,27 +125,28 @@ class SettingsFragment : PreferenceFragmentCompat() { | ||||||
|     // idk, if you find a way of automating this it would be great |     // idk, if you find a way of automating this it would be great | ||||||
|     // https://www.iemoji.com/view/emoji/1794/flags/antarctica |     // https://www.iemoji.com/view/emoji/1794/flags/antarctica | ||||||
|     // Emoji Character Encoding Data --> C/C++/Java Src |     // Emoji Character Encoding Data --> C/C++/Java Src | ||||||
|  |     // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes leave blank for auto | ||||||
|     private val languages = arrayListOf( |     private val languages = arrayListOf( | ||||||
|         Triple("\uD83C\uDDEA\uD83C\uDDF8", "Spanish", "es"), |         Triple("", "Spanish", "es"), | ||||||
|         Triple("\uD83C\uDDEC\uD83C\uDDE7", "English", "en"), |         Triple("", "English", "en"), | ||||||
|         Triple("\uD83C\uDDFB\uD83C\uDDF3", "Viet Nam", "vi"), |         Triple("", "Viet Nam", "vi"), | ||||||
|         Triple("\uD83C\uDDF3\uD83C\uDDF1", "Dutch", "nl"), |         Triple("", "Dutch", "nl"), | ||||||
|         Triple("\uD83C\uDDEB\uD83C\uDDF7", "French", "fr"), |         Triple("", "French", "fr"), | ||||||
|         Triple("\uD83C\uDDEC\uD83C\uDDF7", "Greek", "gr"), |         Triple("", "Greek", "el"), | ||||||
|         Triple("\uD83C\uDDF8\uD83C\uDDEA", "Swedish", "sv"), |         Triple("", "Swedish", "sv"), | ||||||
|         Triple("\uD83C\uDDF5\uD83C\uDDED", "Tagalog", "tl"), |         Triple("", "Tagalog", "tl"), | ||||||
|         Triple("\uD83C\uDDF5\uD83C\uDDF1", "Polish", "pl"), |         Triple("", "Polish", "pl"), | ||||||
|         Triple("\uD83C\uDDEE\uD83C\uDDF3", "Hindi", "hi"), |         Triple("", "Hindi", "hi"), | ||||||
|         Triple("\uD83C\uDDEE\uD83C\uDDF3", "Malayalam", "ml"), |         Triple("", "Malayalam", "ml"), | ||||||
|         Triple("\uD83C\uDDF3\uD83C\uDDF4", "Norsk", "no"), |         Triple("", "Norsk", "no"), | ||||||
|         Triple("\ud83c\udde9\ud83c\uddea", "German", "de"), |         Triple("", "German", "de"), | ||||||
|         Triple("\ud83c\uddf1\ud83c\udde7", "Arabic", "ar"), |         Triple("", "Arabic", "ar"), | ||||||
|         Triple("\ud83c\uddf9\ud83c\uddf7", "Turkish", "tr"), |         Triple("", "Turkish", "tr"), | ||||||
|         Triple("\ud83c\uddf2\ud83c\uddf0", "Macedonian", "mk"), |         Triple("", "Macedonian", "mk"), | ||||||
|         Triple("\ud83c\udde7\ud83c\uddf7", "Portuguese (Brazil)", "pt"), |         Triple("", "Portuguese (Brazil)", "pt"), | ||||||
|         Triple("\ud83c\uddf7\ud83c\uddf4", "Romanian", "ro"), |         Triple("", "Romanian", "ro"), | ||||||
|         Triple("\uD83C\uDDEE\uD83C\uDDF9", "Italian", "it"), |         Triple("", "Italian", "it"), | ||||||
|         Triple("\uD83C\uDDE8\uD83C\uDDF3", "Chinese", "cn"), |         Triple("", "Chinese", "zh"), | ||||||
|     ).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top |     ).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top | ||||||
| 
 | 
 | ||||||
|     private fun showAccountSwitch(context: Context, api: AccountManager) { |     private fun showAccountSwitch(context: Context, api: AccountManager) { | ||||||
|  | @ -213,7 +215,7 @@ class SettingsFragment : PreferenceFragmentCompat() { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun getFolderSize(dir: File): Long { |     private fun getFolderSize(dir: File): Long { | ||||||
|         var size: Long = 0 |         var size: Long = 0 | ||||||
|         dir.listFiles()?.let { |         dir.listFiles()?.let { | ||||||
|             for (file in it) { |             for (file in it) { | ||||||
|  | @ -397,12 +399,10 @@ class SettingsFragment : PreferenceFragmentCompat() { | ||||||
|                     currentList.add(allLangs.indexOf(i)) |                     currentList.add(allLangs.indexOf(i)) | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 val names = allLangs.mapNotNull { |                 val names = allLangs.map { | ||||||
|                     val fullName = SubtitleHelper.fromTwoLettersToLanguage(it) |                     val emoji = getFlagFromIso(it) | ||||||
|                     if (fullName.isNullOrEmpty()) { |                     val name = SubtitleHelper.fromTwoLettersToLanguage(it) | ||||||
|                         return@mapNotNull null |                     val fullName = "$emoji $name" | ||||||
|                     } |  | ||||||
| 
 |  | ||||||
|                     Pair(it, fullName) |                     Pair(it, fullName) | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  | @ -671,7 +671,11 @@ class SettingsFragment : PreferenceFragmentCompat() { | ||||||
|             } |             } | ||||||
|             val current = getCurrentLocale() |             val current = getCurrentLocale() | ||||||
|             val languageCodes = tempLangs.map { it.third } |             val languageCodes = tempLangs.map { it.third } | ||||||
|             val languageNames = tempLangs.map { "${it.first}  ${it.second}" } |             val languageNames = tempLangs.map { (emoji, name, iso) -> | ||||||
|  |                 val flag = emoji.ifBlank { getFlagFromIso(iso) ?: "ERROR" } | ||||||
|  | 
 | ||||||
|  |                 "$flag $name" | ||||||
|  |             } | ||||||
|             val index = languageCodes.indexOf(current) |             val index = languageCodes.indexOf(current) | ||||||
| 
 | 
 | ||||||
|             activity?.showDialog( |             activity?.showDialog( | ||||||
|  |  | ||||||
|  | @ -180,6 +180,7 @@ object BackupUtils { | ||||||
| 
 | 
 | ||||||
|     fun FragmentActivity.restorePrompt() { |     fun FragmentActivity.restorePrompt() { | ||||||
|         runOnUiThread { |         runOnUiThread { | ||||||
|  |             try { | ||||||
|                 restoreFileSelector?.launch( |                 restoreFileSelector?.launch( | ||||||
|                     arrayOf( |                     arrayOf( | ||||||
|                         "text/plain", |                         "text/plain", | ||||||
|  | @ -190,6 +191,10 @@ object BackupUtils { | ||||||
|                         "content/unknown", |                         "content/unknown", | ||||||
|                     ) |                     ) | ||||||
|                 ) |                 ) | ||||||
|  |             } catch (e : Exception) { | ||||||
|  |                 showToast(this,e.message) | ||||||
|  |                 logError(e) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,9 @@ | ||||||
| package com.lagradost.cloudstream3.utils | package com.lagradost.cloudstream3.utils | ||||||
| 
 | 
 | ||||||
|  | import com.lagradost.cloudstream3.mvvm.logError | ||||||
| import java.util.* | import java.util.* | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| object SubtitleHelper { | object SubtitleHelper { | ||||||
|     data class Language639( |     data class Language639( | ||||||
|         val languageName: String, |         val languageName: String, | ||||||
|  | @ -111,6 +113,191 @@ object SubtitleHelper { | ||||||
|         return null |         return null | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private const val flagOffset = 0x1F1E6 | ||||||
|  |     private const val asciiOffset = 0x41 | ||||||
|  |     private const val offset = flagOffset - asciiOffset | ||||||
|  | 
 | ||||||
|  |     fun getFlagFromIso(inp: String?): String? { | ||||||
|  |         try { | ||||||
|  |             flags[inp ?: return null]?.let { flagAscii -> | ||||||
|  |                 val firstChar: Int = Character.codePointAt(flagAscii, 0) + offset | ||||||
|  |                 val secondChar: Int = Character.codePointAt(flagAscii, 1) + offset | ||||||
|  | 
 | ||||||
|  |                 return (String(Character.toChars(firstChar)) + String(Character.toChars(secondChar))) | ||||||
|  |             } | ||||||
|  |             return null | ||||||
|  |         } catch (e: Exception) { | ||||||
|  |             logError(e) | ||||||
|  |             return null | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private val flags = mapOf( | ||||||
|  |         "af" to "ZA", | ||||||
|  |         "agq" to "CM", | ||||||
|  |         "ak" to "GH", | ||||||
|  |         "am" to "ET", | ||||||
|  |         "ar" to "AE", | ||||||
|  |         "as" to "IN", | ||||||
|  |         "asa" to "TZ", | ||||||
|  |         "az" to "AZ", | ||||||
|  |         "bas" to "CM", | ||||||
|  |         "be" to "BY", | ||||||
|  |         "bem" to "ZM", | ||||||
|  |         "bez" to "IT", | ||||||
|  |         "bg" to "BG", | ||||||
|  |         "bm" to "ML", | ||||||
|  |         "bn" to "BD", | ||||||
|  |         "bo" to "CN", | ||||||
|  |         "br" to "FR", | ||||||
|  |         "brx" to "IN", | ||||||
|  |         "bs" to "BA", | ||||||
|  |         "ca" to "ES", | ||||||
|  |         "cgg" to "UG", | ||||||
|  |         "chr" to "US", | ||||||
|  |         "cs" to "CZ", | ||||||
|  |         "cy" to "GB", | ||||||
|  |         "da" to "DK", | ||||||
|  |         "dav" to "KE", | ||||||
|  |         "de" to "DE", | ||||||
|  |         "dje" to "NE", | ||||||
|  |         "dua" to "CM", | ||||||
|  |         "dyo" to "SN", | ||||||
|  |         "ebu" to "KE", | ||||||
|  |         "ee" to "GH", | ||||||
|  |         "en" to "GB", | ||||||
|  |         "el" to "GR", | ||||||
|  |         "es" to "ES", | ||||||
|  |         "et" to "EE", | ||||||
|  |         "eu" to "ES", | ||||||
|  |         "ewo" to "CM", | ||||||
|  |         "fa" to "IR", | ||||||
|  |         "fil" to "PH", | ||||||
|  |         "fr" to "FR", | ||||||
|  |         "ga" to "IE", | ||||||
|  |         "gl" to "ES", | ||||||
|  |         "gsw" to "CH", | ||||||
|  |         "gu" to "IN", | ||||||
|  |         "guz" to "KE", | ||||||
|  |         "gv" to "GB", | ||||||
|  |         "ha" to "NG", | ||||||
|  |         "haw" to "US", | ||||||
|  |         "he" to "IL", | ||||||
|  |         "hi" to "IN", | ||||||
|  |         "ff" to "CN", | ||||||
|  |         "fi" to "FI", | ||||||
|  |         "fo" to "FO", | ||||||
|  |         "hr" to "HR", | ||||||
|  |         "hu" to "HU", | ||||||
|  |         "hy" to "AM", | ||||||
|  |         "id" to "ID", | ||||||
|  |         "ig" to "NG", | ||||||
|  |         "ii" to "CN", | ||||||
|  |         "is" to "IS", | ||||||
|  |         "it" to "IT", | ||||||
|  |         "ita" to "IT", | ||||||
|  |         "ja" to "JP", | ||||||
|  |         "jmc" to "TZ", | ||||||
|  |         "ka" to "GE", | ||||||
|  |         "kab" to "DZ", | ||||||
|  |         "ki" to "KE", | ||||||
|  |         "kam" to "KE", | ||||||
|  |         "mer" to "KE", | ||||||
|  |         "kde" to "TZ", | ||||||
|  |         "kea" to "CV", | ||||||
|  |         "khq" to "ML", | ||||||
|  |         "kk" to "KZ", | ||||||
|  |         "kl" to "GL", | ||||||
|  |         "kln" to "KE", | ||||||
|  |         "km" to "KH", | ||||||
|  |         "kn" to "IN", | ||||||
|  |         "ko" to "KR", | ||||||
|  |         "kok" to "IN", | ||||||
|  |         "ksb" to "TZ", | ||||||
|  |         "ksf" to "CM", | ||||||
|  |         "kw" to "GB", | ||||||
|  |         "lag" to "TZ", | ||||||
|  |         "lg" to "UG", | ||||||
|  |         "ln" to "CG", | ||||||
|  |         "lt" to "LT", | ||||||
|  |         "lu" to "CD", | ||||||
|  |         "lv" to "LV", | ||||||
|  |         "lat" to "LV", | ||||||
|  |         "luo" to "KE", | ||||||
|  |         "luy" to "KE", | ||||||
|  |         "mas" to "TZ", | ||||||
|  |         "mfe" to "MU", | ||||||
|  |         "mg" to "MG", | ||||||
|  |         "mgh" to "MZ", | ||||||
|  |         "ml" to "IN", | ||||||
|  |         "mk" to "MK", | ||||||
|  |         "mr" to "IN", | ||||||
|  |         "ms" to "MY", | ||||||
|  |         "mt" to "MT", | ||||||
|  |         "mua" to "CM", | ||||||
|  |         "my" to "MM", | ||||||
|  |         "naq" to "NA", | ||||||
|  |         "nb" to "NO", | ||||||
|  |         "no" to "NO", | ||||||
|  |         "nn" to "NO", | ||||||
|  |         "nd" to "ZW", | ||||||
|  |         "ne" to "NP", | ||||||
|  |         "nl" to "NL", | ||||||
|  |         "nmg" to "CM", | ||||||
|  |         "nus" to "SD", | ||||||
|  |         "nyn" to "UG", | ||||||
|  |         "om" to "ET", | ||||||
|  |         "or" to "IN", | ||||||
|  |         "pa" to "PK", | ||||||
|  |         "pl" to "PL", | ||||||
|  |         "ps" to "AF", | ||||||
|  |         "pt" to "PT", | ||||||
|  |         "rm" to "CH", | ||||||
|  |         "rn" to "BI", | ||||||
|  |         "ro" to "RO", | ||||||
|  |         "ru" to "RU", | ||||||
|  |         "rw" to "RW", | ||||||
|  |         "rof" to "TZ", | ||||||
|  |         "rwk" to "TZ", | ||||||
|  |         "saq" to "KE", | ||||||
|  |         "sbp" to "TZ", | ||||||
|  |         "seh" to "MZ", | ||||||
|  |         "ses" to "ML", | ||||||
|  |         "sg" to "CF", | ||||||
|  |         "shi" to "MA", | ||||||
|  |         "si" to "LK", | ||||||
|  |         "sk" to "SK", | ||||||
|  |         "sl" to "SI", | ||||||
|  |         "sn" to "ZW", | ||||||
|  |         "so" to "SO", | ||||||
|  |         "sq" to "AL", | ||||||
|  |         "sr" to "RS", | ||||||
|  |         "sv" to "SE", | ||||||
|  |         "sw" to "TZ", | ||||||
|  |         "swc" to "CD", | ||||||
|  |         "ta" to "IN", | ||||||
|  |         "te" to "IN", | ||||||
|  |         "teo" to "UG", | ||||||
|  |         "th" to "TH", | ||||||
|  |         "ti" to "ET", | ||||||
|  |         "to" to "TO", | ||||||
|  |         "tr" to "TR", | ||||||
|  |         "twq" to "NE", | ||||||
|  |         "tzm" to "MA", | ||||||
|  |         "uk" to "UA", | ||||||
|  |         "ur" to "PK", | ||||||
|  |         "uz" to "UZ", | ||||||
|  |         "vai" to "LR", | ||||||
|  |         "vi" to "VN", | ||||||
|  |         "vun" to "TZ", | ||||||
|  |         "xog" to "UG", | ||||||
|  |         "yav" to "CM", | ||||||
|  |         "yo" to "NG", | ||||||
|  |         "zh" to "CN", | ||||||
|  |         "zu" to "ZA", | ||||||
|  |         "tl" to "PH", | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|     val languages = listOf( |     val languages = listOf( | ||||||
|         Language639("Abkhaz", "аҧсуа бызшәа, аҧсшәа", "ab", "abk", "abk", "abk", "abks"), |         Language639("Abkhaz", "аҧсуа бызшәа, аҧсшәа", "ab", "abk", "abk", "abk", "abks"), | ||||||
|         Language639("Afar", "Afaraf", "aa", "aar", "aar", "aar", "aars"), |         Language639("Afar", "Afaraf", "aa", "aar", "aar", "aar", "aars"), | ||||||
|  |  | ||||||
|  | @ -1341,7 +1341,12 @@ object VideoDownloadManager { | ||||||
|         return getFileName(context, metadata.name, metadata.episode, metadata.season) |         return getFileName(context, metadata.name, metadata.episode, metadata.season) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun getFileName(context: Context, epName: String?, episode: Int?, season: Int?): String { |     private fun getFileName( | ||||||
|  |         context: Context, | ||||||
|  |         epName: String?, | ||||||
|  |         episode: Int?, | ||||||
|  |         season: Int? | ||||||
|  |     ): String { | ||||||
|         // kinda ugly ik |         // kinda ugly ik | ||||||
|         return sanitizeFilename( |         return sanitizeFilename( | ||||||
|             if (epName == null) { |             if (epName == null) { | ||||||
|  | @ -1489,6 +1494,7 @@ object VideoDownloadManager { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun getDownloadFileInfo(context: Context, id: Int): DownloadedFileInfoResult? { |     private fun getDownloadFileInfo(context: Context, id: Int): DownloadedFileInfoResult? { | ||||||
|  |         try { | ||||||
|             val info = |             val info = | ||||||
|                 context.getKey<DownloadedFileInfo>(KEY_DOWNLOAD_INFO, id.toString()) ?: return null |                 context.getKey<DownloadedFileInfo>(KEY_DOWNLOAD_INFO, id.toString()) ?: return null | ||||||
|             val base = basePathToFile(context, info.basePath) |             val base = basePathToFile(context, info.basePath) | ||||||
|  | @ -1496,7 +1502,8 @@ object VideoDownloadManager { | ||||||
|             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && base.isDownloadDir()) { |             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && base.isDownloadDir()) { | ||||||
|                 val cr = context.contentResolver ?: return null |                 val cr = context.contentResolver ?: return null | ||||||
|                 val fileUri = |                 val fileUri = | ||||||
|                 cr.getExistingDownloadUriOrNullQ(info.relativePath, info.displayName) ?: return null |                     cr.getExistingDownloadUriOrNullQ(info.relativePath, info.displayName) | ||||||
|  |                         ?: return null | ||||||
|                 val fileLength = cr.getFileLength(fileUri) ?: return null |                 val fileLength = cr.getFileLength(fileUri) ?: return null | ||||||
|                 if (fileLength == 0L) return null |                 if (fileLength == 0L) return null | ||||||
|                 return DownloadedFileInfoResult(fileLength, info.totalBytes, fileUri) |                 return DownloadedFileInfoResult(fileLength, info.totalBytes, fileUri) | ||||||
|  | @ -1511,6 +1518,10 @@ object VideoDownloadManager { | ||||||
| 
 | 
 | ||||||
|                 return DownloadedFileInfoResult(file.size(), info.totalBytes, file.uri) |                 return DownloadedFileInfoResult(file.size(), info.totalBytes, file.uri) | ||||||
|             } |             } | ||||||
|  |         } catch (e: Exception) { | ||||||
|  |             logError(e) | ||||||
|  |             return null | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  |  | ||||||
|  | @ -1,430 +0,0 @@ | ||||||
| <!--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> |  | ||||||
|     <string name="benene_count" translatable="false">benene_count</string> |  | ||||||
|     <string name="subtitle_settings_key" translatable="false">subtitle_settings_key</string> |  | ||||||
|     <string name="subtitle_settings_chromecast_key" translatable="false">subtitle_settings_chromecast_key</string> |  | ||||||
|     <string name="quality_pref_key" translatable="false">quality_pref_key</string> |  | ||||||
|     <string name="video_buffer_size_key" translatable="false">video_buffer_size_key</string> |  | ||||||
|     <string name="video_buffer_length_key" translatable="false">video_buffer_length_key</string> |  | ||||||
|     <string name="video_buffer_clear_key" translatable="false">video_buffer_clear_key</string> |  | ||||||
|     <string name="video_buffer_disk_key" translatable="false">video_buffer_disk_key</string> |  | ||||||
|     <string name="prerelease_commit_hash" translatable="false">unknown_prerelease</string> |  | ||||||
|     <string name="use_system_brightness_key" translatable="false">use_system_brightness_key</string> |  | ||||||
|     <string name="swipe_enabled_key" translatable="false">swipe_enabled_key</string> |  | ||||||
|     <string name="playback_speed_enabled_key" translatable="false">playback_speed_enabled_key</string> |  | ||||||
|     <string name="player_resize_enabled_key" translatable="false">player_resize_enabled_key</string> |  | ||||||
|     <string name="pip_enabled_key" translatable="false">pip_enabled_key</string> |  | ||||||
|     <string name="double_tap_enabled_key" translatable="false">double_tap_enabled_key</string> |  | ||||||
|     <string name="double_tap_pause_enabled_key" translatable="false">double_tap_pause_enabled_key</string> |  | ||||||
|     <string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string> |  | ||||||
|     <string name="display_sub_key" translatable="false">display_sub_key</string> |  | ||||||
|     <string name="show_fillers_key" translatable="false">show_fillers_key</string> |  | ||||||
|     <string name="provider_lang_key" translatable="false">provider_lang_key</string> |  | ||||||
|     <string name="dns_key" translatable="false">dns_key</string> |  | ||||||
|     <string name="download_path_key" translatable="false">download_path_key</string> |  | ||||||
|     <string name="app_name_download_path" translatable="false">Cloudstream</string> |  | ||||||
|     <string name="app_layout_key" translatable="false">app_layout_key</string> |  | ||||||
|     <string name="primary_color_key" translatable="false">primary_color_key</string> |  | ||||||
|     <string name="restore_key" translatable="false">restore_key</string> |  | ||||||
|     <string name="killswitch_key" translatable="false">killswitch_key</string> |  | ||||||
|     <string name="backup_key" translatable="false">backup_key</string> |  | ||||||
|     <string name="prefer_media_type_key" translatable="false">prefer_media_type_key</string> |  | ||||||
|     <string name="app_theme_key" translatable="false">app_theme_key</string> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     <!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG --> |  | ||||||
|     <string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string> |  | ||||||
|     <string name="storage_size_format" translatable="false" formatted="true">%s • %sGB</string> |  | ||||||
|     <string name="download_size_format" translatable="false" formatted="true">%sMB / %sMB</string> |  | ||||||
|     <string name="mb_format" translatable="false" formatted="true">%dMB</string> |  | ||||||
|     <string name="episode_name_format" translatable="false" formatted="true">%s %s</string> |  | ||||||
|     <string name="ffw_text_format" translatable="false" formatted="true">+%d</string> |  | ||||||
|     <string name="rew_text_format" translatable="false" formatted="true">-%d</string> |  | ||||||
|     <string name="ffw_text_regular_format" translatable="false" formatted="true">%d</string> |  | ||||||
|     <string name="rew_text_regular_format" translatable="false" formatted="true">%d</string> |  | ||||||
|     <string name="rating_format" translatable="false" formatted="true">%.1f/10.0</string> |  | ||||||
|     <string name="year_format" translatable="false" formatted="true">%d</string> |  | ||||||
|     <string name="app_dub_sub_episode_text_format" formatted="true">%s 共%d集</string> |  | ||||||
|     <string name="cast_format" formatted="true">演员:%s</string> |  | ||||||
| 
 |  | ||||||
|     <!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS --> |  | ||||||
|     <string name="result_poster_img_des">海报</string> |  | ||||||
|     <string name="search_poster_img_des">@string/result_poster_img_des</string> |  | ||||||
|     <string name="episode_poster_img_des">剧集海报</string> |  | ||||||
|     <string name="home_main_poster_img_des">主海报</string> |  | ||||||
|     <string name="home_next_random_img_des">随机下一个</string> |  | ||||||
|     <string name="episode_play_img_des" translatable="false">@string/play_episode</string> |  | ||||||
|     <string name="go_back_img_des">返回</string> |  | ||||||
|     <string name="change_providers_img_des" translatable="false">@string/home_change_provider_img_des</string> |  | ||||||
|     <string name="home_change_provider_img_des">更改内容提供者</string> |  | ||||||
|     <string name="preview_background_img_des">预览背景</string> |  | ||||||
| 
 |  | ||||||
|     <!-- TRANSLATE, BUT DON'T FORGET FORMAT --> |  | ||||||
|     <string name="player_speed_text_format" formatted="true">速度(%.2fx)</string> |  | ||||||
|     <string name="rated_format" formatted="true">评分:%.1f</string> |  | ||||||
|     <string name="new_update_format" formatted="true">发现新版本!\n%s -> %s</string> |  | ||||||
|     <string name="filler" formatted="true">填充</string> |  | ||||||
|     <string name="duration_format" formatted="true">%d分钟</string> |  | ||||||
| 
 |  | ||||||
|     <string name="app_name">CloudStream</string> |  | ||||||
|     <string name="title_home">主页</string> |  | ||||||
|     <string name="title_search">搜索</string> |  | ||||||
|     <string name="title_downloads">下载</string> |  | ||||||
|     <string name="title_settings">设置</string> |  | ||||||
| 
 |  | ||||||
|     <string name="search_hint">搜索…</string> |  | ||||||
|     <string name="no_data">无数据</string> |  | ||||||
|     <string name="episode_more_options_des">更多选项</string> |  | ||||||
|     <string name="next_episode">下一集</string> |  | ||||||
|     <string name="result_plot" translatable="false">@string/synopsis</string> |  | ||||||
|     <string name="result_tags">类型</string> |  | ||||||
|     <string name="result_share">分享</string> |  | ||||||
|     <string name="result_open_in_browser">在浏览器中打开</string> |  | ||||||
|     <string name="skip_loading">跳过加载</string> |  | ||||||
|     <string name="loading_chromecast">正在加载…</string> |  | ||||||
| 
 |  | ||||||
|     <string name="type_watching">正在观看</string> |  | ||||||
|     <string name="type_on_hold">暂时搁置</string> |  | ||||||
|     <string name="type_completed">观看完毕</string> |  | ||||||
|     <string name="type_dropped">放弃观看</string> |  | ||||||
|     <string name="type_plan_to_watch">计划观看</string> |  | ||||||
|     <string name="type_none">无</string> |  | ||||||
|     <string name="type_re_watching">重新观看</string> |  | ||||||
| 
 |  | ||||||
|     <string name="play_movie_button">播放电影</string> |  | ||||||
|     <string name="play_torrent_button">串流Torrent</string> |  | ||||||
|     <string name="pick_source">来源</string> |  | ||||||
|     <string name="pick_subtitle">字幕</string> |  | ||||||
|     <string name="reload_error">重试连接…</string> |  | ||||||
|     <string name="go_back">返回</string> |  | ||||||
|     <string name="play_episode">播放剧集</string> |  | ||||||
|     <!--<string name="need_storage">Allow to download episodes</string>--> |  | ||||||
| 
 |  | ||||||
|     <string name="download">下载</string> |  | ||||||
|     <string name="downloaded">已下载</string> |  | ||||||
|     <string name="downloading">正在下载</string> |  | ||||||
|     <string name="download_paused">下载暂停</string> |  | ||||||
|     <string name="download_started">下载开始</string> |  | ||||||
|     <string name="download_failed">下载失败</string> |  | ||||||
|     <string name="download_canceled">下载取消</string> |  | ||||||
|     <string name="download_done">下载完毕</string> |  | ||||||
|     <string name="download_format" translatable="false">%s - %s</string> |  | ||||||
| 
 |  | ||||||
|     <string name="error_loading_links_toast">加载链接时出错</string> |  | ||||||
|     <string name="download_storage_text">内部存储</string> |  | ||||||
| 
 |  | ||||||
|     <string name="app_dubbed_text">配音</string> |  | ||||||
|     <string name="app_subbed_text">字幕</string> |  | ||||||
| 
 |  | ||||||
|     <string name="popup_delete_file">删除文件</string> |  | ||||||
|     <string name="popup_play_file">播放文件</string> |  | ||||||
|     <string name="popup_resume_download">继续下载</string> |  | ||||||
|     <string name="popup_pause_download">暂停下载</string> |  | ||||||
| 
 |  | ||||||
|     <string name="pref_disable_acra">禁用自动错误报告</string> |  | ||||||
|     <string name="home_more_info">更多信息</string> |  | ||||||
|     <string name="home_expanded_hide">隐藏</string> |  | ||||||
|     <string name="home_play">播放</string> |  | ||||||
|     <string name="home_info">信息</string> |  | ||||||
|     <string name="filter_bookmarks">筛选书签</string> |  | ||||||
|     <string name="error_bookmarks_text">书签</string> |  | ||||||
|     <string name="action_remove_from_bookmarks">移除</string> |  | ||||||
|     <string name="action_add_to_bookmarks">设置观看状态</string> |  | ||||||
|     <string name="sort_apply">应用</string> |  | ||||||
|     <string name="sort_cancel">取消</string> |  | ||||||
|     <string name="player_speed">播放速度</string> |  | ||||||
| 
 |  | ||||||
|     <string name="subtitles_settings">字幕设置</string> |  | ||||||
|     <string name="subs_text_color">文本颜色</string> |  | ||||||
|     <string name="subs_outline_color">轮廓颜色</string> |  | ||||||
|     <string name="subs_background_color">背景颜色</string> |  | ||||||
|     <string name="subs_window_color">窗口颜色</string> |  | ||||||
|     <string name="subs_edge_type">边缘类型</string> |  | ||||||
|     <string name="subs_subtitle_elevation">字幕高度</string> |  | ||||||
|     <string name="subs_font">字体</string> |  | ||||||
|     <string name="subs_font_size">字体大小</string> |  | ||||||
| 
 |  | ||||||
|     <string name="search_provider_text_providers">按内容提供者搜索</string> |  | ||||||
|     <string name="search_provider_text_types">按类型搜索</string> |  | ||||||
| 
 |  | ||||||
|     <string name="benene_count_text">送给开发者%d根香蕉</string> |  | ||||||
|     <string name="benene_count_text_none">不送香蕉</string> |  | ||||||
| 
 |  | ||||||
|     <string name="subs_auto_select_language">自动选择语言</string> |  | ||||||
|     <string name="subs_download_languages">下载语言</string> |  | ||||||
|     <string name="subs_hold_to_reset_to_default">按住重置为默认值</string> |  | ||||||
|     <string name="continue_watching">继续观看</string> |  | ||||||
| 
 |  | ||||||
|     <string name="action_remove_watching">移除</string> |  | ||||||
|     <string name="action_open_watching">更多信息</string> |  | ||||||
|     <string name="action_open_play">@string/home_play </string> |  | ||||||
| 
 |  | ||||||
|     <string name="vpn_might_be_needed">此内容提供者可能需要VPN才能正常工作</string> |  | ||||||
|     <string name="vpn_torrent">此内容提供者是一个Torrent,建议使用VPN</string> |  | ||||||
| 
 |  | ||||||
|     <string name="provider_info_meta">站点不提供元数据,如果站点上不存在元数据,视频加载将失败。</string> |  | ||||||
| 
 |  | ||||||
|     <string name="torrent_plot">简介</string> |  | ||||||
|     <string name="normal_no_plot">没有找到简介</string> |  | ||||||
|     <string name="torrent_no_plot">没有找到简介</string> |  | ||||||
| 
 |  | ||||||
|     <string name="picture_in_picture">画中画</string> |  | ||||||
|     <string name="picture_in_picture_des">在其他应用之上的迷你播放器中继续播放</string> |  | ||||||
|     <string name="player_size_settings">播放器画面调整按钮</string> |  | ||||||
|     <string name="player_size_settings_des">移除黑色边框</string> |  | ||||||
|     <string name="player_subtitles_settings">字幕</string> |  | ||||||
|     <string name="player_subtitles_settings_des">播放器字幕设置</string> |  | ||||||
|     <string name="chromecast_subtitles_settings">投屏字幕</string> |  | ||||||
|     <string name="chromecast_subtitles_settings_des">投屏字幕设置</string> |  | ||||||
| 
 |  | ||||||
|     <string name="eigengraumode_settings">本征模式</string> |  | ||||||
|     <string name="eigengraumode_settings_des">在播放器中添加播放速度选项</string> |  | ||||||
|     <string name="swipe_to_seek_settings">滑动控制进度</string> |  | ||||||
|     <string name="swipe_to_seek_settings_des">向屏幕左侧或右侧滑动来控制播放进度</string> |  | ||||||
|     <string name="swipe_to_change_settings">滑动更改设置</string> |  | ||||||
|     <string name="swipe_to_change_settings_des">在屏幕左侧或右侧滑动来更改亮度或音量</string> |  | ||||||
|     <string name="double_tap_to_seek_settings">双击控制进度</string> |  | ||||||
|     <string name="double_tap_to_pause_settings">双击暂停</string> |  | ||||||
|     <string name="double_tap_to_seek_settings_des">在屏幕左侧或右侧双击来快进或快退 |  | ||||||
|     </string> |  | ||||||
|     <string name="double_tap_to_pause_settings_des">双击屏幕中间暂停</string> |  | ||||||
|     <string name="use_system_brightness_settings">使用系统亮度</string> |  | ||||||
|     <string name="use_system_brightness_settings_des">在app player中使用系统亮度,而不是黑色遮罩 |  | ||||||
|     </string> |  | ||||||
| 
 |  | ||||||
|     <string name="restore_settings">从备份中恢复数据</string> |  | ||||||
|     <string name="killswitch_settings">从github下载最新元数据</string> |  | ||||||
|     <string name="killswitch_settings_des">如果你想访问所有的内容提供者(即使是损坏的),请关闭此选项</string> |  | ||||||
| 
 |  | ||||||
|     <string name="backup_settings">备份数据</string> |  | ||||||
|     <string name="restore_success">已加载备份文件</string> |  | ||||||
|     <string name="restore_failed_format" formatted="true">无法从文件%s中还原数据</string> |  | ||||||
|     <string name="backup_success">成功存储数据</string> |  | ||||||
|     <string name="backup_failed">缺少存储权限,请重试</string> |  | ||||||
|     <string name="backup_failed_error_format">备份%s时出错</string> |  | ||||||
| 
 |  | ||||||
|     <string name="search">搜索</string> |  | ||||||
|     <string name="settings_info">信息</string> |  | ||||||
|     <string name="advanced_search">高级搜索</string> |  | ||||||
|     <string name="advanced_search_des">给出按内容提供者分隔的搜索结果</string> |  | ||||||
|     <string name="bug_report_settings_off">只发送关于崩溃的数据</string> |  | ||||||
|     <string name="bug_report_settings_on">不发送数据</string> |  | ||||||
|     <string name="show_fillers_settings">为动画显示下一集</string> |  | ||||||
|     <string name="updates_settings">显示应用更新</string> |  | ||||||
|     <string name="updates_settings_des">启动时自动搜索更新</string> |  | ||||||
|     <string name="uprereleases_settings">更新至预览版</string> |  | ||||||
|     <string name="uprereleases_settings_des">搜索预览版更新,而不是仅搜索完整版本</string> |  | ||||||
|     <string name="github">Github</string> |  | ||||||
|     <string name="lightnovel">由同一开发者开发的轻小说应用</string> |  | ||||||
|     <string name="anim">由同一开发者开发的动漫应用</string> |  | ||||||
|     <string name="discord">加入Discord</string> |  | ||||||
|     <string name="benene">送给开发者一根香蕉</string> |  | ||||||
|     <string name="benene_des">送香蕉</string> |  | ||||||
| 
 |  | ||||||
|     <string name="app_language">应用语言</string> |  | ||||||
| 
 |  | ||||||
|     <string name="no_chromecast_support_toast">该内容提供者不支持投屏</string> |  | ||||||
|     <string name="no_links_found_toast">没有找到链接</string> |  | ||||||
|     <string name="copy_link_toast">链接已复制到剪贴板</string> |  | ||||||
|     <string name="play_episode_toast">播放剧集</string> |  | ||||||
|     <string name="subs_default_reset_toast">重置为默认值</string> |  | ||||||
|     <string name="acra_report_toast">抱歉,应用崩溃了,将向开发人员发送一份匿名Bug报告 |  | ||||||
|     </string> |  | ||||||
| 
 |  | ||||||
|     <string name="season">季</string> |  | ||||||
|     <string name="no_season">没有季</string> |  | ||||||
|     <string name="episode">集</string> |  | ||||||
|     <string name="episodes">集</string> |  | ||||||
|     <string name="season_short">S</string> |  | ||||||
|     <string name="episode_short">E</string> |  | ||||||
|     <string name="no_episodes_found">没有找到剧集</string> |  | ||||||
| 
 |  | ||||||
|     <string name="delete_file">删除文件</string> |  | ||||||
|     <string name="delete">删除</string> |  | ||||||
|     <string name="cancel" translatable="false">@string/sort_cancel</string> |  | ||||||
|     <string name="pause">暂停</string> |  | ||||||
|     <string name="resume">继续</string> |  | ||||||
|     <string name="go_back_30">-30</string> |  | ||||||
|     <string name="go_forward_30">+30</string> |  | ||||||
|     <string name="delete_message" formatted="true">这将永久删除%s\n你确定吗?</string> |  | ||||||
|     <string name="resume_time_left" formatted="true">剩余%d分钟\n</string> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     <string name="status_ongoing">连载中</string> |  | ||||||
|     <string name="status_completed">已完结</string> |  | ||||||
|     <string name="status">状态</string> |  | ||||||
|     <string name="year">年份</string> |  | ||||||
|     <string name="rating">评分</string> |  | ||||||
|     <string name="duration">持续时间</string> |  | ||||||
|     <string name="site">网站</string> |  | ||||||
|     <string name="synopsis">简介</string> |  | ||||||
| 
 |  | ||||||
|     <string name="queued">队列</string> |  | ||||||
|     <string name="no_subtitles">无字幕</string> |  | ||||||
|     <string name="default_subtitles">默认</string> |  | ||||||
| 
 |  | ||||||
|     <string name="free_storage">空闲</string> |  | ||||||
|     <string name="used_storage">已使用</string> |  | ||||||
|     <string name="app_storage">应用</string> |  | ||||||
| 
 |  | ||||||
|     <!--plural--> |  | ||||||
|     <string name="movies">电影</string> |  | ||||||
|     <string name="tv_series">剧集</string> |  | ||||||
|     <string name="cartoons">卡通</string> |  | ||||||
|     <string name="anime">动漫</string> |  | ||||||
|     <string name="torrent">Torrents</string> |  | ||||||
|     <string name="documentaries">纪录片</string> |  | ||||||
|     <string name="ova">OVA</string> |  | ||||||
| 
 |  | ||||||
|     <!--singular--> |  | ||||||
|     <string name="movies_singular">电影</string> |  | ||||||
|     <string name="tv_series_singular">剧集</string> |  | ||||||
|     <string name="cartoons_singular">卡通</string> |  | ||||||
|     <string name="anime_singular">@string/anime</string> |  | ||||||
|     <string name="ova_singular">@string/ova</string> |  | ||||||
|     <string name="torrent_singular">Torrent</string> |  | ||||||
|     <string name="documentaries_singular">纪录片</string> |  | ||||||
| 
 |  | ||||||
|     <string name="source_error">源错误</string> |  | ||||||
|     <string name="remote_error">远程错误</string> |  | ||||||
|     <string name="render_error">渲染器错误</string> |  | ||||||
|     <string name="unexpected_error">意外的播放器错误</string> |  | ||||||
|     <string name="storage_error">下载错误,请检查存储权限</string> |  | ||||||
| 
 |  | ||||||
|     <string name="episode_action_chromecast_episode">投屏剧集</string> |  | ||||||
|     <string name="episode_action_chromecast_mirror">投屏镜像</string> |  | ||||||
|     <string name="episode_action_play_in_app">在应用程序中播放</string> |  | ||||||
|     <string name="episode_action_play_in_vlc">在VLC中播放</string> |  | ||||||
|     <string name="episode_action_play_in_browser">在浏览器中播放</string> |  | ||||||
|     <string name="episode_action_copy_link">复制链接</string> |  | ||||||
|     <string name="episode_action_auto_download">自动下载</string> |  | ||||||
|     <string name="episode_action_download_mirror">下载镜像</string> |  | ||||||
|     <string name="episode_action_reload_links">重新加载链接</string> |  | ||||||
| 
 |  | ||||||
|     <string name="no_update_found">找不到更新</string> |  | ||||||
|     <string name="check_for_update">检查更新</string> |  | ||||||
| 
 |  | ||||||
|     <string name="video_lock">锁定</string> |  | ||||||
|     <string name="video_aspect_ratio_resize">调整画面</string> |  | ||||||
|     <string name="video_source">来源</string> |  | ||||||
|     <string name="video_skip_op">跳过OP</string> |  | ||||||
| 
 |  | ||||||
|     <string name="dont_show_again">不再显示</string> |  | ||||||
|     <string name="update">更新</string> |  | ||||||
|     <string name="watch_quality_pref">首选播放质量</string> |  | ||||||
|     <string name="video_buffer_size_settings">视频缓冲大小</string> |  | ||||||
|     <string name="video_buffer_length_settings">视频缓冲时长</string> |  | ||||||
|     <string name="video_buffer_disk_settings">磁盘上的视频缓存</string> |  | ||||||
|     <string name="video_buffer_clear_settings">清除视频和图像缓存</string> |  | ||||||
| 
 |  | ||||||
|     <string name="video_ram_description">如果设置太高,可能会在内存较低的系统(如Android TV设备或旧手机)上导致问题 </string> |  | ||||||
|     <string name="video_disk_description">如果将存储空间设置得太高,可能会导致Android TV设备等存储空间不足的系统出现问题  </string> |  | ||||||
| 
 |  | ||||||
|     <string name="dns_pref">DNS over HTTPS</string> |  | ||||||
|     <string name="dns_pref_summary">用于忽略ISP块</string> |  | ||||||
| 
 |  | ||||||
|     <string name="download_path_pref">下载路径</string> |  | ||||||
| 
 |  | ||||||
|     <string name="display_subbed_dubbed_settings">显示有配音/字幕的动画</string> |  | ||||||
| 
 |  | ||||||
|     <string name="resize_fit">适应屏幕</string> |  | ||||||
|     <string name="resize_fill">拉伸</string> |  | ||||||
|     <string name="resize_zoom">缩放</string> |  | ||||||
| 
 |  | ||||||
|     <string name="legal_notice">免责声明</string> |  | ||||||
|     <string name="legal_notice_key" translatable="false">legal_notice_key</string> |  | ||||||
|     <string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application |  | ||||||
|         should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. |  | ||||||
| 
 |  | ||||||
|         In case of copyright infringement, please directly contact the responsible parties or the streaming websites. |  | ||||||
| 
 |  | ||||||
|         The app is purely for educational and personal use. |  | ||||||
| 
 |  | ||||||
|         CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. |  | ||||||
|         CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or |  | ||||||
|         manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, |  | ||||||
|         user-friendly interface. |  | ||||||
| 
 |  | ||||||
|         It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the |  | ||||||
|         responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use |  | ||||||
|         CloudStream 3 at your own risk. |  | ||||||
|     </string> |  | ||||||
|     <string name="general">全局</string> |  | ||||||
|     <string name="provider_lang_settings">内容提供者语言</string> |  | ||||||
|     <string name="app_layout">应用布局</string> |  | ||||||
|     <string name="preferred_media_settings">首选媒体</string> |  | ||||||
| 
 |  | ||||||
|     <string name="automatic">自动</string> |  | ||||||
|     <string name="tv_layout">电视布局</string> |  | ||||||
|     <string name="phone_layout">手机布局</string> |  | ||||||
|     <string name="emulator_layout">模拟器布局</string> |  | ||||||
| 
 |  | ||||||
|     <string name="primary_color_settings">主题色</string> |  | ||||||
|     <string name="app_theme_settings">应用主题</string> |  | ||||||
| 
 |  | ||||||
|     <!-- account stuff --> |  | ||||||
|     <string name="anilist_key" translatable="false">anilist_key</string> |  | ||||||
|     <string name="mal_key" translatable="false">mal_key</string> |  | ||||||
|     <!-- |  | ||||||
|     <string name="mal_account_settings" translatable="false">MAL</string> |  | ||||||
|     <string name="anilist_account_settings" translatable="false">AniList</string> |  | ||||||
|     <string name="tmdb_account_settings" translatable="false">TMDB</string> |  | ||||||
|     <string name="imdb_account_settings" translatable="false">IMDB</string> |  | ||||||
|     <string name="kitsu_account_settings" translatable="false">Kitsu</string> |  | ||||||
|     <string name="trakt_account_settings" translatable="false">Trakt</string> |  | ||||||
|     --> |  | ||||||
|     <string name="login_format" formatted="true">%s %s</string> |  | ||||||
|     <string name="account">账户</string> |  | ||||||
|     <string name="logout">注销</string> |  | ||||||
|     <string name="login">登录</string> |  | ||||||
|     <string name="switch_account">切换账户</string> |  | ||||||
|     <string name="add_account">添加帐户</string> |  | ||||||
|     <string name="add_sync">添加跟踪</string> |  | ||||||
|     <string name="added_sync_format" formatted="true">已添加%s</string> |  | ||||||
|     <string name="upload_sync">同步</string> |  | ||||||
| 
 |  | ||||||
|     <!-- ============ --> |  | ||||||
|     <string name="none">无</string> |  | ||||||
|     <string name="normal">普通</string> |  | ||||||
|     <string name="all">全部</string> |  | ||||||
|     <string name="max">最大</string> |  | ||||||
|     <string name="min">最小</string> |  | ||||||
|     <string name="subtitles_none" translatable="false">@string/none</string> |  | ||||||
|     <string name="subtitles_outline">轮廓</string> |  | ||||||
|     <string name="subtitles_depressed">降低</string> |  | ||||||
|     <string name="subtitles_shadow">阴影</string> |  | ||||||
|     <string name="subtitles_raised">提高</string> |  | ||||||
|     <string name="subtitle_offset">同步字幕</string> |  | ||||||
|     <string name="subtitle_offset_hint">1000ms</string> |  | ||||||
|     <string name="subtitle_offset_title">字幕延迟</string> |  | ||||||
|     <string name="subtitle_offset_extra_hint_later_format">如果字幕过早显示%dms,请使用此选项 </string> |  | ||||||
|     <string name="subtitle_offset_extra_hint_before_format">如果字幕过晚显示%dms,请使用此选项</string> |  | ||||||
|     <string name="subtitle_offset_extra_hint_none_format">无字幕延迟</string> |  | ||||||
| 
 |  | ||||||
|     <!-- |  | ||||||
|     Example text (pangram) can optionally be translated; if you do, include all the letters in the alphabet, |  | ||||||
|     see: |  | ||||||
| 	https://en.wikipedia.org/w/index.php?title=Pangram&oldid=225849300 |  | ||||||
| 	https://en.wikipedia.org/wiki/The_quick_brown_fox_jumps_over_the_lazy_dog |  | ||||||
|     --> |  | ||||||
|     <string name="subtitles_example_text">一只敏捷的棕色狐狸跳过一只懒惰的狗</string> |  | ||||||
| 
 |  | ||||||
|     <string name="recommended">推荐</string> |  | ||||||
|     <string name="player_loaded_subtitles" formatted="true">已加载%s</string> |  | ||||||
|     <string name="player_load_subtitles">从文件加载</string> |  | ||||||
|     <string name="downloaded_file">下载的文件</string> |  | ||||||
|     <string name="actor_main">主演</string> |  | ||||||
|     <string name="actor_supporting">配演</string> |  | ||||||
|     <string name="actor_background">群演</string> |  | ||||||
| 
 |  | ||||||
|     <string name="home_source">来源</string> |  | ||||||
| </resources> |  | ||||||
|  | @ -1,126 +0,0 @@ | ||||||
| <!--https://newbedev.com/concatenate-multiple-strings-in-xml--> |  | ||||||
| <resources> |  | ||||||
|     <string name="app_name">CloudStream</string> |  | ||||||
|     <string name="title_home">Αρχική</string> |  | ||||||
|     <string name="title_search">Αναζήτηση</string> |  | ||||||
|     <string name="title_downloads">Λήψεις</string> |  | ||||||
|     <string name="title_settings">Ρυθμίσεις</string> |  | ||||||
|     <string name="search_hint">Ψάξε…</string> |  | ||||||
|     <string name="search_poster_img_des">Πόστερ</string> |  | ||||||
|     <string name="no_data">Χωρίς δεδομένα</string> |  | ||||||
|     <string name="episode_more_options_des">Περισσότερες Επιλογές</string> |  | ||||||
|     <string name="go_back_img_des">Πίσω</string> |  | ||||||
|     <string name="next_episode">Επόμενο Επισόδειο</string> |  | ||||||
|     <string name="result_poster_img_des">Πόστερ</string> |  | ||||||
|     <string name="synopsis">Πλοκή</string> |  | ||||||
|     <string name="result_tags">Genres</string> |  | ||||||
|     <string name="result_share">Μοίρασε</string> |  | ||||||
|     <string name="result_open_in_browser">Άνοιγμα στον περιηγητή</string> |  | ||||||
|     <string name="skip_loading">Προσπέραση φορτώματος</string> |  | ||||||
|     <string name="loading_chromecast">Φόρτωση…</string> |  | ||||||
| 
 |  | ||||||
|     <string name="type_watching">Watching</string> |  | ||||||
|     <string name="type_on_hold">On-Hold</string> |  | ||||||
|     <string name="type_completed">Completed</string> |  | ||||||
|     <string name="type_dropped">Dropped</string> |  | ||||||
|     <string name="type_plan_to_watch">Plan to Watch</string> |  | ||||||
|     <string name="type_none">None</string> |  | ||||||
| 
 |  | ||||||
|     <string name="play_movie_button">Αναπαραγωγή Ταινείας</string> |  | ||||||
|     <string name="play_torrent_button">Μετάδοση Torrent</string> |  | ||||||
|     <string name="pick_source">Πηγές</string> |  | ||||||
|     <string name="pick_subtitle">Υπότιτλοι</string> |  | ||||||
|     <string name="reload_error">Ξανά φόρτωσε…</string> |  | ||||||
|     <string name="go_back">Πίσω</string> |  | ||||||
|     <string name="episode_poster_img_des">Πόστερ</string> |  | ||||||
|     <string name="play_episode">Αναπαραγωγή Επισοδείου</string> |  | ||||||
|     <!--<string name="need_storage">Δώσε άδεια για την λήψη επισοδείου</string>--> |  | ||||||
|     <string name="download">Λήξη</string> |  | ||||||
|     <string name="error_loading_links_toast">Σφάλμα φόρτωσεις συνδέσμων</string> |  | ||||||
|     <string name="download_storage_text">Εσωτερικός χώρος</string> |  | ||||||
|     <!--<string name="options">Επιλογές</string>--> |  | ||||||
| 
 |  | ||||||
|     <string name="app_dubbed_text">Dub</string> |  | ||||||
|     <string name="app_subbed_text">Sub</string> |  | ||||||
| 
 |  | ||||||
|     <string name="popup_delete_file">Διαγραφή Αρχείου</string> |  | ||||||
|     <string name="popup_play_file">Αναπαραγωγή Αρχείου</string> |  | ||||||
|     <string name="popup_resume_download">Συνέχιση Λήψης</string> |  | ||||||
|     <string name="popup_pause_download">Παύση Λήψης</string> |  | ||||||
| 
 |  | ||||||
|     <string name="acra_report_toast">Λυπούμαστε, η εφαρμογή κατέρρευσε. Μια ανώνυμη αναφορά σφαλμάτων θα σταλεί στους προγραμματιστές</string> |  | ||||||
|     <string name="pref_disable_acra">Απενεργοποιήστε την αυτόματη αναφορά σφαλμάτων</string> |  | ||||||
|     <string name="home_more_info">Παραπάνω πληροφορίες</string> |  | ||||||
|     <string name="home_expanded_hide">Κρύψιμο</string> |  | ||||||
|     <string name="home_main_poster_img_des">Κύριο Πόστερ</string> |  | ||||||
|     <string name="home_play">Αναπαραγωγή</string> |  | ||||||
|     <string name="home_info">Πληροφορίες</string> |  | ||||||
|     <string name="home_next_random_img_des">Next Random</string> |  | ||||||
|     <string name="home_change_provider_img_des">Change Provider</string> |  | ||||||
|     <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">Αναπαραγωγή Episode</string> |  | ||||||
|     <string name="sort_apply">Υποβολή</string> |  | ||||||
|     <string name="sort_cancel">Ακύρωση</string> |  | ||||||
|     <string name="player_speed">Ταχύτητα αναπαραγωγής</string> |  | ||||||
|     <string name="subtitles_settings">Ρυθμίσεις υπότιτλων</string> |  | ||||||
|     <string name="subs_text_color">Χρώμα κείμενου</string> |  | ||||||
|     <string name="subs_outline_color">Χρώμα περιγράμματος</string> |  | ||||||
|     <string name="subs_background_color">Χρώμα φόντου</string> |  | ||||||
|     <string name="subs_window_color">Χρώμα παραθύρου</string> |  | ||||||
|     <string name="subs_edge_type">Τύπος άκρων</string> |  | ||||||
|     <string name="subs_subtitle_elevation">Ύψωση υπότιτλων</string> |  | ||||||
|     <string name="subs_default_reset_toast">Επαναφορά στην προεπιλεγμένη τιμή</string> |  | ||||||
|     <string name="preview_background_img_des">Προεπισκόπηση φόντου</string> |  | ||||||
|     <string name="subs_font">Γραμματοσειρά</string> |  | ||||||
|     <string name="search_provider_text_providers">Αναζήτηση με τους παρόχους</string> |  | ||||||
|     <string name="search_provider_text_types">Αναζήτηση με τύπους</string> |  | ||||||
|     <string name="benene_count_text">%d Benenes given to devs</string> |  | ||||||
|     <string name="benene_count_text_none">No Benenes given</string> |  | ||||||
| 
 |  | ||||||
|     <string name="subs_auto_select_language">Αυτόματη επιλογή γλώσσας</string> |  | ||||||
|     <string name="subs_download_languages">Λήψη γλωσσών</string> |  | ||||||
|     <string name="subs_hold_to_reset_to_default">Κρατήστε πατημένο για επαναφορά στα προεπιλεγμένα</string> |  | ||||||
|     <string name="continue_watching">Συνέχεια Παρακολούθησης</string> |  | ||||||
| 
 |  | ||||||
|     <string name="action_remove_watching">Αφαίρεση</string> |  | ||||||
|     <string name="action_open_watching">Παραπάνω Πληροφορίες</string> |  | ||||||
| 
 |  | ||||||
|     <string name="vpn_might_be_needed">A VPN might be needed for this provider to work correctly</string> |  | ||||||
|     <string name="vpn_torrent">This providers is a torrent, a VPN is recommended</string> |  | ||||||
|     <string name="torrent_plot">Περιγραφή</string> |  | ||||||
|     <string name="normal_no_plot">Δεν βρέθηκε περιγραφή</string> |  | ||||||
|     <string name="torrent_no_plot">Δεν βρέθηκε περιγραφή</string> |  | ||||||
|      |  | ||||||
|     <string name="picture_in_picture">Picture-in-picture</string> |  | ||||||
|     <string name="picture_in_picture_des">Συνεχίζει την αναπαραγωγή σε ένα μίνι παίκτη πάνω από άλλες εφαρμογές</string> |  | ||||||
|     <string name="player_size_settings">Αλλαγή μεγέθους παίκτη</string> |  | ||||||
|     <string name="player_size_settings_des">Αφαίρεση μαύρων περιγραμμάτων</string> |  | ||||||
|     <string name="player_subtitles_settings">Υπότιτλοι</string> |  | ||||||
|     <string name="player_subtitles_settings_des">Ρυθμίσεις υποτίτλων του παίκτη</string> |  | ||||||
|     <string name="eigengraumode_settings">Eigengrau Mode</string> |  | ||||||
|     <string name="eigengraumode_settings_des">Προσθέτει την επιλογή ταχύτητας στον παίκτη</string> |  | ||||||
|     <string name="swipe_to_seek_settings">Σύρετε για seek</string> |  | ||||||
|     <string name="swipe_to_seek_settings_des">Σύρετε αριστερά ή δεξιά για να ελέγξετε τον χρόνο στον παίκτη</string> |  | ||||||
|     <string name="swipe_to_change_settings">Σύρετε για να αλλάξετε ρυθμίσεις</string> |  | ||||||
|     <string name="swipe_to_change_settings_des">Σύρετε αριστερά ή δεξιά για να αλλάξετε τη φωτεινότητα ή την ένταση</string> |  | ||||||
|     <string name="double_tap_to_seek_settings">Διπλό πάτημα για seek</string> |  | ||||||
|     <string name="double_tap_to_seek_settings_des">Διπλό πάτημα στα αριστερά ή δεξιά για seek μπροστά ή πίσω</string> |  | ||||||
|     <string name="search">Αναζήτηση</string> |  | ||||||
|     <string name="settings_info">Πληροφορείες</string> |  | ||||||
|     <string name="advanced_search">Προχωρημένη Αναζήτηση</string> |  | ||||||
|     <string name="advanced_search_des">Δίνει τα αποτελέσματα αναζήτησης χωρισμένα ανά πάροχο</string> |  | ||||||
|     <string name="bug_report_settings_off">Αποστέλλει δεδομένα μόνο για σφάλματα</string> |  | ||||||
|     <string name="bug_report_settings_on">Δεν στέλνει δεδομένα</string> |  | ||||||
|     <string name="updates_settings">Εμφάνιση ενημερώσεων</string> |  | ||||||
|     <string name="updates_settings_des">Αυτόματη αναζήτηση νέων ενημερώσεων</string> |  | ||||||
|     <string name="uprereleases_settings">Ενημέρωση σε προ-εκδόσεις</string> |  | ||||||
|     <string name="uprereleases_settings_des">Αναζητήστε ενημερώσεις προ-εκδόσεων αντί για κανονικές εκδόσεις</string> |  | ||||||
|     <string name="github">Github</string> |  | ||||||
|     <string name="lightnovel">Light novel app by the same devs</string> |  | ||||||
|     <string name="anim">Anime app by the same devs</string> |  | ||||||
|     <string name="discord">Join Discord</string> |  | ||||||
|     <string name="benene">Δώσε benene στους devs</string> |  | ||||||
|     <string name="benene_des">Βenene δώθηκε</string> |  | ||||||
| </resources> |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue