From 8b097938a65156362af92da01a7a30a23bf3295f Mon Sep 17 00:00:00 2001 From: LagradOst <11805592+LagradOst@users.noreply.github.com> Date: Wed, 6 Apr 2022 17:16:08 +0200 Subject: [PATCH] added flags --- .../lagradost/cloudstream3/CommonActivity.kt | 1 + .../cloudstream3/ui/APIRepository.kt | 2 + .../cloudstream3/ui/home/HomeFragment.kt | 8 +- .../cloudstream3/ui/search/SearchFragment.kt | 12 +- .../ui/settings/SettingsFragment.kt | 60 +-- .../cloudstream3/utils/BackupUtils.kt | 23 +- .../cloudstream3/utils/SubtitleHelper.kt | 187 ++++++++ .../utils/VideoDownloadManager.kt | 41 +- app/src/main/res/values-cn/strings.xml | 430 ------------------ app/src/main/res/values-gr/strings.xml | 126 ----- 10 files changed, 277 insertions(+), 613 deletions(-) delete mode 100644 app/src/main/res/values-cn/strings.xml delete mode 100644 app/src/main/res/values-gr/strings.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt index fd01c1f2..4ea8991a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt @@ -79,6 +79,7 @@ object CommonActivity { toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx) toast.duration = duration ?: Toast.LENGTH_SHORT toast.view = layout + //https://github.com/PureWriter/ToastCompat toast.show() currentToast = toast } catch (e: Exception) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt index 1dd65ae2..d1ba5f12 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt @@ -13,10 +13,12 @@ class APIRepository(val api: MainAPI) { val noneApi = object : MainAPI() { override var name = "None" override val supportedTypes = emptySet() + override val lang = "" } val randomApi = object : MainAPI() { override var name = "Random" override val supportedTypes = emptySet() + override val lang = "" } fun isInvalidData(data: String): Boolean { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 8b8faedf..da214a20 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -25,6 +25,7 @@ import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia 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.setKey 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.HOMEPAGE_API 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.fixPaddingStatusbar 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 kotlinx.android.synthetic.main.fragment_home.* 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_holder 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.show() builder.let { dialog -> + val isMultiLang = getApiProviderLangSettings().size > 1 //dialog.window?.setGravity(Gravity.BOTTOM) var currentApiName = selectedApiName @@ -223,10 +225,10 @@ class HomeFragment : Fragment() { api.hasMainPage && api.supportedTypes.any { preSelectedTypes.contains(it) } - }.sortedBy { it.name }.toMutableList() + }.sortedBy { it.name.lowercase() }.toMutableList() 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) listView?.setItemChecked(index, true) arrayAdapter.notifyDataSetChanged() diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index e8351b34..3184f2ed 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -22,6 +22,7 @@ import com.google.android.material.button.MaterialButton import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia import com.lagradost.cloudstream3.APIHolder.getApiFromName +import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings import com.lagradost.cloudstream3.APIHolder.getApiSettings import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey 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.utils.DataStore.getKey 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.fixPaddingStatusbar import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount @@ -156,6 +158,8 @@ class SearchFragment : Fragment() { builder.setContentView(R.layout.home_select_mainpage) builder.show() builder.let { dialog -> + val isMultiLang = ctx.getApiProviderLangSettings().size > 1 + val anime = dialog.findViewById(R.id.home_select_anime) val cartoons = dialog.findViewById(R.id.home_select_cartoons) val tvs = dialog.findViewById(R.id.home_select_tv_series) @@ -219,9 +223,13 @@ class SearchFragment : Fragment() { api.supportedTypes.any { 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()) { listView?.setItemChecked(index, currentSelectedApis.contains(api)) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index 1609e258..d0958d12 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -47,6 +47,7 @@ import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog 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.hideKeyboard 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 // https://www.iemoji.com/view/emoji/1794/flags/antarctica // 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( - Triple("\uD83C\uDDEA\uD83C\uDDF8", "Spanish", "es"), - Triple("\uD83C\uDDEC\uD83C\uDDE7", "English", "en"), - Triple("\uD83C\uDDFB\uD83C\uDDF3", "Viet Nam", "vi"), - Triple("\uD83C\uDDF3\uD83C\uDDF1", "Dutch", "nl"), - Triple("\uD83C\uDDEB\uD83C\uDDF7", "French", "fr"), - Triple("\uD83C\uDDEC\uD83C\uDDF7", "Greek", "gr"), - Triple("\uD83C\uDDF8\uD83C\uDDEA", "Swedish", "sv"), - Triple("\uD83C\uDDF5\uD83C\uDDED", "Tagalog", "tl"), - Triple("\uD83C\uDDF5\uD83C\uDDF1", "Polish", "pl"), - Triple("\uD83C\uDDEE\uD83C\uDDF3", "Hindi", "hi"), - Triple("\uD83C\uDDEE\uD83C\uDDF3", "Malayalam", "ml"), - Triple("\uD83C\uDDF3\uD83C\uDDF4", "Norsk", "no"), - Triple("\ud83c\udde9\ud83c\uddea", "German", "de"), - Triple("\ud83c\uddf1\ud83c\udde7", "Arabic", "ar"), - Triple("\ud83c\uddf9\ud83c\uddf7", "Turkish", "tr"), - Triple("\ud83c\uddf2\ud83c\uddf0", "Macedonian", "mk"), - Triple("\ud83c\udde7\ud83c\uddf7", "Portuguese (Brazil)", "pt"), - Triple("\ud83c\uddf7\ud83c\uddf4", "Romanian", "ro"), - Triple("\uD83C\uDDEE\uD83C\uDDF9", "Italian", "it"), - Triple("\uD83C\uDDE8\uD83C\uDDF3", "Chinese", "cn"), + Triple("", "Spanish", "es"), + Triple("", "English", "en"), + Triple("", "Viet Nam", "vi"), + Triple("", "Dutch", "nl"), + Triple("", "French", "fr"), + Triple("", "Greek", "el"), + Triple("", "Swedish", "sv"), + Triple("", "Tagalog", "tl"), + Triple("", "Polish", "pl"), + Triple("", "Hindi", "hi"), + Triple("", "Malayalam", "ml"), + Triple("", "Norsk", "no"), + Triple("", "German", "de"), + Triple("", "Arabic", "ar"), + Triple("", "Turkish", "tr"), + Triple("", "Macedonian", "mk"), + Triple("", "Portuguese (Brazil)", "pt"), + Triple("", "Romanian", "ro"), + Triple("", "Italian", "it"), + Triple("", "Chinese", "zh"), ).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top 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 dir.listFiles()?.let { for (file in it) { @@ -397,12 +399,10 @@ class SettingsFragment : PreferenceFragmentCompat() { currentList.add(allLangs.indexOf(i)) } - val names = allLangs.mapNotNull { - val fullName = SubtitleHelper.fromTwoLettersToLanguage(it) - if (fullName.isNullOrEmpty()) { - return@mapNotNull null - } - + val names = allLangs.map { + val emoji = getFlagFromIso(it) + val name = SubtitleHelper.fromTwoLettersToLanguage(it) + val fullName = "$emoji $name" Pair(it, fullName) } @@ -671,7 +671,11 @@ class SettingsFragment : PreferenceFragmentCompat() { } val current = getCurrentLocale() 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) activity?.showDialog( diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt index d851f5f8..022b2285 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/BackupUtils.kt @@ -180,16 +180,21 @@ object BackupUtils { fun FragmentActivity.restorePrompt() { runOnUiThread { - restoreFileSelector?.launch( - arrayOf( - "text/plain", - "text/str", - "text/x-unknown", - "application/json", - "unknown/unknown", - "content/unknown", + try { + restoreFileSelector?.launch( + arrayOf( + "text/plain", + "text/str", + "text/x-unknown", + "application/json", + "unknown/unknown", + "content/unknown", + ) ) - ) + } catch (e : Exception) { + showToast(this,e.message) + logError(e) + } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt index ec3f8a8e..a34f30c6 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt @@ -1,7 +1,9 @@ package com.lagradost.cloudstream3.utils +import com.lagradost.cloudstream3.mvvm.logError import java.util.* + object SubtitleHelper { data class Language639( val languageName: String, @@ -111,6 +113,191 @@ object SubtitleHelper { 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( Language639("Abkhaz", "аҧсуа бызшәа, аҧсшәа", "ab", "abk", "abk", "abk", "abks"), Language639("Afar", "Afaraf", "aa", "aar", "aar", "aar", "aars"), diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt index b1d0c18b..9f6de453 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt @@ -1341,7 +1341,12 @@ object VideoDownloadManager { 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 return sanitizeFilename( if (epName == null) { @@ -1489,27 +1494,33 @@ object VideoDownloadManager { } private fun getDownloadFileInfo(context: Context, id: Int): DownloadedFileInfoResult? { - val info = - context.getKey(KEY_DOWNLOAD_INFO, id.toString()) ?: return null - val base = basePathToFile(context, info.basePath) + try { + val info = + context.getKey(KEY_DOWNLOAD_INFO, id.toString()) ?: return null + val base = basePathToFile(context, info.basePath) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && base.isDownloadDir()) { - val cr = context.contentResolver ?: return null - val fileUri = - cr.getExistingDownloadUriOrNullQ(info.relativePath, info.displayName) ?: return null - val fileLength = cr.getFileLength(fileUri) ?: return null - if (fileLength == 0L) return null - return DownloadedFileInfoResult(fileLength, info.totalBytes, fileUri) - } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && base.isDownloadDir()) { + val cr = context.contentResolver ?: return null + val fileUri = + cr.getExistingDownloadUriOrNullQ(info.relativePath, info.displayName) + ?: return null + val fileLength = cr.getFileLength(fileUri) ?: return null + if (fileLength == 0L) return null + return DownloadedFileInfoResult(fileLength, info.totalBytes, fileUri) + } else { - val file = base?.gotoDir(info.relativePath, false)?.findFile(info.displayName) + val file = base?.gotoDir(info.relativePath, false)?.findFile(info.displayName) // val normalPath = context.getNormalPath(getFile(info.relativePath), info.displayName) // val dFile = File(normalPath) - if (file?.exists() != true) return null + if (file?.exists() != true) return null - return DownloadedFileInfoResult(file.size(), info.totalBytes, file.uri) + return DownloadedFileInfoResult(file.size(), info.totalBytes, file.uri) + } + } catch (e: Exception) { + logError(e) + return null } } diff --git a/app/src/main/res/values-cn/strings.xml b/app/src/main/res/values-cn/strings.xml deleted file mode 100644 index be0d8475..00000000 --- a/app/src/main/res/values-cn/strings.xml +++ /dev/null @@ -1,430 +0,0 @@ - - - - search_providers_list - app_locale - search_type_list - grid_format - auto_update - prerelease_update - manual_check_update - fast_forward_button_time - benene_count - subtitle_settings_key - subtitle_settings_chromecast_key - quality_pref_key - video_buffer_size_key - video_buffer_length_key - video_buffer_clear_key - video_buffer_disk_key - unknown_prerelease - use_system_brightness_key - swipe_enabled_key - playback_speed_enabled_key - player_resize_enabled_key - pip_enabled_key - double_tap_enabled_key - double_tap_pause_enabled_key - swipe_vertical_enabled_key - display_sub_key - show_fillers_key - provider_lang_key - dns_key - download_path_key - Cloudstream - app_layout_key - primary_color_key - restore_key - killswitch_key - backup_key - prefer_media_type_key - app_theme_key - - - - %d %s | %sMB - %s • %sGB - %sMB / %sMB - %dMB - %s %s - +%d - -%d - %d - %d - %.1f/10.0 - %d - %s 共%d集 - 演员:%s - - - 海报 - @string/result_poster_img_des - 剧集海报 - 主海报 - 随机下一个 - @string/play_episode - 返回 - @string/home_change_provider_img_des - 更改内容提供者 - 预览背景 - - - 速度(%.2fx) - 评分:%.1f - 发现新版本!\n%s -> %s - 填充 - %d分钟 - - CloudStream - 主页 - 搜索 - 下载 - 设置 - - 搜索… - 无数据 - 更多选项 - 下一集 - @string/synopsis - 类型 - 分享 - 在浏览器中打开 - 跳过加载 - 正在加载… - - 正在观看 - 暂时搁置 - 观看完毕 - 放弃观看 - 计划观看 - - 重新观看 - - 播放电影 - 串流Torrent - 来源 - 字幕 - 重试连接… - 返回 - 播放剧集 - - - 下载 - 已下载 - 正在下载 - 下载暂停 - 下载开始 - 下载失败 - 下载取消 - 下载完毕 - %s - %s - - 加载链接时出错 - 内部存储 - - 配音 - 字幕 - - 删除文件 - 播放文件 - 继续下载 - 暂停下载 - - 禁用自动错误报告 - 更多信息 - 隐藏 - 播放 - 信息 - 筛选书签 - 书签 - 移除 - 设置观看状态 - 应用 - 取消 - 播放速度 - - 字幕设置 - 文本颜色 - 轮廓颜色 - 背景颜色 - 窗口颜色 - 边缘类型 - 字幕高度 - 字体 - 字体大小 - - 按内容提供者搜索 - 按类型搜索 - - 送给开发者%d根香蕉 - 不送香蕉 - - 自动选择语言 - 下载语言 - 按住重置为默认值 - 继续观看 - - 移除 - 更多信息 - @string/home_play - - 此内容提供者可能需要VPN才能正常工作 - 此内容提供者是一个Torrent,建议使用VPN - - 站点不提供元数据,如果站点上不存在元数据,视频加载将失败。 - - 简介 - 没有找到简介 - 没有找到简介 - - 画中画 - 在其他应用之上的迷你播放器中继续播放 - 播放器画面调整按钮 - 移除黑色边框 - 字幕 - 播放器字幕设置 - 投屏字幕 - 投屏字幕设置 - - 本征模式 - 在播放器中添加播放速度选项 - 滑动控制进度 - 向屏幕左侧或右侧滑动来控制播放进度 - 滑动更改设置 - 在屏幕左侧或右侧滑动来更改亮度或音量 - 双击控制进度 - 双击暂停 - 在屏幕左侧或右侧双击来快进或快退 - - 双击屏幕中间暂停 - 使用系统亮度 - 在app player中使用系统亮度,而不是黑色遮罩 - - - 从备份中恢复数据 - 从github下载最新元数据 - 如果你想访问所有的内容提供者(即使是损坏的),请关闭此选项 - - 备份数据 - 已加载备份文件 - 无法从文件%s中还原数据 - 成功存储数据 - 缺少存储权限,请重试 - 备份%s时出错 - - 搜索 - 信息 - 高级搜索 - 给出按内容提供者分隔的搜索结果 - 只发送关于崩溃的数据 - 不发送数据 - 为动画显示下一集 - 显示应用更新 - 启动时自动搜索更新 - 更新至预览版 - 搜索预览版更新,而不是仅搜索完整版本 - Github - 由同一开发者开发的轻小说应用 - 由同一开发者开发的动漫应用 - 加入Discord - 送给开发者一根香蕉 - 送香蕉 - - 应用语言 - - 该内容提供者不支持投屏 - 没有找到链接 - 链接已复制到剪贴板 - 播放剧集 - 重置为默认值 - 抱歉,应用崩溃了,将向开发人员发送一份匿名Bug报告 - - - - 没有季 - - - S - E - 没有找到剧集 - - 删除文件 - 删除 - @string/sort_cancel - 暂停 - 继续 - -30 - +30 - 这将永久删除%s\n你确定吗? - 剩余%d分钟\n - - - 连载中 - 已完结 - 状态 - 年份 - 评分 - 持续时间 - 网站 - 简介 - - 队列 - 无字幕 - 默认 - - 空闲 - 已使用 - 应用 - - - 电影 - 剧集 - 卡通 - 动漫 - Torrents - 纪录片 - OVA - - - 电影 - 剧集 - 卡通 - @string/anime - @string/ova - Torrent - 纪录片 - - 源错误 - 远程错误 - 渲染器错误 - 意外的播放器错误 - 下载错误,请检查存储权限 - - 投屏剧集 - 投屏镜像 - 在应用程序中播放 - 在VLC中播放 - 在浏览器中播放 - 复制链接 - 自动下载 - 下载镜像 - 重新加载链接 - - 找不到更新 - 检查更新 - - 锁定 - 调整画面 - 来源 - 跳过OP - - 不再显示 - 更新 - 首选播放质量 - 视频缓冲大小 - 视频缓冲时长 - 磁盘上的视频缓存 - 清除视频和图像缓存 - - 如果设置太高,可能会在内存较低的系统(如Android TV设备或旧手机)上导致问题 - 如果将存储空间设置得太高,可能会导致Android TV设备等存储空间不足的系统出现问题 - - DNS over HTTPS - 用于忽略ISP块 - - 下载路径 - - 显示有配音/字幕的动画 - - 适应屏幕 - 拉伸 - 缩放 - - 免责声明 - legal_notice_key - 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. - - 全局 - 内容提供者语言 - 应用布局 - 首选媒体 - - 自动 - 电视布局 - 手机布局 - 模拟器布局 - - 主题色 - 应用主题 - - - anilist_key - mal_key - - %s %s - 账户 - 注销 - 登录 - 切换账户 - 添加帐户 - 添加跟踪 - 已添加%s - 同步 - - - - 普通 - 全部 - 最大 - 最小 - @string/none - 轮廓 - 降低 - 阴影 - 提高 - 同步字幕 - 1000ms - 字幕延迟 - 如果字幕过早显示%dms,请使用此选项 - 如果字幕过晚显示%dms,请使用此选项 - 无字幕延迟 - - - 一只敏捷的棕色狐狸跳过一只懒惰的狗 - - 推荐 - 已加载%s - 从文件加载 - 下载的文件 - 主演 - 配演 - 群演 - - 来源 - diff --git a/app/src/main/res/values-gr/strings.xml b/app/src/main/res/values-gr/strings.xml deleted file mode 100644 index 9982ca16..00000000 --- a/app/src/main/res/values-gr/strings.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - CloudStream - Αρχική - Αναζήτηση - Λήψεις - Ρυθμίσεις - Ψάξε… - Πόστερ - Χωρίς δεδομένα - Περισσότερες Επιλογές - Πίσω - Επόμενο Επισόδειο - Πόστερ - Πλοκή - Genres - Μοίρασε - Άνοιγμα στον περιηγητή - Προσπέραση φορτώματος - Φόρτωση… - - Watching - On-Hold - Completed - Dropped - Plan to Watch - None - - Αναπαραγωγή Ταινείας - Μετάδοση Torrent - Πηγές - Υπότιτλοι - Ξανά φόρτωσε… - Πίσω - Πόστερ - Αναπαραγωγή Επισοδείου - - Λήξη - Σφάλμα φόρτωσεις συνδέσμων - Εσωτερικός χώρος - - - Dub - Sub - - Διαγραφή Αρχείου - Αναπαραγωγή Αρχείου - Συνέχιση Λήψης - Παύση Λήψης - - Λυπούμαστε, η εφαρμογή κατέρρευσε. Μια ανώνυμη αναφορά σφαλμάτων θα σταλεί στους προγραμματιστές - Απενεργοποιήστε την αυτόματη αναφορά σφαλμάτων - Παραπάνω πληροφορίες - Κρύψιμο - Κύριο Πόστερ - Αναπαραγωγή - Πληροφορίες - Next Random - Change Provider - Filter Bookmarks - Bookmarks - Remove - Αναπαραγωγή Episode - Υποβολή - Ακύρωση - Ταχύτητα αναπαραγωγής - Ρυθμίσεις υπότιτλων - Χρώμα κείμενου - Χρώμα περιγράμματος - Χρώμα φόντου - Χρώμα παραθύρου - Τύπος άκρων - Ύψωση υπότιτλων - Επαναφορά στην προεπιλεγμένη τιμή - Προεπισκόπηση φόντου - Γραμματοσειρά - Αναζήτηση με τους παρόχους - Αναζήτηση με τύπους - %d Benenes given to devs - No Benenes given - - Αυτόματη επιλογή γλώσσας - Λήψη γλωσσών - Κρατήστε πατημένο για επαναφορά στα προεπιλεγμένα - Συνέχεια Παρακολούθησης - - Αφαίρεση - Παραπάνω Πληροφορίες - - A VPN might be needed for this provider to work correctly - This providers is a torrent, a VPN is recommended - Περιγραφή - Δεν βρέθηκε περιγραφή - Δεν βρέθηκε περιγραφή - - Picture-in-picture - Συνεχίζει την αναπαραγωγή σε ένα μίνι παίκτη πάνω από άλλες εφαρμογές - Αλλαγή μεγέθους παίκτη - Αφαίρεση μαύρων περιγραμμάτων - Υπότιτλοι - Ρυθμίσεις υποτίτλων του παίκτη - Eigengrau Mode - Προσθέτει την επιλογή ταχύτητας στον παίκτη - Σύρετε για seek - Σύρετε αριστερά ή δεξιά για να ελέγξετε τον χρόνο στον παίκτη - Σύρετε για να αλλάξετε ρυθμίσεις - Σύρετε αριστερά ή δεξιά για να αλλάξετε τη φωτεινότητα ή την ένταση - Διπλό πάτημα για seek - Διπλό πάτημα στα αριστερά ή δεξιά για seek μπροστά ή πίσω - Αναζήτηση - Πληροφορείες - Προχωρημένη Αναζήτηση - Δίνει τα αποτελέσματα αναζήτησης χωρισμένα ανά πάροχο - Αποστέλλει δεδομένα μόνο για σφάλματα - Δεν στέλνει δεδομένα - Εμφάνιση ενημερώσεων - Αυτόματη αναζήτηση νέων ενημερώσεων - Ενημέρωση σε προ-εκδόσεις - Αναζητήστε ενημερώσεις προ-εκδόσεων αντί για κανονικές εκδόσεις - Github - Light novel app by the same devs - Anime app by the same devs - Join Discord - Δώσε benene στους devs - Βenene δώθηκε -