0
0
Fork 0
mirror of https://github.com/YTVanced/VancedManager synced 2024-11-25 04:35:12 +00:00

Merge pull request #173 from YTVanced/dev

1.3.0 release
This commit is contained in:
KevinX8 2020-09-27 19:33:00 +01:00 committed by GitHub
commit 8c7bec1633
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
128 changed files with 4167 additions and 2720 deletions

View file

@ -18,11 +18,6 @@ jobs:
with:
java-version: 1.8
- name: Write firebase config to file
run: echo $FIREBASE_CONFIG > app/google-services.json
env:
FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
- name: Grant rights
run: chmod +x ./gradlew
@ -36,4 +31,4 @@ jobs:
uses: actions/upload-artifact@v2
with:
name: 'Manager'
path: app/build/outputs/apk/debug/app-debug.apk
path: app/build/outputs/apk/debug/app-debug.apk

3
.gitignore vendored
View file

@ -3,7 +3,8 @@
build/
out/
app/src/main/java/com/vanced/manager/core/base/DummyJava.java
app/google-services.json
app/build/
app/release
local.properties
/.github/
*.iml

View file

@ -5,10 +5,11 @@ For anyone who wants to provide translations please submit them to https://trans
[![Github All Releases](https://img.shields.io/github/downloads/YTVanced/VancedManager/total.svg)]() [![Github All Releases](https://img.shields.io/github/release/YTVanced/VancedManager.svg)]()
# Vanced Manager
Hi, when we released Vanced 15.05.54, people were upset because it used the .apks format, which was way harder to install than a traditional .apk file. Even though we wrote clear instructions on how to install the new Vanced build, people still couldn't figure it out.
Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 5mb?" and that's how Vanced Manager was born.
Then we thought, "why don't we make a manager for vanced, which will download, update and uninstall Vanced and MicroG, have an easy and understandable UI and be less than 10mb?" and that's how Vanced Manager was born.
After 3 months of development, we are finally ready to introduce Vanced Manager to the masses. Vanced manager can easily install and uninstall vanced and microg, has various settings for customisation and better experience. The Manager comes with an easy-to-use interface, support for background download and installation*
##### *Due to changes in Android Oreo and up, and because of aggressive battery optimisations in some ROMs, feature may not be available for all devices.
After 3 months of development, we are finally ready to introduce Vanced Manager to the masses. Vanced manager can easily install and uninstall vanced and microg, has various settings for customisation and better experience. The Manager comes with an easy-to-use interface
##### Background download/installation feature is no longer supported due to problems with some ROMs, please do NOT report problems regarding background activity.
## Vanced Developers
- xfileFIN
@ -16,12 +17,16 @@ After 3 months of development, we are finally ready to introduce Vanced Manager
- Zanezam
- Laura Almeida
## Vanced Manager Developer
## Vanced Manager Developers
- Xinto (X1nto)
- Koopah (ostajic)
## Contributors
- AioiLight
## Credits
- topjohnwu for his wonderful [LibSU](https://github.com/topjohnwu/libsu)
- Mindorks for their amazing [PRDownloader](https://github.com/MindorksOpenSource/PRDownloader)
- aefyr for [SAI](https://github.com/aefyr/SAI), which was an inspiration for our Manager
- kittinunf for the [Fuel](https://github.com/kittinunf/Fuel) library
- cbeust for the [klaxon](https://github.com/cbeust/klaxon) library
- kittinunf for [Fuel](https://github.com/kittinunf/Fuel) HTTP client
- cbeust for [klaxon](https://github.com/cbeust/klaxon) JSON parser

View file

@ -9,7 +9,7 @@ No one really thought there would be problems with this format, because installa
## Problems with .apks format
Main problems with new format were either with device CPU architecture or MemeUI shit with MiUI optimisations. We wrote instructions for VancedHelper but no one used it for troubleshooting. Then some users complained about new format and refused to upgrade to newest version (We don't give a fuck about that) because "I dOn'T WaNT To HaVe OnE MoRE apP To insTalL VanCeD" so we decided to make an installer for Vanced
# Vanced Manager
Ladies and gentlemen, I'm very proud to introduce the new **Vancad Manger 1.0.0™** (typo is intentional)
Ladies and gentlemen, I'm very proud to introduce the new **Vancad Manger 1.2.0™** (typo is intentional)
Vanced Manager is an universal utility for installing/updating Vanced and MicroG. It will push notifications once the update is ready (Now that's what I call pwetty epic).
Vanced manager comes with a slick UI ~~that was stolen from the new Magisk Manager (I'm very sorry John but I looked at your code for about 100 times).~~ Actually, while UI may look very similar to new Magisk Manager's UI, It's still very different (that's a blatant lie, I know).
@ -21,16 +21,21 @@ Isn't this lovely and beautiful?
- 1337Potato: shit
- Response: Yes
===================
- Noobbot: The app is not useful because I have YT Premium. Thank you bye
- Response: I hope you get sucked by a di-
- Response: I hope you get sucked by a di-
===================
- Vortextriangle: The app is so useful that I uninstalled it after installing Vanced
- Response: yo that's finna woke
## Credits
### Vanced Manager developers
- X1nto (UI, UX, Downloader, Installer, Signature Checker, PussiSlayer69, Collector of 400 BAT, Professional Liar)
- X1nto (UI, UX, Downloader, Installer, Signature Checker, PussiSlayer69, Collector of 400 BAT, A great liar)
- Koopah (Unix lord, Unmounter of /system, Code criticizer)
### The Vanced Team
- xfileFIN
![xfileFIN](https://i.imgur.com/hLdzTVq.png)
@ -40,3 +45,6 @@ Isn't this lovely and beautiful?
![Zanezam](https://i.imgur.com/QVcXA6q.png)
- Laura Almeida
![Laura Almeida](https://i.imgur.com/ovVD939.png)
###### If someone is reading this pls help me, KevinX8 is bullying me and forces me to develop manager. please send bobs and veganas and call 911

View file

@ -1,3 +1,6 @@
import java.util.regex.Matcher
import java.util.regex.Pattern
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
@ -5,19 +8,25 @@ apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.firebase-perf'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'androidx.navigation.safeargs.kotlin'
ext.langs = getLanguages()
android {
compileSdkVersion 30
buildToolsVersion "30.0.1"
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.vanced.manager"
minSdkVersion 21
targetSdkVersion 30
versionCode 12
versionName "1.2.0 (Niko)"
versionCode 13
versionName "1.3.0b (Arcturus)"
vectorDrawables.useSupportLibrary = true
buildConfigField "String[]", "MANAGER_LANGUAGES", "{" + surroundWithQuotes(langs) + "}"
buildConfigField "String[]", "MANAGER_LANGUAGE_NAMES", "{" + surroundWithQuotes(getLanguageNames()) + "}"
}
lintOptions {
@ -56,6 +65,48 @@ android {
}
def getLanguages() {
List<String> langs = new ArrayList<String>()
langs.add("en")
Pattern pattern = Pattern.compile("-(\\w+)-")
new File("${projectDir}/src/main/res").eachDir { dir ->
if (dir.name.startsWith("values-") && !dir.name.contains("v23")) {
Matcher matcher = pattern.matcher(dir.name)
if (matcher.find()) {
if (langs.contains(matcher.group(1)))
langs.add(matcher.group(1) + "_${dir.name.substring(dir.name.length() - 2)}")
else
langs.add(matcher.group(1))
}
}
}
return langs.toArray()
}
def getLanguageNames() {
List<String> langnames = new ArrayList<String>()
for (int i = 0; i < langs.size(); i++) {
if (langs[i].length() > 2) {
Locale loc = new Locale(langs[i].substring(0, langs[i].length() - 3), langs[i].substring(langs[i].length() - 2))
project.logger.lifecycle(loc.getDisplayLanguage(loc).capitalize() + " (" + loc.getDisplayCountry(loc).capitalize() + ")")
langnames.add(loc.getDisplayLanguage(loc).capitalize() + " (" + loc.getDisplayCountry(loc).capitalize() + ")")
} else {
Locale loc = new Locale(langs[i])
project.logger.lifecycle(loc.getDisplayLanguage(loc).capitalize())
langnames.add(loc.getDisplayLanguage(loc).capitalize())
}
}
return langnames.toArray()
}
def surroundWithQuotes(Object[] arr) {
String[] dummyArr = arr
for (int i = 0; i < arr.length; i++) {
dummyArr[i] = "\"" + arr[i] + "\""
}
return dummyArr.join(", ")
}
dependencies {
// Kotlin
@ -63,10 +114,9 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
// AndroidX
implementation 'androidx.activity:activity:1.1.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.browser:browser:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.fragment:fragment-ktx:1.2.5'
implementation 'androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0'
@ -84,11 +134,13 @@ dependencies {
implementation 'com.github.kittinunf.fuel:fuel:2.2.3'
implementation 'com.github.kittinunf.fuel:fuel-coroutines:2.2.3'
implementation 'com.github.kittinunf.fuel:fuel-json:2.2.3'
implementation 'com.squareup.okhttp3:logging-interceptor:4.8.1'
implementation 'com.github.topjohnwu.libsu:core:3.0.1'
implementation 'com.github.topjohnwu.libsu:io:3.0.1'
implementation 'com.google.firebase:firebase-messaging:20.2.4'
implementation 'com.google.firebase:firebase-perf:19.0.8'
implementation 'com.mindorks.android:prdownloader:0.6.0'
implementation 'com.google.firebase:firebase-analytics-ktx:17.4.4'
implementation 'com.google.firebase:firebase-crashlytics:17.1.1'
implementation 'com.google.firebase:firebase-analytics-ktx:17.5.0'
implementation 'com.google.firebase:firebase-crashlytics:17.2.1'
}

40
app/google-services.json Normal file
View file

@ -0,0 +1,40 @@
{
"project_info": {
"project_number": "840099702732",
"firebase_url": "https://vanced-manager-official.firebaseio.com",
"project_id": "vanced-manager-official",
"storage_bucket": "vanced-manager-official.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:840099702732:android:ca65567b49f622bc359f69",
"android_client_info": {
"package_name": "com.vanced.manager"
}
},
"oauth_client": [
{
"client_id": "840099702732-4fjjofq6on2bpd7jb6f96bk0mkrjkkf6.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAPI1RUaoCHmmWz9-TLvTKYPYs0ZVKkS2U"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "840099702732-4fjjofq6on2bpd7jb6f96bk0mkrjkkf6.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

View file

@ -13,6 +13,7 @@
#}
-keep class com.vanced.manager.core.App
-keepnames class androidx.navigation.fragment.NavHostFragment
# Uncomment this to preserve the line number information for
# debugging stack traces.

View file

@ -4,10 +4,17 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.vanced.manager">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERNET" />
<queries>
<package android:name="com.vanced.android.youtube" />
<package android:name="com.google.android.youtube" />
<package android:name="com.vanced.android.apps.youtube.music" />
<package android:name="com.mgoogle.android.gms" />
</queries>
<application
android:name=".core.App"
@ -37,7 +44,8 @@
<activity
android:name=".ui.MainActivity"
android:label="@string/app_name"
android:theme="@style/DarkTheme.Blue"/>
android:theme="@style/DarkTheme.Blue"
android:exported="true"/>
<meta-data
android:name="preloaded_fonts"
@ -70,14 +78,9 @@
android:resource="@drawable/ic_stat_name" />
<service android:name=".core.installer.SplitInstallerService" />
<service android:name=".core.installer.RootSplitInstallerService" />
<service android:name=".core.installer.SplitInstaller" />
<service android:name=".core.installer.AppUninstallerService" />
<service android:name=".core.installer.AppInstallerService" />
<service android:name=".core.installer.AppInstaller" />
<service android:name=".core.downloader.VancedDownloadService" />
<service android:name=".core.downloader.MicrogDownloadService" />
</application>
</manifest>
</manifest>

View file

@ -0,0 +1,38 @@
package com.vanced.manager.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.vanced.manager.R
import com.vanced.manager.ui.viewmodels.HomeViewModel
class ChangelogAdapter(private val variant: String, viewModel: HomeViewModel?): RecyclerView.Adapter<ChangelogAdapter.ChangelogViewHolder>() {
private val nonrootChangelogs = arrayOf(viewModel?.vanced?.get()?.changelog?.get(), viewModel?.music?.get()?.changelog?.get(), viewModel?.microg?.get()?.changelog?.get(), viewModel?.manager?.get()?.changelog?.get())
private val rootChangelogs = arrayOf(viewModel?.vanced?.get()?.changelog?.get(), viewModel?.manager?.get()?.changelog?.get())
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChangelogViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.view_changelog, parent, false)
return ChangelogViewHolder(view)
}
override fun getItemCount(): Int = if (variant == "root") 2 else 4
override fun onBindViewHolder(holder: ChangelogViewHolder, position: Int) {
holder.changelog.text =
if (variant == "root")
rootChangelogs[position]
else
nonrootChangelogs[position]
}
open class ChangelogViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val changelog: TextView = itemView.findViewById(R.id.changelog_text)
}
}

View file

@ -1,22 +0,0 @@
package com.vanced.manager.adapter
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.vanced.manager.ui.fragments.ManagerChangelogFragment
import com.vanced.manager.ui.fragments.MicrogChangelogFragment
import com.vanced.manager.ui.fragments.VancedChangelogFragment
class SectionPageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
override fun getItemCount(): Int = 3
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> VancedChangelogFragment()
1 -> MicrogChangelogFragment()
2 -> ManagerChangelogFragment()
else -> throw NotImplementedError()
}
}
}

View file

@ -1,20 +0,0 @@
package com.vanced.manager.adapter
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.vanced.manager.ui.fragments.ManagerChangelogFragment
import com.vanced.manager.ui.fragments.VancedChangelogFragment
class SectionPageRootAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
override fun getItemCount(): Int = 2
override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> VancedChangelogFragment()
1 -> ManagerChangelogFragment()
else -> throw NotImplementedError()
}
}
}

View file

@ -0,0 +1,91 @@
package com.vanced.manager.adapter
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.LinearLayout
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import com.vanced.manager.R
import com.vanced.manager.databinding.ViewHomeBinding
import com.vanced.manager.ui.viewmodels.HomeViewModel
import kotlinx.android.synthetic.main.include_changelogs.view.*
class VariantAdapter(private val viewModel: HomeViewModel, private val context: Context) : RecyclerView.Adapter<VariantAdapter.VariantAdapterHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VariantAdapterHolder {
val view = ViewHomeBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return VariantAdapterHolder(view, context)
}
override fun onBindViewHolder(holder: VariantAdapterHolder, position: Int) {
val variants = arrayOf("nonroot", "root")
holder.bind(variants[position], viewModel)
}
override fun getItemCount(): Int = 2
class VariantAdapterHolder(private val homeBinding: ViewHomeBinding, private val context: Context) : RecyclerView.ViewHolder(homeBinding.root) {
private var isExpanded: Boolean = false
fun bind(variant: String, viewModel: HomeViewModel) {
with (homeBinding) {
this.variant = variant
this.viewModel = viewModel
with(includeChangelogsLayout) {
changelogButton.setOnClickListener {
with (includeChangelogsLayout) {
viewpager.visibility = if (isExpanded) View.GONE else View.VISIBLE
tablayout.visibility = if (isExpanded) View.GONE else View.VISIBLE
changelogButton.animate().apply {
rotation(if (isExpanded) 0F else 180F)
interpolator = AccelerateDecelerateInterpolator()
}
isExpanded = !isExpanded
}
}
viewpager.adapter = ChangelogAdapter(variant, viewModel)
val nonrootTitles = arrayOf("Vanced", "Music", "microG", "Manager")
val rootTitles = arrayOf("Vanced", "Manager")
TabLayoutMediator(tablayout, viewpager) { tab, position ->
tab.text =
if (variant == "root") {
rootTitles[position]
} else {
nonrootTitles[position]
}
}.attach()
}
includeVancedLayout.vancedCard.setOnLongClickListener {
versionToast("Vanced", viewModel.vanced.get()?.installedVersionName?.get()!!)
true
}
includeMusicLayout.musicCard.setOnLongClickListener {
versionToast("Music", viewModel.music.get()?.installedVersionName?.get()!!)
true
}
includeMicrogLayout.microgCard.setOnLongClickListener {
versionToast("MicroG", viewModel.microg.get()?.installedVersionName?.get()!!)
true
}
}
}
private fun versionToast(name: String, app: String?) {
val clip = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clip.setPrimaryClip(ClipData.newPlainText(name, app))
Toast.makeText(context, context.getString(R.string.version_toast, name), Toast.LENGTH_LONG).show()
}
}
}

View file

@ -1,29 +1,49 @@
package com.vanced.manager.core
import android.app.Application
import android.content.res.Configuration
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.beust.klaxon.JsonObject
import com.crowdin.platform.Crowdin
import com.crowdin.platform.CrowdinConfig
import com.crowdin.platform.data.remote.NetworkType
import com.downloader.PRDownloader
import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.JsonHelper.getJson
import kotlinx.coroutines.*
class App: Application() {
open class App: Application() {
var vanced: JsonObject? = null
var music: JsonObject? = null
var microg: JsonObject? = null
var manager: JsonObject? = null
override fun onCreate() {
loadJsonAsync()
super.onCreate()
PRDownloader.initialize(this)
Crowdin.init(this,
CrowdinConfig.Builder()
.withDistributionHash("36c51aed3180a4f43073d28j4s6")
.withNetworkType(NetworkType.WIFI)
.build())
CrowdinConfig.Builder()
.withDistributionHash("36c51aed3180a4f43073d28j4s6")
.withNetworkType(NetworkType.WIFI)
.build()
)
}
fun loadJsonAsync() {
val latest = runBlocking { getJson("${getDefaultSharedPreferences(this@App).getString("update_url", baseUrl)}/latest.json") }
vanced = latest.obj("vanced")
music = latest.obj("music")
microg = latest.obj("microg")
manager = latest.obj("manager")
}
/*
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
Crowdin.onConfigurationChanged()
}
*/
}
}

View file

@ -1,89 +0,0 @@
package com.vanced.manager.core.downloader
import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.widget.Toast
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.R
import com.vanced.manager.core.installer.AppInstaller
import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.AppUtils.installing
import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.getObjectFromJson
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class MicrogDownloadService: Service() {
//private var downloadId: Long = 0
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
downloadMicrog()
stopSelf()
return START_NOT_STICKY
}
private fun downloadMicrog() {
CoroutineScope(Dispatchers.IO).launch {
val url = getObjectFromJson(
"${PreferenceManager.getDefaultSharedPreferences(this@MicrogDownloadService)
.getString("install_url", baseUrl)}/microg.json", "url"
)
//downloadId = download(url, "apk", "microg.apk", this@MicrogDownloadService)
PRDownloader.download(url, getExternalFilesDir("apk")?.path, "microg.apk")
.build()
.setOnStartOrResumeListener { installing = true }
.setOnProgressListener { progress ->
val mProgress = progress.currentBytes * 100 / progress.totalBytes
localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_DOWNLOADING).putExtra("progress", mProgress.toInt()).putExtra("file", getFileNameFromUrl(url)))
}
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
val intent = Intent(this@MicrogDownloadService, AppInstaller::class.java)
intent.putExtra("path", "${getExternalFilesDir("apk")}/microg.apk")
intent.putExtra("pkg", "com.mgoogle.android.gms")
localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_INSTALLING))
startService(intent)
}
override fun onError(error: Error?) {
installing = false
Toast.makeText(this@MicrogDownloadService, getString(R.string.error_downloading, "microG"), Toast.LENGTH_SHORT).show()
}
})
}
}
/*
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
//prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply()
//cancelNotif(channel, this@MicrogDownloadService)
val bIntent = Intent(this@MicrogDownloadService, AppInstaller::class.java)
bIntent.putExtra("path", "${getExternalFilesDir("apk")}/microg.apk")
bIntent.putExtra("pkg", "com.mgoogle.android.gms")
startService(bIntent)
}
}
}
*/
override fun onBind(intent: Intent?): IBinder? {
return null
}
}

View file

@ -0,0 +1,73 @@
package com.vanced.manager.core.downloader
import android.content.Context
import android.widget.Toast
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.R
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.microgProgress
import com.vanced.manager.utils.AppUtils.mutableInstall
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.getJsonString
import com.vanced.manager.utils.PackageHelper.install
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
object MicrogDownloader {
//private var downloadId: Long = 0
fun downloadMicrog(context: Context) {
CoroutineScope(Dispatchers.IO).launch {
val url = getJsonString("microg.json", "url", context)
//downloadId = download(url, "apk", "microg.apk", this@MicrogDownloadService)
microgProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("apk")?.path, "microg.apk")
.build()
.setOnStartOrResumeListener {
mutableInstall.value = true
microgProgress.get()?.downloadingFile?.set(context.getString(R.string.downloading_file, getFileNameFromUrl(url)))
microgProgress.get()?.showDownloadBar?.set(true)
}
.setOnCancelListener {
mutableInstall.value = false
microgProgress.get()?.showDownloadBar?.set(false)
}
.setOnProgressListener { progress ->
microgProgress.get()?.downloadProgress?.set((progress.currentBytes * 100 / progress.totalBytes).toInt())
}
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
install("microg", "${context.getExternalFilesDir("apk")}/microg.apk", context)
microgProgress.get()?.showDownloadBar?.set(false)
microgProgress.get()?.showInstallCircle?.set(true)
}
override fun onError(error: Error?) {
mutableInstall.value = false
microgProgress.get()?.showDownloadBar?.set(false)
Toast.makeText(context, context.getString(R.string.error_downloading, "microG"), Toast.LENGTH_SHORT).show()
}
})
}
}
/*
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
//prefs?.edit()?.putBoolean("isMicrogDownloading", false)?.apply()
//cancelNotif(channel, this@MicrogDownloadService)
val bIntent = Intent(this@MicrogDownloadService, AppInstaller::class.java)
bIntent.putExtra("path", "${getExternalFilesDir("apk")}/microg.apk")
bIntent.putExtra("pkg", "com.mgoogle.android.gms")
startService(bIntent)
}
}
}
*/
}

View file

@ -0,0 +1,76 @@
package com.vanced.manager.core.downloader
import android.content.Context
import android.widget.Toast
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.R
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.musicProgress
import com.vanced.manager.utils.AppUtils.mutableInstall
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.getJsonString
import com.vanced.manager.utils.PackageHelper.install
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
object MusicDownloader {
//private var downloadId: Long = 0
fun downloadMusic(context: Context){
CoroutineScope(Dispatchers.IO).launch {
val version = getJsonString("music.json", "version", context)
val url = "https://vanced.app/api/v1/music/v$version.apk"
//downloadId = download(url, "apk", "music.apk", this@MusicDownloadService)
musicProgress.get()?.currentDownload = PRDownloader.download(url, context.getExternalFilesDir("apk")?.path, "music.apk")
.build()
.setOnStartOrResumeListener {
mutableInstall.value = true
musicProgress.get()?.downloadingFile?.set(context.getString(R.string.downloading_file, getFileNameFromUrl(url)))
musicProgress.get()?.showDownloadBar?.set(true)
}
.setOnProgressListener { progress ->
musicProgress.get()?.downloadProgress?.set((progress.currentBytes * 100 / progress.totalBytes).toInt())
}
.setOnCancelListener {
mutableInstall.value = false
musicProgress.get()?.showDownloadBar?.set(false)
}
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
install("music", "${context.getExternalFilesDir("apk")}/music.apk", context)
musicProgress.get()?.showDownloadBar?.set(false)
musicProgress.get()?.showInstallCircle?.set(true)
}
override fun onError(error: Error?) {
mutableInstall.value = false
musicProgress.get()?.showDownloadBar?.set(false)
Toast.makeText(context, context.getString(R.string.error_downloading, "Music"), Toast.LENGTH_SHORT).show()
}
})
}
}
/*
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
//prefs?.edit()?.putBoolean("isMusicDownloading", false)?.apply()
//cancelNotif(channel, this@MusicDownloadService)
val bIntent = Intent(this@MusicDownloadService, AppInstaller::class.java)
bIntent.putExtra("path", "${getExternalFilesDir("apk")}/music.apk")
bIntent.putExtra("pkg", "com.mgoogle.android.gms")
startService(bIntent)
}
}
}
*/
}

View file

@ -1,142 +0,0 @@
package com.vanced.manager.core.downloader
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.widget.Toast
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.vanced.manager.R
import com.vanced.manager.core.installer.RootSplitInstallerService
import com.vanced.manager.core.installer.SplitInstaller
import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.AppUtils.installing
import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.getObjectFromJson
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class VancedDownloadService: Service() {
//private var downloadId: Long = 0
//private var apkType: String = "arch"
private var count: Int = 0
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
downloadSplits()
stopSelf()
return START_NOT_STICKY
}
private fun downloadSplits(
type: String = "arch"
) {
CoroutineScope(Dispatchers.IO).launch {
File(getExternalFilesDir("apk")?.path as String).deleteRecursively()
val defPrefs = PreferenceManager.getDefaultSharedPreferences(this@VancedDownloadService)
val installUrl = defPrefs.getString("install_url", baseUrl)
val vancedVer = getObjectFromJson("$installUrl/vanced.json", "version")
val prefs = getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
val variant = defPrefs.getString("vanced_variant", "nonroot")
val lang = prefs?.getString("lang", "en")?.split(", ")?.toTypedArray()
val theme = prefs?.getString("theme", "dark")
val arch =
when {
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
else -> "armeabi_v7a"
}
val url =
when (type) {
"arch" -> "$installUrl/apks/v$vancedVer/$variant/Arch/split_config.$arch.apk"
"theme" -> "$installUrl/apks/v$vancedVer/$variant/Theme/$theme.apk"
"lang" -> "$installUrl/apks/v$vancedVer/$variant/Language/split_config.${lang?.get(count)}.apk"
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
}
//apkType = type
//downloadId = download(url, "apks", getFileNameFromUrl(url), this@VancedDownloadService)
PRDownloader
.download(url, getExternalFilesDir("apks")?.path, getFileNameFromUrl(url))
.build()
.setOnStartOrResumeListener{ installing = true }
.setOnProgressListener { progress ->
val mProgress = progress.currentBytes * 100 / progress.totalBytes
localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_DOWNLOADING).putExtra("progress", mProgress.toInt()).putExtra("file", getFileNameFromUrl(url)))
}
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
when (type) {
"arch" -> downloadSplits("theme")
"theme" -> downloadSplits("lang")
"lang" -> {
count++
if (count < lang?.count()!!)
downloadSplits("lang")
else
prepareInstall(variant!!)
}
}
}
override fun onError(error: Error?) {
installing = false
Toast.makeText(this@VancedDownloadService, getString(R.string.error_downloading, "Vanced"), Toast.LENGTH_SHORT).show()
}
})
}
}
/*
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val prefs = context?.getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
val variant = PreferenceManager.getDefaultSharedPreferences(this@VancedDownloadService).getString("vanced_variant", "nonroot")
val lang = prefs?.getString("lang", "en")
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
when (apkType) {
"arch" -> downloadSplits("theme")
"theme" -> downloadSplits("lang")
"lang" -> {
if (lang == "en") {
prepareInstall(variant!!)
//cancelNotif(channel, this@VancedDownloadService)
} else {
downloadSplits("enlang")
}
}
"enlang" -> {
prepareInstall(variant!!)
//cancelNotif(channel, this@VancedDownloadService)
}
}
}
}
}
*/
private fun prepareInstall(variant: String) {
localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_INSTALLING))
if (variant == "root")
startService(Intent(this, RootSplitInstallerService::class.java))
else
startService(Intent(this, SplitInstaller::class.java))
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
}

View file

@ -0,0 +1,255 @@
package com.vanced.manager.core.downloader
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import android.widget.Toast
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.downloader.Error
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.logEvent
import com.vanced.manager.R
import com.vanced.manager.core.App
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.vancedProgress
import com.vanced.manager.utils.AppUtils.mutableInstall
import com.vanced.manager.utils.InternetTools
import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.InternetTools.getFileNameFromUrl
import com.vanced.manager.utils.InternetTools.getObjectFromJson
import com.vanced.manager.utils.PackageHelper.getPkgVerCode
import com.vanced.manager.utils.PackageHelper.installVanced
import com.vanced.manager.utils.PackageHelper.installVancedRoot
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.io.File
import java.io.IOException
import java.security.MessageDigest
object VancedDownloader {
private var sha256Val: String? = null
private lateinit var prefs: SharedPreferences
private lateinit var defPrefs: SharedPreferences
private lateinit var arch: String
private var installUrl: String? = null
private var variant: String? = null
private var theme: String? = null
private var lang: Array<String>? = null
private lateinit var themePath: String
//private var downloadId: Long = 0
//private var apkType: String = "arch"
private var count: Int = 0
private var hashUrl = ""
private const val yPkg = "com.google.android.youtube"
private var vancedVersionCode = 0
private val vancedVersion by lazy { runBlocking { getObjectFromJson("$installUrl/vanced.json", "version") }}
fun downloadVanced(context: Context){
//registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
File(context.getExternalFilesDir("apks")?.path as String).deleteRecursively()
defPrefs = getDefaultSharedPreferences(context)
installUrl = defPrefs.getString("install_url", baseUrl)
prefs = context.getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
variant = defPrefs.getString("vanced_variant", "nonroot")
lang = prefs.getString("lang", "en")?.split(", ")?.toTypedArray()
theme = prefs.getString("theme", "dark")
themePath = "$installUrl/apks/v$vancedVersion/$variant/Theme"
hashUrl = "apks/v$vancedVersion/$variant/Theme/hash.json"
//newInstaller = defPrefs.getBoolean("new_installer", false)
arch =
when {
Build.SUPPORTED_ABIS.contains("x86") -> "x86"
Build.SUPPORTED_ABIS.contains("arm64-v8a") -> "arm64_v8a"
else -> "armeabi_v7a"
}
val app = context.applicationContext as App
vancedVersionCode = app.vanced?.int("versionCode") ?: 0
downloadSplits(context)
}
private fun downloadSplits(
context: Context,
type: String = "theme"
) {
CoroutineScope(Dispatchers.IO).launch {
val url =
when (type) {
"theme" -> "$themePath/$theme.apk"
"arch" -> "$installUrl/apks/v$vancedVersion/$variant/Arch/split_config.$arch.apk"
"stock" -> "$themePath/stock.apk"
"dpi" -> "$themePath/dpi.apk"
"lang" -> "$installUrl/apks/v$vancedVersion/$variant/Language/split_config.${lang?.get(count)}.apk"
else -> throw NotImplementedError("This type of APK is NOT valid. What the hell did you even do?")
}
//apkType = type
//downloadId = download(url, "apks", getFileNameFromUrl(url), this@VancedDownloadService)
vancedProgress.get()?.currentDownload = PRDownloader
.download(url, context.getExternalFilesDir("apks")?.path, getFileNameFromUrl(url))
.build()
.setOnStartOrResumeListener {
mutableInstall.value = true
vancedProgress.get()?.downloadingFile?.set(context.getString(R.string.downloading_file, getFileNameFromUrl(url)))
vancedProgress.get()?.showDownloadBar?.set(true)
}
.setOnProgressListener { progress ->
vancedProgress.get()?.downloadProgress?.set((progress.currentBytes * 100 / progress.totalBytes).toInt())
}
.setOnCancelListener {
mutableInstall.value = false
vancedProgress.get()?.showDownloadBar?.set(false)
}
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
when (type) {
"theme" ->
if (variant == "root") {
if (validateTheme(context)) {
if(downloadStockCheck(context))
downloadSplits(context, "arch")
else
prepareInstall(variant!!, context)
} else
downloadSplits(context, "theme")
} else
downloadSplits(context, "arch")
"arch" -> if (variant == "root") downloadSplits(context, "stock") else downloadSplits(context, "lang")
"stock" -> downloadSplits(context, "dpi")
"dpi" -> downloadSplits(context, "lang")
"lang" -> {
count++
if (count < lang?.count()!!)
downloadSplits(context, "lang")
else
prepareInstall(variant!!, context)
}
}
}
override fun onError(error: Error?) {
if (type == "lang") {
count++
if (count < lang?.count()!!)
downloadSplits(context, "lang")
else
prepareInstall(variant!!, context)
} else {
mutableInstall.value = false
vancedProgress.get()?.showDownloadBar?.set(false)
Toast.makeText(context, context.getString(R.string.error_downloading, getFileNameFromUrl(url)), Toast.LENGTH_SHORT).show()
}
}
})
}
}
private fun downloadStockCheck(context: Context) :Boolean {
return try {
getPkgVerCode(yPkg,context.packageManager) != vancedVersionCode
} catch (e: Exception) {
true
}
}
private suspend fun getSha256(obj: String, context: Context) {
sha256Val = InternetTools.getJsonString(hashUrl, obj, context)
}
private fun validateTheme(context: Context): Boolean {
val themeS = context.getExternalFilesDir("apks")?.path + "/${theme}.apk"
val themeF = File(themeS)
runBlocking { getSha256(theme!!, context) }
return checkSHA256(sha256Val!!,themeF)
}
/*
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val prefs = context?.getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
val variant = PreferenceManager.getDefaultSharedPreferences(this@VancedDownloadService).getString("vanced_variant", "nonroot")
val lang = prefs?.getString("lang", "en")
if (intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) == downloadId) {
when (apkType) {
"arch" -> downloadSplits(context, "theme")
"theme" -> downloadSplits(context, "lang")
"lang" -> {
if (lang == "en") {
prepareInstall(variant!!)
//cancelNotif(channel, this@VancedDownloadService)
} else {
downloadSplits(context, "enlang")
}
}
"enlang" -> {
prepareInstall(variant!!)
//cancelNotif(channel, this@VancedDownloadService)
}
}
}
}
}
*/
private fun prepareInstall(variant: String, context: Context) {
vancedProgress.get()?.showDownloadBar?.set(false)
vancedProgress.get()?.showInstallCircle?.set(true)
FirebaseAnalytics.getInstance(context).logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
param("Vanced Variant", variant)
theme?.let { param("Vanced Theme", it) }
}
if (variant == "root")
installVancedRoot(context)
else
installVanced(context)
}
private fun checkSHA256(sha256: String, updateFile: File?): Boolean {
return try {
val dataBuffer = updateFile!!.readBytes()
// Generate the checksum
val sum = generateChecksum(dataBuffer)
sum == sha256
} catch (e: Exception) {
e.printStackTrace()
false
}
}
@Throws(IOException::class)
private fun generateChecksum(data: ByteArray): String {
try {
val digest: MessageDigest = MessageDigest.getInstance("SHA-256")
val hash: ByteArray = digest.digest(data)
return printableHexString(hash)
} catch (e: Exception) {
e.printStackTrace()
}
return ""
}
private fun printableHexString(data: ByteArray): String {
// Create Hex String
val hexString: StringBuilder = StringBuilder()
for (aMessageDigest:Byte in data) {
var h: String = Integer.toHexString(0xFF and aMessageDigest.toInt())
while (h.length < 2)
h = "0$h"
hexString.append(h)
}
return hexString.toString()
}
}

View file

@ -1,39 +0,0 @@
package com.vanced.manager.core.installer
import android.app.PendingIntent
import android.app.Service
import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import java.io.FileInputStream
import java.io.InputStream
class AppInstaller: Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val callbackIntent = Intent(applicationContext, AppInstallerService::class.java)
val pendingIntent = PendingIntent.getService(applicationContext, 0, callbackIntent, 0)
val packageInstaller = packageManager.packageInstaller
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(intent?.getStringExtra("pkg"))
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val inputStream: InputStream = FileInputStream(intent?.getStringExtra("path") as String)
val outputStream = session.openWrite("install", 0, -1)
val buffer = ByteArray(65536)
var c: Int
while (inputStream.read(buffer).also { c = it } != -1) {
outputStream.write(buffer, 0, c)
}
session.fsync(outputStream)
inputStream.close()
outputStream.close()
session.commit(pendingIntent.intentSender)
stopSelf()
return START_NOT_STICKY
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
}

View file

@ -5,19 +5,19 @@ import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import android.util.Log
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.microgProgress
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.musicProgress
import com.vanced.manager.utils.AppUtils.mutableInstall
import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefresh
class AppInstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
val app = intent.getStringExtra("app")
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
Log.d(TAG, "Requesting user confirmation for installation")
localBroadcastManager.sendBroadcast(Intent(HomeFragment.MICROG_INSTALLING))
val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
@ -28,12 +28,14 @@ class AppInstallerService: Service() {
}
PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installation succeed")
with(localBroadcastManager) {
sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
sendBroadcast(Intent(HomeFragment.MICROG_INSTALLED))
}
if (app == "microg") microgProgress.get()?.showInstallCircle?.set(false) else musicProgress.get()?.showInstallCircle?.set(false)
mutableInstall.postValue(false)
sendRefresh(this)
}
else -> {
sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999), this)
if (app == "microg") microgProgress.get()?.showInstallCircle?.set(false) else musicProgress.get()?.showInstallCircle?.set(false)
}
else -> sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999), this)
}
stopSelf()
return START_NOT_STICKY
@ -47,4 +49,4 @@ class AppInstallerService: Service() {
const val TAG = "VMInstall"
}
}
}

View file

@ -5,14 +5,10 @@ import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import android.util.Log
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.ui.fragments.HomeFragment
import kotlinx.coroutines.*
import com.vanced.manager.utils.AppUtils.sendRefresh
class AppUninstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val pkgName = intent?.getStringExtra("pkg")
when (intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
@ -25,20 +21,14 @@ class AppUninstallerService: Service() {
} catch (e: Exception) {
}
}
//Delay broadcast until activity (and fragment) show up on screen
//Delay broadcast until activity (and fragment) show up on the screen
PackageInstaller.STATUS_SUCCESS -> {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
localBroadcastManager.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
Log.d("VMpm", "Successfully uninstalled $pkgName")
}
sendRefresh(this)
Log.d("VMpm", "Successfully uninstalled $pkgName")
}
PackageInstaller.STATUS_FAILURE -> {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
localBroadcastManager.sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
Log.d("VMpm", "Failed to uninstall $pkgName")
}
sendRefresh(this)
Log.d("VMpm", "Failed to uninstall $pkgName")
}
}
stopSelf()
@ -49,4 +39,4 @@ class AppUninstallerService: Service() {
return null
}
}
}

View file

@ -1,131 +0,0 @@
package com.vanced.manager.core.installer
import android.app.Service
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.annotation.Nullable
import androidx.annotation.WorkerThread
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.topjohnwu.superuser.Shell
import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.FileInfo
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
import java.util.regex.Pattern
import kotlin.collections.ArrayList
class RootSplitInstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Shell.getShell {
CoroutineScope(Dispatchers.IO).launch {
val apkFilesPath = getExternalFilesDir("apks")?.path
val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) }
if (fileInfoList != null) {
installSplitApkFiles(fileInfoList)
}
}
}
stopSelf()
return START_NOT_STICKY
}
@WorkerThread
private fun installSplitApkFiles(apkFiles: ArrayList<FileInfo>) {
var sessionId: Int?
Log.d("AppLog", "installing split apk files:$apkFiles")
run {
val sessionIdResult = Shell.su("pm install-create -r -t").exec().out
val sessionIdPattern = Pattern.compile("(\\d+)")
val sessionIdMatcher = sessionIdPattern.matcher(sessionIdResult[0])
sessionIdMatcher.find()
sessionId = Integer.parseInt(sessionIdMatcher.group(1)!!)
}
apkFiles.forEach { apkFile ->
Log.d("AppLog", "installing APK : ${apkFile.name} ${apkFile.fileSize} ")
val command = arrayOf("su", "-c", "pm", "install-write", "-S", "${apkFile.fileSize}", "$sessionId", apkFile.name)
val process: Process = Runtime.getRuntime().exec(command)
val inputPipe = apkFile.getInputStream()
try {
process.outputStream.use { outputStream -> inputPipe.copyTo(outputStream) }
} catch (e: Exception) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
process.destroyForcibly()
else
process.destroy()
throw RuntimeException(e)
}
process.waitFor()
}
Log.d("AppLog", "committing...")
val installResult = Shell.su("pm install-commit $sessionId").exec()
if (installResult.isSuccess) {
with(localBroadcastManager) {
sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
sendBroadcast(Intent(HomeFragment.VANCED_INSTALLED))
}
} else
sendFailure(installResult.out, this)
}
private fun SimpleDateFormat.tryParse(str: String) = try {
parse(str) != null
} catch (e: Exception) {
false
}
@WorkerThread
private fun getFileInfoList(splitApkPath: String): ArrayList<FileInfo> {
val parentFile = File(splitApkPath)
val result = ArrayList<FileInfo>()
if (parentFile.exists() && parentFile.canRead()) {
val listFiles = parentFile.listFiles() ?: return ArrayList()
for (file in listFiles)
result.add(FileInfo(file.name, file.length(), file))
return result
}
val longLines = Shell.su("ls -l $splitApkPath").exec().out
val pattern = Pattern.compile(" +")
val formatter = SimpleDateFormat("HH:mm", Locale.getDefault())
longLinesLoop@ for (line in longLines) {
val matcher = pattern.matcher(line)
for (i in 0 until 4)
if (!matcher.find())
continue@longLinesLoop
val startSizeStr = matcher.end()
matcher.find()
val endSizeStr = matcher.start()
val fileSizeStr = line.substring(startSizeStr, endSizeStr)
while (true) {
val testTimeStr: String =
line.substring(matcher.end(), line.indexOf(' ', matcher.end()))
if (formatter.tryParse(testTimeStr)) {
//found time, so apk is next
val fileName = line.substring(line.indexOf(' ', matcher.end()) + 1)
if (fileName.endsWith("apk"))
result.add(FileInfo(fileName, fileSizeStr.toLong(), File(splitApkPath, fileName)))
break
}
matcher.find()
}
}
return result
}
@Nullable
override fun onBind(intent: Intent?): IBinder? {
return null
}
}

View file

@ -1,124 +0,0 @@
package com.vanced.manager.core.installer
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import android.util.Log
import java.io.*
class SplitInstaller: Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
installSplitApk(this)
return START_NOT_STICKY
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
private fun installSplitApk(context: Context): Int {
val apkFolderPath = context.getExternalFilesDir("apks")?.path + "/"
val nameSizeMap = HashMap<String, Long>()
var totalSize: Long = 0
var sessionId = 0
val folder = File(apkFolderPath)
val listOfFiles = folder.listFiles()
try {
for (listOfFile in listOfFiles!!) {
if (listOfFile.isFile) {
Log.d("AppLog", "installApk: " + listOfFile.name)
nameSizeMap[listOfFile.name] = listOfFile.length()
totalSize += listOfFile.length()
}
}
} catch (e: Exception) {
e.printStackTrace()
return -1
}
val installParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
installParams.setSize(totalSize)
try {
sessionId = context.packageManager.packageInstaller.createSession(installParams)
Log.d("AppLog","Success: created install session [$sessionId]")
for ((key, value) in nameSizeMap) {
doWriteSession(sessionId, apkFolderPath + key, value, key, context)
}
doCommitSession(sessionId, context)
Log.d("AppLog","Success")
} catch (e: IOException) {
e.printStackTrace()
}
return sessionId
}
private fun doWriteSession(sessionId: Int, inPath: String?, sizeBytes: Long, splitName: String, context: Context): Int {
var inPathToUse = inPath
var sizeBytesToUse = sizeBytes
if ("-" == inPathToUse) {
inPathToUse = null
} else if (inPathToUse != null) {
val file = File(inPathToUse)
if (file.isFile)
sizeBytesToUse = file.length()
}
var session: PackageInstaller.Session? = null
var inputStream: InputStream? = null
var out: OutputStream? = null
try {
session = context.packageManager.packageInstaller.openSession(sessionId)
if (inPathToUse != null) {
inputStream = FileInputStream(inPathToUse)
}
out = session.openWrite(splitName, 0, sizeBytesToUse)
var total = 0
val buffer = ByteArray(65536)
var c: Int
while (true) {
c = inputStream!!.read(buffer)
if (c == -1)
break
total += c
out.write(buffer, 0, c)
}
session.fsync(out)
Log.d("AppLog", "Success: streamed $total bytes")
return PackageInstaller.STATUS_SUCCESS
} catch (e: IOException) {
Log.e("AppLog", "Error: failed to write; " + e.message)
return PackageInstaller.STATUS_FAILURE
} finally {
try {
out?.close()
inputStream?.close()
session?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
private fun doCommitSession(sessionId: Int, context: Context) {
var session: PackageInstaller.Session? = null
try {
try {
session = context.packageManager.packageInstaller.openSession(sessionId)
val callbackIntent = Intent(context.applicationContext, SplitInstallerService::class.java)
val pendingIntent = PendingIntent.getService(context.applicationContext, 0, callbackIntent, 0)
session.commit(pendingIntent.intentSender)
session.close()
Log.d("AppLog", "install request sent")
Log.d("AppLog", "doCommitSession: " + context.packageManager.packageInstaller.mySessions)
Log.d("AppLog", "doCommitSession: after session commit ")
} catch (e: IOException) {
e.printStackTrace()
}
} finally {
session!!.close()
}
}
}

View file

@ -5,18 +5,16 @@ import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.IBinder
import android.util.Log
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.ui.fragments.HomeFragment
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.vancedProgress
import com.vanced.manager.utils.AppUtils.mutableInstall
import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefresh
class SplitInstallerService: Service() {
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(this) }
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
localBroadcastManager.sendBroadcast(Intent(HomeFragment.VANCED_INSTALLING))
Log.d(TAG, "Requesting user confirmation for installation")
val confirmationIntent = intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
@ -27,13 +25,14 @@ class SplitInstallerService: Service() {
}
PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installation succeed")
with(localBroadcastManager) {
sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
sendBroadcast(Intent(HomeFragment.VANCED_INSTALLED))
}
vancedProgress.get()?.showInstallCircle?.set(false)
mutableInstall.postValue(false)
sendRefresh(this)
}
else -> {
sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999), this)
vancedProgress.get()?.showInstallCircle?.set(false)
}
else -> sendFailure(intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999), this)
}
stopSelf()
return START_NOT_STICKY
@ -47,4 +46,4 @@ class SplitInstallerService: Service() {
const val TAG = "VMInstall"
}
}
}

View file

@ -0,0 +1,93 @@
package com.vanced.manager.model
import android.content.Context
import android.graphics.drawable.Drawable
import android.os.Build
import androidx.core.content.ContextCompat
import androidx.databinding.ObservableBoolean
import androidx.databinding.ObservableField
import androidx.databinding.ObservableInt
import com.beust.klaxon.JsonObject
import com.vanced.manager.R
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
open class DataModel(
private val jsonObject: JsonObject?,
app: String,
private val context: Context
) {
private val appPkg =
when (app) {
"vanced" -> "com.vanced.android.youtube"
"vancedRoot" -> "com.google.android.youtube"
"microg" -> "com.mgoogle.android.gms"
else -> "com.vanced.android.apps.youtube.music"
}
private val versionCode = ObservableInt()
private val installedVersionCode = ObservableInt()
val isAppInstalled = ObservableBoolean()
val versionName = ObservableField<String>()
val installedVersionName = ObservableField<String>()
val buttonTxt = ObservableField<String>()
val buttonIcon = ObservableField<Drawable>()
val changelog = ObservableField<String>()
fun fetch() = CoroutineScope(Dispatchers.IO).launch {
isAppInstalled.set(isPackageInstalled(appPkg, context.packageManager))
versionName.set(jsonObject?.string("version")?.removeSuffix("-vanced") ?: context.getString(R.string.unavailable))
installedVersionName.set(getPkgVersionName(isAppInstalled.get(), appPkg))
versionCode.set(jsonObject?.int("versionCode") ?: 0)
installedVersionCode.set(getPkgVersionCode(isAppInstalled.get(), appPkg))
buttonTxt.set(compareInt(installedVersionCode.get(), versionCode.get()))
buttonIcon.set(compareIntDrawable(installedVersionCode.get(), versionCode.get()))
changelog.set(jsonObject?.string("changelog") ?: context.getString(R.string.unavailable))
}
init {
fetch()
}
private fun getPkgVersionName(toCheck: Boolean, pkg: String): String {
return if (toCheck) {
context.packageManager.getPackageInfo(pkg, 0).versionName.removeSuffix("-vanced")
} else {
context.getString(R.string.unavailable)
}
}
@Suppress("DEPRECATION")
private fun getPkgVersionCode(toCheck: Boolean, pkg: String): Int {
return if (toCheck) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
context.packageManager.getPackageInfo(pkg, 0).longVersionCode.and(0xFFFFFFFF).toInt()
else
context.packageManager.getPackageInfo(pkg, 0).versionCode
} else 0
}
private fun compareInt(int1: Int, int2: Int): String {
return when {
int1 == 0 -> context.getString(R.string.install)
int2 > int1 -> context.getString(R.string.update)
int2 == int1 || int1 > int2 -> context.getString(R.string.button_reinstall)
else -> context.getString(R.string.install)
}
}
private fun compareIntDrawable(int1: Int, int2: Int): Drawable? {
return when {
int1 == 0 -> ContextCompat.getDrawable(context, R.drawable.ic_download)
int2 > int1 -> ContextCompat.getDrawable(context, R.drawable.ic_update)
int2 == int1 -> ContextCompat.getDrawable(context, R.drawable.ic_done)
else -> ContextCompat.getDrawable(context, R.drawable.ic_download)
}
}
}

View file

@ -0,0 +1,23 @@
package com.vanced.manager.model
import androidx.databinding.ObservableBoolean
import androidx.databinding.ObservableField
import androidx.databinding.ObservableInt
open class ProgressModel {
val downloadProgress = ObservableInt()
val downloadingFile = ObservableField<String>()
val showInstallCircle = ObservableBoolean()
val showDownloadBar = ObservableBoolean()
var currentDownload: Int = 0
init {
downloadProgress.set(0)
downloadingFile.set("")
showInstallCircle.set(false)
showDownloadBar.set(false)
}
}

View file

@ -1,25 +1,30 @@
package com.vanced.manager.ui
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.navigation.NavDestination
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupWithNavController
import androidx.preference.PreferenceManager
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.crowdin.platform.Crowdin
import com.crowdin.platform.LoadingStateListener
import com.google.firebase.messaging.FirebaseMessaging
import com.vanced.manager.R
import com.vanced.manager.databinding.ActivityMainBinding
import com.vanced.manager.ui.dialogs.DialogContainer
import com.vanced.manager.ui.fragments.HomeFragmentDirections
import com.vanced.manager.ui.fragments.SettingsFragmentDirections
import com.vanced.manager.ui.fragments.UpdateCheckFragment
import com.vanced.manager.utils.AppUtils.installing
import com.vanced.manager.utils.InternetTools
import com.vanced.manager.utils.LanguageContextWrapper
import com.vanced.manager.utils.PackageHelper
import com.vanced.manager.utils.ThemeHelper.setFinalTheme
import kotlinx.coroutines.CoroutineScope
@ -28,8 +33,8 @@ import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val navHost by lazy { findNavController(R.id.bottom_nav_host) }
lateinit var binding: ActivityMainBinding
private val navHost by lazy { findNavController(R.id.nav_host) }
private val loadingObserver = object : LoadingStateListener {
val tag = "VMLocalisation"
@ -51,10 +56,8 @@ class MainActivity : AppCompatActivity() {
with(binding) {
lifecycleOwner = this@MainActivity
setSupportActionBar(homeToolbar)
val appBarConfiguration = AppBarConfiguration(navHost.graph)
homeToolbar.setupWithNavController(navHost, appBarConfiguration)
homeToolbar.setupWithNavController(this@MainActivity.navHost, AppBarConfiguration(this@MainActivity.navHost.graph))
}
navHost.addOnDestinationChangedListener { _, currFrag: NavDestination, _ ->
setDisplayHomeAsUpEnabled(currFrag.id != R.id.home_fragment)
}
@ -63,6 +66,15 @@ class MainActivity : AppCompatActivity() {
}
override fun onBackPressed() {
if (!navHost.popBackStack())
finish()
}
private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) {
binding.homeToolbar.navigationIcon = if (isNeeded) ContextCompat.getDrawable(this, R.drawable.ic_keyboard_backspace_black_24dp) else null
}
override fun onPause() {
super.onPause()
Crowdin.unregisterDataLoadingObserver(loadingObserver)
@ -75,24 +87,24 @@ class MainActivity : AppCompatActivity() {
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (installing) {
if (installing.value!!)
return false
}
when (item.itemId) {
android.R.id.home -> {
onBackPressed()
onBackPressedDispatcher.onBackPressed()
return true
}
R.id.toolbar_about -> {
navHost.navigate(R.id.toAboutFragment)
navHost.navigate(HomeFragmentDirections.toAboutFragment())
return true
}
R.id.toolbar_settings -> {
navHost.navigate(R.id.action_settingsFragment)
navHost.navigate(HomeFragmentDirections.toSettingsFragment())
return true
}
R.id.dev_settings -> {
navHost.navigate(R.id.toDevSettingsFragment)
navHost.navigate(SettingsFragmentDirections.toDevSettingsFragment())
return true
}
else -> super.onOptionsItemSelected(item)
@ -101,18 +113,14 @@ class MainActivity : AppCompatActivity() {
return false
}
private fun setDisplayHomeAsUpEnabled(isNeeded: Boolean) {
binding.homeToolbar.navigationIcon = if (isNeeded) getDrawable(R.drawable.ic_keyboard_backspace_black_24dp) else null
}
override fun attachBaseContext(newBase: Context) {
super.attachBaseContext(Crowdin.wrapContext(newBase))
super.attachBaseContext(LanguageContextWrapper.wrap(newBase))
}
private fun initDialogs() {
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val prefs = getDefaultSharedPreferences(this)
val variant = prefs.getString("vanced_variant", "nonroot")
val showRootDialog = prefs.getBoolean("show_root_dialog", true)
prefs.getBoolean("show_root_dialog", true)
when {
prefs.getBoolean("firstStart", true) -> {
@ -124,9 +132,6 @@ class MainActivity : AppCompatActivity() {
}
!prefs.getBoolean("statement", true) -> DialogContainer.statementFalse(this)
variant == "root" -> {
if (showRootDialog)
DialogContainer.showRootDialog(this)
if (PackageHelper.getPackageVersionName(
"com.google.android.youtube",
packageManager

View file

@ -6,8 +6,8 @@ import androidx.constraintlayout.widget.ConstraintLayout
open class SlidingConstraintLayout : ConstraintLayout {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(
context,
attrs
)
@ -29,4 +29,4 @@ open class SlidingConstraintLayout : ConstraintLayout {
(1).toFloat()
x = newWidth
}
}
}

View file

@ -0,0 +1,33 @@
package com.vanced.manager.ui.core
import android.content.Context
import android.util.AttributeSet
import android.widget.LinearLayout
open class SlidingWidthLinearLayout: LinearLayout {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(
context,
attrs
)
var xFraction: Float
get() {
val width = width
return if (width != 0)
x / getWidth()
else
x
}
set(xFraction) {
val width = width
val newWidth =
if (width > 0)
xFraction * width
else
(1).toFloat()
x = newWidth
}
}

View file

@ -8,10 +8,10 @@ import androidx.core.content.ContextCompat.startActivity
import androidx.preference.PreferenceManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.vanced.manager.R
import com.vanced.manager.core.downloader.VancedDownloadService
import com.vanced.manager.core.installer.SplitInstaller
import com.vanced.manager.core.downloader.VancedDownloader.downloadVanced
import com.vanced.manager.utils.InternetTools.openUrl
import com.vanced.manager.utils.MiuiHelper
import com.vanced.manager.utils.PackageHelper.installVanced
object DialogContainer {
@ -63,38 +63,16 @@ object DialogContainer {
setTitle("")
setMessage("")
setNegativeButton("") { dialog, _ ->
context.startService(Intent(context, VancedDownloadService::class.java))
downloadVanced(context)
dialog.dismiss()
}
setPositiveButton(context.getString(R.string.button_reinstall)) { dialog, _ ->
context.startService(Intent(context, SplitInstaller::class.java))
installVanced(context)
dialog.dismiss()
}
}
}
fun showRootDialog(activity: Activity) {
MaterialAlertDialogBuilder(activity).apply {
setTitle(activity.getString(R.string.hold_on))
setMessage(activity.getString(R.string.disable_signature))
setNeutralButton(activity.getString(R.string.button_dismiss)) { dialog, _ ->
dialog.dismiss()
}
setPositiveButton(activity.getString(R.string.guide)) { _, _ ->
openUrl(
"https://lmgtfy.com/?q=andnixsh+apk+verification+disable",
R.color.Twitter,
activity
)
}
setCancelable(false)
create()
show()
}
PreferenceManager.getDefaultSharedPreferences(activity).edit()
.putBoolean("show_root_dialog", false).apply()
}
//Easter Egg
fun statementFalse(context: Context) {
MaterialAlertDialogBuilder(context).apply {
@ -143,21 +121,34 @@ object DialogContainer {
}
}
fun launchVanced(activity: Activity) {
fun launchVanced(context: Context) {
val intent = Intent()
intent.component =
if (PreferenceManager.getDefaultSharedPreferences(activity).getString("vanced_variant", "nonroot") == "root")
if (PreferenceManager.getDefaultSharedPreferences(context).getString("vanced_variant", "nonroot") == "root")
ComponentName("com.google.android.youtube", "com.google.android.youtube.HomeActivity")
else
ComponentName("com.vanced.android.youtube", "com.google.android.youtube.HomeActivity")
MaterialAlertDialogBuilder(context).apply {
setTitle(context.getString(R.string.success))
setMessage(context.getString(R.string.vanced_installed))
setPositiveButton(context.getString(R.string.launch)) { _, _ ->
startActivity(context, intent, null)
}
setNegativeButton(context.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
create()
show()
}
}
fun launchMusic(activity: Activity) {
val intent = Intent()
intent.component = ComponentName("com.vanced.android.youtube.music", "com.vanced.android.youtube.music.MusicActivity")
MaterialAlertDialogBuilder(activity).apply {
setTitle(activity.getString(R.string.success))
setMessage(activity.getString(R.string.vanced_installed))
setMessage(activity.getString(R.string.music_installed))
setPositiveButton(activity.getString(R.string.launch)) { _, _ ->
run {
startActivity(activity, intent, null)
activity.finish()
}
startActivity(activity, intent, null)
}
setNegativeButton(activity.getString(R.string.close)) { dialog, _ -> dialog.dismiss() }
create()
@ -165,4 +156,4 @@ object DialogContainer {
}
}
}
}

View file

@ -0,0 +1,23 @@
package com.vanced.manager.ui.events
open class Event<out T>(private val content: T) {
private var hasBeenHandled = false
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}

View file

@ -18,6 +18,7 @@ import com.vanced.manager.ui.viewmodels.AboutViewModel
class AboutFragment : Fragment() {
private lateinit var binding: FragmentAboutBinding
private val viewModel: AboutViewModel by viewModels()
private var count = 0
private var startMillSec: Long = 0
@ -27,6 +28,7 @@ class AboutFragment : Fragment() {
): View? {
requireActivity().title = getString(R.string.title_about)
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_about, container, false)
binding.viewModel = viewModel
return binding.root
}
@ -35,9 +37,6 @@ class AboutFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val viewModel: AboutViewModel by viewModels()
binding.viewModel = viewModel
view.setOnTouchListener { _, event: MotionEvent ->
val eventAction = event.action

View file

@ -19,8 +19,8 @@ class ChosenPreferenceDialogFragment : DialogFragment() {
private lateinit var binding: FragmentChosenPreferencesBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
dialog?.window?.apply { setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) }
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_chosen_preferences, container, false)
@ -40,6 +40,9 @@ class ChosenPreferenceDialogFragment : DialogFragment() {
newPrefs.add(loc.getDisplayLanguage(loc).capitalize(Locale.ROOT))
}
}
binding.chosenTheme.text = requireActivity().getString(R.string.chosen_theme, prefs.getString("theme", "dark")?.capitalize(Locale.ROOT))
binding.chosenLang.text = requireActivity().getString(R.string.chosen_lang, newPrefs.joinToString())

View file

@ -45,14 +45,16 @@ class DevSettingsFragment: PreferenceFragmentCompat() {
true
}
val archPref: Preference? = findPreference("device_arch")
val supportedAbis: Array<String> = Build.SUPPORTED_ABIS
if (supportedAbis.contains("arm64-v8a") || supportedAbis.contains("x86_64")) {
archPref?.summary = "64bit"
} else {
archPref?.summary = "32bit"
}
findPreference<Preference>("device_arch")?.summary =
if (supportedAbis.contains("arm64-v8a") || supportedAbis.contains("x86_64")) {
"64bit"
} else {
"32bit"
}
findPreference<Preference>("device_os")?.summary = "${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})"
val forceUpdate: Preference? = findPreference("force_update")
forceUpdate?.setOnPreferenceClickListener {

View file

@ -1,10 +1,12 @@
package com.vanced.manager.ui.fragments
import android.content.*
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.util.Log
import android.view.*
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.animation.AnimationUtils
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
@ -12,28 +14,42 @@ import androidx.fragment.app.viewModels
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.navigation.findNavController
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.topjohnwu.superuser.Shell
import com.vanced.manager.R
import com.vanced.manager.adapter.*
import com.vanced.manager.core.downloader.MicrogDownloadService
import com.vanced.manager.core.downloader.VancedDownloadService
import com.vanced.manager.adapter.VariantAdapter
import com.vanced.manager.databinding.FragmentHomeBinding
import com.vanced.manager.ui.MainActivity
import com.vanced.manager.ui.dialogs.DialogContainer.installAlertBuilder
import com.vanced.manager.ui.dialogs.DialogContainer.launchVanced
import com.vanced.manager.ui.viewmodels.HomeViewModel
import com.vanced.manager.utils.AppUtils.installing
import com.vanced.manager.utils.PackageHelper
import com.vanced.manager.utils.AppUtils
class HomeFragment : Fragment(), View.OnClickListener {
open class HomeFragment : Fragment() {
private lateinit var binding: FragmentHomeBinding
private var isExpanded: Boolean = false
private val viewModel: HomeViewModel by viewModels()
private val localBroadcastManager by lazy { LocalBroadcastManager.getInstance(requireActivity()) }
private val tabListener = object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
if (tab.position == 1 && !Shell.rootAccess()) {
Toast.makeText(requireActivity(), getString(R.string.root_not_granted), Toast.LENGTH_SHORT).show()
}
val variant = if (tab.position == 1) "root" else "nonroot"
getDefaultSharedPreferences(requireActivity()).edit().putString("vanced_variant", variant).apply()
}
override fun onTabUnselected(tab: TabLayout.Tab) {
return
}
override fun onTabReselected(tab: TabLayout.Tab) {
return
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
@ -46,222 +62,75 @@ class HomeFragment : Fragment(), View.OnClickListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.viewModel = viewModel
val variantPref = getDefaultSharedPreferences(requireActivity()).getString("vanced_variant", "nonroot")
viewModel.navigateDestination.observe(viewLifecycleOwner, {
val content = it.getContentIfNotHandled()
if(content != null){
view.findNavController().navigate(content)
}
})
with(binding) {
rootSwitch.setOnClickListener(this@HomeFragment)
nonrootSwitch.setOnClickListener(this@HomeFragment)
includeVancedLayout.vancedInstallbtn.setOnClickListener(this@HomeFragment)
includeVancedLayout.vancedUninstallbtn.setOnClickListener(this@HomeFragment)
includeMicrogLayout.microgInstallbtn.setOnClickListener(this@HomeFragment)
includeMicrogLayout.microgUninstallbtn.setOnClickListener(this@HomeFragment)
includeChangelogsLayout.changelogButton.setOnClickListener(this@HomeFragment)
}
binding.includeVancedLayout.vancedCard.setOnLongClickListener {
versionToast("Vanced", viewModel.vancedInstalledVersion.get())
true
}
binding.includeMicrogLayout.microgCard.setOnLongClickListener {
versionToast("MicroG", viewModel.microgInstalledVersion.get())
true
}
with(binding.includeChangelogsLayout) {
viewpager.adapter = if (variantPref == "root") SectionPageRootAdapter(this@HomeFragment) else SectionPageAdapter(this@HomeFragment)
TabLayoutMediator(tablayout, viewpager) { tab, position ->
if (variantPref == "root")
when (position) {
0 -> tab.text = "Vanced"
1 -> tab.text = "Manager"
}
else
when (position) {
0 -> tab.text = "Vanced"
1 -> tab.text = "MicroG"
2 -> tab.text = "Manager"
}
mainViewpager.adapter = VariantAdapter(viewModel, requireActivity())
TabLayoutMediator(mainTablayout, mainViewpager) { tab, position ->
val variants = arrayOf("nonroot", "root")
tab.text = variants[position]
}.attach()
mainTablayout.getTabAt(if (getDefaultSharedPreferences(requireActivity()).getString("vanced_variant", "nonroot") == "root") 1 else 0)?.select()
}
AppUtils.installing.observe(viewLifecycleOwner, { value ->
if (value) hideTab() else showTab()
})
}
override fun onClick(v: View?) {
val prefs = requireActivity().getSharedPreferences("installPrefs", Context.MODE_PRIVATE)
val variant = getDefaultSharedPreferences(requireActivity()).getString("vanced_variant", "nonroot")
val vancedPkgName =
if (variant == "root") {
"com.google.android.youtube"
} else {
"com.vanced.android.youtube"
}
when (v?.id) {
R.id.vanced_installbtn -> {
if (!installing) {
if (!viewModel.fetching.get()!!) {
if (variant == "nonroot" && !viewModel.microgInstalled.get()!!) {
Snackbar.make(
binding.homeRefresh,
R.string.no_microg,
Snackbar.LENGTH_LONG
)
.setAction(R.string.install) {
requireActivity().startService(
Intent(
requireActivity(),
MicrogDownloadService::class.java
)
)
}.show()
} else {
if (prefs?.getBoolean("valuesModified", false)!!) {
requireActivity().startService(
Intent(
requireActivity(),
VancedDownloadService::class.java
)
)
} else {
view?.findNavController()?.navigate(R.id.toInstallThemeFragment)
}
}
}
} else
Toast.makeText(requireActivity(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
}
R.id.microg_installbtn -> {
if (!installing)
requireActivity().startService(Intent(requireActivity(), MicrogDownloadService::class.java))
else
Toast.makeText(requireActivity(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
}
R.id.microg_uninstallbtn -> PackageHelper.uninstallApk("com.mgoogle.android.gms", requireActivity())
R.id.vanced_uninstallbtn -> PackageHelper.uninstallApk(vancedPkgName, requireActivity())
R.id.nonroot_switch -> writeToVariantPref("nonroot", R.anim.slide_in_left, R.anim.slide_out_right)
R.id.root_switch ->
if (Shell.rootAccess()) {
writeToVariantPref("root", R.anim.slide_in_right, R.anim.slide_out_left)
} else {
writeToVariantPref("nonroot", R.anim.slide_in_left, R.anim.slide_out_right)
Toast.makeText(requireActivity(), activity?.getString(R.string.root_not_granted), Toast.LENGTH_SHORT).show()
}
R.id.changelog_button -> cardExpandCollapse()
}
}
private fun writeToVariantPref(variant: String, animIn: Int, animOut: Int) {
val prefs = getDefaultSharedPreferences(activity)
if (prefs.getString("vanced_variant", "nonroot") != variant) {
prefs.edit().putString("vanced_variant", variant).apply()
startActivity(Intent(activity, MainActivity::class.java))
activity?.overridePendingTransition(animIn, animOut)
activity?.finish()
} else
Log.d("VMVariant", "$variant is already selected")
}
private fun versionToast(name: String, app: String?) {
val clip = requireActivity().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clip.setPrimaryClip(ClipData.newPlainText(name, app))
Toast.makeText(activity, getString(R.string.version_toast, name), Toast.LENGTH_LONG).show()
}
private fun cardExpandCollapse() {
with(binding.includeChangelogsLayout) {
viewpager.visibility = if (isExpanded) View.GONE else View.VISIBLE
tablayout.visibility = if (isExpanded) View.GONE else View.VISIBLE
changelogButton.animate().apply {
rotation(if (isExpanded) 0F else 180F)
interpolator = AccelerateDecelerateInterpolator()
}
isExpanded = !isExpanded
}
}
override fun onPause() {
localBroadcastManager.unregisterReceiver(broadcastReceiver)
super.onPause()
localBroadcastManager.unregisterReceiver(broadcastReceiver)
binding.mainTablayout.removeOnTabSelectedListener(tabListener)
}
override fun onResume() {
super.onResume()
registerReceivers()
binding.mainTablayout.addOnTabSelectedListener(tabListener)
}
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
VANCED_DOWNLOADING -> {
with(binding.includeVancedLayout) {
vancedDownloading.visibility = View.VISIBLE
vancedDownloading.progress = intent.getIntExtra("progress", 0)
vancedDownloadingTxt.visibility = View.VISIBLE
vancedDownloadingTxt.text = requireActivity().getString(R.string.downloading_file, intent.getStringExtra("file"))
}
}
MICROG_DOWNLOADING -> {
with(binding.includeMicrogLayout) {
microgDownloading.visibility = View.VISIBLE
microgDownloading.progress = intent.getIntExtra("progress", 0)
microgDownloadingTxt.visibility = View.VISIBLE
microgDownloadingTxt.text = requireActivity().getString(R.string.downloading_file, "microg.apk")
}
}
MICROG_INSTALLING -> {
with (binding.includeMicrogLayout) {
microgDownloading.visibility = View.GONE
microgDownloadingTxt.visibility = View.GONE
microgInstalling.visibility = View.VISIBLE
}
}
VANCED_INSTALLING -> {
with (binding.includeVancedLayout) {
vancedDownloading.visibility = View.GONE
vancedDownloadingTxt.visibility = View.GONE
vancedInstalling.visibility = View.VISIBLE
}
}
VANCED_INSTALLED -> {
binding.includeVancedLayout.vancedInstalling.visibility = View.GONE
launchVanced(requireActivity())
installing = false
}
MICROG_INSTALLED -> {
binding.includeMicrogLayout.microgInstalling.visibility = View.GONE
installing = false
}
INSTALL_FAILED -> {
with(binding) {
includeMicrogLayout.microgInstalling.visibility = View.GONE
includeVancedLayout.vancedInstalling.visibility = View.GONE
}
installAlertBuilder(intent.getStringExtra("errorMsg") as String, requireActivity())
installing = false
}
REFRESH_HOME -> {
Log.d("VMRefresh", "Refreshing home page")
viewModel.fetchData()
}
INSTALL_FAILED -> installAlertBuilder(intent.getStringExtra("errorMsg") as String, requireActivity())
REFRESH_HOME -> viewModel.fetchData()
}
}
}
private fun hideTab() {
val tabHide = AnimationUtils.loadAnimation(requireActivity(), R.anim.tablayout_exit)
with(binding) {
if (mainTablayout.visibility != View.GONE) {
mainTablayout.startAnimation(tabHide)
mainTablayout.visibility = View.GONE
}
mainViewpager.isUserInputEnabled = false
}
}
private fun showTab() {
val tabShow = AnimationUtils.loadAnimation(requireActivity(), R.anim.tablayout_enter)
with(binding) {
if (mainTablayout.visibility != View.VISIBLE) {
mainTablayout.visibility = View.VISIBLE
mainTablayout.startAnimation(tabShow)
}
mainViewpager.isUserInputEnabled = true
}
}
private fun registerReceivers() {
val intentFilter = IntentFilter()
intentFilter.addAction(VANCED_DOWNLOADING)
intentFilter.addAction(MICROG_DOWNLOADING)
intentFilter.addAction(VANCED_INSTALLING)
intentFilter.addAction(MICROG_INSTALLING)
intentFilter.addAction(VANCED_INSTALLED)
intentFilter.addAction(MICROG_INSTALLED)
intentFilter.addAction(REFRESH_HOME)
intentFilter.addAction(INSTALL_FAILED)
intentFilter.addAction(REFRESH_HOME)
localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter)
}
@ -270,13 +139,7 @@ class HomeFragment : Fragment(), View.OnClickListener {
super.onCreateOptionsMenu(menu, inflater)
}
companion object {
const val VANCED_DOWNLOADING = "vanced_downloading"
const val MICROG_DOWNLOADING = "microg_downloading"
const val VANCED_INSTALLING = "vanced_installing"
const val MICROG_INSTALLING = "microg_installing"
const val VANCED_INSTALLED = "vanced_installed"
const val MICROG_INSTALLED = "microg_installed"
companion object {
const val INSTALL_FAILED = "install_failed"
const val REFRESH_HOME = "refresh_home"
}

View file

@ -1,31 +0,0 @@
package com.vanced.manager.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class ManagerChangelogFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_manager_changelog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
CoroutineScope(Dispatchers.Main).launch {
val changelog = InternetTools.getObjectFromJson("https://x1nto.github.io/VancedFiles/manager.json", "changelog")
view.findViewById<TextView>(R.id.manager_changelog).text = changelog
}
}
}

View file

@ -1,32 +0,0 @@
package com.vanced.manager.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class MicrogChangelogFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_microg_changelog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
CoroutineScope(Dispatchers.Main).launch {
val baseUrl = PreferenceManager.getDefaultSharedPreferences(activity).getString("install_url", InternetTools.baseUrl)
view.findViewById<TextView>(R.id.microg_changelog).text = InternetTools.getObjectFromJson("$baseUrl/microg.json", "changelog")
}
}
}

View file

@ -5,8 +5,14 @@ import android.view.Menu
import android.view.MenuInflater
import android.widget.Toast
import androidx.preference.*
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.perf.FirebasePerformance
import com.vanced.manager.BuildConfig.MANAGER_LANGUAGES
import com.vanced.manager.BuildConfig.MANAGER_LANGUAGE_NAMES
import com.vanced.manager.R
import com.vanced.manager.utils.LanguageHelper.getLanguageFormat
import java.io.File
class SettingsFragment : PreferenceFragmentCompat() {
@ -46,6 +52,13 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
}
findPreference<SwitchPreference>("firebase_analytics")?.setOnPreferenceChangeListener { _, newValue ->
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(newValue as Boolean)
FirebasePerformance.getInstance().isPerformanceCollectionEnabled = newValue
FirebaseAnalytics.getInstance(requireActivity()).setAnalyticsCollectionEnabled(newValue)
true
}
val themePref = preferenceScreen.sharedPreferences.getString("theme_mode", "Follow System")
findPreference<ListPreference>("theme_mode")?.apply {
summary = when (themePref) {
@ -82,6 +95,21 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
}
val langPref = preferenceScreen.sharedPreferences.getString("manager_lang", "System Default")
preferenceScreen.findPreference<ListPreference>("manager_lang")?.apply {
summary = langPref?.let { getLanguageFormat(requireActivity(), it) }
entries = arrayOf(getString(R.string.system_default)) + MANAGER_LANGUAGE_NAMES
entryValues = arrayOf("System Default") + MANAGER_LANGUAGES
setOnPreferenceChangeListener { _, newValue ->
if (langPref != newValue) {
requireActivity().recreate()
return@setOnPreferenceChangeListener true
}
false
}
}
findPreference<Preference>("vanced_chosen_modes")?.setOnPreferenceClickListener {
ChosenPreferenceDialogFragment().show(childFragmentManager.beginTransaction(), "Chosen Preferences")
true

View file

@ -45,6 +45,8 @@ class UpdateCheckFragment : DialogFragment() {
checkUpdates()
view.findViewById<Button>(R.id.update_center_dismiss).setOnClickListener { dismiss() }
view.findViewById<MaterialButton>(R.id.update_center_recheck).setOnClickListener{ checkUpdates() }
downLoadingState(false)
}
/*
@ -74,6 +76,9 @@ class UpdateCheckFragment : DialogFragment() {
launch {
val loadBar = view?.findViewById<ProgressBar>(R.id.update_center_progressbar)
val url = "https://github.com/YTVanced/VancedManager/releases/latest/download/manager.apk"
downLoadingState(true)
//downloadId = activity?.let { download(url, "apk", "manager.apk", it) }!!
PRDownloader.download(url, activity?.getExternalFilesDir("apk")?.path, "manager.apk")
.build()
@ -102,6 +107,7 @@ class UpdateCheckFragment : DialogFragment() {
override fun onError(error: com.downloader.Error?) {
Toast.makeText(activity, error.toString(), Toast.LENGTH_SHORT).show()
downLoadingState(false)
Log.e("VMUpgrade", error.toString())
}
@ -110,6 +116,17 @@ class UpdateCheckFragment : DialogFragment() {
}
}
private fun downLoadingState(isDownloading: Boolean) {
if (isDownloading) {
dialog?.setCancelable(false)
view?.findViewById<MaterialButton>(R.id.update_center_update)?.isEnabled = false
}
else {
dialog?.setCancelable(true)
view?.findViewById<MaterialButton>(R.id.update_center_update)?.isEnabled = true
}
}
/*
private val receiver = object : BroadcastReceiver() {

View file

@ -1,35 +0,0 @@
package com.vanced.manager.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class VancedChangelogFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_vanced_changelog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
CoroutineScope(Dispatchers.Main).launch {
val vancedVersion = activity?.let { InternetTools.getJsonString("vanced.json", "version", it).replace('.', '_') }
val baseUrl = PreferenceManager.getDefaultSharedPreferences(activity).getString("install_url", InternetTools.baseUrl)
val changelog = InternetTools.getObjectFromJson("$baseUrl/changelog/$vancedVersion.json", "message")
view.findViewById<TextView>(R.id.vanced_changelog).text = changelog
}
}
}

View file

@ -1,7 +1,6 @@
package com.vanced.manager.ui.fragments
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@ -12,14 +11,14 @@ import android.widget.LinearLayout
import androidx.core.content.res.ResourcesCompat
import androidx.fragment.app.Fragment
import androidx.navigation.findNavController
import androidx.preference.PreferenceManager
import com.google.android.material.button.MaterialButton
import com.google.android.material.checkbox.MaterialCheckBox
import com.vanced.manager.R
import com.vanced.manager.core.downloader.VancedDownloadService
import com.vanced.manager.utils.InternetTools.baseUrl
import com.vanced.manager.utils.InternetTools.getArrayFromJson
import kotlinx.coroutines.*
import com.vanced.manager.core.App
import com.vanced.manager.core.downloader.VancedDownloader.downloadVanced
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.*
class VancedLanguageSelectionFragment : Fragment() {
@ -37,25 +36,9 @@ class VancedLanguageSelectionFragment : Fragment() {
@ExperimentalStdlibApi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val langcor = CoroutineScope(Dispatchers.IO).async {
langs = getArrayFromJson("${PreferenceManager.getDefaultSharedPreferences(requireActivity()).getString("install_url", baseUrl)}/vanced.json", "langs")
}
CoroutineScope(Dispatchers.Main).launch {
langcor.await()
if (!langs.contains("null")) {
langs.forEach { lang ->
val loc = Locale(lang)
val box: MaterialCheckBox = MaterialCheckBox(requireActivity()).apply {
tag = lang
text = loc.getDisplayLanguage(loc).capitalize(Locale.ROOT)
textSize = 18F
typeface = ResourcesCompat.getFont(requireActivity(), R.font.exo_bold)
}
view.findViewById<LinearLayout>(R.id.lang_button_ll)
.addView(box, MATCH_PARENT, WRAP_CONTENT)
}
}
}
val app = activity?.application as App
langs = app.vanced?.array<String>("langs")?.value ?: mutableListOf("null")
loadBoxes(view.findViewById(R.id.lang_button_ll))
view.findViewById<MaterialButton>(R.id.vanced_install_finish).setOnClickListener {
val chosenLangs = mutableListOf("en")
if (!langs.contains("null"))
@ -66,13 +49,34 @@ class VancedLanguageSelectionFragment : Fragment() {
}
with(requireActivity()) {
getSharedPreferences("installPrefs", Context.MODE_PRIVATE)?.edit()?.apply {
putString("lang", chosenLangs.joinToString())?.apply()
putBoolean("valuesModified", true).apply()
putString("lang", chosenLangs.joinToString())?.apply()
putBoolean("valuesModified", true).apply()
}
startService(Intent(this, VancedDownloadService::class.java))
downloadVanced(requireActivity())
}
view.findNavController().navigate(R.id.action_installTo_homeFragment)
}
}
@ExperimentalStdlibApi
private fun loadBoxes(ll: LinearLayout) {
CoroutineScope(Dispatchers.Main).launch {
if (this@VancedLanguageSelectionFragment::langs.isInitialized) {
if (!langs.contains("null")) {
langs.forEach { lang ->
val loc = Locale(lang)
val box: MaterialCheckBox = MaterialCheckBox(requireActivity()).apply {
tag = lang
text = loc.getDisplayLanguage(loc).capitalize(Locale.ROOT)
textSize = 18F
typeface = ResourcesCompat.getFont(requireActivity(), R.font.exo_bold)
}
ll.addView(box, MATCH_PARENT, WRAP_CONTENT)
}
}
} else
loadBoxes(ll)
}
}
}

View file

@ -6,7 +6,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.RadioButton
import android.widget.RadioGroup
import androidx.fragment.app.Fragment
import androidx.navigation.findNavController

View file

@ -1,29 +1,14 @@
package com.vanced.manager.ui.viewmodels
import android.app.Application
import android.content.Intent
import android.net.Uri
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import androidx.lifecycle.AndroidViewModel
import androidx.preference.PreferenceManager
import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools
class AboutViewModel(application: Application): AndroidViewModel(application) {
fun openUrl(Url: String) {
val customTabPrefs = PreferenceManager.getDefaultSharedPreferences(getApplication()).getBoolean("use_customtabs", true)
if (customTabPrefs) {
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(getApplication(), R.color.GitHub))
val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(getApplication(), Uri.parse(Url))
} else {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(Url))
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
ContextCompat.startActivity(getApplication(), intent, null)
}
fun openUrl(url: String) {
InternetTools.openUrl(url, R.color.GitHub, getApplication())
}
}

View file

@ -3,91 +3,62 @@ package com.vanced.manager.ui.viewmodels
import android.app.Application
import android.content.ActivityNotFoundException
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
import android.util.Log
import android.widget.Toast
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.startActivity
import androidx.databinding.ObservableBoolean
import androidx.databinding.ObservableField
import androidx.lifecycle.AndroidViewModel
import androidx.preference.PreferenceManager.getDefaultSharedPreferences
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.crowdin.platform.Crowdin
import com.downloader.PRDownloader
import com.downloader.Status
import com.vanced.manager.R
import com.vanced.manager.utils.InternetTools.getJsonInt
import com.vanced.manager.utils.InternetTools.getJsonString
import com.vanced.manager.utils.PackageHelper.isPackageInstalled
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import com.vanced.manager.core.App
import com.vanced.manager.core.downloader.MicrogDownloader.downloadMicrog
import com.vanced.manager.core.downloader.MusicDownloader.downloadMusic
import com.vanced.manager.core.downloader.VancedDownloader.downloadVanced
import com.vanced.manager.model.DataModel
import com.vanced.manager.model.ProgressModel
import com.vanced.manager.ui.events.Event
import com.vanced.manager.utils.AppUtils.installing
import com.vanced.manager.utils.InternetTools
import com.vanced.manager.utils.PackageHelper.uninstallApk
open class HomeViewModel(application: Application): AndroidViewModel(application) {
private val variant = getDefaultSharedPreferences(application).getString("vanced_variant", "nonroot")
val app = application
private val managerApp = application as App
private val vancedPkgName: String =
if (variant == "root") {
"com.google.android.youtube"
} else {
"com.vanced.android.youtube"
}
//val variant = getDefaultSharedPreferences(application).getString("vanced_variant", "nonroot")
private val pm = application.packageManager
val vanced = ObservableField<DataModel>()
val vancedRoot = ObservableField<DataModel>()
val microg = ObservableField<DataModel>()
val music = ObservableField<DataModel>()
val manager = ObservableField<DataModel>()
val fetching = ObservableBoolean()
private val vancedInstalledVersionCode = ObservableField<Int>()
private val microgInstalledVersionCode = ObservableField<Int>()
private var _navigateDestination = MutableLiveData<Event<Int>>()
private val vancedVersionCode = ObservableField<Int>()
private val microgVersionCode = ObservableField<Int>()
val navigateDestination : LiveData<Event<Int>> = _navigateDestination
//this is fucking retarded
val vancedInstallButtonTxt = ObservableField<String>()
val vancedInstallButtonIcon = ObservableField<Drawable>()
val microgInstalled = ObservableField<Boolean>()
val vancedInstalled = ObservableField<Boolean>()
val vancedInstalledVersion = ObservableField<String>()
val microgInstalledVersion = ObservableField<String>()
val vancedVersion = ObservableField<String>()
val microgVersion = ObservableField<String>()
val microgInstallButtonTxt = ObservableField<String>()
val microgInstallButtonIcon = ObservableField<Drawable>()
val nonrootModeSelected: Boolean = variant == "nonroot"
val fetching = ObservableField<Boolean>()
private val shouldBeDisabled = ObservableField<Boolean>()
//this too
fun fetchData() {
CoroutineScope(Dispatchers.IO).launch {
fetching.set(true)
try {
Crowdin.forceUpdate(getApplication())
} catch (e: Exception) {
Log.d("VMLocalisation", "Error: ", e)
}
vancedVersion.set(getJsonString("vanced.json", "version", getApplication()))
microgVersion.set(getJsonString("microg.json", "version", getApplication()))
microgInstalled.set(isPackageInstalled("com.mgoogle.android.gms", pm))
vancedInstalled.set(isPackageInstalled(vancedPkgName, pm))
vancedInstalledVersion.set(getPkgInfo(vancedInstalled.get()!!, vancedPkgName, getApplication()))
microgInstalledVersion.set(getPkgInfo(microgInstalled.get()!!, "com.mgoogle.android.gms", getApplication()).removeSuffix("-vanced"))
vancedVersionCode.set(getJsonInt("vanced.json", "versionCode", getApplication()))
microgVersionCode.set(getJsonInt("microg.json", "versionCode", getApplication()))
vancedInstalledVersionCode.set(getPkgVerCode(vancedInstalled.get()!!, vancedPkgName))
microgInstalledVersionCode.set(getPkgVerCode(microgInstalled.get()!!, "com.mgoogle.android.gms"))
microgInstallButtonTxt.set(compareInt(microgInstalledVersionCode.get()!!, microgVersionCode.get()!!, getApplication()))
microgInstallButtonIcon.set(compareIntDrawable(microgInstalledVersionCode.get()!!, microgVersionCode.get()!!, getApplication()))
shouldBeDisabled.set(nonrootModeSelected && !microgInstalled.get()!!)
vancedInstallButtonIcon.set(compareIntDrawable(vancedInstalledVersionCode.get()!!, vancedVersionCode.get()!!, getApplication()))
vancedInstallButtonTxt.set(compareInt(vancedInstalledVersionCode.get()!!, vancedVersionCode.get()!!, getApplication()))
fetching.set(false)
}
fetching.set(true)
managerApp.loadJsonAsync()
vanced.get()?.fetch()
vancedRoot.get()?.fetch()
music.get()?.fetch()
microg.get()?.fetch()
manager.get()?.fetch()
Crowdin.forceUpdate(getApplication())
fetching.set(false)
}
//private val microgSnackbar = Snackbar.make(, R.string.no_microg, Snackbar.LENGTH_LONG).setAction(R.string.install) { downloadMicrog(getApplication()) }
private val microgToast = Toast.makeText(app, R.string.no_microg, Toast.LENGTH_LONG)
fun openMicrogSettings() {
try {
@ -99,14 +70,13 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(getApplication(), intent, null)
} catch (e: ActivityNotFoundException) {
Toast.makeText(getApplication(), "App not installed", Toast.LENGTH_SHORT).show()
Toast.makeText(getApplication(), "Error", Toast.LENGTH_SHORT).show()
}
}
fun openUrl(Url: String) {
val customTabPrefs = getDefaultSharedPreferences(getApplication()).getBoolean("use_customtabs", true)
fun openUrl(url: String) {
val color: Int =
when (Url) {
when (url) {
"https://discord.gg/TUVd7rd" -> R.color.Discord
"https://t.me/joinchat/AAAAAEHf-pi4jH1SDlAL4w" -> R.color.Telegram
"https://twitter.com/YTVanced" -> R.color.Twitter
@ -115,60 +85,79 @@ open class HomeViewModel(application: Application): AndroidViewModel(application
"https://brave.com/van874" -> R.color.Brave
else -> R.color.Vanced
}
if (customTabPrefs) {
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(getApplication(), color))
val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(getApplication(), Uri.parse(Url))
} else {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(Url))
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(getApplication(), intent , null)
}
InternetTools.openUrl(url, color, getApplication())
}
private fun getPkgInfo(toCheck: Boolean, pkg: String, application: Application): String {
return if (toCheck) {
pm.getPackageInfo(pkg, 0).versionName
} else {
application.getString(R.string.unavailable)
}
fun installVanced(variant: String) {
if (!installing.value!!) {
if (!fetching.get()) {
if (variant == "nonroot" && !microg.get()?.isAppInstalled?.get()!!) {
microgToast.show()
} else {
if (app.getSharedPreferences("installPrefs", Context.MODE_PRIVATE).getBoolean("valuesModified", false)) {
downloadVanced(app)
} else {
_navigateDestination.value = Event(R.id.toInstallThemeFragment)
}
}
}
} else
Toast.makeText(getApplication(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
}
fun installMusic() {
if (!installing.value!!) {
if (!fetching.get()) {
if (!microg.get()?.isAppInstalled?.get()!!) {
microgToast.show()
} else {
downloadMusic(getApplication())
}
}
} else
Toast.makeText(getApplication(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
}
fun installMicrog() {
if (!installing.value!!)
downloadMicrog(getApplication())
else
Toast.makeText(getApplication(), R.string.installation_wait, Toast.LENGTH_SHORT).show()
}
fun uninstallVanced(variant: String) = uninstallApk(if (variant == "root") "com.google.android.youtube" else "com.vanced.android.youtube", app)
fun uninstallMusic() = uninstallApk("com.vanced.android.apps.youtube.music", app)
fun uninstallMicrog() = uninstallApk("com.mgoogle.android.gms", app)
fun cancelDownload(downloadId: Int) {
PRDownloader.cancel(downloadId)
}
@Suppress("DEPRECATION")
private fun getPkgVerCode(toCheck: Boolean, pkg: String): Int {
return if (toCheck) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
pm.getPackageInfo(pkg, 0).longVersionCode.and(0xFFFFFFFF).toInt()
else
pm.getPackageInfo(pkg, 0).versionCode
} else 0
fun pauseResumeDownload(downloadId: Int) {
if (PRDownloader.getStatus(downloadId) == Status.PAUSED)
PRDownloader.resume(downloadId)
else
PRDownloader.pause(downloadId)
}
private fun compareInt(int1: Int, int2: Int, application: Application): String {
return when {
int1 == 0 -> application.getString(R.string.install)
int2 > int1 -> application.getString(R.string.update)
int2 == int1 -> application.getString(R.string.button_reinstall)
else -> application.getString(R.string.install)
}
}
private fun compareIntDrawable(int1: Int, int2: Int, application: Application): Drawable? {
return when {
int1 == 0 -> application.getDrawable(R.drawable.ic_download)
int2 > int1 -> application.getDrawable(R.drawable.ic_update)
int2 == int1 -> application.getDrawable(R.drawable.ic_done)
else -> application.getDrawable(R.drawable.ic_download)
}
companion object {
val vancedProgress = ObservableField<ProgressModel>()
val musicProgress = ObservableField<ProgressModel>()
val microgProgress = ObservableField<ProgressModel>()
}
init {
fetching.set(true)
vanced.set(DataModel(managerApp.vanced, "vanced", app))
vancedRoot.set(DataModel(managerApp.vanced, "vancedRoot", app))
music.set(DataModel(managerApp.music, "music", app))
microg.set(DataModel(managerApp.microg, "microg", app))
manager.set(DataModel(managerApp.manager, "manager", app))
vancedProgress.set(ProgressModel())
musicProgress.set(ProgressModel())
microgProgress.set(ProgressModel())
fetching.set(false)
fetchData()
}
}
}

View file

@ -3,16 +3,34 @@ package com.vanced.manager.utils
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInstaller
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.vanced.manager.R
import com.vanced.manager.ui.fragments.HomeFragment
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
object AppUtils {
var installing = false
val mutableInstall = MutableLiveData<Boolean>()
val installing: LiveData<Boolean> = mutableInstall
init {
mutableInstall.value = false
}
fun sendRefresh(context: Context) {
CoroutineScope(Dispatchers.IO).launch {
delay(500)
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent(HomeFragment.REFRESH_HOME))
}
}
fun sendFailure(status: Int, context: Context) {
mutableInstall.value = false
//Delay error broadcast until activity (and fragment) get back to the screen
CoroutineScope(Dispatchers.IO).launch {
delay(500)
@ -39,6 +57,12 @@ object AppUtils {
status.contains("INSTALL_FAILED_INVALID_APK") -> context.getString(R.string.installation_invalid)
status.contains("INSTALL_FAILED_VERSION_DOWNGRADE") -> context.getString(R.string.installation_downgrade)
status.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES") -> context.getString(R.string.installation_signature)
status.contains("Failed_Uninstall") -> context.getString(R.string.failed_uninstall)
status.contains("Chown_Fail") -> context.getString(R.string.chown_fail)
status.contains("IFile_Missing") -> context.getString(R.string.ifile_missing)
status.contains("ModApk_Missing") -> context.getString(R.string.modapk_missing)
status.contains("Files_Missing_VA") -> context.getString(R.string.files_missing_va)
status.contains("Path_Missing") -> context.getString(R.string.path_missing)
else ->
if (MiuiHelper.isMiui())
context.getString(R.string.installation_miui)
@ -64,4 +88,4 @@ object AppUtils {
}
}
}

View file

@ -19,4 +19,4 @@ object DownloadHelper {
return downloadManager.enqueue(request)
}
}
}

View file

@ -20,9 +20,10 @@ object InternetTools {
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(context, color))
val customTabsIntent = builder.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(context, Uri.parse(Url))
} else
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(Url)))
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(Url)).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
}
fun getFileNameFromUrl(url: String) = url.substring(url.lastIndexOf('/')+1, url.length)
@ -67,7 +68,7 @@ object InternetTools {
suspend fun isUpdateAvailable(): Boolean {
val result = try {
JsonHelper.getJson("https://x1nto.github.io/VancedFiles/manager.json").int("versionCode") ?: 0
JsonHelper.getJson("https://ytvanced.github.io/VancedBackend/manager.json").int("versionCode") ?: 0
} catch (e: Exception) {
0
}

View file

@ -6,13 +6,22 @@ import com.beust.klaxon.Klaxon
import com.beust.klaxon.Parser
import com.github.kittinunf.fuel.coroutines.awaitString
import com.github.kittinunf.fuel.httpGet
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
object JsonHelper {
suspend fun getJson(url: String): JsonObject =
var dataMap: HashMap<String, JsonObject> = HashMap()
suspend fun getJson(url: String): JsonObject
{
return if(dataMap.containsKey(url)) {
dataMap[url]!!
} else {
dataMap[url] = getSuspendJson(url)
dataMap[url]!!
}
}
private suspend fun getSuspendJson(url: String): JsonObject =
Parser.default().parse(
StringBuilder(url.httpGet().awaitString())
) as JsonObject

View file

@ -0,0 +1,32 @@
package com.vanced.manager.utils
import android.content.Context
import android.content.ContextWrapper
import android.content.res.Configuration
import androidx.preference.PreferenceManager
import com.crowdin.platform.Crowdin
import java.util.*
class LanguageContextWrapper(base: Context?) : ContextWrapper(base) {
companion object {
fun wrap(context: Context): ContextWrapper {
val config: Configuration = context.resources.configuration
val pref = PreferenceManager.getDefaultSharedPreferences(context).getString("manager_lang", "System Default")
val locale =
when {
pref == "System Default" -> Locale(config.locale.displayLanguage)
pref?.length!! > 2 -> Locale(pref.substring(0, pref.length - 3), pref.substring(pref.length - 2))
else -> Locale(pref)
}
Locale.setDefault(locale)
config.setLocale(locale)
context.createConfigurationContext(config)
Crowdin.wrapContext(context)
return LanguageContextWrapper(context)
}
}
}

View file

@ -0,0 +1,27 @@
package com.vanced.manager.utils
import android.content.Context
import com.vanced.manager.R
import java.util.*
object LanguageHelper {
fun getLanguageFormat(context: Context, language: String): String {
return when {
language == "System Default" -> context.getString(R.string.system_default)
language.length > 2 -> {
val loc = Locale(
language.substring(0, language.length - 3),
language.substring(language.length - 2)
)
loc.getDisplayName(loc)
}
else -> {
val loc = Locale(language)
loc.getDisplayName(loc)
}
}
}
}

View file

@ -1,12 +1,35 @@
package com.vanced.manager.utils
import android.app.Activity
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInfo
import android.content.pm.PackageInstaller
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import com.topjohnwu.superuser.Shell
import com.topjohnwu.superuser.io.SuFile
import com.vanced.manager.BuildConfig
import com.vanced.manager.core.App
import com.vanced.manager.core.installer.AppInstallerService
import com.vanced.manager.core.installer.AppUninstallerService
import com.vanced.manager.core.installer.SplitInstallerService
import com.vanced.manager.ui.viewmodels.HomeViewModel.Companion.vancedProgress
import com.vanced.manager.utils.AppUtils.mutableInstall
import com.vanced.manager.utils.AppUtils.sendFailure
import com.vanced.manager.utils.AppUtils.sendRefresh
import java.io.*
import java.text.SimpleDateFormat
import java.util.*
import java.util.regex.Pattern
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
object PackageHelper {
private const val yPkg = "com.google.android.youtube"
private const val apkInstallPath = "/data/adb/Vanced/"
fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean {
return try {
@ -24,10 +47,469 @@ object PackageHelper {
""
}
fun uninstallApk(pkg: String, activity: Activity) {
val callbackIntent = Intent(activity.applicationContext, AppUninstallerService::class.java)
callbackIntent.putExtra("pkg", pkg)
val pendingIntent = PendingIntent.getService(activity.applicationContext, 0, callbackIntent, 0)
activity.packageManager.packageInstaller.uninstall(pkg, pendingIntent.intentSender)
@Suppress("DEPRECATION")
fun getPkgVerCode(pkg: String, pm:PackageManager): Int? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
pm.getPackageInfo(pkg, 0)?.longVersionCode?.and(0xFFFFFFFF)?.toInt()
else
pm.getPackageInfo(pkg, 0)?.versionCode
}
}
fun uninstallApk(pkg: String, context: Context): Boolean {
val callbackIntent = Intent(context, AppUninstallerService::class.java)
callbackIntent.putExtra("pkg", pkg)
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
return try {
context.packageManager.packageInstaller.uninstall(pkg, pendingIntent.intentSender)
true
} catch (e: Exception) {
e.printStackTrace()
false
}
}
fun install(app: String, path: String, context: Context){
val callbackIntent = Intent(context, AppInstallerService::class.java).putExtra("app", app)
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(if (app == "microg") "com.mgoogle.android.gms" else "com.vanced.android.apps.youtube.music")
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val inputStream: InputStream = FileInputStream(path)
val outputStream = session.openWrite("install", 0, -1)
val buffer = ByteArray(65536)
var c: Int
while (inputStream.read(buffer).also { c = it } != -1) {
outputStream.write(buffer, 0, c)
}
session.fsync(outputStream)
inputStream.close()
outputStream.close()
session.commit(pendingIntent.intentSender)
}
fun installVanced(context: Context): Int {
val apkFolderPath = context.getExternalFilesDir("apks")?.path + "/"
val nameSizeMap = HashMap<String, Long>()
var totalSize: Long = 0
var sessionId = 0
val folder = File(apkFolderPath)
val listOfFiles = folder.listFiles()
try {
for (listOfFile in listOfFiles!!) {
if (listOfFile.isFile) {
Log.d("AppLog", "installApk: " + listOfFile.name)
nameSizeMap[listOfFile.name] = listOfFile.length()
totalSize += listOfFile.length()
}
}
} catch (e: Exception) {
e.printStackTrace()
return -1
}
val installParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
installParams.setSize(totalSize)
try {
sessionId = context.packageManager.packageInstaller.createSession(installParams)
Log.d("AppLog","Success: created install session [$sessionId]")
for ((key, value) in nameSizeMap) {
doWriteSession(sessionId, apkFolderPath + key, value, key, context)
}
doCommitSession(sessionId, context)
Log.d("AppLog","Success")
} catch (e: IOException) {
e.printStackTrace()
}
return sessionId
}
private fun doWriteSession(sessionId: Int, inPath: String?, sizeBytes: Long, splitName: String, context: Context): Int {
var inPathToUse = inPath
var sizeBytesToUse = sizeBytes
if ("-" == inPathToUse) {
inPathToUse = null
} else if (inPathToUse != null) {
val file = File(inPathToUse)
if (file.isFile)
sizeBytesToUse = file.length()
}
var session: PackageInstaller.Session? = null
var inputStream: InputStream? = null
var out: OutputStream? = null
try {
session = context.packageManager.packageInstaller.openSession(sessionId)
if (inPathToUse != null) {
inputStream = FileInputStream(inPathToUse)
}
out = session.openWrite(splitName, 0, sizeBytesToUse)
var total = 0
val buffer = ByteArray(65536)
var c: Int
while (true) {
c = inputStream!!.read(buffer)
if (c == -1)
break
total += c
out.write(buffer, 0, c)
}
session.fsync(out)
Log.d("AppLog", "Success: streamed $total bytes")
return PackageInstaller.STATUS_SUCCESS
} catch (e: IOException) {
Log.e("AppLog", "Error: failed to write; " + e.message)
return PackageInstaller.STATUS_FAILURE
} finally {
try {
out?.close()
inputStream?.close()
session?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
private fun doCommitSession(sessionId: Int, context: Context) {
var session: PackageInstaller.Session? = null
try {
try {
session = context.packageManager.packageInstaller.openSession(sessionId)
val callbackIntent = Intent(context, SplitInstallerService::class.java)
val pendingIntent = PendingIntent.getService(context, 0, callbackIntent, 0)
session.commit(pendingIntent.intentSender)
session.close()
Log.d("AppLog", "install request sent")
Log.d("AppLog", "doCommitSession: " + context.packageManager.packageInstaller.mySessions)
Log.d("AppLog", "doCommitSession: after session commit ")
} catch (e: IOException) {
e.printStackTrace()
}
} finally {
session!!.close()
}
}
fun installVancedRoot(context: Context) {
Shell.enableVerboseLogging = BuildConfig.DEBUG
Shell.setDefaultBuilder(
Shell.Builder.create()
.setFlags(Shell.FLAG_REDIRECT_STDERR)
.setTimeout(10)
)
Shell.getShell {
val application = context.applicationContext as App
val vancedApplication = application.vanced?.int("versionCode")
val vancedVersionCode = if (vancedApplication != null) vancedApplication else { application.loadJsonAsync(); vancedApplication }
val apkFilesPath = context.getExternalFilesDir("apks")?.path
val fileInfoList = apkFilesPath?.let { it1 -> getFileInfoList(it1) }
if (fileInfoList != null) {
var modApk: FileInfo? = null
for (file in fileInfoList) {
if (file.name == "dark.apk" || file.name == "black.apk") {
modApk = file
}
}
if (modApk != null) {
if (overwriteBase(modApk, fileInfoList, vancedVersionCode!!, context)) {
sendRefresh(context)
vancedProgress.get()?.showInstallCircle?.set(false)
mutableInstall.value = false
}
}
else {
sendFailure(listOf("ModApk_Missing").toMutableList(), context)
}
}
else {
sendFailure(listOf("Files_Missing_VA").toMutableList(), context)
}
}
}
private fun installSplitApkFiles(apkFiles: ArrayList<FileInfo>, context: Context) : Boolean {
var sessionId: Int?
Log.d("AppLog", "installing split apk files:$apkFiles")
run {
val sessionIdResult = Shell.su("pm install-create -r -t").exec().out
val sessionIdPattern = Pattern.compile("(\\d+)")
val sessionIdMatcher = sessionIdPattern.matcher(sessionIdResult[0])
sessionIdMatcher.find()
sessionId = Integer.parseInt(sessionIdMatcher.group(1)!!)
}
apkFiles.forEach { apkFile ->
if (apkFile.name != "black.apk" && apkFile.name != "dark.apk" && apkFile.name != "hash.json") {
Log.d("AppLog", "installing APK : ${apkFile.name} ${apkFile.fileSize} ")
val command = arrayOf("su", "-c", "pm", "install-write", "-S", "${apkFile.fileSize}", "$sessionId", apkFile.name)
val process: Process = Runtime.getRuntime().exec(command)
val inputPipe = apkFile.getInputStream()
try {
process.outputStream.use { outputStream -> inputPipe.copyTo(outputStream) }
} catch (e: Exception) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
process.destroyForcibly()
else
process.destroy()
throw RuntimeException(e)
}
process.waitFor()
}
}
Log.d("AppLog", "committing...")
val installResult = Shell.su("pm install-commit $sessionId").exec()
if (installResult.isSuccess) {
return true
} else
sendFailure(installResult.out, context)
return false
}
private fun SimpleDateFormat.tryParse(str: String) = try {
parse(str) != null
} catch (e: Exception) {
false
}
private fun getFileInfoList(splitApkPath: String): ArrayList<FileInfo> {
val parentFile = File(splitApkPath)
val result = ArrayList<FileInfo>()
if (parentFile.exists() && parentFile.canRead()) {
val listFiles = parentFile.listFiles() ?: return ArrayList()
for (file in listFiles)
result.add(FileInfo(file.name, file.length(), file))
return result
}
val longLines = Shell.su("ls -l $splitApkPath").exec().out
val pattern = Pattern.compile(" +")
val formatter = SimpleDateFormat("HH:mm", Locale.getDefault())
longLinesLoop@ for (line in longLines) {
val matcher = pattern.matcher(line)
for (i in 0 until 4)
if (!matcher.find())
continue@longLinesLoop
val startSizeStr = matcher.end()
matcher.find()
val endSizeStr = matcher.start()
val fileSizeStr = line.substring(startSizeStr, endSizeStr)
while (true) {
val testTimeStr: String =
line.substring(matcher.end(), line.indexOf(' ', matcher.end()))
if (formatter.tryParse(testTimeStr)) {
//found time, so apk is next
val fileName = line.substring(line.indexOf(' ', matcher.end()) + 1)
if (fileName.endsWith("apk"))
result.add(FileInfo(fileName, fileSizeStr.toLong(), File(splitApkPath, fileName)))
break
}
matcher.find()
}
}
return result
}
//install Vanced
private fun overwriteBase(apkFile: FileInfo,baseApkFiles: ArrayList<FileInfo>, versionCode: Int, context: Context): Boolean {
if (checkVersion(versionCode, baseApkFiles, context)) {
val path = getPackageDir(context)
apkFile.file?.let {
val apath = it.absolutePath
setupFolder(apkInstallPath)
if (path != null) {
val apkFPath = apkInstallPath + "base.apk"
if (moveAPK(apath, apkFPath, context)) {
if (chConV(apkFPath, context)) {
if (setupScript(apkFPath,path)) {
return linkVanced(apkFPath,path)
}
}
}
}
}
}
return false
}
private fun setupScript(apkFPath: String, path: String): Boolean {
if (Shell.su("""echo "#!/system/bin/sh\nmount -o bind $apkFPath $path" > /data/adb/service.d/vanced.sh""").exec().isSuccess) {
return Shell.su("chmod 744 /data/adb/service.d/vanced.sh").exec().isSuccess
}
return false
}
private fun linkVanced(apkFPath: String, path: String): Boolean {
Shell.su("am force-stop $yPkg").exec()
val umountv = Shell.su("""for i in ${'$'}(ls /data/app/ | grep com.google.android.youtube | tr " "); do umount -l "/data/app/${"$"}i/base.apk"; done """).exec()
//Log.d("umountTest", Shell.su("grep com.google.android.youtube").exec().out.joinToString(" "))
val response = Shell.su("""su -mm -c "mount -o bind $apkFPath $path"""").exec()
Thread.sleep(500)
Shell.su("am force-stop $yPkg").exec()
return response.isSuccess
}
private fun setupFolder(apkInstallPath: String): Boolean {
return Shell.su("mkdir -p $apkInstallPath").exec().isSuccess
}
//check version and perform action based on result
private fun checkVersion(versionCode: Int, baseApkFiles: ArrayList<FileInfo>, context: Context): Boolean {
val path = getPackageDir(context)
if (path != null) {
if (path.contains("/data/app/")) {
when (getVersionNumber(context)?.let { compareVersion(it,versionCode) } ) {
1 -> return fixHigherVer(baseApkFiles, context)
-1 -> return fixLowerVer(baseApkFiles, context)
}
return true
}
else {
return fixNoInstall(baseApkFiles, context)
}
}
return fixNoInstall(baseApkFiles, context)
}
private fun getPkgInfo(pkg: String, context: Context): PackageInfo? {
return try {
context.packageManager.getPackageInfo(pkg, 0)
} catch (e:Exception) {
Log.d("VMpm", "Unable to get package info")
null
}
}
private fun compareVersion(pkgVerCode: Int, versionCode: Int): Int {
return when {
pkgVerCode > versionCode -> 1
pkgVerCode < versionCode -> -1
else -> 0
}
}
//uninstall current update and install base that works with patch
private fun fixHigherVer(apkFiles: ArrayList<FileInfo>, context: Context) : Boolean {
if (uninstallApk(yPkg, context)) {
return installSplitApkFiles(apkFiles, context)
}
sendFailure(listOf("Failed_Uninstall").toMutableList(), context)
return false
}
//install newer stock youtube
private fun fixLowerVer(apkFiles: ArrayList<FileInfo>, context: Context): Boolean {
return installSplitApkFiles(apkFiles, context)
}
//install stock youtube since no install was found
private fun fixNoInstall(baseApkFiles: ArrayList<FileInfo>, context: Context): Boolean {
return installSplitApkFiles(baseApkFiles, context)
}
//set chcon to apk_data_file
private fun chConV(path: String, context: Context): Boolean {
val response = Shell.su("chcon u:object_r:apk_data_file:s0 $path").exec()
//val response = Shell.su("chcon -R u:object_r:system_file:s0 $path").exec()
return if (response.isSuccess) {
true
} else {
sendFailure(response.out, context)
false
}
}
//move patch to data/app
private fun moveAPK(apkFile: String, path: String, context: Context) : Boolean {
val apkinF = SuFile.open(apkFile)
val apkoutF = SuFile.open(path)
if(apkinF.exists()) {
try {
Shell.su("am force-stop $yPkg").exec()
//Shell.su("rm -r SuFile.open(path).parent")
copy(apkinF,apkoutF)
Shell.su("chmod 644 $path").exec().isSuccess
return if(Shell.su("chown system:system $path").exec().isSuccess) {
true
} else {
sendFailure(listOf("Chown_Fail").toMutableList(), context)
false
}
}
catch (e: IOException)
{
sendFailure(listOf("${e.message}").toMutableList(), context)
return false
}
}
else {
sendFailure(listOf("IFile_Missing").toMutableList(), context)
return false
}
}
@Throws(IOException::class)
fun copy(src: File?, dst: File?) {
val cmd = Shell.su("mv ${src!!.absolutePath} ${dst!!.absolutePath}").exec().isSuccess
Log.d("ZLog", cmd.toString())
}
@Suppress("DEPRECATION")
private fun getVersionNumber(context: Context): Int? {
try {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
context.packageManager.getPackageInfo(yPkg, 0).longVersionCode.and(0xFFFFFFFF).toInt()
else
context.packageManager.getPackageInfo(yPkg, 0).versionCode
}
catch (e : Exception) {
val execRes = Shell.su("dumpsys package com.google.android.youtube | grep versionCode").exec()
if(execRes.isSuccess) {
val result = execRes.out
var version = 0
for(line in result) {
val versionCode = line.substringAfter("=")
val versionCodeFiltered = versionCode.substringBefore(" ")
if(version < Integer.valueOf(versionCodeFiltered))
{
version = Integer.valueOf(versionCodeFiltered)
}
}
return version
}
}
return null
}
//get path of the installed youtube
private fun getPackageDir(context: Context): String?
{
return try {
val p = getPkgInfo(yPkg, context)
p!!.applicationInfo.sourceDir
} catch (e: Exception) {
val execRes = Shell.su("dumpsys package com.google.android.youtube | grep codePath").exec()
if(execRes.isSuccess)
{
val result = execRes.out
for (line in result)
{
if(line.contains("data/app")) "${line.substringAfter("=")}/base.apk"
}
}
null
}
}
}

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="500"/>
</set>

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%"
android:toXDelta="100%"
android:duration="500"/>
</set>

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="-100%"
android:toXDelta="0%"
android:duration="500"/>
</set>
android:duration="800"
android:fromYDelta="-100%p"
android:toYDelta="0"
/>
</set>

View file

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="500"/>
</set>
android:duration="800"
android:fromYDelta="0"
android:toYDelta="-100%p"
/>
</set>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorPrimaryVariant">
<path
android:fillColor="@android:color/white"
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z"/>
</vector>

View file

@ -0,0 +1,13 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorOnSurfaceVariant">
<path
android:fillColor="@android:color/white"
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorPrimaryVariant">
<path
android:fillColor="@android:color/white"
android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z"/>
</vector>

View file

@ -0,0 +1,13 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorOnSurfaceVariant">
<path
android:fillColor="@android:color/white"
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorOnSurfaceVariant">
<path
android:fillColor="@android:color/white"
android:pathData="M8,5v14l11,-7z"/>
</vector>

View file

@ -0,0 +1,25 @@
<vector android:height="30dp" android:viewportHeight="2000"
android:viewportWidth="2000" android:width="30dp"
xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#0C0C0F" android:pathData="M1000,1000m-900,0a900,900 0,1 1,1800 0a900,900 0,1 1,-1800 0"/>
<path android:fillColor="#FFFFFF" android:pathData="M1297.99,934.95L913.69,687c-16.68,-9.72 -38.08,-4.08 -47.8,12.59l-0.75,1.28c-9.72,16.67 -4.09,38.07 12.59,47.79l367.49,221.11c23.91,14.39 23.77,49.1 -0.25,63.29l-369.18,218.11c-16.76,9.58 -22.58,30.93 -13,47.69l0.73,1.29c9.58,16.76 30.93,22.57 47.69,12.99l386.24,-244.83C1346.25,1037.38 1346.54,966.28 1297.99,934.95z"/>
<path android:pathData="M1101.77,966.16L912.55,859.57c-24.49,-13.8 -54.77,3.9 -54.77,32v213.18c0,28.11 30.28,45.8 54.77,32l189.22,-106.59C1126.71,1016.12 1126.71,980.21 1101.77,966.16z">
<aapt:attr name="android:fillColor">
<gradient android:endX="1035.8003" android:endY="898.2145"
android:startX="835.8939" android:startY="1098.121" android:type="linear">
<item android:color="#FF2E73FF" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
<path android:fillColor="#00000000"
android:pathData="M1000,1000m-650,0a650,650 0,1 1,1300 0a650,650 0,1 1,-1300 0" android:strokeWidth="71">
<aapt:attr name="android:strokeColor">
<gradient android:endX="1484.7217" android:endY="515.2783"
android:startX="515.2783" android:startY="1484.7217" android:type="linear">
<item android:color="#FF2E73FF" android:offset="0"/>
<item android:color="#FFFF0032" android:offset="1"/>
</gradient>
</aapt:attr>
</path>
</vector>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_baseline_resume_24"
android:state_checked="true" />
<item
android:drawable="@drawable/ic_baseline_pause_24"
android:state_checked="false" />
</selector>

View file

@ -9,15 +9,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/bottom_nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/home_appbar"
app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation"/>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/home_appbar"
android:layout_width="match_parent"
@ -30,10 +21,20 @@
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:titleTextColor="?attr/toolbarIconColor"
android:background="@android:color/transparent"/>
android:background="?colorSurface"/>
</com.google.android.material.appbar.AppBarLayout>
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_below="@id/home_appbar"
android:layout_alignParentBottom="true"
app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation" />
</RelativeLayout>
</layout>
</layout>

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
<com.google.android.material.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
style="@style/MaterialCard"

View file

@ -1,140 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.vanced.manager.ui.viewmodels.HomeViewModel" />
</data>
<com.vanced.manager.ui.core.SlidingSwipeRefreshLayout
android:id="@+id/home_refresh"
<com.vanced.manager.ui.core.SlidingWidthLinearLayout
android:id="@+id/variant_tab_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
bind:refreshing="@{viewModel.fetching}"
bind:onRefreshListener="@{()-> viewModel.fetchData()}">
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.core.widget.NestedScrollView
<com.google.android.material.tabs.TabLayout
android:id="@+id/main_tablayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:fillViewport="true"
android:scrollbars="none">
android:layout_height="wrap_content"
android:background="?colorSurface"
app:tabIndicatorColor="?colorPrimary"
app:tabSelectedTextColor="?colorPrimary"
app:tabTextColor="?colorPrimary" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="4dp"
android:animateLayoutChanges="true"
android:orientation="vertical">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/main_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:orientation="horizontal">
</com.vanced.manager.ui.core.SlidingWidthLinearLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true">
<com.google.android.material.button.MaterialButton
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nonroot"
android:textAllCaps="false"
android:visibility="@{viewModel.nonrootModeSelected ? View.VISIBLE : View.GONE}"
bind:strokeColor="?colorPrimary"
bind:strokeWidth="2dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/nonroot_switch"
style="@style/ButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nonroot"
android:visibility="@{viewModel.nonrootModeSelected ? View.GONE : View.VISIBLE}" />
</FrameLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true">
<com.google.android.material.button.MaterialButton
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/root"
android:textAllCaps="false"
android:visibility="@{viewModel.nonrootModeSelected ? View.GONE : View.VISIBLE}"
bind:strokeColor="?colorPrimary"
bind:strokeWidth="2dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/root_switch"
style="@style/ButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/root"
android:visibility="@{viewModel.nonrootModeSelected ? View.VISIBLE : View.GONE}" />
</FrameLayout>
</RelativeLayout>
<include
android:id="@+id/include_vanced_layout"
layout="@layout/include_vanced"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
bind:viewModel="@{viewModel}" />
<include
android:id="@+id/include_microg_layout"
layout="@layout/include_microg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
android:visibility="@{viewModel.nonrootModeSelected ? View.VISIBLE : View.GONE}"
bind:viewModel="@{viewModel}" />
<include
android:id="@+id/include_changelogs_layout"
layout="@layout/include_changelogs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp" />
<include
layout="@layout/include_useful_links"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
bind:viewModel="@{viewModel}" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</com.vanced.manager.ui.core.SlidingSwipeRefreshLayout>
</layout>
</layout>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:id="@+id/variant_tab_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/main_tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?colorSurface"
app:tabIndicatorColor="?colorPrimary"
app:tabSelectedTextColor="?colorPrimary"
app:tabTextColor="?colorPrimary" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/main_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</layout>

View file

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.fragments.MicrogChangelogFragment">
<TextView
android:id="@+id/manager_changelog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="" />
</FrameLayout>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.fragments.MicrogChangelogFragment">
<TextView
android:id="@+id/microg_changelog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="Changes:\n - Added casting support\n
- Fixed notifications\n\nMicroG now requires Vanced 14.21.54 and up"
tools:ignore="HardcodedText" />
</FrameLayout>

View file

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.fragments.VancedChangelogFragment">
<TextView
android:id="@+id/vanced_changelog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp" />
</FrameLayout>

View file

@ -36,10 +36,35 @@
android:layout_marginEnd="2dp"
android:layout_weight="1">
<include
layout="@layout/include_language_scrollview"
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:fillViewport="true"
tools:ignore="HardcodedText">
<LinearLayout
android:id="@+id/lang_button_ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/en"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:buttonTint="?colorDisabled"
android:fontFamily="@font/exo_semibold"
android:text="English"
android:tag="en"
android:textSize="18sp"
android:checked="true"
android:clickable="false"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</FrameLayout>
@ -53,4 +78,4 @@
</com.google.android.material.card.MaterialCardView>
</com.vanced.manager.ui.core.SlidingConstraintLayout>
</com.vanced.manager.ui.core.SlidingConstraintLayout>

View file

@ -51,4 +51,4 @@
</com.google.android.material.card.MaterialCardView>
</com.vanced.manager.ui.core.SlidingConstraintLayout>
</com.vanced.manager.ui.core.SlidingConstraintLayout>

View file

@ -24,7 +24,19 @@
android:layout_height="wrap_content"
android:text="- Xinto"
android:textSize="18sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="- Koopah"
android:textSize="18sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="- AioiLight"
android:textSize="18sp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>

View file

@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.vanced.manager.ui.viewmodels.AboutViewModel" />
</data>
<com.google.android.material.card.MaterialCardView

View file

@ -19,11 +19,11 @@
style="@style/MaterialCard">
<LinearLayout
android:id="@+id/changelog_linear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginEnd="1dp"
android:animateLayoutChanges="true"
android:orientation="vertical">
<RelativeLayout
@ -52,7 +52,7 @@
android:layout_height="wrap_content"
android:background="?colorSurfaceVariant"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="parent"
app:tabMode="scrollable"
app:tabIndicatorColor="?colorPrimary"
app:tabSelectedTextColor="?colorPrimary"
app:tabTextColor="?colorPrimary"
@ -61,8 +61,7 @@
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
@ -70,4 +69,4 @@
</com.google.android.material.card.MaterialCardView>
</layout>
</layout>

View file

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fillViewport="true"
tools:ignore="HardcodedText">
<LinearLayout
android:id="@+id/lang_button_ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/en"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:buttonTint="?colorDisabled"
android:fontFamily="@font/exo_semibold"
android:text="English (default)"
android:tag="en"
android:textSize="18sp"
android:checked="true"
android:clickable="false"/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -21,7 +21,6 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
@ -47,8 +46,9 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/microg_installbtn"
style="@style/ButtonStyle"
android:text="@{viewModel.microgInstallButtonTxt}"
app:icon="@{viewModel.microgInstallButtonIcon}"
android:text="@{viewModel.microg.buttonTxt}"
android:onClick="@{()-> viewModel.installMicrog()}"
app:icon="@{viewModel.microg.buttonIcon}"
app:layout_constraintBottom_toTopOf="@id/microg_uninstallbtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -61,10 +61,10 @@
app:constraint_referenced_ids="microg_installbtn" />
<LinearLayout
android:id="@+id/microg_remote_latest_version"
android:id="@+id/microg_remote_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/linearLayout2"
app:layout_constraintBottom_toTopOf="@id/microg_installed_container"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/microg_title_buttons_barrier">
@ -75,17 +75,17 @@
<TextView
android:id="@+id/microg_latest_version"
style="@style/AppVer.Bold"
android:text="@{viewModel.microgVersion}" />
android:text="@{viewModel.microg.versionName}" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:id="@+id/microg_installed_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/microg_remote_latest_version">
app:layout_constraintTop_toBottomOf="@id/microg_remote_container">
<TextView
style="@style/AppVer"
@ -94,7 +94,7 @@
<TextView
android:id="@+id/microg_installed_version"
style="@style/AppVer.Bold"
android:text="@{viewModel.microgInstalledVersion}" />
android:text="@{viewModel.microg.installedVersionName}" />
</LinearLayout>
@ -103,7 +103,7 @@
style="@style/ClickableImageWidget"
android:layout_marginEnd="4dp"
android:onClick="@{()-> viewModel.openMicrogSettings()}"
android:visibility="@{viewModel.microgInstalled ? View.VISIBLE : View.GONE}"
android:visibility="@{viewModel.microg.appInstalled ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/microg_uninstallbtn"
app:layout_constraintTop_toBottomOf="@id/microg_title_buttons_barrier"
@ -112,7 +112,8 @@
<ImageView
android:id="@+id/microg_uninstallbtn"
style="@style/ClickableImageWidget.Red"
android:visibility="@{viewModel.microgInstalled ? View.VISIBLE : View.GONE}"
android:onClick="@{()-> viewModel.uninstallMicrog()}"
android:visibility="@{viewModel.microg.appInstalled ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/microg_title_buttons_barrier"
@ -124,22 +125,59 @@
android:id="@+id/microg_downloading_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:visibility="@{viewModel.Companion.microgProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:text="@{viewModel.Companion.microgProgress.downloadingFile}"
tools:visibility="visible" />
<ProgressBar
android:id="@+id/microg_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/microg_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
app:layout_constraintHorizontal_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.microgProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:progress="@{viewModel.Companion.microgProgress.downloadProgress}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/microg_download_pause_resume"
app:layout_constraintBottom_toBottomOf="parent"
tools:visibility="visible" />
<ToggleButton
android:id="@+id/microg_download_pause_resume"
style="@style/PauseResumeButtonStyle"
android:visibility="@{viewModel.Companion.microgProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toEndOf="@id/microg_downloading"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/microg_download_cancel"
app:layout_constraintBottom_toBottomOf="parent"
android:onClick="@{()-> viewModel.pauseResumeDownload(viewModel.Companion.microgProgress.currentDownload)}"
android:checked="@{!viewModel.Companion.microgProgress.showDownloadBar}"/>
<ImageButton
android:id="@+id/microg_download_cancel"
app:layout_constraintStart_toEndOf="@id/microg_download_pause_resume"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.microgProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:background="@android:color/transparent"
android:onClick="@{()-> viewModel.cancelDownload(viewModel.Companion.microgProgress.currentDownload)}"
android:src="@drawable/ic_baseline_clear_24"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<ProgressBar
android:id="@+id/microg_installing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:visibility="@{viewModel.Companion.microgProgress.showInstallCircle ? View.VISIBLE : View.GONE}"
tools:visibility="visible" />
</LinearLayout>

View file

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.vanced.manager.ui.viewmodels.HomeViewModel" />
</data>
<com.google.android.material.card.MaterialCardView
android:id="@+id/music_card"
style="@style/MaterialCard">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/home_music_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/music_title_buttons_barrier"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_music" />
<TextView
style="@style/TextAppTitle"
android:text="@string/music"
app:layout_constraintBottom_toTopOf="@id/music_title_buttons_barrier"
app:layout_constraintStart_toEndOf="@id/home_music_logo"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/music_installbtn"
style="@style/ButtonStyle"
android:text="@{viewModel.music.buttonTxt}"
android:onClick="@{()-> viewModel.installMusic()}"
app:icon="@{viewModel.music.buttonIcon}"
app:layout_constraintBottom_toTopOf="@id/music_uninstallbtn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/music_title_buttons_barrier"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="music_installbtn" />
<LinearLayout
android:id="@+id/music_remote_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/music_installed_container"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/music_title_buttons_barrier">
<TextView
style="@style/AppVer"
android:text="@string/latest" />
<TextView
android:id="@+id/music_latest_version"
style="@style/AppVer.Bold"
android:text="@{viewModel.music.versionName}" />
</LinearLayout>
<LinearLayout
android:id="@+id/music_installed_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/music_remote_container">
<TextView
style="@style/AppVer"
android:text="@string/version_installed" />
<TextView
android:id="@+id/music_installed_version"
style="@style/AppVer.Bold"
android:text="@{viewModel.music.installedVersionName}" />
</LinearLayout>
<ImageView
android:id="@+id/music_uninstallbtn"
style="@style/ClickableImageWidget.Red"
android:visibility="@{viewModel.music.appInstalled ? View.VISIBLE : View.GONE}"
android:onClick="@{()-> viewModel.uninstallMusic()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/music_title_buttons_barrier"
app:srcCompat="@drawable/ic_delete_black_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/music_downloading_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.musicProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:text="@{viewModel.Companion.musicProgress.downloadingFile}"
tools:visibility="visible" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/music_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
app:layout_constraintHorizontal_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.musicProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:progress="@{viewModel.Companion.musicProgress.downloadProgress}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/music_download_pause_resume"
app:layout_constraintBottom_toBottomOf="parent"
tools:visibility="visible" />
<ToggleButton
android:id="@+id/music_download_pause_resume"
style="@style/PauseResumeButtonStyle"
android:visibility="@{viewModel.Companion.musicProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toEndOf="@id/music_downloading"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/music_download_cancel"
app:layout_constraintBottom_toBottomOf="parent"
android:onClick="@{()-> viewModel.pauseResumeDownload(viewModel.Companion.musicProgress.currentDownload)}"
android:checked="@{!viewModel.Companion.musicProgress.showDownloadBar}"/>
<ImageButton
android:id="@+id/music_download_cancel"
app:layout_constraintStart_toEndOf="@id/music_download_pause_resume"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.musicProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:background="@android:color/transparent"
android:onClick="@{()-> viewModel.cancelDownload(viewModel.Companion.musicProgress.currentDownload)}"
android:src="@drawable/ic_baseline_clear_24"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<ProgressBar
android:id="@+id/music_installing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.musicProgress.showInstallCircle ? View.VISIBLE : View.GONE}"
tools:visibility="visible" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</layout>

View file

@ -15,8 +15,7 @@
<com.google.android.material.card.MaterialCardView
style="@style/MaterialCard"
app:contentPaddingTop="2dp"
app:contentPaddingBottom="8dp"
android:animateLayoutChanges="true">
app:contentPaddingBottom="8dp">
<LinearLayout
android:layout_width="match_parent"

View file

@ -12,6 +12,10 @@
name="viewModel"
type="com.vanced.manager.ui.viewmodels.HomeViewModel" />
<variable
name="vancedVariant"
type="String" />
</data>
<com.google.android.material.card.MaterialCardView
@ -22,7 +26,6 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
@ -48,10 +51,11 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/vanced_installbtn"
style="@style/ButtonStyle"
android:text="@{viewModel.vancedInstallButtonTxt}"
android:text="@{vancedVariant.equals(`root`) ? viewModel.vancedRoot.buttonTxt : viewModel.vanced.buttonTxt}"
android:textColor="@color/White"
android:backgroundTint="?colorPrimary"
app:icon="@{viewModel.vancedInstallButtonIcon}"
android:onClick="@{()-> viewModel.installVanced(vancedVariant)}"
app:icon="@{vancedVariant.equals(`root`) ? viewModel.vancedRoot.buttonIcon : viewModel.vanced.buttonIcon}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -65,17 +69,18 @@
<ImageView
android:id="@+id/vanced_uninstallbtn"
style="@style/ClickableImageWidget.Red"
android:visibility="@{viewModel.vancedInstalled ? View.VISIBLE : View.GONE}"
android:onClick="@{()-> viewModel.uninstallVanced(vancedVariant)}"
android:visibility="@{vancedVariant.equals(`root`) ? (viewModel.vancedRoot.appInstalled ? View.VISIBLE : View.GONE) : (viewModel.vanced.appInstalled ? View.VISIBLE : View.GONE)}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/vanced_title_buttons_barrier"
app:srcCompat="@drawable/ic_delete_black_24dp" />
<LinearLayout
android:id="@+id/vanced_remote_latest_version"
android:id="@+id/vanced_remote_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/linearLayout2"
app:layout_constraintBottom_toTopOf="@id/vanced_installed_container"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/vanced_title_buttons_barrier">
@ -86,16 +91,16 @@
<TextView
android:id="@+id/vanced_latest_version"
style="@style/AppVer.Bold"
android:text="@{viewModel.vancedVersion}" />
android:text="@{viewModel.vanced.versionName}" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:id="@+id/vanced_installed_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/vanced_remote_latest_version">
app:layout_constraintTop_toBottomOf="@id/vanced_remote_container">
<TextView
style="@style/AppVer"
@ -104,7 +109,7 @@
<TextView
android:id="@+id/vanced_installed_version"
style="@style/AppVer.Bold"
android:text="@{viewModel.vancedInstalledVersion}" />
android:text="@{vancedVariant.equals(`root`) ? viewModel.vancedRoot.installedVersionName : viewModel.vanced.installedVersionName}" />
</LinearLayout>
@ -114,26 +119,63 @@
android:id="@+id/vanced_downloading_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:visibility="@{viewModel.Companion.vancedProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:text="@{viewModel.Companion.vancedProgress.downloadingFile}"
tools:visibility="visible" />
<ProgressBar
android:id="@+id/vanced_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/vanced_downloading"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
app:layout_constraintHorizontal_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="@{viewModel.Companion.vancedProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
android:progress="@{viewModel.Companion.vancedProgress.downloadProgress}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/vanced_download_pause_resume"
app:layout_constraintBottom_toBottomOf="parent"
tools:visibility="visible" />
<ToggleButton
android:id="@+id/vanced_download_pause_resume"
style="@style/PauseResumeButtonStyle"
android:visibility="@{viewModel.Companion.vancedProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toEndOf="@id/vanced_downloading"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/vanced_download_cancel"
app:layout_constraintBottom_toBottomOf="parent"
android:onClick="@{()-> viewModel.pauseResumeDownload(viewModel.Companion.vancedProgress.currentDownload)}"
android:checked="@{!viewModel.Companion.vancedProgress.showDownloadBar}"/>
<ImageButton
android:id="@+id/vanced_download_cancel"
app:layout_constraintStart_toEndOf="@id/vanced_download_pause_resume"
android:visibility="@{viewModel.Companion.vancedProgress.showDownloadBar ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:onClick="@{()-> viewModel.cancelDownload(viewModel.Companion.vancedProgress.currentDownload)}"
android:src="@drawable/ic_baseline_clear_24"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<ProgressBar
android:id="@+id/vanced_installing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:visibility="@{viewModel.Companion.vancedProgress.showInstallCircle ? View.VISIBLE : View.GONE}"
tools:visibility="visible" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</layout>
</layout>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/changelog_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp"/>
</FrameLayout>

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="viewModel"
type="com.vanced.manager.ui.viewmodels.HomeViewModel" />
<variable
name="variant"
type="String" />
</data>
<com.vanced.manager.ui.core.SlidingSwipeRefreshLayout
android:id="@+id/home_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
bind:refreshing="@{viewModel.fetching}"
bind:onRefreshListener="@{()-> viewModel.fetchData()}">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/include_vanced_layout"
layout="@layout/include_vanced"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
bind:viewModel="@{viewModel}"
bind:vancedVariant="@{variant}"/>
<include
android:id="@+id/include_music_layout"
layout="@layout/include_music"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
android:visibility="@{variant.equals(`nonroot`) ? View.VISIBLE : View.GONE}"
bind:viewModel="@{viewModel}" />
<include
android:id="@+id/include_microg_layout"
layout="@layout/include_microg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
android:visibility="@{variant.equals(`nonroot`) ? View.VISIBLE : View.GONE}"
bind:viewModel="@{viewModel}" />
<include
android:id="@+id/include_changelogs_layout"
layout="@layout/include_changelogs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp" />
<include
layout="@layout/include_useful_links"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/stdp"
android:layout_marginTop="@dimen/stdp"
android:layout_marginEnd="@dimen/stdp"
bind:viewModel="@{viewModel}" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</com.vanced.manager.ui.core.SlidingSwipeRefreshLayout>
</layout>

View file

@ -3,6 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home"
app:startDestination="@id/home_fragment">
<fragment
@ -12,7 +13,7 @@
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_settingsFragment"
android:id="@+id/toSettingsFragment"
app:destination="@id/settings_fragment"
app:enterAnim="@animator/fragment_enter"
app:exitAnim="@animator/fragment_exit"
@ -113,4 +114,4 @@
app:popUpTo="@id/home_fragment"
app:popUpToInclusive="true" />
</navigation>
</navigation>

View file

@ -11,26 +11,11 @@
<!-- Home Page -->
<string name="changelogs">Changelogs</string>
<string name="downloading_file">Downloading %1$s</string>
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
<string name="error_downloading">Error Downloading %1$s</string>
<string name="install">Install</string>
<string name="installing_app">Installing %1$s</string>
<string name="installation_aborted">Operation failed because the user aborted the installation.</string>
<string name="installation_blocked">Operation failed because the user blocked the installation.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Operation failed because the app conflicts with an already installed app.</string>
<string name="installation_failed">Operation failed for an unknown reason, please join our Telegram or Discord for support.</string>
<string name="installation_incompatible">Operation failed because the app is incompatible with your device.</string>
<string name="installation_invalid">Operation failed because the apk files are invalid.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">An unexpected error occurred while installing Vanced. Have you disabled MIUI Optimisations?</string>
<string name="installation_storage">Operation failed due to a storage error.</string>
<string name="installation_wait">Please wait until the installation finishes</string>
<string name="installation_wait">Please wait until installation finishes.</string>
<string name="button_reinstall">Reinstall</string>
<string name="version_installed">Installed:</string>
<string name="latest">Latest:</string>
<string name="successfully_installed">Successfully installed %1$s</string>
<string name="network_error">Network connection unavailable</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="root_not_granted">Root access not granted</string>
<string name="unavailable">Unavailable</string>
@ -38,7 +23,7 @@
<string name="useful_links">Useful Links</string>
<string name="website_text">Website</string>
<string name="support_us">Support us!</string>
<string name="version_toast">%1$s version was copied!</string>
<string name="version_toast">%1$s version number was copied!</string>
<!-- Settings -->
<string name="accent_color">Accent Color</string>
<string name="accent_blue">Blue</string>
@ -54,9 +39,15 @@
<string name="chosen_theme">Theme: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="language_title">Language</string>
<string name="link_title">Use Chrome Custom Tabs</string>
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
<string name="link_external_browser">Links will open in an External Browser</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">System Default</string>
<string name="theme">Theme</string>
<string name="theme_follow">Follow System</string>
<string name="theme_dark">Dark Theme</string>
@ -69,29 +60,46 @@
<string name="update_found">Update found!</string>
<string name="update_notfound">No new updates</string>
<!-- Dialogs -->
<string name="button_dismiss">Dismiss</string>
<string name="guide">Guide</string>
<string name="hold_on">Hold on!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">Stop!</string>
<string name="magisk_vanced">You are using the Magisk/TWRP version of Vanced, which is discontinued and cannot be updated using this app. Please remove it by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="miui_one_title">MIUI detected!</string>
<string name="miui_one">Hey! it looks like you\'re a MIUI user. in order to properly use this application, you will have to disable MIUI optimisations in the developer settings. (You can safely ignore this warning if you are on a 20.2.20 or later ROM based on xiaomi.eu)</string>
<string name="miui_one">In order to install Vanced, you MUST disable MIUI Optimisations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
<string name="error">Error</string>
<string name="security_context">Please make sure, that you downloaded the app from vanced.app, the Vanced Discord server or the Vanced GitHub</string>
<string name="security_context">Make sure that you downloaded the app from vanced.app, the Vanced Discord server or the Vanced GitHub</string>
<string name="success">Success!</string>
<string name="vanced_installed">Vanced has successfully been installed! Launch now?</string>
<string name="launch">Launch</string>
<string name="vanced_installed">Vanced has successfully been installed! Open now?</string>
<string name="music_installed">Vanced Music has successfully been installed! Open now?</string>
<string name="launch">Open</string>
<string name="welcome">Welcome</string>
<!-- Install Page -->
<string name="choose_preferred_language">Choose your preferred language for Vanced</string>
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
<string name="choose_preferred_language_note">Note: English will always be installed as an additional language as well.</string>
<string name="choose_preferred_theme">Choose your preferred theme for Vanced</string>
<string name="disable_signature">Root mode detected! To install Vanced, you will need to disable the apk signature verification.</string>
<string name="finish">Finish</string>
<string name="install_light_black">Light + Black</string>
<string name="install_light_dark">Light + Dark</string>
<string name="next">Next</string>
<!-- About Page -->
<string name="manager_dev">Manager Dev</string>
<string name="manager_dev">Manager Devs</string>
<string name="sources">Sources</string>
<string name="vanced_team">Vanced Team</string>
<!-- Error messages -->
<string name="chown_fail">Failed To Chown Apk to system owner, Try Again</string>
<string name="error_downloading">Error Downloading %1$s</string>
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
<string name="files_missing_va">Files are missing, Failed Download?</string>
<string name="ifile_missing">Dark/Black.apk Cannot Be Read(Did Storage Get Blocked?) or File Missing</string>
<string name="installation_aborted">Installation failed because user aborted the installation.</string>
<string name="installation_blocked">Installation failed because user blocked the installation.</string>
<string name="installation_downgrade">Installation failed because user tried to downgrade the package. Uninstall updates from stock YouTube app, then try again.</string>
<string name="installation_conflict">Installation failed because the app conflicts with an already installed app. Uninstall the current version of Vanced, then try again.</string>
<string name="installation_failed">Installation failed for unknown reasons, join our Telegram or Discord for further support.</string>
<string name="installation_incompatible">Installation failed because the installation file is incompatible with your device. Clear downloaded files in the Settings, then try again.</string>
<string name="installation_invalid">Installation failed because the apk files are corrupted, please try again.</string>
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
<string name="installation_miui">Installation failed because MIUI Optimization is enabled. Disable MIUI Optimization, then try again.</string>
<string name="installation_storage">Installation failed due to a storage error.</string>
<string name="modapk_missing">Black/Dark apk missing from installer, This should not happen, please clear app data of manager</string>
<string name="path_missing">Stock Youtube Install Path Is Not Accessible Or Missing After Stock Split Install</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">سجل التغييرات</string>
<string name="downloading_file">جارٍ تنزيل %1$s</string>
<string name="failed_uninstall">فشل في الغاء تثبيت الحزمة %1$s</string>
<string name="error_downloading">خطأ في تحميل %1$s</string>
<string name="install">تثبيت</string>
<string name="installing_app">جاري التثبيت %1$s</string>
<string name="installation_aborted">فشلت العملية لأن المستخدم ألغى التثبيت.</string>
<string name="installation_blocked">فشلت العملية لأن المستخدم قام بحظر التثبيت.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">فشلت العملية لأن التطبيق يتعارض مع تطبيق مثبت بالفعل.</string>
<string name="installation_failed">فشلت العملية لسبب غير معروف، يرجى الانضمام إلى تيليجرام أو ديسكورد للحصول على الدعم.</string>
<string name="installation_incompatible">فشلت العملية لأن التطبيق غير متوافق مع جهازك.</string>
<string name="installation_invalid">فشلت العملية لأن ملفات apk غير صالحة.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">حدث خطأ غير متوقع أثناء تثبيت Vanced. هل قمت بتعطيل تحسينات MIUI؟</string>
<string name="installation_storage">فشلت العملية بسبب خطأ في التخزين.</string>
<string name="installation_wait">الرجاء الانتظار حتى ينتهي التثبيت</string>
<string name="installation_wait">الرجاء الانتظار حتى ينتهي التثبيت.</string>
<string name="button_reinstall">إعادة التثبيت</string>
<string name="version_installed">مثبت:</string>
<string name="latest">آخر:</string>
<string name="successfully_installed">تم تثبيت %1$s بنجاح</string>
<string name="network_error">اتصاا الشبكة غير متاح</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="no_microg">لم يتم تثبيت microG</string>
<string name="root_not_granted">لم يتم منح الوصول للجذر</string>
<string name="unavailable">غير متاح</string>
<string name="update">تحديث</string>
<string name="useful_links">روابط المفيدة</string>
<string name="website_text">الموقع رسمي لفانسد</string>
<string name="support_us">ادعمنا بتريق تنزيل بريف</string>
<string name="version_toast">تم نسخ الإصدار %1$s!</string>
<string name="version_toast">تم نسخ رقم الإصدار %1$s!</string>
<!-- Settings -->
<string name="accent_color">الوان</string>
<string name="accent_blue">ازرق</string>
@ -50,49 +35,72 @@
<string name="category_manager">مدير</string>
<string name="check_updates">تحقق من وجود تحديثات</string>
<string name="chosen_install_values">تفضيلات التثبيت المختارة</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_lang">اللغة/اللغات: %1$s</string>
<string name="chosen_theme">المظهر: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="link_title">إستخدم علامات التبويب المخصصة لكروم</string>
<string name="link_custom_tabs">سيتم فتح الروابط في علامات التبويب المخصصة لـكروم</string>
<string name="clear_files">مسح الملفات التي تم تنزيلها</string>
<string name="cleared_files">تم مسح الملفات بنجاح</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">هذا يتيح لنا جمع معلومات عن أداء التطبيق وسجلات الأعطال</string>
<string name="language_title">Language</string>
<string name="link_title">إستخدم علامات التبويب المخصصة لمتصفح كروم</string>
<string name="link_custom_tabs">سيتم فتح الروابط في علامات التبويب المخصصة لمتصفح كروم</string>
<string name="link_external_browser">سيتم فتح الروابط في متصفح خارجي</string>
<string name="new_installer_title">استخدم مثبت الروت الجديد (تجريبي)</string>
<string name="new_installer_summary">لا تعتمد أداة التثبيت هذه على حالة التحقق من صحة التوقيع. تحذير: قد يختفي Vanced بعد إعادة التشغيل إذا قمت بتثبيته باستخدام هذا</string>
<string name="system_default">System Default</string>
<string name="theme">موضوع اللون</string>
<string name="theme_follow">اتبع النظام</string>
<string name="theme_dark">الموضوع الاسود</string>
<string name="theme_light">موضوع الابيض</string>
<string name="update_url">تحديث رابط القناة</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s الإشعارات</string>
<string name="push_notifications_summary">تلقي الإشعارات عند إصدار تحديث لـ %1$s</string>
<string name="re_check">اعادة التحقق</string>
<string name="update_center">مركز التحديث</string>
<string name="update_found">تم العثور على التحديث!</string>
<string name="update_notfound">لا يوجد تحديثات جديدة</string>
<!-- Dialogs -->
<string name="button_dismiss">إزالة</string>
<string name="guide">المعالج</string>
<string name="hold_on">إنتظر!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">توقف!</string>
<string name="magisk_vanced">يبدو أنك تستخدم إصدار Magisk/TWRP من Vanced، الذي تم إيقافه ولا يمكن تحديثه بإستخدام هذا التطبيق. الرجاء إزالته أولاً عن طريق إزالة وحدة الـ Magisk / بإستخدام أداة إلغاء تثبيت TWRP Vanced.</string>
<string name="miui_one_title">تم اكتشاف MIUI!</string>
<string name="miui_one">مرحباً! يبدو أنك مستخدم MIUI. من أجل استخدام هذا التطبيق بشكل صحيح، يجب عليك تعطيل تحسينات MIUI في إعدادات المطور. (يمكنك تجاهل هذا التحذير بأمان إذا كنت في 20.2.20 أو في وقت لاحق على شكل ROM استناداً إلى xiaomi.eu)</string>
<string name="miui_one">In order to install Vanced, you MUST disable MIUI Optimisations in the developer settings. (You can ignore this warning if you are using 20.2.20 or later xiaomi.eu based ROM)</string>
<string name="error">خطأ</string>
<string name="security_context">عناصر ناأبة</string>
<string name="security_context">Make sure that you downloaded the app from vanced.app, the Vanced Discord server or the Vanced GitHub</string>
<string name="success">نجاح!</string>
<string name="vanced_installed">Vanced تم تثبيته بنجاح! ابدأ الآن؟</string>
<string name="launch">بدء</string>
<string name="vanced_installed">Vanced has successfully been installed! Open now?</string>
<string name="music_installed">Vanced Music has successfully been installed! Open now?</string>
<string name="launch">Open</string>
<string name="welcome">مرحبا
اهلا</string>
<!-- Install Page -->
<string name="choose_preferred_language">اختر اللغة المفضلة لفانسد</string>
<string name="choose_preferred_language">Choose your preferred language(s) for Vanced</string>
<string name="choose_preferred_language_note">لاحظة: اذا قمت تثبيت بأي لغة غير الانجليزية، سيكون اللغة الانجليزية مثبتة بللغة اضافية</string>
<string name="choose_preferred_theme">اختر موضوع اللون المفضلة لفانسد</string>
<string name="disable_signature">تم اكتشاف وضع الجذر! لتثبيت Vanc، سوف تحتاج إلى تعطيل التحقق من توقيع apk.</string>
<string name="finish">نهاية</string>
<string name="install_light_black">ابيض + اسود</string>
<string name="install_light_dark">ابيض + داكن</string>
<string name="next">ثانية</string>
<!-- About Page -->
<string name="manager_dev">مدير ديف</string>
<string name="manager_dev">Manager Devs</string>
<string name="sources">مصادر</string>
<string name="vanced_team">فريق فانسد</string>
<!-- Error messages -->
<string name="chown_fail">Failed To Chown Apk to system owner, Try Again</string>
<string name="error_downloading">خطأ في تحميل %1$s</string>
<string name="failed_uninstall">فشل في الغاء تثبيت الحزمة %1$s</string>
<string name="files_missing_va">Files are missing, Failed Download?</string>
<string name="ifile_missing">Dark/Black.apk Cannot Be Read(Did Storage Get Blocked?) or File Missing</string>
<string name="installation_aborted">فشل التثبيت لأن المستخدم ألغى التثبيت.</string>
<string name="installation_blocked">فشل التثبيت لأن المستخدم قام بحظر التثبيت.</string>
<string name="installation_downgrade">فشل التثبيت لان المستخدم حاول تثبيت اصدار اقدم. قم بحذف التحديثات الخاصيه باليوتيوب الاصلي، ثم حاول مره اخرى</string>
<string name="installation_conflict">فشل التثبيت لأن التطبيق يتعارض مع تطبيق مثبت بالفعل. قم بإلغاء تثبيت الإصدار الحالي من Vanced، ثم حاول مرة أخرى.</string>
<string name="installation_failed">فشل التثبيت لأسباب غير معروفة، انضم إلى تيليجرام أو ديسكورد لمزيد من الدعم.</string>
<string name="installation_incompatible">فشل التثبيت لأن ملف التثبيت غير متوافق مع جهازك. مسح الملفات التي تم تنزيلها في الإعدادات، ثم حاول مرة أخرى.</string>
<string name="installation_invalid">فشل التثبيت لأن ملفات apk تالفة، الرجاء المحاولة مرة أخرى.</string>
<string name="installation_signature">فشل التثبيت بسبب تمكين التحقق من توقيع apk. تعطيل التحقق من توقيع apk، ثم حاول مرة أخرى.</string>
<string name="installation_miui">فشل التثبيت بسبب تمكين تحسين MIUI. تعطيل تحسين MIUI ، ثم حاول مرة أخرى.</string>
<string name="installation_storage">فشل التثبيت بسبب خطأ في التخزين.</string>
<string name="modapk_missing">Black/Dark apk missing from installer, This should not happen, please clear app data of manager</string>
<string name="path_missing">Stock Youtube Install Path Is Not Accessible Or Missing After Stock Split Install</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">পরিবর্তন নথি</string>
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
<string name="error_downloading">Error Downloading %1$s</string>
<string name="install">ইনস্টল</string>
<string name="installing_app">%1$s ইনস্টল করা হচ্ছে</string>
<string name="installation_aborted">Operation failed because the user aborted the installation.</string>
<string name="installation_blocked">Operation failed because the user blocked the installation.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Operation failed because the app conflicts with an already installed app.</string>
<string name="installation_failed">Operation failed for an unknown reason, please join our Telegram or Discord for support.</string>
<string name="installation_incompatible">Operation failed because the app is incompatible with your device.</string>
<string name="installation_invalid">Operation failed because the apk files are invalid.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">An unexpected error occurred while installing Vanced. Have you disabled MIUI Optimisations?</string>
<string name="installation_storage">Operation failed due to a storage error.</string>
<string name="installation_wait">Please wait until the installation finishes</string>
<string name="installation_wait">ইনস্টলেশন শেষ হওয়া পর্যন্ত অপেক্ষা করুন।.</string>
<string name="button_reinstall">পুনঃইনস্টল</string>
<string name="version_installed">ইনস্টলকৃত:</string>
<string name="latest">সর্বশেষ:</string>
<string name="successfully_installed">সফলভাবে ইন্সটলকৃত %1$s</string>
<string name="network_error">Network connection unavailable</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="no_microg">মাইক্রোজি ইনস্টল করা হয়নি</string>
<string name="root_not_granted">রুট অনুমতি দেয়া হয়নি</string>
<string name="unavailable">অনুপলব্ধ</string>
<string name="update">হালনাগাদ</string>
<string name="useful_links">উপকারী লিংক</string>
<string name="website_text">ওয়েবসাইট</string>
<string name="support_us">আমাদের সমর্থন করো!</string>
<string name="version_toast">%1$s সংস্করণ অনুলিপিত!</string>
<string name="version_toast">%1$s সংস্করণ নম্বরটি অনুলিপি করা হয়েছিল!</string>
<!-- Settings -->
<string name="accent_color">রঙের ধরন</string>
<string name="accent_blue">নীল</string>
@ -49,49 +34,72 @@
<string name="category_interface">ইন্টারফেস</string>
<string name="category_manager">ব্যবস্থাপক</string>
<string name="check_updates">হালনাগাদ আছে কিনা দেখো</string>
<string name="chosen_install_values">Chosen installation preferences</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_install_values">নির্বাচিত ইনস্টলেশন পছন্দগুলি</string>
<string name="chosen_lang">ভাষা (গুলি):%1$s</string>
<string name="chosen_theme">থিম: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="link_title">Use Chrome Custom Tabs</string>
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
<string name="link_external_browser">Links will open in an External Browser</string>
<string name="theme">Theme</string>
<string name="theme_follow">Follow System</string>
<string name="theme_dark">Dark Theme</string>
<string name="theme_light">Light Theme</string>
<string name="update_url">Update Channel URL</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="re_check">Re-check</string>
<string name="update_center">Manager Update Center</string>
<string name="update_found">Update found!</string>
<string name="update_notfound">No new updates</string>
<string name="clear_files">ডাউনলোড করা ফাইল সাফ করুন</string>
<string name="cleared_files">সাফল্যের সাথে ফাইলগুলি সাফ করা হয়েছে</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="language_title">Language</string>
<string name="link_title">Chrome কাস্টম ট্যাব ব্যবহার করুন</string>
<string name="link_custom_tabs">লিঙ্কগুলি Chrome কাস্টম ট্যাবগুলিতে খোলা হবে</string>
<string name="link_external_browser">লিঙ্কগুলি একটি বাহ্যিক ব্রাউজারে খুলবে</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">System Default</string>
<string name="theme">থিম</string>
<string name="theme_follow">সিস্টেমকে অনুসরণ করো</string>
<string name="theme_dark">অন্ধকার থিম</string>
<string name="theme_light">হালকা থিম</string>
<string name="update_url">চ্যানেল ইউআরএল আপডেট করুন</string>
<string name="push_notifications">%1$s পুশ বিজ্ঞপ্তি</string>
<string name="push_notifications_summary">%1$s এর জন্য আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তিগুলি পান</string>
<string name="re_check">পুনরায় চেক করুন</string>
<string name="update_center">পরিচালক আপডেট কেন্দ্র Center</string>
<string name="update_found">আপডেট পাওয়া গেল!</string>
<string name="update_notfound">কোনও নতুন আপডেট নেই</string>
<!-- Dialogs -->
<string name="button_dismiss">Dismiss</string>
<string name="guide">সহায়িকা</string>
<string name="hold_on">দাঁড়াও!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">থামো!</string>
<string name="magisk_vanced">আপনি ভ্যানসিডের ম্যাজিক / টিডব্লিউআরপি সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং এই অ্যাপ্লিকেশনটি ব্যবহার করে আপডেট করা যাবে না। দয়া করে Magisk মডিউলটি সরিয়ে / TWRP ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি সরিয়ে দিন।.</string>
<string name="miui_one_title">মিইউআই শনাক্তকৃত!</string>
<string name="miui_one">Hey! it looks like you\'re a MIUI user. in order to properly use this application, you will have to disable MIUI optimisations in the developer settings. (You can safely ignore this warning if you are on a 20.2.20 or later ROM based on xiaomi.eu)</string>
<string name="miui_one">ভ্যানসড ইনস্টল করার জন্য, আপনাকে বিকাশকারী সেটিংসে এমআইইউআই অপটিমাইজেশন অক্ষম করতে হবে। (আপনি যদি 20.2.20 বা তার পরে xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কতাটিকে এড়িয়ে যেতে পারেন)</string>
<string name="error">ত্রুটি</string>
<string name="security_context">Please make sure, that you downloaded the app from vanced.app, the Vanced Discord server or the Vanced GitHub</string>
<string name="security_context">নিশ্চিত হয়ে নিন যে আপনি ভ্যানসিড.এপ, ভ্যানস্যাড ডিসকার্ড সার্ভার বা ভ্যানসেড গিটহাব থেকে অ্যাপটি ডাউনলোড করেছেন</string>
<string name="success">সফলতা!</string>
<string name="vanced_installed">Vanced has successfully been installed! Launch now?</string>
<string name="launch">শুরু করো</string>
<string name="vanced_installed">ভ্যান্সড সফলভাবে ইনস্টল করা হয়েছে! এখন খোল?</string>
<string name="music_installed">ভ্যান্সড মিউজিক সফলভাবে ইনস্টল করা হয়েছে! এখন খোল?</string>
<string name="launch">খোলা</string>
<string name="welcome">স্বাগতম</string>
<!-- Install Page -->
<string name="choose_preferred_language">Choose your preferred language for Vanced</string>
<string name="choose_preferred_language_note">Note: English will always be installed as an additional language as well.</string>
<string name="choose_preferred_theme">Choose your preferred theme for Vanced</string>
<string name="disable_signature">Root mode detected! To install Vanced, you will need to disable the apk signature verification.</string>
<string name="choose_preferred_language">ভ্যানসডের জন্য আপনার পছন্দসই ভাষা (গুলি) চয়ন করুন</string>
<string name="choose_preferred_language_note">দ্রষ্টব্য: ইংরেজি সর্বদা অতিরিক্ত ভাষা হিসাবে ইনস্টল করা হবে।.</string>
<string name="choose_preferred_theme">ভ্যান্সডের জন্য আপনার পছন্দসই থিমটি চয়ন করুন</string>
<string name="finish">শেষ</string>
<string name="install_light_black">আলো + কালো</string>
<string name="install_light_dark">আলো + অন্ধকার</string>
<string name="next">পরেরটা</string>
<!-- About Page -->
<string name="manager_dev">Manager Dev</string>
<string name="manager_dev">পরিচালক বিকাশকারী</string>
<string name="sources">সূত্রসমূহ</string>
<string name="vanced_team">ভান্সড দল</string>
<!-- Error messages -->
<string name="chown_fail">সিস্টেমের মালিককে এপিকে ছাওয়াতে ব্যর্থ, আবার চেষ্টা করুন</string>
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
<string name="failed_uninstall">প্যাকেজ %1$s আনইনস্টল করতে ব্যর্থ</string>
<string name="files_missing_va">ফাইলগুলি অনুপস্থিত, ডাউনলোড ব্যর্থ হয়েছে?</string>
<string name="ifile_missing">ডার্ক / ব্ল্যাক.এপকে পড়া যায় না (স্টোরেজ ব্লক হয়ে গেছে?) বা ফাইল মিসিং Miss</string>
<string name="installation_aborted">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারীরা ইনস্টলেশনটি বাতিল করে দিয়েছেন।.</string>
<string name="installation_blocked">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারীরা ইনস্টলেশনটি অবরুদ্ধ করেছেন।.</string>
<string name="installation_downgrade">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করেছিল। স্টক ইউটিউব অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="installation_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব রয়েছে ts ভান্সডের বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="installation_failed">অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন।.</string>
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের সাথে বেমানান। সেটিংসে ডাউনলোড করা ফাইল সাফ করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="installation_invalid">অ্যাপ্লিকেশন ব্যর্থ হয়েছে কারণ এপিপি ফাইলগুলি দূষিত হয়েছে, দয়া করে আবার চেষ্টা করুন।.</string>
<string name="installation_signature">Installation failed because apk signature verification is enabled. Disable apk signature verification, then try again.</string>
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম রয়েছে। MIUI অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।.</string>
<string name="installation_storage">স্টোরেজ ত্রুটির কারণে ইনস্টলেশন ব্যর্থ হয়েছে।.</string>
<string name="modapk_missing">ইনস্টলারের কাছ থেকে কালো / গাark় এপিপি অনুপস্থিত, এটি হওয়া উচিত নয়, দয়া করে ম্যানেজারের অ্যাপ্লিকেশন ডেটা সাফ করুন</string>
<string name="path_missing">স্টক ইউটিউব ইনস্টল করার পথটি অ্যাক্সেসযোগ্য নয় বা স্টক স্প্লিট ইনস্টলের পরে অনুপস্থিত</string>
</resources>

View file

@ -5,93 +5,101 @@
<string name="reset">রিসেট করুন</string>
<string name="save">সেভ করুন</string>
<!-- Main Activity -->
<string name="title_about">সম্বন্ধ</string>
<string name="title_home">Home</string>
<string name="title_settings">Settings</string>
<string name="title_about">সম্পর্ক</string>
<string name="title_home">হোম</string>
<string name="title_settings">সেটিংস</string>
<!-- Home Page -->
<string name="changelogs">Changelogs</string>
<string name="downloading_file">Downloading %1$s</string>
<string name="failed_uninstall">Failed to uninstall package %1$s</string>
<string name="error_downloading">Error Downloading %1$s</string>
<string name="install">Install</string>
<string name="installing_app">Installing %1$s</string>
<string name="installation_aborted">Operation failed because the user aborted the installation.</string>
<string name="installation_blocked">Operation failed because the user blocked the installation.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Operation failed because the app conflicts with an already installed app.</string>
<string name="installation_failed">Operation failed for an unknown reason, please join our Telegram or Discord for support.</string>
<string name="installation_incompatible">Operation failed because the app is incompatible with your device.</string>
<string name="installation_invalid">Operation failed because the apk files are invalid.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">An unexpected error occurred while installing Vanced. Have you disabled MIUI Optimisations?</string>
<string name="installation_storage">Operation failed due to a storage error.</string>
<string name="installation_wait">Please wait until the installation finishes</string>
<string name="button_reinstall">Reinstall</string>
<string name="version_installed">Installed:</string>
<string name="latest">Latest:</string>
<string name="successfully_installed">Successfully installed %1$s</string>
<string name="network_error">Network connection unavailable</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="root_not_granted">Root access not granted</string>
<string name="unavailable">Unavailable</string>
<string name="update">Update</string>
<string name="useful_links">Useful Links</string>
<string name="website_text">Website</string>
<string name="support_us">Support us!</string>
<string name="version_toast">%1$s version was copied!</string>
<string name="changelogs">পরিবর্তন নথি</string>
<string name="downloading_file">%1$s ডাউনলোড করা হচ্ছে</string>
<string name="install">ইনস্টল</string>
<string name="installation_wait">ইনস্টলেশন শেষ হওয়া পর্যন্ত অপেক্ষা করুন।</string>
<string name="button_reinstall">পুনরায় ইনস্টল করুন</string>
<string name="version_installed">ইনস্টল হয়েছে:</string>
<string name="latest">সর্বশেষ:</string>
<string name="no_microg">মাইক্রোজি ইনস্টল করা নেই</string>
<string name="root_not_granted">রুট অ্যাক্সেস দেওয়া হয়নি</string>
<string name="unavailable">অনুপলব্ধ</string>
<string name="update">হালনাগাদ</string>
<string name="useful_links">উপকারী লিংকসমূহ</string>
<string name="website_text">ওয়েবসাইট</string>
<string name="support_us">আমাদের সমর্থন করুন!</string>
<string name="version_toast">%1$s সংস্করণ নম্বরটি অনুলিপি করা হয়েছিল!</string>
<!-- Settings -->
<string name="accent_color">Accent Color</string>
<string name="accent_blue">Blue</string>
<string name="accent_green">Green</string>
<string name="accent_purple">Purple</string>
<string name="accent_red">Red</string>
<string name="accent_yellow">Yellow</string>
<string name="category_interface">Interface</string>
<string name="category_manager">Manager</string>
<string name="check_updates">Check for updates</string>
<string name="chosen_install_values">Chosen installation preferences</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_theme">Theme: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="link_title">Use Chrome Custom Tabs</string>
<string name="link_custom_tabs">Links will open in Chrome Custom Tabs</string>
<string name="link_external_browser">Links will open in an External Browser</string>
<string name="theme">Links will open in an External Browser</string>
<string name="theme_follow">Follow System</string>
<string name="theme_dark">Dark Theme</string>
<string name="theme_light">Light Theme</string>
<string name="update_url">Update Channel URL</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="re_check">রি-চেক</string>
<string name="update_center">পরিচালক আপডেট কেন্দ্র Center</string>
<string name="accent_color">অ্যাকসেন্ট রঙ</string>
<string name="accent_blue">নীল</string>
<string name="accent_green">সবুজ</string>
<string name="accent_purple">বেগুনি</string>
<string name="accent_red">লাল</string>
<string name="accent_yellow">হলুদ</string>
<string name="category_interface">ইন্টারফেস</string>
<string name="category_manager">ম্যানেজার</string>
<string name="check_updates">হালনাগাদ এর জন্য অনুসন্ধান করুন</string>
<string name="chosen_install_values">নির্বাচিত ইনস্টলেশন পছন্দগুলি</string>
<string name="chosen_lang">ভাষা(গুলি): %1$s</string>
<string name="chosen_theme">থিম: %1$s</string>
<string name="clear_files">ডাউনলোড করা ফাইলগুলি মুছে ফেলুন</string>
<string name="cleared_files">সফলভাবে ফাইলগুলি মুছে ফেলা হয়েছে</string>
<string name="firebase_title">ফায়ারবেস বিশ্লেষণ</string>
<string name="firebase_summary">এটি আমাদের অ্যাপ্লিকেশন কর্মক্ষমতা এবং ক্র্যাশ লগ সম্পর্কিত তথ্য সংগ্রহ করতে দেয়</string>
<string name="language_title">ভাষা</string>
<string name="link_title">ক্রোম কাস্টম ট্যাবস ব্যবহার করুন</string>
<string name="link_custom_tabs">লিঙ্কগুলি ক্রোম কাস্টম ট্যাবসে খুলবে</string>
<string name="link_external_browser">লিঙ্কগুলি একটি বাহ্যিক ব্রাউজারে খুলবে</string>
<string name="new_installer_title">নতুন রুট ইনস্টলার ব্যবহার করুন (পরীক্ষামূলক)</string>
<string name="new_installer_summary">এই ইনস্টলারটি এপিকে স্বাক্ষর যাচাইকরণের স্থিতির উপর নির্ভর করে না। সতর্কতা: এটি ব্যবহার করে ভ্যান্সড ইনস্টল করা হলে, রিবুটের পর ভ্যান্সড মুছে যেতে পারে</string>
<string name="system_default">সিস্টেমের ডিফল্ট</string>
<string name="theme">থিম</string>
<string name="theme_follow">সিস্টেমকে অনুসরণ করুন</string>
<string name="theme_dark">অন্ধকার থিম</string>
<string name="theme_light">হালকা থিম</string>
<string name="update_url">চ্যানেল ইউআরএল হালনাগাদ করুন</string>
<string name="push_notifications">%1$s পুশ নোটিফিকেশনগুলি</string>
<string name="push_notifications_summary">%1$s এর আপডেট প্রকাশিত হলে পুশ বিজ্ঞপ্তিগুলি পান</string>
<string name="re_check">পুনরায় চেক করুন</string>
<string name="update_center">পরিচালক আপডেট কেন্দ্র</string>
<string name="update_found">আপডেট পাওয়া গেল!</string>
<string name="update_notfound">কোনও নতুন আপডেট নেই</string>
<string name="update_notfound">কোন নতুন আপডেট নেই</string>
<!-- Dialogs -->
<string name="button_dismiss">খারিজ করা</string>
<string name="guide">গাইড</string>
<string name="hold_on">অপেক্ষা কর!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="miui_one_title">MIUI সনাক্ত!</string>
<string name="miui_one">হে! দেখে মনে হচ্ছে তুমি আ MIUI ব্যবহারকারী। এই অ্যাপ্লিকেশনটি সঠিকভাবে ব্যবহার করতে আপনাকে নিষ্ক্রিয় করতে হবে MIUI বিকাশকারী সেটিংসে অপ্টিমেশন। (আপনি যদি থাকেন তবে আপনি নিরাপদে এই সতর্কতাটিকে উপেক্ষা করতে পারেন 20.2.20 অথবা পরে ROM ভিত্তিক xiaomi.eu)</string>
<string name="guide">সহায়িকা</string>
<string name="hold_on">থামুন!</string>
<string name="magisk_vanced">আপনি ভ্যান্সড ম্যাজিস্ক/টিডব্লিউআরপি সংস্করণ ব্যবহার করছেন যা বন্ধ হয়ে গেছে এবং এই অ্যাপ্লিকেশনটি ব্যবহার করে হালনাগাদ করতে পারবেন না। দয়া করে ম্যাজিস্ক মডিউলটি সরিয়ে/ টিডব্লিউআরপি ভ্যান্সড আনইনস্টলার ব্যবহার করে এটি মুছে ফেলুন।</string>
<string name="miui_one_title">মিআইইউআই শনাক্তকৃত!</string>
<string name="miui_one">ভ্যান্সড ইনস্টল করার জন্য, আপনাকে বিকাশকারী সেটিংসে এমআইইউআই অপটিমাইজেশন অক্ষম করতে হবে। (আপনি যদি ২০.২.২০ বা তার পরে xiaomi.eu ভিত্তিক রম ব্যবহার করেন তবে আপনি এই সতর্কতাটিকে এড়িয়ে যেতে পারেন)</string>
<string name="error">ত্রুটি</string>
<string name="security_context">দয়া করে নিশ্চিত হন, আপনি যে অ্যাপটি ডাউনলোড করেছেন তা থেকে vanced.app, Vanced Discord server অথবা Vanced GitHub</string>
<string name="security_context">নিশ্চিত করুন যে আপনি অ্যাপটি vanced.app, ভ্যান্সড ডিসকার্ড সার্ভার বা ভ্যান্সড গিটহাব থেকে ডাউনলোড করেছেন</string>
<string name="success">সফল!</string>
<string name="vanced_installed">Vanced সফলভাবে ইনস্টল করা হয়েছে! এখন আরম্ভ?</string>
<string name="launch">শুরু করা</string>
<string name="vanced_installed">ভ্যান্সড সফলভাবে ইনস্টল করা হয়েছে! এখন চালু করুন?</string>
<string name="music_installed">ভ্যান্সড মিউজিক সফলভাবে ইনস্টল করা হয়েছে! এখন খুলুন?</string>
<string name="launch">খুলুন</string>
<string name="welcome">স্বাগত</string>
<!-- Install Page -->
<string name="choose_preferred_language">র জন্য আপনার পছন্দসই ভাষা চয়ন করুন Vanced</string>
<string name="choose_preferred_language">ভ্যান্সডের জন্য আপনার পছন্দসই ভাষা(গুলি) চয়ন করুন</string>
<string name="choose_preferred_language_note">দ্রষ্টব্য: ইংরেজি সর্বদা অতিরিক্ত ভাষা হিসাবে ইনস্টল করা হবে।</string>
<string name="choose_preferred_theme">এর জন্য আপনার পছন্দসই থিমটি চয়ন করুন Vanced</string>
<string name="disable_signature">রুট মোড সনাক্ত! স্থাপন করা Vanced, আপনি অক্ষম করতে হবে apk স্বাক্ষর যাচাইকরণ।.</string>
<string name="choose_preferred_theme">ভান্সডের জন্য আপনার পছন্দসই থিমটি চয়ন করুন</string>
<string name="finish">শেষ</string>
<string name="install_light_black">হালকা + কালো</string>
<string name="install_light_dark">হালকা + গাark</string>
<string name="install_light_dark">হালকা + অন্ধকার</string>
<string name="next">পরবর্তী</string>
<!-- About Page -->
<string name="manager_dev">ম্যানেজার দেব</string>
<string name="sources">সোর্স</string>
<string name="vanced_team">Vanced টীম</string>
<string name="manager_dev">ম্যানেজার বিকাশকারীরা</string>
<string name="sources">উৎসগুলি</string>
<string name="vanced_team">ভান্সড টীম</string>
<!-- Error messages -->
<string name="chown_fail">সিস্টেমের মালিককে এপিকে chown করতে ব্যর্থ, আবার চেষ্টা করুন</string>
<string name="error_downloading">%1$s ডাউনলোড করার সময় ত্রুটি</string>
<string name="failed_uninstall">%1$s পেকেজ আন‌ইনস্টল করা যাইনি</string>
<string name="files_missing_va">ফাইলগুলি অনুপস্থিত, ডাউনলোড ব্যর্থ হয়েছে?</string>
<string name="ifile_missing">অন্ধকার/কালো এপিকে পড়া যাচ্ছে না (স্টোরেজ ব্লক হয়ে গেছে?) বা ফাইলটি নেই</string>
<string name="installation_aborted">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী ইনস্টলেশনটি বাতিল করে দিয়েছেন।</string>
<string name="installation_blocked">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী ইনস্টলেশন অবরুদ্ধ করেছেন।</string>
<string name="installation_downgrade">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ব্যবহারকারী প্যাকেজটি ডাউনগ্রেড করার চেষ্টা করছিলেন। স্টক ইউটিউব অ্যাপ্লিকেশন থেকে আপডেটগুলি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_conflict">ইনস্টলেশন ব্যর্থ হয়েছে কারণ অ্যাপ্লিকেশনটি ইতিমধ্যে ইনস্টল হওয়া আরেকটি অ্যাপ্লিকেশানের সাথে দ্বন্দ্ব করছে। ভান্সডের বর্তমান সংস্করণটি আনইনস্টল করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_failed">অজানা কারণে ইনস্টলেশন ব্যর্থ হয়েছে, আরও সহায়তার জন্য আমাদের টেলিগ্রাম বা ডিসকর্ডে যোগ দিন।</string>
<string name="installation_incompatible">ইনস্টলেশন ব্যর্থ হয়েছে কারণ ইনস্টলেশন ফাইলটি আপনার ডিভাইসের উপযুক্ত নয়। সেটিংসে ডাউনলোড করা ফাইল মুছে ফেলুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_invalid">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে ফাইলগুলি দূষিত, দয়া করে আবার চেষ্টা করুন।</string>
<string name="installation_signature">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এপিকে স্বাক্ষর যাচাইকরণ সক্ষম করা আছে। এপিকে স্বাক্ষর যাচাইকরণ অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_miui">ইনস্টলেশন ব্যর্থ হয়েছে কারণ এমআইইউআই অপটিমাইজেশন সক্ষম আছে। এমআইইউআই অপ্টিমাইজেশন অক্ষম করুন, তারপরে আবার চেষ্টা করুন।</string>
<string name="installation_storage">স্টোরেজ ত্রুটির কারণে ইনস্টলেশন ব্যর্থ হয়েছে।</string>
<string name="modapk_missing">ইনস্টলারের থেকে কালো/অন্ধকার এপিকে অনুপস্থিত, এটি হওয়া উচিত নয়, দয়া করে ম্যানেজারের অ্যাপ্লিকেশন ডেটা সাফ করুন</string>
<string name="path_missing">স্টক ইউটিউব ইনস্টল করার পথটি প্রবেশযোগ্য নয় বা স্টক স্প্লিট ইনস্টলের পরে অনুপস্থিত</string>
</resources>

View file

@ -11,27 +11,12 @@
<!-- Home Page -->
<string name="changelogs">Registres de canvis</string>
<string name="downloading_file">Descarregant %1$s</string>
<string name="failed_uninstall">Error en instal·lar el paquet %1$s</string>
<string name="error_downloading">Error en descarregar %1$s</string>
<string name="install">Instal·lar</string>
<string name="installing_app">Instal·lant %1$s</string>
<string name="installation_aborted">L\'operació ha fallat perquè l\'usuari ha cancel·lat la instal·lació.</string>
<string name="installation_blocked">L\'operació ha fallat perquè l\'usuari ha blocat la instal·lació.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">L\'operació ha fallat perquè l\'aplicació coincideix amb altra ja instal·lada.</string>
<string name="installation_failed">L\'operació ha fallat per una raó desconeguda, si us plau, uniu-se al Telegram o al Discord per rebre suport tècnic.</string>
<string name="installation_incompatible">L\'operació ha fallat perquè l\'aplicació és incompatible amb el vostre dispositiu.</string>
<string name="installation_invalid">L\'operació ha fallat perquè els fitxers apk són invàlids.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">S\'ha produït un error inesperat mentre s\'instal·lava Vanced. Heu desactivat les optimitzacions de MIUI?</string>
<string name="installation_storage">L\'operació ha fallat degut a un error d\'emmagatzematge.</string>
<string name="installation_wait">Espereu fins que es completi la instal·lació</string>
<string name="installation_wait">Espereu fins que es completi la instal·lació.</string>
<string name="button_reinstall">Reinstal·la</string>
<string name="version_installed">Instal·lat:</string>
<string name="latest">Darrera:</string>
<string name="successfully_installed">Instal·lat amb èxit %1$s</string>
<string name="network_error">No hi ha connexió a xarxa disponible</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="no_microg">microG no està instal·lat</string>
<string name="root_not_granted">L\'accés arrel no s\'ha concedit</string>
<string name="unavailable">No disponible</string>
<string name="update">Actualitza</string>
@ -50,48 +35,71 @@
<string name="category_manager">Gestor</string>
<string name="check_updates">Busca actualitzacions</string>
<string name="chosen_install_values">Preferències d\'instal·lació triades</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_lang">Idioma: %1$s</string>
<string name="chosen_theme">Tema: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="clear_files">Esborrar fitxers descarregats</string>
<string name="cleared_files">Fitxers netejats correctament</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="language_title">Language</string>
<string name="link_title">Utilitza pestanyes personalitzades del Chrome</string>
<string name="link_custom_tabs">Els enllaços s\'obriran en pestanyes personalitzades del Chrome</string>
<string name="link_external_browser">Els enllaços s\'obriran en un navegador extern</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">System Default</string>
<string name="theme">Tema</string>
<string name="theme_follow">Segueix el sistema</string>
<string name="theme_dark">Tema fosc</string>
<string name="theme_light">Tema clar</string>
<string name="update_url">Actualitza la URL del canal</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s notificacions automàtiques</string>
<string name="push_notifications_summary">Rebeu notificacions automàtiques quan es publiqui una actualització de%1$s</string>
<string name="re_check">Comprovar de nou</string>
<string name="update_center">Gestor d\'actualitzacions</string>
<string name="update_found">Actualització disponible!</string>
<string name="update_notfound">Cap actualització</string>
<!-- Dialogs -->
<string name="button_dismiss">Descartar</string>
<string name="guide">Guia</string>
<string name="hold_on">Espereu!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">Atura!</string>
<string name="magisk_vanced">Esteu utilitzant la versió Magisk / TWRP de Vanced, que està descatalogada i no es pot actualitzar mitjançant aquesta aplicació. Elimineu-lo traient el mòdul magisk / utilitzant el programa de desinstal·lació de TWRP Vanced.</string>
<string name="miui_one_title">MIUI detectat!</string>
<string name="miui_one">Sembla que sou un usuari de MIUI. Per a utilitzar aquesta aplicació, heu de desactivar les optimitzacions de MIUI en la configuració de desenvolupadors. (Podeu ignorar aquest avís si teniu la ROM 20.2.20 o posteriors de xiaomi.eu.)</string>
<string name="miui_one">Per instal·lar Vanced, heu de desactivar les optimitzacions MIUI a la configuració del desenvolupador. (Podeu ignorar aquest advertiment si feu servir la ROM basada en xiaomi.eu 20.2.20 o posterior)</string>
<string name="error">Error</string>
<string name="security_context">Comproveu que heu descarregat l\'aplicació des de vanced.app, el servidor Discord de Vanced o el GitHub de Vanced</string>
<string name="security_context">Assegureu-vos que heu baixat laplicació des de vanced.app, el servidor Vanced Discord o el Vanced GitHub</string>
<string name="success">Èxit!</string>
<string name="vanced_installed">Vanced s\'ha instal·lat correctament. Obrir?</string>
<string name="launch">Launch</string>
<string name="welcome">Welcome</string>
<string name="vanced_installed">Vanced s\'ha instal·lat correctament. Obert ara?</string>
<string name="music_installed">Vanced Music s\'ha instal·lat correctament. Obert ara?</string>
<string name="launch">Obert</string>
<string name="welcome">Benvingut</string>
<!-- Install Page -->
<string name="choose_preferred_language">Choose your preferred language for Vanced</string>
<string name="choose_preferred_language_note">Note: English will always be installed as an additional language as well.</string>
<string name="choose_preferred_theme">Choose your preferred theme for Vanced</string>
<string name="disable_signature">Root mode detected! To install Vanced, you will need to disable the apk signature verification.</string>
<string name="finish">Finish</string>
<string name="install_light_black">Light + Black</string>
<string name="install_light_dark">Light + Dark</string>
<string name="next">Next</string>
<string name="choose_preferred_language">Trieu els vostres idiomes preferits per a Vanced</string>
<string name="choose_preferred_language_note">Nota: l\'anglès també s\'instal·larà sempre com a idioma addicional.</string>
<string name="choose_preferred_theme">Trieu el vostre tema preferit per a Vanced</string>
<string name="finish">Finalitzar</string>
<string name="install_light_black">Clar + Negre</string>
<string name="install_light_dark">Clar + Fosc</string>
<string name="next">Pròxim</string>
<!-- About Page -->
<string name="manager_dev">Manager Dev</string>
<string name="sources">Sources</string>
<string name="vanced_team">Vanced Team</string>
<string name="manager_dev">Gestor de desenvolupadors</string>
<string name="sources">Fonts</string>
<string name="vanced_team">Equip avançat</string>
<!-- Error messages -->
<string name="chown_fail">No s\'ha pogut suprimir l\'App al propietari del sistema. Torneu-ho a provar</string>
<string name="error_downloading">Error en descarregar %1$s</string>
<string name="failed_uninstall">Error en instal·lar el paquet %1$s</string>
<string name="files_missing_va">Falten fitxers, no s\'ha pogut baixar?</string>
<string name="ifile_missing">Dark / Black.apk no es pot llegir (lemmagatzematge es va bloquejar?) O falta un fitxer</string>
<string name="installation_aborted">La instal·lació ha fallat perquè l\'usuari ha interromput la instal·lació.</string>
<string name="installation_blocked">La instal·lació ha fallat perquè l\'usuari ha bloquejat la instal·lació.</string>
<string name="installation_downgrade">La instal·lació ha fallat perquè l\'usuari ha intentat actualitzar el paquet. Desinstal·leu les actualitzacions de l\'aplicació YouTube existent i torneu-ho a provar.</string>
<string name="installation_conflict">La instal·lació ha fallat perquè l\'aplicació entra en conflicte amb una aplicació ja instal·lada. Desinstal·leu la versió actual de Vanced i torneu-ho a provar.</string>
<string name="installation_failed">La instal·lació ha fallat per motius desconeguts. Uniu-vos al nostre Telegram o Discord per obtenir més assistència.</string>
<string name="installation_incompatible">La instal·lació ha fallat perquè el fitxer d\'instal·lació és incompatible amb el dispositiu. Esborreu els fitxers descarregats a Configuració i torneu-ho a provar.</string>
<string name="installation_invalid">La instal·lació ha fallat perquè els fitxers apk estan danyats. Torneu-ho a provar.</string>
<string name="installation_signature">La instal·lació ha fallat perquè la verificació de la signatura apk està activada. Desactiveu la verificació de la signatura apk i torneu-ho a provar.</string>
<string name="installation_miui">La instal·lació ha fallat perquè l\'optimització MIUI està activada. Desactiveu l\'optimització MIUI i torneu-ho a provar.</string>
<string name="installation_storage">La instal·lació ha fallat a causa d\'un error d\'emmagatzematge.</string>
<string name="modapk_missing">Falta lapk Black / Dark a linstal·lador. Això no hauria de passar, esborreu les dades de laplicació del gestor</string>
<string name="path_missing">El camí dinstal·lació de Youtube destoc no és accessible ni falta després de la instal·lació dividida destoc</string>
</resources>

View file

@ -11,26 +11,11 @@
<!-- Home Page -->
<string name="changelogs">Seznamy změn</string>
<string name="downloading_file">Stahování %1$s</string>
<string name="failed_uninstall">Nepodařilo se odinstalovat balíček %1$s</string>
<string name="error_downloading">Chyba při stahování %1$s</string>
<string name="install">Instalace</string>
<string name="installing_app">Probíhá instalace %1$s</string>
<string name="installation_aborted">Operace se nezdařila, protože uživatel přerušil instalaci.</string>
<string name="installation_blocked">Operace se nezdařila, protože uživatel zablokoval instalaci.</string>
<string name="installation_downgrade">Operace se nezdařila, protože se uživatel pokusil downgradovat balíček. Máte nainstalovánu standardní aplikaci YouTube?</string>
<string name="installation_conflict">Operace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací.</string>
<string name="installation_failed">Operace se nezdařila z neznámého důvodu. Pro podporu se připojte k našemu Telegramu nebo Discordu.</string>
<string name="installation_incompatible">Operace se nezdařila, protože aplikace není kompatibilní s vaším zařízením.</string>
<string name="installation_invalid">Operace se nezdařila, protože soubory APK jsou neplatné.</string>
<string name="installation_signature">Operace se nezdařila, protože uživatel nezakázal ověření podpisu APK</string>
<string name="installation_miui">Při instalaci aplikace Vanced došlo k neočekávané chybě. Máte vypnuty optimalizace MIUI?</string>
<string name="installation_storage">Operace se nezdařila z důvodu chyby v úložišti.</string>
<string name="installation_wait">Počkejte prosím na dokončení instalace</string>
<string name="installation_wait">Počkejte prosím na dokončení instalace.</string>
<string name="button_reinstall">Přeinstalovat</string>
<string name="version_installed">Nainstalováno:</string>
<string name="latest">Nejnovější:</string>
<string name="successfully_installed">Úspěšně nainstalováno %1$s</string>
<string name="network_error">Nelze se připojit k Internetu</string>
<string name="no_microg">microG není nainstalováno</string>
<string name="root_not_granted">Root přístup nebyl udělen</string>
<string name="unavailable">Není k dispozici</string>
@ -38,7 +23,7 @@
<string name="useful_links">Užitečné odkazy</string>
<string name="website_text">Webová stránka</string>
<string name="support_us">Podpořte nás!</string>
<string name="version_toast">Verze %1$s byla zkopírována!</string>
<string name="version_toast">Verze číslo %1$s byla zkopírována!</string>
<!-- Settings -->
<string name="accent_color">Doplňková barva</string>
<string name="accent_blue">Modrá</string>
@ -54,9 +39,15 @@
<string name="chosen_theme">Vzhled: %1$s</string>
<string name="clear_files">Vymazat stažené soubory</string>
<string name="cleared_files">Vymazání souborů proběhlo úspěšně</string>
<string name="firebase_title">Firebase analytika</string>
<string name="firebase_summary">To nám umožňuje shromažďovat informace o výkonu aplikace a o protokolech o selhání</string>
<string name="language_title">Jazyk</string>
<string name="link_title">Používat vlastní karty prohlížeče Chrome</string>
<string name="link_custom_tabs">Odkazy se otevřou na vlastních kartách prohlížeče Chrome</string>
<string name="link_external_browser">Odkazy se otevřou v externím prohlížeči</string>
<string name="new_installer_title">Použít nový instalátor vyžadující root (experimentální)</string>
<string name="new_installer_summary">Tento instalační program není závislý na stavu ověření podpisu. VAROVÁNÍ: Pokud nainstalujete Vanced pomocí tohoto programu, může po restartu zmizet</string>
<string name="system_default">Výchozí systémové nastavení</string>
<string name="theme">Vzhled</string>
<string name="theme_follow">Podle systému</string>
<string name="theme_dark">Tmavý vzhled</string>
@ -69,29 +60,46 @@
<string name="update_found">Nalezena aktualizace!</string>
<string name="update_notfound">Žádné nové aktualizace</string>
<!-- Dialogs -->
<string name="button_dismiss">Zavřít</string>
<string name="guide">Návod</string>
<string name="hold_on">Počkejte!</string>
<string name="magisk_vanced">Vypadá to, že používáte verzi Vanced pro Magisk/TWRP, která je ukončena a pomocí této aplikace ji nelze aktualizovat. Nejprve ji odstraňte odinstalací modulu Magisk/použitím Vanced odinstalátoru v TWRP.</string>
<string name="hold_on">Zastavit!</string>
<string name="magisk_vanced">Používáte verzi Vanced pro Magisk/TWRP, která je ukončena a pomocí této aplikace ji nelze aktualizovat. Nejprve ji odstraňte odinstalací modulu Magisk/použitím Vanced odinstalátoru v TWRP.</string>
<string name="miui_one_title">Zjištěno MIUI!</string>
<string name="miui_one">Ahoj! Vypadá to, že používáte MIUI. Abyste mohli správně používat tuto aplikaci, budete muset vypnout optimalizaci MIUI v nastavení pro vývojáře. (Toto varování můžete bezpečně ignorovat, pokud máte ROM z 20.2.2020 nebo pozdější, založenou na xiaomi.eu)</string>
<string name="miui_one">Chcete-li nainstalovat Vanced, MUSÍTE vypnout optimalizaci MIUI v nastavení pro vývojáře. (Toto varování můžete ignorovat, pokud používáte ROM z 20.2.2020 nebo novější založenou na xiaomi.eu)</string>
<string name="error">Chyba</string>
<string name="security_context">Prosím ujistěte se, že jste si aplikaci stáhli z našeho webu vanced.app, z našeho Discord serveru nebo našeho GitHubu.</string>
<string name="security_context">Ujistěte se, že jste si aplikaci stáhli z našeho webu vanced.app, z našeho Discord serveru nebo našeho GitHubu</string>
<string name="success">Hotovo!</string>
<string name="vanced_installed">Aplikace Vanced byla úspěšně nainstalována! Chcete ji spustit?</string>
<string name="launch">Spustit</string>
<string name="vanced_installed">Aplikace Vanced byla úspěšně nainstalována! Chcete ji otevřít?</string>
<string name="music_installed">Aplikace Vanced Music byla úspěšně nainstalována! Chcete ji otevřít?</string>
<string name="launch">Otevřít</string>
<string name="welcome">Vítejte</string>
<!-- Install Page -->
<string name="choose_preferred_language">Vyberte preferovaný jazyk pro Vanced</string>
<string name="choose_preferred_language_note">Poznámka: Angličtina bude vždy nainstalována jako dodatečný jazyk.</string>
<string name="choose_preferred_theme">Vyberte preferovaný vzhled pro Vanced</string>
<string name="disable_signature">Byl zjištěn režim root! Chcete-li nainstalovat Vanced, budete muset vypnout ověření podpisu APK.</string>
<string name="finish">Dokončit</string>
<string name="install_light_black">Světlý + černý</string>
<string name="install_light_dark">Světlý + tmavý</string>
<string name="next">Další</string>
<!-- About Page -->
<string name="manager_dev">Vývojář aplikace</string>
<string name="manager_dev">Vývojáři aplikace</string>
<string name="sources">Zdrojové kódy</string>
<string name="vanced_team">Tým Vanced</string>
<!-- Error messages -->
<string name="chown_fail">Vlastníka APK se nepodařilo změnit, zkuste to znovu</string>
<string name="error_downloading">Chyba při stahování %1$s</string>
<string name="failed_uninstall">Nepodařilo se odinstalovat balíček %1$s</string>
<string name="files_missing_va">Chybí soubory. Stahování se nezdařilo?</string>
<string name="ifile_missing">Soubor dark/black.apk nelze přečíst (je blokováno úložiště?) nebo soubor chybí</string>
<string name="installation_aborted">Instalace se nezdařila, protože uživatel přerušil instalaci.</string>
<string name="installation_blocked">Instalace se nezdařila, protože uživatel zablokoval instalaci.</string>
<string name="installation_downgrade">Instalace se nezdařila, protože se uživatel pokusil balíček downgradovat. Odinstalujte aktualizace z výchozí aplikace YouTube a zkuste to znovu.</string>
<string name="installation_conflict">Instalace se nezdařila, protože aplikace je v konfliktu s již nainstalovanou aplikací. Odinstalujte aktuální verzi aplikace a zkuste to znovu.</string>
<string name="installation_failed">Instalace se nezdařila z neznámých důvodů. Pro podporu se připojte k našemu Telegramu nebo Discordu.</string>
<string name="installation_incompatible">Instalace se nezdařila, protože instalační soubor není kompatibilní s vaším zařízením. Vymažte stažené soubory v Nastavení a zkuste to znovu.</string>
<string name="installation_invalid">Instalace se nezdařila, protože soubory APK jsou poškozeny. Zkuste to znovu.</string>
<string name="installation_signature">Instalace se nezdařila, protože je povoleno ověření podpisu APK. Zakažte ověření podpisu APK a zkuste to znovu.</string>
<string name="installation_miui">Instalace se nezdařila, protože je zapnuta optimalizace MIUI. Vypněte optimalizaci MIUI a zkuste to znovu.</string>
<string name="installation_storage">Instalace se nezdařila z důvodu chyby v úložišti.</string>
<string name="modapk_missing">V instalačním souboru chybí black/dark.apk. To by se nemělo stát. Vymažte prosím data aplikace Vanced Manager</string>
<string name="path_missing">Cesta instalace výchozí aplikace YouTube není k dispozici nebo chybí po instalaci rozdělení systému</string>
</resources>

View file

@ -11,26 +11,11 @@
<!-- Home Page -->
<string name="changelogs">Changelogs</string>
<string name="downloading_file">Downloader %1$s</string>
<string name="failed_uninstall">Fejlede i at fjerne pakke %1$s</string>
<string name="error_downloading">Fejl i download af %1$s</string>
<string name="install">Installer</string>
<string name="installing_app">Installerer %1$s</string>
<string name="installation_aborted">Operationen fejlede fordi brugeren lukkede installationen.</string>
<string name="installation_blocked">Operationen fejlede fordi brugeren blokerede installationen.</string>
<string name="installation_downgrade">Operationen fejlede fordi brugeren prøvede at nedgradere pakken. Har du YouTube appen installeret?</string>
<string name="installation_conflict">Operationen fejlede fordi appen konflikter med en anden installeret app.</string>
<string name="installation_failed">Operationen fejlede af ukendt årsag, join vores Telegram eller Discord for hjælp.</string>
<string name="installation_incompatible">Operationen fejlede fordi appen ikke er kompatibel med din enhed.</string>
<string name="installation_invalid">Operationen fejlede fordi apk filerne er ugyldige.</string>
<string name="installation_signature">Operationen fejlede fordi brugeren ikke har disabled apk signatur verifikation</string>
<string name="installation_miui">En uventet fejl skete under installationen af Vanced. Har du disabled MIUI Optimering?</string>
<string name="installation_storage">Operationen fejlede på grund af lagerfejl.</string>
<string name="installation_wait">Vent venligst til installationen bliver færdiggjort</string>
<string name="installation_wait">Vent venligst til installationen er færdig.</string>
<string name="button_reinstall">Geninstaller</string>
<string name="version_installed">Installeret:</string>
<string name="latest">Seneste:</string>
<string name="successfully_installed">Installerede %1$s succesfuldt</string>
<string name="network_error">Netværksforbindelse utilgængelig</string>
<string name="no_microg">microG er ikke installeret</string>
<string name="root_not_granted">Root adgang ikke tildelt</string>
<string name="unavailable">Utilgængelig</string>
@ -38,7 +23,7 @@
<string name="useful_links">Nyttige Links</string>
<string name="website_text">Hjemmeside</string>
<string name="support_us">Støt os!</string>
<string name="version_toast">%1$s version blev kopieret!</string>
<string name="version_toast">%1$s versions nummer er kopieret!</string>
<!-- Settings -->
<string name="accent_color">Sekundær farve</string>
<string name="accent_blue">Blå</string>
@ -54,9 +39,15 @@
<string name="chosen_theme">Tema: %1$s</string>
<string name="clear_files">Ryd hentede filer</string>
<string name="cleared_files">Filer ryddet succesfuldt</string>
<string name="firebase_title">Firebase analyse</string>
<string name="firebase_summary">Dette giver os mulighed for at indsamle oplysninger om appens ydeevne og nedbruds logs</string>
<string name="language_title">Sprog</string>
<string name="link_title">Brug Chrome Custom Faner</string>
<string name="link_custom_tabs">Links vil åbne i Chrome Custom Faner</string>
<string name="link_external_browser">Links vil åbne i en ekstern browser</string>
<string name="new_installer_title">Brug den nye root installer (Eksperimentel)</string>
<string name="new_installer_summary">Denne installer er ikke afhængig af Signatur Verifikation status. ADVARSEL: Vanced kan forsvinde efter genstart, hvis du installerer den ved hjælp af dette</string>
<string name="system_default">System Standard</string>
<string name="theme">Tema</string>
<string name="theme_follow">Følg systemet</string>
<string name="theme_dark">Mørkt tema</string>
@ -69,29 +60,46 @@
<string name="update_found">Opdatering fundet!</string>
<string name="update_notfound">Ingen nye opdateringer</string>
<!-- Dialogs -->
<string name="button_dismiss">Luk</string>
<string name="guide">Vejledning</string>
<string name="hold_on">Et øjeblik!</string>
<string name="hold_on">Stop!</string>
<string name="magisk_vanced">Det ser ud som om du bruger Magisk/TWRP versionen af Vanced. Den er ikke længere understøttet og kan derfor ikke opdateres igennem denne app. Vær venlig at fjerne magisk modulet/brug TWRP Vanced uninstaller.</string>
<string name="miui_one_title">MIUI fundet!</string>
<string name="miui_one">Hey! Det ser ud som om du er MIUI bruger. For at kunne bruge denne app ordenligt skal du deaktivere MIUI optimeringer i udvikler indstillingerne (Du kan trygt ignorere denne advarsel hvis du bruger 20.2.20 eller nyere ROM baseret på xiaomi.eu)</string>
<string name="miui_one">For at kunne installere Vanced er du NØDT til at slå MIUI optimering fra i udvikler indstillingerne. (Du kan ignorere denne advarsel hvis du bruger en 20.2.20 eller nyere xiaomi.eu baseret ROM)</string>
<string name="error">Fejl</string>
<string name="security_context">Venligst sørg for kun at have downloaded appen fra vanced.app, Vanced Discord serveren eller Vanced GitHub siden</string>
<string name="success">Succes!</string>
<string name="vanced_installed">Vanced er nu installeret! Åben appen?</string>
<string name="launch">Start</string>
<string name="music_installed">Vanced Music er nu installeret! Åben appen?</string>
<string name="launch">Åbn</string>
<string name="welcome">Velkommen</string>
<!-- Install Page -->
<string name="choose_preferred_language">Vælg dit fortrukne sprog til Vanced</string>
<string name="choose_preferred_language_note">Note: Engelsk vil altid blive installeret som et alternativt sprog også.</string>
<string name="choose_preferred_theme">Vælg dit fortrukne tema til Vanced</string>
<string name="disable_signature">Root mode fundet! For at installere Vanced er du nødt til at disable appsignatur verifikation.</string>
<string name="finish">Afslut</string>
<string name="install_light_black">Lyst + Sort</string>
<string name="install_light_dark">Lyst + Mørkt</string>
<string name="next">Næste</string>
<!-- About Page -->
<string name="manager_dev">Manager udvikler</string>
<string name="manager_dev">Manager udviklere</string>
<string name="sources">Kilder</string>
<string name="vanced_team">Vanced holdet</string>
<!-- Error messages -->
<string name="chown_fail">Kunne ikke vælge Apk til systemejer, Prøv igen</string>
<string name="error_downloading">Fejl i download af %1$s</string>
<string name="failed_uninstall">Fejlede i at fjerne pakke %1$s</string>
<string name="files_missing_va">Filer mangler, fejlede downloaden?</string>
<string name="ifile_missing">Mørk/Sort.apk kan ikke læses eller fil mangler (Er lageradgang blokeret?)</string>
<string name="installation_aborted">Installationen fejlede fordi brugeren lukkede installationen.</string>
<string name="installation_blocked">Installationen fejlede fordi brugeren blokerede installationen.</string>
<string name="installation_downgrade">Installationen fejlede fordi brugeren prøvede at nedgradere pakken. Fjern opdateringer fra Youtube appen og prøv igen.</string>
<string name="installation_conflict">Installationen fejlede fordi appen konflikter med en allerede installeret app. Fjern den nuværende version af Vanced og prøv igen.</string>
<string name="installation_failed">Installationen fejlede af en ukendt årsag, join vores Telegram eller Discord for hjælp.</string>
<string name="installation_incompatible">Installationen fejlede fordi installationsfilen er inkompatibel med din enhed. Ryd de downloadede filer i indstillingerne og prøv igen.</string>
<string name="installation_invalid">Installationen fejlede fordi apk filerne er beskadiget, prøv igen.</string>
<string name="installation_signature">Installationen fejlede fordi apk signatur verifikation er slået til. Slå apk signatur verifikation fra og prøv igen.</string>
<string name="installation_miui">Installationen fejlede fordi MIUI optimering er slået til. Slå MIUI optimering fra og prøv igen.</string>
<string name="installation_storage">Installationen fejlede på grund af pladsmangel.</string>
<string name="modapk_missing">Sort/mørk apk mangler i installationsprogrammet, dette bør ikke ske, venligst ryd app data for manageren</string>
<string name="path_missing">Standard Youtube installations mappe er ikke tilgængelig eller mangler efter standard Split installering</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">Änderungsverlauf</string>
<string name="downloading_file">%1$s wird heruntergeladen</string>
<string name="failed_uninstall">Entfernen von %1$s fehlgeschlagen</string>
<string name="error_downloading">Download von %1$s fehlgeschlagen</string>
<string name="install">Installieren</string>
<string name="installing_app">%1$s wird installiert</string>
<string name="installation_aborted">Operation fehlgeschlagen, da der Nutzer sie abgebrochen hat</string>
<string name="installation_blocked">Operation fehlgeschlagen, da der Nutzer die Installation nicht gestattet hat</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Operation fehlgeschlagen, da die App mit einer bereits installierten App im Konflikt steht</string>
<string name="installation_failed">Operation aus einem unbekannten Grund fehlgeschlagen. Bitte trete unserem Telegram Chat oder Discord Server bei, um Support zu erhalten.</string>
<string name="installation_incompatible">Operation fehlgeschlagen, da die App inkompatibel mit deinem Gerät ist</string>
<string name="installation_invalid">Operation fehlgeschlagen, da die apks Dateien defekt sind</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">Unerwarteter Fehler während der Installation aufgetreten. Hast du die MIUI-Optimisierungen deaktiviert?</string>
<string name="installation_storage">Operation fehlgeschlagen, da ein Storage-Fehler aufgetreten ist.</string>
<string name="installation_wait">Bitte warte, bis die Installation abgeschlossen ist</string>
<string name="installation_wait">Bitte warte, bis die Installation abgeschlossen ist.</string>
<string name="button_reinstall">Neu installieren</string>
<string name="version_installed">Installiert:</string>
<string name="latest">Neueste:</string>
<string name="successfully_installed">%1$s erfolgreich installiert</string>
<string name="network_error">Keine Netzwerkverbindung verfügbar</string>
<string name="no_microg">Weibo ist nicht installiert</string>
<string name="no_microg">microG ist nicht installiert</string>
<string name="root_not_granted">Root-Zugriff nicht erteilt</string>
<string name="unavailable">Nicht verfügbar</string>
<string name="update">Aktualisieren</string>
<string name="useful_links">Nützliche Links</string>
<string name="website_text">Webseite</string>
<string name="support_us">Ünterstütze uns!</string>
<string name="version_toast">%1$s-Version erfolgreich kopiert!</string>
<string name="version_toast">Versionsnummer von %1$s wurde erfolgreich kopiert!</string>
<!-- Settings -->
<string name="accent_color">Akzentfarbe</string>
<string name="accent_blue">Blau</string>
@ -50,42 +35,47 @@
<string name="category_manager">Manager</string>
<string name="check_updates">Prüfe nach Updates</string>
<string name="chosen_install_values">Ausgewählte Installationsoptionen</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_lang">Sprache(n): %1$s</string>
<string name="chosen_theme">Theme: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="clear_files">Heruntergeladene Dateien löschen</string>
<string name="cleared_files">Daten erfolgreich gelöscht</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="language_title">Language</string>
<string name="link_title">Verwende Chrome Custom Tabs</string>
<string name="link_custom_tabs">Links werden in Chrome Custom Tabs geöffnet</string>
<string name="link_external_browser">Links werden in einem externen Browser geöffnet</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">System Default</string>
<string name="theme">Theme</string>
<string name="theme_follow">Folge Systemeinstellung</string>
<string name="theme_dark">Dunkles Theme</string>
<string name="theme_light">Helles Theme</string>
<string name="update_url">Kanal-Url updaten</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s Push-Benachrichtigungen</string>
<string name="push_notifications_summary">Push-Benachrichtigungen erhalten, wenn ein Update für %1$s veröffentlicht wird</string>
<string name="re_check">Erneut überprüfen</string>
<string name="update_center">Update Center</string>
<string name="update_found">Update gefunden!</string>
<string name="update_notfound">Keine neuen Updates</string>
<!-- Dialogs -->
<string name="button_dismiss">Schließen</string>
<string name="guide">Erklärung</string>
<string name="hold_on">Warte!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">Stop!</string>
<string name="magisk_vanced">Sie nutzen die Magisk/TWRP-Version von Vanced, die nicht mehr unterstützt wird und mit dieser App nicht aktualisiert werden kann. Bitte entfernen sie diese indem Sie das Magisk-Modul mit dem TWRP Vanced Uninstaller entfernen.</string>
<string name="miui_one_title">MIUI erkannt!</string>
<string name="miui_one">Hey! Du scheinst ein MIUI-Nutzer zu sein. Damit Vanced Manager richtig funktioniert musst du die MIUI-Optimisierungen in den Entwicklereinstellungen deines Gerätes deaktivieren. (Du kannst diese Warnung ignorieren, solltest du ein 20.2.20 Betriebssystem haben, das auf xiaomi.eu basiert ist)</string>
<string name="miui_one">Um Vanced zu installieren, MÜSSEN Sie MIUI-Optimierungen in den Entwickler-Einstellungen deaktivieren. (Sie können diese Warnung ignorieren, wenn Sie einen auf xiaomi.eu basierenden ROM 20.2.20 oder höher verwenden)</string>
<string name="error">Fehler</string>
<string name="security_context">Bitte stelle sicher, dass du die App von vanced.app, dem Vanced Discord Server oder GitHub heruntergeldaden hast.</string>
<string name="security_context">Bitte stellen Sie sicher, dass Sie die App von vanced.app, dem Vanced Discord Server oder GitHub heruntergeldaden haben.</string>
<string name="success">Erfolg!</string>
<string name="vanced_installed">Vanced wurde erfolgreich installiert. Jetzt öffnen?</string>
<string name="music_installed">Vanced Musik wurde erfolgreich installiert. Jetzt starten?</string>
<string name="launch">Öffnen</string>
<string name="welcome">Willkommen</string>
<!-- Install Page -->
<string name="choose_preferred_language">Wähle deine bevorzugte Sprache für Vanced</string>
<string name="choose_preferred_language">Wählen Sie ihre bevorzugte Sprache(n) für Vanced</string>
<string name="choose_preferred_language_note">Beachte: Englisch wird immer als zusätzliche Sprache installiert</string>
<string name="choose_preferred_theme">Wähle dein bevorzugtes Theme für Vanced</string>
<string name="disable_signature">Root-Modus erkannt! Um Vanced erfolgreich zu installieren, stelle sicher, dass du die Signatur-Verifikation deaktiviert hast.</string>
<string name="finish">Abschließen</string>
<string name="install_light_black">Hell + Schwarz</string>
<string name="install_light_dark">Hell + Dunkel</string>
@ -94,4 +84,22 @@
<string name="manager_dev">Manager-Entwickler</string>
<string name="sources">Quellen</string>
<string name="vanced_team">Vanced Team</string>
<!-- Error messages -->
<string name="chown_fail">Gescheitert An Chown Apk an Systemeigentümer, versuchen Sie es erneut</string>
<string name="error_downloading">Download von %1$s fehlgeschlagen</string>
<string name="failed_uninstall">Entfernen von %1$s fehlgeschlagen</string>
<string name="files_missing_va">Dateien fehlen, Download fehlgeschlagen?</string>
<string name="ifile_missing">Dark/Black.apk kann nicht gelesen werden Datei fehlt (oder Wurde der Speicher blockiert?)</string>
<string name="installation_aborted">Installation fehlgeschlagen, da der Nutzer diese abgebrochen hat.</string>
<string name="installation_blocked">Installation fehlgeschlagen, da der Benutzer diese blockiert hat.</string>
<string name="installation_downgrade">Installation fehlgeschlagen, da der Benutzer versucht hat, eine ältere Version des Paketes zu installieren. Deinstallieren Sie Updates von der YouTube App und versuchen Sie es erneut.</string>
<string name="installation_conflict">Installation aufgrund von Konflikten mit einer bereits installierten App fehlgeschlagen. Deinstallieren Sie die Aktuelle Version von Vanced und versuchen Sie es erneut.</string>
<string name="installation_failed">Installation aus unbekannten Grund fehlgeschlagen. Treten Sie bitte unserem Telegram-Chat oder Discord-Server bei, um Support zu erhalten.</string>
<string name="installation_incompatible">Installation fehlgeschlagen, da die Installationsdatei nicht mit Ihrem Gerät kompatibel ist. Löschen Sie heruntergeladene Dateien in den Einstellungen, dann versuchen Sie es erneut.</string>
<string name="installation_invalid">Installation fehlgeschlagen, da die apk-Dateien beschädigt sind, bitte versuchen Sie es erneut.</string>
<string name="installation_signature">Installation fehlgeschlagen, da die apk Signaturüberprüfung aktiviert ist. Deaktivieren Sie die apk Signaturüberprüfung, dann versuchen Sie es erneut.</string>
<string name="installation_miui">Installation fehlgeschlagen, da die MIUI-Optimierung aktiviert ist. Deaktivieren Sie die MIUI-Optimierung, und versuchen Sie es erneut.</string>
<string name="installation_storage">Die Installation ist aufgrund eines Speicherfehlers fehlgeschlagen.</string>
<string name="modapk_missing">Schwarz/Dunkel apk fehlt im Installer. Dies sollte nicht passieren, bitte löschen Sie die App-Daten des Managers</string>
<string name="path_missing">La ruta de instalación de Youtube no es accesible o no existe después de la instalación de split</string>
</resources>

View file

@ -1,97 +1,105 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<!-- Global Strings -->
<string name="close">Κλείσε</string>
<string name="close">Κλείσιμο</string>
<string name="reset">Επαναφορά</string>
<string name="save">Αποθήκευση</string>
<!-- Main Activity -->
<string name="title_about">Λεπτομέρειες</string>
<string name="title_home">Κυρίως Μενού</string>
<string name="title_about">Πληροφορίες</string>
<string name="title_home">Αρχική σελίδα</string>
<string name="title_settings">Ρυθμίσεις</string>
<!-- Home Page -->
<string name="changelogs">Αλλαγές</string>
<string name="downloading_file">Κατεβαίνει %1$s</string>
<string name="failed_uninstall">Αποτυχία απεγκατάστασης αρχείου %1$s</string>
<string name="error_downloading">Πρόβλημα στο κατέβασμα %1$s</string>
<string name="install">Εγκατέστησε</string>
<string name="installing_app">Εγκατάσταση %1$s</string>
<string name="installation_aborted">Η διαδικασία απέτυχε λόγω ακύρωσης από τον χρήστη.</string>
<string name="installation_blocked">Η διαδικασία απέτυχε λόγω απόκλεισης από τον χρήστη.</string>
<string name="installation_downgrade">Η διεργασία απέτυχε διότι ο χρήστης προσπάθησε να υποβαθμίσει το πακέτο. Έχετε εγκαταστήσει το κανονικό YouTube;</string>
<string name="installation_conflict">Η διαδικασία απέτυχε επειδή η εφαρμογή είναι ήδη εγκατεστημένη.</string>
<string name="installation_failed">Η διαδικασία απέτυχε για άγνωστο λόγω, παρακαλούμε μπείτε στο Telegram ή στο Discord μας για βοήθεια.</string>
<string name="installation_incompatible">Η διαδικασία απέτυχε επείδη η εφαρμογή δεν είναι συμβατή με την συσκευή.</string>
<string name="installation_invalid">Η διαδικασία απέτυχε επειδή τα αρχεία APK δεν είναι σωστά.</string>
<string name="installation_signature">Η διεργασία απέτυχε διότι ο χρήστης δεν έκλεισε την επαλήθευση υπογραφής των apk</string>
<string name="installation_miui">Πρόεκυψε ένα πρόβλημα στην εγκατάσταση του Vanced. Έχετε επενεργοποιήσει το MIUI-Optimisations;</string>
<string name="installation_storage">Η διαδικασία απέτυχε λόγω προβλήματος του αποθηκευτικού χώρου.</string>
<string name="changelogs">Λίστα Αλλαγών</string>
<string name="downloading_file">Λήψη %1$s</string>
<string name="install">Εγκατάσταση</string>
<string name="installation_wait">Παρακαλώ περιμένετε να ολοκληρωθεί η εγκατάσταση.</string>
<string name="button_reinstall">Επανεγκατάσταση</string>
<string name="version_installed">Εγκατεστημένο:</string>
<string name="latest">Πιο πρόσφατο:</string>
<string name="successfully_installed">Εγκαταστάθηκε επιτυχώς %1$s</string>
<string name="network_error">Δεν υπάρχει σύνδεση στο διαδίκτυο</string>
<string name="version_installed">Εγκατεστημένη έκδοση:</string>
<string name="latest">Τελευταία έκδοση:</string>
<string name="no_microg">το microG δεν είναι εγκατεστημένο</string>
<string name="root_not_granted">Δεν δόθηκαν Root άδειες</string>
<string name="root_not_granted">Δεν επιτράπηκε η πρόσβαση Root</string>
<string name="unavailable">Μη διαθέσιμο</string>
<string name="update">Ενημέρωση</string>
<string name="useful_links">Χρήσιμοι σύνδεσμοι</string>
<string name="website_text">Ιστοσελίδα</string>
<string name="support_us">Υποστήριξε μας!</string>
<string name="version_toast">Η έκδοση του %1$s αντιγράφηκε!</string>
<string name="support_us">Υποστηρίξτε μας!</string>
<string name="version_toast">Ο αριθμός έκδοσης του %1$s αντιγράφηκε!</string>
<!-- Settings -->
<string name="accent_color">Χρώμα</string>
<string name="accent_color">Χρώμα Διεπαφής</string>
<string name="accent_blue">Μπλε</string>
<string name="accent_green">Πράσινο</string>
<string name="accent_purple">Μωβ</string>
<string name="accent_red">Κόκκινο</string>
<string name="accent_yellow">Κίτρινο</string>
<string name="category_interface">Περιβάλλον</string>
<string name="category_interface">Διεπαφή</string>
<string name="category_manager">Διαχειριστής</string>
<string name="check_updates">Έλεγχος για ενημερώσεις</string>
<string name="chosen_install_values">Διαλέξτε επιλογές εγκατάστασης</string>
<string name="chosen_install_values">Επιλεγμένες προτιμήσεις εγκατάστασης</string>
<string name="chosen_lang">Γλώσσα(/ες): %1$s</string>
<string name="chosen_theme">Χρώματα: %1$s</string>
<string name="clear_files">Εκκαθάριση κατεβασμένων αρχείων</string>
<string name="chosen_theme">Θέμα: %1$s</string>
<string name="clear_files">Εκκαθάριση ληφθέντων αρχείων</string>
<string name="cleared_files">Επιτυχής εκκαθάριση αρχείων</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">Αυτό μας επιτρέπει να συλλέγουμε πληροφορίες σχετικά με την επίδοση της εφαρμογής και σχετικά με καταγραφές σφαλμάτων λογισμικού</string>
<string name="language_title">Γλώσσα</string>
<string name="link_title">Χρήση προσαρμοσμένων καρτέλων Chrome</string>
<string name="link_custom_tabs">Οι σύνδεσμοι θα ανοίγουν σε προσαρμοσμένες καρτέλες chrome</string>
<string name="link_external_browser">Οι σύνδεσμοι θα ανοίγουν σε εξωτερικό φυλλομετρητή</string>
<string name="theme">Χρώματα</string>
<string name="theme_follow">Χρώμα συστήματος</string>
<string name="theme_dark">Σκούρο Χρώμα</string>
<string name="theme_light">Ανοιχτό Χρώμα</string>
<string name="new_installer_title">Χρησιμοποιήστε το καινούργιο πρόγραμμα εγκατάστασης μέσω root (Πειραματικό)</string>
<string name="new_installer_summary">Αυτό το πρόγραμμα εγκατάστασης δεν εξαρτάται από την κατάσταση της Επαλήθευσης Υπογραφής των apk. ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Το Vanced μπορεί να εξαφανιστεί μετά από επανεκκίνηση εάν το εγκαταστήσετε με αυτόν τον τρόπο</string>
<string name="system_default">Προεπιλογή Συστήματος</string>
<string name="theme">Θέμα</string>
<string name="theme_follow">Σύμφωνα με το θέμα συστήματος</string>
<string name="theme_dark">Σκουρόχρωμο Θέμα</string>
<string name="theme_light">Ανοιχτόχρωμο Θέμα</string>
<string name="update_url">Ενημερώστε το URL του καναλιού ενημέρωσης</string>
<string name="push_notifications">%1$s Ειδοποιήσεις Push</string>
<string name="push_notifications">Ειδοποιήσεις Push για το %1$s</string>
<string name="push_notifications_summary">Λάβεται ειδοποιήσεις push όταν υπάρχουν διαθέσιμες ενημερώσεις για το %1$s</string>
<string name="re_check">Επανέλεγχος</string>
<string name="update_center">Κέντρο ενημέρωσης</string>
<string name="update_center">Κέντρο ενημερώσεων</string>
<string name="update_found">Διαθέσιμη ενημέρωση!</string>
<string name="update_notfound">Καμία διαθέσιμη ενημέρωση</string>
<string name="update_notfound">Δεν υπάρχουν διαθέσιμες ενημερώσεις</string>
<!-- Dialogs -->
<string name="button_dismiss">Αγνόηση</string>
<string name="guide">Οδηγός</string>
<string name="hold_on">Περιμένετε!</string>
<string name="magisk_vanced">Φαίνεται πως χρησιμοποιήτε την Magisk/TWRP έκδοση του Vanced, η οποία δεν υποστηρίζεται πλέον και δεν μπορεί να ενημερωθεί μέσω αυτής της εφαρμογής. Παρακαλούμε διαγράψτε αυτή την έκδοση αφαιρώντας το Magisk Module/χρησιμοποιόντας το πρόγραμμα κατάργησης TWRP Vanced.</string>
<string name="guide">Οδηγίες</string>
<string name="hold_on">Σταματήστε!</string>
<string name="magisk_vanced">Χρησιμοποιείτε την έκδοση Magisk/TWRP του Vanced, η οποία δεν υποστηρίζεται πλέον και δεν μπορεί να ενημερωθεί μέσω αυτής της εφαρμογής. Παρακαλούμε αφαιρέστε αυτή την έκδοση αφαιρώντας το Magisk Module/χρησιμοποιόντας το πρόγραμμα κατάργησης TWRP Vanced.</string>
<string name="miui_one_title">Ανιχνεύτηκε MIUI!</string>
<string name="miui_one">Φαίνεται πως είστε χρήστης MIUI. Για να δουλέψει σωστά αυτή η εφαρμογή, θα πρέπει να απενεργοποιήσετε τα MIUI Optimisations στα Developer Settings. (Μπορείτε να αγνοήσετε αυτή την προειδοποίηση αν είστε στην έκδοση 20.2.20 ή νεότερη λειτουργικού βασισμένο στο Xiami.eu)</string>
<string name="error">Πρόβλημα</string>
<string name="security_context">Σιγουρευτείτε πως κατεβάσατε την εφαρμογή από το vanced.app, το Discord του Vanced ή το GitHub του Vanced</string>
<string name="miui_one">Για να εγκαταστήσετε το Vanced, ΠΡΕΠΕΙ να απενεργοποιήσετε (στις ρυθμίσεις) τη βελτιστοποίηση MIUI στις επιλογές προγραμματιστών. (Μπορείτε να αγνοήσετε αυτήν την προειδοποίηση εάν χρησιμοποιείτε την έκδοση ROM 20.2.20 ή μεταγενέστερη βασισμένη στο xiaomi.eu)</string>
<string name="error">Σφάλμα</string>
<string name="security_context">Σιγουρευτείτε πως κατεβάσατε την εφαρμογή από το vanced.app, τον διακομιστή Discord του Vanced ή το GitHub του Vanced</string>
<string name="success">Επιτυχία!</string>
<string name="vanced_installed">Το Vanced εγκαταστάθηκε επιτυχώς! Να ανοίξει τώρα;</string>
<string name="vanced_installed">Το Vanced έχει εγκατασταθεί επιτυχώς! Εκκίνηση τώρα;</string>
<string name="music_installed">Η εγκατάσταση του Vanced Music ολοκληρώθηκε επιτυχώς! Εκκίνηση τώρα;</string>
<string name="launch">Εκκίνηση</string>
<string name="welcome">Καλώς ορίσατε</string>
<!-- Install Page -->
<string name="choose_preferred_language">Επιλέξτε την γλώσσα που επιθυμείτε για το Vanced</string>
<string name="choose_preferred_language">Επιλέξτε την(/ις) γλώσσα(/ες) που επιθυμείτε για το Vanced</string>
<string name="choose_preferred_language_note">Σημείωση: Τα αγγλικά θα εγκατασταθούν ως δεύτερη γλώσσα ούτως ή άλλως.</string>
<string name="choose_preferred_theme">Επιλέξτε το χρώμα που επιθυμείτε για το Vanced</string>
<string name="disable_signature">Επιλέχθηκε λειτουργία Root! Για να εγκαταστείσετε το Vanced, πρέπει να απενεργοποιήσετε το APK Signature Verification.</string>
<string name="choose_preferred_theme">Επιλέξτε το θέμα που επιθυμείτε για το Vanced</string>
<string name="finish">Τέλος</string>
<string name="install_light_black">Ανοιχτό + Μαύρο</string>
<string name="install_light_dark">Ανοιχτό + Σκούρο</string>
<string name="install_light_black">Ανοιχτόχρωμο + Μαύρο</string>
<string name="install_light_dark">Ανοιχτόχρωμο + Σκούροχρωμο</string>
<string name="next">Επόμενο</string>
<!-- About Page -->
<string name="manager_dev">Δημιουργός του Manager</string>
<string name="manager_dev">Προγραμματιστές Διαχειριστή Vanced</string>
<string name="sources">Πηγές</string>
<string name="vanced_team">Ομάδα Vanced</string>
<string name="vanced_team">Η ομάδα του Vanced</string>
<!-- Error messages -->
<string name="chown_fail">Αποτυχία αλλαγής του κατόχου του Apk σε system owner, προσπαθείστε ξανά</string>
<string name="error_downloading">Σφάλμα λήψης του %1$s</string>
<string name="failed_uninstall">Αποτυχία απεγκατάστασης πακέτου %1$s</string>
<string name="files_missing_va">Τα αρχεία λείπουν, αποτυχία λήψης;</string>
<string name="ifile_missing">Αποτυχία ανάγνωσης Dark/Black.apk (μπλόκαρε ο αποθηκευτικός χώρος;) ή το αρχείο λείπει</string>
<string name="installation_aborted">Η εγκατάσταση απέτυχε διότι ο χρήστης απέτρεψε την εγκατάσταση.</string>
<string name="installation_blocked">Η εγκατάσταση απέτυχε διότι ο χρήστης απέκλεισε την εγκατάσταση.</string>
<string name="installation_downgrade">Η εγκατάσταση απέτυχε διότι ο χρήστης προσπάθησε να υποβαθμίσει το πακέτο. Απεγκαταστήστε τις ενημερώσεις της αρχικής εφαρμογής YouTube, στη συνέχεια προσπαθήστε ξανά.</string>
<string name="installation_conflict">Η εγκατάσταση απέτυχε διότι η εφαρμογή αντικρούεται με μια ήδη εγκατεστημένη εφαρμογή. Απεγκαταστήστε την τρέχουσα έκδοση του Vanced, στην συνέχεια προσπαθήστε ξανά.</string>
<string name="installation_failed">Η εγκατάσταση απέτυχε για άγνωστους λόγους, παρακαλούμε μπείτε στο Telegram ή στο Discord μας για περαιτέρω βοήθεια.</string>
<string name="installation_incompatible">Η εγκατάσταση απέτυχε διότι το αρχείο εγκατάστασης είναι μη συμβατό με την συσκευή σας. Κάντε εκκαθάριση των ληφθέντων αρχείων στις ρυθμίσεις, στην συνέχεια προσπαθήστε ξανά.</string>
<string name="installation_invalid">Η εγκατάσταση απέτυχε διότι τα αρχεία apk έχουν διαφθαρεί, παρακαλώ προσπαθήστε ξανά.</string>
<string name="installation_signature">Η εγκατάσταση απέτυχε διότι η επαλήθευση υπογραφής των apk είναι ενεργή. Απενεργοποιήστε την υπογραφή επαλήθευσης apk, στην συνέχεια προσπαθήστε ξανά.</string>
<string name="installation_miui">Η εγκατάσταση απέτυχε διότι η βελτιστοποίηση MIUI είναι ενεργή. Απενεργοποιήστε την βελτιστοποίηση MIUI, στην συνέχεια προσπαθήστε ξανά.</string>
<string name="installation_storage">Η εγκατάσταση απέτυχε λόγω σφάλματος του αποθηκευτικού χώρου.</string>
<string name="modapk_missing">Το Black/Dark apk λείπει από το πρόγραμμα εγκατάστασης, αυτό δεν θα έπρεπε να συμβαίνει, παρακαλώ κάντε εκκαθάριση δεδομένων του διαχειριστή vanced</string>
<string name="path_missing">Η διαδρομή εγκατάστασης του αρχικού Youtube δεν είναι προσβάσιμη ή λυπεί μετά από χωριζομένη εγκατάσταση</string>
</resources>

View file

@ -11,26 +11,11 @@
<!-- Home Page -->
<string name="changelogs">Actualizaciones</string>
<string name="downloading_file">Descargando %1$s</string>
<string name="failed_uninstall">Falla al desinstalar paquete %1$s</string>
<string name="error_downloading">Error al descargar %1$s</string>
<string name="install">Instalar</string>
<string name="installing_app">Instalando %1$s</string>
<string name="installation_aborted">La operación fallo porque el usuario abortó la instalación</string>
<string name="installation_blocked">La operación fallo porque el usuario bloqueo la instalación</string>
<string name="installation_downgrade">Operación fallida porque el usuario intentó degradar el paquete. ¿Tienes instalado YouTube original?</string>
<string name="installation_conflict">La operación fallo porque la app entra en conflicto con una app ya instalada</string>
<string name="installation_failed">La operacion fallo por una razon desconocida, porfavor únete a nuestro grupo de Telegram o Discord para brindar soporte.</string>
<string name="installation_incompatible">La operación fallo porque la app es incompatible con tu dispositivo.</string>
<string name="installation_invalid">La operación fallo debido a que los archivos apk son inválidos.</string>
<string name="installation_signature">Operación fallida porque el usuario no deshabilitado verificación de firmas apk</string>
<string name="installation_miui">Un error inesperado ocurrió durante la instalación de Vanced. Has deshabilitado las Optimizaciones de MIUI?</string>
<string name="installation_storage">La operación falló debido a un error de almacenamiento.</string>
<string name="installation_wait">Porfavor espera hasta que la instalación termine.</string>
<string name="installation_wait">Por favor espere hasta que la instalación termine.</string>
<string name="button_reinstall">Reinstalar</string>
<string name="version_installed">Instalado:</string>
<string name="latest">Más reciente:</string>
<string name="successfully_installed">Instalación exitosa %1$s</string>
<string name="network_error">Conexion a la red no disponible</string>
<string name="no_microg">microG no está instalado</string>
<string name="root_not_granted">Acceso root no concedido</string>
<string name="unavailable">No Disponible</string>
@ -54,9 +39,15 @@
<string name="chosen_theme">Tema: %1$s</string>
<string name="clear_files">Limpiar archivos descargados</string>
<string name="cleared_files">Archivos limpiados exitosamente</string>
<string name="firebase_title">Analíticas de Firebase</string>
<string name="firebase_summary">Esto nos permite recopilar información sobre el rendimiento de la aplicación y los registros de errores</string>
<string name="language_title">Idioma</string>
<string name="link_title">Usar Chrome Custom Tabs</string>
<string name="link_custom_tabs">Links serán abiertos en Chrome Custom Tabs</string>
<string name="link_external_browser">Links serán abiertos en un Navegador Externo</string>
<string name="new_installer_title">Usar el nuevo instalador root (Experimental)</string>
<string name="new_installer_summary">Este instalador no depende del estado de Verificación de Firmas. ADVERTENCIA: Vanced puede desaparecer al reiniciar si lo instala utilizando esto</string>
<string name="system_default">Predeterminado del sistema</string>
<string name="theme">Tema</string>
<string name="theme_follow">Seguir Sistema</string>
<string name="theme_dark">Tema Oscuro</string>
@ -69,29 +60,46 @@
<string name="update_found">Actualización encontrada!</string>
<string name="update_notfound">Sin actualizaciónes nuevas</string>
<!-- Dialogs -->
<string name="button_dismiss">Descartar</string>
<string name="guide">Guía</string>
<string name="hold_on">Un momento!</string>
<string name="magisk_vanced">Parece que estas usando la versión Magisk/TWRP de Vanced, la cual está descontinuada y no puede ser actualizada utilizando esta app. Por favor, elimínalo primero quitando el módulo magisk/usando el desinstalador para vanced de TWRP.</string>
<string name="hold_on">¡Detente!</string>
<string name="magisk_vanced">Estás utilizando la versión Magisk/TWRP de Vanced, la cual está descontinuada y no puede ser actualizada mediante esta app. Por favor elimínala quitando el módulo de Magisk o utilizando el desinstalador TWRP.</string>
<string name="miui_one_title">MIUI detectado!</string>
<string name="miui_one">Hey! Parece que eres un usuario MIUI. Para poder usar esta aplicacion correctamente, necesitaras deshabilitar las optimizaciones MIUI en ajustes de desarrollador. (Puedes ignorar esta advertencia con seguridad si estas en un ROM 20.2.20 o posterior basado en xiaomi.eu)</string>
<string name="miui_one">Para instalar Vanced, DEBES desactivar las Optimizaciones MIUI en los ajustes de desarrollador. (Puede ignorar esta advertencia si está utilizando el ROM 20.2.20 o posterior de xiaomi.eu)</string>
<string name="error">Error</string>
<string name="security_context">Porfavor asegurate de haver descargado la aplicacion mediante vanced.app, el server de Vanced en Discord, o Github</string>
<string name="security_context">Asegúrate de haber descargado la aplicación desde vanced.app, Servidor de discord o el GitHub de Vanced</string>
<string name="success">Éxito!</string>
<string name="vanced_installed">¡Vanced ha sido instalado exitosamente! ¿Lanzar ahora?</string>
<string name="launch">Lanzar</string>
<string name="vanced_installed">¡Vanced se ha instalado correctamente! ¿Abrir ahora?</string>
<string name="music_installed">¡Vanced Music se ha instalado correctamente! ¿Abrir ahora?</string>
<string name="launch">Abrir</string>
<string name="welcome">Bienvenido</string>
<!-- Install Page -->
<string name="choose_preferred_language">Elige tu idioma preferido para Vanced</string>
<string name="choose_preferred_language">Elige tu(s) idioma(s) preferido(s) para Vanced</string>
<string name="choose_preferred_language_note">Nota: Ingles va a estar instalado como un idioma adicional.</string>
<string name="choose_preferred_theme">Elige tu tema preferido para Vanced</string>
<string name="disable_signature">Modo root detectado! Para instalar Vanced, necesitaras deshabilitar verificación de firmas(disable signature verification).</string>
<string name="finish">Finalizar</string>
<string name="install_light_black">Claro + Negro</string>
<string name="install_light_dark">Claro + Oscuro</string>
<string name="next">Siguiente</string>
<!-- About Page -->
<string name="manager_dev">Desarrollador del Manager</string>
<string name="manager_dev">Desarrolladores del Manager</string>
<string name="sources">Fuentes</string>
<string name="vanced_team">Equipo Vanced</string>
<!-- Error messages -->
<string name="chown_fail">No se pudo conectar a Chown Apk con el propietario del sistema, inténtalo de nuevo</string>
<string name="error_downloading">Error al descargar %1$s</string>
<string name="failed_uninstall">Falla al desinstalar paquete %1$s</string>
<string name="files_missing_va">Faltan los archivos, ¿Descarga Fallida?</string>
<string name="ifile_missing">Dark/Black.apk no puede ser leído (¿su almacenamiento fue bloqueado?) o el archivo desapareció</string>
<string name="installation_aborted">La instalación falló porque el usuario abortó la instalación.</string>
<string name="installation_blocked">Instalación fallida porque el usuario bloqueó la instalación.</string>
<string name="installation_downgrade">La instalación falló porque el usuario intentó degradar el paquete. Desinstale las actualizaciones de stock YouTube, y vuelva a intentarlo.</string>
<string name="installation_conflict">La instalación falló porque la aplicación entra en conflicto con una aplicación ya instalada. Desinstale la versión actual de Vanced, y vuelva a intentarlo.</string>
<string name="installation_failed">La instalación ha fallado por razones desconocidas, únete a nuestro grupo de Telegram o Discord para brindarte soporte.</string>
<string name="installation_incompatible">La instalación ha fallado porque el archivo de instalación es incompatible con tu dispositivo. Limpia los archivos descargados en la ajustes y vuelve a intentarlo.</string>
<string name="installation_invalid">La instalación falló porque los archivos apk están corruptos, por favor inténtalo de nuevo.</string>
<string name="installation_signature">La instalación ha fallado porque la verificación de firmas de apk está habilitada. Desactiva la verificación de la firmas de apk, y vuelve a intentarlo.</string>
<string name="installation_miui">La instalación ha fallado porque la Optimización MIUI está activada. Desactiva la optimización MIUI y vuelva a intentarlo.</string>
<string name="installation_storage">La instalación falló debido a un error de almacenamiento.</string>
<string name="modapk_missing">Falta el Dark/Black.apk en el instalador. Esto no debería pasar, por favor, borra los datos de la aplicación del Manager</string>
<string name="path_missing">La ruta de instalación de Youtube no es accesible o no está disponible después de la instalación del Split</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">Muutoshistoria</string>
<string name="downloading_file">Ladataan %1$s</string>
<string name="failed_uninstall">Paketin %1$s asennus epäonnistui</string>
<string name="error_downloading">%1$s lataus epäonnistui</string>
<string name="install">Asenna</string>
<string name="installing_app">Asennetaan %1$s</string>
<string name="installation_aborted">Operaatio epäonnistui, koska käyttäjä keskeytti asennuksen.</string>
<string name="installation_blocked">Operaatio epäonnistui, koska käyttäjä esti asennuksen.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Operaatio epäonnistui, koska sovellus on ristiriidassa toisen sovelluksen kanssa.</string>
<string name="installation_failed">Operaatio epäonnistui tuntemattomasta syystä, ole hyvä ja liity Telegram tai Discord kanaviimme halutessasi tukea.</string>
<string name="installation_incompatible">Operaatio epäonnistui, koska sovellus ei ole yhteensopiva laitteesi kanssa.</string>
<string name="installation_invalid">Operaatio epäonnistui, koska APK tiedostot ovat viallisia.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">Odottamaton virhe asentaessa Vanced-pakettia. Oletko varmasti ottanut MIUI optimisaatiot pois käytöstä?</string>
<string name="installation_storage">Haku epäonnistui tallennustilan virheen vuoksi.</string>
<string name="installation_wait">Ole hyvä ja odota, että asennus suoritetaan loppuun.</string>
<string name="installation_wait">Odota, kunnes asennus on valmis.</string>
<string name="button_reinstall">Uudelleenasenna</string>
<string name="version_installed">Asennettu:</string>
<string name="latest">Uusin:</string>
<string name="successfully_installed">%1$s asennus onnistui</string>
<string name="network_error">Verkkoyhteys ei ole käytettävissä</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="no_microg">microG:tä ei ole asennettu</string>
<string name="root_not_granted">Pääkäyttäjän oikeuksia ei ole annettu</string>
<string name="unavailable">Ei saatavilla</string>
<string name="update">Päivitä</string>
<string name="useful_links">Hyödyllisiä linkkejä</string>
<string name="website_text">Verkkosivu</string>
<string name="support_us">Tue meitä!</string>
<string name="version_toast">%1$s versio kopioitu!</string>
<string name="version_toast">%1$s versionumero kopioitu!</string>
<!-- Settings -->
<string name="accent_color">Aksenttiväri</string>
<string name="accent_blue">Sininen</string>
@ -50,48 +35,71 @@
<string name="category_manager">Manager</string>
<string name="check_updates">Tarkista päivitykset</string>
<string name="chosen_install_values">Valitut asennusasetukset</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_lang">Kieli: %1$s</string>
<string name="chosen_theme">Teema: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="clear_files">Tyhjennä ladatut tiedostot</string>
<string name="cleared_files">Tiedostot tyhjennettiin onnistuneesti</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="language_title">Language</string>
<string name="link_title">Käytä Chromen mukautettuja välilehtiä</string>
<string name="link_custom_tabs">Linkit aukeavat Chromen mukautetuissa välilehdissä</string>
<string name="link_external_browser">Linkit aukeavat ulkoisessa selaimessa</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">System Default</string>
<string name="theme">Teema</string>
<string name="theme_follow">Järjestelmän teema</string>
<string name="theme_dark">Tumma teema</string>
<string name="theme_light">Vaalea teema</string>
<string name="update_url">Päivityskanavan URL-osoite</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s Push-ilmoitusta</string>
<string name="push_notifications_summary">Vastaanota push-ilmoituksia, kun %1$s:lle on julkaistu päivitys</string>
<string name="re_check">Tarkista uudelleen</string>
<string name="update_center">Managerin päivityskeskus</string>
<string name="update_found">Päivitys löytyi!</string>
<string name="update_notfound">Ei uusia päivityksiä</string>
<!-- Dialogs -->
<string name="button_dismiss">Ohita</string>
<string name="guide">Opas</string>
<string name="hold_on">Odotas vähän!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">Pysähdy!</string>
<string name="magisk_vanced">Käytät Vancedin Magisk / TWRP-versiota, joka on lopetettu eikä sitä voi päivittää tällä sovelluksella. Poista se poistamalla magisk-moduuli / käyttämällä TWRP Vanced -asennusohjelmaa.</string>
<string name="miui_one_title">MIUI tunnistettu!</string>
<string name="miui_one">Hei! Näyttää siltä, että olet MIUI käyttäjä. Jotta sovellus toimisi oikein, sinun täytyy poistaa MIUI optimoinnit pois käytöstä sovelluskehittäjän asetuksista. (Voit huoletta ohittaa tämän varoituksen, jos käytät xiaomi.eu ROM versiota 20.2.20 tai uudempaa)</string>
<string name="miui_one">Vancedin asentamiseksi TÄYTYY poistaa MIUI-optimoinnit käytöstä kehittäjäasetuksissa. (Voit ohittaa tämän varoituksen, jos käytät 20.2.20 tai uudempaa xiaomi.eu-pohjaista ROM-levyä)</string>
<string name="error">Virhe</string>
<string name="security_context">Varmista, että latasit sovelluksen vanced.app nettisivulta, Vanced Discord serveriltä tai Vanced GitHub sivulta.</string>
<string name="security_context">Varmista, että latasit sovelluksen vanced.app -sivustolta, Vancedin Discord-palvelimelta tai Vancedin GitHubista</string>
<string name="success">Onnistui!</string>
<string name="vanced_installed">Vanced asennettu onnistuneesti! Käynnistetäänkö nyt?</string>
<string name="vanced_installed">Vanced on asennettu onnistuneesti! Avaa nyt?</string>
<string name="music_installed">Vanced Music on asennettu onnistuneesti! Avoinna nyt?</string>
<string name="launch">Avaa</string>
<string name="welcome">Tervetuloa</string>
<!-- Install Page -->
<string name="choose_preferred_language">Valitse haluamasi kieli</string>
<string name="choose_preferred_language">Valitse Vancedille haluamasi kieli tai kielet</string>
<string name="choose_preferred_language_note">Huom: Englanti asennetaan rinnalle aina.</string>
<string name="choose_preferred_theme">Valitse haluamasi teema</string>
<string name="disable_signature">Pääkäyttäjän tila tunnistettu! Asentaaksei Vanced-sovelluksen, ole hyvä ja poista APK-paketin allekirjoituksen tarkistus pois käytöstä.</string>
<string name="finish">Valmis</string>
<string name="install_light_black">Vaalea + Musta</string>
<string name="install_light_dark">Vaalea + Tumma</string>
<string name="next">Seuraava</string>
<!-- About Page -->
<string name="manager_dev">Managerin kehittäjä</string>
<string name="manager_dev">Kehittäjäpäällikkö</string>
<string name="sources">Lähdekoodi</string>
<string name="vanced_team">Vanced kehitystiimi</string>
<!-- Error messages -->
<string name="chown_fail">Apk: n lähettäminen järjestelmän omistajalle epäonnistui, yritä uudelleen</string>
<string name="error_downloading">%1$s lataus epäonnistui</string>
<string name="failed_uninstall">Paketin %1$s asennus epäonnistui</string>
<string name="files_missing_va">Tiedostot puuttuvat, lataaminen epäonnistui?</string>
<string name="ifile_missing">Dark / Black.apk-tiedostoa ei voi lukea (estettiinkö tallennustila?) Tai tiedosto puuttuu</string>
<string name="installation_aborted">Asennus epäonnistui, koska käyttäjä keskeytti asennuksen.</string>
<string name="installation_blocked">Asennus epäonnistui, koska käyttäjä esti asennuksen.</string>
<string name="installation_downgrade">Asennus epäonnistui, koska käyttäjä yritti asentaa paketin vanhempaa versiota. Poista YouTube-sovelluksen päivitykset ja yritä sitten uudelleen.</string>
<string name="installation_conflict">Asennus epäonnistui, koska sovellus on ristiriidassa jo asennetun sovelluksen kanssa. Poista Vancedin nykyinen versio ja yritä uudelleen.</string>
<string name="installation_failed">Asennus epäonnistui tuntemattomista syistä, liity Telegramiin tai Discordiin saadaksesi lisätukea.</string>
<string name="installation_incompatible">Asennus epäonnistui, koska asennustiedosto ei ole yhteensopiva laitteesi kanssa. Tyhjennä ladatut tiedostot asetuksista ja yritä uudelleen.</string>
<string name="installation_invalid">Asennus epäonnistui, koska APK-tiedostot ovat vioittuneet, yritä uudelleen.</string>
<string name="installation_signature">Asennus epäonnistui, koska APK-allekirjoituksen vahvistus on käytössä. Poista APK-allekirjoituksen vahvistus käytöstä, ja yritä uudelleen.</string>
<string name="installation_miui">Asennus epäonnistui, koska MIUI-optimointi on käytössä. Poista MIUI-optimointi käytöstä ja yritä uudelleen.</string>
<string name="installation_storage">Asennus epäonnistui tallennustilan virheen vuoksi.</string>
<string name="modapk_missing">Musta / tumma apk puuttuu asennusohjelmasta. Tämän ei pitäisi tapahtua. Tyhjennä managerin sovellustiedot</string>
<string name="path_missing">Osakkeen YouTube-asennuspolku ei ole käytettävissä tai puuttuu osakkeiden jaon asennuksen jälkeen</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">Journal des modifications</string>
<string name="downloading_file">Téléchargement de %1$s</string>
<string name="failed_uninstall">N\'a pas pu désinstaller le paquet %1$s</string>
<string name="error_downloading">Erreur en téléchargeant %1$s</string>
<string name="install">Installer</string>
<string name="installing_app">Installation de %1$s</string>
<string name="installation_aborted">L\'opération à échouée, l\'utilisateur à abandonné l\'installation.</string>
<string name="installation_blocked">L\'opération à échouée, l\'utilisateur à bloqué l\'installation.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">L\'opération à échouée, l\'application est en conflict avec celle déjà installée.</string>
<string name="installation_failed">L\'opération à échouée pour une raison inconnue, rejoignez notre Telegram ou Discord pour obtenir de l\'aide.</string>
<string name="installation_incompatible">L\'opération à échouée, l\'application est incompatible avec votre appareil.</string>
<string name="installation_invalid">L\'opération à échouée, les fichiers apk sont invalides.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">Une erreur inattendue s\'est produite lors de l\'installation de Vanced. As-tu désactivé les optimisations MIUI?</string>
<string name="installation_storage">L\'opération à échouée, une erreur de stockage s\'est produite.</string>
<string name="installation_wait">Veuillez attendre la fin de l\'installation</string>
<string name="installation_wait">S\'il vous plaît veuillez attendre la fin de l\'installation.</string>
<string name="button_reinstall">Réinstaller</string>
<string name="version_installed">Version installée:</string>
<string name="latest">Dernière version:</string>
<string name="successfully_installed">%1$s installé avec succès</string>
<string name="network_error">Connection réseau indisponible</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="no_microg">microG n\'est pas installé</string>
<string name="root_not_granted">Accès root non autorisé</string>
<string name="unavailable">Indisponible</string>
<string name="update">Mettre à jour</string>
<string name="useful_links">Liens utiles</string>
<string name="website_text">Site web</string>
<string name="support_us">Supporte nous !</string>
<string name="version_toast">La version %1$s a été copiée !</string>
<string name="version_toast">Le numéro de version %1$s a été copié !</string>
<!-- Settings -->
<string name="accent_color">Couleur d\'accentuation</string>
<string name="accent_blue">Bleu</string>
@ -54,44 +39,67 @@
<string name="chosen_theme">Thème: %1$s</string>
<string name="clear_files">Effacer les fichiers téléchargés</string>
<string name="cleared_files">Données effacées avec succès</string>
<string name="firebase_title">Analytiques Firebase</string>
<string name="firebase_summary">Cela nous permet de collecter des informations sur les performances de l\'application et des journaux de plantage</string>
<string name="language_title">Langue</string>
<string name="link_title">Utiliser les onglets personnalisés Chrome</string>
<string name="link_custom_tabs">Les liens s\'ouvriront dans les onglets personnalisés Chrome</string>
<string name="link_external_browser">Les liens s\'ouvriront dans un navigateur externe</string>
<string name="new_installer_title">Utiliser le nouvel installateur root (expérimental)</string>
<string name="new_installer_summary">Cette méthode d\'installation ne dépend pas du statut de vérification de signature. ATTENTION : Vanced peut disparaître après le redémarrage si vous l\'installez à l\'aide de ce statut</string>
<string name="system_default">Système par défaut</string>
<string name="theme">Thème</string>
<string name="theme_follow">Suivre le paramètre système</string>
<string name="theme_dark">Thème sombre</string>
<string name="theme_light">Thème clair</string>
<string name="update_url">URL du canal de mise à jour</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s Notifications Push</string>
<string name="push_notifications_summary">Recevoir une notification push quand une nouvelle version pour %1$s est publiée</string>
<string name="re_check">Revérifier</string>
<string name="update_center">Centre de mise à jour du Manager</string>
<string name="update_found">Mise à jour disponible!</string>
<string name="update_notfound">Aucune mise à jour disponible</string>
<!-- Dialogs -->
<string name="button_dismiss">Faire disparaître</string>
<string name="guide">Guide</string>
<string name="hold_on">Attends une seconde!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">Stop!</string>
<string name="magisk_vanced">Vous utilisez la version Magisk/TWRP de Vanced, qui n\'est plus entretenu et ne peut pas être mise à jour à l\'aide de cette application. Veuillez la retirer en supprimant le module Magisk/en utilisant le désinstallateur TWRP pour Vanced.</string>
<string name="miui_one_title">MIUI détecté!</string>
<string name="miui_one">Hey! Tu as l\'air d\'un utilisateur MIUI. Pour utiliser Vanced Manager correctement, te vas devoir désactiver les optimisations MIUI dans les options pour les développeurs. (Tu peux ignorer cet avertissement si tu est sur une ROM 20.2.20 et ultérieur basée sur xiaomi.eu)</string>
<string name="miui_one">Afin d\'installer Vanced, vous DEVEZ désactiver les optimisations MIUI dans les paramètres du développeur. (Vous pouvez ignorer cet avertissement si vous utilisez une ROM basée sur 20.2.20 ou ultérieure sur xiaomi.eu)</string>
<string name="error">Erreur</string>
<string name="security_context">Assurez-vous d\'avoir téléchargé l\'application sur vanced.app, le serveur Discord Vanced ou sur le Github Vanced.</string>
<string name="security_context">Assurez-vous d\'avoir téléchargé l\'application sur vanced.app, le serveur Discord Vanced ou sur le Github Vanced</string>
<string name="success">Succès!</string>
<string name="vanced_installed">Vanced a été installé avec succès! Lancer?</string>
<string name="launch">Lancer</string>
<string name="vanced_installed">Vanced a été installé avec succès ! Ouvrir maintenant ?</string>
<string name="music_installed">Vanced Music a été installé avec succès ! Voulez-vous l\'ouvrir maintenant ?</string>
<string name="launch">Ouvrir</string>
<string name="welcome">Bienvenue</string>
<!-- Install Page -->
<string name="choose_preferred_language">Choisir votre langue préférée pour Vanced</string>
<string name="choose_preferred_language">Choisir votre langage(s) préféré(s) pour Vanced</string>
<string name="choose_preferred_language_note">Note: l\'Anglais sera toujours installé en tant que langue additionnelle, quel que soit votre choix</string>
<string name="choose_preferred_theme">Choisis le thème de Vanced</string>
<string name="disable_signature">Mode root détecté! Pour installer Vanced, vous devez désactiver la vérification des signatures des apk.</string>
<string name="finish">Terminer</string>
<string name="install_light_black">Clair + Noir</string>
<string name="install_light_dark">Clair + Sombre</string>
<string name="next">Suivant</string>
<!-- About Page -->
<string name="manager_dev">Développeur du Manager</string>
<string name="manager_dev">Manager pour les développeurs</string>
<string name="sources">Sources</string>
<string name="vanced_team">Équipe Vanced</string>
<!-- Error messages -->
<string name="chown_fail">Impossible de modifier le propriétaire de l\'Apk, réessayez</string>
<string name="error_downloading">Erreur en téléchargeant %1$s</string>
<string name="failed_uninstall">N\'a pas pu désinstaller le paquet %1$s</string>
<string name="files_missing_va">Des fichiers sont manquants, Téléchargement échoué ?</string>
<string name="ifile_missing">Dark/Black.apk ne peut pas être lu (L\'accès aux permissions de stockage est-il révoqué ?) ou un Fichier est manquant</string>
<string name="installation_aborted">L\'opération a échouée, l\'utilisateur a abandonné l\'installation.</string>
<string name="installation_blocked">L\'opération a échouée, l\'utilisateur a bloqué l\'installation.</string>
<string name="installation_downgrade">L\'installation a échoué parce que l\'utilisateur a essayé de downgrader le package. Désinstallez les mises à jour depuis l\'application YouTube d\'origine, puis réessayez.</string>
<string name="installation_conflict">L\'installation a échoué parce que l\'application est en conflit avec une application déjà installée. Désinstallez la version actuelle de Vanced, puis réessayez.</string>
<string name="installation_failed">L\'installation a échouée pour une raison inconnue, rejoignez notre Telegram ou Discord pour obtenir de l\'aide.</string>
<string name="installation_incompatible">L\'installation a échoué parce que le fichier d\'installation est incompatible avec votre appareil. Effacer les fichiers téléchargés dans les paramètres, puis réessayer.</string>
<string name="installation_invalid">L\'installation a échouée car les fichiers apk sont corrompus, veuillez réessayer.</string>
<string name="installation_signature">L\'installation a échoué car la vérification de la signature apk est activée. Désactivez la vérification de la signature apk, puis réessayez.</string>
<string name="installation_miui">L\'installation a échouée car l\'optimisation MIUI est activée. Désactivez l\'optimisation MIUI, puis réessayez.</string>
<string name="installation_storage">L\'opération à échouée, une erreur de stockage s\'est produite.</string>
<string name="modapk_missing">L\'apk Black/Dark est absent de l\'installateur, cela ne devrait pas se produire, veuillez effacer les données de l\'application Vanced Manager</string>
<string name="path_missing">Le chemin d\'installation de YouTube n\'est pas accessible ou manquant après l\'installation de Stock Split</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">चेंजलॉग</string>
<string name="downloading_file">डाउनलोड कर रहा है %1$s</string>
<string name="failed_uninstall">पैकेज की स्थापना रद्द करने में विफल %1$s</string>
<string name="error_downloading">डाउनलोड करने में इरर %1$s</string>
<string name="install">इंस्टॉल</string>
<string name="installing_app">%1$s इन्स्टॉःल कर रहा है </string>
<string name="installation_aborted">ऑपरेशन विफल हो गया क्योंकि उपयोगकर्ता ने स्थापना रद्द कर दी थी</string>
<string name="installation_blocked">उपयोगकर्ता अवरुद्ध स्थापना के कारण ऑपरेशन विफल हुआ</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">ऑपरेशन विफल हो गया क्योंकि ऐप पहले से इंस्टॉल किए गए ऐप के साथ टकराव करता है</string>
<string name="installation_failed">ऑपरेशन विफल हो गया क्योंकि यह अभी असफल रहा मुझे नहीं पता</string>
<string name="installation_incompatible">ऑपरेशन विफल हो गया क्योंकि ऐप आपके डिवाइस के साथ असंगत है</string>
<string name="installation_invalid">ऑपरेशन विफल हो गया क्योंकि एपीके फाइलें अमान्य हैं</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">Vनाथ स्थापित करते समय अप्रत्याशित त्रुटि हुई। क्या आपने MiUI ऑप्टिमाइज़ेशन को अक्षम कर दिया है?</string>
<string name="installation_storage">संग्रहण विफल होने के कारण ऑपरेशन विफल हो गया। पकड़ो कि यह कैसे संभव है?</string>
<string name="installation_wait">कृपया स्थापना समाप्त होने तक प्रतीक्षा करें</string>
<string name="installation_wait">कृपया स्थापना समाप्त होने तक प्रतीक्षा करें।</string>
<string name="button_reinstall">फिर से इंस्टॉल</string>
<string name="version_installed">(इन्स्टॉल्ड</string>
<string name="latest">लेट्इस्ट</string>
<string name="successfully_installed">सफलतापूर्वक इन्स्टॉल्ड %1$s</string>
<string name="network_error">नेटवर्क कनेक्शन अनुपलब्ध है</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="version_installed">इन्स्टॉल्ड:</string>
<string name="latest">नवीनतम</string>
<string name="no_microg">microG स्थापित नहीं है</string>
<string name="root_not_granted">रूट एक्सेस प्रदान नही किया गया</string>
<string name="unavailable">अनुपलब्ध</string>
<string name="update">पडेट करें</string>
<string name="update">अद्यतन करें</string>
<string name="useful_links">उपयोगी लिंक्स </string>
<string name="website_text">वेबसाइट</string>
<string name="support_us">हमें सपॉर्ट कीजिये!</string>
<string name="version_toast">%1$s संस्करण कॉपी किया गया था!</string>
<string name="version_toast">%1$s संस्करण संख्या कॉपी की गई थी!</string>
<!-- Settings -->
<string name="accent_color">एक्सेंट रंग</string>
<string name="accent_blue">नीला</string>
@ -48,51 +33,74 @@
<string name="accent_yellow">पीला</string>
<string name="category_interface">इंटरफेस</string>
<string name="category_manager">मैनेजर</string>
<string name="check_updates">पडेट के लिए जाँचे</string>
<string name="chosen_install_values">इंस्टालेशन चुनाव</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="check_updates">द्यतनों के लिए जाँचें</string>
<string name="chosen_install_values">स्थापना प्राथमिकताएँ चुना</string>
<string name="chosen_lang">भाषा (एं): %1$s</string>
<string name="chosen_theme">थीम: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="clear_files">डाउनलोड की गई फ़ाइलें साफ़ करें</string>
<string name="cleared_files">फ़ाइलें सफलतापूर्वक साफ़ की गई</string>
<string name="firebase_title">फायरबेस वैश्लेषिकी</string>
<string name="firebase_summary">इससे हम एप्लिकेशन प्रदर्शन और क्रैश लॉग के बारे में जानकारी एकत्र कर सकते हैं</string>
<string name="language_title">Language</string>
<string name="link_title">क्रोम कस्टम टैब का उपयोग करें</string>
<string name="link_custom_tabs">क्रोम कस्टम टैब में लिंक खुलेंगे</string>
<string name="link_external_browser">लिंक एक बाहरी ब्राउज़र में खुलेंगे</string>
<string name="new_installer_title">नए रूट इंस्टॉलर (प्रायोगिक) का उपयोग करें</string>
<string name="new_installer_summary">यह इंस्टॉलर हस्ताक्षर सत्यापन की स्थिति पर निर्भर नहीं करता है।
चेतावनी: यदि आप इसका उपयोग करके इसे स्थापित करते हैं तो रिबूट के बाद Vanced गायब हो सकता है</string>
<string name="system_default">System Default</string>
<string name="theme">थीम</string>
<string name="theme_follow">सिस्टम का पालन करें</string>
<string name="theme_dark">डार्क थीम</string>
<string name="theme_light">लाइट थीम</string>
<string name="update_url">चैनल URL अपडेट करें</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s पुश सूचनाएँ</string>
<string name="push_notifications_summary">जब %1$s का अपडेट जारी किया जाता है, तो पुश सूचनाएँ प्राप्त करें</string>
<string name="re_check">री-चेक</string>
<string name="update_center">अपडेट केंद्र</string>
<string name="update_found">अपडेट मिला!</string>
<string name="update_notfound">कोई नया अपडेट नहीं</string>
<!-- Dialogs -->
<string name="button_dismiss">डिस्मिस</string>
<string name="guide">गाइड</string>
<string name="hold_on">रुक!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">रुकें!</string>
<string name="magisk_vanced">आप Vanced के Magisk / TWRP संस्करण का उपयोग कर रहे हैं, जिसे बंद कर दिया गया है और इस ऐप का उपयोग करके अपडेट नहीं किया जा सकता है। कृपया इस Magisk मॉड्यूल को हटाकर / TWRP Vanced uninstaller का उपयोग करके हटा दें।</string>
<string name="miui_one_title">पता लगाया MiUI उपयोगकर्ता!</string>
<string name="miui_one">अरे! लगता है कि आप MiUI उपयोगकर्ता हैं। Vanced Manager को ठीक से उपयोग करने के लिए, आपको डेवलपर सेटिंग में MiUI ऑप्टिमाइज़ेशन को अक्षम करना होगा
हालाँकि, यदि आप 20.2.20 ROM पर हैं जो xiaomi.eu पर आधारित है, तो आप इस चेतावनी को सुरक्षित रूप से अनदेखा कर सकते हैं।</string>
<string name="error">इरर</string>
<string name="security_context">कृपया सुनिश्चित करें कि आपने vanced.app, Vanced Discord सर्वर या GitHub से ऐप डाउनलोड किया है</string>
<string name="miui_one">Vanced इनस्टॉल करने के लिए, आप डेवलपर सेटिंग में MIUI ऑप्टिमाइज़ेशन को निष्क्रिय करें। (यदि आप 20.2.20 या बाद में xiaomi.eu आधारित ROM का उपयोग कर रहे हैं तो आप इस चेतावनी को अनदेखा कर सकते हैं)</string>
<string name="error">त्रुटि</string>
<string name="security_context">सुनिश्चित करें कि आपने vanced.app, Vanced Discord सर्वर या Vanced GitHub से ऐप डाउनलोड किया है</string>
<string name="success">सफलता!</string>
<string name="vanced_installed">नृत्य सफलतापूर्वक स्थापित किया गया है, क्या आप इसे अभी लॉन्च करना चाहते हैं?</string>
<string name="launch">लॉन्च</string>
<string name="welcome">स्वागत हे</string>
<string name="vanced_installed">सफलतापूर्वक स्थापित किया गया है! अब खोलो?</string>
<string name="music_installed">वेंसड संगीत सफलतापूर्वक स्थापित किया गया है! अब खोले?</string>
<string name="launch">खोले</string>
<string name="welcome">स्वागत है!</string>
<!-- Install Page -->
<string name="choose_preferred_language">वांसड के लिए अपनी पसंदीदा भाषा चुनें</string>
<string name="choose_preferred_language">Vanced के लिए अपनी पसंदीदा भाषा (ए) चुनें</string>
<string name="choose_preferred_language_note">नोट: यदि आप अंग्रेजी के अलावा कुछ भी स्थापित करते हैं, तब भी अंग्रेजी एक अतिरिक्त भाषा के रूप में स्थापित की जाएगी</string>
<string name="choose_preferred_theme">अपने पसंदीदा विषय को नृत्य के लिए चुनें</string>
<string name="disable_signature">रूट मोड का पता चला! प्रबंधक के लिए Vanced को सही तरीके से स्थापित करने के लिए, कृपया सुनिश्चित करें कि आपने हस्ताक्षर सत्यापन को अक्षम कर दिया है।</string>
<string name="finish">अन्त</string>
<string name="choose_preferred_theme">Vanced के लिए अपना पसंदीदा थीम चुनें</string>
<string name="finish">समाप्त करें</string>
<string name="install_light_black">लाइट + ब्लैक</string>
<string name="install_light_dark">लाइट + डार्क</string>
<string name="next">आगे</string>
<!-- About Page -->
<string name="manager_dev">मैनेजर देव</string>
<string name="sources">ूत्रों का</string>
<string name="manager_dev">प्रबंधक डेवलपर्स</string>
<string name="sources">्रोत</string>
<string name="vanced_team">वांसड टीम</string>
<!-- Error messages -->
<string name="chown_fail">सिस्टम के मालिक को एपीके को Chown करने में विफल, फिर से प्रयास करें</string>
<string name="error_downloading">डाउनलोड करने में त्रुटि %1$s</string>
<string name="failed_uninstall">पैकेज की स्थापना रद्द करने में विफल %1$s</string>
<string name="files_missing_va">फाइलें गायब हैं, डाउनलोड में विफल?</string>
<string name="ifile_missing">डार्क / ब्लैक.पैक रीड नहीं हो सकता (क्या स्टोरेज ब्लॉक हो गया?) या फाइल मिसिंग है</string>
<string name="installation_aborted">स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना रद्द कर दी थी</string>
<string name="installation_blocked">स्थापना विफल रही क्योंकि उपयोगकर्ता ने स्थापना को अवरुद्ध कर दिया।</string>
<string name="installation_downgrade">स्थापना विफल रही क्योंकि उपयोगकर्ता ने पैकेज को डाउनग्रेड करने का प्रयास किया। स्टॉक YouTube ऐप से अपडेट अनइंस्टॉल करें, फिर प्रयास करें।</string>
<string name="installation_conflict">इंस्टॉलेशन विफल रहा क्योंकि ऐप पहले से इंस्टॉल किए गए ऐप के साथ टकराव करता है। Vanced के वर्तमान संस्करण को अनइंस्टॉल करें, फिर पुनः प्रयास करें।</string>
<string name="installation_failed">अज्ञात कारणों से स्थापना विफल हो गई, आगे के समर्थन के लिए हमारे टेलीग्राम या डिसॉर्ड में शामिल हों।</string>
<string name="installation_incompatible">इंस्टॉलेशन विफल हो गया क्योंकि इंस्टॉलेशन फ़ाइल आपके डिवाइस के साथ असंगत है। सेटिंग्स में डाउनलोड की गई फ़ाइलों को साफ़ करें, फिर प्रयास करें।</string>
<string name="installation_invalid">स्थापना विफल रही क्योंकि एपीके फ़ाइलें दूषित हैं, कृपया पुनः प्रयास करें।</string>
<string name="installation_signature">स्थापना विफल रही क्योंकि एपीके हस्ताक्षर सत्यापन सक्षम है। एपीके हस्ताक्षर सत्यापन अक्षम करें, फिर प्रयास करें।</string>
<string name="installation_miui">MIUI ऑप्टिमाइज़ेशन सक्षम होने के कारण स्थापना विफल रही। MIUI ऑप्टिमाइज़ेशन अक्षम करें, फिर प्रयास करें।</string>
<string name="installation_storage">संग्रहण त्रुटि के कारण स्थापना विफल रही।</string>
<string name="modapk_missing">इंस्टॉलर से Black/Dark apk गायब है, ऐसा नहीं होना चाहिए, कृपया प्रबंधक का ऐप डेटा हटा दें</string>
<string name="path_missing">स्टॉक Youtube इंस्टॉल पथ एक्सेस करने योग्य नहीं है या स्टॉक स्प्लिट इंस्टॉल के बाद गुम है</string>
</resources>

View file

@ -9,28 +9,13 @@
<string name="title_home">Kezdőlap</string>
<string name="title_settings">Beállítások</string>
<!-- Home Page -->
<string name="changelogs">Változtatások</string>
<string name="changelogs">Változások listája</string>
<string name="downloading_file">%1$s letöltése</string>
<string name="failed_uninstall">A %1$s-t nem sikerült eltávolítani</string>
<string name="error_downloading">%1$s letöltése nem sikerült</string>
<string name="install">Telepítés</string>
<string name="installing_app">%1$s telepítése</string>
<string name="installation_aborted">A művelet végrehajtása nem sikerült, mert a felhasználó megszakította a telepítést.</string>
<string name="installation_blocked">A művelet végrehajtása nem sikerült, mert a felhasználó megszakította a telepítést.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Művelet végrehajtása nem sikerült, mert egy másik hasonló alkalmazás telepítve van.</string>
<string name="installation_failed">Művelet végrehajtása ismeretlen okok miatt nem sikerült, támogatásért csatlakozzon a Telegram vagy a Discord csoportunkhoz.</string>
<string name="installation_incompatible">Művelet végrehajtása nem sikerült, mert az alkalmazás nem kompatibilis az eszközével.</string>
<string name="installation_invalid">Művelet végrehajtása nem sikerült, mert a telepítőcsomagok érvénytelenek.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">Váratlan hiba történt a Vanced telepítése közben. Kikapcsolta a MIUI-optimalizációt?</string>
<string name="installation_storage">Tárhely hiba miatt a művelet megszakadt.</string>
<string name="installation_wait">Várj míg a telepítés befejeződik…</string>
<string name="installation_wait">Várjon amíg a telepítés befejeződik.</string>
<string name="button_reinstall">Újratelepítés</string>
<string name="version_installed">Telepítve:</string>
<string name="latest">Legújabb:</string>
<string name="successfully_installed">%1$s sikeresen telepítve</string>
<string name="network_error">Nincs internetkapcsolat</string>
<string name="no_microg">microG nincs telepítve</string>
<string name="root_not_granted">Nincs root jogosultság</string>
<string name="unavailable">Nem elérhető</string>
@ -38,7 +23,7 @@
<string name="useful_links">Hasznos hivatkozások</string>
<string name="website_text">Honlap</string>
<string name="support_us">Támogasson bennünket!</string>
<string name="version_toast">%1$s verzió másolva!</string>
<string name="version_toast">%1$s verzió szám másolva!</string>
<!-- Settings -->
<string name="accent_color">Kiemelés színe</string>
<string name="accent_blue">Kék</string>
@ -50,48 +35,73 @@
<string name="category_manager">Manager</string>
<string name="check_updates">Frissítések ellenőrzése</string>
<string name="chosen_install_values">Telepítési preferencia</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_lang">Nyelv: %1$s</string>
<string name="chosen_theme">Téma: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="clear_files">Letöltött fájlok törlése</string>
<string name="cleared_files">Sikeresen törölte a fájlokat</string>
<string name="firebase_title">Firebase Analytics</string>
<string name="firebase_summary">This lets us collect information about app performance and crash logs</string>
<string name="language_title">Language</string>
<string name="link_title">Egyéni Chrome lapok használata</string>
<string name="link_custom_tabs">A linkek egyéni Chrome ablakban nyílnak meg</string>
<string name="link_external_browser">A linkek egy külső böngészőben nyílnak meg</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">System Default</string>
<string name="theme">Kinézet</string>
<string name="theme_follow">Rendszertéma követése</string>
<string name="theme_dark">Sötét téma</string>
<string name="theme_light">Világos téma</string>
<string name="update_url">Frissítési csatorna</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s Leküldéses (Push) Értesítések</string>
<string name="push_notifications_summary">Értesítések fogadása, amikor a %1$s számára frissítés érhető el</string>
<string name="re_check">Ellenőrizze újra</string>
<string name="update_center">Frissítő központ</string>
<string name="update_found">Frissítés érhető el!</string>
<string name="update_notfound">Nincsenek új frissítések</string>
<!-- Dialogs -->
<string name="button_dismiss">Bezár</string>
<string name="guide">Útmutató</string>
<string name="hold_on">Figyelem!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">Állj!</string>
<string name="magisk_vanced">A Vanced Magisk/TWRP verzióját használod, ami már nem támogatott és nem frissíthető ezzel az alkalmazással. Távolítsd el a Magisk modul eltávolításával vagy TWRP Vanced eltávolítóval.</string>
<string name="miui_one_title">MIUI észlelve!</string>
<string name="miui_one">Hey! Úgy néz ki MIUI felhasználó vagy. Hogy megfelelően működjön az alkalmazás, kapcsold ki a MIUI-optimalizációt a Fejlesztői beállításokban. (Figyelmen kívül hagyhatod xiaomi.eu 20.2.20 vagy későbbi verzió használata esetén)</string>
<string name="miui_one">Hogy a Vanced-et telepítsd, ki KELL kapcsolnod a MIUI Optimalizációt a fejlesztői beállításokban. (Ezt figyelmen kívül hagyhatod ha 20.2.20 vagy későbbi xiaomi.eu alapú ROM-ot használsz)</string>
<string name="error">Hiba</string>
<string name="security_context">Arra kérünk, győződj meg róla, hogy ezt az alkalmazást a vanced.app oldalról, a Vanced Discord szerveréről vagy a Vanced GitHub-ról töltötted le</string>
<string name="security_context">Bizonyosodj meg róla, hogy az alkalmazást a vanced.app oldalról, a Vanced Discord szerverről vagy a Vanced GitHub-ról töltötted le</string>
<string name="success">Kész!</string>
<string name="vanced_installed">Vanced sikeresen telepítve! Elindítod most?</string>
<string name="launch">Indítás</string>
<string name="music_installed">Vanced Music sikeresen települt! Megnyitja most?</string>
<string name="launch">Megnyitás</string>
<string name="welcome">Üdvözöljük</string>
<!-- Install Page -->
<string name="choose_preferred_language">Preferált nyelv választása</string>
<string name="choose_preferred_language">Vanced nyelvének kiválasztása</string>
<string name="choose_preferred_language_note">Az angol mindíg telepítve lesz, mint választható nyelv.</string>
<string name="choose_preferred_theme">Vanced téma kiválasztása</string>
<string name="disable_signature">Root jogosultság észlelve! A Vanced telepítéséhez kapcsold ki a csomagaláírás ellenőrzést.</string>
<string name="finish">Kész</string>
<string name="install_light_black">Világos + Sötét</string>
<string name="install_light_dark">Világos + Fekete</string>
<string name="next">Következő</string>
<!-- About Page -->
<string name="manager_dev">Vezető fejlesztő</string>
<string name="manager_dev">Fejlesztői Menedzser</string>
<string name="sources">Források</string>
<string name="vanced_team">Vanced csapat</string>
<!-- Error messages -->
<string name="chown_fail">Nem sikerült az Apk megosztása a rendszer tulajdonosával. Próbálja újra</string>
<string name="error_downloading">%1$s letöltése nem sikerült</string>
<string name="failed_uninstall">A %1$s-t nem sikerült eltávolítani</string>
<string name="files_missing_va">Hiányzó fájlok, újra tölti?</string>
<string name="ifile_missing">Dark/Black.apk nem olvasható (Blokkolva lett a tárhely) vagy hiányzó fájl</string>
<string name="installation_aborted">A telepítés nem sikerült, mert a felhasználó elutasította azt.</string>
<string name="installation_blocked">A telepítés nem sikerült, mert a felhasználó megszakította azt.</string>
<string name="installation_downgrade">A telepítés nem sikerült, mert a felhasználó régebbi verziót próbált telepíteni.
Távolítsd el a gyári YouTube app frissítéseit, majd próld újra.</string>
<string name="installation_conflict">A telepítés nem sikerült, mert az alkalmazás egy már telepített alkalmazással ütközik. Távolítsd el a jelenlegi Vanced-et és próbáld újra.</string>
<string name="installation_failed">A telepítés ismeretlen okok miatt nem sikerült, támogatásért csatlakozz a Telegram vagy a Discord csoportunkhoz.</string>
<string name="installation_incompatible">A telepítés nem sikerült, mert a telepítő fájl nem kompatibilis az eszközöddel. Töröld ki a letöltött fájlokat a beállításokban és próbáld újra.</string>
<string name="installation_invalid">A telepítés nem sikerült, mert az apk fájlok korruptak, próbáld újra.</string>
<string name="installation_signature">A telepítés nem sikerült, mert az apk aláírás ellenőrzés engedélyezve van.
Kapcsold ki az apk aláírás ellenőrzését és próbáld újra.</string>
<string name="installation_miui">A telepítés nem sikerült, mert a MIUI Optimalizáció engedélyezve van. Kapcsold ki a MIUI Optimalizációt és próbáld újra.</string>
<string name="installation_storage">Tárhely hiba miatt a telepítés nem sikerült.</string>
<string name="modapk_missing">Balck/Dark apk hiányzik a telepítőből, ez nem történhet meg, kérjük törölje az alkamazás adatait</string>
<string name="path_missing">A részvény Youtube telepítési útvonala nem érhető el vagy hiányzik a részvények felosztása után</string>
</resources>

View file

@ -6,31 +6,16 @@
<string name="save">Simpan</string>
<!-- Main Activity -->
<string name="title_about">Tentang</string>
<string name="title_home">Menu Utama</string>
<string name="title_home">Beranda</string>
<string name="title_settings">Pengaturan</string>
<!-- Home Page -->
<string name="changelogs">Catatan perubahan</string>
<string name="downloading_file">Mengunduh %1$s</string>
<string name="failed_uninstall">Gagal mencopot pemasangan paket %1$s</string>
<string name="error_downloading">Gagal Mengunduh %1$s</string>
<string name="install">Pasang</string>
<string name="installing_app">Memasang %1$s</string>
<string name="installation_aborted">Proses gagal karena pengguna membatalkan instalasi.</string>
<string name="installation_blocked">Proses gagal karena pengguna memblokir instalasi.</string>
<string name="installation_downgrade">Proses gagal karena pengguna mencoba untuk menurunkan versi paket. Apakah anda mempunyai YouTube bawaan terpasang?</string>
<string name="installation_conflict">Proses gagal karena aplikasi konflik dengan aplikasi yang sudah terpasang.</string>
<string name="installation_failed">Proses gagal karena alasan yang tidak diketahui, mohon gabung Telegram atau Discord kami untuk bantuan.</string>
<string name="installation_incompatible">Proses gagal karena aplikasi tidak kompatibel dengan perangkat anda.</string>
<string name="installation_invalid">Proses gagal karena apk files tidak valid.</string>
<string name="installation_signature">Proses gagal karena pengguna tidak menonaktifkan apk signature verification</string>
<string name="installation_miui">Kesalahan tidak terduga terjadi saat memasang Vanced. Apakah anda sudah menonaktifkan Optimisasi MIUI.</string>
<string name="installation_storage">Proses gagal karena kesalahan penyimpanan.</string>
<string name="installation_wait">Mohon tunggu sampai instalasi selesai</string>
<string name="installation_wait">Mohon tunggu sampai instalasi selesai.</string>
<string name="button_reinstall">Pasang ulang</string>
<string name="version_installed">Terpasang:</string>
<string name="latest">Terbaru:</string>
<string name="successfully_installed">Berhasil dipasang %1$s</string>
<string name="network_error">Koneksi internet tidak tersedia</string>
<string name="no_microg">microG tidak terpasang</string>
<string name="root_not_granted">Akses Root tidak diberikan</string>
<string name="unavailable">Tidak tersedia</string>
@ -38,7 +23,7 @@
<string name="useful_links">Tautan Berguna</string>
<string name="website_text">Situs</string>
<string name="support_us">Dukung kami!</string>
<string name="version_toast">Versi %1$s baru saja disalin!</string>
<string name="version_toast">Nomor versi %1$s telah disalin!</string>
<!-- Settings -->
<string name="accent_color">Aksen Warna</string>
<string name="accent_blue">Biru</string>
@ -49,14 +34,20 @@
<string name="category_interface">Antarmuka</string>
<string name="category_manager">Manager</string>
<string name="check_updates">Cek pembaruan</string>
<string name="chosen_install_values">Preferensi instalasi yang dipilih</string>
<string name="chosen_install_values">Preferensi pemasangan yang dipilih</string>
<string name="chosen_lang">Bahasa: %1$s</string>
<string name="chosen_theme">Tema: %1$s</string>
<string name="clear_files">Hapus file yang diunduh</string>
<string name="cleared_files">Berhasil menghapus file</string>
<string name="firebase_title">Analisis Firebase</string>
<string name="firebase_summary">Ini menginjinkan kami mengumpulkan informasi tentang performa aplikasi dan catatan crash</string>
<string name="language_title">Bahasa</string>
<string name="link_title">Gunakan Chrome Custom Tabs</string>
<string name="link_custom_tabs">Tautan akan terbuka di Chrome Custom Tabs</string>
<string name="link_external_browser">Tautan akan terbuka di Browser Eksternal</string>
<string name="new_installer_title">Gunakan pemasang root yang baru (Eksperimental)</string>
<string name="new_installer_summary">Pemasang ini tidak bergantung pada status Signature Verification. PERINGATAN: Vanced mungkin menghilang setelah reboot jika Anda memasangnya menggunakan ini</string>
<string name="system_default">Default Sistem</string>
<string name="theme">Tema</string>
<string name="theme_follow">Ikuti Sistem</string>
<string name="theme_dark">Tema Gelap</string>
@ -69,23 +60,22 @@
<string name="update_found">Pembaruan ditemukan!</string>
<string name="update_notfound">Tidak ada pembaruan</string>
<!-- Dialogs -->
<string name="button_dismiss">Hilangkan</string>
<string name="guide">Petunjuk</string>
<string name="hold_on">Tahan!</string>
<string name="magisk_vanced">Sepertinya anda menggunakan Vanced versi Magisk/TWRP, yang pengembangannya dihentikan dan tidak bisa diperbarui menggunakan aplikasi ini. Mohon untuk menghapus itu terlebih dahulu dengan menghapus modul magisk/gunakan pencopot Vanced TWRP.</string>
<string name="hold_on">Berhenti!</string>
<string name="magisk_vanced">Anda memakai Vanced versi Magisk/TWRP, yang pengembangannya dihentikan dan tidak bisa diperbarui menggunakan aplikasi ini. Mohon untuk menghapus itu dengan menghapus modul magisk/gunakan pencopot Vanced TWRP.</string>
<string name="miui_one_title">MIUI terdeteksi!</string>
<string name="miui_one">Hai! Sepertinya kamu pengguna MIUI. Untuk dapat menggunakan aplikasi ini dengan benar, anda harus menonaktifkan optimisasi MiUI di pengaturan developer. (Anda dapat mengabaikan peringatan ini jika anda berada pada ROM versi 20.2.20 atau lebih yang didasarkan pada xiaomi.eu)</string>
<string name="miui_one">Agar bisa memasang Vanced, anda HARUS menonaktifkan Optimisasi MIUI di pengaturan pengembang. (Anda bisa mengabaikan peringatan ini jika anda menggunakan ROM versi 20.2.20 atau lebih yang didasarkan xiaomi.eu)</string>
<string name="error">Terjadi kesalahan</string>
<string name="security_context">Pastikan anda mengunduh aplikasi ini hanya dari vanced.app, Vanced Discord server atau Vanced GitHub</string>
<string name="security_context">Pastikan anda mengunduh aplikasi dari vanced.app, Vanced Discord server atau dari Vanced GitHub</string>
<string name="success">Berhasil!</string>
<string name="vanced_installed">Vanced berhasil terpasang! Buka sekarang?</string>
<string name="vanced_installed">Vanced berhasil dipasang! Buka sekarang?</string>
<string name="music_installed">Vanced Musik berhasil dipasang! Buka sekarang?</string>
<string name="launch">Buka</string>
<string name="welcome">Selamat datang</string>
<!-- Install Page -->
<string name="choose_preferred_language">Pilih bahasa yang anda inginkan untuk Vanced</string>
<string name="choose_preferred_language_note">Catatan: Inggris akan selalu terpasang sebagai bahasa tambahan.</string>
<string name="choose_preferred_theme">Pilih tema yang anda inginkan untuk Vanced</string>
<string name="disable_signature">Mode Root terdeteksi! Untuk dapat memasang Vanced, anda harus menonaktifkan apk signature verification.</string>
<string name="finish">Selesai</string>
<string name="install_light_black">Terang + Hitam</string>
<string name="install_light_dark">Terang + Gelap</string>
@ -94,4 +84,22 @@
<string name="manager_dev">Pengembang Manager</string>
<string name="sources">Sumber</string>
<string name="vanced_team">Tim Vanced</string>
<!-- Error messages -->
<string name="chown_fail">Gagal untuk Chown Apk untuk pemilik sistem, Coba Lagi</string>
<string name="error_downloading">Gagal Mengunduh %1$s</string>
<string name="failed_uninstall">Gagal mencopot pemasangan paket %1$s</string>
<string name="files_missing_va">File menghilang, Gagal Mengunduh?</string>
<string name="ifile_missing">Dark/Black.apk Tidak Bisa Dibaca (Apakah Penyimpanan Diblokir?) atau File Menghilang</string>
<string name="installation_aborted">Pemasangan gagal karena pengguna membatalkan pemasangan.</string>
<string name="installation_blocked">Pemasangan gagal karena pengguna memblokir pemasangan.</string>
<string name="installation_downgrade">Pemasangan gagal karena pengguna mencoba untuk menurunkan versi paket. Hapus pembaruan dari aplikasi YouTube bawaan, lalu coba lagi.</string>
<string name="installation_conflict">Pemasangan gagal karena aplikasi konflik dengan aplikasi yang sudah terpasang. Hapus versi Vanced yang sekarang, lalu coba lagi.</string>
<string name="installation_failed">Pemasangan gagal untuk alasan yang tidak diketahui, gabung Telegram atau Discord kami untuk bantuan lebih lanjut.</string>
<string name="installation_incompatible">Pemasangan gagal karena file pemasangan tidak kompatibel dengan perangkat anda. Hapus file yang diunduh di pengaturan, lalu coba lagi.</string>
<string name="installation_invalid">Pemasangan gagal karena file apk rusak, mohon coba lagi.</string>
<string name="installation_signature">Pemasangan gagal karena apk signature verification diaktifkan. Nonaktifkan apk signature verification, lalu coba lagi.</string>
<string name="installation_miui">Pemasangan gagal karena Optimisasi MIUI diaktifkan. Nonaktifkan Optimisasi MIUI, lalu coba lagi.</string>
<string name="installation_storage">Pemasangan gagal karena kesalahan pada penyimpanan.</string>
<string name="modapk_missing">Black/Dark apk hilang dari pemasang, Ini seharusnya tidak terjadi, mohon hapus data aplikasi manager</string>
<string name="path_missing">Install Path Youtube Bawaan Tidak Dapat Diakses Atau Menghilang Setelah Stock Split Install</string>
</resources>

View file

@ -11,26 +11,11 @@
<!-- Home Page -->
<string name="changelogs">Note di rilascio</string>
<string name="downloading_file">Download in corso di %1$s</string>
<string name="failed_uninstall">Impossibile disinstallare il pacchetto %1$s</string>
<string name="error_downloading">Errore nel download di %1$s</string>
<string name="install">Installa</string>
<string name="installing_app">Installazione in corso di %1$s</string>
<string name="installation_aborted">Operazione fallita, l\'utente ha annullato l\'installazione.</string>
<string name="installation_blocked">Operazione fallita, l\'utente ha bloccato l\'installazione.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">Operazione fallita, app in conflitto con un\'app già installata.</string>
<string name="installation_failed">Operazione fallita, motivo sconosciuto. Unisciti al gruppo di Telegram o su Discord per ricevere assistenza.</string>
<string name="installation_incompatible">Operazione fallita, l\'app non è compatibile con il dispositivo</string>
<string name="installation_invalid">Operazione fallita, i file apk non sono validi.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">Si è verificato un errore imprevisto durante l\'installazione di Vanced. Hai disattivato le ottimizzazioni di MIUI?</string>
<string name="installation_storage">Operazione fallita, si è verificato un errore con lo spazio di archiviazione.</string>
<string name="installation_wait">Per favore, attendi la conclusione dell\'installazione</string>
<string name="installation_wait">Attendere il completamento dell\'installazione</string>
<string name="button_reinstall">Reinstalla</string>
<string name="version_installed">Versione installata:</string>
<string name="latest">Ultima versione:</string>
<string name="successfully_installed">%1$s installato con successo</string>
<string name="network_error">Connessione alla rete non disponibile</string>
<string name="no_microg">microG non è installato</string>
<string name="root_not_granted">Non è stato fornito l\'accesso di root</string>
<string name="unavailable">Non disponibile</string>
@ -38,7 +23,7 @@
<string name="useful_links">Link utili</string>
<string name="website_text">Sito web</string>
<string name="support_us">Sostienici!</string>
<string name="version_toast">La versione %1$s è stata copiata!</string>
<string name="version_toast">Il numero di versione di %1$s è stato copiato!</string>
<!-- Settings -->
<string name="accent_color">Colore evidenziatore</string>
<string name="accent_blue">Blu</string>
@ -54,9 +39,15 @@
<string name="chosen_theme">Tema: %1$s</string>
<string name="clear_files">Cancella i file scaricati</string>
<string name="cleared_files">File cancellati con successo</string>
<string name="firebase_title">Analitica Firebase</string>
<string name="firebase_summary">Questo ci consente di raccogliere informazioni sulle prestazioni dell\'app e sui registri degli arresti anomali</string>
<string name="language_title">Lingua</string>
<string name="link_title">Utilizza le schede personalizzate di Chrome</string>
<string name="link_custom_tabs">I link verranno aperti nelle schede personalizzate di Chrome</string>
<string name="link_external_browser">I link verranno aperti in un browser esterno</string>
<string name="new_installer_title">Utilizza il nuovo metodo di installazione root (Sperimentale)</string>
<string name="new_installer_summary">Questo programma di installazione non dipende dallo stato di Verifica della Firma. ATTENZIONE: Vanced potrebbe essere rimosso dopo il riavvio se installato con questo metodo</string>
<string name="system_default">Predefinito di Sistema</string>
<string name="theme">Tema</string>
<string name="theme_follow">Utilizza quello di sistema</string>
<string name="theme_dark">Tema scuro</string>
@ -69,23 +60,22 @@
<string name="update_found">Aggiornamento trovato!</string>
<string name="update_notfound">Non ci sono nuovi aggiornamenti</string>
<!-- Dialogs -->
<string name="button_dismiss">Ignora</string>
<string name="guide">Guida</string>
<string name="hold_on">Aspetta!</string>
<string name="magisk_vanced">Sembra che tu stia utilizzando la versione di Vanced ottenuta con Magisk/TWRP, che è obsoleta e non può essere aggiornata con questa app. Per favore, rimuovila eliminando il modulo di Magisk/utilizzando TWRP Vanced uninstaller.</string>
<string name="magisk_vanced">Stai utilizzando la versione di Vanced ottenuta con Magisk/TWRP, ormai è obsoleta e non può essere aggiornata con questa app. Per favore, rimuovila eliminando il modulo di Magisk oppure utilizzando TWRP Vanced uninstaller.</string>
<string name="miui_one_title">Rilevata l\'interfaccia MIUI!</string>
<string name="miui_one">Ehi! Sembra che tu sia un utente MIUI. Per poter utilizzare correttamente questa applicazione, devi disattivare le ottimizzazioni di MIUI nelle impostazioni per sviluppatore (se stai utilizzando la ROM 20.2.20 basata su xiaomi.eu, puoi ignorare questo avviso).</string>
<string name="miui_one">Per poter installare Vanced, DEVI PER FORZA disattivare le ottimizzazioni di MIUI nelle impostazioni da sviluppatore (puoi ignorare questo avviso se stai utilizzando la versione 20.2.20 o successive di una ROM basata su xiaomi.eu).</string>
<string name="error">Errore</string>
<string name="security_context">Assicurati di aver scaricato l\'app da vanced.app, dal server di Discord di Vanced o dalla pagina GitHub di Vanced</string>
<string name="success">Fatto!</string>
<string name="vanced_installed">Vanced è stato installato con successo. Vuoi avviarlo ora?</string>
<string name="music_installed">Vanced Music è stato installato con successo! Vuoi eseguirlo ora?</string>
<string name="launch">Avvia</string>
<string name="welcome">Benvenuto</string>
<!-- Install Page -->
<string name="choose_preferred_language">Seleziona la tua lingua preferita per Vanced</string>
<string name="choose_preferred_language">Scegli le tue lingue preferite per Vanced</string>
<string name="choose_preferred_language_note">Nota: l\'inglese sarà comunque installato, indipendentemente dalla tua scelta.</string>
<string name="choose_preferred_theme">Seleziona il tuo tema preferito per Vanced</string>
<string name="disable_signature">Modalità root rilevata! Per poter installare correttamente Vanced, assicurati di disattivare la verifica della firma per gli apk.</string>
<string name="finish">Concludi</string>
<string name="install_light_black">Chiaro + nero</string>
<string name="install_light_dark">Chiaro + scuro</string>
@ -94,4 +84,22 @@
<string name="manager_dev">Sviluppatori di Manager</string>
<string name="sources">Codice sorgente</string>
<string name="vanced_team">Il team di Vanced</string>
<!-- Error messages -->
<string name="chown_fail">Impossibile modificare il proprietario dell\'apk, riprova</string>
<string name="error_downloading">Errore nel download di %1$s</string>
<string name="failed_uninstall">Impossibile disinstallare il pacchetto %1$s</string>
<string name="files_missing_va">File mancanti, download non riuscito?</string>
<string name="ifile_missing">L\'apk scura/nera non può essere letta (permesso di archiviazione bloccato?) oppure il file è mancante</string>
<string name="installation_aborted">Installazione non riuscita, l\'utente ha annullato l\'installazione.</string>
<string name="installation_blocked">Installazione non riuscita, l\'utente ha bloccato l\'installazione.</string>
<string name="installation_downgrade">Installazione non riuscita, l\'utente ha provato a eseguire il downgrade del pacchetto. Disinstalla gli aggiornamenti dell\'app predefinita di YouTube, poi riprova.</string>
<string name="installation_conflict">Installazione non riuscita, l\'app va in conflitto con un\'app già installata. Disinstalla la versione attuale di Vanced, poi riprova.</string>
<string name="installation_failed">Installazione non riuscita a causa di un errore sconosciuto, unisciti al nostro gruppo Telegram o al server di Discord per ricevere ulteriore assistenza.</string>
<string name="installation_incompatible">Installazione non riuscita, il file di installazione non è compatibile con il tuo dispositivo. Elimina i file scaricati nelle impostazioni, poi riprova.</string>
<string name="installation_invalid">Installazione non riuscita a causa di file apk corrotti, si prega di riprovare.</string>
<string name="installation_signature">Installazione non riuscita, la verifica della firma apk è attivata. Disattiva la verifica della firma apk, poi riprova.</string>
<string name="installation_miui">Installazione non riuscita, le ottimizzazioni di MIUI sono attivate. Disattiva le ottimizzazioni di MIUI, poi riprova.</string>
<string name="installation_storage">Installazione non riuscita, errore dello spazio di archiviazione.</string>
<string name="modapk_missing">L\'apk nera/scura manca dal programma di installazione. Non dovrebbe succedere, pulisci i dati dell\'app Manager</string>
<string name="path_missing">Percorso predefinito di installazione YouTube non accessibile o mancante dopo dopo l\'installazione di Stock Split</string>
</resources>

View file

@ -11,34 +11,19 @@
<!-- Home Page -->
<string name="changelogs">שינויים</string>
<string name="downloading_file">מוריד את %1$s</string>
<string name="failed_uninstall">יש בעיה במחיקת החבילה %1$s</string>
<string name="error_downloading">בעיה בהורדה של %1$s</string>
<string name="install">התקנה</string>
<string name="installing_app">מתקין את %1$s</string>
<string name="installation_aborted">הפעולה נכשלה מכיוון שהמשתמש ביטל את ההתקנה.</string>
<string name="installation_blocked">הפעולה נכשלה מכיוון שהמשתמש חסם את ההתקנה.</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">הפעולה נכשלה מכיוון שהאפליקציה סותרת עם אפליקציה שכבר מותקנת.</string>
<string name="installation_failed">הפעולה נכשלה בגלל סיבה אינה ידועה, בבקשה הצטרפו לטלגרם או דיסקורד שלנו בשביל עזרה.</string>
<string name="installation_incompatible">הפעולה נכשלה משום שהאפליקציה אינה תואמת למכשירך.</string>
<string name="installation_invalid">הפעולה נכשלה משום שהAPK אינו תקין.</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">שגיאה לא צפויה התרחשה בזמן ההתקנה. האם ביטלת את MIUI Optimisations?</string>
<string name="installation_storage">הפעולה נכשלה בגלל בעיה באחסון.</string>
<string name="installation_wait">אנא המתינו לסיום ההתקנה</string>
<string name="install">התקן</string>
<string name="installation_wait">אנא המתינו לסיום ההתקנה...</string>
<string name="button_reinstall">התקן מחדש</string>
<string name="version_installed">מותקן:</string>
<string name="latest">החדש ביותר:</string>
<string name="successfully_installed">הותקן בהצלחה %1$s</string>
<string name="network_error">חיבור לרשת אינו זמין</string>
<string name="no_microg">microG isn\'t installed</string>
<string name="root_not_granted">הרשאות Root אינן הוענקו</string>
<string name="no_microg">microG לא הותקן</string>
<string name="root_not_granted">לא הוענקו הרשאות Root</string>
<string name="unavailable">אינו זמין</string>
<string name="update">עדכן</string>
<string name="useful_links">קישורים שימושיים</string>
<string name="website_text">אתר</string>
<string name="support_us">תמכו בנו!</string>
<string name="version_toast">הגרסה של %1$s הועתקה!</string>
<string name="version_toast">מספר הגרסה של %1$s הועתקה!</string>
<!-- Settings -->
<string name="accent_color">צבע הדגשה</string>
<string name="accent_blue">כחול</string>
@ -50,48 +35,71 @@
<string name="category_manager">מנהל</string>
<string name="check_updates">בדוק אחר עדכונים</string>
<string name="chosen_install_values">העדפות התקנה שנבחרו</string>
<string name="chosen_lang">Language(s): %1$s</string>
<string name="chosen_lang">שפה: %1$s</string>
<string name="chosen_theme">ערכת נושא: %1$s</string>
<string name="clear_files">Clear downloaded files</string>
<string name="cleared_files">Successfully cleared files</string>
<string name="clear_files">מחק קבצים שהורדו</string>
<string name="cleared_files">מחיקת הקבצים הסתיימה בהצלחה</string>
<string name="firebase_title">ניתוח מידע משתמש</string>
<string name="firebase_summary">זה נותן לנו לאסוף מידע על ביצועי הישום ויומני קריסה</string>
<string name="language_title">שפה</string>
<string name="link_title">השתמש בכרטיסייה מותאמת אישית של Chrome</string>
<string name="link_custom_tabs">קישורים יפתחו בכרטיסיות מותאמות אישית של Chrome</string>
<string name="link_external_browser">קישורים יפתחו בדפדפן חיצוני</string>
<string name="new_installer_title">השתמש במתקין הרוט החדש (נסיוני)</string>
<string name="new_installer_summary">המתקין הזה לא תלוי בסטטוס אימות חתימה. אזהרה: Vanced יכול להיעלם אחרי אתחול אם אתה משתמש בהתקנה הזאת</string>
<string name="system_default">ברירת מחדל</string>
<string name="theme">ערכת נושא</string>
<string name="theme_follow">בהתאם למערכת</string>
<string name="theme_dark">ערכת נושא כהה</string>
<string name="theme_light">ערכת נושא בהירה</string>
<string name="update_url">קישור ערוץ עדכון</string>
<string name="push_notifications">%1$s Push Notifications</string>
<string name="push_notifications_summary">Receive push notifications when an update for %1$s is released</string>
<string name="push_notifications">%1$s התראות דחיפה</string>
<string name="push_notifications_summary">קבל התראות דחיפה כשעדכון ל %1$s משתחרר</string>
<string name="re_check">בדיקה מחדש</string>
<string name="update_center">מרכז העדכונים</string>
<string name="update_found">עדכון נמצא!</string>
<string name="update_notfound">אין עדכונים חדשים</string>
<!-- Dialogs -->
<string name="button_dismiss">התעלם</string>
<string name="guide">מדריך</string>
<string name="hold_on">רק רגע!</string>
<string name="magisk_vanced">Looks like you\'re using the Magisk/TWRP version of Vanced, which is discontinued and can not be updated using this app. Please remove it first by removing the magisk module/using TWRP Vanced uninstaller.</string>
<string name="hold_on">עצור!</string>
<string name="magisk_vanced">נדמה שאתה משתמש בגרסת הMagisk/TWRP של Vanced, שתמיכה בה הופסקה והגרסה אינה יכולה להתעדכן בעזרת האפליקציה הזו. אנא מחק אותה קודם על ידי מחיקת מודול בMagisk.</string>
<string name="miui_one_title">MIUI זוהה!</string>
<string name="miui_one">היי! נראה שאתה משתמש MIUI. בכדי להתשמש באפליקציה זו בצורה מיטבית, תצטרך לבטל את MIUI optimisations באפשרויות מפתחים (ניתן להתעלם מאזהרה זו אם אתה מתשמש ברום מגרסה 20.2.20 ומעלה שמבוסס על xiaomi.eu.)</string>
<string name="miui_one">על מנת להתקין את Vanced, עליך להשבית אופטימיזציות של MIUI בהגדרות המפתח. (אתה יכול להתעלם מאזהרה זו אם אתה משתמש בגרסה 20.2.2. של שיאומי או יותר)</string>
<string name="error">בעיה</string>
<string name="security_context">אנא וודא שהורדת את האפליקציה מvanced.app, ערוץ הדיסקורד של Vanced או הגיטהאב.</string>
<string name="security_context">וודא שהורדת את האפליקציה מ- vanced.app, משרת הדיסקורד של Vanced או מהעמוד של Vanced בGitHub</string>
<string name="success">הצלחה!</string>
<string name="vanced_installed">Vanced הותקן בהצלחה! לפתוח עכשיו?</string>
<string name="launch">התחל</string>
<string name="music_installed">Vanced Music הותקן בהצלחה! לפתוח עכשיו?</string>
<string name="launch">פתח</string>
<string name="welcome">ברוכים הבאים</string>
<!-- Install Page -->
<string name="choose_preferred_language">בחר את השפה המועדפת עליך לVanced</string>
<string name="choose_preferred_language_note">תזכורת: אנגלית תמיד תהיה מותקנת בתור שפה נוספת.</string>
<string name="choose_preferred_theme">בחר את המראה מועדף שלך בשביל Vanced</string>
<string name="disable_signature">זוהה מצב רוט! על מנת להתקין את Vanced, תצטרך לבטל את ווידוא החתימה לAPK.</string>
<string name="finish">סיום</string>
<string name="choose_preferred_theme">בחר את המראה המועדף שלך בשביל Vanced</string>
<string name="finish">סיים</string>
<string name="install_light_black">בהיר + שחור</string>
<string name="install_light_dark">בהיר + כהה</string>
<string name="next">הבא</string>
<!-- About Page -->
<string name="manager_dev">מפתח המנהל</string>
<string name="manager_dev">מנהל המפתחים</string>
<string name="sources">מקורות</string>
<string name="vanced_team">צוות Vanced</string>
<!-- Error messages -->
<string name="chown_fail">נכשל לשנע יישום למנהל המערכת, נסה שוב</string>
<string name="error_downloading">בעיה בהורדה של %1$s</string>
<string name="failed_uninstall">יש בעיה במחיקת החבילה %1$s</string>
<string name="files_missing_va">קבצים חסרים, האם ההורדה נכשלה?</string>
<string name="ifile_missing">Dark/Black.apk לא נקראת(האם הגישה לאחסון נחסמה?) או שהקובץ חסר</string>
<string name="installation_aborted">הפעולה נכשלה מכיוון שהמשתמש ביטל את ההתקנה.</string>
<string name="installation_blocked">ההתקנה נכשלה מכיוון שהמשתמש חסם את ההתקנה.</string>
<string name="installation_downgrade">ההתקנה נכשלה מכיוון שהמשתמש ניסה לשנמך את הגירסה. מחק עדכונים מהיוטיוב הרגיל, ואז נסה שוב.</string>
<string name="installation_conflict">ההתקנה נכשלה מכיוון שהישום מתנגש עם גרסה מותקנת, מחק את הגרסה הנוכחית של Vanced, ונסה שוב.</string>
<string name="installation_failed">הפעולה נכשלה בגלל סיבה אינה ידועה, בבקשה הצטרפו לטלגרם או דיסקורד שלנו בשביל עזרה.</string>
<string name="installation_incompatible">ההתקנה נכשלה מכיוון שההתקנה או הקובץ לא תואמים עם מכשירך. נקה הורדות שהושלמו מתוך ההגדרות, ואז נסה שוב.</string>
<string name="installation_invalid">ההתקנה נכשלה מכיוון שקבצי הישום הרוסים, בבקשה נסה שוב.</string>
<string name="installation_signature">ההתקנה נכשלה מכיוון שאימות החתימה בישום פעילה. השבת את אימות החתימה בישום, ואז נסה שוב.</string>
<string name="installation_miui">ההתקנה נכשלה מכיוון שאופטימיזצית MIUI פעילה. השבת את אופטימיזצית MIUI, ואז נסה שוב.</string>
<string name="installation_storage">ההתקנה נכשלה בגלל בעית אחסון.</string>
<string name="modapk_missing">Black/Dark apk חסרה מהמתקין, זה לא אמור להיות, בבקשה נקה מידע ישום של הManager</string>
<string name="path_missing">נתיב התקנת היוטיוב הרגיל לא נגיש או לא קיים אחרי התקנה מפוצלת</string>
</resources>

View file

@ -11,26 +11,11 @@
<!-- Home Page -->
<string name="changelogs">更新履歴</string>
<string name="downloading_file">%1$s をダウンロードしています</string>
<string name="failed_uninstall">パッケージ %1$s のアンインストールに失敗しました</string>
<string name="error_downloading">%1$s のダウンロード中にエラー</string>
<string name="install">インストール</string>
<string name="installing_app">%1$s をインストールしています</string>
<string name="installation_aborted">ユーザーがインストールを中断したため操作に失敗しました</string>
<string name="installation_blocked">ユーザーがインストールをブロックしたため操作に失敗しました</string>
<string name="installation_downgrade">Operation failed because the user tried to downgrade the package. Do you have stock YouTube Installed?</string>
<string name="installation_conflict">すでにインストールされているアプリと競合したため操作に失敗しました</string>
<string name="installation_failed">何らかの理由により操作に失敗しました</string>
<string name="installation_incompatible">お使いのデバイスと互換性がないため操作に失敗しました</string>
<string name="installation_invalid">APK ファイルが正しくないため操作に失敗しました</string>
<string name="installation_signature">Operation failed because the user didn\'t disable apk signature verification</string>
<string name="installation_miui">予期されないエラーが Vanced のインストール中に発生しました。MIUI の最適化を無効にしましたか?</string>
<string name="installation_storage">ストレージのエラーにより操作に失敗しました</string>
<string name="installation_wait">インストールが完了するまでお待ちください</string>
<string name="installation_wait">インストールが完了するまでお待ちください。</string>
<string name="button_reinstall">再インストール</string>
<string name="version_installed">インストール済み:</string>
<string name="latest">最新版:</string>
<string name="successfully_installed">%1$s のインストールに成功しました</string>
<string name="network_error">インターネット接続が利用できません</string>
<string name="no_microg">microG はインストールされていません</string>
<string name="root_not_granted">Root アクセスは許可されていません</string>
<string name="unavailable">利用不可</string>
@ -38,7 +23,7 @@
<string name="useful_links">リンク集</string>
<string name="website_text">Vanced の公式Webサイト</string>
<string name="support_us">Brave をダウンロードして支援する</string>
<string name="version_toast">%1$s のバージョンがコピーされました!</string>
<string name="version_toast">%1$s のバージョン番号がコピーされました!</string>
<!-- Settings -->
<string name="accent_color">アクセントカラー</string>
<string name="accent_blue"></string>
@ -54,9 +39,15 @@
<string name="chosen_theme">テーマ: %1$s</string>
<string name="clear_files">ダウンロード済みファイルを消去</string>
<string name="cleared_files">ファイルを消去しました</string>
<string name="firebase_title">Firebase アナリティクス</string>
<string name="firebase_summary">アプリのパフォーマンスとクラッシュログに関する情報を収集できます</string>
<string name="language_title">言語</string>
<string name="link_title">Chrome カスタムタブを使用する</string>
<string name="link_custom_tabs">Chrome カスタムタブでリンクを開く</string>
<string name="link_external_browser">外部ブラウザでリンクを開く</string>
<string name="new_installer_title">Use the new root installer (Experimental)</string>
<string name="new_installer_summary">This installer does not depend on Signature Verification status. WARNING: Vanced may disappear after reboot if you install it using this</string>
<string name="system_default">システム標準</string>
<string name="theme">テーマ</string>
<string name="theme_follow">システムに従う</string>
<string name="theme_dark">ダークテーマ</string>
@ -69,24 +60,22 @@
<string name="update_found">アップデートがあります!</string>
<string name="update_notfound">アップデートはありません</string>
<!-- Dialogs -->
<string name="button_dismiss">閉じる</string>
<string name="guide">ガイド</string>
<string name="hold_on">ちょっと待った</string>
<string name="hold_on">ストップ</string>
<string name="magisk_vanced">Vanced の Magisk/TWRP バージョンを使用しているようです。このバージョンは廃止されており、このアプリでは更新できません。 まず Magisk モジュールを削除するか、TWRP で Vanced uninstaller を使用してください。</string>
<string name="miui_one_title">MIUI ユーザーを検知しました!</string>
<string name="miui_one">あなたは MIUI ユーザーのようです。Vanced Manager を適切に利用するには、開発者向けオプションから MIUI の最適化を無効にする必要があります。
ただし、xiaomi.eu ベースの 20.2.20 ROM をお使いの場合は、この警告を無視しても問題ありません。</string>
<string name="miui_one">Vanced をインストールするには、開発者設定で MIUI の最適化を無効化しなければなりません。 (20.2.20 以降の xiaomi.eu ベースの ROM の場合はこの警告は無視してください)</string>
<string name="error">エラー</string>
<string name="security_context">vanced.app、Vanced の Discord サーバーまたは GitHub からアプリをダウンロードしたことを確認してください</string>
<string name="success">成功!</string>
<string name="vanced_installed">Vanced のインストールに成功しました。今すぐ起動しますか?</string>
<string name="launch">起動</string>
<string name="vanced_installed">Vanced のインストールに成功しました。今すぐ開きますか?</string>
<string name="music_installed">Vanced Music のインストールに成功しました。今すぐ開きますか?</string>
<string name="launch">開く</string>
<string name="welcome">ようこそ</string>
<!-- Install Page -->
<string name="choose_preferred_language">Vanced で使用する言語を選択</string>
<string name="choose_preferred_language_note">注意: 英語以外の言語をインストールしても、英語は追加の言語としてインストールされます</string>
<string name="choose_preferred_theme">Vanced のテーマを選択</string>
<string name="disable_signature">Root モードが検出されましたVanced のインストールを正しく行うために、署名検証が無効であるかどうか確認してください。</string>
<string name="finish">完了</string>
<string name="install_light_black">ライト + ブラック</string>
<string name="install_light_dark">ライト + ダーク</string>
@ -95,4 +84,22 @@
<string name="manager_dev">Manager 開発</string>
<string name="sources">ソースコード</string>
<string name="vanced_team">Vanced チーム</string>
<!-- Error messages -->
<string name="chown_fail">システム所有者への APK の Chownができませんでした、もう一度やり直してください</string>
<string name="error_downloading">%1$s のダウンロード中にエラー</string>
<string name="failed_uninstall">パッケージ %1$s のアンインストールに失敗しました</string>
<string name="files_missing_va">ファイルがありません、ダウンロードに失敗しましたか?</string>
<string name="ifile_missing">Dark/Black.apk が読み込みできない (ストレージがブロック?) またはファイルがありません</string>
<string name="installation_aborted">ユーザーがインストールを中断したためインストールに失敗しました。</string>
<string name="installation_blocked">ユーザーがインストールをブロックしたためインストールに失敗しました。</string>
<string name="installation_downgrade">ユーザーがパッケージをダウングレードしようとしたためインストールに失敗しました。ストックの YouTube アプリのアップデートをアンインストールしてから、もう一度やり直してください。</string>
<string name="installation_conflict">既にインストールされたアプリと競合したためインストールに失敗しました。Vanced の現在のバージョンをアンインストールしてから、もう一度やり直してください。</string>
<string name="installation_failed">何らかの理由によりインストールに失敗しました、サポートのために Telegram または Discord に参加してください。</string>
<string name="installation_incompatible">インストールするファイルがお使いのデバイスと互換性がないためインストールに失敗しました。設定でダウンロードしたファイルを削除してから、もう一度やり直してください。</string>
<string name="installation_invalid">APK ファイルが破損しているためインストールに失敗しました、もう一度やり直してください。</string>
<string name="installation_signature">APK の署名検証が有効化されているためインストールに失敗しました。APK の署名検証を無効化してから、もう一度やり直してください。</string>
<string name="installation_miui">MIUI の最適化が有効になっているためインストールに失敗しました。MIUI の最適化を無効化してから、もう一度やり直してください。</string>
<string name="installation_storage">ストレージのエラーによりインストールに失敗しました。</string>
<string name="modapk_missing">Dark/Black の APK がインストーラーから見つかりません、想定外のことです、Manager のアプリのデータを削除してください</string>
<string name="path_missing">株式分割インストール後、株式のYouTubeインストールパスにアクセスできない、またはインストールされない</string>
</resources>

Some files were not shown because too many files have changed in this diff Show more