From f0bac9010941db66e246d8e51928c3be9a04c527 Mon Sep 17 00:00:00 2001 From: Azamov X <108933534+professorDeveloper@users.noreply.github.com> Date: Mon, 7 Sep 2026 23:35:26 +0500 Subject: [PATCH 1/2] refactor: extract the hardcoded strings, drop the dead ones MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Groundwork for translating the TV app. No visible text changes: every literal lifted out becomes a string resource holding exactly the same words, and the extraction was verified by building the app. 86 dead string resources deleted — leanback template leftovers (`browse_title` = "Videos by Your Company", `rent_1`, `buy_2`, `lorem`, `hello_blank_fragment`) and an Uzbek phone-login flow that was removed from the code long ago. Nothing deleted is still referenced; the four that looked dead are ``, reached through `R.plurals` rather than `R.string`. 119 layout attributes (`android:text`, `hint`, `contentDescription`, and the nav-graph `label`s) and 37 Kotlin literals now point at resources. What was left alone on purpose: the on-screen keyboard's single letters, the `•` and `−` separators, `"$value$unit"`, and the empty strings — none of them is language, and turning them into resources would ask nine translators to translate a punctuation mark. `"${item.count} sources"` now goes through the `source_count` plurals that already existed and was not being used at that call site, so a single source no longer reads "1 sources". Two extracted names had to be renamed because an Android resource name must start with a letter: the layout-preview values "5 hours ago" and "16sp", both overwritten at runtime. --- .../sozo_tv/adapters/SeriesPageAdapter.kt | 3 +- .../saikou/sozo_tv/adapters/SourceAdapter.kt | 3 +- .../sozo_tv/components/TvToggleRowView.kt | 4 +- .../presentation/activities/UpdateActivity.kt | 21 +- .../screens/category/CategoriesScreen.kt | 4 +- .../screens/detail/CastDetailAdapter.kt | 3 +- .../screens/detail/MovieDetailsAdapter.kt | 2 +- .../screens/episodes/EpisodeScreen.kt | 4 +- .../screens/profile/MyAccountPage.kt | 2 +- .../screens/search/SearchScreen.kt | 22 +- .../screens/splash/SplashScreen.kt | 2 +- .../screens/tv_garden/FilterDialogGarden.kt | 6 +- .../screens/tv_garden/TvGardenScreen.kt | 2 +- app/src/main/res/layout/account_item.xml | 2 +- app/src/main/res/layout/activity_live_tv.xml | 4 +- app/src/main/res/layout/banner_item.xml | 2 +- app/src/main/res/layout/contact_screen.xml | 4 +- .../layout/content_header_menu_main_tv.xml | 2 +- .../main/res/layout/custom_tv_keyboard.xml | 6 +- .../res/layout/dialog_quality_selection.xml | 2 +- app/src/main/res/layout/episode_screen.xml | 2 +- app/src/main/res/layout/exit_dialog.xml | 10 +- app/src/main/res/layout/filter_dialog.xml | 10 +- .../main/res/layout/filter_dialog_garden.xml | 6 +- app/src/main/res/layout/header_source.xml | 14 +- app/src/main/res/layout/history_page.xml | 2 +- app/src/main/res/layout/item_bottombar.xml | 12 +- .../main/res/layout/item_bottombar_garden.xml | 8 +- app/src/main/res/layout/item_channel.xml | 8 +- .../main/res/layout/item_channel_section.xml | 2 +- app/src/main/res/layout/item_content_mode.xml | 8 +- .../res/layout/item_content_mode_section.xml | 8 +- app/src/main/res/layout/item_countdown.xml | 2 +- app/src/main/res/layout/item_ext_provider.xml | 2 +- .../main/res/layout/item_featured_news.xml | 8 +- .../main/res/layout/item_play_recommended.xml | 2 +- app/src/main/res/layout/item_tab_chip.xml | 2 +- app/src/main/res/layout/my_account_page.xml | 16 +- app/src/main/res/layout/nsfw_dialog.xml | 18 +- .../main/res/layout/nsfw_disable_dialog.xml | 8 +- .../main/res/layout/recent_search_item.xml | 4 +- app/src/main/res/layout/search_screen.xml | 6 +- .../main/res/layout/spinner_custom_item.xml | 2 +- .../layout/view_netflix_filter_selector.xml | 4 +- app/src/main/res/layout/view_tv_stepper.xml | 2 +- .../main/res/layout/view_tv_toggle_row.xml | 2 +- .../res/layout/voice_listening_overlay.xml | 2 +- .../main/res/layout/wrong_title_dialog.xml | 2 +- app/src/main/res/navigation/app_graph.xml | 18 +- app/src/main/res/navigation/login_graph.xml | 2 +- app/src/main/res/navigation/play_graph.xml | 10 +- app/src/main/res/navigation/profile_graph.xml | 14 +- app/src/main/res/values/strings.xml | 221 +++++++++++------- 53 files changed, 294 insertions(+), 243 deletions(-) diff --git a/app/src/main/java/com/saikou/sozo_tv/adapters/SeriesPageAdapter.kt b/app/src/main/java/com/saikou/sozo_tv/adapters/SeriesPageAdapter.kt index 5266dba4..b692925f 100644 --- a/app/src/main/java/com/saikou/sozo_tv/adapters/SeriesPageAdapter.kt +++ b/app/src/main/java/com/saikou/sozo_tv/adapters/SeriesPageAdapter.kt @@ -90,7 +90,8 @@ class SeriesPageAdapter( binding.country.text = data.episode.toString() root.setOnClickListener { onItemClicked?.invoke(data, absoluteAdapterPosition) } if (LocalData.isAnimeEnabled) { - topContainer.text = "Episode ${data.episode ?: 0}" + topContainer.text = topContainer.context + .getString(R.string.episode_number, data.episode ?: 0) } else { topContainer.text = data.title diff --git a/app/src/main/java/com/saikou/sozo_tv/adapters/SourceAdapter.kt b/app/src/main/java/com/saikou/sozo_tv/adapters/SourceAdapter.kt index 0d7730b7..0f91e999 100644 --- a/app/src/main/java/com/saikou/sozo_tv/adapters/SourceAdapter.kt +++ b/app/src/main/java/com/saikou/sozo_tv/adapters/SourceAdapter.kt @@ -47,7 +47,8 @@ class SourceAdapter( fun bind(item: ListItem.Header) { binding.tvGroupCategory.text = item.category binding.tvGroupTitle.text = item.title - binding.tvSourceCount.text = "${item.count} sources" + binding.tvSourceCount.text = binding.root.resources + .getQuantityString(R.plurals.source_count, item.count, item.count) } } diff --git a/app/src/main/java/com/saikou/sozo_tv/components/TvToggleRowView.kt b/app/src/main/java/com/saikou/sozo_tv/components/TvToggleRowView.kt index d2fd21ff..ec9699f7 100644 --- a/app/src/main/java/com/saikou/sozo_tv/components/TvToggleRowView.kt +++ b/app/src/main/java/com/saikou/sozo_tv/components/TvToggleRowView.kt @@ -100,12 +100,12 @@ class TvToggleRowView @JvmOverloads constructor( if (enabled) { statusDot.background = ContextCompat.getDrawable(context, R.drawable.netflix_status_dot_enabled) - statusText.text = "Enabled" + statusText.text = context.getString(R.string.status_enabled) statusText.setTextColor(ContextCompat.getColor(context, R.color.netflix_green)) } else { statusDot.background = ContextCompat.getDrawable(context, R.drawable.netflix_status_dot_disabled) - statusText.text = "Disabled" + statusText.text = context.getString(R.string.status_disabled) statusText.setTextColor(ContextCompat.getColor(context, R.color.netflix_gray)) } } diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/activities/UpdateActivity.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/activities/UpdateActivity.kt index 8977b0b3..ff07a89a 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/activities/UpdateActivity.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/activities/UpdateActivity.kt @@ -17,6 +17,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import com.bumptech.glide.Glide +import com.saikou.sozo_tv.R import com.saikou.sozo_tv.components.spoiler.SpoilerPlugin import com.saikou.sozo_tv.databinding.ActivityUpdateBinding import com.saikou.sozo_tv.domain.model.AppUpdate @@ -97,8 +98,8 @@ class UpdateActivity : AppCompatActivity() { binding.progressView1.gone() setProgressUi(0) - binding.bottomSheerCustomTitle.text = "Update Available" - binding.updateTxt.text = "Update Now" + binding.bottomSheerCustomTitle.text = getString(R.string.update_available) + binding.updateTxt.text = getString(R.string.update_now) binding.updateBtn.isEnabled = true binding.updateBtn.visible() @@ -166,7 +167,7 @@ class UpdateActivity : AppCompatActivity() { val link = appLink ?: return binding.progressView1.visible() binding.updateBtn.isEnabled = false - binding.updateTxt.text = "Downloading…" + binding.updateTxt.text = getString(R.string.update_downloading) vm.startDownload(this, link) } @@ -255,9 +256,9 @@ class UpdateActivity : AppCompatActivity() { when (st) { is UpdateViewModel.UiState.Idle -> { binding.progressView1.gone() - binding.bottomSheerCustomTitle.text = "Update Available" + binding.bottomSheerCustomTitle.text = getString(R.string.update_available) binding.updateBtn.isEnabled = true - binding.updateTxt.text = "Update Now" + binding.updateTxt.text = getString(R.string.update_now) binding.updateBtn.requestInitialFocus() binding.updateBtn.visible() } @@ -265,16 +266,16 @@ class UpdateActivity : AppCompatActivity() { is UpdateViewModel.UiState.Downloading -> { binding.progressView1.visible() binding.updateBtn.isEnabled = false - binding.updateTxt.text = "Downloading…" + binding.updateTxt.text = getString(R.string.update_downloading) setProgressUi(st.progress1000) } is UpdateViewModel.UiState.DownloadComplete -> { binding.progressView1.gone() - binding.bottomSheerCustomTitle.text = "Download Complete!" + binding.bottomSheerCustomTitle.text = getString(R.string.update_download_complete) binding.updateBtn.visible() binding.updateBtn.isEnabled = true - binding.updateTxt.text = "Install Now" + binding.updateTxt.text = getString(R.string.update_install_now) binding.updateBtn.requestInitialFocus() if (!canInstallUnknownApps()) { @@ -287,10 +288,10 @@ class UpdateActivity : AppCompatActivity() { is UpdateViewModel.UiState.DownloadFailed -> { binding.progressView1.gone() - binding.bottomSheerCustomTitle.text = "Download Failed" + binding.bottomSheerCustomTitle.text = getString(R.string.update_download_failed) binding.updateBtn.visible() binding.updateBtn.isEnabled = true - binding.updateTxt.text = "Try Again" + binding.updateTxt.text = getString(R.string.update_try_again) binding.updateBtn.requestInitialFocus() snackString("Download failed: ${st.error}") } diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/category/CategoriesScreen.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/category/CategoriesScreen.kt index 6af5d422..e9735f90 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/category/CategoriesScreen.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/category/CategoriesScreen.kt @@ -58,9 +58,9 @@ class CategoriesScreen : Fragment() { super.onViewCreated(view, savedInstanceState) val preference = PreferenceManager() if (preference.isModeAnimeEnabled()) { - binding.textView6.text = "Filter Anime" + binding.textView6.text = getString(R.string.filter_anime) } else { - binding.textView6.text = "Filter Movie" + binding.textView6.text = getString(R.string.filter_movie) } viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/CastDetailAdapter.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/CastDetailAdapter.kt index ff5030ba..6a9344b7 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/CastDetailAdapter.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/CastDetailAdapter.kt @@ -218,7 +218,8 @@ class CastDetailAdapter( if (item.age.isNotEmpty()) { binding.ageBadge.visible() - binding.characterAge.text = "Age: ${item.age}" + binding.characterAge.text = binding.root.context + .getString(R.string.character_age, item.age) binding.ageBadge.animate() .scaleX(1.05f) .scaleY(1.05f) diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/MovieDetailsAdapter.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/MovieDetailsAdapter.kt index af4a2e9c..9bcfae00 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/MovieDetailsAdapter.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/detail/MovieDetailsAdapter.kt @@ -225,7 +225,7 @@ class MovieDetailsAdapter( } override fun onFinish() { - countDownText.text = "Aired!" + countDownText.text = countDownText.context.getString(R.string.countdown_aired) } }.also { it.start() } } else { diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/episodes/EpisodeScreen.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/episodes/EpisodeScreen.kt index af414383..2921fa6c 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/episodes/EpisodeScreen.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/episodes/EpisodeScreen.kt @@ -115,7 +115,7 @@ class EpisodeScreen : Fragment() { binding.topContainer.gone() binding.tabRv.gone() binding.loadingLayout.visible() - binding.loadingText.text = "Media is loading.." + binding.loadingText.text = getString(R.string.media_is_loading) } is Resource.Success -> { @@ -200,7 +200,7 @@ class EpisodeScreen : Fragment() { Resource.Loading -> { binding.placeHolder.root.gone() - binding.loadingText.text = "Episodes are loading.." + binding.loadingText.text = getString(R.string.episodes_are_loading) // Only take the screen over while there is nothing to show. Hiding a populated // grid on every page switch threw D-pad focus back out of the list. if (adapter.itemCount == 0) { diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt index 9d31ceda..762c0570 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt @@ -201,7 +201,7 @@ class MyAccountPage : Fragment() { if (host is AuthNavigator) { host.openLogin() } else { - Toast.makeText(requireContext(), "Login page not connected yet", Toast.LENGTH_SHORT) + Toast.makeText(requireContext(), getString(R.string.login_not_connected), Toast.LENGTH_SHORT) .show() } } diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/search/SearchScreen.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/search/SearchScreen.kt index 14a6f252..679bd352 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/search/SearchScreen.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/search/SearchScreen.kt @@ -111,7 +111,7 @@ class SearchScreen : Fragment() { if (searchEverywhere && !searchAllSources) { searchAllSources = true - binding.searchScopeToggle.text = "All sources" + binding.searchScopeToggle.text = getString(R.string.search_scope_all_sources) } binding.searchEdt.setText(query) @@ -196,7 +196,7 @@ class SearchScreen : Fragment() { isListening = true onUi { showVoiceOverlay(true) - binding.voiceListeningOverlay.listeningTxt.text = "Listening..." + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_listening) binding.micBtn.setImageResource(R.drawable.ic_mic) } } @@ -204,7 +204,7 @@ class SearchScreen : Fragment() { override fun onBeginningOfSpeech() { Log.d("SearchScreen", "Beginning of speech") onUi { - binding.voiceListeningOverlay.listeningTxt.text = "Listening... Speak now" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_listening_speak) } } @@ -290,7 +290,7 @@ class SearchScreen : Fragment() { showVoiceOverlay(false) }, 1500) } else { - binding.voiceListeningOverlay.listeningTxt.text = "No speech detected" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_no_speech) showVoiceOverlay(true) binding.voiceListeningOverlay.root.postDelayed({ showVoiceOverlay(false) @@ -366,7 +366,7 @@ class SearchScreen : Fragment() { } showVoiceOverlay(true) - binding.voiceListeningOverlay.listeningTxt.text = "Starting…" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_starting) speechRecognizer?.startListening(intent) } catch (e: Exception) { @@ -392,11 +392,11 @@ class SearchScreen : Fragment() { if (intent.resolveActivity(requireContext().packageManager) != null) { showVoiceOverlay(true) - binding.voiceListeningOverlay.listeningTxt.text = "Starting voice search..." + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_starting_search) startActivityForResult(intent, VOICE_REQUEST_CODE) } else { Log.e("SearchScreen", "No speech recognition activity found") - binding.voiceListeningOverlay.listeningTxt.text = "Voice search not available" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_unavailable) showVoiceOverlay(true) binding.voiceListeningOverlay.root.postDelayed({ showVoiceOverlay(false) @@ -404,7 +404,7 @@ class SearchScreen : Fragment() { } } catch (e: Exception) { Log.e("SearchScreen", "Alternative voice search error: ${e.message}") - binding.voiceListeningOverlay.listeningTxt.text = "Voice search error" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_error) showVoiceOverlay(true) binding.voiceListeningOverlay.root.postDelayed({ showVoiceOverlay(false) @@ -435,7 +435,7 @@ class SearchScreen : Fragment() { binding.searchEdt.setText(spokenText) binding.searchEdt.setSelection(spokenText.length) performSearchImmediate(spokenText) - binding.voiceListeningOverlay.listeningTxt.text = "Searching for: $spokenText" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_searching_for, spokenText) showVoiceOverlay(true) binding.voiceListeningOverlay.root.postDelayed({ showVoiceOverlay(false) @@ -444,7 +444,7 @@ class SearchScreen : Fragment() { } else { binding.micBtn.setImageResource(R.drawable.ic_mic) if (resultCode == Activity.RESULT_CANCELED) { - binding.voiceListeningOverlay.listeningTxt.text = "Voice search cancelled" + binding.voiceListeningOverlay.listeningTxt.text = getString(R.string.voice_cancelled) showVoiceOverlay(true) binding.voiceListeningOverlay.root.postDelayed({ showVoiceOverlay(false) @@ -565,7 +565,7 @@ class SearchScreen : Fragment() { val title = searchModel.title?.trim().orEmpty() if (title.isEmpty()) return - Toast.makeText(requireContext(), "Opening “$title”…", Toast.LENGTH_SHORT).show() + Toast.makeText(requireContext(), getString(R.string.opening_title, title), Toast.LENGTH_SHORT).show() viewLifecycleOwner.lifecycleScope.launch { val regId = withContext(Dispatchers.IO) { try { diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/splash/SplashScreen.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/splash/SplashScreen.kt index 2037d512..d1e5af1f 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/splash/SplashScreen.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/splash/SplashScreen.kt @@ -216,7 +216,7 @@ class SplashScreen : Fragment() { } binding.loadingIndicator.visible() binding.setupStatus.visible() - binding.setupStatus.text = "Setting up sources…" + binding.setupStatus.text = getString(R.string.splash_setting_up_sources) // The install outlives this fragment, so its progress callback must not pin the view // hierarchy: hold the screen weakly and drop the update once the view is gone. val handler = Handler(Looper.getMainLooper()) diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/FilterDialogGarden.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/FilterDialogGarden.kt index 6082cc77..3279eda4 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/FilterDialogGarden.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/FilterDialogGarden.kt @@ -30,9 +30,9 @@ class FilterDialogGarden : DialogFragment() { super.onViewCreated(view, savedInstanceState) setupDialogWindow() - binding.categoryContainer.title.text = "By Category" - binding.countryContainer.title.text = "By Country" - binding.customContainer.title.text = "Custom List" + binding.categoryContainer.title.text = getString(R.string.garden_by_category) + binding.countryContainer.title.text = getString(R.string.garden_by_country) + binding.customContainer.title.text = getString(R.string.garden_custom_list) binding.close.setOnClickListener { dismiss() } diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/TvGardenScreen.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/TvGardenScreen.kt index 0691e9e7..c81f8541 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/TvGardenScreen.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/tv_garden/TvGardenScreen.kt @@ -71,7 +71,7 @@ class TvGardenScreen : Fragment() { intent.putExtra("data", it) requireActivity().startActivity(intent) } else { - Toast.makeText(requireContext(), "No stream available", Toast.LENGTH_SHORT) + Toast.makeText(requireContext(), getString(R.string.no_stream_available), Toast.LENGTH_SHORT) .show() } } diff --git a/app/src/main/res/layout/account_item.xml b/app/src/main/res/layout/account_item.xml index 5c125025..5c3130f5 100644 --- a/app/src/main/res/layout/account_item.xml +++ b/app/src/main/res/layout/account_item.xml @@ -53,7 +53,7 @@ android:maxLines="1" android:scrollHorizontally="true" android:singleLine="true" - android:text="Account" + android:text="@string/account" android:textColor="@color/color_black_white_text" android:textSize="@dimen/tv_text_label" tools:text="@string/eshonov_fakhriyor" /> diff --git a/app/src/main/res/layout/activity_live_tv.xml b/app/src/main/res/layout/activity_live_tv.xml index 1e113d04..b3db4b2a 100644 --- a/app/src/main/res/layout/activity_live_tv.xml +++ b/app/src/main/res/layout/activity_live_tv.xml @@ -42,7 +42,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/days" android:padding="8dp" - android:text="Channel is loading..." + android:text="@string/channel_is_loading" android:textAlignment="center" android:textColor="@color/lb_tv_white" /> @@ -73,7 +73,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:gravity="center" - android:text="Connection Error" + android:text="@string/connection_error" android:textColor="@android:color/white" android:textSize="@dimen/tv_text_subtitle" /> diff --git a/app/src/main/res/layout/banner_item.xml b/app/src/main/res/layout/banner_item.xml index 9cf0d729..a013714d 100644 --- a/app/src/main/res/layout/banner_item.xml +++ b/app/src/main/res/layout/banner_item.xml @@ -90,7 +90,7 @@ android:lines="1" android:maxEms="8" android:maxLines="1" - android:text="Play Now" + android:text="@string/play_now" android:textAlignment="center" android:textColor="@color/login_button_text_color_selected_state" android:textSize="@dimen/tv_text_label" /> diff --git a/app/src/main/res/layout/contact_screen.xml b/app/src/main/res/layout/contact_screen.xml index 77524bef..4d81fc28 100644 --- a/app/src/main/res/layout/contact_screen.xml +++ b/app/src/main/res/layout/contact_screen.xml @@ -54,7 +54,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/poppins_bold" - android:text="Follow us on social" + android:text="@string/follow_us_on_social" android:textSize="@dimen/tv_text_body" /> diff --git a/app/src/main/res/layout/content_header_menu_main_tv.xml b/app/src/main/res/layout/content_header_menu_main_tv.xml index 1a8a351c..37d86020 100644 --- a/app/src/main/res/layout/content_header_menu_main_tv.xml +++ b/app/src/main/res/layout/content_header_menu_main_tv.xml @@ -51,7 +51,7 @@ android:maxEms="9" android:maxLines="1" android:paddingHorizontal="3dp" - android:text="Profile" + android:text="@string/profile" android:textColor="@color/color_black_white_text" android:textSize="@dimen/tv_text_body" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/custom_tv_keyboard.xml b/app/src/main/res/layout/custom_tv_keyboard.xml index 98f72ec2..77452139 100644 --- a/app/src/main/res/layout/custom_tv_keyboard.xml +++ b/app/src/main/res/layout/custom_tv_keyboard.xml @@ -384,7 +384,7 @@ android:layout_height="@dimen/tv_keyboard_key_h" android:layout_margin="@dimen/tv_keyboard_key_gap" android:textSize="@dimen/tv_keyboard_key_text" - android:text=""" /> + android:text="@string/quot" /> + android:text="@string/amp" /> + android:text="@string/space" /> diff --git a/app/src/main/res/layout/episode_screen.xml b/app/src/main/res/layout/episode_screen.xml index f045918f..0e15582d 100644 --- a/app/src/main/res/layout/episode_screen.xml +++ b/app/src/main/res/layout/episode_screen.xml @@ -92,7 +92,7 @@ android:duplicateParentState="true" android:fontFamily="@font/days" android:gravity="center" - android:text="Wrong Title?" + android:text="@string/find_correct_anime_title" android:textColor="@color/login_button_text_color" android:textSize="@dimen/tv_text_body" /> diff --git a/app/src/main/res/layout/exit_dialog.xml b/app/src/main/res/layout/exit_dialog.xml index efa4e801..128fc3a7 100644 --- a/app/src/main/res/layout/exit_dialog.xml +++ b/app/src/main/res/layout/exit_dialog.xml @@ -21,7 +21,7 @@ android:layout_marginStart="14dp" android:layout_marginTop="8dp" android:fontFamily="@font/days" - android:text="Exit Account" + android:text="@string/exit" android:textColor="@color/white40" android:textSize="@dimen/tv_text_subtitle" app:layout_constraintStart_toStartOf="parent" @@ -65,7 +65,7 @@ android:layout_gravity="center" android:layout_marginTop="12dp" android:fontFamily="@font/days" - android:text="Account " + android:text="@string/account_2" android:textColor="@color/lb_tv_white" android:textSize="@dimen/tv_text_subtitle" /> @@ -94,7 +94,7 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:fontFamily="@font/days" - android:text="Are you sure you want to exit ?" + android:text="@string/are_you_sure_you_want_to" android:textColor="@color/lb_tv_white" android:textSize="@dimen/tv_text_subtitle" /> @@ -127,7 +127,7 @@ android:fontFamily="@font/days" android:paddingVertical="13dp" - android:text="Not Now" + android:text="@string/not_now" android:textAlignment="center" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_label" /> @@ -155,7 +155,7 @@ android:fontFamily="@font/days" android:paddingVertical="13dp" - android:text="Yes Continue" + android:text="@string/yes_continue" android:textAlignment="center" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_label" /> diff --git a/app/src/main/res/layout/filter_dialog.xml b/app/src/main/res/layout/filter_dialog.xml index 71f4a2f0..7963586d 100644 --- a/app/src/main/res/layout/filter_dialog.xml +++ b/app/src/main/res/layout/filter_dialog.xml @@ -20,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:text="Filter " + android:text="@string/filter" android:textColor="@android:color/white" android:textSize="18sp" android:textStyle="bold" /> @@ -51,7 +51,7 @@ android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" - android:hint="Choose Sort" + android:hint="@string/choose_sort" android:padding="10dp" android:textColor="@color/lb_tv_white" android:textColorHint="@color/lb_tv_white" @@ -80,7 +80,7 @@ android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" - android:hint="Choose Year" + android:hint="@string/choose_year" android:padding="10dp" android:textColor="@color/lb_tv_white" android:textColorHint="@color/lb_tv_white" @@ -115,7 +115,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:fontFamily="@font/days" - android:text="Choose Rating:" + android:text="@string/choose_rating" android:textColor="@color/white40" android:textSize="@dimen/tv_text_body" /> @@ -166,7 +166,7 @@ android:fontFamily="@font/days" android:paddingVertical="13dp" - android:text="Apply" + android:text="@string/apply" android:textAlignment="center" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_label" /> diff --git a/app/src/main/res/layout/filter_dialog_garden.xml b/app/src/main/res/layout/filter_dialog_garden.xml index ec6ee3ef..e04a1d9a 100644 --- a/app/src/main/res/layout/filter_dialog_garden.xml +++ b/app/src/main/res/layout/filter_dialog_garden.xml @@ -19,7 +19,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:text="Filter Tv Garden" + android:text="@string/filter_tv_garden" android:textColor="@android:color/white" android:textSize="18sp" android:textStyle="bold" /> @@ -56,7 +56,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:fontFamily="@font/days" - android:text="Choose Type:" + android:text="@string/choose_type" android:textColor="@color/white40" android:textSize="@dimen/tv_text_body" /> @@ -113,7 +113,7 @@ android:fontFamily="@font/days" android:paddingVertical="13dp" - android:text="Apply" + android:text="@string/apply" android:textAlignment="center" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_label" /> diff --git a/app/src/main/res/layout/header_source.xml b/app/src/main/res/layout/header_source.xml index 272516c0..b7b7db85 100644 --- a/app/src/main/res/layout/header_source.xml +++ b/app/src/main/res/layout/header_source.xml @@ -22,7 +22,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:fontFamily="@font/days" - android:text="Providers" + android:text="@string/providers" android:textColor="#FFFFFF" android:textSize="22sp" tools:ignore="HardcodedText" /> @@ -66,7 +66,7 @@ android:nextFocusDown="@id/btnTabServer" android:paddingHorizontal="20dp" android:paddingVertical="9dp" - android:text="Update sources" + android:text="@string/sources_update" android:textColor="@color/tv_field_text" android:textSize="@dimen/tv_text_body" tools:ignore="HardcodedText" /> @@ -91,7 +91,7 @@ android:nextFocusUp="@id/btnUpdateSources" android:paddingHorizontal="26dp" android:paddingVertical="10dp" - android:text="Sozo" + android:text="@string/sozo" android:textColor="#111417" android:textSize="@dimen/tv_text_subtitle" tools:ignore="HardcodedText" /> @@ -108,7 +108,7 @@ android:nextFocusUp="@id/btnUpdateSources" android:paddingHorizontal="26dp" android:paddingVertical="10dp" - android:text="Aniyomi" + android:text="@string/aniyomi" android:textColor="#CCCCCC" android:textSize="@dimen/tv_text_subtitle" /> @@ -124,7 +124,7 @@ android:nextFocusUp="@id/btnUpdateSources" android:paddingHorizontal="26dp" android:paddingVertical="10dp" - android:text="CloudStream" + android:text="@string/cloudstream" android:textColor="#CCCCCC" android:textSize="@dimen/tv_text_subtitle" /> @@ -143,7 +143,7 @@ android:layout_marginTop="16dp" android:background="@drawable/bg_button_tv" android:drawablePadding="8dp" - android:hint="Search providers…" + android:hint="@string/search_providers" android:imeOptions="actionSearch" android:inputType="text" android:maxLines="1" @@ -196,7 +196,7 @@ android:layout_height="wrap_content" android:layout_marginTop="20dp" android:gravity="center" - android:text="No providers available." + android:text="@string/sources_empty" android:textColor="#888888" android:textSize="@dimen/tv_text_body" android:visibility="gone" /> diff --git a/app/src/main/res/layout/history_page.xml b/app/src/main/res/layout/history_page.xml index 8f814f6d..8f467704 100644 --- a/app/src/main/res/layout/history_page.xml +++ b/app/src/main/res/layout/history_page.xml @@ -57,7 +57,7 @@ android:gravity="center" android:paddingHorizontal="8dp" android:paddingVertical="8dp" - android:text="Clear" + android:text="@string/clear" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_body" tools:text="Clear" /> diff --git a/app/src/main/res/layout/item_bottombar.xml b/app/src/main/res/layout/item_bottombar.xml index 1f02d78e..537f97c5 100644 --- a/app/src/main/res/layout/item_bottombar.xml +++ b/app/src/main/res/layout/item_bottombar.xml @@ -27,7 +27,7 @@ @@ -59,7 +59,7 @@ @@ -70,7 +70,7 @@ android:layout_marginStart="4dp" android:fontFamily="@font/inter_bold" android:paddingTop="4dp" - android:text="Characters" + android:text="@string/characters" android:textSize="@dimen/tv_text_label" /> @@ -91,7 +91,7 @@ @@ -102,7 +102,7 @@ android:layout_marginStart="4dp" android:fontFamily="@font/inter_bold" android:paddingTop="4dp" - android:text="Tv Channels" + android:text="@string/tv_channels" android:textSize="@dimen/tv_text_label" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_bottombar_garden.xml b/app/src/main/res/layout/item_bottombar_garden.xml index 12bdec14..7a9ae202 100644 --- a/app/src/main/res/layout/item_bottombar_garden.xml +++ b/app/src/main/res/layout/item_bottombar_garden.xml @@ -27,7 +27,7 @@ @@ -58,7 +58,7 @@ @@ -68,7 +68,7 @@ android:layout_height="wrap_content" android:paddingTop="4dp" android:layout_marginStart="4dp" - android:text="by Category" + android:text="@string/by_category" android:fontFamily="@font/inter_bold" android:textSize="@dimen/tv_text_label" /> diff --git a/app/src/main/res/layout/item_channel.xml b/app/src/main/res/layout/item_channel.xml index b007570d..f038b91b 100644 --- a/app/src/main/res/layout/item_channel.xml +++ b/app/src/main/res/layout/item_channel.xml @@ -23,7 +23,7 @@ android:ellipsize="end" android:gravity="center" android:maxLines="2" - android:text="Channel Name" + android:text="@string/channel_name" android:textColor="@color/netflix_text_primary" android:textSize="@dimen/tv_text_body" android:textStyle="bold" /> @@ -45,7 +45,7 @@ @@ -55,7 +55,7 @@ android:layout_width="16dp" android:layout_height="16dp" android:layout_marginStart="8dp" - android:contentDescription="Geo-blocked" + android:contentDescription="@string/geo_blocked" android:src="@drawable/ic_geo_blocked" android:visibility="gone" app:tint="@color/netflix_gray" /> @@ -70,7 +70,7 @@ android:ellipsize="end" android:gravity="center" android:maxLines="1" - android:text="Country • Language" + android:text="@string/country_language" android:textColor="@color/netflix_text_secondary" android:textSize="@dimen/tv_text_size_small" /> diff --git a/app/src/main/res/layout/item_channel_section.xml b/app/src/main/res/layout/item_channel_section.xml index 49608dbd..b46f27c0 100644 --- a/app/src/main/res/layout/item_channel_section.xml +++ b/app/src/main/res/layout/item_channel_section.xml @@ -73,7 +73,7 @@ android:id="@+id/channel_status_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Disabled" + android:text="@string/disabled" android:textColor="@color/netflix_gray" android:textSize="@dimen/tv_text_label" android:fontFamily="sans-serif"/> diff --git a/app/src/main/res/layout/item_content_mode.xml b/app/src/main/res/layout/item_content_mode.xml index b30d3656..bd8f5204 100644 --- a/app/src/main/res/layout/item_content_mode.xml +++ b/app/src/main/res/layout/item_content_mode.xml @@ -10,7 +10,7 @@ android:id="@+id/contentModeTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Content Mode" + android:text="@string/content_mode" android:textSize="18sp" android:textColor="@color/netflix_white" android:fontFamily="sans-serif-medium" @@ -20,7 +20,7 @@ android:id="@+id/contentModeSubtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Choose your preferred content type" + android:text="@string/choose_your_preferred_content_type" android:textSize="@dimen/tv_text_body" android:textColor="@color/netflix_gray" android:layout_marginBottom="16dp" /> @@ -37,7 +37,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:text="Anime Mode" + android:text="@string/anime_mode" android:textColor="@color/netflix_text_primary" android:gravity="center" android:background="@drawable/switch_background" /> @@ -47,7 +47,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:text="Movie Mode" + android:text="@string/movie_mode" android:textColor="@color/netflix_text_primary" android:gravity="center" android:background="@drawable/switch_selected_background" /> diff --git a/app/src/main/res/layout/item_content_mode_section.xml b/app/src/main/res/layout/item_content_mode_section.xml index 2f8c0eb4..0b7acebc 100644 --- a/app/src/main/res/layout/item_content_mode_section.xml +++ b/app/src/main/res/layout/item_content_mode_section.xml @@ -9,7 +9,7 @@ + android:text="@string/episode_2_will_be_released_in" /> @@ -52,7 +52,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="12dp" android:lineSpacingExtra="2dp" - android:text="Your watchlist has been updated with 5 new releases. Don't miss out on the latest content." + android:text="@string/your_watchlist_has_been_updated_with" android:textColor="@color/notification_description_color" android:textSize="@dimen/tv_text_body" /> @@ -70,7 +70,7 @@ android:drawableStart="@drawable/ic_time_small" android:drawablePadding="6dp" android:gravity="center_vertical" - android:text="5 hours ago" + android:text="@string/news_time_sample" android:textColor="@color/notification_time_color" android:textSize="@dimen/tv_text_label" /> @@ -81,7 +81,7 @@ android:background="@drawable/notification_action_bg" android:paddingHorizontal="12dp" android:paddingVertical="6dp" - android:text="update" + android:text="@string/update" android:textColor="@color/notification_action_color" android:textSize="@dimen/tv_text_label" /> diff --git a/app/src/main/res/layout/item_play_recommended.xml b/app/src/main/res/layout/item_play_recommended.xml index 6da7864d..9cf1387e 100644 --- a/app/src/main/res/layout/item_play_recommended.xml +++ b/app/src/main/res/layout/item_play_recommended.xml @@ -13,7 +13,7 @@ android:layout_height="wrap_content" android:layout_marginStart="14dp" android:fontFamily="@font/days" - android:text="Maybe You Like" + android:text="@string/maybe_you_like" android:textColor="@color/lb_tv_white" android:textSize="@dimen/tv_text_subtitle" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_tab_chip.xml b/app/src/main/res/layout/item_tab_chip.xml index df4a5bd2..5b7b2957 100644 --- a/app/src/main/res/layout/item_tab_chip.xml +++ b/app/src/main/res/layout/item_tab_chip.xml @@ -12,7 +12,7 @@ android:paddingStart="18dp" android:paddingEnd="18dp" - android:text="Watching" + android:text="@string/watching" android:textAllCaps="false" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_body" /> diff --git a/app/src/main/res/layout/my_account_page.xml b/app/src/main/res/layout/my_account_page.xml index a4e48d8c..378542dc 100644 --- a/app/src/main/res/layout/my_account_page.xml +++ b/app/src/main/res/layout/my_account_page.xml @@ -511,7 +511,7 @@ android:layout_weight="1" android:fontFamily="sans-serif-medium" android:gravity="center" - android:text="Default" + android:text="@string/subtitle_font_default" android:textColor="@color/netflix_text_primary" android:textSize="@dimen/tv_text_body" /> @@ -546,7 +546,7 @@ android:layout_weight="1" android:fontFamily="monospace" android:gravity="center" - android:text="Mono" + android:text="@string/subtitle_font_mono" android:textColor="@color/netflix_text_primary" android:textSize="@dimen/tv_text_body" /> @@ -556,7 +556,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:fontFamily="sans-serif-medium" - android:text="Text Size" + android:text="@string/text_size" android:textColor="@color/netflix_white" android:textSize="@dimen/tv_text_body" /> @@ -576,7 +576,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:fontFamily="sans-serif-medium" - android:text="Text Color" + android:text="@string/text_color" android:textColor="@color/netflix_white" android:textSize="@dimen/tv_text_body" /> @@ -700,7 +700,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:fontFamily="sans-serif-medium" - android:text="Subtitle Background" + android:text="@string/subtitle_background_2" android:textColor="@color/netflix_white" android:textSize="@dimen/tv_text_body" /> @@ -718,7 +718,7 @@ android:layout_marginEnd="6dp" android:layout_weight="1" android:fontFamily="sans-serif-medium" - android:text="Off" + android:text="@string/off" android:textColor="@color/netflix_text_primary" /> @@ -753,7 +753,7 @@ android:layout_marginEnd="6dp" android:layout_weight="1" android:fontFamily="sans-serif-medium" - android:text="Off" + android:text="@string/off" android:textColor="@color/netflix_text_primary" /> @@ -47,7 +47,7 @@ android:gravity="center" android:maxWidth="360dp" android:lineSpacingExtra="1dp" - android:text="You are about to enable adult content (NSFW). This will show mature content that may not be suitable for all audiences." + android:text="@string/you_are_about_to_enable_adult" android:textColor="#9ca3af" android:textSize="@dimen/tv_text_body" /> @@ -85,7 +85,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:fontFamily="sans-serif-medium" - android:text="Age Verification" + android:text="@string/age_verification" android:textColor="#ffffff" android:textSize="@dimen/tv_text_subtitle" /> @@ -94,7 +94,7 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:lineSpacingExtra="1dp" - android:text="You must be 18+ years old to view adult content" + android:text="@string/you_must_be_18_years_old" android:textColor="#9ca3af" android:textSize="@dimen/tv_text_body" /> @@ -128,7 +128,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:fontFamily="sans-serif-medium" - android:text="Content Visibility" + android:text="@string/content_visibility" android:textColor="#ffffff" android:textSize="@dimen/tv_text_subtitle" /> @@ -137,7 +137,7 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:lineSpacingExtra="1dp" - android:text="Adult content will be visible across the platform" + android:text="@string/adult_content_will_be_visible_across" android:textColor="#9ca3af" android:textSize="@dimen/tv_text_body" /> @@ -170,7 +170,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:fontFamily="sans-serif-medium" - android:text="Easy to Disable" + android:text="@string/easy_to_disable" android:textColor="#ffffff" android:textSize="@dimen/tv_text_subtitle" /> @@ -179,7 +179,7 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:lineSpacingExtra="1dp" - android:text="You can turn this off anytime in your account settings" + android:text="@string/you_can_turn_this_off_anytime" android:textColor="#9ca3af" android:textSize="@dimen/tv_text_body" /> @@ -207,7 +207,7 @@ android:focusableInTouchMode="true" android:paddingHorizontal="32dp" android:paddingVertical="12dp" - android:text="I Understand, Enable" + android:text="@string/i_understand_enable" android:textColor="@color/color_item_tv_category_tv" android:textSize="@dimen/tv_text_subtitle" android:fontFamily="sans-serif-medium" /> diff --git a/app/src/main/res/layout/nsfw_disable_dialog.xml b/app/src/main/res/layout/nsfw_disable_dialog.xml index 03577010..8626534c 100644 --- a/app/src/main/res/layout/nsfw_disable_dialog.xml +++ b/app/src/main/res/layout/nsfw_disable_dialog.xml @@ -38,7 +38,7 @@ android:layout_marginBottom="16dp" android:fontFamily="sans-serif-medium" android:gravity="center" - android:text="NSFW Content Disabled" + android:text="@string/nsfw_content_disabled" android:textColor="#FFFFFF" android:textSize="24sp" android:textStyle="bold" @@ -55,7 +55,7 @@ android:fontFamily="sans-serif" android:gravity="center" android:lineSpacingExtra="4dp" - android:text="Adult content is currently disabled. To access this content, you need to enable NSFW settings in your preferences." + android:text="@string/adult_content_is_currently_disabled_to" android:textColor="#B3B3B3" android:textSize="@dimen/tv_text_subtitle" app:layout_constraintBottom_toTopOf="@+id/buttonsContainer" @@ -85,7 +85,7 @@ android:focusable="true" android:fontFamily="@font/days" android:gravity="center" - android:text="Go to Settings" + android:text="@string/action_go_to_settings" android:textAllCaps="false" android:textColor="@color/color_black_white_text" android:textSize="@dimen/tv_text_body" /> @@ -106,7 +106,7 @@ android:focusable="true" android:fontFamily="sans-serif-medium" android:gravity="center" - android:text="Hide" + android:text="@string/hide" android:textAllCaps="false" android:textColor="@color/color_black_white_text" android:textSize="@dimen/tv_text_body" /> diff --git a/app/src/main/res/layout/recent_search_item.xml b/app/src/main/res/layout/recent_search_item.xml index b9855988..12088a8c 100644 --- a/app/src/main/res/layout/recent_search_item.xml +++ b/app/src/main/res/layout/recent_search_item.xml @@ -24,7 +24,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="center_vertical" - android:text="Search Query" + android:text="@string/search_query" android:textColor="@color/netflix_white" android:textSize="@dimen/tv_text_subtitle" android:maxLines="1" @@ -39,7 +39,7 @@ android:background="?android:attr/selectableItemBackgroundBorderless" android:padding="4dp" android:focusable="true" - android:contentDescription="Remove search" + android:contentDescription="@string/remove_search" app:tint="@color/netflix_gray" /> diff --git a/app/src/main/res/layout/search_screen.xml b/app/src/main/res/layout/search_screen.xml index 4643d94f..d0d42263 100644 --- a/app/src/main/res/layout/search_screen.xml +++ b/app/src/main/res/layout/search_screen.xml @@ -42,7 +42,7 @@ android:focusable="true" android:focusableInTouchMode="true" android:gravity="center_vertical" - android:hint="Search Anime..." + android:hint="@string/search_anime" android:imeOptions="actionSearch" android:inputType="text" android:maxLines="1" @@ -95,7 +95,7 @@ android:layout_weight="1" android:ellipsize="end" android:maxLines="1" - android:text="Your Search Recommendations" + android:text="@string/your_search_recommendations" android:textSize="17sp" /> - An error occurred - Dismiss - Change provider Search Main - Movies - TV - Settings - "Unlock unlimited entertainment with our SozoTv Subscription! Enjoy access to a vast library of movies across various genres, from timeless classics to the latest blockbusters. With new releases every week, you’ll never run out of exciting options to watch. Whether you're into animated films, gripping thrillers, heartwarming dramas, or action-packed adventures, our app has something for everyone. Subscribe now for a seamless movie-watching experience, ad-free, with the ability to watch anytime, anywhere! - Tv Shows - Hello blank fragment - Siz hali tizimga kirmagansiz - Login Page - +998 - Subscription Code - You can use the following methods to log in and register. - Login - QR Code orqali kirish - Boshqa usullar orqali kirish - Telefon raqamingizni\ntasdiqlang! - Tasdiqlash - 00000 - +998 90 364 08 04 telefon raqamiga 6 xonali kod yuborildi, ushbu kodni kiriting! - Kodni kiriting - 00:00 Back Back to Main - Qayta yuborish - Tasdiqlash kodini kiriting! - Shorts Filter Anime Tv Garden - Sources - telefon raqamiga 6 xonali kod yuborildi, ushbu kodni kiriting! - Onlayn Tv Something went wrong. Please try again. Retry - Obuna Tv Kanallar - Profile Eshonov Fakhriyor - Akkount qo`shish Subscription Status Active - Mening filmlarim - My Subscription My Info Bookmarks Page Sources Watch History - Obunalar Get Messages Exit Account There is no movie or serial here right now Cast details aren\'t available for this source Amallar - Ha, o\'chirish - Yo\'q, yopish - Don`t ask me again - Sizni 20.11.2024gacha faolligingiz bor. akkauntni o\'chirsangiz obuna bekor bo\'ladi. - Siz rostan ham ushbu akkauntni o\'chirmoqchimisiz? - One Piece, Naruto, Etc.. Watch Now Update Now - Watch Trailer About Movie - More Info Release Year Studio - User Ratings Category - Rating Language - Yangi soat daqiqa - Obunalar - To’lov summasi: - Ushbu to’lov tizimlari orqali to’lov qiling - Categories Please do`nt close Contact & @sozoApp @@ -104,11 +41,7 @@ Enable or disable adult content visibility Enable or disable channel content visibility Adult Content (NSFW) - CONTENT SETTINGS - 0 unread G - Recent Searches - Clear All Home Page Channels LIVE TV Retry @@ -119,7 +52,6 @@ Episode %1$s is loading… Switching quality… Could not switch quality — staying on the current one. - Part %1$d • Episode %2$d Loading episodes for part %1$s… This is the last episode This is the first episode @@ -139,17 +71,11 @@ Back No internet connection Too many attempts. Try again in a moment. - Notifications My Account Manage your profile and preferences Guest Account Login - STATUS Visitor - Content Mode - Choose your preferred content type - Anime Mode - Movie Mode Customize subtitle font, color and size (TV friendly) Preview This is how subtitles will look on TV @@ -158,18 +84,9 @@ Days Enable or disable viewing history on home screen History manager - Current Selected Source: %1$s Source - No speech detected - Starting voice search… - Voice search not available Your Search Recommendations Results for \"%1$s\" - - Choose your preferred banner appearance - Anime: %s - Movie: %s - Anime: %1$s, Movie: %2$s Style Off On @@ -193,14 +110,11 @@ Not connected — connect it in the Sozo phone app under Profile → Connections Your AniList list is empty. Nothing in “%1$s”. - AniList ID This device cannot play that format — trying another source… This TV can\'t play this video format. Pick another quality or server. Connection lost. Check your network and try again. That link has expired. Try again, or pick a different server. Playback failed. Try another server or quality. - WATCHED - SAVED watched saved unread @@ -226,7 +140,6 @@ Nothing matched that title Go to Settings Settings - Current values shown beside each item. Screen size Fit Whole frame visible, bars at the sides @@ -360,4 +273,138 @@ Added %1$d source(s). They are in the list behind this screen. Installed, but it added no sources. The link may point at the wrong file. Could not install it: %1$s + + + Account + Channel is loading... + Connection Error + Play Now + Follow us on social + Telegram + Profile + &quot; + &amp; + SPACE + Qualit Dialog + "Account " + Are you sure you want to exit ? + Not Now + Yes Continue + "Filter " + Choose Rating: + Apply + Choose Sort + Choose Year + Filter Tv Garden + Choose Type: + Providers + Sozo + Aniyomi + CloudStream + Search providers… + Clear + Anime + Characters + Tv Channels + by Country + by Category + Channel Name + LIVE + Country • Language + Geo-blocked + Disabled + Content Mode + Choose your preferred content type + Anime Mode + Movie Mode + Episode 2 will be released in + ACTIVE + Watchlist Update + Your watchlist has been updated with 5 new releases. Don\'t miss out on the latest content. + 5 hours ago + update + Maybe You Like + Watching + Text Size + Text Color + Subtitle Background + Adult Content Warning + You are about to enable adult content (NSFW). This will show mature content that may not be suitable for all audiences. + Age Verification + You must be 18+ years old to view adult content + Content Visibility + Adult content will be visible across the platform + Easy to Disable + You can turn this off anytime in your account settings + I Understand, Enable + NSFW Content Disabled + Adult content is currently disabled. To access this content, you need to enable NSFW settings in your preferences. + Hide + Search Query + Remove search + This source + Search Anime... + Title + By Country + By Category + 16sp + Listening… + e.g. 夏目友人帳, Natsume Yuujinchou + HomeScreen + ContactScreen + search_screen + categories_screen + LiveTvPlayerScreen + tv_garden_screen + view_all_screen + SourceScreen + Aniyomi Settings + splash_screen + DetailPage + CastDetailScreen + TrailerPlayerScreen + EpisodeScreen + SeriesPlayerScreen + my_account_page + bookmark_screen + HistoryPage + AnilistScreen + news_page + + + Enabled + Disabled + Episode %1$d + By Category + By Country + Custom List + Setting up sources… + No stream available + Filter Anime + Filter Movie + Media is loading.. + Episodes are loading.. + Age: %1$s + Aired! + All sources + Listening... + Listening... Speak now + No speech detected + Starting… + Starting voice search... + Voice search not available + Voice search error + Searching for: %1$s + Voice search cancelled + Opening \u201c%1$s\u201d… + Login page not connected yet + Update Available + Downloading… + Download Complete! + Install Now + Download Failed + Try Again From 62bb063d576f309726d915bd8c4ca15747a70f6a Mon Sep 17 00:00:00 2001 From: Azamov X <108933534+professorDeveloper@users.noreply.github.com> Date: Tue, 8 Sep 2026 00:00:42 +0500 Subject: [PATCH 2/2] feat: ten languages on the TV app, and a way to choose one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uzbek, Russian, German, Dutch, Spanish, Portuguese, French, Turkish and Indonesian, alongside the English base — 3,312 translated strings across nine `values-*` folders. No Arabic. It needs a mirrored leanback layout and a font carrying its glyphs, and neither is in this app; tying the other nine to that work would have held all of them. 44 resources are deliberately left in English: the nav-graph destination labels (never drawn on a leanback screen), brand names, the `•` separator, and the layout-preview samples. Android falls back per key, so omitting them is the right answer rather than a gap — and `tools/check_strings.py` knows the list, because a check that reports a deliberate decision as debt trains people to ignore it. The picker sits in My Account rather than relying on the system's per-app language setting. Android 13+ builds that entry from `locales_config.xml`, but the device this matters most on is a cheap TV box that shipped in a language its owner did not choose and would not know to change system-wide. `AppCompatDelegate.setApplicationLocales` carries the same mechanism down to this app's minSdk, so nothing is gated on 13. Also caught while wiring it up: the base English file still held Uzbek in four values ("Tv Kanallar", "Amallar", "soat", "daqiqa"), the content-controls header built its summary from English literals, and six section titles were hardcoded in custom layout attributes that the earlier extraction pass did not know to look at. The TV app had no CI at all, only a release workflow. It has one now: the string check, and an assembleDebug — `mergeDebugResources` is where a duplicate or badly named resource fails, and it fails for every locale at once. The check blocks on a mismatched format specifier in any locale, because that throws at `getString` time on that language only, and on keys missing from `uz`/`ru`, which the team writes. The other seven are reported and fall back to English. --- .github/workflows/ci.yml | 38 ++ app/src/main/AndroidManifest.xml | 1 + .../screens/profile/MyAccountPage.kt | 86 +++- app/src/main/res/layout/my_account_page.xml | 38 +- app/src/main/res/values-de/strings.xml | 398 +++++++++++++++++ app/src/main/res/values-es/strings.xml | 404 +++++++++++++++++ app/src/main/res/values-fr/strings.xml | 404 +++++++++++++++++ app/src/main/res/values-id/strings.xml | 398 +++++++++++++++++ app/src/main/res/values-nl/strings.xml | 398 +++++++++++++++++ app/src/main/res/values-pt/strings.xml | 404 +++++++++++++++++ app/src/main/res/values-ru/strings.xml | 410 ++++++++++++++++++ app/src/main/res/values-tr/strings.xml | 398 +++++++++++++++++ app/src/main/res/values-uz/strings.xml | 398 +++++++++++++++++ app/src/main/res/values/strings.xml | 19 +- app/src/main/res/xml/locales_config.xml | 26 ++ tools/check_strings.py | 128 ++++++ 16 files changed, 3934 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 app/src/main/res/values-de/strings.xml create mode 100644 app/src/main/res/values-es/strings.xml create mode 100644 app/src/main/res/values-fr/strings.xml create mode 100644 app/src/main/res/values-id/strings.xml create mode 100644 app/src/main/res/values-nl/strings.xml create mode 100644 app/src/main/res/values-pt/strings.xml create mode 100644 app/src/main/res/values-ru/strings.xml create mode 100644 app/src/main/res/values-tr/strings.xml create mode 100644 app/src/main/res/values-uz/strings.xml create mode 100644 app/src/main/res/xml/locales_config.xml create mode 100644 tools/check_strings.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..2ccda069 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,38 @@ +# The TV app had no CI at all — only a release workflow — so a broken string +# resource reached a device before anyone saw it. This is the cheap half of a +# build: it runs in seconds and catches the failure that is invisible in review. +name: CI + +on: + push: + branches: [master] + pull_request: + +jobs: + strings: + name: Translated strings + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + # A mismatched format specifier throws at getString time, on that locale + # only, on the screen that uses it. Nothing else in the build sees it. + - name: Check the string resources + run: python3 tools/check_strings.py + + build: + name: Assemble debug + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + - uses: gradle/actions/setup-gradle@v4 + # `mergeDebugResources` is where a duplicate or badly named string + # resource fails, and it fails for every locale at once. + - name: Build + run: ./gradlew :app:assembleDebug --no-daemon diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8cdd2804..2155da22 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,6 +54,7 @@ android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:localeConfig="@xml/locales_config" android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" android:requestRawExternalStorageAccess="true" diff --git a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt index 762c0570..83b11cae 100644 --- a/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt +++ b/app/src/main/java/com/saikou/sozo_tv/presentation/screens/profile/MyAccountPage.kt @@ -32,6 +32,10 @@ import com.saikou.sozo_tv.utils.loadImage import com.saikou.sozo_tv.utils.visible import kotlinx.coroutines.launch import org.koin.androidx.viewmodel.ext.android.activityViewModel +import com.saikou.sozo_tv.components.TvOptionChipView +import androidx.core.os.LocaleListCompat +import androidx.appcompat.app.AppCompatDelegate +import android.widget.LinearLayout class MyAccountPage : Fragment() { @@ -121,6 +125,7 @@ class MyAccountPage : Fragment() { settingsViewModel.loadStats() setupAppearanceSection() + setupLanguageSection() setupContentControlsSection() } @@ -212,6 +217,45 @@ class MyAccountPage : Fragment() { setupThemeDemo(binding) } + /** + * The in-app language picker. + * + * Android 13+ exposes a per-app language in the system settings, and + * `locales_config.xml` is what fills it — but the device this matters most + * on is a cheap TV box that shipped in a language its owner did not choose + * and would not know to change system-wide. So the same list is offered + * here, where they are already looking. + * + * `setApplicationLocales` recreates the activity itself; the AppCompat + * backport carries that down to API 21, so nothing here is gated on 13. + */ + private fun setupLanguageSection() { + val container = binding.languageChips + container.removeAllViews() + + val current = AppCompatDelegate.getApplicationLocales() + .takeIf { !it.isEmpty }?.get(0)?.language + ?: resources.configuration.locales[0].language + + SUPPORTED_LOCALES.forEach { (tag, nativeName) -> + val chip = TvOptionChipView(requireContext()).apply { + text = nativeName + isSelected = tag == current + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT, + ).apply { marginEnd = (12 * resources.displayMetrics.density).toInt() } + setOnClickListener { + if (tag == current) return@setOnClickListener + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(tag) + ) + } + } + container.addView(chip) + } + } + private fun setupContentControlsSection() { binding.contentControlsDropdown.setExpanded( preferenceManager.isContentControlsExpanded(), animate = false @@ -252,11 +296,22 @@ class MyAccountPage : Fragment() { } private fun updateContentControlsHeader() { - val ch = if (preferenceManager.isChannelEnabled()) "Enabled" else "Disabled" - val ns = if (preferenceManager.isNsfwEnabled()) "Enabled" else "Disabled" + val ch = getString( + if (preferenceManager.isChannelEnabled()) R.string.status_enabled + else R.string.status_disabled + ) + val ns = getString( + if (preferenceManager.isNsfwEnabled()) R.string.status_enabled + else R.string.status_disabled + ) - binding.contentControlsDropdown.setSummary("Home Channels: $ch • Adult: $ns") - binding.contentControlsDropdown.setBadge(if (preferenceManager.isNsfwEnabled()) "18+" else null) + binding.contentControlsDropdown.setSummary( + getString(R.string.content_controls_summary, ch, ns) + ) + // "18+" is an age mark, not a word — the same in every language here. + binding.contentControlsDropdown.setBadge( + if (preferenceManager.isNsfwEnabled()) "18+" else null + ) } private fun showNsfwWarningDialog() { @@ -491,4 +546,27 @@ class MyAccountPage : Fragment() { commit() } } + + private companion object { + /** + * Kept in step with `res/xml/locales_config.xml`. + * + * Native names on purpose: someone looking for their own language finds + * it fastest written the way they write it, which is the whole point on + * a television that is currently speaking the wrong one. + */ + val SUPPORTED_LOCALES = listOf( + "en" to "English", + "uz" to "O‘zbekcha", + "ru" to "Русский", + "de" to "Deutsch", + "nl" to "Nederlands", + "es" to "Español", + "pt" to "Português", + "fr" to "Français", + "tr" to "Türkçe", + "id" to "Bahasa Indonesia", + ) + } + } diff --git a/app/src/main/res/layout/my_account_page.xml b/app/src/main/res/layout/my_account_page.xml index 378542dc..4bd009e3 100644 --- a/app/src/main/res/layout/my_account_page.xml +++ b/app/src/main/res/layout/my_account_page.xml @@ -446,7 +446,7 @@ android:layout_marginBottom="14dp" app:expanded="false" app:sectionSubtitle="@string/customize_subtitle_font_color_and_size_tv_friendly" - app:sectionTitle="Subtitle Style"> + app:sectionTitle="@string/section_subtitle_style"> + app:sectionTitle="@string/section_theme"> + app:subtitleText="@string/theme_winter_mode_hint" + app:titleText="@string/theme_winter_mode" /> + + + + + + + + + + + app:sectionSubtitle="@string/section_content_privacy_hint" + app:sectionTitle="@string/section_content_privacy"> + + Suche + Start + Zurück + Zurück zum Start + Anime filtern + Tv Garden + Etwas ist schiefgelaufen. Bitte versuche es erneut. + Wiederholen + TV-Sender + Abo-Status + Aktiv + Meine Daten + Lesezeichen + Quellen + Wiedergabeverlauf + Nachrichten erhalten + Konto verlassen + Hier gibt es gerade weder Film noch Serie + Für diese Quelle gibt es keine Besetzungsdaten + Aktionen + Jetzt ansehen + Jetzt aktualisieren + Über den Film + Erscheinungsjahr + Studio + Kategorie + Sprache + Std. + Min. + Bitte nicht schließen + Kontakt + Über die Figur + Falscher Titel? + Anzeige von Inhalten für Erwachsene ein- oder ausschalten + Anzeige von Senderinhalten ein- oder ausschalten + Inhalte für Erwachsene (NSFW) + Sender auf der Startseite + LIVE-TV + Wiederholen + Folge %1$d + Läuft gerade + Die Details ließen sich nicht laden. Bitte versuche es erneut. + Gast + Folge %1$s wird geladen … + Qualität wird gewechselt … + Die Qualität ließ sich nicht wechseln — es bleibt bei der aktuellen. + Folgen von Teil %1$s werden geladen … + Das ist die letzte Folge + Das ist die erste Folge + QR-Code aktualisieren + Warten auf die Bestätigung am Handy … + Mit QR-Code anmelden + Scanne den Code mit dem Handy, oder öffne Sozo → Profil → Fernseher verbinden und gib den Code unten ein. + Dein Code + Läuft ab in %1$d:%2$02d + Code wird geholt … + Code abgelaufen. Drücke Aktualisieren für einen neuen. + Verbindung wird wiederhergestellt … + Angemeldet als %1$s + Anmeldung fehlgeschlagen. Drücke Aktualisieren und versuche es erneut. + Zurück + Keine Internetverbindung + Zu viele Versuche. Probiere es gleich noch einmal. + Mein Konto + Verwalte dein Profil und deine Einstellungen + Gastkonto + Anmelden + Besucher + Schrift, Farbe und Größe der Untertitel anpassen (TV-tauglich) + Vorschau + So sehen die Untertitel auf dem Fernseher aus + Schrift + Tage + Wiedergabeverlauf auf dem Startbildschirm ein- oder ausschalten + Verlaufsverwaltung + Quelle + Deine Suchvorschläge + Stil + Aus + An + Untertitel sind aus + Alle ansehen + Mehr Filme und Serien + Später + ZURÜCK drücken zum Abbrechen + Noch keine Nachrichten + STATUS + In Quellen finden + Folge %1$d als gesehen markieren + Alles gesehen + Wird gespeichert … + %1$d neu + Nicht verbunden — verbinde es in der Sozo-Handy-App unter Profil → Verbindungen + Nicht verbunden — verbinde es in der Sozo-Handy-App unter Profil → Verbindungen + Deine AniList-Liste ist leer. + Nichts in „%1$s“. + Dieses Gerät kann das Format nicht abspielen — eine andere Quelle wird versucht … + Dieser Fernseher kann dieses Videoformat nicht abspielen. Wähle eine andere Qualität oder einen anderen Server. + Verbindung verloren. Prüfe dein Netzwerk und versuche es erneut. + Dieser Link ist abgelaufen. Versuche es erneut oder wähle einen anderen Server. + Wiedergabe fehlgeschlagen. Probiere einen anderen Server oder eine andere Qualität. + gesehen + gespeichert + ungelesen + Saisonaler Hintergrund — im Winter fällt Schnee + Deinen gesamten Wiedergabeverlauf löschen? + Nicht verstanden. Versuche es erneut. + Die Mikrofonberechtigung für Sozo ist aus. + Die Sprachsuche ist gerade nicht verfügbar. + %1$d Anime + %1$d Folgen + %1$.1f im Schnitt + %1$d Tage gesehen + Etwas ist schiefgelaufen. Bitte versuche es erneut. + Der Server war nicht erreichbar. Prüfe deine Verbindung. + Keine Internetverbindung. + Der Server hat zu lange gebraucht. + Die sichere Verbindung ist fehlgeschlagen. + Noch keine gespeicherten Figuren + Noch keine gespeicherten Sender + Keine Ergebnisse gefunden + Für diese Quelle gibt es keine Kategorien + Keine Quelle gewählt — wähle zuerst eine aus + Nichts passte zu diesem Titel + Zu den Einstellungen + Einstellungen + Bildgröße + Einpassen + Ganzes Bild sichtbar, Balken an den Seiten + Füllen + Füllt den Bildschirm, Ränder werden abgeschnitten + Strecken + Passend gestreckt, Seitenverhältnis verzerrt + Ton + Tonspuren im Stream — Synchronfassung oder Original. + Tempo + Normal + Untertitel + Untertitelspuren im Stream. + Keine Untertitel + Videoqualität + Wähle eine Auflösung, oder lass den Player deiner Verbindung folgen. + Auto + Richtet sich nach deiner Verbindung + Server + Wähle, welcher Host diese Folge streamt. Die Qualität wird getrennt gewählt. + Quellen aktualisieren + Wird aktualisiert … + Es wird nach Quellen-Updates gesucht … + Repos werden aktualisiert … %1$d/%2$d + Aktualisierung fehlgeschlagen: %1$s + Alle Quellen sind aktuell + braucht einen Teil von CloudStream, den diese App nicht enthält (%1$s) + wurde gegen ein neueres CloudStream gebaut, als diese App mitbringt (%1$s) + die Plugin-Datei ließ sich nicht lesen — entferne das Repo und füge es erneut hinzu + Quellen werden eingerichtet … bitte warten + %1$s wird eingerichtet (%2$d/%3$d) … + %1$s wird eingerichtet (%2$d/%3$d) · %4$d/%5$d + Aktive Quelle: %1$s + Keine Anbieter verfügbar. + Keine Anbieter passen zu „%1$s“. + Anbieter ließen sich nicht laden: %1$s + Aus %1$s wurde keine Quelle installiert. Drücke „Quellen aktualisieren“, um es erneut zu versuchen. + Abspielen + Fast fertig + Fertig gesehen + %1$s von %2$s + Wiedergabeverlauf löschen + Behalten + Verlauf löschen + Suche nicht möglich — prüfe die Verbindung + Untertitel-Verzögerung + Der Untertitel „%1$s“ ließ sich nicht laden — probiere einen anderen + Zurück + Folgen + Vorige Folge + 10 s zurück + Abspielen + Pause + 10 s vor + Nächste Folge + Untertitel + Ton + Einstellungen + Spulen + Folge %1$d + Folge %1$d · %2$dp + Diese Folge ließ sich nicht laden. Prüfe deine Verbindung und versuche es erneut. + Folge %1$d + Weiterschauen + Zuletzt gesehen + IMDb %1$s + Bei %1$s fortsetzen? + Fortsetzen + Von vorn beginnen + Untertitel anzeigen + Untertitelstil + Textgröße + Textfarbe + Hintergrund + Kontur + Standard + Monospace + %1$s · %2$d sp · %3$s · Hintergrund: %4$s · Kontur: %5$s + Weiß + Orange + Grau + Grün + Rot + Blau + Von diesem Server + Heruntergeladen + KI-Übersetzung + Dieser Sender sendet gerade nicht. Versuche es gleich noch einmal. + Dieser Sender läuft gerade nicht. Versuche es erneut oder wähle einen anderen Sender. + Vom Handy hinzufügen + Quelle vom Handy hinzufügen + Scanne den Code oder öffne die Adresse unten in einem beliebigen Browser im selben WLAN. Keine App nötig. + 1 · Auf dem Handy öffnen + 2 · Diesen Code eingeben + 3 · Den Repository-Link einfügen und senden. Er wird hier auf dem Fernseher installiert. + Fertig + Warten auf dein Handy … + Dieser Fernseher ist in keinem Netz, das ein Handy erreicht. Verbinde ihn mit demselben WLAN und öffne diesen Bildschirm erneut. + %1$s empfangen — wird installiert … + %1$d von %2$d wird installiert … + %1$d Quelle(n) hinzugefügt. Sie stehen in der Liste hinter diesem Bildschirm. + Installiert, aber es kam keine Quelle dazu. Der Link zeigt womöglich auf die falsche Datei. + Installation nicht möglich: %1$s + Konto + Sender wird geladen... + Verbindungsfehler + Jetzt abspielen + Folge uns in den sozialen Medien + Profil + "Konto " + Möchtest du wirklich beenden? + Jetzt nicht + Ja, weiter + "Filter " + Bewertung wählen: + Anwenden + Sortierung wählen + Jahr wählen + Tv Garden filtern + Typ wählen: + Anbieter + Anbieter suchen … + Leeren + Anime + Figuren + TV-Sender + nach Land + nach Kategorie + Sendername + LIVE + Regional gesperrt + Deaktiviert + Inhaltsmodus + Wähle die Art von Inhalten, die du bevorzugst + Anime-Modus + Film-Modus + AKTIV + Merkliste aktualisiert + Deine Merkliste hat 5 neue Titel bekommen. Verpasse die Neuheiten nicht. + aktualisieren + Vielleicht gefällt dir + Wird geschaut + Textgröße + Textfarbe + Untertitel-Hintergrund + Warnung: Inhalte für Erwachsene + Du bist dabei, Inhalte für Erwachsene (NSFW) einzuschalten. Sie sind nicht für alle Zuschauer geeignet. + Altersbestätigung + Für Inhalte für Erwachsene musst du 18+ sein + Sichtbarkeit von Inhalten + Inhalte für Erwachsene sind dann überall in der App sichtbar + Leicht wieder auszuschalten + Du kannst das jederzeit in deinen Kontoeinstellungen ausschalten + Verstanden, einschalten + NSFW-Inhalte deaktiviert + Inhalte für Erwachsene sind derzeit aus. Um sie zu sehen, schalte NSFW in deinen Einstellungen ein. + Ausblenden + Suchbegriff + Suche entfernen + Diese Quelle + Anime suchen... + Titel + Nach Land + Nach Kategorie + Ich höre zu … + Aktiviert + Deaktiviert + Folge %1$d + Nach Kategorie + Nach Land + Eigene Liste + Quellen werden eingerichtet … + Kein Stream verfügbar + Anime filtern + Filme filtern + Medien werden geladen.. + Folgen werden geladen.. + Alter: %1$s + Ausgestrahlt! + Alle Quellen + Ich höre zu... + Ich höre zu... Sprich jetzt + Keine Sprache erkannt + Wird gestartet … + Sprachsuche wird gestartet... + Sprachsuche nicht verfügbar + Fehler bei der Sprachsuche + Suche nach: %1$s + Sprachsuche abgebrochen + „%1$s“ wird geöffnet … + Die Anmeldeseite ist noch nicht angebunden + Update verfügbar + Wird geladen … + Download abgeschlossen! + Jetzt installieren + Download fehlgeschlagen + Erneut versuchen + + %1$d Quelle aktualisiert + %1$d Quellen aktualisiert + + + %1$d Quelle + %1$d Quellen + + + %1$d Repo + %1$d Repos + + + %1$d Plugin ließ sich nicht laden + %1$d Plugins ließen sich nicht laden + + Quelle wird gesucht … + Diese Quelle ist langsam … + Anderen Server probieren + Wechsel zu %1$s … + Wechsel zu %1$s … + Du hast diese Serie zu Ende gesehen + Das war die letzte hier verfügbare Folge. + Nochmal ansehen + Diese Folge lässt sich nicht starten + Gestoppt bei %1$s + %1$d s überspringen + Intro überspringen + Abspann überspringen + Rückblick überspringen + %1$s — Folge %2$d + + Teil %1$d · %2$d Folge + Teil %1$d · %2$d Folgen + + Als Nächstes + Jetzt abspielen + Weiterschauen + Startet in %1$d s + OK drücken zum Überspringen + Wiedergabe gestoppt + Wiederholen + Server wechseln + Zurück + Wird geladen … + Folgenliste + Untertitel online suchen + Titel, nach dem gesucht wird + Suchen + Für diesen Titel wurden keine Untertitel gefunden + Wird gesucht … + Nach %1$s übersetzen (KI) + Heute noch %1$d + Wird übersetzt … das kann bis zu einer Minute dauern + Übersetzung fehlgeschlagen — versuche es später + Nichts zu übersetzen — für diesen Titel wurde kein Untertitel gefunden + %1$s (KI) + Heute keine KI-Übersetzungen mehr übrig + Untertitel + + %1$d Untertitel gefunden + %1$d Untertitel gefunden + + Wintermodus (Überrasch mich) + Winter-Design-Vorschau ein-/ausschalten + Design + Untertitelstil + Inhalte & Privatsphäre + Verwalte, was auf der Startseite erscheint + Startseiten-Sender: %1$s \u2022 Erwachsene: %2$s + Sprache + Die Sprache, in der Sozo auf diesem Fernseher spricht + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..b0ae3fa2 --- /dev/null +++ b/app/src/main/res/values-es/strings.xml @@ -0,0 +1,404 @@ + + + Buscar + Inicio + Atrás + Volver al inicio + Filtrar anime + Tv Garden + Algo salió mal. Inténtalo de nuevo. + Reintentar + Canales de TV + Estado de la suscripción + Activa + Mis datos + Página de marcadores + Fuentes + Historial + Recibir mensajes + Cerrar sesión + Ahora mismo aquí no hay ninguna película ni serie + Esta fuente no tiene datos del reparto + Acciones + Ver ahora + Actualizar ahora + Sobre la película + Año de estreno + Estudio + Categoría + Idioma + h + min + Por favor, no cierres + Contacto + Sobre el personaje + ¿Título incorrecto? + Activa o desactiva la visibilidad del contenido para adultos + Activa o desactiva la visibilidad del contenido de canales + Contenido para adultos (NSFW) + Canales de la pantalla de inicio + TV EN VIVO + Reintentar + Episodio %1$d + Reproduciendo ahora + No se pudieron cargar los detalles. Inténtalo de nuevo. + Invitado + Cargando el episodio %1$s… + Cambiando la calidad… + No se pudo cambiar la calidad: seguimos con la actual. + Cargando los episodios de la parte %1$s… + Este es el último episodio + Este es el primer episodio + Actualizar el código QR + Esperando la confirmación en tu móvil… + Iniciar sesión con código QR + Escanea el código con el móvil, o abre Sozo → Perfil → Vincular una TV y escribe el código de abajo. + Tu código + Caduca en %1$d:%2$02d + Obteniendo tu código… + El código caducó. Pulsa Actualizar para conseguir otro. + Reconectando… + Sesión iniciada como %1$s + No se pudo iniciar sesión. Pulsa Actualizar e inténtalo otra vez. + Atrás + Sin conexión a internet + Demasiados intentos. Prueba dentro de un momento. + Mi cuenta + Gestiona tu perfil y tus preferencias + Cuenta de invitado + Iniciar sesión + Visitante + Ajusta la fuente, el color y el tamaño de los subtítulos (pensado para TV) + Vista previa + Así se verán los subtítulos en la TV + Fuente + Días + Activa o desactiva el historial en la pantalla de inicio + Gestor del historial + Fuente + Tus búsquedas recomendadas + Estilo + Desactivado + Activado + Los subtítulos están desactivados + Ver todo + Ver más películas y series + Más tarde + Pulsa ATRÁS para cancelar + Aún no hay mensajes + ESTADO + Buscar en las fuentes + Marcar el episodio %1$d como visto + Al día + Guardando… + %1$d nuevos + Sin conectar: conéctalo en la app de Sozo del móvil, en Perfil → Conexiones + Sin conectar: conéctalo en la app de Sozo del móvil, en Perfil → Conexiones + Tu lista de AniList está vacía. + No hay nada en «%1$s». + Este dispositivo no reproduce ese formato: probando otra fuente… + Esta TV no reproduce este formato de vídeo. Elige otra calidad u otro servidor. + Se perdió la conexión. Comprueba tu red e inténtalo de nuevo. + Ese enlace ha caducado. Inténtalo de nuevo o elige otro servidor. + La reproducción falló. Prueba otro servidor u otra calidad. + visto + guardado + sin leer + Fondo por temporada: en invierno cae nieve + ¿Borrar todo tu historial de reproducción? + No te entendimos. Inténtalo otra vez. + El permiso de micrófono para Sozo está desactivado. + La búsqueda por voz no está disponible ahora mismo. + %1$d anime + %1$d episodios + %1$.1f de media + %1$d d vistos + Algo salió mal. Inténtalo de nuevo. + No se pudo contactar con el servidor. Comprueba tu conexión. + Sin conexión a internet. + El servidor tardó demasiado en responder. + Falló la conexión segura. + Aún no hay personajes guardados + Aún no hay canales guardados + No se encontraron resultados + Esta fuente no tiene categorías + No hay fuente elegida: elige una primero + Nada coincidió con ese título + Ir a Ajustes + Ajustes + Tamaño de pantalla + Ajustar + Se ve todo el cuadro, con bandas a los lados + Rellenar + Rellena la pantalla y recorta los bordes + Estirar + Estirado hasta encajar, se rompe la proporción + Audio + Pistas de audio dentro del flujo: doblaje u original. + Velocidad + Normal + Subtítulos + Pistas de subtítulos dentro del flujo. + Sin subtítulos + Calidad de vídeo + Elige una resolución, o deja que el reproductor siga tu conexión. + Automática + Se adapta a tu conexión + Servidor + Elige qué host emite este episodio. La calidad se elige aparte. + Actualizar fuentes + Actualizando… + Buscando actualizaciones de fuentes… + Actualizando repos… %1$d/%2$d + La actualización falló: %1$s + Todas las fuentes están al día + necesita una parte de CloudStream que esta app no incluye (%1$s) + está compilado para un CloudStream más nuevo que el de esta app (%1$s) + no se pudo leer el archivo del complemento: quita el repo y añádelo otra vez + Preparando las fuentes… espera un momento + Preparando %1$s (%2$d/%3$d)… + Preparando %1$s (%2$d/%3$d) · %4$d/%5$d + Fuente activa: %1$s + No hay proveedores disponibles. + Ningún proveedor coincide con «%1$s». + No se pudieron cargar los proveedores: %1$s + No se instaló ninguna fuente de %1$s. Pulsa «Actualizar fuentes» para intentarlo otra vez. + Reproducir + Casi terminado + Terminado + %1$s de %2$s + Borrar el historial de reproducción + Conservarlo + Borrar el historial + No se pudo buscar: comprueba la conexión + Retardo de los subtítulos + No se pudieron cargar los subtítulos «%1$s»: prueba con otros + Atrás + Episodios + Episodio anterior + Retroceder 10 s + Reproducir + Pausar + Adelantar 10 s + Episodio siguiente + Subtítulos + Audio + Ajustes + Desplazar + Episodio %1$d + Episodio %1$d · %2$dp + No se pudo cargar este episodio. Comprueba tu conexión e inténtalo de nuevo. + Episodio %1$d + Seguir viendo + Visto por última vez + IMDb %1$s + ¿Continuar desde %1$s? + Continuar + Empezar de nuevo + Mostrar subtítulos + Estilo de subtítulos + Tamaño del texto + Color del texto + Fondo + Contorno + Por defecto + Monoespaciada + %1$s · %2$d sp · %3$s · Fondo: %4$s · Contorno: %5$s + Blanco + Naranja + Gris + Verde + Rojo + Azul + De este servidor + Descargado + Traducido por IA + Este canal no está emitiendo ahora mismo. Prueba dentro de un momento. + Este canal no está funcionando ahora. Inténtalo otra vez o elige otro canal. + Añadir desde el móvil + Añade una fuente desde tu móvil + Escanea el código, o abre la dirección de abajo en cualquier navegador de la misma wifi. No hace falta ninguna app. + 1 · Ábrelo en el móvil + 2 · Introduce este código + 3 · Pega el enlace del repositorio y envíalo. Se instala aquí, en el televisor. + Listo + Esperando tu móvil… + Esta TV no está en una red a la que llegue un móvil. Conéctala a la misma wifi y vuelve a abrir esta pantalla. + Recibido %1$s: instalando… + Instalando %1$d de %2$d… + Se añadieron %1$d fuente(s). Están en la lista detrás de esta pantalla. + Se instaló, pero no añadió ninguna fuente. Puede que el enlace apunte al archivo equivocado. + No se pudo instalar: %1$s + Cuenta + Cargando el canal... + Error de conexión + Reproducir ahora + Síguenos en redes + Perfil + "Cuenta " + ¿Seguro que quieres salir? + Ahora no + Sí, continuar + "Filtro " + Elige una valoración: + Aplicar + Elige el orden + Elige el año + Filtrar Tv Garden + Elige el tipo: + Proveedores + Buscar proveedores… + Borrar + Anime + Personajes + Canales de TV + por país + por categoría + Nombre del canal + EN VIVO + Bloqueado por región + Desactivado + Modo de contenido + Elige el tipo de contenido que prefieres + Modo anime + Modo películas + ACTIVO + Lista actualizada + Se han añadido 5 novedades a tu lista. No te pierdas lo último. + actualizar + Quizás te guste + Viendo + Tamaño del texto + Color del texto + Fondo de los subtítulos + Aviso de contenido para adultos + Vas a activar el contenido para adultos (NSFW). Puede no ser adecuado para todos los públicos. + Verificación de edad + Debes tener 18 años o más para ver contenido para adultos + Visibilidad del contenido + El contenido para adultos se verá en toda la plataforma + Fácil de desactivar + Puedes desactivarlo cuando quieras en los ajustes de tu cuenta + Lo entiendo, activar + Contenido NSFW desactivado + El contenido para adultos está desactivado. Para verlo, activa NSFW en tus preferencias. + Ocultar + Consulta de búsqueda + Quitar la búsqueda + Esta fuente + Buscar anime... + Título + Por país + Por categoría + Escuchando… + Activado + Desactivado + Episodio %1$d + Por categoría + Por país + Lista personalizada + Preparando las fuentes… + No hay ningún flujo disponible + Filtrar anime + Filtrar películas + Cargando el contenido.. + Cargando los episodios.. + Edad: %1$s + ¡Ya está! + Todas las fuentes + Escuchando... + Escuchando... Habla + No se detectó voz + Iniciando… + Iniciando la búsqueda por voz... + La búsqueda por voz no está disponible + Error en la búsqueda por voz + Buscando: %1$s + Búsqueda por voz cancelada + Abriendo «%1$s»… + La página de inicio de sesión aún no está conectada + Actualización disponible + Descargando… + ¡Descarga completa! + Instalar ahora + La descarga falló + Inténtalo de nuevo + + %1$d fuente actualizada + %1$d fuentes actualizadas + %1$d fuentes actualizadas + + + %1$d fuente + %1$d fuentes + %1$d fuentes + + + %1$d repo + %1$d repos + %1$d repos + + + %1$d complemento no se pudo cargar + %1$d complementos no se pudieron cargar + %1$d complementos no se pudieron cargar + + Buscando una fuente… + Esta fuente va lenta… + Prueba otro servidor + Cambiando a %1$s… + Cambiando a %1$s… + Has terminado esta serie + Ese era el último episodio disponible aquí. + Volver a verla + No se puede iniciar este episodio + Parado en %1$s + Saltar %1$d s + Saltar intro + Saltar créditos + Saltar el resumen + %1$s — episodio %2$d + + Parte %1$d · %2$d episodio + Parte %1$d · %2$d episodios + Parte %1$d · %2$d episodios + + A continuación + Reproducir ahora + Seguir viendo + Empieza en %1$d s + Pulsa OK para saltar + Reproducción detenida + Reintentar + Cambiar de servidor + Atrás + Cargando… + Lista de episodios + Buscar subtítulos en línea + Título que buscar + Buscar + No se encontraron subtítulos para este título + Buscando… + Traducir al %1$s (IA) + Te quedan %1$d hoy + Traduciendo… puede tardar hasta un minuto + No se pudo traducir: inténtalo más tarde + No hay nada que traducir: no se encontraron subtítulos para este título + %1$s (IA) + No te quedan traducciones con IA por hoy + Subtítulos + + %1$d subtítulo encontrado + %1$d subtítulos encontrados + %1$d subtítulos encontrados + + Modo invierno (sorpréndeme) + Activa o desactiva la vista previa del tema invernal + Tema + Estilo de subtítulos + Contenido y privacidad + Gestiona lo que aparece en Inicio + Canales de Inicio: %1$s \u2022 Adultos: %2$s + Idioma + El idioma en el que Sozo habla en esta televisión + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000..38e8526e --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,404 @@ + + + Recherche + Accueil + Retour + Retour à l’accueil + Filtrer les animes + Tv Garden + Un problème est survenu. Réessaie. + Réessayer + Chaînes TV + État de l’abonnement + Actif + Mes informations + Page des favoris + Sources + Historique + Recevoir les messages + Quitter le compte + Il n’y a ni film ni série ici pour l’instant + Cette source ne fournit pas la distribution + Actions + Regarder maintenant + Mettre à jour + À propos du film + Année de sortie + Studio + Catégorie + Langue + h + min + Merci de ne pas fermer + Contact + À propos du personnage + Mauvais titre ? + Activer ou désactiver l’affichage du contenu pour adultes + Activer ou désactiver l’affichage du contenu des chaînes + Contenu pour adultes (NSFW) + Chaînes de l’écran d’accueil + TV EN DIRECT + Réessayer + Épisode %1$d + En cours de lecture + Impossible de charger les détails. Réessaie. + Invité + Chargement de l’épisode %1$s… + Changement de qualité… + Impossible de changer de qualité — on reste sur l’actuelle. + Chargement des épisodes de la partie %1$s… + C’est le dernier épisode + C’est le premier épisode + Actualiser le QR code + En attente de la validation sur ton téléphone… + Se connecter avec un QR code + Scanne le code avec ton téléphone, ou ouvre Sozo → Profil → Associer une TV et saisis le code ci-dessous. + Ton code + Expire dans %1$d:%2$02d + Récupération de ton code… + Code expiré. Appuie sur Actualiser pour en obtenir un nouveau. + Reconnexion… + Connecté en tant que %1$s + La connexion a échoué. Appuie sur Actualiser et réessaie. + Retour + Pas de connexion internet + Trop de tentatives. Réessaie dans un instant. + Mon compte + Gère ton profil et tes préférences + Compte invité + Connexion + Visiteur + Règle la police, la couleur et la taille des sous-titres (adapté à la TV) + Aperçu + Voilà à quoi ressembleront les sous-titres sur la TV + Police + Jours + Activer ou désactiver l’historique sur l’écran d’accueil + Gestion de l’historique + Source + Tes suggestions de recherche + Style + Désactivé + Activé + Les sous-titres sont désactivés + Tout voir + Voir plus de films et de séries + Plus tard + Appuie sur RETOUR pour annuler + Aucun message pour l’instant + STATUT + Chercher dans les sources + Marquer l’épisode %1$d comme vu + À jour + Enregistrement… + %1$d nouveaux + Non connecté — connecte-le dans l’appli Sozo du téléphone, sous Profil → Connexions + Non connecté — connecte-le dans l’appli Sozo du téléphone, sous Profil → Connexions + Ta liste AniList est vide. + Rien dans « %1$s ». + Cet appareil ne lit pas ce format — on essaie une autre source… + Cette TV ne lit pas ce format vidéo. Choisis une autre qualité ou un autre serveur. + Connexion perdue. Vérifie ton réseau et réessaie. + Ce lien a expiré. Réessaie ou choisis un autre serveur. + La lecture a échoué. Essaie un autre serveur ou une autre qualité. + vus + enregistrés + non lus + Fond saisonnier — en hiver, il neige + Effacer tout ton historique de visionnage ? + Je n’ai pas compris. Réessaie. + L’autorisation micro est désactivée pour Sozo. + La recherche vocale est indisponible pour le moment. + %1$d animes + %1$d épisodes + %1$.1f de moyenne + %1$d j regardés + Un problème est survenu. Réessaie. + Le serveur est injoignable. Vérifie ta connexion. + Pas de connexion internet. + Le serveur a mis trop de temps à répondre. + La connexion sécurisée a échoué. + Aucun personnage enregistré pour l’instant + Aucune chaîne enregistrée pour l’instant + Aucun résultat + Cette source ne propose aucune catégorie + Aucune source choisie — commence par en sélectionner une + Rien ne correspond à ce titre + Aller dans les réglages + Réglages + Taille de l’image + Adapter + Toute l’image visible, avec des bandes sur les côtés + Remplir + Remplit l’écran, les bords sont rognés + Étirer + Étiré pour remplir, proportions faussées + Audio + Pistes audio du flux — VF ou version originale. + Vitesse + Normale + Sous-titres + Pistes de sous-titres du flux. + Aucun sous-titre + Qualité vidéo + Choisis une résolution, ou laisse le lecteur suivre ta connexion. + Auto + S’adapte à ta connexion + Serveur + Choisis quel hôte diffuse cet épisode. La qualité se choisit séparément. + Mettre à jour les sources + Mise à jour… + Recherche de mises à jour des sources… + Mise à jour des dépôts… %1$d/%2$d + La mise à jour a échoué : %1$s + Toutes les sources sont à jour + a besoin d’une partie de CloudStream absente de cette appli (%1$s) + a été compilé pour un CloudStream plus récent que celui de cette appli (%1$s) + le fichier du plugin est illisible — supprime le dépôt et rajoute-le + Préparation des sources… un instant + Préparation de %1$s (%2$d/%3$d)… + Préparation de %1$s (%2$d/%3$d) · %4$d/%5$d + Source active : %1$s + Aucun fournisseur disponible. + Aucun fournisseur ne correspond à « %1$s ». + Impossible de charger les fournisseurs : %1$s + Aucune source installée depuis %1$s. Appuie sur « Mettre à jour les sources » pour réessayer. + Lire + Presque terminé + Terminé + %1$s sur %2$s + Effacer l’historique de visionnage + Le garder + Effacer l’historique + Recherche impossible — vérifie la connexion + Décalage des sous-titres + Impossible de charger les sous-titres « %1$s » — essaie-en d’autres + Retour + Épisodes + Épisode précédent + Reculer de 10 s + Lire + Pause + Avancer de 10 s + Épisode suivant + Sous-titres + Audio + Réglages + Naviguer + Épisode %1$d + Épisode %1$d · %2$dp + Impossible de charger cet épisode. Vérifie ta connexion et réessaie. + Épisode %1$d + Reprendre + Vu en dernier + IMDb %1$s + Reprendre à %1$s ? + Continuer + Recommencer + Afficher les sous-titres + Style des sous-titres + Taille du texte + Couleur du texte + Fond + Contour + Par défaut + Monospace + %1$s · %2$d sp · %3$s · Fond : %4$s · Contour : %5$s + Blanc + Orange + Gris + Vert + Rouge + Bleu + De ce serveur + Téléchargé + Traduit par IA + Cette chaîne n’émet pas pour le moment. Réessaie dans un instant. + Cette chaîne ne fonctionne pas pour le moment. Réessaie ou choisis-en une autre. + Ajouter depuis le téléphone + Ajoute une source depuis ton téléphone + Scanne le code, ou ouvre l’adresse ci-dessous dans n’importe quel navigateur sur le même Wi‑Fi. Aucune appli nécessaire. + 1 · Ouvre-le sur ton téléphone + 2 · Saisis ce code + 3 · Colle le lien du dépôt et envoie-le. Il s’installe ici, sur la télévision. + Terminé + En attente de ton téléphone… + Cette TV n’est pas sur un réseau qu’un téléphone peut atteindre. Connecte-la au même Wi‑Fi et rouvre cet écran. + %1$s reçu — installation… + Installation de %1$d sur %2$d… + %1$d source(s) ajoutée(s). Elles sont dans la liste derrière cet écran. + Installé, mais aucune source n’a été ajoutée. Le lien pointe peut-être vers le mauvais fichier. + Installation impossible : %1$s + Compte + Chargement de la chaîne... + Erreur de connexion + Lire maintenant + Suis-nous sur les réseaux + Profil + "Compte " + Veux-tu vraiment quitter ? + Pas maintenant + Oui, continuer + "Filtre " + Choisis une note : + Appliquer + Choisis un tri + Choisis une année + Filtrer Tv Garden + Choisis un type : + Fournisseurs + Rechercher des fournisseurs… + Effacer + Anime + Personnages + Chaînes TV + par pays + par catégorie + Nom de la chaîne + EN DIRECT + Bloqué dans la région + Désactivé + Mode de contenu + Choisis le type de contenu que tu préfères + Mode anime + Mode films + ACTIF + Liste mise à jour + 5 nouveautés ont été ajoutées à ta liste. Ne rate pas les dernières sorties. + mettre à jour + Ça pourrait te plaire + En cours + Taille du texte + Couleur du texte + Fond des sous-titres + Avertissement : contenu pour adultes + Tu vas activer le contenu pour adultes (NSFW). Il peut ne pas convenir à tous les publics. + Vérification de l’âge + Tu dois avoir 18 ans ou plus pour voir du contenu pour adultes + Visibilité du contenu + Le contenu pour adultes sera visible partout dans l’appli + Facile à désactiver + Tu peux désactiver ça à tout moment dans les réglages de ton compte + J’ai compris, activer + Contenu NSFW désactivé + Le contenu pour adultes est désactivé. Pour y accéder, active le NSFW dans tes préférences. + Masquer + Requête de recherche + Supprimer la recherche + Cette source + Rechercher un anime... + Titre + Par pays + Par catégorie + J’écoute… + Activé + Désactivé + Épisode %1$d + Par catégorie + Par pays + Liste personnalisée + Préparation des sources… + Aucun flux disponible + Filtrer les animes + Filtrer les films + Chargement du média.. + Chargement des épisodes.. + Âge : %1$s + C’est sorti ! + Toutes les sources + J’écoute... + J’écoute... Parle maintenant + Aucune parole détectée + Démarrage… + Démarrage de la recherche vocale... + La recherche vocale n’est pas disponible + Erreur de recherche vocale + Recherche de : %1$s + Recherche vocale annulée + Ouverture de « %1$s »… + La page de connexion n’est pas encore branchée + Mise à jour disponible + Téléchargement… + Téléchargement terminé ! + Installer + Le téléchargement a échoué + Réessayer + + %1$d source mise à jour + %1$d source mise à jour + %1$d sources mises à jour + + + %1$d source + %1$d source + %1$d sources + + + %1$d dépôt + %1$d dépôt + %1$d dépôts + + + %1$d plugin n’a pas pu être chargé + %1$d plugin n’a pas pu être chargé + %1$d plugins n’ont pas pu être chargés + + Recherche d’une source… + Cette source est lente… + Essaie un autre serveur + Passage à %1$s… + Passage à %1$s… + Tu as terminé cette série + C’était le dernier épisode disponible ici. + Revoir + Impossible de lancer cet épisode + Arrêté à %1$s + Passer %1$d s + Passer l’intro + Passer le générique + Passer le résumé + %1$s — épisode %2$d + + Partie %1$d · %2$d épisode + Partie %1$d · %2$d épisode + Partie %1$d · %2$d épisodes + + À suivre + Lire maintenant + Continuer à regarder + Démarre dans %1$d s + Appuie sur OK pour passer + Lecture arrêtée + Réessayer + Changer de serveur + Retour + Chargement… + Liste des épisodes + Chercher des sous-titres en ligne + Titre à rechercher + Rechercher + Aucun sous-titre trouvé pour ce titre + Recherche… + Traduire en %1$s (IA) + Il t’en reste %1$d aujourd’hui + Traduction… cela peut prendre jusqu’à une minute + Traduction impossible — réessaie plus tard + Rien à traduire — aucun sous-titre trouvé pour ce titre + %1$s (IA) + Plus de traductions IA pour aujourd’hui + Sous-titres + + %1$d sous-titre trouvé + %1$d sous-titre trouvé + %1$d sous-titres trouvés + + Mode hiver (surprends-moi) + Activer ou désactiver l’aperçu du thème hivernal + Thème + Style des sous-titres + Contenu et confidentialité + Gère ce qui apparaît sur l’accueil + Chaînes de l’accueil : %1$s \u2022 Adultes : %2$s + Langue + La langue dans laquelle Sozo parle sur cette télévision + diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml new file mode 100644 index 00000000..192a35c5 --- /dev/null +++ b/app/src/main/res/values-id/strings.xml @@ -0,0 +1,398 @@ + + + Cari + Beranda + Kembali + Kembali ke beranda + Saring anime + Tv Garden + Ada yang tidak beres. Coba lagi. + Coba lagi + Kanal TV + Status langganan + Aktif + Data saya + Halaman markah + Sumber + Riwayat tontonan + Terima pesan + Keluar dari akun + Saat ini belum ada film atau serial di sini + Sumber ini tidak menyediakan data pemeran + Tindakan + Tonton sekarang + Perbarui sekarang + Tentang film + Tahun rilis + Studio + Kategori + Bahasa + j + mnt + Mohon jangan ditutup + Kontak + Tentang tokoh + Judulnya salah? + Nyalakan atau matikan tampilan konten dewasa + Nyalakan atau matikan tampilan konten kanal + Konten dewasa (NSFW) + Kanal di layar beranda + TV LANGSUNG + Coba lagi + Episode %1$d + Sedang diputar + Detailnya tidak bisa dimuat. Coba lagi. + Tamu + Memuat episode %1$s… + Mengganti kualitas… + Kualitas tidak bisa diganti — tetap di yang sekarang. + Memuat episode bagian %1$s… + Ini episode terakhir + Ini episode pertama + Segarkan kode QR + Menunggu persetujuan di ponselmu… + Masuk dengan kode QR + Pindai kodenya dengan ponsel, atau buka Sozo → Profil → Hubungkan TV lalu ketik kode di bawah ini. + Kodemu + Kedaluwarsa dalam %1$d:%2$02d + Mengambil kodemu… + Kode kedaluwarsa. Tekan Segarkan untuk yang baru. + Menyambung ulang… + Masuk sebagai %1$s + Gagal masuk. Tekan Segarkan lalu coba lagi. + Kembali + Tidak ada koneksi internet + Terlalu banyak percobaan. Coba lagi sebentar. + Akun saya + Kelola profil dan preferensimu + Akun tamu + Masuk + Pengunjung + Atur huruf, warna, dan ukuran subtitle (cocok untuk TV) + Pratinjau + Beginilah tampilan subtitle di TV + Huruf + Hari + Nyalakan atau matikan riwayat tontonan di layar beranda + Pengelola riwayat + Sumber + Rekomendasi pencarian untukmu + Gaya + Mati + Nyala + Subtitle sedang mati + Lihat semua + Lihat lebih banyak film dan serial + Nanti + Tekan KEMBALI untuk membatalkan + Belum ada pesan + STATUS + Cari di sumber + Tandai episode %1$d sudah ditonton + Sudah terkejar semua + Menyimpan… + %1$d baru + Belum terhubung — hubungkan di aplikasi Sozo pada ponsel, di Profil → Koneksi + Belum terhubung — hubungkan di aplikasi Sozo pada ponsel, di Profil → Koneksi + Daftar AniList-mu kosong. + Tidak ada apa pun di “%1$s”. + Perangkat ini tidak bisa memutar format itu — mencoba sumber lain… + TV ini tidak bisa memutar format video ini. Pilih kualitas atau server lain. + Koneksi terputus. Periksa jaringanmu lalu coba lagi. + Tautan itu sudah kedaluwarsa. Coba lagi, atau pilih server lain. + Pemutaran gagal. Coba server atau kualitas lain. + ditonton + disimpan + belum dibaca + Latar musiman — pada musim dingin turun salju + Hapus seluruh riwayat tontonanmu? + Tidak tertangkap. Coba lagi. + Izin mikrofon untuk Sozo sedang mati. + Pencarian suara sedang tidak tersedia. + %1$d anime + %1$d episode + rata-rata %1$.1f + %1$d hr ditonton + Ada yang tidak beres. Coba lagi. + Server tidak bisa dihubungi. Periksa koneksimu. + Tidak ada koneksi internet. + Server terlalu lama menjawab. + Koneksi aman gagal. + Belum ada tokoh yang disimpan + Belum ada kanal yang disimpan + Tidak ada hasil + Sumber ini tidak punya kategori + Belum ada sumber dipilih — pilih satu dulu + Tidak ada yang cocok dengan judul itu + Buka Pengaturan + Pengaturan + Ukuran layar + Sesuaikan + Seluruh bingkai terlihat, ada bilah di sisi + Penuhi + Memenuhi layar, tepinya terpotong + Regangkan + Diregangkan agar pas, rasio jadi tidak benar + Audio + Trek audio di dalam aliran — sulih suara atau asli. + Kecepatan + Normal + Subtitle + Trek subtitle di dalam aliran. + Tanpa subtitle + Kualitas video + Pilih resolusi, atau biarkan pemutar mengikuti koneksimu. + Otomatis + Mengikuti koneksimu + Server + Pilih host mana yang menyiarkan episode ini. Kualitas dipilih terpisah. + Perbarui sumber + Memperbarui… + Memeriksa pembaruan sumber… + Memperbarui repo… %1$d/%2$d + Pembaruan gagal: %1$s + Semua sumber sudah versi terbaru + membutuhkan bagian CloudStream yang tidak ada di aplikasi ini (%1$s) + dibuat untuk CloudStream yang lebih baru daripada yang dibawa aplikasi ini (%1$s) + berkas plugin tidak bisa dibaca — hapus reponya lalu tambahkan lagi + Menyiapkan sumber… mohon tunggu + Menyiapkan %1$s (%2$d/%3$d)… + Menyiapkan %1$s (%2$d/%3$d) · %4$d/%5$d + Sumber aktif: %1$s + Tidak ada penyedia yang tersedia. + Tidak ada penyedia yang cocok dengan “%1$s”. + Penyedia tidak bisa dimuat: %1$s + Tidak ada sumber yang terpasang dari %1$s. Tekan “Perbarui sumber” untuk mencoba lagi. + Putar + Hampir selesai + Selesai + %1$s dari %2$s + Hapus riwayat tontonan + Biarkan + Hapus riwayat + Tidak bisa mencari — periksa koneksinya + Jeda subtitle + Subtitle “%1$s” tidak bisa dimuat — coba yang lain + Kembali + Episode + Episode sebelumnya + Mundur 10 dtk + Putar + Jeda + Maju 10 dtk + Episode berikutnya + Subtitle + Audio + Pengaturan + Geser posisi + Episode %1$d + Episode %1$d · %2$dp + Episode ini tidak bisa dimuat. Periksa koneksimu lalu coba lagi. + Episode %1$d + Lanjutkan menonton + Terakhir ditonton + IMDb %1$s + Lanjutkan dari %1$s? + Lanjutkan + Mulai dari awal + Tampilkan subtitle + Gaya subtitle + Ukuran teks + Warna teks + Latar + Garis luar + Bawaan + Monospasi + %1$s · %2$d sp · %3$s · Latar: %4$s · Garis luar: %5$s + Putih + Oranye + Abu-abu + Hijau + Merah + Biru + Dari server ini + Diunduh + Diterjemahkan AI + Kanal ini sedang tidak menyiarkan. Coba lagi sebentar. + Kanal ini sedang tidak jalan. Coba lagi, atau pilih kanal lain. + Tambah dari ponsel + Tambahkan sumber dari ponselmu + Pindai kodenya, atau buka alamat di bawah ini di peramban apa pun pada Wi‑Fi yang sama. Tidak perlu aplikasi. + 1 · Buka di ponselmu + 2 · Masukkan kode ini + 3 · Tempel tautan repositori lalu kirim. Ia dipasang di sini, di televisi. + Selesai + Menunggu ponselmu… + TV ini tidak berada di jaringan yang bisa dijangkau ponsel. Sambungkan ke Wi‑Fi yang sama lalu buka layar ini lagi. + %1$s diterima — memasang… + Memasang %1$d dari %2$d… + %1$d sumber ditambahkan. Semuanya ada di daftar di balik layar ini. + Terpasang, tapi tidak ada sumber yang ditambahkan. Tautannya mungkin menunjuk ke berkas yang salah. + Tidak bisa dipasang: %1$s + Akun + Memuat kanal... + Kesalahan koneksi + Putar sekarang + Ikuti kami di media sosial + Profil + "Akun " + Yakin ingin keluar? + Nanti saja + Ya, lanjutkan + "Filter " + Pilih rating: + Terapkan + Pilih urutan + Pilih tahun + Saring Tv Garden + Pilih jenis: + Penyedia + Cari penyedia… + Bersihkan + Anime + Tokoh + Kanal TV + menurut negara + menurut kategori + Nama kanal + LANGSUNG + Diblokir di wilayah ini + Nonaktif + Mode konten + Pilih jenis konten yang kamu sukai + Mode anime + Mode film + AKTIF + Daftar tontonan diperbarui + Ada 5 rilisan baru di daftar tontonanmu. Jangan sampai ketinggalan. + perbarui + Mungkin kamu suka + Sedang ditonton + Ukuran teks + Warna teks + Latar subtitle + Peringatan konten dewasa + Kamu akan menyalakan konten dewasa (NSFW). Konten ini mungkin tidak cocok untuk semua penonton. + Verifikasi usia + Kamu harus berusia 18+ untuk melihat konten dewasa + Tampilan konten + Konten dewasa akan terlihat di seluruh platform + Mudah dimatikan + Kamu bisa mematikannya kapan saja di pengaturan akun + Saya mengerti, nyalakan + Konten NSFW dimatikan + Konten dewasa sedang dimatikan. Untuk membukanya, nyalakan NSFW di preferensimu. + Sembunyikan + Kata pencarian + Hapus pencarian + Sumber ini + Cari anime... + Judul + Menurut negara + Menurut kategori + Mendengarkan… + Nyala + Mati + Episode %1$d + Menurut kategori + Menurut negara + Daftar khusus + Menyiapkan sumber… + Tidak ada aliran yang tersedia + Saring anime + Saring film + Media sedang dimuat.. + Episode sedang dimuat.. + Usia: %1$s + Sudah tayang! + Semua sumber + Mendengarkan... + Mendengarkan... Silakan bicara + Tidak ada suara terdeteksi + Memulai… + Memulai pencarian suara... + Pencarian suara tidak tersedia + Kesalahan pencarian suara + Mencari: %1$s + Pencarian suara dibatalkan + Membuka “%1$s”… + Halaman masuk belum tersambung + Pembaruan tersedia + Mengunduh… + Unduhan selesai! + Pasang sekarang + Unduhan gagal + Coba lagi + + %1$d sumber diperbarui + %1$d sumber diperbarui + + + %1$d sumber + %1$d sumber + + + %1$d repo + %1$d repo + + + %1$d plugin gagal dimuat + %1$d plugin gagal dimuat + + Mencari sumber… + Sumber ini lambat… + Coba server lain + Beralih ke %1$s… + Beralih ke %1$s… + Kamu sudah menamatkan serial ini + Itu episode terakhir yang tersedia di sini. + Tonton lagi + Episode ini tidak bisa dimulai + Berhenti di %1$s + Lewati %1$d dtk + Lewati pembuka + Lewati penutup + Lewati ringkasan + %1$s — episode %2$d + + Bagian %1$d · %2$d episode + Bagian %1$d · %2$d episode + + Berikutnya + Putar sekarang + Lanjut menonton + Diputar dalam %1$d dtk + Tekan OK untuk melewati + Pemutaran berhenti + Coba lagi + Ganti server + Kembali + Memuat… + Daftar episode + Cari subtitle daring + Judul yang dicari + Cari + Tidak ada subtitle untuk judul ini + Mencari… + Terjemahkan ke %1$s (AI) + Sisa %1$d hari ini + Menerjemahkan… ini bisa memakan waktu sampai satu menit + Tidak bisa diterjemahkan — coba lagi nanti + Tidak ada yang bisa diterjemahkan — subtitle untuk judul ini tidak ditemukan + %1$s (AI) + Jatah terjemahan AI hari ini sudah habis + Subtitle + + %1$d subtitle ditemukan + %1$d subtitle ditemukan + + Mode musim dingin (Kejutkan aku) + Nyalakan atau matikan pratinjau tema musim dingin + Tema + Gaya subtitle + Konten & privasi + Kelola apa yang muncul di Beranda + Kanal Beranda: %1$s \u2022 Dewasa: %2$s + Bahasa + Bahasa yang dipakai Sozo di televisi ini + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml new file mode 100644 index 00000000..3d2d9d98 --- /dev/null +++ b/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,398 @@ + + + Zoeken + Start + Terug + Terug naar start + Anime filteren + Tv Garden + Er ging iets mis. Probeer het opnieuw. + Opnieuw + Tv-kanalen + Abonnementsstatus + Actief + Mijn gegevens + Bladwijzers + Bronnen + Kijkgeschiedenis + Berichten ontvangen + Uitloggen + Hier staat op dit moment geen film of serie + Voor deze bron zijn geen castgegevens beschikbaar + Acties + Nu kijken + Nu bijwerken + Over de film + Jaar van uitgave + Studio + Categorie + Taal + u + min + Niet sluiten alsjeblieft + Contact + Over het personage + Verkeerde titel? + Weergave van inhoud voor volwassenen aan- of uitzetten + Weergave van kanaalinhoud aan- of uitzetten + Inhoud voor volwassenen (NSFW) + Kanalen op de startpagina + LIVE TV + Opnieuw + Aflevering %1$d + Speelt nu + De details konden niet worden geladen. Probeer het opnieuw. + Gast + Aflevering %1$s wordt geladen… + Kwaliteit wisselen… + Kwaliteit wisselen mislukt — we blijven op de huidige. + Afleveringen van deel %1$s laden… + Dit is de laatste aflevering + Dit is de eerste aflevering + QR-code verversen + Wachten op goedkeuring op je telefoon… + Inloggen met QR-code + Scan de code met je telefoon, of open Sozo → Profiel → Tv koppelen en vul de code hieronder in. + Jouw code + Verloopt over %1$d:%2$02d + Code ophalen… + Code verlopen. Druk op Verversen voor een nieuwe. + Opnieuw verbinden… + Ingelogd als %1$s + Inloggen mislukt. Druk op Verversen om het opnieuw te proberen. + Terug + Geen internetverbinding + Te veel pogingen. Probeer het zo meteen opnieuw. + Mijn account + Beheer je profiel en voorkeuren + Gastaccount + Inloggen + Bezoeker + Pas lettertype, kleur en grootte van de ondertiteling aan (tv-vriendelijk) + Voorbeeld + Zo ziet de ondertiteling er op tv uit + Lettertype + Dagen + Kijkgeschiedenis op het startscherm aan- of uitzetten + Geschiedenisbeheer + Bron + Zoeksuggesties voor jou + Stijl + Uit + Aan + Ondertiteling staat uit + Alles bekijken + Meer films en series + Later + Druk op TERUG om te annuleren + Nog geen berichten + STATUS + In bronnen zoeken + Aflevering %1$d als bekeken markeren + Helemaal bij + Opslaan… + %1$d nieuw + Niet verbonden — koppel het in de Sozo-telefoonapp bij Profiel → Verbindingen + Niet verbonden — koppel het in de Sozo-telefoonapp bij Profiel → Verbindingen + Je AniList-lijst is leeg. + Niets in „%1$s”. + Dit apparaat kan dat formaat niet afspelen — we proberen een andere bron… + Deze tv kan dit videoformaat niet afspelen. Kies een andere kwaliteit of server. + Verbinding verbroken. Controleer je netwerk en probeer het opnieuw. + Die link is verlopen. Probeer het opnieuw of kies een andere server. + Afspelen mislukt. Probeer een andere server of kwaliteit. + bekeken + opgeslagen + ongelezen + Seizoensachtergrond — in de winter valt er sneeuw + Je volledige kijkgeschiedenis wissen? + Niet verstaan. Probeer het opnieuw. + De microfoontoestemming voor Sozo staat uit. + Zoeken met je stem werkt nu niet. + %1$d anime + %1$d afleveringen + %1$.1f gemiddeld + %1$d d gekeken + Er ging iets mis. Probeer het opnieuw. + De server was niet bereikbaar. Controleer je verbinding. + Geen internetverbinding. + De server deed er te lang over. + De beveiligde verbinding is mislukt. + Nog geen opgeslagen personages + Nog geen opgeslagen kanalen + Geen resultaten gevonden + Voor deze bron zijn er geen categorieën + Geen bron gekozen — kies er eerst een + Niets kwam overeen met die titel + Naar instellingen + Instellingen + Schermformaat + Passend + Het hele beeld zichtbaar, balken aan de zijkanten + Vullen + Vult het scherm, randen worden afgesneden + Uitrekken + Passend uitgerekt, beeldverhouding klopt niet meer + Audio + Audiosporen in de stream — nagesynchroniseerd of origineel. + Snelheid + Normaal + Ondertiteling + Ondertitelsporen in de stream. + Geen ondertiteling + Videokwaliteit + Kies een resolutie, of laat de speler je verbinding volgen. + Automatisch + Volgt je verbinding + Server + Kies welke host deze aflevering streamt. De kwaliteit kies je apart. + Bronnen bijwerken + Bijwerken… + Zoeken naar bronupdates… + Repo\'s bijwerken… %1$d/%2$d + Bijwerken mislukt: %1$s + Alle bronnen zijn up-to-date + heeft een deel van CloudStream nodig dat deze app niet bevat (%1$s) + is gebouwd voor een nieuwere CloudStream dan deze app meelevert (%1$s) + het plug-inbestand kon niet worden gelezen — verwijder de repo en voeg hem opnieuw toe + Bronnen instellen… even geduld + %1$s instellen (%2$d/%3$d)… + %1$s instellen (%2$d/%3$d) · %4$d/%5$d + Actieve bron: %1$s + Geen aanbieders beschikbaar. + Geen aanbieders passen bij „%1$s”. + Aanbieders konden niet worden geladen: %1$s + Uit %1$s is geen enkele bron geïnstalleerd. Druk op „Bronnen bijwerken” om het opnieuw te proberen. + Afspelen + Bijna uit + Uitgekeken + %1$s van %2$s + Kijkgeschiedenis wissen + Bewaren + Geschiedenis wissen + Zoeken lukte niet — controleer de verbinding + Ondertitelvertraging + De ondertiteling „%1$s” kon niet worden geladen — probeer een andere + Terug + Afleveringen + Vorige aflevering + 10 s terug + Afspelen + Pauze + 10 s vooruit + Volgende aflevering + Ondertiteling + Audio + Instellingen + Spoelen + Aflevering %1$d + Aflevering %1$d · %2$dp + Deze aflevering kon niet worden geladen. Controleer je verbinding en probeer het opnieuw. + Aflevering %1$d + Verder kijken + Laatst bekeken + IMDb %1$s + Verder vanaf %1$s? + Verder + Opnieuw beginnen + Ondertiteling tonen + Ondertitelstijl + Tekengrootte + Tekstkleur + Achtergrond + Omlijning + Standaard + Monospace + %1$s · %2$d sp · %3$s · Achtergrond: %4$s · Omlijning: %5$s + Wit + Oranje + Grijs + Groen + Rood + Blauw + Van deze server + Gedownload + AI-vertaling + Dit kanaal zendt nu niet uit. Probeer het zo meteen opnieuw. + Dit kanaal speelt nu niet. Probeer het opnieuw of kies een ander kanaal. + Toevoegen vanaf telefoon + Voeg een bron toe vanaf je telefoon + Scan de code, of open het adres hieronder in een browser op hetzelfde wifi-netwerk. Geen app nodig. + 1 · Open op je telefoon + 2 · Voer deze code in + 3 · Plak de repositorylink en verstuur hem. Hij wordt hier op de televisie geïnstalleerd. + Klaar + Wachten op je telefoon… + Deze tv zit niet op een netwerk dat een telefoon kan bereiken. Sluit hem aan op hetzelfde wifi-netwerk en open dit scherm opnieuw. + %1$s ontvangen — installeren… + %1$d van %2$d installeren… + %1$d bron(nen) toegevoegd. Ze staan in de lijst achter dit scherm. + Geïnstalleerd, maar er kwam geen bron bij. De link wijst mogelijk naar het verkeerde bestand. + Installeren lukte niet: %1$s + Account + Kanaal wordt geladen... + Verbindingsfout + Nu afspelen + Volg ons op sociale media + Profiel + "Account " + Weet je zeker dat je wilt afsluiten? + Niet nu + Ja, doorgaan + "Filter " + Kies een beoordeling: + Toepassen + Kies een sortering + Kies een jaar + Tv Garden filteren + Kies een type: + Aanbieders + Aanbieders zoeken… + Wissen + Anime + Personages + Tv-kanalen + per land + per categorie + Kanaalnaam + LIVE + Geoblokkade + Uitgeschakeld + Inhoudsmodus + Kies welk soort inhoud je het liefst ziet + Animemodus + Filmmodus + ACTIEF + Kijklijst bijgewerkt + Er zijn 5 nieuwe titels aan je kijklijst toegevoegd. Mis het nieuwste niet. + bijwerken + Misschien vind je dit leuk + Aan het kijken + Tekengrootte + Tekstkleur + Ondertitelachtergrond + Waarschuwing: inhoud voor volwassenen + Je staat op het punt inhoud voor volwassenen (NSFW) aan te zetten. Die is niet voor alle kijkers geschikt. + Leeftijdscontrole + Je moet 18+ zijn om inhoud voor volwassenen te bekijken + Zichtbaarheid van inhoud + Inhoud voor volwassenen is dan overal in de app zichtbaar + Makkelijk uit te zetten + Je kunt dit altijd uitzetten in je accountinstellingen + Begrepen, aanzetten + NSFW-inhoud uitgeschakeld + Inhoud voor volwassenen staat nu uit. Zet NSFW aan in je instellingen om die te bekijken. + Verbergen + Zoekopdracht + Zoekopdracht verwijderen + Deze bron + Anime zoeken... + Titel + Per land + Per categorie + Luisteren… + Aan + Uit + Aflevering %1$d + Per categorie + Per land + Eigen lijst + Bronnen instellen… + Geen stream beschikbaar + Anime filteren + Films filteren + Media wordt geladen.. + Afleveringen worden geladen.. + Leeftijd: %1$s + Uitgezonden! + Alle bronnen + Luisteren... + Luisteren... Spreek nu + Geen spraak gedetecteerd + Starten… + Zoeken met je stem starten... + Zoeken met je stem is niet beschikbaar + Fout bij zoeken met je stem + Zoeken naar: %1$s + Zoeken met je stem geannuleerd + „%1$s” wordt geopend… + De inlogpagina is nog niet aangesloten + Update beschikbaar + Downloaden… + Download voltooid! + Nu installeren + Download mislukt + Probeer opnieuw + + %1$d bron bijgewerkt + %1$d bronnen bijgewerkt + + + %1$d bron + %1$d bronnen + + + %1$d repo + %1$d repo\'s + + + %1$d plug-in kon niet worden geladen + %1$d plug-ins konden niet worden geladen + + Een bron zoeken… + Deze bron is traag… + Probeer een andere server + Overschakelen naar %1$s… + Overschakelen naar %1$s… + Je hebt deze serie uitgekeken + Dat was de laatste aflevering die hier beschikbaar is. + Opnieuw kijken + Deze aflevering kan niet starten + Gestopt bij %1$s + %1$d s overslaan + Intro overslaan + Aftiteling overslaan + Samenvatting overslaan + %1$s — aflevering %2$d + + Deel %1$d · %2$d aflevering + Deel %1$d · %2$d afleveringen + + Hierna + Nu afspelen + Verder kijken + Start over %1$d s + Druk op OK om over te slaan + Afspelen gestopt + Opnieuw + Server wisselen + Terug + Laden… + Afleveringenlijst + Online naar ondertiteling zoeken + Titel om op te zoeken + Zoeken + Geen ondertiteling gevonden voor deze titel + Zoeken… + Vertalen naar %1$s (AI) + Nog %1$d vandaag + Vertalen… dit kan tot een minuut duren + Vertalen lukte niet — probeer het later + Niets te vertalen — geen ondertiteling gevonden voor deze titel + %1$s (AI) + Vandaag geen AI-vertalingen meer over + Ondertiteling + + %1$d ondertiteling gevonden + %1$d ondertitelingen gevonden + + Wintermodus (Verras me) + Voorbeeld van het winterthema aan-/uitzetten + Thema + Ondertitelstijl + Inhoud & privacy + Beheer wat er op Start verschijnt + Startkanalen: %1$s \u2022 Volwassenen: %2$s + Taal + De taal die Sozo op deze televisie spreekt + diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000..93f02660 --- /dev/null +++ b/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,404 @@ + + + Buscar + Início + Voltar + Voltar ao início + Filtrar anime + Tv Garden + Algo deu errado. Tente novamente. + Tentar de novo + Canais de TV + Status da assinatura + Ativa + Meus dados + Página de favoritos + Fontes + Histórico + Receber mensagens + Sair da conta + Não há filme nem série aqui no momento + Esta fonte não traz dados do elenco + Ações + Assistir agora + Atualizar agora + Sobre o filme + Ano de lançamento + Estúdio + Categoria + Idioma + h + min + Por favor, não feche + Contato + Sobre o personagem + Título errado? + Ative ou desative a exibição de conteúdo adulto + Ative ou desative a exibição do conteúdo dos canais + Conteúdo adulto (NSFW) + Canais da tela inicial + TV AO VIVO + Tentar de novo + Episódio %1$d + Tocando agora + Não foi possível carregar os detalhes. Tente novamente. + Convidado + Carregando o episódio %1$s… + Trocando a qualidade… + Não foi possível trocar a qualidade — seguimos na atual. + Carregando os episódios da parte %1$s… + Este é o último episódio + Este é o primeiro episódio + Atualizar o QR code + Aguardando a confirmação no seu celular… + Entrar com QR code + Escaneie o código com o celular, ou abra Sozo → Perfil → Conectar uma TV e digite o código abaixo. + Seu código + Expira em %1$d:%2$02d + Pegando seu código… + O código expirou. Toque em Atualizar para pegar outro. + Reconectando… + Conectado como %1$s + Não foi possível entrar. Toque em Atualizar e tente de novo. + Voltar + Sem conexão com a internet + Tentativas demais. Tente daqui a pouco. + Minha conta + Gerencie seu perfil e suas preferências + Conta de convidado + Entrar + Visitante + Ajuste a fonte, a cor e o tamanho das legendas (pensado para TV) + Prévia + É assim que as legendas vão aparecer na TV + Fonte + Dias + Ative ou desative o histórico na tela inicial + Gerenciador do histórico + Fonte + Suas buscas recomendadas + Estilo + Desligado + Ligado + As legendas estão desligadas + Ver tudo + Ver mais filmes e séries + Depois + Aperte VOLTAR para cancelar + Ainda sem mensagens + STATUS + Procurar nas fontes + Marcar o episódio %1$d como assistido + Em dia + Salvando… + %1$d novos + Não conectado — conecte no app do Sozo no celular, em Perfil → Conexões + Não conectado — conecte no app do Sozo no celular, em Perfil → Conexões + Sua lista do AniList está vazia. + Não há nada em “%1$s”. + Este aparelho não reproduz esse formato — tentando outra fonte… + Esta TV não reproduz este formato de vídeo. Escolha outra qualidade ou servidor. + Conexão perdida. Verifique sua rede e tente novamente. + Esse link expirou. Tente de novo ou escolha outro servidor. + A reprodução falhou. Tente outro servidor ou outra qualidade. + assistido + salvo + não lido + Fundo sazonal — no inverno cai neve + Limpar todo o seu histórico? + Não entendi. Tente de novo. + A permissão de microfone para o Sozo está desligada. + A busca por voz não está disponível agora. + %1$d animes + %1$d episódios + %1$.1f de média + %1$d d assistidos + Algo deu errado. Tente novamente. + Não foi possível falar com o servidor. Verifique sua conexão. + Sem conexão com a internet. + O servidor demorou demais para responder. + A conexão segura falhou. + Ainda sem personagens salvos + Ainda sem canais salvos + Nenhum resultado encontrado + Esta fonte não tem categorias + Nenhuma fonte escolhida — escolha uma primeiro + Nada correspondeu a esse título + Ir para as configurações + Configurações + Tamanho da tela + Ajustar + Todo o quadro visível, com barras nas laterais + Preencher + Preenche a tela, cortando as bordas + Esticar + Esticado para caber, quebrando a proporção + Áudio + Faixas de áudio dentro do stream — dublagem ou original. + Velocidade + Normal + Legendas + Faixas de legenda dentro do stream. + Sem legendas + Qualidade do vídeo + Escolha uma resolução, ou deixe o player seguir sua conexão. + Automática + Acompanha sua conexão + Servidor + Escolha qual host transmite este episódio. A qualidade é escolhida à parte. + Atualizar fontes + Atualizando… + Procurando atualizações das fontes… + Atualizando repos… %1$d/%2$d + A atualização falhou: %1$s + Todas as fontes estão em dia + precisa de uma parte do CloudStream que este app não inclui (%1$s) + foi compilado para um CloudStream mais novo do que o deste app (%1$s) + não foi possível ler o arquivo do plugin — remova o repo e adicione de novo + Preparando as fontes… aguarde + Preparando %1$s (%2$d/%3$d)… + Preparando %1$s (%2$d/%3$d) · %4$d/%5$d + Fonte ativa: %1$s + Nenhum provedor disponível. + Nenhum provedor corresponde a “%1$s”. + Não foi possível carregar os provedores: %1$s + Nenhuma fonte foi instalada de %1$s. Toque em “Atualizar fontes” para tentar de novo. + Reproduzir + Quase terminado + Terminado + %1$s de %2$s + Limpar o histórico + Manter + Limpar histórico + Não foi possível buscar — verifique a conexão + Atraso da legenda + Não foi possível carregar a legenda “%1$s” — tente outra + Voltar + Episódios + Episódio anterior + Voltar 10 s + Reproduzir + Pausar + Avançar 10 s + Próximo episódio + Legendas + Áudio + Configurações + Avançar/voltar + Episódio %1$d + Episódio %1$d · %2$dp + Não foi possível carregar este episódio. Verifique sua conexão e tente de novo. + Episódio %1$d + Continuar assistindo + Visto por último + IMDb %1$s + Continuar de %1$s? + Continuar + Começar do início + Mostrar legendas + Estilo das legendas + Tamanho do texto + Cor do texto + Fundo + Contorno + Padrão + Monoespaçada + %1$s · %2$d sp · %3$s · Fundo: %4$s · Contorno: %5$s + Branco + Laranja + Cinza + Verde + Vermelho + Azul + Deste servidor + Baixada + Traduzida por IA + Este canal não está transmitindo agora. Tente daqui a pouco. + Este canal não está funcionando agora. Tente de novo ou escolha outro canal. + Adicionar pelo celular + Adicione uma fonte pelo seu celular + Escaneie o código, ou abra o endereço abaixo em qualquer navegador no mesmo Wi‑Fi. Não precisa de app. + 1 · Abra no seu celular + 2 · Digite este código + 3 · Cole o link do repositório e envie. Ele é instalado aqui, na televisão. + Pronto + Aguardando seu celular… + Esta TV não está numa rede que o celular alcance. Conecte-a ao mesmo Wi‑Fi e abra esta tela de novo. + %1$s recebido — instalando… + Instalando %1$d de %2$d… + %1$d fonte(s) adicionada(s). Elas estão na lista atrás desta tela. + Instalado, mas não adicionou nenhuma fonte. O link pode apontar para o arquivo errado. + Não foi possível instalar: %1$s + Conta + Carregando o canal... + Erro de conexão + Reproduzir agora + Siga a gente nas redes + Perfil + "Conta " + Tem certeza de que quer sair? + Agora não + Sim, continuar + "Filtro " + Escolha a nota: + Aplicar + Escolha a ordenação + Escolha o ano + Filtrar Tv Garden + Escolha o tipo: + Provedores + Buscar provedores… + Limpar + Anime + Personagens + Canais de TV + por país + por categoria + Nome do canal + AO VIVO + Bloqueado na região + Desativado + Modo de conteúdo + Escolha o tipo de conteúdo que você prefere + Modo anime + Modo filmes + ATIVO + Lista atualizada + Sua lista ganhou 5 lançamentos novos. Não perca as novidades. + atualizar + Talvez você goste + Assistindo + Tamanho do texto + Cor do texto + Fundo da legenda + Aviso de conteúdo adulto + Você está prestes a ativar conteúdo adulto (NSFW). Ele pode não ser adequado para todos os públicos. + Verificação de idade + Você precisa ter 18 anos ou mais para ver conteúdo adulto + Visibilidade do conteúdo + O conteúdo adulto ficará visível em toda a plataforma + Fácil de desativar + Você pode desativar isso quando quiser nas configurações da conta + Entendi, ativar + Conteúdo NSFW desativado + O conteúdo adulto está desativado. Para vê-lo, ative o NSFW nas suas preferências. + Ocultar + Termo de busca + Remover a busca + Esta fonte + Buscar anime... + Título + Por país + Por categoria + Ouvindo… + Ativado + Desativado + Episódio %1$d + Por categoria + Por país + Lista personalizada + Preparando as fontes… + Nenhum stream disponível + Filtrar anime + Filtrar filmes + Carregando a mídia.. + Carregando os episódios.. + Idade: %1$s + Saiu! + Todas as fontes + Ouvindo... + Ouvindo... Pode falar + Nenhuma fala detectada + Iniciando… + Iniciando a busca por voz... + A busca por voz não está disponível + Erro na busca por voz + Buscando: %1$s + Busca por voz cancelada + Abrindo “%1$s”… + A página de login ainda não está conectada + Atualização disponível + Baixando… + Download concluído! + Instalar agora + O download falhou + Tentar de novo + + %1$d fonte atualizada + %1$d fontes atualizadas + %1$d fontes atualizadas + + + %1$d fonte + %1$d fontes + %1$d fontes + + + %1$d repo + %1$d repos + %1$d repos + + + %1$d plugin não pôde ser carregado + %1$d plugins não puderam ser carregados + %1$d plugins não puderam ser carregados + + Procurando uma fonte… + Esta fonte está lenta… + Tente outro servidor + Mudando para %1$s… + Mudando para %1$s… + Você terminou esta série + Esse foi o último episódio disponível aqui. + Assistir de novo + Não dá para iniciar este episódio + Parado em %1$s + Pular %1$d s + Pular abertura + Pular encerramento + Pular o resumo + %1$s — episódio %2$d + + Parte %1$d · %2$d episódio + Parte %1$d · %2$d episódios + Parte %1$d · %2$d episódios + + A seguir + Reproduzir agora + Continuar assistindo + Começa em %1$d s + Aperte OK para pular + Reprodução interrompida + Tentar de novo + Trocar de servidor + Voltar + Carregando… + Lista de episódios + Buscar legendas on-line + Título a buscar + Buscar + Nenhuma legenda encontrada para este título + Buscando… + Traduzir para %1$s (IA) + Restam %1$d hoje + Traduzindo… isso pode levar até um minuto + Não foi possível traduzir — tente mais tarde + Nada para traduzir — nenhuma legenda encontrada para este título + %1$s (IA) + Acabaram as traduções por IA de hoje + Legenda + + %1$d legenda encontrada + %1$d legendas encontradas + %1$d legendas encontradas + + Modo inverno (Surpreenda-me) + Ative ou desative a prévia do tema de inverno + Tema + Estilo das legendas + Conteúdo e privacidade + Gerencie o que aparece no Início + Canais do Início: %1$s \u2022 Adulto: %2$s + Idioma + O idioma em que o Sozo fala nesta televisão + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..9411fcec --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,410 @@ + + + Поиск + Главная + Назад + На главную + Фильтр аниме + Tv Garden + Что-то пошло не так. Попробуйте ещё раз. + Повторить + ТВ-каналы + Статус подписки + Активна + Мои данные + Страница закладок + Источники + История просмотров + Получать сообщения + Выйти из аккаунта + Здесь пока нет фильмов и сериалов + Для этого источника нет данных об актёрах + Действия + Смотреть + Обновить сейчас + О фильме + Год выпуска + Студия + Категория + Язык + ч + мин + Пожалуйста, не закрывайте + Контакты + О персонаже + Неверное название? + Включить или выключить показ контента для взрослых + Включить или выключить показ контента каналов + Контент для взрослых (NSFW) + Каналы на главной + ЖИВОЕ ТВ + Повторить + Серия %1$d + Сейчас играет + Не удалось загрузить описание. Попробуйте ещё раз. + Гость + Серия %1$s загружается… + Переключение качества… + Не удалось переключить качество — остаёмся на текущем. + Загружаются серии части %1$s… + Это последняя серия + Это первая серия + Обновить QR-код + Ожидание подтверждения на телефоне… + Вход по QR-коду + Отсканируйте код телефоном или откройте Sozo → Профиль → Подключить ТВ и введите код ниже. + Ваш код + Истекает через %1$d:%2$02d + Получаем код… + Срок кода истёк. Нажмите «Обновить» для нового. + Переподключение… + Вы вошли как %1$s + Войти не удалось. Нажмите «Обновить» и попробуйте снова. + Назад + Нет подключения к интернету + Слишком много попыток. Попробуйте чуть позже. + Мой аккаунт + Управляйте профилем и настройками + Гостевой аккаунт + Войти + Посетитель + Настройте шрифт, цвет и размер субтитров (удобно для ТВ) + Предпросмотр + Так субтитры будут выглядеть на телевизоре + Шрифт + Дней + Включить или выключить историю просмотров на главном экране + Управление историей + Источник + Рекомендации для поиска + Стиль + Выкл. + Вкл. + Субтитры выключены + Смотреть все + Больше фильмов и сериалов + Позже + Нажмите НАЗАД, чтобы отменить + Сообщений пока нет + СТАТУС + Найти в источниках + Отметить серию %1$d просмотренной + Всё просмотрено + Сохранение… + %1$d новых + Не подключено — подключите в приложении Sozo на телефоне: Профиль → Подключения + Не подключено — подключите в приложении Sozo на телефоне: Профиль → Подключения + Ваш список AniList пуст. + В «%1$s» ничего нет. + Это устройство не воспроизводит такой формат — пробуем другой источник… + Этот телевизор не воспроизводит такой формат видео. Выберите другое качество или сервер. + Соединение потеряно. Проверьте сеть и попробуйте снова. + Срок действия ссылки истёк. Попробуйте снова или выберите другой сервер. + Воспроизведение не удалось. Попробуйте другой сервер или качество. + просмотрено + сохранено + непрочитано + Сезонный фон — зимой идёт снег + Очистить всю историю просмотров? + Не расслышали. Попробуйте ещё раз. + Доступ к микрофону для Sozo выключен. + Голосовой поиск сейчас недоступен. + %1$d аниме + %1$d серий + %1$.1f в среднем + %1$d дн. просмотра + Что-то пошло не так. Попробуйте ещё раз. + Не удалось связаться с сервером. Проверьте подключение. + Нет подключения к интернету. + Сервер слишком долго не отвечал. + Защищённое соединение не установлено. + Сохранённых персонажей пока нет + Сохранённых каналов пока нет + Ничего не найдено + Для этого источника нет категорий + Источник не выбран — сначала выберите один + По этому названию ничего не нашлось + Перейти в настройки + Настройки + Размер экрана + Вписать + Виден весь кадр, по бокам полосы + Заполнить + Заполняет экран, края обрезаются + Растянуть + Растянуто по экрану, пропорции нарушены + Звук + Звуковые дорожки внутри потока — дубляж или оригинал. + Скорость + Обычная + Субтитры + Дорожки субтитров внутри потока. + Без субтитров + Качество видео + Выберите разрешение или доверьте выбор плееру. + Авто + Подстраивается под соединение + Сервер + Выберите хост, с которого идёт эта серия. Качество выбирается отдельно. + Обновить источники + Обновление… + Проверяем обновления источников… + Обновляем репозитории… %1$d/%2$d + Обновление не удалось: %1$s + Все источники в актуальном состоянии + требует часть CloudStream, которой нет в этом приложении (%1$s) + собран под более новый CloudStream, чем в этом приложении (%1$s) + файл плагина не читается — удалите репозиторий и добавьте заново + Настраиваем источники… подождите + Настраиваем %1$s (%2$d/%3$d)… + Настраиваем %1$s (%2$d/%3$d) · %4$d/%5$d + Активный источник: %1$s + Провайдеров нет. + Нет провайдеров по запросу «%1$s». + Не удалось загрузить провайдеров: %1$s + Из %1$s не установлено ни одного источника. Нажмите «Обновить источники», чтобы попробовать снова. + Смотреть + Почти досмотрено + Досмотрено + %1$s из %2$s + Очистить историю просмотров + Оставить + Очистить историю + Не удалось выполнить поиск — проверьте соединение + Задержка субтитров + Не удалось загрузить субтитры «%1$s» — попробуйте другие + Назад + Серии + Предыдущая серия + Назад 10 с + Воспроизвести + Пауза + Вперёд 10 с + Следующая серия + Субтитры + Звук + Настройки + Перемотка + Серия %1$d + Серия %1$d · %2$dp + Не удалось загрузить эту серию. Проверьте подключение и попробуйте снова. + Серия %1$d + Продолжить просмотр + Последний просмотр + IMDb %1$s + Продолжить с %1$s? + Продолжить + Начать сначала + Показывать субтитры + Стиль субтитров + Размер текста + Цвет текста + Фон + Обводка + По умолчанию + Моноширинный + %1$s · %2$d sp · %3$s · Фон: %4$s · Обводка: %5$s + Белый + Оранжевый + Серый + Зелёный + Красный + Синий + С этого сервера + Загружено + Перевод ИИ + Этот канал сейчас не вещает. Попробуйте чуть позже. + Этот канал сейчас не работает. Попробуйте снова или выберите другой канал. + Добавить с телефона + Добавьте источник с телефона + Отсканируйте код или откройте адрес ниже в любом браузере в той же сети Wi‑Fi. Приложение не нужно. + 1 · Откройте на телефоне + 2 · Введите этот код + 3 · Вставьте ссылку на репозиторий и отправьте. Он установится здесь, на телевизоре. + Готово + Ожидаем ваш телефон… + Этот телевизор не в сети, до которой достанет телефон. Подключите его к той же сети Wi‑Fi и откройте этот экран заново. + Получено %1$s — устанавливаем… + Устанавливаем %1$d из %2$d… + Добавлено источников: %1$d. Они в списке за этим экраном. + Установлено, но источников не добавилось. Возможно, ссылка ведёт не на тот файл. + Не удалось установить: %1$s + Аккаунт + Канал загружается... + Ошибка соединения + Смотреть сейчас + Мы в соцсетях + Профиль + "Аккаунт " + Точно хотите выйти? + Не сейчас + Да, продолжить + "Фильтр " + Выберите рейтинг: + Применить + Выберите сортировку + Выберите год + Фильтр Tv Garden + Выберите тип: + Провайдеры + Поиск провайдеров… + Очистить + Аниме + Персонажи + ТВ-каналы + по стране + по категории + Название канала + ЭФИР + Заблокировано в регионе + Выключено + Режим контента + Выберите предпочитаемый тип контента + Режим аниме + Режим фильмов + АКТИВНО + Список обновлён + В ваш список добавлено 5 новых релизов. Не пропустите свежее. + обновить + Возможно, вам понравится + Смотрю + Размер текста + Цвет текста + Фон субтитров + Предупреждение о контенте для взрослых + Вы собираетесь включить контент для взрослых (NSFW). Он может подойти не всем зрителям. + Подтверждение возраста + Для просмотра контента для взрослых вам должно быть 18+ + Видимость контента + Контент для взрослых будет виден по всей платформе + Легко отключить + Вы можете отключить это в любой момент в настройках аккаунта + Понимаю, включить + Контент NSFW выключен + Контент для взрослых сейчас выключен. Чтобы открыть его, включите NSFW в настройках. + Скрыть + Поисковый запрос + Удалить запрос + Этот источник + Поиск аниме... + Название + По стране + По категории + Слушаю… + Включено + Выключено + Серия %1$d + По категории + По стране + Свой список + Настраиваем источники… + Поток недоступен + Фильтр аниме + Фильтр фильмов + Медиа загружается.. + Серии загружаются.. + Возраст: %1$s + Вышло! + Все источники + Слушаю... + Слушаю... Говорите + Речь не распознана + Запуск… + Запускаем голосовой поиск... + Голосовой поиск недоступен + Ошибка голосового поиска + Ищем: %1$s + Голосовой поиск отменён + Открываем «%1$s»… + Страница входа ещё не подключена + Доступно обновление + Загрузка… + Загрузка завершена! + Установить + Загрузка не удалась + Попробовать снова + + Обновлён %1$d источник + Обновлено %1$d источника + Обновлено %1$d источников + Обновлено %1$d источника + + + %1$d источник + %1$d источника + %1$d источников + %1$d источника + + + %1$d репозиторий + %1$d репозитория + %1$d репозиториев + %1$d репозитория + + + %1$d плагин не загрузился + %1$d плагина не загрузились + %1$d плагинов не загрузились + %1$d плагина не загрузились + + Ищем источник… + Этот источник медленный… + Попробуйте другой сервер + Переключаем на %1$s… + Переключаем на %1$s… + Вы досмотрели этот сериал + Это была последняя доступная здесь серия. + Посмотреть снова + Не удалось начать эту серию + Остановлено на %1$s + Пропустить %1$d с + Пропустить заставку + Пропустить титры + Пропустить пересказ + %1$s — серия %2$d + + Часть %1$d · %2$d серия + Часть %1$d · %2$d серии + Часть %1$d · %2$d серий + Часть %1$d · %2$d серии + + Далее + Смотреть сейчас + Продолжить просмотр + Начнётся через %1$d с + Нажмите OK, чтобы пропустить + Воспроизведение остановлено + Повторить + Сменить сервер + Назад + Загрузка… + Список серий + Искать субтитры онлайн + Название для поиска + Искать + Субтитры для этого названия не найдены + Ищем… + Перевести на %1$s (ИИ) + Осталось сегодня: %1$d + Переводим… это может занять до минуты + Не удалось перевести — попробуйте позже + Переводить нечего — субтитры для этого названия не найдены + %1$s (ИИ) + Переводы ИИ на сегодня закончились + Субтитры + + Найден %1$d субтитр + Найдено %1$d субтитра + Найдено %1$d субтитров + Найдено %1$d субтитра + + Зимний режим (удиви меня) + Включить или выключить предпросмотр зимней темы + Тема + Стиль субтитров + Контент и приватность + Управляйте тем, что видно на главной + Каналы на главной: %1$s \u2022 Взрослое: %2$s + Язык + Язык, на котором Sozo говорит на этом телевизоре + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 00000000..9ad336f7 --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,398 @@ + + + Arama + Ana sayfa + Geri + Ana sayfaya dön + Anime filtrele + Tv Garden + Bir şeyler ters gitti. Lütfen tekrar dene. + Yeniden dene + TV kanalları + Abonelik durumu + Etkin + Bilgilerim + Yer imleri sayfası + Kaynaklar + İzleme geçmişi + Mesajları al + Hesaptan çık + Şu an burada film ya da dizi yok + Bu kaynak için oyuncu bilgisi yok + İşlemler + Şimdi izle + Şimdi güncelle + Film hakkında + Yapım yılı + Stüdyo + Kategori + Dil + sa + dk + Lütfen kapatma + İletişim + Karakter hakkında + Başlık yanlış mı? + Yetişkin içeriğinin görünürlüğünü aç ya da kapat + Kanal içeriğinin görünürlüğünü aç ya da kapat + Yetişkin içeriği (NSFW) + Ana sayfa kanalları + CANLI TV + Yeniden dene + %1$d. bölüm + Şu an oynuyor + Ayrıntılar yüklenemedi. Lütfen tekrar dene. + Misafir + %1$s. bölüm yükleniyor… + Kalite değiştiriliyor… + Kalite değiştirilemedi — mevcut kalitede kalınıyor. + %1$s bölümünün kısımları yükleniyor… + Bu son bölüm + Bu ilk bölüm + QR kodu yenile + Telefonundaki onay bekleniyor… + QR kod ile giriş yap + Kodu telefonunla tara ya da Sozo → Profil → TV bağla bölümünü açıp aşağıdaki kodu gir. + Kodun + %1$d:%2$02d içinde sona eriyor + Kodun alınıyor… + Kodun süresi doldu. Yenisi için Yenile’ye bas. + Yeniden bağlanılıyor… + %1$s olarak giriş yapıldı + Giriş başarısız. Yenile’ye basıp tekrar dene. + Geri + İnternet bağlantısı yok + Çok fazla deneme. Birazdan tekrar dene. + Hesabım + Profilini ve tercihlerini yönet + Misafir hesabı + Giriş yap + Ziyaretçi + Altyazının yazı tipini, rengini ve boyutunu ayarla (TV’ye uygun) + Önizleme + Altyazılar televizyonda böyle görünecek + Yazı tipi + Gün + Ana ekrandaki izleme geçmişini aç ya da kapat + Geçmiş yöneticisi + Kaynak + Sana önerilen aramalar + Stil + Kapalı + Açık + Altyazılar kapalı + Tümünü gör + Daha fazla film ve dizi + Sonra + İptal etmek için GERİ tuşuna bas + Henüz mesaj yok + DURUM + Kaynaklarda bul + %1$d. bölümü izlendi olarak işaretle + Her şey izlendi + Kaydediliyor… + %1$d yeni + Bağlı değil — telefondaki Sozo uygulamasında Profil → Bağlantılar bölümünden bağla + Bağlı değil — telefondaki Sozo uygulamasında Profil → Bağlantılar bölümünden bağla + AniList listen boş. + “%1$s” içinde bir şey yok. + Bu cihaz bu formatı oynatamıyor — başka bir kaynak deneniyor… + Bu televizyon bu video formatını oynatamıyor. Başka bir kalite ya da sunucu seç. + Bağlantı koptu. Ağını kontrol edip tekrar dene. + Bu bağlantının süresi doldu. Tekrar dene ya da başka bir sunucu seç. + Oynatma başarısız oldu. Başka bir sunucu ya da kalite dene. + izlendi + kaydedildi + okunmadı + Mevsimlik arka plan — kışın kar yağar + Tüm izleme geçmişin temizlensin mi? + Anlaşılmadı. Tekrar dene. + Sozo için mikrofon izni kapalı. + Sesli arama şu anda kullanılamıyor. + %1$d anime + %1$d bölüm + ortalama %1$.1f + %1$d g izlendi + Bir şeyler ters gitti. Lütfen tekrar dene. + Sunucuya ulaşılamadı. Bağlantını kontrol et. + İnternet bağlantısı yok. + Sunucu yanıt vermekte çok gecikti. + Güvenli bağlantı kurulamadı. + Henüz kayıtlı karakter yok + Henüz kayıtlı kanal yok + Sonuç bulunamadı + Bu kaynak için kategori yok + Kaynak seçilmedi — önce birini seç + Bu başlıkla eşleşen bir şey bulunamadı + Ayarlara git + Ayarlar + Ekran boyutu + Sığdır + Tüm kare görünür, yanlarda bantlar olur + Doldur + Ekranı doldurur, kenarlar kırpılır + Uzat + Sığacak şekilde uzatılır, en boy oranı bozulur + Ses + Akış içindeki ses parçaları — dublaj ya da orijinal. + Hız + Normal + Altyazılar + Akış içindeki altyazı parçaları. + Altyazı yok + Video kalitesi + Bir çözünürlük seç ya da oynatıcı bağlantına göre seçsin. + Otomatik + Bağlantına göre ayarlanır + Sunucu + Bu bölümü hangi sunucunun yayınlayacağını seç. Kalite ayrı seçilir. + Kaynakları güncelle + Güncelleniyor… + Kaynak güncellemeleri aranıyor… + Depolar güncelleniyor… %1$d/%2$d + Güncelleme başarısız: %1$s + Tüm kaynaklar güncel + CloudStream’in bu uygulamada bulunmayan bir parçasına ihtiyaç duyuyor (%1$s) + bu uygulamadakinden daha yeni bir CloudStream için derlenmiş (%1$s) + eklenti dosyası okunamadı — depoyu kaldırıp yeniden ekle + Kaynaklar hazırlanıyor… lütfen bekle + %1$s hazırlanıyor (%2$d/%3$d)… + %1$s hazırlanıyor (%2$d/%3$d) · %4$d/%5$d + Etkin kaynak: %1$s + Kullanılabilir sağlayıcı yok. + “%1$s” ile eşleşen sağlayıcı yok. + Sağlayıcılar yüklenemedi: %1$s + %1$s kaynağından hiçbir kaynak kurulmadı. Tekrar denemek için “Kaynakları güncelle”ye bas. + Oynat + Neredeyse bitti + Bitti + %2$s içinde %1$s + İzleme geçmişini temizle + Kalsın + Geçmişi temizle + Arama yapılamadı — bağlantıyı kontrol et + Altyazı gecikmesi + “%1$s” altyazısı yüklenemedi — başkasını dene + Geri + Bölümler + Önceki bölüm + 10 sn geri + Oynat + Duraklat + 10 sn ileri + Sonraki bölüm + Altyazılar + Ses + Ayarlar + İleri/geri sar + %1$d. bölüm + %1$d. bölüm · %2$dp + Bu bölüm yüklenemedi. Bağlantını kontrol edip tekrar dene. + %1$d. bölüm + İzlemeye devam et + Son izlenen + IMDb %1$s + %1$s konumundan devam edilsin mi? + Devam et + Baştan başla + Altyazıları göster + Altyazı stili + Yazı boyutu + Yazı rengi + Arka plan + Dış çizgi + Varsayılan + Eş aralıklı + %1$s · %2$d sp · %3$s · Arka plan: %4$s · Dış çizgi: %5$s + Beyaz + Turuncu + Gri + Yeşil + Kırmızı + Mavi + Bu sunucudan + İndirildi + Yapay zekâ çevirisi + Bu kanal şu an yayın yapmıyor. Birazdan tekrar dene. + Bu kanal şu an çalışmıyor. Tekrar dene ya da başka bir kanal seç. + Telefondan ekle + Telefonundan bir kaynak ekle + Kodu tara ya da aşağıdaki adresi aynı Wi‑Fi’daki herhangi bir tarayıcıda aç. Uygulama gerekmez. + 1 · Telefonunda aç + 2 · Bu kodu gir + 3 · Depo bağlantısını yapıştırıp gönder. Burada, televizyona kurulur. + Tamam + Telefonun bekleniyor… + Bu televizyon, telefonun ulaşabileceği bir ağda değil. Aynı Wi‑Fi’ya bağlayıp bu ekranı yeniden aç. + %1$s alındı — kuruluyor… + %2$d kaynaktan %1$d tanesi kuruluyor… + %1$d kaynak eklendi. Bu ekranın arkasındaki listede duruyorlar. + Kuruldu, ama hiçbir kaynak eklenmedi. Bağlantı yanlış dosyaya işaret ediyor olabilir. + Kurulamadı: %1$s + Hesap + Kanal yükleniyor... + Bağlantı hatası + Şimdi oynat + Bizi sosyal medyada takip et + Profil + "Hesap " + Çıkmak istediğine emin misin? + Şimdi değil + Evet, devam et + "Filtre " + Puan seç: + Uygula + Sıralama seç + Yıl seç + Tv Garden filtrele + Tür seç: + Sağlayıcılar + Sağlayıcı ara… + Temizle + Anime + Karakterler + TV kanalları + ülkeye göre + kategoriye göre + Kanal adı + CANLI + Bölgede engelli + Devre dışı + İçerik modu + Tercih ettiğin içerik türünü seç + Anime modu + Film modu + ETKİN + Liste güncellendi + Listene 5 yeni yapım eklendi. Son çıkanları kaçırma. + güncelle + Belki bunlar hoşuna gider + İzleniyor + Yazı boyutu + Yazı rengi + Altyazı arka planı + Yetişkin içeriği uyarısı + Yetişkin içeriğini (NSFW) açmak üzeresin. Bu içerik her izleyiciye uygun olmayabilir. + Yaş doğrulama + Yetişkin içeriğini görmek için 18 yaşından büyük olmalısın + İçerik görünürlüğü + Yetişkin içeriği platformun her yerinde görünür olacak + Kapatması kolay + Bunu istediğin zaman hesap ayarlarından kapatabilirsin + Anladım, aç + NSFW içeriği kapalı + Yetişkin içeriği şu an kapalı. Erişmek için tercihlerinden NSFW’yi açman gerekiyor. + Gizle + Arama sorgusu + Aramayı kaldır + Bu kaynak + Anime ara... + Başlık + Ülkeye göre + Kategoriye göre + Dinleniyor… + Açık + Kapalı + %1$d. bölüm + Kategoriye göre + Ülkeye göre + Özel liste + Kaynaklar hazırlanıyor… + Kullanılabilir akış yok + Anime filtrele + Film filtrele + Medya yükleniyor.. + Bölümler yükleniyor.. + Yaş: %1$s + Yayınlandı! + Tüm kaynaklar + Dinleniyor... + Dinleniyor... Şimdi konuş + Konuşma algılanmadı + Başlatılıyor… + Sesli arama başlatılıyor... + Sesli arama kullanılamıyor + Sesli arama hatası + Aranıyor: %1$s + Sesli arama iptal edildi + “%1$s” açılıyor… + Giriş sayfası henüz bağlanmadı + Güncelleme var + İndiriliyor… + İndirme tamamlandı! + Şimdi kur + İndirme başarısız + Tekrar dene + + %1$d kaynak güncellendi + %1$d kaynak güncellendi + + + %1$d kaynak + %1$d kaynak + + + %1$d depo + %1$d depo + + + %1$d eklenti yüklenemedi + %1$d eklenti yüklenemedi + + Kaynak aranıyor… + Bu kaynak yavaş… + Başka bir sunucu dene + %1$s kalitesine geçiliyor… + %1$s sunucusuna geçiliyor… + Bu diziyi bitirdin + Burada bulunan son bölümdü. + Yeniden izle + Bu bölüm başlatılamıyor + %1$s konumunda durduruldu + %1$d sn atla + Jeneriği atla + Kapanışı atla + Özeti atla + %1$s — %2$d. bölüm + + %1$d. kısım · %2$d bölüm + %1$d. kısım · %2$d bölüm + + Sırada + Şimdi oynat + İzlemeye devam et + %1$d sn içinde başlıyor + Atlamak için OK’a bas + Oynatma durdu + Yeniden dene + Sunucu değiştir + Geri + Yükleniyor… + Bölüm listesi + Çevrimiçi altyazı ara + Aranacak başlık + Ara + Bu başlık için altyazı bulunamadı + Aranıyor… + %1$s diline çevir (YZ) + Bugün %1$d hakkın kaldı + Çevriliyor… bu bir dakikaya kadar sürebilir + Çevrilemedi — daha sonra tekrar dene + Çevrilecek bir şey yok — bu başlık için altyazı bulunamadı + %1$s (YZ) + Bugün için yapay zekâ çevirisi kalmadı + Altyazı + + %1$d altyazı bulundu + %1$d altyazı bulundu + + Kış modu (Beni şaşırt) + Kış temasının önizlemesini aç/kapat + Tema + Altyazı stili + İçerik ve gizlilik + Ana sayfada ne görüneceğini yönet + Ana sayfa kanalları: %1$s \u2022 Yetişkin: %2$s + Dil + Sozo’nun bu televizyonda konuştuğu dil + diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml new file mode 100644 index 00000000..33bf5a00 --- /dev/null +++ b/app/src/main/res/values-uz/strings.xml @@ -0,0 +1,398 @@ + + + Qidiruv + Asosiy + Orqaga + Asosiyga qaytish + Anime filtri + Tv Garden + Nimadir xato ketdi. Qaytadan urinib ko‘ring. + Qayta urinish + TV kanallar + Obuna holati + Faol + Ma’lumotlarim + Xatchoplar sahifasi + Manbalar + Ko‘rish tarixi + Xabarlarni olish + Hisobdan chiqish + Hozircha bu yerda film yoki serial yo‘q + Bu manba uchun aktyorlar ma’lumoti mavjud emas + Amallar + Hozir ko‘rish + Hozir yangilash + Film haqida + Chiqarilgan yili + Studiya + Turkum + Til + soat + daqiqa + Iltimos, yopmang + Aloqa + Personaj haqida + Sarlavha noto‘g‘rimi? + Kattalar uchun kontent ko‘rinishini yoqish yoki o‘chirish + Kanal kontenti ko‘rinishini yoqish yoki o‘chirish + Kattalar uchun kontent (NSFW) + Bosh sahifa kanallari + JONLI TV + Qayta urinish + %1$d-qism + Hozir ijro etilmoqda + Tafsilotlarni yuklab bo‘lmadi. Qaytadan urinib ko‘ring. + Mehmon + %1$s-qism yuklanmoqda… + Sifat almashtirilmoqda… + Sifatni almashtirib bo‘lmadi — joriysi qoldi. + %1$s qismining epizodlari yuklanmoqda… + Bu oxirgi qism + Bu birinchi qism + QR kodni yangilash + Telefoningizdagi tasdiq kutilmoqda… + QR kod bilan kirish + Kodni telefoningiz bilan skanerlang yoki Sozo → Profil → Televizorni ulash bo‘limini ochib, quyidagi kodni kiriting. + Sizning kodingiz + Amal qilish muddati: %1$d:%2$02d + Kod olinmoqda… + Kod muddati tugadi. Yangisi uchun Yangilash tugmasini bosing. + Qayta ulanmoqda… + %1$s sifatida kirdingiz + Kirish amalga oshmadi. Qaytadan urinish uchun Yangilashni bosing. + Orqaga + Internet aloqasi yo‘q + Juda ko‘p urinish. Birozdan so‘ng qaytadan urinib ko‘ring. + Mening hisobim + Profilingiz va sozlamalaringizni boshqaring + Mehmon hisobi + Kirish + Tashrifchi + Subtitr shrifti, rangi va o‘lchamini sozlang (TV uchun qulay) + Ko‘rinishi + Subtitrlar televizorda mana shunday ko‘rinadi + Shrift + Kun + Bosh ekranda ko‘rish tarixini yoqish yoki o‘chirish + Tarix boshqaruvi + Manba + Sizga tavsiya qilingan qidiruvlar + Uslub + O‘chiq + Yoniq + Subtitrlar o‘chirilgan + Hammasini ko‘rish + Yana film va seriallarni ko‘rish + Keyinroq + Bekor qilish uchun ORQAGA tugmasini bosing + Hozircha xabar yo‘q + HOLAT + Manbalardan topish + %1$d-qismni ko‘rilgan deb belgilash + Hammasi ko‘rilgan + Saqlanmoqda… + %1$d ta yangi + Ulanmagan — Sozo telefon ilovasidagi Profil → Ulanishlar bo‘limidan ulang + Ulanmagan — Sozo telefon ilovasidagi Profil → Ulanishlar bo‘limidan ulang + AniList ro‘yxatingiz bo‘sh. + “%1$s” ichida hech nima yo‘q. + Bu qurilma bunday formatni ijro eta olmaydi — boshqa manba sinalmoqda… + Bu televizor mazkur video formatini ijro eta olmaydi. Boshqa sifat yoki serverni tanlang. + Aloqa uzildi. Tarmoqni tekshirib, qaytadan urinib ko‘ring. + Bu havolaning muddati tugagan. Qaytadan urinib ko‘ring yoki boshqa serverni tanlang. + Ijro amalga oshmadi. Boshqa server yoki sifatni sinab ko‘ring. + ko‘rilgan + saqlangan + o‘qilmagan + Mavsumiy fon — Qishda qor yog‘adi + Butun ko‘rish tarixingiz o‘chirilsinmi? + Eshitilmadi. Qaytadan urinib ko‘ring. + Sozo uchun mikrofon ruxsati o‘chirilgan. + Ovozli qidiruv hozir ishlamayapti. + %1$d ta anime + %1$d ta qism + o‘rtacha %1$.1f + %1$d kun ko‘rilgan + Nimadir xato ketdi. Qaytadan urinib ko‘ring. + Serverga ulanib bo‘lmadi. Aloqangizni tekshiring. + Internet aloqasi yo‘q. + Server juda uzoq javob bermadi. + Xavfsiz ulanish amalga oshmadi. + Hozircha saqlangan personaj yo‘q + Hozircha saqlangan kanal yo‘q + Hech narsa topilmadi + Bu manba uchun turkumlar mavjud emas + Manba tanlanmagan — avval bittasini tanlang + Bu sarlavhaga mos hech nima topilmadi + Sozlamalarga o‘tish + Sozlamalar + Ekran o‘lchami + Sig‘dirish + Butun kadr ko‘rinadi, yon tomonlarda chiziqlar bo‘ladi + To‘ldirish + Ekranni to‘ldiradi, chekkalari kesiladi + Cho‘zish + Cho‘zib sig‘diriladi, nisbat buziladi + Ovoz + Oqim ichidagi ovoz yo‘llari — dublyaj yoki original. + Tezlik + Oddiy + Subtitrlar + Oqim ichidagi subtitr yo‘llari. + Subtitrlarsiz + Video sifati + Ruxsatni tanlang yoki pleyer aloqangizga qarab tanlasin. + Avto + Aloqangizga moslashadi + Server + Bu qismni qaysi host uzatishini tanlang. Sifat alohida tanlanadi. + Manbalarni yangilash + Yangilanmoqda… + Manba yangilanishlari tekshirilmoqda… + Repolar yangilanmoqda… %1$d/%2$d + Yangilash amalga oshmadi: %1$s + Barcha manbalar eng so‘nggi holatda + CloudStream’ning bu ilovada yo‘q qismini talab qiladi (%1$s) + bu ilovadagidan yangiroq CloudStream uchun qurilgan (%1$s) + plagin faylini o‘qib bo‘lmadi — repoyni o‘chirib, qaytadan qo‘shing + Manbalar sozlanmoqda… kuting + %1$s sozlanmoqda (%2$d/%3$d)… + %1$s sozlanmoqda (%2$d/%3$d) · %4$d/%5$d + Faol manba: %1$s + Provayderlar yo‘q. + “%1$s” ga mos provayder yo‘q. + Provayderlarni yuklab bo‘lmadi: %1$s + %1$s dan bironta manba o‘rnatilmadi. Qaytadan urinish uchun “Manbalarni yangilash”ni bosing. + Ijro + Deyarli tugadi + Tugallandi + %2$s dan %1$s + Ko‘rish tarixini tozalash + Qoldirish + Tarixni tozalash + Qidirib bo‘lmadi — aloqani tekshiring + Subtitr kechikishi + %1$s subtitrini yuklab bo‘lmadi — boshqasini sinang + Orqaga + Qismlar + Oldingi qism + 10 s orqaga + Ijro + Pauza + 10 s oldinga + Keyingi qism + Subtitrlar + Ovoz + Sozlamalar + O‘tish + %1$d-qism + %1$d-qism · %2$dp + Bu qismni yuklab bo‘lmadi. Aloqangizni tekshirib, qaytadan urinib ko‘ring. + %1$d-qism + Ko‘rishni davom ettirish + Oxirgi ko‘rilgan + IMDb %1$s + %1$s dan davom etilsinmi? + Davom ettirish + Boshidan boshlash + Subtitrlarni ko‘rsatish + Subtitr uslubi + Matn o‘lchami + Matn rangi + Fon + Chegara + Standart + Monoshrift + %1$s · %2$d sp · %3$s · Fon: %4$s · Chegara: %5$s + Oq + To‘q sariq + Kulrang + Yashil + Qizil + Ko‘k + Shu serverdan + Yuklab olingan + AI tarjimasi + Bu kanal hozir efirga uzatmayapti. Birozdan so‘ng qaytadan urinib ko‘ring. + Bu kanal hozir ishlamayapti. Qaytadan urinib ko‘ring yoki boshqa kanalni tanlang. + Telefondan qo‘shish + Telefoningizdan manba qo‘shing + Kodni skanerlang yoki quyidagi manzilni bir xil Wi‑Fi’dagi istalgan brauzerda oching. Ilova kerak emas. + 1 · Telefoningizda oching + 2 · Mana bu kodni kiriting + 3 · Repozitoriy havolasini joylashtirib yuboring. U shu yerga, televizorga o‘rnatiladi. + Tayyor + Telefoningiz kutilmoqda… + Bu televizor telefon yeta oladigan tarmoqda emas. Uni bir xil Wi‑Fi’ga ulab, bu ekranni qaytadan oching. + %1$s qabul qilindi — o‘rnatilmoqda… + %2$d tadan %1$d o‘rnatilmoqda… + %1$d ta manba qo‘shildi. Ular shu ekran ortidagi ro‘yxatda. + O‘rnatildi, lekin hech qanday manba qo‘shilmadi. Havola noto‘g‘ri faylga ishora qilayotgan bo‘lishi mumkin. + O‘rnatib bo‘lmadi: %1$s + Hisob + Kanal yuklanmoqda... + Ulanish xatosi + Hozir ijro etish + Ijtimoiy tarmoqlarda kuzating + Profil + "Hisob " + Chiqishga ishonchingiz komilmi? + Hozir emas + Ha, davom etish + "Filtr " + Reytingni tanlang: + Qo‘llash + Saralashni tanlang + Yilni tanlang + Tv Garden filtri + Turini tanlang: + Provayderlar + Provayderlarni qidirish… + Tozalash + Anime + Personajlar + TV kanallar + Davlat bo‘yicha + Turkum bo‘yicha + Kanal nomi + JONLI + Hududda bloklangan + O‘chirilgan + Kontent rejimi + O‘zingizga ma’qul kontent turini tanlang + Anime rejimi + Film rejimi + FAOL + Ro‘yxat yangilandi + Ro‘yxatingizga 5 ta yangi chiqish qo‘shildi. Eng so‘nggilarini o‘tkazib yubormang. + yangilash + Balki sizga yoqar + Ko‘rilmoqda + Matn o‘lchami + Matn rangi + Subtitr foni + Kattalar uchun kontent haqida ogohlantirish + Siz kattalar uchun kontentni (NSFW) yoqmoqchisiz. Bu barcha auditoriyaga mos kelmasligi mumkin bo‘lgan kontentni ko‘rsatadi. + Yoshni tasdiqlash + Kattalar uchun kontentni ko‘rish uchun 18+ yoshda bo‘lishingiz kerak + Kontent ko‘rinishi + Kattalar uchun kontent butun platformada ko‘rinadi + O‘chirish oson + Buni istalgan vaqtda hisob sozlamalaringizdan o‘chirishingiz mumkin + Tushundim, yoqilsin + NSFW kontenti o‘chirilgan + Kattalar uchun kontent hozir o‘chirilgan. Unga kirish uchun sozlamalarda NSFW’ni yoqishingiz kerak. + Yashirish + Qidiruv so‘rovi + Qidiruvni o‘chirish + Shu manba + Anime qidirish... + Sarlavha + Davlat bo‘yicha + Turkum bo‘yicha + Tinglanmoqda… + Yoqilgan + O‘chirilgan + %1$d-qism + Turkum bo‘yicha + Davlat bo‘yicha + Maxsus ro‘yxat + Manbalar sozlanmoqda… + Oqim mavjud emas + Anime filtri + Film filtri + Media yuklanmoqda.. + Qismlar yuklanmoqda.. + Yoshi: %1$s + Chiqdi! + Barcha manbalar + Tinglanmoqda... + Tinglanmoqda... Gapiring + Nutq aniqlanmadi + Boshlanmoqda… + Ovozli qidiruv boshlanmoqda... + Ovozli qidiruv mavjud emas + Ovozli qidiruv xatosi + Qidirilmoqda: %1$s + Ovozli qidiruv bekor qilindi + “%1$s” ochilmoqda… + Kirish sahifasi hali ulanmagan + Yangilanish mavjud + Yuklab olinmoqda… + Yuklab olindi! + Hozir o‘rnatish + Yuklab olinmadi + Qaytadan urinish + + %1$d ta manba yangilandi + %1$d ta manba yangilandi + + + %1$d ta manba + %1$d ta manba + + + %1$d ta repo + %1$d ta repo + + + %1$d ta plagin yuklanmadi + %1$d ta plagin yuklanmadi + + Manba qidirilmoqda… + Bu manba sekin ishlayapti… + Boshqa serverni sinang + %1$s ga o‘tilmoqda… + %1$s ga o‘tilmoqda… + Bu serialni tugatdingiz + Bu yerdagi oxirgi qism edi. + Qaytadan ko‘rish + Bu qismni boshlab bo‘lmadi + %1$s da to‘xtatilgan + %1$d s o‘tkazish + Introni o‘tkazish + Yakunni o‘tkazish + Takrorni o‘tkazish + %1$s — %2$d-qism + + %1$d-qism · %2$d ta epizod + %1$d-qism · %2$d ta epizod + + Keyingisi + Hozir ijro etish + Ko‘rishda davom etish + %1$d s dan keyin boshlanadi + O‘tkazish uchun OK bosing + Ijro to‘xtadi + Qayta urinish + Serverni almashtirish + Orqaga + Yuklanmoqda… + Qismlar ro‘yxati + Onlayn subtitr qidirish + Qidiriladigan sarlavha + Qidirish + Bu sarlavha uchun subtitr topilmadi + Qidirilmoqda… + %1$s tiliga tarjima qilish (AI) + Bugun %1$d ta qoldi + Tarjima qilinmoqda… bu bir daqiqagacha vaqt olishi mumkin + Tarjima qilib bo‘lmadi — keyinroq urinib ko‘ring + Tarjima qiladigan narsa yo‘q — bu sarlavha uchun subtitr topilmadi + %1$s (AI) + Bugun AI tarjimalari qolmadi + Subtitr + + %1$d ta subtitr topildi + %1$d ta subtitr topildi + + Qishki rejim (meni hayratlantir) + Qishki mavzu ko‘rinishini yoqish yoki o‘chirish + Mavzu + Subtitr uslubi + Kontent va maxfiylik + Bosh sahifada nima ko‘rinishini boshqaring + Bosh sahifa kanallari: %1$s \u2022 Kattalar: %2$s + Til + Sozo shu televizorda qaysi tilda gapiradi + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2347da4e..887f5d56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,7 +11,7 @@ Tv Garden Something went wrong. Please try again. Retry - Tv Kanallar + TV Channels Eshonov Fakhriyor Subscription Status Active @@ -23,7 +23,7 @@ Exit Account There is no movie or serial here right now Cast details aren\'t available for this source - Amallar + Actions Watch Now Update Now About Movie @@ -31,8 +31,8 @@ Studio Category Language - soat - daqiqa + h + min Please do`nt close Contact & @sozoApp @@ -407,4 +407,15 @@ Install Now Download Failed Try Again + + + Winter mode (Surprise Me) + Enable / disable Winter theme preview + Theme + Subtitle Style + Content & Privacy + Manage what shows on Home + Home Channels: %1$s \u2022 Adult: %2$s + Language + The language Sozo speaks on this television diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml new file mode 100644 index 00000000..1445bdae --- /dev/null +++ b/app/src/main/res/xml/locales_config.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + diff --git a/tools/check_strings.py b/tools/check_strings.py new file mode 100644 index 00000000..0c187d36 --- /dev/null +++ b/tools/check_strings.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +"""Checks the translated string resources against the English originals. + + python3 tools/check_strings.py + +## Why this exists + +Android resolves a missing string by falling back to `values/`, so a gap is a +word in the wrong language rather than a crash — invisible to the build, and to +anyone not reading that language. + +A mismatched format specifier is not invisible. `getString(R.string.x, name)` +against a translation that dropped `%1$s`, or turned it into `%1$d`, throws at +the moment that screen renders, and only on a device set to that language. +That is what this fails the build on. + +## The two tiers + +`en`, `uz` and `ru` are written by the team, so a key missing from them is a +build failure — someone here can fix it before merging. The other seven are +machine-translated and topped up in batches; blocking a PR on them would not +produce seven translations, it would produce seven copies of the English string +pasted in to get the build green. Those are reported instead. +""" + +import re +import sys +import xml.etree.ElementTree as ET +from pathlib import Path + +RES = Path(__file__).resolve().parent.parent / 'app/src/main/res' +BLOCKING = {'uz', 'ru'} + +# Deliberately the same in every language, so a locale file that omits them is +# correct rather than incomplete. Reporting these would train people to ignore +# the output, which is the one thing a check like this cannot survive. +NEVER_TRANSLATED = { + # nav-graph destination labels — never drawn on a leanback screen + 'homescreen', 'contactscreen', 'search_screen', 'categories_screen', + 'livetvplayerscreen', 'tv_garden_screen', 'view_all_screen', 'sourcescreen', + 'aniyomi_settings', 'splash_screen', 'detailpage', 'castdetailscreen', + 'trailerplayerscreen', 'episodescreen', 'seriesplayerscreen', + 'my_account_page', 'bookmark_screen', 'historypage', 'anilistscreen', + 'news_page', 'qualit_dialog', + # brand and proper nouns + 'app_name', 'sozo', 'aniyomi', 'cloudstream', 'telegram', 'anilist', 'mal', + 'poppins', 'eshonov_fakhriyor', 'amp_sozoapp', + # punctuation, XML entities, layout-preview samples + 'quot', 'amp', 'space', 'g', 'meta_separator', 'stepper_value_sample', + 'news_time_sample', 'episode_2_will_be_released_in', + 'e_g_natsume_yuujinchou', 'plugin_failed_entry', 'plugin_error_other', + 'country_language', 'search_results_for', +} +FORMAT = re.compile(r'%(?:\d+\$)?[.\d]*[a-zA-Z]') + + +def load(directory): + """name -> the text that carries the format specifiers.""" + out = {} + for path in sorted(directory.glob('strings*.xml')): + root = ET.parse(path).getroot() + for node in root.findall('string'): + out[node.get('name')] = ''.join(node.itertext()) + for node in root.findall('plurals'): + item = node.find("item[@quantity='other']") or node.find('item') + if item is not None: + out[node.get('name')] = ''.join(item.itertext()) + return out + + +def main(): + english = {k: v for k, v in load(RES / 'values').items() + if k not in NEVER_TRANSLATED} + if not english: + print(f'No string resources under {RES}/values', file=sys.stderr) + return 2 + + failures = 0 + advisory = 0 + + for directory in sorted(RES.glob('values-*')): + locale = directory.name[len('values-'):] + if not (directory / 'strings.xml').exists(): + continue + translated = load(directory) + + # 1. A format specifier that changed shape is a crash on that locale. + for name, text in translated.items(): + if name not in english: + print(f'✗ {locale}: "{name}" is not in values/') + failures += 1 + continue + want = sorted(FORMAT.findall(english[name])) + got = sorted(FORMAT.findall(text)) + if want != got: + print(f'✗ {locale}/{name}: format {got} does not match English {want}') + failures += 1 + + # 2. A missing key falls back to English — a gap, not a crash. + missing = sorted(set(english) - set(translated)) + if missing: + blocks = locale in BLOCKING + mark = '✗' if blocks else '·' + print(f'{mark} {locale}: {len(missing)} string(s) still in English' + f'{"" if blocks else " (advisory)"}') + for name in missing[:15]: + print(f' {name}') + if len(missing) > 15: + print(f' … and {len(missing) - 15} more') + if blocks: + failures += len(missing) + else: + advisory += len(missing) + + locales = len(list(RES.glob('values-*'))) + print(f'\n{locales} translated locale(s), {len(english)} string(s) in values/.') + if advisory: + print(f'{advisory} advisory gap(s) — those render in English until the ' + f'next translation pass.') + if failures: + print(f'✗ {failures} problem(s).') + return 1 + print('✓ Every translation matches the English format specifiers.') + return 0 + + +if __name__ == '__main__': + sys.exit(main())