diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index db1bad3b..3bccdf17 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -110,13 +110,35 @@ android {
buildConfig = true
}
+ signingConfigs {
+ create("release") {
+ storeFile = File(System.getProperty("user.home"), ".android/purrfectsnap-release.keystore")
+ storePassword = providers.gradleProperty("PS_RELEASE_STORE_PASSWORD").orNull
+ keyAlias = providers.gradleProperty("PS_RELEASE_KEY_ALIAS").orNull
+ keyPassword = providers.gradleProperty("PS_RELEASE_KEY_PASSWORD").orNull
+ }
+ }
+
defaultConfig {
val autoCertSha = providers.provider {
- computeKeystoreCertSha256(
- File(System.getProperty("user.home"), ".android/debug.keystore"),
- storePass = "android",
- keyAlias = "androiddebugkey"
- ).orEmpty()
+ val releaseStore = File(System.getProperty("user.home"), ".android/purrfectsnap-release.keystore")
+ val releaseStorePass = providers.gradleProperty("PS_RELEASE_STORE_PASSWORD").orNull
+ val releaseKeyAlias = providers.gradleProperty("PS_RELEASE_KEY_ALIAS").orNull
+ val releaseKeyPass = providers.gradleProperty("PS_RELEASE_KEY_PASSWORD").orNull
+ if (!releaseStorePass.isNullOrBlank() && !releaseKeyAlias.isNullOrBlank()) {
+ computeKeystoreCertSha256(
+ releaseStore,
+ storePass = releaseStorePass,
+ keyAlias = releaseKeyAlias,
+ keyPass = releaseKeyPass ?: releaseStorePass
+ )
+ } else {
+ computeKeystoreCertSha256(
+ File(System.getProperty("user.home"), ".android/debug.keystore"),
+ storePass = "android",
+ keyAlias = "androiddebugkey"
+ )
+ }.orEmpty()
}
val expectedCertSha256 = providers.gradleProperty("EXPECTED_CERT_SHA256")
.orElse(providers.gradleProperty("psExpectedCertSha256"))
@@ -135,6 +157,7 @@ android {
release {
isMinifyEnabled = true
proguardFiles += file("proguard-rules.pro")
+ signingConfig = signingConfigs.getByName("release")
}
debug {
(properties["debug_flavor"] == null).also {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 07e5cf66..37afa0dc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,8 +16,8 @@
android:usesCleartextTraffic="true"
android:label="@string/app_name"
tools:targetApi="34"
- android:allowBackup="true"
- android:hasFragileUserData="true"
+ android:allowBackup="false"
+ android:hasFragileUserData="false"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round">
@@ -58,11 +58,12 @@
+ android:exported="true" />
+ android:exported="true"
+ android:permission="com.snapchat.android.permission.UPDATE_STICKER_INDEX" />
{
+ FileHandleScope.VALDI -> {
AssetFileHandle(
context,
- "composer/${name.substringAfterLast("/")}"
+ "valdi/${name.substringAfterLast("/")}"
)
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/download/DownloadProcessor.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/download/DownloadProcessor.kt
index 43df5793..bbd43d25 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/download/DownloadProcessor.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/download/DownloadProcessor.kt
@@ -431,13 +431,15 @@ class DownloadProcessor (
return@let
}
}
- callbackOnFailure(translation["already_downloaded_toast"], null)
+ callbackOnFailure(translation["already_downloaded_toast"])
+ return@launch
} else {
callbackOnFailure(translation["already_queued_toast"], null)
}
return@launch
}
+ callbackOnProgress(translation["download_started_toast"])
remoteSideContext.log.debug("downloading media")
val pendingTask = remoteSideContext.taskManager.createPendingTask(
Task(
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt
index db67388a..2d893f3a 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/download/FFMpegProcessor.kt
@@ -111,6 +111,11 @@ class FFMpegProcessor(
}, { onStatistics(it) }, Executors.newSingleThreadExecutor())
}
+ private fun isMediaCodecFailure(output: String): Boolean {
+ val lower = output.lowercase()
+ return lower.contains("mediacodec") || lower.contains("h264_mediacodec") || lower.contains("amediacodec")
+ }
+
suspend fun execute(args: Request) {
// load ffmpeg native sync to avoid native crash
synchronized(this) { FFmpegKit.listSessions() }
@@ -222,6 +227,20 @@ class FFMpegProcessor(
}
}
outputArguments += args.output.absolutePath
- newFFMpegTask(globalArguments, inputArguments, outputArguments)
+ try {
+ newFFMpegTask(globalArguments, inputArguments, outputArguments)
+ } catch (e: Exception) {
+ val output = e.message.orEmpty()
+ val usingMediaCodec = outputArguments["-c:v"] == "h264_mediacodec"
+ val canRetry = ffmpegOptions.customVideoCodec.get().isEmpty()
+ if (usingMediaCodec && canRetry && isMediaCodecFailure(output)) {
+ logManager.warn("MediaCodec failed, retrying with libx264", TAG)
+ outputArguments -= "-c:v"
+ outputArguments += "-c:v" to "libx264"
+ newFFMpegTask(globalArguments, inputArguments, outputArguments)
+ } else {
+ throw e
+ }
+ }
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/AutoPatchServer.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/AutoPatchServer.kt
index 0c5cbae0..d08f4a09 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/AutoPatchServer.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/AutoPatchServer.kt
@@ -2,6 +2,7 @@ package me.eternal.purrfectsnap.setup.patch
import com.google.gson.JsonParser
import java.util.concurrent.TimeUnit
+import kotlin.random.Random
import okhttp3.OkHttpClient
import okhttp3.Request
@@ -29,7 +30,7 @@ class AutoPatchServer(
fun fetchLatestSnapchatApk(): LatestApk? {
val request = Request.Builder()
- .url("https://api.github.com/repos/particle-box/auto-patch-server/releases/latest")
+ .url("https://api.github.com/repos/particle-box/download-snap/releases/latest")
.build()
okHttpClient.newCall(request).execute().use { response ->
@@ -47,9 +48,9 @@ class AutoPatchServer(
name to downloadUrl
}
- val selected = apkAssets.firstOrNull { it.first.contains("snapchat", ignoreCase = true) }
- ?: apkAssets.firstOrNull()
- ?: return null
+ val nonPrimary = apkAssets.filterNot { it.first.contains("snapchat", ignoreCase = true) }
+ val selectionPool = if (nonPrimary.isNotEmpty()) nonPrimary else apkAssets
+ val selected = selectionPool.random(Random.Default)
return LatestApk(
tagName = tagName,
@@ -59,4 +60,3 @@ class AutoPatchServer(
}
}
}
-
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/PatchConfig.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/PatchConfig.kt
index 8fe696d7..26eba6b7 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/PatchConfig.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/setup/patch/PatchConfig.kt
@@ -11,9 +11,9 @@ data class PatchConfig(
) {
data class LSPConfig(
var API_CODE: Int = 93,
- var VERSION_CODE: Int = 360,
- var VERSION_NAME: String = "0.5.1",
- var CORE_VERSION_CODE: Int = 6649,
- var CORE_VERSION_NAME: String = "1.8.5",
+ var VERSION_CODE: Int = 430,
+ var VERSION_NAME: String = "0.7",
+ var CORE_VERSION_CODE: Int = 7137,
+ var CORE_VERSION_NAME: String = "1.10.1",
)
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/task/UpdateCheckWorker.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/task/UpdateCheckWorker.kt
index b9ab2877..86075a3f 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/task/UpdateCheckWorker.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/task/UpdateCheckWorker.kt
@@ -16,6 +16,7 @@ import androidx.work.WorkerParameters
import me.eternal.purrfectsnap.R
import me.eternal.purrfectsnap.ui.manager.MainActivity
import me.eternal.purrfectsnap.ui.manager.data.Updater
+import me.eternal.purrfectsnap.ui.manager.data.Updater.Channel
class UpdateCheckWorker(
private val appContext: Context,
@@ -24,7 +25,11 @@ class UpdateCheckWorker(
override suspend fun doWork(): Result {
return try {
- val latestRelease = Updater.latestRelease
+ val channel = when (inputData.getString("update_channel")) {
+ "prerelease" -> Channel.PRERELEASE
+ else -> Channel.STABLE
+ }
+ val latestRelease = Updater.getLatestRelease(channel)
if (latestRelease != null) {
showUpdateNotification(latestRelease.versionName)
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/MainActivity.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/MainActivity.kt
index 0f08bd8f..e96c593f 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/MainActivity.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/MainActivity.kt
@@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.statusBars
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -174,7 +175,22 @@ class MainActivity : ComponentActivity() {
} else {
PaddingValues(0.dp)
}
+ val statusBarHeight = WindowInsets.statusBars.asPaddingValues().calculateTopPadding()
navigation.NavContent(contentPadding, startDestination)
+ Box(
+ modifier = Modifier
+ .align(Alignment.TopCenter)
+ .fillMaxWidth()
+ .height(statusBarHeight + 24.dp)
+ .background(
+ brush = Brush.verticalGradient(
+ colors = listOf(
+ Color(0xFF241F52),
+ Color.Transparent
+ )
+ )
+ )
+ )
if (!isFullscreen) {
Box(
modifier = Modifier
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Navigation.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Navigation.kt
index 29c6cf96..5ff628f3 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Navigation.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Navigation.kt
@@ -332,8 +332,7 @@ class Navigation(
}
val horizontalInset = 2.dp
val indicatorWidth = (with(density) { itemWidthPx.toDp() } - horizontalInset * 2)
- .coerceAtLeast(70.dp)
- .coerceAtMost(with(density) { itemWidthPx.toDp() })
+ .coerceAtLeast(0.dp)
Box(
modifier = Modifier
.fillMaxSize()
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Routes.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Routes.kt
index 33a75793..71da2986 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Routes.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/Routes.kt
@@ -19,8 +19,10 @@ import me.eternal.purrfectsnap.ui.manager.pages.TasksRootSection
import me.eternal.purrfectsnap.ui.manager.pages.features.FeaturesRootSection
import me.eternal.purrfectsnap.ui.manager.pages.features.ManageRuleFeature
import me.eternal.purrfectsnap.ui.manager.pages.home.HomeLogs
+import me.eternal.purrfectsnap.ui.manager.pages.home.HomeAbout
import me.eternal.purrfectsnap.ui.manager.pages.home.HomeRootSection
import me.eternal.purrfectsnap.ui.manager.pages.home.HomeSettings
+import me.eternal.purrfectsnap.ui.manager.pages.home.RetroGameScreen
import me.eternal.purrfectsnap.ui.manager.pages.location.BetterLocationRoot
import me.eternal.purrfectsnap.ui.manager.pages.scripting.ScriptingRootSection
import me.eternal.purrfectsnap.ui.manager.pages.social.LoggedStories
@@ -67,8 +69,8 @@ class Routes(
var friendTrackerConfigJsonForImport: String? = null
var onRuleImported: (() -> Unit)? = null
- val configImportConfirmation = route(RouteInfo(CONFIG_IMPORT_CONFIRMATION_ROUTE), me.eternal.purrfectsnap.ui.manager.pages.features.ConfigImportConfirmationScreen())
- val configExportSummary = route(RouteInfo(CONFIG_EXPORT_SUMMARY_ROUTE), me.eternal.purrfectsnap.ui.manager.pages.features.ConfigExportSummaryScreen())
+ val configImportConfirmation = route(RouteInfo(CONFIG_IMPORT_CONFIRMATION_ROUTE, hasOwnTopBar = true), me.eternal.purrfectsnap.ui.manager.pages.features.ConfigImportConfirmationScreen())
+ val configExportSummary = route(RouteInfo(CONFIG_EXPORT_SUMMARY_ROUTE, hasOwnTopBar = true), me.eternal.purrfectsnap.ui.manager.pages.features.ConfigExportSummaryScreen())
val tasks = route(RouteInfo("tasks", icon = Icons.Default.TaskAlt, primary = true, hasOwnTopBar = true), TasksRootSection())
@@ -76,6 +78,8 @@ class Routes(
val manageRuleFeature = route(RouteInfo("manage_rule_feature/?rule_type={rule_type}", hasOwnTopBar = true), ManageRuleFeature()).parent(features)
val home = route(RouteInfo("home", icon = Icons.Default.Home, primary = true, hasOwnTopBar = true), HomeRootSection())
+ val about = route(RouteInfo("home_about", hasOwnTopBar = true), HomeAbout()).parent(home)
+ val retroGame = route(RouteInfo("retro_game", hasOwnTopBar = true), RetroGameScreen()).parent(home)
val settings = route(RouteInfo("home_settings", hasOwnTopBar = true), HomeSettings()).parent(home)
val homeLogs = route(RouteInfo("home_logs", hasOwnTopBar = true), HomeLogs()).parent(home)
val loggerHistory = route(RouteInfo("logger_history", hasOwnTopBar = true), LoggerHistoryRoot()).parent(home)
@@ -87,7 +91,7 @@ class Routes(
val friendTrackerCatalog = route(RouteInfo("friend_tracker_catalog", hasOwnTopBar = true), FriendTrackerCatalog())
val manageFriendTrackerRepos = route(RouteInfo("manage_friend_tracker_repos", hasOwnTopBar = true), ManageFriendTrackerReposSection())
- val fileImports = route(RouteInfo("file_imports"), FileImportsRoot()).parent(home)
+ val fileImports = route(RouteInfo("file_imports", hasOwnTopBar = true), FileImportsRoot()).parent(home)
val manageRepos = route(RouteInfo("manage_repos/?type={type}"), ManageReposSection())
val social = route(RouteInfo("social", icon = Icons.Default.Group, primary = true, hasOwnTopBar = true), SocialRootSection())
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/components/AestheticDialog.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/components/AestheticDialog.kt
index b47fbb82..52965be4 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/components/AestheticDialog.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/components/AestheticDialog.kt
@@ -62,7 +62,9 @@ fun AestheticDialog(
loading: Boolean = false,
opaque: Boolean = false,
showCloseButton: Boolean = true,
- confirmEnabled: Boolean = true
+ confirmEnabled: Boolean = true,
+ showIcon: Boolean = true,
+ showTitle: Boolean = true
) {
var visible by remember { mutableStateOf(false) }
LaunchedEffect(Unit) { visible = true }
@@ -94,28 +96,32 @@ fun AestheticDialog(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(14.dp)
) {
- Box(
- modifier = Modifier
- .size(62.dp)
- .background(
- Brush.linearGradient(
- listOf(
- PurrfectPalette.glowPrimary.copy(alpha = 0.3f),
- PurrfectPalette.glowSecondary.copy(alpha = 0.28f)
- )
+ if (showIcon) {
+ Box(
+ modifier = Modifier
+ .size(62.dp)
+ .background(
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.3f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.28f)
+ )
+ ),
+ CircleShape
),
- CircleShape
- ),
- contentAlignment = Alignment.Center
- ) {
- Icon(icon, contentDescription = null, tint = Color.White, modifier = Modifier.size(30.dp))
+ contentAlignment = Alignment.Center
+ ) {
+ Icon(icon, contentDescription = null, tint = Color.White, modifier = Modifier.size(30.dp))
+ }
+ }
+ if (showTitle && title.isNotBlank()) {
+ Text(
+ text = title,
+ style = MaterialTheme.typography.titleLarge.copy(fontWeight = FontWeight.ExtraBold),
+ color = Color.White,
+ textAlign = TextAlign.Center
+ )
}
- Text(
- text = title,
- style = MaterialTheme.typography.titleLarge.copy(fontWeight = FontWeight.ExtraBold),
- color = Color.White,
- textAlign = TextAlign.Center
- )
if (text.isNotBlank()) {
Text(
text = text,
@@ -130,25 +136,27 @@ fun AestheticDialog(
horizontalArrangement = Arrangement.spacedBy(10.dp, Alignment.CenterHorizontally)
) {
if (dismissButtonText != null && onDismiss != null) {
- Button(
- onClick = onDismiss,
- colors = ButtonDefaults.buttonColors(
- containerColor = Color.White.copy(alpha = 0.08f),
- contentColor = Color.White
- )
- ) { Text(dismissButtonText) }
- }
Button(
- onClick = onConfirm,
- enabled = confirmEnabled && !loading,
+ onClick = onDismiss,
colors = ButtonDefaults.buttonColors(
- containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.34f),
+ containerColor = Color.White.copy(alpha = 0.08f),
contentColor = Color.White
)
- ) {
- if (loading) {
- CircularProgressIndicator(
- modifier = Modifier.size(20.dp),
+ ) { Text(dismissButtonText) }
+ }
+ Button(
+ onClick = onConfirm,
+ enabled = confirmEnabled && !loading,
+ colors = ButtonDefaults.buttonColors(
+ containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.34f),
+ contentColor = Color.White,
+ disabledContainerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.22f),
+ disabledContentColor = Color.White.copy(alpha = 0.75f)
+ )
+ ) {
+ if (loading) {
+ CircularProgressIndicator(
+ modifier = Modifier.size(20.dp),
strokeWidth = 2.dp,
color = Color.White
)
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/UpdateDownloader.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/UpdateDownloader.kt
index c44c8e15..fc4008dc 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/UpdateDownloader.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/UpdateDownloader.kt
@@ -1,11 +1,11 @@
package me.eternal.purrfectsnap.ui.manager.data
-import android.content.Context
import android.content.Intent
import android.widget.Toast
import androidx.core.content.FileProvider
import com.tonyodev.fetch2.*
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@@ -15,13 +15,14 @@ import java.io.FileOutputStream
import java.util.zip.ZipInputStream
object UpdateDownloader {
+ private const val TAG = "UpdateDownloader"
private var fetch: Fetch? = null
private var listener: FetchListener? = null
- private fun getInstance(context: Context): Fetch {
+ private fun getInstance(context: RemoteSideContext): Fetch {
fetch?.let { return it }
fetch = run {
- val fetchConfiguration = FetchConfiguration.Builder(context.applicationContext)
+ val fetchConfiguration = FetchConfiguration.Builder(context.androidContext)
.setDownloadConcurrentLimit(3)
.build()
Fetch.getInstance(fetchConfiguration)
@@ -56,14 +57,43 @@ object UpdateDownloader {
}
}
+ private fun resolveDownloadedApk(
+ remoteContext: RemoteSideContext,
+ downloadedFile: File
+ ): File {
+ val context = remoteContext.androidContext
+ if (downloadedFile.extension.equals("zip", ignoreCase = true)) {
+ val unzipDir = File(context.externalCacheDir, "update")
+ if (unzipDir.exists()) unzipDir.deleteRecursively()
+ unzipDir.mkdirs()
+ remoteContext.log.info(
+ "Extracting update archive ${downloadedFile.absolutePath} -> ${unzipDir.absolutePath}",
+ TAG
+ )
+ unzip(downloadedFile, unzipDir)
+ return unzipDir.walk().firstOrNull { it.isFile && it.extension.equals("apk", true) }
+ ?: throw IllegalStateException("No APK found in the downloaded archive")
+ }
+
+ if (!downloadedFile.extension.equals("apk", ignoreCase = true)) {
+ remoteContext.log.warn(
+ "Downloaded file is not an APK or ZIP (${downloadedFile.name}); attempting installation anyway.",
+ TAG
+ )
+ }
+ return downloadedFile
+ }
+
fun downloadAndInstall(
- context: Context,
+ remoteContext: RemoteSideContext,
downloadUrl: String,
fileName: String,
scope: CoroutineScope
) {
- val fetch = getInstance(context)
+ val context = remoteContext.androidContext
+ val fetch = getInstance(remoteContext)
val filePath = File(context.externalCacheDir, fileName).path
+ remoteContext.log.info("Starting update download from $downloadUrl -> $filePath", TAG)
val request = Request(downloadUrl, filePath).apply {
priority = Priority.HIGH
networkType = NetworkType.ALL
@@ -72,6 +102,7 @@ object UpdateDownloader {
listener = object : AbstractFetchListener() {
override fun onAdded(download: Download) {
downloadState.value = DownloadState.DOWNLOADING
+ remoteContext.log.info("Queued update download: ${download.file}", TAG)
}
override fun onQueued(download: Download, waitingOnNetwork: Boolean) {
@@ -85,26 +116,36 @@ object UpdateDownloader {
override fun onCompleted(download: Download) {
downloadState.value = DownloadState.COMPLETED
- Toast.makeText(context, "Download completed", Toast.LENGTH_SHORT).show()
runCatching {
val downloadedFile = File(download.file)
- val unzipDir = File(context.externalCacheDir, "update")
- if (unzipDir.exists()) {
- unzipDir.deleteRecursively()
- }
- unzipDir.mkdirs()
- unzip(downloadedFile, unzipDir)
- val apkFile = unzipDir.walk().find { it.isFile && it.extension == "apk" }
- ?: throw Exception("No APK found in the downloaded file")
- val uri = FileProvider.getUriForFile(context, "me.eternal.purrfectsnap.fileprovider", apkFile)
+ remoteContext.log.info(
+ "Download completed -> ${downloadedFile.absolutePath} (${downloadedFile.length()} bytes)",
+ TAG
+ )
+ Toast.makeText(context, "Download completed", Toast.LENGTH_SHORT).show()
+ val apkFile = resolveDownloadedApk(remoteContext, downloadedFile)
+ val uri = FileProvider.getUriForFile(
+ context,
+ "${context.packageName}.fileprovider",
+ apkFile
+ )
val installIntent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/vnd.android.package-archive")
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK)
}
+ remoteContext.log.info("Launching installer for ${apkFile.absolutePath}", TAG)
context.startActivity(installIntent)
+ scope.launch(Dispatchers.IO) {
+ delay(30_000)
+ runCatching { downloadedFile.delete() }
+ apkFile.parentFile
+ ?.takeIf { it.name == "update" }
+ ?.let { dir -> runCatching { dir.deleteRecursively() } }
+ remoteContext.log.info("Cleaned downloaded update files", TAG)
+ }
}.onFailure {
- it.printStackTrace()
Toast.makeText(context, "Failed to install update. Check logs for more details.", Toast.LENGTH_SHORT).show()
+ remoteContext.log.error("Failed to install downloaded update", it, TAG)
downloadState.value = DownloadState.FAILED
}
fetch.removeListener(this)
@@ -117,6 +158,8 @@ object UpdateDownloader {
override fun onError(download: Download, error: Error, throwable: Throwable?) {
downloadState.value = DownloadState.FAILED
Toast.makeText(context, "Download failed: $error", Toast.LENGTH_SHORT).show()
+ throwable?.let { remoteContext.log.error("Update download failed: $error", it, TAG) }
+ ?: remoteContext.log.error("Update download failed: $error", TAG)
fetch.removeListener(this)
scope.launch {
delay(2000)
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt
index d6ed7918..0d498a3d 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/data/Updater.kt
@@ -8,13 +8,34 @@ import okhttp3.Request
object Updater {
+ enum class Channel { STABLE, PRERELEASE }
+
data class LatestRelease(
val versionName: String,
val releaseUrl: String,
val workflowId: Long?,
+ val assetDownloads: Map = emptyMap(),
)
- private fun fetchLatestRelease() = runCatching {
+ private fun isVersionGreater(version: String, current: String): Boolean {
+ fun segments(raw: String) = raw
+ .split(Regex("[^0-9]+"))
+ .filter { it.isNotBlank() }
+ .map { it.toIntOrNull() ?: 0 }
+
+ val v = segments(version)
+ val c = segments(current)
+ val size = maxOf(v.size, c.size)
+ for (i in 0 until size) {
+ val vi = v.getOrElse(i) { 0 }
+ val ci = c.getOrElse(i) { 0 }
+ if (vi > ci) return true
+ if (vi < ci) return false
+ }
+ return false
+ }
+
+ private fun fetchLatestRelease(channel: Channel) = runCatching {
val endpoint = Request.Builder().url("https://api.github.com/repos/particle-box/PurrfectSnap/releases").build()
val response = OkHttpClient().newCall(endpoint).execute()
@@ -24,17 +45,45 @@ object Updater {
if (it.size() == 0) throw Throwable("No releases found")
}
- val latestRelease = releases.get(0).asJsonObject
- val latestVersion = latestRelease.getAsJsonPrimitive("tag_name").asString
- if (latestVersion.removePrefix("v") == BuildConfig.VERSION_NAME) return@runCatching null
+ val currentVersion = BuildConfig.VERSION_NAME
+ val latestRelease = releases.mapNotNull { it.asJsonObject }.firstOrNull { release ->
+ if (release.get("draft")?.asBoolean != false) return@firstOrNull false
+ val matchesChannel = when (channel) {
+ Channel.STABLE -> release.get("prerelease")?.asBoolean == false
+ Channel.PRERELEASE -> release.get("prerelease")?.asBoolean == true
+ }
+ if (!matchesChannel) return@firstOrNull false
+ val latestVersion = release.getAsJsonPrimitive("tag_name")?.asString?.removePrefix("v") ?: return@firstOrNull false
+ isVersionGreater(latestVersion, currentVersion)
+ } ?: throw Throwable("No matching releases found for $channel channel")
+
+ val latestVersion = latestRelease.getAsJsonPrimitive("tag_name").asString.removePrefix("v")
+ if (latestVersion == BuildConfig.VERSION_NAME) return@runCatching null
+ val assets = latestRelease.getAsJsonArray("assets")?.mapNotNull { element ->
+ val obj = element.asJsonObject
+ val name = obj.getAsJsonPrimitive("name")?.asString?.lowercase() ?: return@mapNotNull null
+ val url = obj.getAsJsonPrimitive("browser_download_url")?.asString ?: return@mapNotNull null
+ name to url
+ } ?: emptyList()
+
+ val assetDownloads = buildMap {
+ assets.forEach { (name, url) ->
+ when {
+ name.contains("arm64") || name.contains("armv8") -> put("arm64", url)
+ name.contains("armeabi") || name.contains("armv7") || name.contains("arm32") -> put("armv7", url)
+ }
+ }
+ }
LatestRelease(
versionName = latestVersion,
- releaseUrl = endpoint.url.toString().replace("api.", "").replace("repos/", ""),
- workflowId = null
+ releaseUrl = latestRelease.getAsJsonPrimitive("html_url")?.asString
+ ?: endpoint.url.toString().replace("api.", "").replace("repos/", ""),
+ workflowId = null,
+ assetDownloads = assetDownloads
)
}.onFailure {
- AbstractLogger.directError("Failed to fetch latest release", it)
+ AbstractLogger.directError("Failed to fetch latest release ($channel)", it)
}.getOrNull()
private fun fetchLatestDebugCI() = runCatching {
@@ -60,7 +109,15 @@ object Updater {
AbstractLogger.directError("Failed to fetch latest debug CI", it)
}.getOrNull()
- val latestRelease by lazy {
- if (BuildConfig.DEBUG) fetchLatestDebugCI() else fetchLatestRelease()
+ private val cache = mutableMapOf()
+
+ fun getLatestRelease(channel: Channel): LatestRelease? {
+ return cache.getOrPut(channel) {
+ if (BuildConfig.DEBUG) {
+ fetchLatestDebugCI() ?: fetchLatestRelease(channel)
+ } else {
+ fetchLatestRelease(channel)
+ }
+ }
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/FileImportsRoot.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/FileImportsRoot.kt
index dc6ce842..f19008cf 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/FileImportsRoot.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/FileImportsRoot.kt
@@ -4,6 +4,8 @@ import android.net.Uri
import android.text.format.Formatter
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -20,19 +22,24 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AttachFile
import androidx.compose.material.icons.filled.DeleteOutline
import androidx.compose.material.icons.filled.Upload
-import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
-import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@@ -45,6 +52,7 @@ import me.eternal.purrfectsnap.common.ui.AsyncUpdateDispatcher
import me.eternal.purrfectsnap.common.ui.rememberAsyncMutableState
import me.eternal.purrfectsnap.common.ui.rememberAsyncMutableStateList
import me.eternal.purrfectsnap.ui.manager.Routes
+import me.eternal.purrfectsnap.ui.manager.components.FloatingTopBar
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
import me.eternal.purrfectsnap.ui.util.ActivityLauncherHelper
import me.eternal.purrfectsnap.ui.util.openFile
@@ -58,44 +66,75 @@ class FileImportsRoot: Routes.Route() {
activityLauncherHelper = ActivityLauncherHelper(context.activity!!)
}
+ @Composable
+ private fun ImportFab(onClick: () -> Unit) {
+ val shape = RoundedCornerShape(18.dp)
+ val border = Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.7f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.6f)
+ )
+ )
+ val fill = Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.35f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.28f)
+ )
+ )
+ Row(
+ modifier = Modifier
+ .shadow(
+ elevation = 12.dp,
+ shape = shape,
+ ambientColor = PurrfectPalette.glowSecondary.copy(alpha = 0.2f),
+ spotColor = PurrfectPalette.glowPrimary.copy(alpha = 0.25f)
+ )
+ .clip(shape)
+ .background(fill)
+ .border(1.dp, border, shape)
+ .clickable(onClick = onClick)
+ .padding(horizontal = 16.dp, vertical = 10.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Icon(Icons.Default.Upload, contentDescription = null, tint = Color.White)
+ Text(
+ text = translation["import_file_button"],
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
+
override val floatingActionButton: @Composable () -> Unit = {
val coroutineScope = rememberCoroutineScope()
- Row {
- ExtendedFloatingActionButton(
- icon = {
- Icon(Icons.Default.Upload, contentDescription = null)
- },
- text = {
- Text(translation["import_file_button"])
- },
- onClick = {
- context.coroutineScope.launch {
- activityLauncherHelper.openFile { filePath ->
- val fileUri = Uri.parse(filePath)
- runCatching {
- DocumentFile.fromSingleUri(context.activity!!, fileUri)?.let { file ->
- if (!file.exists()) {
- context.shortToast(translation["file_not_found"])
- return@openFile
- }
- context.fileHandleManager.importFile(file.name!!) {
- context.androidContext.contentResolver.openInputStream(fileUri)?.use { inputStream ->
- inputStream.copyTo(this)
- }
+ ImportFab {
+ context.coroutineScope.launch {
+ activityLauncherHelper.openFile { filePath ->
+ val fileUri = Uri.parse(filePath)
+ runCatching {
+ DocumentFile.fromSingleUri(context.activity!!, fileUri)?.let { file ->
+ if (!file.exists()) {
+ context.shortToast(translation["file_not_found"])
+ return@openFile
+ }
+ context.fileHandleManager.importFile(file.name!!) {
+ context.androidContext.contentResolver.openInputStream(fileUri)?.use { inputStream ->
+ inputStream.copyTo(this)
}
}
- }.onFailure {
- context.log.error("Failed to import file", it)
- context.shortToast(translation.format("file_import_failed", "error" to it.message.toString()))
- }.onSuccess {
- context.shortToast(translation["file_imported"])
- coroutineScope.launch {
- reloadDispatcher.dispatch()
- }
+ }
+ }.onFailure {
+ context.log.error("Failed to import file", it)
+ context.shortToast(translation.format("file_import_failed", "error" to it.message.toString()))
+ }.onSuccess {
+ context.shortToast(translation["file_imported"])
+ coroutineScope.launch {
+ reloadDispatcher.dispatch()
}
}
}
- })
+ }
}
}
@@ -103,78 +142,25 @@ class FileImportsRoot: Routes.Route() {
val files = rememberAsyncMutableStateList(defaultValue = listOf(), updateDispatcher = reloadDispatcher) {
context.fileHandleManager.getStoredFiles()
}
+ val density = LocalDensity.current
+ val titleText = context.translation["manager.routes.file_imports"]
+ var topBarHeight by remember { mutableStateOf(0.dp) }
Box(
modifier = Modifier
.fillMaxSize()
.background(PurrfectPalette.backgroundGradient)
) {
- Column(
- modifier = Modifier.fillMaxSize()
+ LazyColumn(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(horizontal = 10.dp),
+ verticalArrangement = Arrangement.spacedBy(10.dp),
+ contentPadding = PaddingValues(
+ top = topBarHeight + 8.dp,
+ bottom = routes.bottomPadding + 16.dp
+ )
) {
- Surface(
- modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 14.dp, vertical = 12.dp),
- shape = RoundedCornerShape(24.dp),
- color = Color.Transparent,
- tonalElevation = 0.dp,
- shadowElevation = 12.dp,
- border = BorderStroke(
- 1.dp,
- Brush.linearGradient(
- listOf(
- PurrfectPalette.glowPrimary.copy(alpha = 0.55f),
- PurrfectPalette.glowSecondary.copy(alpha = 0.35f)
- )
- )
- )
- ) {
- Column(
- modifier = Modifier
- .background(PurrfectPalette.cardOverlay, RoundedCornerShape(24.dp))
- .padding(horizontal = 18.dp, vertical = 14.dp),
- verticalArrangement = Arrangement.spacedBy(6.dp)
- ) {
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.spacedBy(10.dp)
- ) {
- Surface(
- shape = RoundedCornerShape(16.dp),
- color = PurrfectPalette.cardOverlayColor
- ) {
- Icon(
- Icons.Default.AttachFile,
- contentDescription = null,
- tint = Color.White,
- modifier = Modifier.padding(10.dp)
- )
- }
- Column {
- Text(
- text = translation["import_file_button"],
- color = Color.White,
- fontWeight = FontWeight.ExtraBold,
- fontSize = 18.sp
- )
- Text(
- text = translation["manager.dialogs.file_imports.settings_select_file_hint"],
- color = PurrfectPalette.textSecondary,
- style = MaterialTheme.typography.bodySmall
- )
- }
- }
- }
- }
-
- LazyColumn(
- modifier = Modifier
- .fillMaxSize()
- .padding(horizontal = 10.dp),
- verticalArrangement = Arrangement.spacedBy(10.dp),
- contentPadding = PaddingValues(bottom = routes.bottomPadding + 16.dp, top = 4.dp)
- ) {
item {
if (files.isEmpty()) {
Surface(
@@ -279,7 +265,15 @@ class FileImportsRoot: Routes.Route() {
}
}
}
- }
+
+ FloatingTopBar(
+ title = titleText ?: translation["import_file_button"],
+ subtitle = null,
+ onBack = { routes.navController.popBackStack() },
+ modifier = Modifier.onGloballyPositioned {
+ topBarHeight = with(density) { it.size.height.toDp() }
+ }
+ )
}
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/LoggerHistoryRoot.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/LoggerHistoryRoot.kt
index 8a481f47..f1e4f88c 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/LoggerHistoryRoot.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/LoggerHistoryRoot.kt
@@ -385,11 +385,12 @@ class LoggerHistoryRoot : Routes.Route() {
}
}
- TextField(
+ OutlinedTextField(
value = stringFilter,
onValueChange = { stringFilter = it },
singleLine = true,
modifier = Modifier.fillMaxWidth(),
+ shape = RoundedCornerShape(16.dp),
placeholder = {
Text(
text = context.translation["manager.dialogs.add_friend.search_hint"] ?: "Search",
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigExportSummaryScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigExportSummaryScreen.kt
index 4395c3a0..2154effa 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigExportSummaryScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigExportSummaryScreen.kt
@@ -14,7 +14,12 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
+import androidx.compose.foundation.layout.only
+import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
@@ -29,6 +34,8 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateMapOf
@@ -128,7 +135,8 @@ class ConfigExportSummaryScreen : Routes.Route() {
}
override val content: @Composable (androidx.navigation.NavBackStackEntry) -> Unit = {
- val exportSensitiveData = it.arguments?.getBoolean("exportSensitiveData") ?: false
+ val exportSensitiveData = it.arguments?.getString("exportSensitiveData")?.toBoolean() ?: false
+ val exportLabel = context.translation["manager.sections.features.export_option"] ?: "Export"
val parser = remember { ConfigParser() }
val featuresByCategory = remember {
parser.parse(context.config.exportToString(exportSensitiveData))
@@ -140,11 +148,15 @@ class ConfigExportSummaryScreen : Routes.Route() {
.fillMaxSize()
.background(PurrfectPalette.backgroundGradient)
) {
- Column(modifier = Modifier.fillMaxSize()) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .statusBarsPadding()
+ .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Bottom))
+ ) {
Surface(
modifier = Modifier
.fillMaxWidth()
- .statusBarsPadding()
.padding(horizontal = 14.dp, vertical = 12.dp),
shape = RoundedCornerShape(24.dp),
color = Color.Transparent,
@@ -163,46 +175,36 @@ class ConfigExportSummaryScreen : Routes.Route() {
Row(
modifier = Modifier
.background(PurrfectPalette.cardOverlay, RoundedCornerShape(24.dp))
- .padding(horizontal = 16.dp, vertical = 12.dp),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween
+ .padding(horizontal = 12.dp, vertical = 10.dp),
+ verticalAlignment = Alignment.CenterVertically
) {
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.spacedBy(10.dp)
- ) {
- IconButton(onClick = { routes.navController.popBackStack() }) {
- Icon(
- Icons.AutoMirrored.Filled.ArrowBack,
- contentDescription = translation["back_button_description"],
- tint = Color.White
- )
- }
- Column {
- Text(
- text = translation["title"],
- color = Color.White,
- fontWeight = FontWeight.ExtraBold,
- fontSize = 18.sp
- )
- }
- }
- Surface(
- shape = CircleShape,
- color = PurrfectPalette.glowPrimary.copy(alpha = 0.22f),
- tonalElevation = 0.dp,
- shadowElevation = 10.dp,
- border = BorderStroke(
- 1.dp,
- Brush.linearGradient(
- listOf(
- PurrfectPalette.glowPrimary.copy(alpha = 0.55f),
- PurrfectPalette.glowSecondary.copy(alpha = 0.45f)
- )
- )
+ Button(
+ onClick = { routes.navController.popBackStack() },
+ colors = ButtonDefaults.buttonColors(
+ containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.28f),
+ contentColor = Color.White
)
) {
- IconButton(
+ Icon(
+ imageVector = Icons.AutoMirrored.Filled.ArrowBack,
+ contentDescription = null,
+ tint = Color.White,
+ modifier = Modifier.padding(end = 6.dp)
+ )
+ Text(context.translation["common.back"] ?: "Back")
+ }
+ Box(
+ modifier = Modifier.weight(1f),
+ contentAlignment = Alignment.Center
+ ) {
+ Text(
+ text = "Summary",
+ color = Color.White,
+ fontWeight = FontWeight.ExtraBold,
+ fontSize = 18.sp
+ )
+ }
+ Button(
onClick = {
routes.activityLauncher.saveFile("config.json", "application/json") { uri ->
runCatching {
@@ -220,14 +222,19 @@ class ConfigExportSummaryScreen : Routes.Route() {
)
}
}
- }
+ },
+ colors = ButtonDefaults.buttonColors(
+ containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.32f),
+ contentColor = Color.White
+ )
) {
Icon(
imageVector = Icons.Default.ArrowDownward,
- contentDescription = translation["save_button"],
- tint = Color.White
+ contentDescription = null,
+ tint = Color.White,
+ modifier = Modifier.padding(end = 6.dp)
)
- }
+ Text(exportLabel)
}
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigImportConfirmationScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigImportConfirmationScreen.kt
index 5a47f9ab..37a64f5d 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigImportConfirmationScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/ConfigImportConfirmationScreen.kt
@@ -14,7 +14,12 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
+import androidx.compose.foundation.layout.only
+import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
@@ -185,13 +190,18 @@ class ConfigImportConfirmationScreen : Routes.Route() {
routes.configJsonForImport?.let { parser.parse(it) } ?: emptyMap()
}
val expandedState = remember { mutableStateMapOf() }
+ val importLabel = translation["confirm_button"] ?: "Import"
Box(
modifier = Modifier
.fillMaxSize()
.background(PurrfectPalette.backgroundGradient)
) {
- Column(modifier = Modifier.fillMaxSize()) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .statusBarsPadding()
+ ) {
Surface(
modifier = Modifier
.fillMaxWidth()
@@ -213,29 +223,34 @@ class ConfigImportConfirmationScreen : Routes.Route() {
Row(
modifier = Modifier
.background(PurrfectPalette.cardOverlay, RoundedCornerShape(24.dp))
- .padding(horizontal = 16.dp, vertical = 12.dp),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween
+ .padding(horizontal = 12.dp, vertical = 10.dp),
+ verticalAlignment = Alignment.CenterVertically
) {
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.spacedBy(10.dp)
+ Button(
+ onClick = { routes.navController.popBackStack() },
+ colors = ButtonDefaults.buttonColors(
+ containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.28f),
+ contentColor = Color.White
+ )
) {
- IconButton(onClick = { routes.navController.popBackStack() }) {
- Icon(
- Icons.AutoMirrored.Filled.ArrowBack,
- contentDescription = translation["back_button_description"],
- tint = Color.White
- )
- }
- Column {
- Text(
- text = translation["title"],
- color = Color.White,
- fontWeight = FontWeight.ExtraBold,
- fontSize = 18.sp
- )
- }
+ Icon(
+ imageVector = Icons.AutoMirrored.Filled.ArrowBack,
+ contentDescription = null,
+ tint = Color.White,
+ modifier = Modifier.padding(end = 6.dp)
+ )
+ Text(context.translation["common.back"] ?: "Back")
+ }
+ Box(
+ modifier = Modifier.weight(1f),
+ contentAlignment = Alignment.Center
+ ) {
+ Text(
+ text = "Summary",
+ color = Color.White,
+ fontWeight = FontWeight.ExtraBold,
+ fontSize = 18.sp
+ )
}
Button(
onClick = {
@@ -261,7 +276,7 @@ class ConfigImportConfirmationScreen : Routes.Route() {
contentColor = Color.White
)
) {
- Text(translation["confirm_button"])
+ Text(importLabel)
}
}
}
@@ -276,118 +291,118 @@ class ConfigImportConfirmationScreen : Routes.Route() {
),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
- items(featuresByCategory.toList()) { (category, features) ->
- val isExpanded = expandedState[category] ?: false
- val rotationState by animateFloatAsState(targetValue = if (isExpanded) 180f else 0f)
+ items(featuresByCategory.toList()) { (category, features) ->
+ val isExpanded = expandedState[category] ?: false
+ val rotationState by animateFloatAsState(targetValue = if (isExpanded) 180f else 0f)
- Surface(
- modifier = Modifier
- .fillMaxWidth()
- .clickable { expandedState[category] = !isExpanded },
- shape = RoundedCornerShape(18.dp),
- color = PurrfectPalette.cardOverlayColor,
- tonalElevation = 0.dp,
- shadowElevation = 10.dp,
- border = BorderStroke(
- 1.dp,
- Brush.linearGradient(
- listOf(
- PurrfectPalette.glowPrimary.copy(alpha = 0.4f),
- PurrfectPalette.glowSecondary.copy(alpha = 0.32f)
- )
+ Surface(
+ modifier = Modifier
+ .fillMaxWidth()
+ .clickable { expandedState[category] = !isExpanded },
+ shape = RoundedCornerShape(18.dp),
+ color = PurrfectPalette.cardOverlayColor,
+ tonalElevation = 0.dp,
+ shadowElevation = 10.dp,
+ border = BorderStroke(
+ 1.dp,
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.4f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.32f)
)
)
- ) {
- Column(modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp)) {
- Row(verticalAlignment = Alignment.CenterVertically) {
- Column(modifier = Modifier.weight(1f)) {
- Text(
- text = category,
- fontWeight = FontWeight.Bold,
- fontSize = 17.sp,
- color = Color.White
- )
- }
- IconButton(onClick = { expandedState[category] = !isExpanded }) {
- Icon(
- imageVector = Icons.Default.KeyboardArrowDown,
- contentDescription = translation["expand_button_description"],
- modifier = Modifier.graphicsLayer(rotationZ = rotationState),
- tint = Color.White
- )
- }
+ )
+ ) {
+ Column(modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp)) {
+ Row(verticalAlignment = Alignment.CenterVertically) {
+ Column(modifier = Modifier.weight(1f)) {
+ Text(
+ text = category,
+ fontWeight = FontWeight.Bold,
+ fontSize = 17.sp,
+ color = Color.White
+ )
}
+ IconButton(onClick = { expandedState[category] = !isExpanded }) {
+ Icon(
+ imageVector = Icons.Default.KeyboardArrowDown,
+ contentDescription = translation["expand_button_description"],
+ modifier = Modifier.graphicsLayer(rotationZ = rotationState),
+ tint = Color.White
+ )
+ }
+ }
- AnimatedVisibility(visible = isExpanded) {
- Column(
- modifier = Modifier.padding(top = 10.dp),
- verticalArrangement = Arrangement.spacedBy(8.dp)
- ) {
- features.forEachIndexed { index, feature ->
- when (val parsedValue = parser.parseValue(feature.key, feature.value)) {
- is List<*> -> {
+ AnimatedVisibility(visible = isExpanded) {
+ Column(
+ modifier = Modifier.padding(top = 10.dp),
+ verticalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ features.forEachIndexed { index, feature ->
+ when (val parsedValue = parser.parseValue(feature.key, feature.value)) {
+ is List<*> -> {
+ Column(
+ modifier = Modifier.padding(start = (feature.indentation * 16).dp),
+ verticalArrangement = Arrangement.spacedBy(6.dp)
+ ) {
+ Text(
+ text = feature.name,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White
+ )
Column(
- modifier = Modifier.padding(start = (feature.indentation * 16).dp),
+ modifier = Modifier.padding(start = 6.dp),
verticalArrangement = Arrangement.spacedBy(6.dp)
) {
- Text(
- text = feature.name,
- fontWeight = FontWeight.SemiBold,
- color = Color.White
- )
- Column(
- modifier = Modifier.padding(start = 6.dp),
- verticalArrangement = Arrangement.spacedBy(6.dp)
- ) {
- parsedValue.forEachIndexed { itemIndex, item ->
- Row(
- horizontalArrangement = Arrangement.spacedBy(10.dp),
- verticalAlignment = Alignment.CenterVertically
- ) {
- NumberBubble(itemIndex + 1)
- Text(
- text = item.toString(),
- color = PurrfectPalette.textSecondary
- )
- }
+ parsedValue.forEachIndexed { itemIndex, item ->
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(10.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ NumberBubble(itemIndex + 1)
+ Text(
+ text = item.toString(),
+ color = PurrfectPalette.textSecondary
+ )
}
}
}
}
+ }
- is String -> {
- Column(
- modifier = Modifier
- .fillMaxWidth()
- .padding(start = (feature.indentation * 16).dp),
- verticalArrangement = Arrangement.spacedBy(4.dp)
- ) {
- Text(
- text = feature.name,
- fontWeight = FontWeight.SemiBold,
- color = Color.White
- )
- Text(
- text = parsedValue,
- color = PurrfectPalette.glowSecondary,
- textAlign = TextAlign.Start,
- )
- }
+ is String -> {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(start = (feature.indentation * 16).dp),
+ verticalArrangement = Arrangement.spacedBy(4.dp)
+ ) {
+ Text(
+ text = feature.name,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White
+ )
+ Text(
+ text = parsedValue,
+ color = PurrfectPalette.glowSecondary,
+ textAlign = TextAlign.Start,
+ )
}
}
- if (index < features.size - 1) {
- Spacer(modifier = Modifier.height(6.dp))
- }
}
- }
- }
+ if (index < features.size - 1) {
+ Spacer(modifier = Modifier.height(6.dp))
}
}
}
}
+ }
}
}
}
+}
+ }
+ }
@Composable
private fun NumberBubble(number: Int) {
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/FeaturesRootSection.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/FeaturesRootSection.kt
index 966e1a3f..3e23138e 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/FeaturesRootSection.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/features/FeaturesRootSection.kt
@@ -32,6 +32,7 @@ import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.CircleShape
@@ -400,6 +401,7 @@ class FeaturesRootSection : Routes.Route() {
}
val propertyValue = property.value
+ fun persistConfig() = context.config.writeConfig()
if (property.key.params.flags.contains(ConfigFlag.USER_IMPORT)) {
registerDialogOnClickCallback()
@@ -412,11 +414,13 @@ class FeaturesRootSection : Routes.Route() {
isEmpty = it.isEmpty()
if (isEmpty) {
propertyValue.setAny(null)
+ persistConfig()
}
}
}
var selectedFile by remember(files.size) { mutableStateOf(files.firstOrNull { it.name == propertyValue.getNullable() }.also {
if (files.isNotEmpty() && it == null) propertyValue.setAny(null)
+ if (files.isNotEmpty() && it == null) persistConfig()
}?.name) }
Surface(
@@ -487,6 +491,7 @@ class FeaturesRootSection : Routes.Route() {
.clickable {
selectedFile = if (isSelected) null else file.name
propertyValue.setAny(selectedFile)
+ persistConfig()
},
shape = RoundedCornerShape(16.dp),
color = Color.White.copy(alpha = 0.05f),
@@ -555,6 +560,7 @@ class FeaturesRootSection : Routes.Route() {
activityLauncher {
chooseFolder { uri ->
propertyValue.setAny(uri)
+ persistConfig()
}
}
}.let { { it.invoke(true) } }) {
@@ -575,6 +581,7 @@ class FeaturesRootSection : Routes.Route() {
}
state = state.not()
propertyValue.setAny(state)
+ persistConfig()
},
colors = purrfectSwitchColors()
)
@@ -722,6 +729,7 @@ class FeaturesRootSection : Routes.Route() {
}
state = state.not()
container.globalState = state
+ persistConfig()
},
colors = purrfectSwitchColors()
)
@@ -1518,6 +1526,7 @@ class FeaturesRootSection : Routes.Route() {
) {
val density = LocalDensity.current
var controlsHeight by remember { mutableStateOf(96.dp) }
+ val listState = rememberLazyListState()
val sharedSearchHistory = remember { mutableStateListOf().apply { addAll(loadSearchHistory()) } }
var liveSearchQuery by rememberSaveable { mutableStateOf(searchKeyword.orEmpty()) }
val isActiveSearch = isSearchResults || liveSearchQuery.isNotBlank()
@@ -1544,12 +1553,18 @@ class FeaturesRootSection : Routes.Route() {
liveSearchQuery = searchKeyword
}
}
+ LaunchedEffect(liveSearchQuery) {
+ if (!listState.isScrollInProgress) {
+ listState.scrollToItem(0)
+ }
+ }
Box(modifier = Modifier.fillMaxSize()) {
FeatureAuroraBackdrop()
LazyColumn(
modifier = Modifier
.fillMaxSize(),
+ state = listState,
verticalArrangement = Arrangement.spacedBy(6.dp),
contentPadding = PaddingValues(
start = 6.dp,
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeAbout.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeAbout.kt
new file mode 100644
index 00000000..dbf1b422
--- /dev/null
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeAbout.kt
@@ -0,0 +1,334 @@
+package me.eternal.purrfectsnap.ui.manager.pages.home
+
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.asPaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.OutlinedButton
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.Icon
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableLongStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.vectorResource
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.navigation.NavBackStackEntry
+import me.eternal.purrfectsnap.R
+import me.eternal.purrfectsnap.common.util.ktx.openLink
+import me.eternal.purrfectsnap.ui.manager.Routes
+import me.eternal.purrfectsnap.ui.manager.components.FloatingTopBar
+import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
+import android.os.SystemClock
+
+class HomeAbout : Routes.Route() {
+ override val content: @Composable (NavBackStackEntry) -> Unit = {
+ val avenirNext = remember {
+ FontFamily(Font(R.font.avenir_next_medium, FontWeight.Medium))
+ }
+ val scrollState = rememberScrollState()
+ val aboutStory = remember {
+ """
+ PurrfectSnap was founded on 2nd of October, 2025, as a fork of SnapEnhance by ΞTΞRNAL with a vision to provide users the quality Snapchat experience they deserve. This app was just meant to be a minor update in the SnapEnhance repository, but it soon became a separate app wherein the contributors kept adding features. Then the developer joined the team, and this app soon became a huge success. We received much love and support and gained 1K+ downloads in just two days! We thank all users and contributors; without your support, we wouldn't have reached this place. We would also like to convey our huge thanks to rhunk, the lead developer of SnapEnhance, as without him, this app wouldn't even exist. We are immensely grateful to him. Lastly, we would like to thank all our admins, notably: CLASSIC GENIUS, Harry, SUJΛL, Zain & scrodingerspet, who were right there with us from the very beginning. We would also like to thank all testers, notably Leo & Toxic, who tested and reported bugs continuously. We are immensely grateful for your contribution.
+
+
+ """.trimIndent()
+ }
+ val pagePadding = 16.dp
+ val bottomPadding = routes.bottomPadding +
+ WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() +
+ 24.dp
+ val tapSource = remember { MutableInteractionSource() }
+ val tapTimeoutMs = 1500L
+ val tapCount = remember { mutableIntStateOf(0) }
+ val lastTapTime = remember { mutableLongStateOf(0L) }
+
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(PurrfectPalette.backgroundGradient)
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .verticalScroll(scrollState)
+ .padding(bottom = bottomPadding)
+ ) {
+ FloatingTopBar(
+ title = routeInfo.translatedKey?.value ?: "About",
+ onBack = { routes.navController.popBackStack() }
+ )
+
+ Spacer(modifier = Modifier.height(8.dp))
+
+ Surface(
+ modifier = Modifier
+ .padding(horizontal = pagePadding)
+ .fillMaxWidth(),
+ shape = RoundedCornerShape(30.dp),
+ color = Color.Transparent,
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.1f)),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Column(
+ modifier = Modifier
+ .background(PurrfectPalette.panelGradient)
+ .padding(horizontal = 22.dp, vertical = 20.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Text(
+ text = "PurrfectSnap",
+ fontSize = 28.sp,
+ fontWeight = FontWeight.ExtraBold,
+ color = PurrfectPalette.textPrimary,
+ fontFamily = avenirNext,
+ modifier = Modifier.clickable(
+ interactionSource = tapSource,
+ indication = null
+ ) {
+ val now = SystemClock.elapsedRealtime()
+ if (now - lastTapTime.longValue > tapTimeoutMs) {
+ tapCount.intValue = 0
+ }
+ tapCount.intValue += 1
+ lastTapTime.longValue = now
+ if (tapCount.intValue >= 5) {
+ tapCount.intValue = 0
+ routes.retroGame.navigate()
+ }
+ }
+ )
+ Text(
+ text = "An Xposed Module meant to enhance your Snapchat experience!",
+ fontSize = 13.sp,
+ color = PurrfectPalette.textSecondary,
+ textAlign = TextAlign.Center,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "Lead Developers",
+ fontSize = 15.sp,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ modifier = Modifier.padding(top = 10.dp)
+ )
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterHorizontally),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ DeveloperCard(
+ name = "ΞTΞRNAL",
+ imageRes = R.drawable.pfp_external,
+ avenirNext = avenirNext,
+ modifier = Modifier.weight(1f)
+ )
+ DeveloperCard(
+ name = "",
+ imageRes = R.drawable.pfp_rsr,
+ avenirNext = avenirNext,
+ modifier = Modifier.weight(1f)
+ )
+ }
+ }
+ }
+
+ Spacer(modifier = Modifier.height(14.dp))
+
+ Surface(
+ modifier = Modifier
+ .padding(horizontal = pagePadding)
+ .fillMaxWidth(),
+ shape = RoundedCornerShape(26.dp),
+ color = Color.Transparent,
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.08f)),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Column(
+ modifier = Modifier
+ .background(PurrfectPalette.cardOverlay)
+ .padding(horizontal = 20.dp, vertical = 18.dp),
+ verticalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ Text(
+ text = "Our Story",
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Bold,
+ color = Color.White
+ )
+ Text(
+ text = aboutStory,
+ fontSize = 14.sp,
+ color = PurrfectPalette.textSecondary,
+ lineHeight = 20.sp
+ )
+ }
+ }
+
+ Spacer(modifier = Modifier.height(14.dp))
+
+ Surface(
+ modifier = Modifier
+ .padding(horizontal = pagePadding)
+ .fillMaxWidth(),
+ shape = RoundedCornerShape(24.dp),
+ color = Color.White.copy(alpha = 0.08f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f)),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Column(
+ modifier = Modifier.padding(horizontal = 20.dp, vertical = 16.dp),
+ verticalArrangement = Arrangement.spacedBy(10.dp),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Text(
+ text = "With love, PurrfectSnap Team",
+ fontSize = 15.sp,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ maxLines = 2,
+ overflow = TextOverflow.Ellipsis
+ )
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Button(
+ modifier = Modifier.weight(1f),
+ onClick = { context.androidContext.openLink("https://github.com/particle-box/PurrfectSnap") },
+ colors = ButtonDefaults.buttonColors(
+ containerColor = Color.White,
+ contentColor = Color(0xFF1B152E)
+ )
+ ) {
+ Icon(
+ imageVector = ImageVector.vectorResource(id = R.drawable.ic_github),
+ contentDescription = null,
+ modifier = Modifier.size(18.dp)
+ )
+ Spacer(modifier = Modifier.width(8.dp))
+ Text(text = "GitHub", maxLines = 1, overflow = TextOverflow.Ellipsis)
+ }
+ OutlinedButton(
+ modifier = Modifier.weight(1f),
+ onClick = { context.androidContext.openLink("https://t.me/purrfectsnap_official") },
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.35f)),
+ colors = ButtonDefaults.outlinedButtonColors(contentColor = Color.White)
+ ) {
+ Icon(
+ imageVector = ImageVector.vectorResource(id = R.drawable.ic_telegram),
+ contentDescription = null,
+ modifier = Modifier.size(18.dp),
+ tint = Color.White
+ )
+ Spacer(modifier = Modifier.width(8.dp))
+ Text(text = "Telegram", maxLines = 1, overflow = TextOverflow.Ellipsis)
+ }
+ }
+ }
+ }
+
+ Spacer(modifier = Modifier.height(32.dp))
+ }
+ }
+ }
+
+ @Composable
+ private fun DeveloperCard(
+ name: String,
+ imageRes: Int,
+ avenirNext: FontFamily,
+ modifier: Modifier = Modifier
+ ) {
+ val cardShape = RoundedCornerShape(20.dp)
+ val imageRing = Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary,
+ PurrfectPalette.glowSecondary
+ )
+ )
+
+ Surface(
+ modifier = modifier,
+ shape = cardShape,
+ color = Color.White.copy(alpha = 0.08f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f)),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 16.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Box(
+ modifier = Modifier
+ .size(82.dp)
+ .clip(CircleShape)
+ .background(Color.White.copy(alpha = 0.1f))
+ .border(2.dp, imageRing, CircleShape)
+ ) {
+ Image(
+ painter = painterResource(id = imageRes),
+ contentDescription = name,
+ contentScale = ContentScale.Crop,
+ modifier = Modifier.fillMaxSize()
+ )
+ }
+ Text(
+ text = name,
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Bold,
+ color = Color.White,
+ fontFamily = avenirNext,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+}
+ }
+ }
+}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeLogs.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeLogs.kt
index 71a4c3df..568d0a83 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeLogs.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeLogs.kt
@@ -226,6 +226,12 @@ class HomeLogs : Routes.Route() {
) {
val firstVisibleItem by remember { derivedStateOf { logListState.firstVisibleItemIndex } }
val layoutInfo by remember { derivedStateOf { logListState.layoutInfo } }
+ val floatingButtonColors = IconButtonDefaults.filledIconButtonColors(
+ containerColor = PurrfectPalette.cardOverlayColor,
+ contentColor = Color.White,
+ disabledContainerColor = Color.White.copy(alpha = 0.08f),
+ disabledContentColor = Color.White.copy(alpha = 0.35f)
+ )
Surface(
shape = RoundedCornerShape(18.dp),
color = Color.White.copy(alpha = 0.08f),
@@ -243,7 +249,8 @@ class HomeLogs : Routes.Route() {
logListState.scrollToItem(0)
}
},
- enabled = firstVisibleItem != 0
+ enabled = firstVisibleItem != 0,
+ colors = floatingButtonColors
) {
Icon(Icons.Filled.KeyboardDoubleArrowUp, contentDescription = null)
}
@@ -253,7 +260,8 @@ class HomeLogs : Routes.Route() {
logListState.scrollToItem((logListState.layoutInfo.totalItemsCount - 1).takeIf { it >= 0 } ?: return@launch)
}
},
- enabled = layoutInfo.visibleItemsInfo.lastOrNull()?.index != layoutInfo.totalItemsCount - 1
+ enabled = layoutInfo.visibleItemsInfo.lastOrNull()?.index != layoutInfo.totalItemsCount - 1,
+ colors = floatingButtonColors
) {
Icon(Icons.Filled.KeyboardDoubleArrowDown, contentDescription = null)
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeRootSection.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeRootSection.kt
index 4b589739..6aa661fc 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeRootSection.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeRootSection.kt
@@ -1,4 +1,4 @@
-package me.eternal.purrfectsnap.ui.manager.pages.home
+package me.eternal.purrfectsnap.ui.manager.pages.home
import android.content.SharedPreferences
import androidx.compose.animation.AnimatedContent
@@ -6,11 +6,8 @@ import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.RepeatMode
import androidx.compose.animation.core.animateFloat
-import androidx.compose.animation.core.Spring
-import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.infiniteRepeatable
import androidx.compose.animation.core.rememberInfiniteTransition
-import androidx.compose.animation.core.spring
import androidx.compose.animation.core.tween
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Canvas
@@ -19,7 +16,6 @@ import androidx.compose.foundation.LocalIndication
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
-import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -31,19 +27,24 @@ import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.navigationBars
-import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.layout.wrapContentWidth
-import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.lazy.grid.GridCells
+import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
+import androidx.compose.foundation.lazy.grid.items
+import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
@@ -55,18 +56,21 @@ import androidx.compose.material.icons.filled.BugReport
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Download
-import androidx.compose.material.icons.filled.DragHandle
+import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Schedule
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.outlined.Widgets
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
+import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.surfaceColorAtElevation
@@ -77,7 +81,6 @@ import androidx.compose.runtime.State
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
@@ -91,9 +94,7 @@ import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
@@ -105,14 +106,14 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withLink
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.zIndex
import androidx.navigation.NavBackStackEntry
-import kotlin.math.roundToInt
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import me.eternal.purrfectsnap.R
import me.eternal.purrfectsnap.action.EnumQuickActions
import me.eternal.purrfectsnap.common.BuildConfig
@@ -126,9 +127,13 @@ import me.eternal.purrfectsnap.ui.manager.Routes
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
import me.eternal.purrfectsnap.ui.manager.data.UpdateDownloader
import me.eternal.purrfectsnap.ui.manager.data.Updater
+import me.eternal.purrfectsnap.ui.manager.data.Updater.Channel
+import me.eternal.purrfectsnap.ui.manager.components.AestheticDialog
import me.eternal.purrfectsnap.ui.util.ActivityLauncherHelper
import me.eternal.purrfectsnap.ui.util.AlertDialogs
import me.eternal.purrfectsnap.ui.util.scaleOnPress
+import okhttp3.OkHttpClient
+import okhttp3.Request
class HomeRootSection : Routes.Route() {
override val translation by lazy { context.translation.getCategory("manager.sections.home") }
@@ -144,6 +149,10 @@ class HomeRootSection : Routes.Route() {
)
}
+ private val changelogClient by lazy { OkHttpClient() }
+ private val changelogStableUrl = "https://raw.githubusercontent.com/particle-box/PurrfectSnap/dev/changelogs-stable.txt"
+ private val changelogPrereleaseUrl = "https://raw.githubusercontent.com/particle-box/PurrfectSnap/dev/changelogs-prerelease.txt"
+
private val heroGradientColors = listOf(
Color(0xFF5C4B99),
Color(0xFF322B5E),
@@ -278,6 +287,26 @@ class HomeRootSection : Routes.Route() {
}
}
+ @Composable
+ private fun InfoCard(content: @Composable ColumnScope.() -> Unit) {
+ OutlinedCard(
+ modifier = Modifier
+ .padding(start = cardMargin, end = cardMargin)
+ .fillMaxWidth(),
+ colors = CardDefaults.cardColors(
+ containerColor = MaterialTheme.colorScheme.surfaceVariant,
+ contentColor = MaterialTheme.colorScheme.onSurfaceVariant
+ )
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(all = 10.dp),
+ content = content
+ )
+ }
+ }
+
@Composable
private fun RowScope.HomeActionChips() {
TopBarActionChip(
@@ -373,6 +402,7 @@ class HomeRootSection : Routes.Route() {
downloadState: UpdateDownloader.DownloadState,
downloadProgress: Float,
onUpdateAction: () -> Unit,
+ channelLabel: String,
isPurrAuraActive: Boolean,
onWikiClick: () -> Unit,
onTelegramClick: () -> Unit,
@@ -382,6 +412,7 @@ class HomeRootSection : Routes.Route() {
avenirNext: FontFamily
) {
val heroShape = RoundedCornerShape(36.dp)
+ val gitHashShort = remember { (context.installationSummary.modInfo?.gitHash ?: BuildConfig.GIT_HASH).take(7) }
Box(
modifier = Modifier
.padding(horizontal = cardMargin, vertical = 6.dp)
@@ -412,9 +443,10 @@ class HomeRootSection : Routes.Route() {
fontFamily = avenirNext
)
Text(
- text = "by $authorName",
+ text = "By ΞTΞRNAL",
color = Color.White.copy(alpha = 0.75f),
- fontSize = 14.sp
+ fontSize = 14.sp,
+ fontFamily = avenirNext
)
Text(
text = "An Xposed Module meant to enhance your Snapchat experience",
@@ -429,10 +461,119 @@ class HomeRootSection : Routes.Route() {
horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterHorizontally),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
- HeroBadge("Codename: Rass Malayi")
- HeroBadge("Debug Build")
+ HeroBadge("Version: $versionName - $channelLabel")
+ gitHashShort.takeIf { it.isNotBlank() && it.lowercase() != "unknown" }?.let {
+ HeroBadge("Build: $it")
+ }
}
+ if (latestUpdate != null) {
+ Surface(
+ modifier = Modifier.fillMaxWidth(),
+ shape = RoundedCornerShape(20.dp),
+ color = Color.White.copy(alpha = 0.08f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f)),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(14.dp)
+ ) {
+ Column(
+ modifier = Modifier.weight(1f),
+ verticalArrangement = Arrangement.spacedBy(4.dp)
+ ) {
+ Text(
+ text = translation["update_title"],
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold,
+ fontSize = 14.sp,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+ Text(
+ text = translation.format(
+ "update_content",
+ "version" to (latestUpdate.versionName)
+ ),
+ color = Color.White.copy(alpha = 0.82f),
+ fontSize = 12.sp,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+ }
+ AnimatedContent(
+ targetState = downloadState,
+ label = "UpdateDownloadHero"
+ ) { state ->
+ when (state) {
+ UpdateDownloader.DownloadState.IDLE,
+ UpdateDownloader.DownloadState.FAILED -> {
+ Button(
+ onClick = onUpdateAction,
+ shape = RoundedCornerShape(50),
+ colors = ButtonDefaults.buttonColors(
+ containerColor = Color.White,
+ contentColor = Color(0xFF1B152E)
+ ),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f)),
+ contentPadding = PaddingValues(12.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Default.Download,
+ contentDescription = translation["download_icon_description"],
+ modifier = Modifier.size(18.dp)
+ )
+ }
+ }
+
+ UpdateDownloader.DownloadState.DOWNLOADING -> {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp),
+ modifier = Modifier.padding(end = 6.dp)
+ ) {
+ CircularProgressIndicator(
+ progress = { downloadProgress },
+ modifier = Modifier.size(28.dp),
+ strokeWidth = 3.dp,
+ color = Color.White
+ )
+ Text(
+ text = "${(downloadProgress * 100).toInt()}%",
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
+
+ UpdateDownloader.DownloadState.COMPLETED -> {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Default.Check,
+ contentDescription = translation["completed_icon_description"],
+ tint = Color(0xFFA3F0C2)
+ )
+ Text(
+ text = "Ready to install",
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
Surface(
color = Color.White.copy(alpha = 0.08f),
shape = RoundedCornerShape(24.dp),
@@ -564,23 +705,6 @@ class HomeRootSection : Routes.Route() {
prefs.edit().remove("quick_tile_size_$key").apply()
}
- private fun getTileOffset(name: String): Pair {
- val prefs = context.sharedPreferences
- val key = resolveTileKey(name)
- val raw = prefs.getString("quick_tile_offset_$key", null)
- if (raw == null) return 0f to 0f
- val parts = raw.split(',')
- val x = parts.getOrNull(0)?.toFloatOrNull() ?: 0f
- val y = parts.getOrNull(1)?.toFloatOrNull() ?: 0f
- return x to y
- }
-
- private fun setTileOffset(name: String, x: Float, y: Float) {
- val prefs = context.sharedPreferences
- val key = resolveTileKey(name)
- prefs.edit().putString("quick_tile_offset_$key", "$x,$y").apply()
- }
-
private fun clearTileOffset(name: String) {
val prefs = context.sharedPreferences
val key = resolveTileKey(name)
@@ -611,11 +735,22 @@ class HomeRootSection : Routes.Route() {
val selectedTiles = rememberAsyncMutableStateList(defaultValue = listOf()) {
context.database.getQuickTiles().filter { it.isNotBlank() }
}
- val latestUpdate by rememberAsyncMutableState(defaultValue = null) { Updater.latestRelease }
+ val updateChannel = context.config.root.global.updateSettings.updateChannel.getNullable() ?: "stable"
+ val channelLabel = if (updateChannel == "prerelease") "Pre-release" else "Stable"
+ val latestUpdate by rememberAsyncMutableState(defaultValue = null, keys = arrayOf(updateChannel)) {
+ val channel = if (updateChannel == "prerelease") Channel.PRERELEASE else Channel.STABLE
+ Updater.getLatestRelease(channel)
+ }
+ val changelogUrl = if (updateChannel == "prerelease") changelogPrereleaseUrl else changelogStableUrl
val downloadState by UpdateDownloader.downloadState.collectAsState()
val downloadProgress by UpdateDownloader.downloadProgress.collectAsState()
val coroutineScope = rememberCoroutineScope()
val isPurrAuraActive by rememberPreferenceBool("debug_test_mode", true)
+ var showChangelogDialog by remember { mutableStateOf(false) }
+ var changelogLoading by remember { mutableStateOf(false) }
+ var changelogError by remember { mutableStateOf(null) }
+ var changelogText by remember { mutableStateOf(null) }
+ var changelogVersion by remember { mutableStateOf(null) }
val handleUpdateAction: () -> Unit = {
latestUpdate?.let { latest ->
@@ -624,7 +759,7 @@ class HomeRootSection : Routes.Route() {
for (abi in supportedAbis) {
when (abi) {
"arm64-v8a" -> {
- abiName = "armv8"
+ abiName = "arm64"
break
}
"armeabi-v7a" -> {
@@ -633,29 +768,79 @@ class HomeRootSection : Routes.Route() {
}
}
}
+ context.log.info(
+ "Update request: device ABIs=${supportedAbis.joinToString()} resolvedArch=${abiName ?: "unknown"}",
+ "HomeRoot"
+ )
- if (latest.workflowId == null) {
- context.androidContext.openLink(latest.releaseUrl)
- } else if (abiName == null) {
- android.widget.Toast.makeText(
- context.androidContext,
- "Your device architecture is not supported for automatic updates.",
- android.widget.Toast.LENGTH_LONG
- ).show()
+ if (latest.workflowId != null) {
+ if (abiName == null) {
+ android.widget.Toast.makeText(
+ context.androidContext,
+ "Your device architecture is not supported for automatic updates.",
+ android.widget.Toast.LENGTH_LONG
+ ).show()
+ } else {
+ val artifactName = "purrfectsnap-${abiName}-debug"
+ val downloadUrl = "https://nightly.link/particle-box/PurrfectSnap/actions/runs/${latest.workflowId}/$artifactName.zip"
+ context.log.info("Debug update -> downloading $artifactName from $downloadUrl", "HomeRoot")
+ UpdateDownloader.downloadAndInstall(context, downloadUrl, "$artifactName.zip", coroutineScope)
+ }
+ return@let
+ }
+
+ val releaseDownload = abiName?.let { arch -> latest.assetDownloads[arch] }
+ if (releaseDownload != null) {
+ val fileName = releaseDownload.substringAfterLast('/')
+ context.log.info("Release update -> arch=$abiName url=$releaseDownload file=$fileName", "HomeRoot")
+ UpdateDownloader.downloadAndInstall(context, releaseDownload, fileName, coroutineScope)
} else {
- val artifactName = "purrfectsnap-${abiName}-debug"
- val downloadUrl = "https://nightly.link/particle-box/PurrfectSnap/actions/runs/${latest.workflowId}/$artifactName.zip"
- UpdateDownloader.downloadAndInstall(context.androidContext, downloadUrl, "$artifactName.zip", coroutineScope)
+ context.log.warn(
+ "No matching update asset for arch=$abiName (available: ${latest.assetDownloads.keys})",
+ "HomeRoot"
+ )
+ context.androidContext.openLink(latest.releaseUrl)
}
}
}
+ fun loadChangelog(targetVersion: String, url: String) {
+ if (changelogVersion == targetVersion && changelogText != null) return
+ changelogLoading = true
+ changelogError = null
+ coroutineScope.launch(Dispatchers.IO) {
+ runCatching {
+ changelogClient.newCall(Request.Builder().url(url).build()).execute().use { response ->
+ if (!response.isSuccessful) throw IllegalStateException("Failed to fetch changelog (${response.code})")
+ val body = response.body?.string() ?: throw IllegalStateException("Empty changelog body")
+ extractChangelogForVersion(body, targetVersion).ifBlank { body.trim() }
+ }
+ }.onSuccess { text ->
+ withContext(Dispatchers.Main) {
+ changelogText = text
+ changelogVersion = targetVersion
+ changelogLoading = false
+ }
+ }.onFailure { error ->
+ withContext(Dispatchers.Main) {
+ changelogError = error.message ?: "Failed to load changelog"
+ changelogLoading = false
+ }
+ }
+ }
+ }
+
+ val onUpdateButtonClick: () -> Unit = {
+ latestUpdate?.let {
+ showChangelogDialog = true
+ loadChangelog(it.versionName, changelogUrl)
+ }
+ }
+
var showQuickActionsMenu by remember { mutableStateOf(false) }
- var editMode by remember { mutableStateOf(false) }
val scrollState = rememberScrollState()
val statusBarPadding = WindowInsets.statusBars.asPaddingValues().calculateTopPadding()
val navigationBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()
- val density = LocalDensity.current
val contentBottomPadding = routes.bottomPadding + navigationBarPadding + 96.dp
Box(
@@ -666,7 +851,7 @@ class HomeRootSection : Routes.Route() {
Column(
modifier = Modifier
.fillMaxSize()
- .verticalScroll(scrollState, enabled = !editMode)
+ .verticalScroll(scrollState)
.padding(bottom = contentBottomPadding)
) {
Row(
@@ -680,18 +865,19 @@ class HomeRootSection : Routes.Route() {
Spacer(modifier = Modifier.weight(1f))
HomeActionChips()
}
- Spacer(modifier = Modifier.height(4.dp))
+ Spacer(modifier = Modifier.height(12.dp))
HeroSection(
versionName = BuildConfig.VERSION_NAME,
latestUpdate = latestUpdate,
downloadState = downloadState,
downloadProgress = downloadProgress,
- onUpdateAction = handleUpdateAction,
+ onUpdateAction = onUpdateButtonClick,
+ channelLabel = channelLabel,
isPurrAuraActive = isPurrAuraActive,
onWikiClick = { context.androidContext.openLink("https://github.com/particle-box/PurrfectSnap/wiki") },
onTelegramClick = { context.androidContext.openLink("https://t.me/purrfectsnap_official") },
onGithubClick = { context.androidContext.openLink("https://github.com/particle-box/PurrfectSnap") },
- authorName = "ΞTΞRNAL",
+ authorName = "ETERNAL",
onManageClick = { routes.settings.navigate() },
avenirNext = avenirNext,
)
@@ -723,7 +909,8 @@ class HomeRootSection : Routes.Route() {
color = Color.White.copy(alpha = 0.85f),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
- modifier = Modifier.fillMaxWidth()
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(24.dp))
Column(
@@ -809,184 +996,27 @@ class HomeRootSection : Routes.Route() {
Spacer(modifier = Modifier.width(6.dp))
Text(text = "Manage")
}
- Button(
- onClick = { editMode = !editMode },
- colors = ButtonDefaults.buttonColors(
- containerColor = if (editMode) Color.White else Color.White.copy(alpha = 0.12f),
- contentColor = if (editMode) Color(0xFF1B152E) else Color.White
- )
- ) {
- Icon(
- imageVector = if (editMode) Icons.Default.Check else Icons.Filled.DragHandle,
- contentDescription = null,
- modifier = Modifier.size(18.dp)
- )
- Spacer(modifier = Modifier.width(6.dp))
- Text(if (editMode) "Done" else "Reorder")
- }
}
}
- val spacing = 12.dp
- var spanTick by remember { mutableIntStateOf(0) }
-
- BoxWithConstraints(
- modifier = Modifier.fillMaxWidth()
- ) {
- val density = LocalDensity.current
- val baseCell = remember { (maxWidth - (spacing * 2)) / 3f }
- val baseCellPx = with(density) { baseCell.toPx() }
-
- val (tilePositions, totalHeight) = remember(selectedTiles.size, spanTick) {
- val positions = mutableMapOf()
- var currentX = 0f
- var currentY = 0f
- var rowMaxHeight = 0f
- val screenWidthPx = with(density) { maxWidth.toPx() }
-
- selectedTiles.forEach { tileName ->
- cards.entries.find { entry -> entry.key.first == tileName }?.let {
- val card = it.key
- val (wSpan, hSpan) = getTileSpan(card.first)
- val tileWidthPx = with(density) { (baseCell * wSpan + spacing * (wSpan - 1)).toPx() }
- val tileHeightPx = with(density) { (baseCell * hSpan + spacing * (hSpan - 1)).toPx() }
-
- if (currentX + tileWidthPx > screenWidthPx) {
- currentX = 0f
- currentY += rowMaxHeight
- rowMaxHeight = 0f
- }
-
- positions[tileName] = Offset(currentX, currentY)
- currentX += tileWidthPx + with(density) { spacing.toPx() }
- if (tileHeightPx > rowMaxHeight) {
- rowMaxHeight = tileHeightPx
- }
- }
- }
- positions to (currentY + rowMaxHeight)
- }
-
- Box(modifier = Modifier.height(with(density) { totalHeight.toDp() })) {
- remember(selectedTiles.size, context.translation.loadedLocale) {
- selectedTiles.mapNotNull {
- cards.entries.find { entry -> entry.key.first == it }
- }
- }.forEach { (card, action) ->
- val interactionSource = remember { MutableInteractionSource() }
- val _tick = spanTick
- val (wSpan, hSpan) = getTileSpan(card.first)
- val tileWidth = baseCell * wSpan + spacing * (wSpan - 1)
- val tileHeight = baseCell * hSpan + spacing * (hSpan - 1)
- val tileWidthPx = with(density) { tileWidth.toPx() }
- val tileHeightPx = with(density) { tileHeight.toPx() }
-
- var offsetX by remember(card.first) { mutableStateOf(0f) }
- var offsetY by remember(card.first) { mutableStateOf(0f) }
- var isDragging by remember { mutableStateOf(false) }
-
- LaunchedEffect(card.first, spanTick) {
- val (x, y) = getTileOffset(card.first)
- if (x != 0f || y != 0f) {
- offsetX = x
- offsetY = y
- } else {
- val pos = tilePositions[card.first]
- if (pos != null) {
- offsetX = pos.x
- offsetY = pos.y
- setTileOffset(card.first, offsetX, offsetY)
- }
- }
- }
-
- val animatedOffsetX by animateFloatAsState(
- targetValue = offsetX,
- animationSpec = spring(
- dampingRatio = Spring.DampingRatioMediumBouncy,
- stiffness = Spring.StiffnessLow
- ),
- label = "offsetX"
- )
- val animatedOffsetY by animateFloatAsState(
- targetValue = offsetY,
- animationSpec = spring(
- dampingRatio = Spring.DampingRatioMediumBouncy,
- stiffness = Spring.StiffnessLow
- ),
- label = "offsetY"
- )
-
- val currentOffsetX = if (isDragging) offsetX else animatedOffsetX
- val currentOffsetY = if (isDragging) offsetY else animatedOffsetY
-
- val baseModifier = Modifier
- .offset { IntOffset(currentOffsetX.roundToInt(), currentOffsetY.roundToInt()) }
- .width(tileWidth)
- .height(tileHeight)
- .padding(all = 6.dp)
-
- val editModifier = baseModifier.then(
- Modifier.pointerInput(card.first, tileWidthPx, tileHeightPx) {
- var originalOffsetX = 0f
- var originalOffsetY = 0f
- detectDragGestures(
- onDragStart = {
- isDragging = true
- originalOffsetX = offsetX
- originalOffsetY = offsetY
- },
- onDrag = { change, dragAmount ->
- change.consume()
- offsetX += dragAmount.x
- offsetY += dragAmount.y
- },
- onDragEnd = {
- isDragging = false
- var targetTile: String? = null
- var maxOverlap = 0f
- val tileRect = Rect(Offset(offsetX, offsetY), Size(tileWidthPx, tileHeightPx))
-
- for (otherTileName in selectedTiles) {
- if (otherTileName == card.first) continue
- val (otherOffsetX, otherOffsetY) = getTileOffset(otherTileName)
- val (otherWSpan, otherHSpan) = getTileSpan(otherTileName)
- val otherTileWidth = baseCell * otherWSpan + spacing * (otherWSpan - 1)
- val otherTileHeight = baseCell * otherHSpan + spacing * (otherHSpan - 1)
- val otherRect = Rect(Offset(otherOffsetX, otherOffsetY), Size(with(density) { otherTileWidth.toPx() }, with(density) { otherTileHeight.toPx() }))
- val intersectRect = tileRect.intersect(otherRect)
- val overlapArea = intersectRect.width * intersectRect.height
- if (overlapArea > maxOverlap) {
- maxOverlap = overlapArea
- targetTile = otherTileName
- }
- }
-
- if (targetTile != null) {
- val (wSpan, hSpan) = getTileSpan(card.first)
- val (targetWSpan, targetHSpan) = getTileSpan(targetTile!!)
- if (wSpan == targetWSpan && hSpan == targetHSpan) {
- // swap
- val (targetOffsetX, targetOffsetY) = getTileOffset(targetTile!!)
- setTileOffset(card.first, targetOffsetX, targetOffsetY)
- setTileOffset(targetTile!!, originalOffsetX, originalOffsetY)
- spanTick++ // this will trigger recomposition for all tiles
- } else {
- // revert
- offsetX = originalOffsetX
- offsetY = originalOffsetY
- }
- } else {
- setTileOffset(card.first, offsetX, offsetY)
- }
- }
- )
- }
- )
- val viewModifier = baseModifier.then(Modifier.scaleOnPress(interactionSource))
-
- val tileContent: @Composable (Modifier, Boolean) -> Unit = { tileModifier, isEdit ->
+ val spacing = 12.dp
+ val gridPadding = 8.dp
+ LazyVerticalGrid(
+ columns = GridCells.Adaptive(minSize = 120.dp),
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.spacedBy(spacing),
+ verticalArrangement = Arrangement.spacedBy(spacing),
+ contentPadding = PaddingValues(gridPadding)
+ ) {
+ items(selectedTiles, key = { it }) { tileName ->
+ val cardEntry = cards.entries.find { entry -> entry.key.first == tileName } ?: return@items
+ val (card, action) = cardEntry
+ val interactionSource = remember { MutableInteractionSource() }
Surface(
- modifier = tileModifier,
+ modifier = Modifier
+ .fillMaxWidth()
+ .aspectRatio(1.05f)
+ .scaleOnPress(interactionSource)
+ .clickable { action(routes) },
shape = RoundedCornerShape(18.dp),
color = Color.White.copy(alpha = 0.06f),
tonalElevation = 0.dp,
@@ -1011,86 +1041,29 @@ class HomeRootSection : Routes.Route() {
.fillMaxSize()
.padding(all = 10.dp),
horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = Arrangement.SpaceEvenly,
+ verticalArrangement = Arrangement.Center,
) {
Icon(
imageVector = card.second, contentDescription = null,
tint = Color.White,
- modifier = Modifier.size(50.dp)
+ modifier = Modifier.size(44.dp)
)
+ Spacer(modifier = Modifier.height(8.dp))
Text(
text = card.first,
lineHeight = 16.sp,
- fontSize = 14.sp,
+ fontSize = 13.sp,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
color = Color.White,
overflow = TextOverflow.Ellipsis,
+ maxLines = 2,
)
}
- if (isEdit) {
- var dxAccResize by remember(card.first, spanTick) { mutableStateOf(0f) }
- var dyAccResize by remember(card.first, spanTick) { mutableStateOf(0f) }
- Box(
- modifier = Modifier
- .align(Alignment.BottomEnd)
- .size(28.dp)
- .pointerInput(card.first, spanTick) {
- detectDragGestures(
- onDragStart = {
- dxAccResize = 0f
- dyAccResize = 0f
- },
- onDrag = { change, dragAmount ->
- change.consume()
- dxAccResize += dragAmount.x
- dyAccResize += dragAmount.y
-
- var newW = wSpan
- var newH = hSpan
- val step = baseCellPx / 2f
-
- while (dxAccResize > step) {
- newW = (wSpan + 1).coerceIn(1, 3)
- dxAccResize -= step
- }
- while (dxAccResize < -step) {
- newW = (wSpan - 1).coerceIn(1, 3)
- dxAccResize += step
- }
- while (dyAccResize > step) {
- newH = (hSpan + 1).coerceIn(1, 3)
- dyAccResize -= step
- }
- while (dyAccResize < -step) {
- newH = (hSpan - 1).coerceIn(1, 3)
- dyAccResize += step
- }
-
- if (newW != wSpan || newH != hSpan) {
- setTileSpan(card.first, newW, newH)
- spanTick++
- selectedTiles.forEach { clearTileOffset(it) }
- }
- }
- )
- },
- contentAlignment = Alignment.Center
- ) {
- Icon(Icons.Filled.DragHandle, contentDescription = null, tint = Color.White)
- }
- }
}
}
}
-
- if (editMode) {
- tileContent(editModifier, true)
- } else {
- tileContent(viewModifier.then(Modifier.clickable { action(routes) }), false)
- }
}
- }
}
}
}
@@ -1098,6 +1071,71 @@ class HomeRootSection : Routes.Route() {
}
}
+ if (showChangelogDialog && latestUpdate != null) {
+ AestheticDialog(
+ onDismissRequest = { showChangelogDialog = false },
+ title = "Changelog",
+ text = "",
+ icon = Icons.Filled.Info,
+ confirmButtonText = "Update",
+ onConfirm = {
+ showChangelogDialog = false
+ handleUpdateAction()
+ },
+ dismissButtonText = "Cancel",
+ onDismiss = { showChangelogDialog = false },
+ confirmEnabled = !changelogLoading,
+ customContent = {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(min = 120.dp, max = 340.dp)
+ .verticalScroll(rememberScrollState()),
+ verticalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ when {
+ changelogLoading -> {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.Center,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ CircularProgressIndicator(
+ modifier = Modifier.size(28.dp),
+ strokeWidth = 3.dp,
+ color = Color.White
+ )
+ Spacer(modifier = Modifier.width(10.dp))
+ Text(
+ text = "Loading changelog…",
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
+
+ changelogError != null -> {
+ Text(
+ text = changelogError ?: "Failed to load changelog",
+ color = MaterialTheme.colorScheme.error,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+
+ else -> {
+ Text(
+ text = changelogText ?: "Changelog not available",
+ color = PurrfectPalette.textPrimary,
+ fontSize = 14.sp,
+ lineHeight = 20.sp
+ )
+ }
+ }
+ }
+ }
+ )
+ }
+
if (showQuickActionsMenu) {
QuickActionsDialog(
quickActions = cards,
@@ -1110,9 +1148,6 @@ class HomeRootSection : Routes.Route() {
newList.forEach { clearTileOffset(it) }
selectedTiles.clear()
selectedTiles.addAll(newList)
- if (newList.isEmpty()) {
- editMode = false
- }
context.coroutineScope.launch {
context.database.setQuickTiles(selectedTiles)
}
@@ -1123,5 +1158,21 @@ class HomeRootSection : Routes.Route() {
}
}
}
+
+private fun extractChangelogForVersion(raw: String, version: String): String {
+ val lines = raw.lines()
+ val headerRegex = Regex("^\\s*#+\\s*v?${Regex.escape(version)}\\b", RegexOption.IGNORE_CASE)
+ var collecting = false
+ val collected = mutableListOf()
+ lines.forEach { line ->
+ if (headerRegex.containsMatchIn(line)) {
+ collecting = true
+ return@forEach
+ }
+ if (collecting && line.startsWith("#")) return@forEach
+ if (collecting) collected.add(line)
+ }
+ return collected.joinToString("\n").trim()
}
}
+
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt
index 5eefc2a2..57dad576 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/HomeSettings.kt
@@ -4,6 +4,7 @@ import android.content.SharedPreferences
import android.net.Uri
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
+import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.*
@@ -20,6 +21,7 @@ import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
@@ -68,8 +70,28 @@ class HomeSettings : Routes.Route() {
private fun scheduleUpdateCheck() {
val workManager = WorkManager.getInstance(context.androidContext)
- if (context.config.root.global.updateSettings.autoUpdateCheck.get()) {
- val frequency = context.config.root.global.updateSettings.updateCheckFrequency.get()
+ val updateSettings = context.config.root.global.updateSettings
+ var configDirty = false
+ val autoUpdateCheck = updateSettings.autoUpdateCheck.getNullable() ?: run {
+ configDirty = true
+ updateSettings.autoUpdateCheck.set(true)
+ true
+ }
+ val frequency = updateSettings.updateCheckFrequency.getNullable() ?: run {
+ configDirty = true
+ updateSettings.updateCheckFrequency.set("daily")
+ "daily"
+ }
+ val updateChannel = updateSettings.updateChannel.getNullable() ?: run {
+ configDirty = true
+ updateSettings.updateChannel.set("stable")
+ "stable"
+ }
+ if (configDirty) {
+ context.config.writeConfig()
+ }
+
+ if (autoUpdateCheck) {
val repeatInterval = when (frequency) {
"daily" -> 1L
"weekly" -> 7L
@@ -86,6 +108,7 @@ class HomeSettings : Routes.Route() {
.putString("channel_description", translation["update_notification_channel_description"])
.putString("notification_title", translation["update_notification_title"])
.putString("notification_text", translation["update_notification_text"])
+ .putString("update_channel", updateChannel)
.build()
val workRequest = PeriodicWorkRequestBuilder(repeatInterval, TimeUnit.DAYS)
@@ -255,7 +278,7 @@ class HomeSettings : Routes.Route() {
) { content(this) }
}
- @OptIn(ExperimentalMaterial3Api::class)
+ @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
override val content: @Composable (NavBackStackEntry) -> Unit = {
val contextC = LocalContext.current
val scope = rememberCoroutineScope()
@@ -291,6 +314,29 @@ class HomeSettings : Routes.Route() {
}
}
+ @Composable
+ fun AestheticDropdownField(
+ value: String,
+ expanded: Boolean,
+ modifier: Modifier = Modifier,
+ onClick: () -> Unit
+ ) {
+ val shape = RoundedCornerShape(16.dp)
+ Row(
+ modifier = modifier
+ .clip(shape)
+ .background(Color.White.copy(alpha = 0.06f))
+ .border(1.dp, Color.White.copy(alpha = 0.16f), shape)
+ .clickable { onClick() }
+ .padding(horizontal = 14.dp, vertical = 10.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Text(text = value, color = Color.White)
+ ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)
+ }
+ }
+
val topPadding = WindowInsets.statusBars.asPaddingValues().calculateTopPadding()
Box(
modifier = Modifier
@@ -374,29 +420,55 @@ class HomeSettings : Routes.Route() {
GlassCard {
RowTitle(title = translation["ui_settings_title"])
ShiftedRow {
- Row(
- modifier = Modifier
- .fillMaxWidth()
- .heightIn(min = 55.dp),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween
- ) {
- Text(text = translation["haptic_feedback_label"])
- var hapticFeedbackEnabled by remember { mutableStateOf(context.config.root.global.uiSettings.hapticFeedback.getNullable() ?: true) }
- val hapticFeedback = LocalHapticFeedback.current
- Switch(
- checked = hapticFeedbackEnabled,
- onCheckedChange = {
- if (it) {
- hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
- }
- hapticFeedbackEnabled = it
- context.config.root.global.uiSettings.hapticFeedback.set(it)
- context.config.writeConfig()
- },
- modifier = Modifier.padding(end = 26.dp),
- colors = purrfectSwitchColors()
- )
+ Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(min = 55.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Text(text = translation["haptic_feedback_label"])
+ var hapticFeedbackEnabled by remember { mutableStateOf(context.config.root.global.uiSettings.hapticFeedback.getNullable() ?: true) }
+ val hapticFeedback = LocalHapticFeedback.current
+ Switch(
+ checked = hapticFeedbackEnabled,
+ onCheckedChange = {
+ if (it) {
+ hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
+ }
+ hapticFeedbackEnabled = it
+ context.config.root.global.uiSettings.hapticFeedback.set(it)
+ context.config.writeConfig()
+ },
+ modifier = Modifier.padding(end = 26.dp),
+ colors = purrfectSwitchColors()
+ )
+ }
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(min = 55.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Text(text = translation["use_system_toasts_label"])
+ var useSystemToasts by remember { mutableStateOf(context.config.root.global.uiSettings.useSystemToasts.getNullable() ?: false) }
+ val hapticFeedback = LocalHapticFeedback.current
+ Switch(
+ checked = useSystemToasts,
+ onCheckedChange = {
+ if (context.config.root.global.uiSettings.hapticFeedback.get()) {
+ hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
+ }
+ useSystemToasts = it
+ context.config.root.global.uiSettings.useSystemToasts.set(it)
+ context.config.writeConfig()
+ },
+ modifier = Modifier.padding(end = 26.dp),
+ colors = purrfectSwitchColors()
+ )
+ }
}
}
}
@@ -405,77 +477,115 @@ class HomeSettings : Routes.Route() {
RowTitle(title = translation["updates_title"])
Column(verticalArrangement = Arrangement.spacedBy(10.dp)) {
var autoUpdateCheck by remember { mutableStateOf(context.config.root.global.updateSettings.autoUpdateCheck.getNullable() ?: true) }
- var selectedFrequency by remember { mutableStateOf(context.config.root.global.updateSettings.updateCheckFrequency.getNullable() ?: "weekly") }
- var frequencyMenuExpanded by remember { mutableStateOf(false) }
- Row(
- modifier = Modifier
- .fillMaxWidth()
- .heightIn(min = 55.dp),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween
- ) {
- Text(text = translation["auto_update_check"])
- val hapticFeedback = LocalHapticFeedback.current
- Switch(
- checked = autoUpdateCheck,
- onCheckedChange = {
- if (context.config.root.global.uiSettings.hapticFeedback.get()) {
- hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
+ var selectedChannel by remember { mutableStateOf(context.config.root.global.updateSettings.updateChannel.getNullable() ?: "stable") }
+ var channelMenuExpanded by remember { mutableStateOf(false) }
+ ShiftedRow {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(min = 55.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Text(text = translation["auto_update_check"])
+ val hapticFeedback = LocalHapticFeedback.current
+ Switch(
+ checked = autoUpdateCheck,
+ onCheckedChange = {
+ if (context.config.root.global.uiSettings.hapticFeedback.get()) {
+ hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
}
autoUpdateCheck = it
- if (it && context.config.root.global.updateSettings.updateCheckFrequency.getNullable() == null) {
- selectedFrequency = "weekly"
- context.config.root.global.updateSettings.updateCheckFrequency.set("weekly")
- }
context.config.root.global.updateSettings.autoUpdateCheck.set(it)
context.config.writeConfig()
scheduleUpdateCheck()
},
modifier = Modifier.padding(end = 26.dp),
- colors = purrfectSwitchColors()
- )
+ colors = purrfectSwitchColors()
+ )
+ }
}
AnimatedVisibility(visible = autoUpdateCheck) {
+ val spacingModifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 26.dp)
+
ExposedDropdownMenuBox(
- expanded = frequencyMenuExpanded,
- onExpandedChange = { frequencyMenuExpanded = it },
+ expanded = channelMenuExpanded,
+ onExpandedChange = { channelMenuExpanded = it },
+ modifier = spacingModifier
+ ) {
+ AestheticDropdownField(
+ value = translation.getOrNull("update_channel_${selectedChannel}") ?: selectedChannel,
+ expanded = channelMenuExpanded,
modifier = Modifier
.fillMaxWidth()
- .padding(start = 10.dp, end = 26.dp)
+ .menuAnchor(MenuAnchorType.PrimaryNotEditable),
+ onClick = { channelMenuExpanded = true }
+ )
+ ExposedDropdownMenu(
+ expanded = channelMenuExpanded,
+ onDismissRequest = { channelMenuExpanded = false }
) {
- TextField(
- value = translation.getOrNull("update_check_frequency_${selectedFrequency}") ?: selectedFrequency,
- onValueChange = {},
- readOnly = true,
- modifier = Modifier
- .fillMaxWidth(),
- trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = frequencyMenuExpanded) },
- colors = ExposedDropdownMenuDefaults.textFieldColors(
- focusedContainerColor = Color.White.copy(alpha = 0.08f),
- unfocusedContainerColor = Color.White.copy(alpha = 0.06f),
- focusedIndicatorColor = Color.Transparent,
- unfocusedIndicatorColor = Color.Transparent
+ listOf("stable", "prerelease").forEach { channel ->
+ DropdownMenuItem(
+ text = { Text(text = translation.getOrNull("update_channel_${channel}") ?: channel) },
+ onClick = {
+ selectedChannel = channel
+ channelMenuExpanded = false
+ context.config.root.global.updateSettings.updateChannel.set(channel)
+ context.config.writeConfig()
+ scheduleUpdateCheck()
+ }
)
- )
- ExposedDropdownMenu(
- expanded = frequencyMenuExpanded,
- onDismissRequest = { frequencyMenuExpanded = false }
- ) {
- listOf("daily", "weekly", "monthly").forEach { frequency ->
- DropdownMenuItem(
- text = { Text(text = translation.getOrNull("update_check_frequency_${frequency}") ?: frequency) },
- onClick = {
- selectedFrequency = frequency
- frequencyMenuExpanded = false
- context.config.root.global.updateSettings.updateCheckFrequency.set(frequency)
- context.config.writeConfig()
- scheduleUpdateCheck()
- }
- )
- }
}
}
}
+ }
+ }
+ }
+
+ GlassCard {
+ RowTitle(title = "Reset PurrfectSnap")
+ ShiftedRow(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(min = 55.dp)
+ .clickable {
+ // Clear setup progress and route back to SetupActivity
+ context.sharedPreferences.edit()
+ .remove("setup_in_progress")
+ .remove("setup_current_route")
+ .remove("setup_skip_patch")
+ .remove("setup_install_mode")
+ .apply()
+
+ // Clear config to defaults
+ context.config.reset()
+ context.config.writeConfig()
+
+ // Launch setup activity fresh
+ val intent = android.content.Intent(context.androidContext, me.eternal.purrfectsnap.ui.setup.SetupActivity::class.java)
+ intent.flags = android.content.Intent.FLAG_ACTIVITY_NEW_TASK or android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
+ context.androidContext.startActivity(intent)
+
+ // Close current manager activity
+ routes.navController.popBackStack()
+ },
+ horizontalArrangement = Arrangement.SpaceBetween,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Text(
+ text = "Reset and restart setup",
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Medium,
+ lineHeight = 20.sp
+ )
+ Icon(
+ imageVector = Icons.AutoMirrored.Filled.OpenInNew,
+ contentDescription = "Reset",
+ modifier = Modifier.padding(end = 14.dp)
+ )
}
}
@@ -488,6 +598,7 @@ class HomeSettings : Routes.Route() {
var storedStoriesCount by rememberAsyncMutableState(defaultValue = 0) {
context.messageLogger.getStoredStoriesCount()
}
+ var showImportDialog by remember { mutableStateOf(false) }
Column(
modifier = Modifier
.fillMaxWidth()
@@ -507,12 +618,12 @@ class HomeSettings : Routes.Route() {
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth()
)
- Row(
+ FlowRow(
modifier = Modifier
- .wrapContentWidth()
+ .fillMaxWidth()
.align(Alignment.CenterHorizontally),
- horizontalArrangement = Arrangement.spacedBy(10.dp),
- verticalAlignment = Alignment.CenterVertically
+ horizontalArrangement = Arrangement.spacedBy(10.dp, Alignment.CenterHorizontally),
+ verticalArrangement = Arrangement.spacedBy(10.dp)
) {
Button(
onClick = {
@@ -576,6 +687,13 @@ class HomeSettings : Routes.Route() {
) {
Text(text = translation["clear_button"])
}
+ Button(
+ onClick = { showImportDialog = true },
+ colors = sharedButtonColors,
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f))
+ ) {
+ Text(text = "Import")
+ }
}
}
OutlinedButton(
@@ -588,6 +706,46 @@ class HomeSettings : Routes.Route() {
) {
Text(translation["view_logger_history_button"])
}
+ if (showImportDialog) {
+ AlertDialog(
+ onDismissRequest = { showImportDialog = false },
+ title = { Text("Import message logger") },
+ text = { Text("Importing will override your current message logger database. Continue?") },
+ confirmButton = {
+ TextButton(onClick = {
+ showImportDialog = false
+ runCatching {
+ activityLauncherHelper.openFile("application/octet-stream") { uri ->
+ runCatching {
+ context.androidContext.contentResolver.openInputStream(uri.toUri())?.use { inputStream ->
+ context.messageLogger.databaseFile.outputStream().use { outputStream ->
+ inputStream.copyTo(outputStream)
+ }
+ } ?: throw IllegalStateException("Unable to open selected file")
+ storedMessagesCount = context.messageLogger.getStoredMessageCount()
+ storedStoriesCount = context.messageLogger.getStoredStoriesCount()
+ context.shortToast(translation["success_toast"])
+ context.log.info("Imported message logger from $uri", "MessageLogger")
+ }.onFailure {
+ context.log.error("Failed to import message logger", it)
+ context.longToast("Import failed: ${it.localizedMessage ?: it.message}")
+ }
+ }
+ }.onFailure {
+ context.log.error("Failed to launch import picker", it)
+ context.longToast("Import failed: ${it.localizedMessage ?: it.message}")
+ }
+ }) {
+ Text(translation["button.import"] ?: "Import")
+ }
+ },
+ dismissButton = {
+ TextButton(onClick = { showImportDialog = false }) {
+ Text(translation["button.cancel"])
+ }
+ }
+ )
+ }
}
}
@@ -665,31 +823,23 @@ class HomeSettings : Routes.Route() {
Row(
horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 26.dp)
) {
var selectedFileType by remember { mutableStateOf(InternalFileHandleType.entries.first()) }
- Box(
- modifier = Modifier
- .weight(1f)
- .padding(start = 26.dp)
- ) {
+ Box(modifier = Modifier.weight(1f)) {
var expanded by remember { mutableStateOf(false) }
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = it },
modifier = Modifier.fillMaxWidth()
) {
- TextField(
+ AestheticDropdownField(
value = translation.getOrNull("debug_file_${selectedFileType.name.lowercase()}") ?: selectedFileType.fileName,
- onValueChange = {},
- readOnly = true,
+ expanded = expanded,
modifier = Modifier
- .fillMaxWidth(),
- colors = ExposedDropdownMenuDefaults.textFieldColors(
- focusedContainerColor = Color.White.copy(alpha = 0.08f),
- unfocusedContainerColor = Color.White.copy(alpha = 0.06f),
- focusedIndicatorColor = Color.Transparent,
- unfocusedIndicatorColor = Color.Transparent
- )
+ .fillMaxWidth()
+ .menuAnchor(MenuAnchorType.PrimaryNotEditable),
+ onClick = { expanded = true }
)
ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
InternalFileHandleType.entries.forEach { fileType ->
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/RetroGameScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/RetroGameScreen.kt
new file mode 100644
index 00000000..4f86f0fe
--- /dev/null
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/home/RetroGameScreen.kt
@@ -0,0 +1,339 @@
+package me.eternal.purrfectsnap.ui.manager.pages.home
+
+import android.view.MotionEvent
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.asPaddingValues
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableFloatStateOf
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.FilterQuality
+import androidx.compose.ui.graphics.ImageBitmap
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.input.pointer.pointerInteropFilter
+import androidx.navigation.NavBackStackEntry
+import kotlinx.coroutines.delay
+import me.eternal.purrfectsnap.ui.manager.Routes
+import me.eternal.purrfectsnap.ui.manager.components.FloatingTopBar
+import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
+import kotlin.math.abs
+import kotlin.math.min
+import kotlin.math.roundToInt
+import kotlin.random.Random
+
+class RetroGameScreen : Routes.Route() {
+ override val content: @Composable (NavBackStackEntry) -> Unit = {
+ val gridWidth = 120
+ val gridHeight = 160
+ val shipSpeed = 1.7f
+ val shipRadius = 4.5f
+ val maxSpeedMultiplier = 2.2f
+ val speedRampPerScore = 0.035f
+ val rng = remember { Random(System.currentTimeMillis()) }
+ val pixelFont = remember { FontFamily.Monospace }
+
+ data class Star(var x: Float, var y: Float, var speed: Float)
+ data class Planet(var x: Float, var y: Float, var radius: Float, var speed: Float)
+
+ var score by remember { mutableIntStateOf(0) }
+ var isGameOver by remember { mutableStateOf(false) }
+ var leftPressed by remember { mutableStateOf(false) }
+ var rightPressed by remember { mutableStateOf(false) }
+ var shipX by remember { mutableFloatStateOf(gridWidth / 2f) }
+ val shipY = gridHeight - 20f
+
+ val stars = remember { mutableListOf() }
+ val planets = remember { mutableListOf() }
+
+ val frameBitmap = remember { ImageBitmap(gridWidth, gridHeight) }
+ val frameCanvas = remember { Canvas(frameBitmap) }
+ val paint = remember { Paint() }
+ var frameTick by remember { mutableIntStateOf(0) }
+
+ fun spawnPlanet(): Planet {
+ val radius = rng.nextInt(6, 14).toFloat()
+ val x = rng.nextInt(radius.roundToInt(), gridWidth - radius.roundToInt()).toFloat()
+ val y = rng.nextInt(-gridHeight, -20).toFloat()
+ val speed = rng.nextInt(10, 20) / 10f
+ return Planet(x = x, y = y, radius = radius, speed = speed)
+ }
+
+ fun resetGame() {
+ score = 0
+ isGameOver = false
+ shipX = gridWidth / 2f
+ stars.clear()
+ planets.clear()
+ repeat(28) {
+ stars.add(
+ Star(
+ x = rng.nextInt(0, gridWidth).toFloat(),
+ y = rng.nextInt(0, gridHeight).toFloat(),
+ speed = rng.nextInt(6, 12) / 10f
+ )
+ )
+ }
+ repeat(4) { planets.add(spawnPlanet()) }
+ }
+
+ fun drawRect(left: Float, top: Float, right: Float, bottom: Float, color: Color) {
+ paint.color = color
+ paint.alpha = 1f
+ frameCanvas.drawRect(Rect(left, top, right, bottom), paint)
+ }
+
+ fun drawCircle(centerX: Float, centerY: Float, radius: Float, color: Color) {
+ paint.color = color
+ frameCanvas.drawCircle(androidx.compose.ui.geometry.Offset(centerX, centerY), radius, paint)
+ }
+
+ fun drawShip() {
+ val sx = shipX.roundToInt().toFloat()
+ drawRect(sx - 2f, shipY, sx + 3f, shipY + 1f, Color(0xFFE7F6FF))
+ drawRect(sx - 3f, shipY + 1f, sx + 4f, shipY + 3f, Color(0xFFE7F6FF))
+ drawRect(sx - 4f, shipY + 3f, sx + 5f, shipY + 6f, Color(0xFFE7F6FF))
+ drawRect(sx - 2f, shipY + 6f, sx + 3f, shipY + 8f, Color(0xFFE7F6FF))
+ drawRect(sx - 1f, shipY + 2f, sx + 2f, shipY + 4f, Color(0xFF8AF4FF))
+ if (!isGameOver) {
+ drawRect(sx - 1f, shipY + 8f, sx + 2f, shipY + 10f, Color(0xFFFFB24D))
+ drawRect(sx, shipY + 10f, sx + 1f, shipY + 12f, Color(0xFFFF6B6B))
+ }
+ }
+
+ fun renderFrame() {
+ drawRect(0f, 0f, gridWidth.toFloat(), gridHeight.toFloat(), Color(0xFF1B1440))
+ drawRect(0f, 0f, gridWidth.toFloat(), 14f, Color(0xFF5236B8))
+ stars.forEach { star ->
+ drawRect(star.x, star.y, star.x + 1f, star.y + 1f, Color(0xFFEEE9FF))
+ }
+ planets.forEach { planet ->
+ drawCircle(planet.x, planet.y, planet.radius, Color(0xFF4FD4FF))
+ drawCircle(planet.x - planet.radius * 0.3f, planet.y - planet.radius * 0.2f, planet.radius * 0.35f, Color(0xFFB0F0FF))
+ }
+ drawShip()
+ if (isGameOver) {
+ drawRect(0f, gridHeight / 2f - 10f, gridWidth.toFloat(), gridHeight / 2f + 8f, Color(0xAA000000))
+ }
+ }
+
+ LaunchedEffect(Unit) {
+ resetGame()
+ while (true) {
+ delay(16)
+ if (!isGameOver) {
+ val speedMultiplier = min(
+ maxSpeedMultiplier,
+ 1f + (score * speedRampPerScore)
+ )
+ val direction = (if (leftPressed) -1f else 0f) + (if (rightPressed) 1f else 0f)
+ shipX = (shipX + direction * shipSpeed).coerceIn(8f, gridWidth - 8f)
+ stars.forEach { star ->
+ star.y += star.speed * speedMultiplier
+ if (star.y > gridHeight) {
+ star.y = 0f
+ star.x = rng.nextInt(0, gridWidth).toFloat()
+ }
+ }
+ planets.forEachIndexed { index, planet ->
+ planet.y += planet.speed * speedMultiplier
+ if (planet.y - planet.radius > gridHeight) {
+ planets[index] = spawnPlanet()
+ score += 1
+ }
+ }
+ planets.forEach { planet ->
+ val dx = abs(planet.x - shipX)
+ val dy = abs(planet.y - shipY)
+ if (dx * dx + dy * dy < (planet.radius + shipRadius) * (planet.radius + shipRadius)) {
+ isGameOver = true
+ }
+ }
+ }
+ renderFrame()
+ frameTick++
+ }
+ }
+
+ val bottomPadding = routes.bottomPadding +
+ WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() +
+ 24.dp
+
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(PurrfectPalette.backgroundGradient)
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(bottom = bottomPadding),
+ verticalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ FloatingTopBar(
+ title = "Retro Flight",
+ onBack = { routes.navController.popBackStack() }
+ )
+ Spacer(modifier = Modifier.height(6.dp))
+ Box(
+ modifier = Modifier
+ .padding(horizontal = 18.dp)
+ .fillMaxWidth()
+ .weight(1f, fill = true)
+ .aspectRatio(3f / 4f, matchHeightConstraintsFirst = true)
+ .border(2.dp, Color.White.copy(alpha = 0.7f), RoundedCornerShape(14.dp))
+ .background(Color(0xFF21195A), RoundedCornerShape(14.dp)),
+ contentAlignment = Alignment.Center
+ ) {
+ key(frameTick) {
+ Image(
+ bitmap = frameBitmap,
+ contentDescription = null,
+ filterQuality = FilterQuality.None,
+ modifier = Modifier
+ .fillMaxSize()
+ .border(1.dp, Color.White.copy(alpha = 0.1f))
+ )
+ }
+ Text(
+ text = score.toString(),
+ color = Color.White,
+ fontSize = 16.sp,
+ fontFamily = pixelFont,
+ modifier = Modifier.align(Alignment.TopCenter).padding(top = 6.dp)
+ )
+ if (isGameOver) {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = Modifier.align(Alignment.Center)
+ ) {
+ Text(
+ text = "GAME OVER",
+ color = Color.White,
+ fontSize = 14.sp,
+ fontWeight = FontWeight.Bold,
+ fontFamily = pixelFont
+ )
+ Spacer(modifier = Modifier.height(6.dp))
+ Button(
+ onClick = { resetGame() },
+ colors = ButtonDefaults.buttonColors(
+ containerColor = Color(0xFF5A43D6),
+ contentColor = Color.White
+ ),
+ shape = RoundedCornerShape(6.dp)
+ ) {
+ Text("RESTART", fontFamily = pixelFont, fontSize = 12.sp)
+ }
+ }
+ }
+ }
+ Row(
+ modifier = Modifier
+ .padding(horizontal = 18.dp)
+ .fillMaxWidth(),
+ horizontalArrangement = Arrangement.spacedBy(12.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Surface(
+ modifier = Modifier
+ .weight(1f)
+ .height(56.dp)
+ .pointerInteropFilter {
+ when (it.action) {
+ MotionEvent.ACTION_DOWN -> {
+ leftPressed = true
+ true
+ }
+ MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
+ leftPressed = false
+ true
+ }
+ else -> false
+ }
+ },
+ shape = RoundedCornerShape(10.dp),
+ color = Color(0xFF2E2568),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.2f))
+ ) {
+ Box(contentAlignment = Alignment.Center) {
+ Text(
+ text = "LEFT",
+ color = Color.White,
+ fontSize = 14.sp,
+ fontFamily = pixelFont,
+ textAlign = TextAlign.Center
+ )
+ }
+ }
+ Surface(
+ modifier = Modifier
+ .weight(1f)
+ .height(56.dp)
+ .pointerInteropFilter {
+ when (it.action) {
+ MotionEvent.ACTION_DOWN -> {
+ rightPressed = true
+ true
+ }
+ MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
+ rightPressed = false
+ true
+ }
+ else -> false
+ }
+ },
+ shape = RoundedCornerShape(10.dp),
+ color = Color(0xFF2E2568),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.2f))
+ ) {
+ Box(contentAlignment = Alignment.Center) {
+ Text(
+ text = "RIGHT",
+ color = Color.White,
+ fontSize = 14.sp,
+ fontFamily = pixelFont,
+ textAlign = TextAlign.Center
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/scripting/ManageScriptReposSection.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/scripting/ManageScriptReposSection.kt
index d6a66b09..7f304124 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/scripting/ManageScriptReposSection.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/scripting/ManageScriptReposSection.kt
@@ -29,6 +29,7 @@ import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExtendedFloatingActionButton
+import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -109,7 +110,14 @@ class ManageScriptReposSection : Routes.Route() {
ExtendedFloatingActionButton(
onClick = { showAddDialog = true },
containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.34f),
- contentColor = Color.White
+ contentColor = Color.White,
+ shape = RoundedCornerShape(18.dp),
+ elevation = FloatingActionButtonDefaults.elevation(
+ defaultElevation = 0.dp,
+ pressedElevation = 0.dp,
+ focusedElevation = 0.dp,
+ hoveredElevation = 0.dp
+ )
) {
Icon(Icons.Default.Public, contentDescription = null, tint = Color.White)
Spacer(modifier = Modifier.width(8.dp))
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/AddFriendDialog.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/AddFriendDialog.kt
index 1a5d8c5f..36323fa0 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/AddFriendDialog.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/AddFriendDialog.kt
@@ -27,7 +27,6 @@ import me.eternal.purrfectsnap.RemoteSideContext
import me.eternal.purrfectsnap.common.ReceiversConfig
import me.eternal.purrfectsnap.common.data.MessagingFriendInfo
import me.eternal.purrfectsnap.common.data.MessagingGroupInfo
-import me.eternal.purrfectsnap.common.ui.rememberAsyncMutableState
import me.eternal.purrfectsnap.common.util.snap.BitmojiSelfie
import me.eternal.purrfectsnap.common.util.snap.SnapWidgetBroadcastReceiverHelper
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
@@ -45,7 +44,7 @@ class AddFriendDialog(
val getGroupState: (group: MessagingGroupInfo) -> Boolean,
)
- private val stateCache = mutableMapOf()
+ private val stateCache = mutableStateMapOf()
private val translation by lazy { context.translation.getCategory("manager.dialogs.add_friend")}
@Composable
@@ -57,9 +56,13 @@ class AddFriendDialog(
getCurrentState: () -> Boolean,
onState: (Boolean) -> Unit = {},
) {
- var currentState by rememberAsyncMutableState(defaultValue = stateCache[id] ?: false) {
- getCurrentState().also { stateCache[id] = it }
+ val cachedState = stateCache[id]
+ LaunchedEffect(id, cachedState) {
+ if (cachedState == null) {
+ stateCache[id] = getCurrentState()
+ }
}
+ val currentState = stateCache[id] ?: false
val coroutineScope = rememberCoroutineScope()
val cardShape = RoundedCornerShape(18.dp)
@@ -68,9 +71,9 @@ class AddFriendDialog(
.fillMaxWidth()
.padding(vertical = 6.dp)
.clickable {
- currentState = !currentState
- stateCache[id] = currentState
- coroutineScope.launch(Dispatchers.IO) { onState(currentState) }
+ val nextState = !currentState
+ stateCache[id] = nextState
+ coroutineScope.launch(Dispatchers.IO) { onState(nextState) }
},
shape = cardShape,
color = Color.Transparent,
@@ -125,9 +128,8 @@ class AddFriendDialog(
Switch(
checked = currentState,
onCheckedChange = {
- currentState = it
- stateCache[id] = currentState
- coroutineScope.launch(Dispatchers.IO) { onState(currentState) }
+ stateCache[id] = it
+ coroutineScope.launch(Dispatchers.IO) { onState(it) }
},
colors = SwitchDefaults.colors(
checkedThumbColor = Color.White,
@@ -156,19 +158,12 @@ class AddFriendDialog(
)
.padding(horizontal = 16.dp, vertical = 18.dp)
) {
- Column(verticalArrangement = Arrangement.spacedBy(6.dp)) {
- Text(
- text = translation["title"],
- fontSize = 22.sp,
- fontWeight = FontWeight.ExtraBold,
- color = Color.White
- )
- Text(
- text = translation["search_hint"],
- fontSize = 13.sp,
- color = Color.White.copy(alpha = 0.85f)
- )
- }
+ Text(
+ text = translation["title"],
+ fontSize = 22.sp,
+ fontWeight = FontWeight.ExtraBold,
+ color = Color.White
+ )
}
Surface(
@@ -185,10 +180,11 @@ class AddFriendDialog(
value = searchKeyword.value,
onValueChange = { searchKeyword.value = it },
placeholder = {
- Text(text = translation["search_hint"])
+ Text(text = translation["search_hint"], color = PurrfectPalette.textSecondary)
},
modifier = Modifier
.fillMaxWidth(),
+ singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text, imeAction = ImeAction.Done),
leadingIcon = {
Icon(Icons.Filled.Search, contentDescription = translation["search_icon_description"])
@@ -198,8 +194,15 @@ class AddFriendDialog(
unfocusedContainerColor = PurrfectPalette.cardOverlayColor.copy(alpha = 0.8f),
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
- cursorColor = Color.White
- )
+ cursorColor = Color.White,
+ focusedTextColor = Color.White,
+ unfocusedTextColor = Color.White,
+ focusedLeadingIconColor = Color.White,
+ unfocusedLeadingIconColor = Color.White.copy(alpha = 0.85f),
+ focusedPlaceholderColor = PurrfectPalette.textSecondary,
+ unfocusedPlaceholderColor = PurrfectPalette.textSecondary
+ ),
+ textStyle = LocalTextStyle.current.copy(color = Color.White)
)
}
}
@@ -302,6 +305,15 @@ class AddFriendDialog(
it.mutableUsername.contains(searchKeyword.value, ignoreCase = true) ||
it.displayName?.contains(searchKeyword.value, ignoreCase = true) == true
} ?: cachedFriends!!
+ val selectedFriendCount by remember(filteredFriends) {
+ derivedStateOf {
+ filteredFriends.count { friend ->
+ stateCache[friend.userId] ?: actionHandler.getFriendState(friend)
+ }
+ }
+ }
+ val hasFriendsSelected = selectedFriendCount > 0
+ val allFriendsSelected = filteredFriends.isNotEmpty() && selectedFriendCount == filteredFriends.size
DialogHeader(searchKeyword)
@@ -337,14 +349,63 @@ class AddFriendDialog(
item {
if (filteredFriends.isNotEmpty()) {
- Text(
- text = translation["category_friends"],
- fontSize = 16.sp,
- fontWeight = FontWeight.SemiBold,
+ Row(
modifier = Modifier
+ .fillMaxWidth()
.padding(bottom = 8.dp, top = 14.dp),
- color = Color.White
- )
+ horizontalArrangement = Arrangement.SpaceBetween,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Text(
+ text = translation["category_friends"],
+ fontSize = 16.sp,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White
+ )
+ Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
+ TextButton(
+ onClick = {
+ coroutineScope.launch(Dispatchers.IO) {
+ filteredFriends.forEach { friend ->
+ stateCache[friend.userId] = true
+ actionHandler.onFriendState(friend, true)
+ }
+ }
+ },
+ enabled = !allFriendsSelected
+ ) {
+ Text(
+ text = context.translation["manager.dialogs.messaging_action.select_all_button"]
+ ?: "Select All",
+ color = if (allFriendsSelected) {
+ Color.White.copy(alpha = 0.45f)
+ } else {
+ PurrfectPalette.glowSecondary
+ }
+ )
+ }
+ TextButton(
+ onClick = {
+ coroutineScope.launch(Dispatchers.IO) {
+ filteredFriends.forEach { friend ->
+ stateCache[friend.userId] = false
+ actionHandler.onFriendState(friend, false)
+ }
+ }
+ },
+ enabled = hasFriendsSelected
+ ) {
+ Text(
+ text = translation["unselect_all_button"],
+ color = if (hasFriendsSelected) {
+ PurrfectPalette.glowPrimary
+ } else {
+ Color.White.copy(alpha = 0.45f)
+ }
+ )
+ }
+ }
+ }
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/ManageScope.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/ManageScope.kt
index 54874fa0..ff8bc62b 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/ManageScope.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/ManageScope.kt
@@ -4,18 +4,23 @@ import android.content.Intent
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.rounded.DeleteForever
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.font.FontWeight
@@ -46,6 +51,7 @@ import me.eternal.purrfectsnap.ui.util.AlertDialogs
import me.eternal.purrfectsnap.ui.util.Dialog
import me.eternal.purrfectsnap.ui.util.purrfectSwitchColors
import me.eternal.purrfectsnap.ui.util.coil.BitmojiImage
+import me.eternal.purrfectsnap.ui.util.scaleOnPress
import kotlin.io.encoding.Base64
import kotlin.io.encoding.ExperimentalEncodingApi
@@ -72,7 +78,7 @@ class ManageScope: Routes.Route() {
var deleteConfirmDialog by remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
- val titleText by rememberAsyncMutableState(null, keys = arrayOf(id, scope)) {
+ val titleText by rememberAsyncMutableState(null, keys = arrayOf(id, scope)) {
when (scope) {
SocialScope.FRIEND -> context.database.getFriendInfo(id)?.displayName
SocialScope.GROUP -> context.database.getGroupInfo(id)?.name
@@ -304,6 +310,61 @@ class ManageScope: Routes.Route() {
)
}
+ @Composable
+ private fun RowScope.E2eeActionButton(
+ label: String,
+ icon: ImageVector,
+ accent: Brush,
+ onClick: () -> Unit
+ ) {
+ val interactionSource = remember { MutableInteractionSource() }
+ Surface(
+ modifier = Modifier
+ .weight(1f)
+ .scaleOnPress(interactionSource)
+ .clip(RoundedCornerShape(16.dp))
+ .clickable(
+ interactionSource = interactionSource,
+ indication = null
+ ) { onClick() },
+ shape = RoundedCornerShape(16.dp),
+ color = Color.White.copy(alpha = 0.06f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.18f)),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 12.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Box(
+ modifier = Modifier
+ .size(30.dp)
+ .background(accent, RoundedCornerShape(10.dp)),
+ contentAlignment = Alignment.Center
+ ) {
+ Icon(
+ imageVector = icon,
+ contentDescription = null,
+ tint = Color.White,
+ modifier = Modifier.size(16.dp)
+ )
+ }
+ Text(
+ text = label,
+ color = Color.White,
+ fontSize = 13.sp,
+ fontWeight = FontWeight.SemiBold,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+ }
+ }
+ }
+
private fun computeStreakETA(timestamp: Long): String? {
val now = System.currentTimeMillis()
val stringBuilder = StringBuilder()
@@ -344,7 +405,6 @@ class ManageScope: Routes.Route() {
Spacer(modifier = Modifier.height(16.dp))
if (context.config.root.experimental.e2eEncryption.globalState == true) {
- SectionTitle(translation["e2ee_title"])
var hasSecretKey by rememberAsyncMutableState(defaultValue = false) {
context.e2eeImplementation.friendKeyExists(friend.userId)
}
@@ -378,40 +438,100 @@ class ManageScope: Routes.Route() {
}
ContentCard {
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.spacedBy(10.dp)
+ Column(
+ verticalArrangement = Arrangement.spacedBy(14.dp)
) {
- if (hasSecretKey) {
- OutlinedButton(onClick = {
- context.coroutineScope.launch {
- val secretKey = Base64.encode(context.e2eeImplementation.getSharedSecretKey(friend.userId) ?: return@launch)
- //TODO: fingerprint auth
- context.activity!!.startActivity(Intent.createChooser(Intent().apply {
- action = Intent.ACTION_SEND
- putExtra(Intent.EXTRA_TEXT, secretKey)
- type = "text/plain"
- }, "").apply {
- putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(
- Intent().apply {
- putExtra(Intent.EXTRA_TEXT, secretKey)
- putExtra(Intent.EXTRA_SUBJECT, secretKey)
- })
- )
- })
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ Surface(
+ shape = RoundedCornerShape(14.dp),
+ color = Color.White.copy(alpha = 0.08f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.16f))
+ ) {
+ Box(
+ modifier = Modifier
+ .size(44.dp)
+ .background(
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.5f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.4f)
+ )
+ ),
+ RoundedCornerShape(14.dp)
+ ),
+ contentAlignment = Alignment.Center
+ ) {
+ Icon(
+ imageVector = Icons.Filled.Lock,
+ contentDescription = null,
+ tint = Color.White
+ )
}
- }) {
+ }
+ Column(
+ verticalArrangement = Arrangement.spacedBy(4.dp),
+ modifier = Modifier.weight(1f)
+ ) {
Text(
- text = translation["export_base64_button"],
- maxLines = 1
+ text = translation["e2ee_title"],
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ fontSize = 16.sp
+ )
+ Text(
+ text = translation["e2ee_subtitle"],
+ color = PurrfectPalette.textSecondary,
+ fontSize = 12.sp
)
}
}
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ if (hasSecretKey) {
+ E2eeActionButton(
+ label = translation["export_base64_button"],
+ icon = Icons.Filled.Lock,
+ accent = Brush.horizontalGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.6f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.55f)
+ )
+ ),
+ onClick = {
+ context.coroutineScope.launch {
+ val secretKey = Base64.encode(context.e2eeImplementation.getSharedSecretKey(friend.userId) ?: return@launch)
+ //TODO: fingerprint auth
+ context.activity!!.startActivity(Intent.createChooser(Intent().apply {
+ action = Intent.ACTION_SEND
+ putExtra(Intent.EXTRA_TEXT, secretKey)
+ type = "text/plain"
+ }, "").apply {
+ putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(
+ Intent().apply {
+ putExtra(Intent.EXTRA_TEXT, secretKey)
+ putExtra(Intent.EXTRA_SUBJECT, secretKey)
+ })
+ )
+ })
+ }
+ }
+ )
+ }
- OutlinedButton(onClick = { importDialog = true }) {
- Text(
- text = translation["import_base64_button"],
- maxLines = 1
+ E2eeActionButton(
+ label = translation["import_base64_button"],
+ icon = Icons.Filled.Lock,
+ accent = Brush.horizontalGradient(
+ listOf(
+ Color(0xFF7DD3FC),
+ Color(0xFF818CF8)
+ )
+ ),
+ onClick = { importDialog = true }
)
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/SocialRootSection.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/SocialRootSection.kt
index ac28c28f..08f6685e 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/SocialRootSection.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/social/SocialRootSection.kt
@@ -10,18 +10,23 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Groups
import androidx.compose.material.icons.filled.People
import androidx.compose.material.icons.filled.RemoveRedEye
+import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material3.*
import androidx.compose.runtime.*
+import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.font.FontWeight
@@ -54,8 +59,16 @@ class SocialRootSection : Routes.Route() {
}
@Composable
- private fun ScopeList(scope: SocialScope) {
+ private fun ScopeList(
+ scope: SocialScope,
+ friends: List,
+ groups: List
+ ) {
val remainingHours = remember { context.config.root.streaksReminder.remainingHours.get() }
+ val list = when (scope) {
+ SocialScope.GROUP -> groups
+ SocialScope.FRIEND -> friends
+ }
LazyColumn(
modifier = Modifier
@@ -64,10 +77,7 @@ class SocialRootSection : Routes.Route() {
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
//check if scope list is empty
- val listSize = when (scope) {
- SocialScope.GROUP -> groupList.size
- SocialScope.FRIEND -> friendList.size
- }
+ val listSize = list.size
if (listSize == 0) {
item {
@@ -76,14 +86,14 @@ class SocialRootSection : Routes.Route() {
}
items(listSize) { index ->
- val id = when (scope) {
- SocialScope.GROUP -> groupList[index].conversationId
- SocialScope.FRIEND -> friendList[index].userId
- }
+ val friend = if (scope == SocialScope.FRIEND) list[index] as MessagingFriendInfo else null
+ val group = if (scope == SocialScope.GROUP) list[index] as MessagingGroupInfo else null
+ val id = friend?.userId ?: group?.conversationId.orEmpty()
SocialCard(
scope = scope,
- index = index,
+ friend = friend,
+ group = group,
onManage = {
routes.manageScope.navigate {
put("id", id)
@@ -182,10 +192,30 @@ class SocialRootSection : Routes.Route() {
}
val coroutineScope = rememberCoroutineScope()
val pagerState = rememberPagerState { titles.size }
+ var searchQuery by rememberSaveable { mutableStateOf("") }
+ var searchActive by rememberSaveable { mutableStateOf(false) }
LaunchedEffect(Unit) {
updateScopeLists()
}
+ val normalizedQuery = remember(searchQuery) { searchQuery.trim() }
+ val filteredFriends = remember(friendList, normalizedQuery) {
+ if (normalizedQuery.isBlank()) {
+ friendList
+ } else {
+ friendList.filter {
+ it.mutableUsername.contains(normalizedQuery, ignoreCase = true) ||
+ it.displayName?.contains(normalizedQuery, ignoreCase = true) == true
+ }
+ }
+ }
+ val filteredGroups = remember(groupList, normalizedQuery) {
+ if (normalizedQuery.isBlank()) {
+ groupList
+ } else {
+ groupList.filter { it.name.contains(normalizedQuery, ignoreCase = true) }
+ }
+ }
Column(
modifier = Modifier
@@ -199,8 +229,78 @@ class SocialRootSection : Routes.Route() {
coroutineScope.launch { pagerState.animateScrollToPage(index) }
},
friendCount = friendList.size,
- groupCount = groupList.size
+ groupCount = groupList.size,
+ searchActive = searchActive,
+ onSearchToggle = {
+ searchActive = !searchActive
+ if (!searchActive) searchQuery = ""
+ }
)
+ if (searchActive) {
+ val searchHint = context.translation["manager.dialogs.add_friend.search_hint"] ?: "Search"
+ val searchShape = RoundedCornerShape(18.dp)
+ val searchBorder = Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.45f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.35f)
+ )
+ )
+ Surface(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 6.dp),
+ shape = searchShape,
+ color = Color.White.copy(alpha = 0.05f),
+ border = BorderStroke(1.dp, searchBorder),
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(PurrfectPalette.cardOverlay, searchShape)
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Filled.Search,
+ contentDescription = searchHint,
+ tint = PurrfectPalette.textSecondary
+ )
+ BasicTextField(
+ value = searchQuery,
+ onValueChange = { searchQuery = it },
+ singleLine = true,
+ textStyle = MaterialTheme.typography.bodyMedium.copy(
+ color = Color.White,
+ fontSize = 15.sp
+ ),
+ cursorBrush = SolidColor(PurrfectPalette.glowSecondary),
+ modifier = Modifier.weight(1f)
+ ) { innerTextField ->
+ if (searchQuery.isEmpty()) {
+ Text(
+ text = searchHint,
+ color = PurrfectPalette.textSecondary,
+ fontSize = 14.sp
+ )
+ }
+ innerTextField()
+ }
+ if (searchQuery.isNotEmpty()) {
+ IconButton(onClick = { searchQuery = "" }) {
+ Icon(
+ imageVector = Icons.Filled.Close,
+ contentDescription = context.translation["close_button_description"]
+ ?: "Clear search",
+ tint = Color.White
+ )
+ }
+ }
+ }
+ }
+ }
Spacer(Modifier.height(12.dp))
HorizontalPager(
modifier = Modifier
@@ -208,8 +308,8 @@ class SocialRootSection : Routes.Route() {
state = pagerState
) { page ->
when (page) {
- 0 -> ScopeList(SocialScope.FRIEND)
- 1 -> ScopeList(SocialScope.GROUP)
+ 0 -> ScopeList(SocialScope.FRIEND, filteredFriends, filteredGroups)
+ 1 -> ScopeList(SocialScope.GROUP, filteredFriends, filteredGroups)
}
}
}
@@ -218,7 +318,8 @@ class SocialRootSection : Routes.Route() {
@Composable
private fun SocialCard(
scope: SocialScope,
- index: Int,
+ friend: MessagingFriendInfo?,
+ group: MessagingGroupInfo?,
onManage: () -> Unit,
onPreview: () -> Unit,
remainingHours: Int
@@ -249,7 +350,7 @@ class SocialRootSection : Routes.Route() {
) {
when (scope) {
SocialScope.GROUP -> {
- val group = groupList[index]
+ val groupInfo = group ?: return@Row
Surface(
shape = RoundedCornerShape(12.dp),
color = Color.White.copy(alpha = 0.08f),
@@ -267,7 +368,7 @@ class SocialRootSection : Routes.Route() {
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
Text(
- text = group.name,
+ text = groupInfo.name,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
fontWeight = FontWeight.SemiBold,
@@ -283,16 +384,16 @@ class SocialRootSection : Routes.Route() {
}
SocialScope.FRIEND -> {
- val friend = friendList[index]
- val streaks by rememberAsyncMutableState(defaultValue = friend.streaks) {
- context.database.getFriendStreaks(friend.userId)
+ val friendInfo = friend ?: return@Row
+ val streaks by rememberAsyncMutableState(defaultValue = friendInfo.streaks) {
+ context.database.getFriendStreaks(friendInfo.userId)
}
BitmojiImage(
context = context,
url = BitmojiSelfie.getBitmojiSelfie(
- friend.selfieId,
- friend.bitmojiId,
+ friendInfo.selfieId,
+ friendInfo.bitmojiId,
BitmojiSelfie.BitmojiSelfieType.NEW_THREE_D
)
)
@@ -302,7 +403,7 @@ class SocialRootSection : Routes.Route() {
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
Text(
- text = friend.displayName ?: friend.mutableUsername,
+ text = friendInfo.displayName ?: friendInfo.mutableUsername,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
fontWeight = FontWeight.SemiBold,
@@ -310,7 +411,7 @@ class SocialRootSection : Routes.Route() {
fontSize = 15.sp
)
Text(
- text = friend.mutableUsername,
+ text = friendInfo.mutableUsername,
maxLines = 1,
fontSize = 12.sp,
fontWeight = FontWeight.Light,
@@ -383,7 +484,9 @@ class SocialRootSection : Routes.Route() {
pagerState: androidx.compose.foundation.pager.PagerState,
onTabSelected: (Int) -> Unit,
friendCount: Int,
- groupCount: Int
+ groupCount: Int,
+ searchActive: Boolean,
+ onSearchToggle: () -> Unit
) {
Surface(
modifier = Modifier
@@ -431,6 +534,13 @@ class SocialRootSection : Routes.Route() {
) {
StatPill(label = "Friends", value = friendCount)
StatPill(label = "Groups", value = groupCount)
+ IconButton(onClick = onSearchToggle) {
+ Icon(
+ imageVector = if (searchActive) Icons.Filled.Close else Icons.Filled.Search,
+ contentDescription = if (searchActive) "Close search" else "Search",
+ tint = Color.White
+ )
+ }
}
}
SocialTabSwitcher(
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/EditRule.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/EditRule.kt
index ecdafe12..22f3a6be 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/EditRule.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/EditRule.kt
@@ -54,6 +54,14 @@ import me.eternal.purrfectsnap.ui.manager.pages.social.AddFriendDialog
class EditRule : Routes.Route() {
override val translation by lazy { context.translation.getCategory("manager.friend_tracker") }
+ private data class RuleSnapshot(
+ val name: String,
+ val author: String,
+ val scopes: List,
+ val events: List,
+ val scopeType: TrackerScopeType
+ )
+
@Composable
private fun RuleCard(
modifier: Modifier = Modifier,
@@ -174,11 +182,11 @@ class EditRule : Routes.Route() {
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth()
)
- ExposedDropdownMenuBox(
- expanded = expanded.value,
- onExpandedChange = { expanded.value = !expanded.value },
- modifier = Modifier.fillMaxWidth()
- ) {
+ ExposedDropdownMenuBox(
+ expanded = expanded.value,
+ onExpandedChange = { expanded.value = !expanded.value },
+ modifier = Modifier.fillMaxWidth()
+ ) {
val eventLabel = context.translation["tracker_events.${currentEventType.value}"]
Box(
modifier = Modifier.fillMaxWidth(),
@@ -186,8 +194,8 @@ class EditRule : Routes.Route() {
) {
OutlinedTextField(
modifier = Modifier
- .menuAnchor()
- .widthIn(min = 240.dp),
+ .menuAnchor(MenuAnchorType.PrimaryNotEditable)
+ .wrapContentWidth(),
value = eventLabel,
onValueChange = {},
readOnly = true,
@@ -207,7 +215,7 @@ class EditRule : Routes.Route() {
ExposedDropdownMenu(
expanded = expanded.value,
onDismissRequest = { expanded.value = false },
- modifier = Modifier.widthIn(min = 240.dp),
+ modifier = Modifier.wrapContentWidth(),
containerColor = Color(0xFF121528),
shape = RoundedCornerShape(14.dp)
) {
@@ -295,24 +303,45 @@ class EditRule : Routes.Route() {
val authorName = rememberAsyncMutableState(defaultValue = "", keys = arrayOf(currentRuleId)) {
currentRuleId?.let { ruleId -> context.database.getTrackerRule(ruleId)?.author ?: "" } ?: ""
}
- val initialRuleState by remember(ruleName.value.isNotBlank() || events.isNotEmpty() || scopes.isNotEmpty()) {
- mutableStateOf(
- mapOf(
- "name" to ruleName.value,
- "author" to authorName.value,
- "scopes" to scopes.toList(),
- "events" to events.toList(),
- "scopeType" to currentScopeType
- )
- )
+ fun snapshotEvents() = events.map { event ->
+ event.copy(params = event.params.copy(), actions = event.actions.toList())
+ }
+ fun buildSnapshot() = RuleSnapshot(
+ name = ruleName.value,
+ author = authorName.value,
+ scopes = scopes.toList(),
+ events = snapshotEvents(),
+ scopeType = currentScopeType
+ )
+ val initialSnapshot = remember(currentRuleId) {
+ mutableStateOf(if (currentRuleId == null) buildSnapshot() else null)
+ }
+ LaunchedEffect(
+ currentRuleId,
+ ruleName.value,
+ authorName.value,
+ events.size,
+ scopes.size,
+ currentScopeType
+ ) {
+ if (initialSnapshot.value == null) {
+ val hasLoaded = ruleName.value.isNotBlank() ||
+ authorName.value.isNotBlank() ||
+ events.isNotEmpty() ||
+ scopes.isNotEmpty()
+ if (hasLoaded) {
+ initialSnapshot.value = buildSnapshot()
+ }
+ }
}
val isDirty by remember {
derivedStateOf {
- initialRuleState["name"] != ruleName.value ||
- initialRuleState["author"] != authorName.value ||
- initialRuleState["scopes"] != scopes.toList() ||
- initialRuleState["events"] != events.toList() ||
- initialRuleState["scopeType"] != currentScopeType
+ val snapshot = initialSnapshot.value ?: return@derivedStateOf false
+ snapshot.name != ruleName.value ||
+ snapshot.author != authorName.value ||
+ snapshot.scopes != scopes.toList() ||
+ snapshot.events != snapshotEvents() ||
+ snapshot.scopeType != currentScopeType
}
}
var deleteConfirmation by remember { mutableStateOf(false) }
@@ -426,6 +455,12 @@ class EditRule : Routes.Route() {
fontSize = 12.sp
)
}
+ if (currentRuleId != null) {
+ IconButton(onClick = { deleteConfirmation = true }) {
+ Icon(Icons.Default.DeleteOutline, contentDescription = translation["delete_button_description"], tint = Color.White)
+ }
+ Spacer(modifier = Modifier.width(6.dp))
+ }
IconButton(onClick = {
if (events.isEmpty()) {
showEventsEmptyDialog = true
@@ -451,11 +486,6 @@ class EditRule : Routes.Route() {
context.database.setRuleTrackerScopes(ruleId, currentScopeType, scopes)
routes.navController.popBackStack()
}) { Icon(Icons.Filled.Save, contentDescription = translation["save_button_description"], tint = Color.White) }
- if (currentRuleId != null) {
- IconButton(onClick = { deleteConfirmation = true }) {
- Icon(Icons.Default.DeleteOutline, contentDescription = translation["delete_button_description"], tint = Color.White)
- }
- }
}
}
}
@@ -466,9 +496,11 @@ class EditRule : Routes.Route() {
.background(PurrfectPalette.backgroundGradient)
.padding(padding)
) {
+ val contentBottomPadding = routes.bottomPadding + 12.dp
Column(
modifier = Modifier
.fillMaxSize()
+ .padding(bottom = contentBottomPadding)
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
@@ -477,6 +509,7 @@ class EditRule : Routes.Route() {
.fillMaxWidth()
.padding(horizontal = 12.dp, vertical = 4.dp)
) {
+ val textFieldShape = RoundedCornerShape(16.dp)
Text(
translation["general_section_title"],
style = MaterialTheme.typography.titleMedium,
@@ -488,8 +521,11 @@ class EditRule : Routes.Route() {
value = ruleName.value,
onValueChange = { ruleName.value = it },
label = { Text(translation["rule_name_label"], color = PurrfectPalette.textSecondary) },
- modifier = Modifier.fillMaxWidth(),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 2.dp),
singleLine = true,
+ shape = textFieldShape,
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.White.copy(alpha = 0.05f),
unfocusedContainerColor = Color.White.copy(alpha = 0.04f),
@@ -506,8 +542,11 @@ class EditRule : Routes.Route() {
value = authorName.value,
onValueChange = { authorName.value = it },
label = { Text(translation["author_name_label"], color = PurrfectPalette.textSecondary) },
- modifier = Modifier.fillMaxWidth(),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 2.dp),
singleLine = true,
+ shape = textFieldShape,
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.White.copy(alpha = 0.05f),
unfocusedContainerColor = Color.White.copy(alpha = 0.04f),
@@ -640,12 +679,21 @@ class EditRule : Routes.Route() {
shape = selectorShape,
color = Color.Transparent,
tonalElevation = 0.dp,
- shadowElevation = 10.dp,
- border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f))
+ shadowElevation = 0.dp,
+ border = BorderStroke(
+ 1.dp,
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.45f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.38f)
+ )
+ )
+ )
) {
Row(
modifier = Modifier
- .background(selectorBrush, selectorShape)
+ .clip(selectorShape)
+ .background(selectorBrush)
.padding(horizontal = 16.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
@@ -773,7 +821,6 @@ class EditRule : Routes.Route() {
}
}
}
- Spacer(Modifier.height(routes.bottomPadding))
}
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/LogsTab.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/LogsTab.kt
index 95c5e075..8bbdc23d 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/LogsTab.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/LogsTab.kt
@@ -11,26 +11,24 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Clear
+import androidx.compose.material.icons.filled.DateRange
import androidx.compose.material.icons.filled.DeleteOutline
import androidx.compose.material.icons.filled.FolderOpen
import androidx.compose.material.icons.filled.History
import androidx.compose.material.icons.filled.FilterList
import androidx.compose.material.icons.filled.SaveAlt
-import androidx.compose.ui.unit.DpOffset
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.text.TextStyle
import androidx.compose.material3.LocalTextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import androidx.compose.ui.window.Dialog
import java.util.Date
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.window.PopupProperties
@@ -328,36 +326,50 @@ fun LogsTab(
var dropDownExpanded by remember { mutableStateOf(false) }
var showDatePicker by remember { mutableStateOf(false) }
+ LaunchedEffect(selectionExpanded.value) {
+ if (!selectionExpanded.value) {
+ dropDownExpanded = false
+ }
+ }
+
+ LaunchedEffect(showDatePicker) {
+ if (showDatePicker) {
+ sinceDatePickerState.displayMode = DisplayMode.Picker
+ }
+ }
+
if (showDatePicker) {
- Dialog(onDismissRequest = { showDatePicker = false }) {
- val dialogShape = RoundedCornerShape(22.dp)
- Surface(
- shape = dialogShape,
- color = Color.Transparent,
- border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f)),
- shadowElevation = 16.dp
- ) {
- Column(
- modifier = Modifier
- .background(PurrfectPalette.cardOverlay, dialogShape)
- .padding(16.dp),
- verticalArrangement = Arrangement.spacedBy(12.dp),
- horizontalAlignment = Alignment.CenterHorizontally
+ AestheticDialog(
+ onDismissRequest = { showDatePicker = false },
+ title = "",
+ text = "",
+ icon = Icons.Default.DateRange,
+ confirmButtonText = context.translation["button.ok"],
+ onConfirm = { showDatePicker = false },
+ dismissButtonText = context.translation["button.cancel"],
+ onDismiss = {
+ showDatePicker = false
+ sinceDatePickerState.selectedDateMillis = null
+ },
+ customContent = {
+ Surface(
+ modifier = Modifier.padding(horizontal = 6.dp),
+ shape = RoundedCornerShape(18.dp),
+ color = PurrfectPalette.cardOverlayColor,
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f))
) {
- Text(
- translation["pick_a_date_button"],
- color = Color.White,
- fontWeight = FontWeight.ExtraBold,
- fontSize = 18.sp,
- textAlign = TextAlign.Center
- )
DatePicker(
state = sinceDatePickerState,
modifier = Modifier
.fillMaxWidth()
- .background(Color.White.copy(alpha = 0.02f), RoundedCornerShape(18.dp)),
+ .widthIn(max = 360.dp)
+ .padding(6.dp)
+ .background(PurrfectPalette.cardOverlayColor, RoundedCornerShape(14.dp)),
+ title = null,
+ headline = null,
+ showModeToggle = false,
colors = DatePickerDefaults.colors(
- containerColor = Color.Transparent,
+ containerColor = PurrfectPalette.cardOverlayColor,
titleContentColor = Color.White,
headlineContentColor = Color.White,
weekdayContentColor = Color.White.copy(alpha = 0.9f),
@@ -368,45 +380,35 @@ fun LogsTab(
todayDateBorderColor = PurrfectPalette.glowSecondary,
dayContentColor = Color.White.copy(alpha = 0.85f),
disabledDayContentColor = Color.White.copy(alpha = 0.35f),
+ yearContentColor = Color.White,
+ currentYearContentColor = PurrfectPalette.glowSecondary,
+ selectedYearContainerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.4f),
+ selectedYearContentColor = Color.Black,
dividerColor = Color.White.copy(alpha = 0.14f),
- navigationContentColor = Color.White
+ navigationContentColor = Color.White,
+ dateTextFieldColors = TextFieldDefaults.colors(
+ focusedTextColor = Color.White,
+ unfocusedTextColor = Color.White,
+ disabledTextColor = Color.White.copy(alpha = 0.6f),
+ focusedContainerColor = Color.White.copy(alpha = 0.08f),
+ unfocusedContainerColor = Color.White.copy(alpha = 0.06f),
+ disabledContainerColor = Color.White.copy(alpha = 0.04f),
+ focusedIndicatorColor = Color.Transparent,
+ unfocusedIndicatorColor = Color.Transparent,
+ disabledIndicatorColor = Color.Transparent,
+ cursorColor = PurrfectPalette.glowSecondary,
+ focusedLabelColor = PurrfectPalette.textSecondary,
+ unfocusedLabelColor = PurrfectPalette.textSecondary
+ )
)
)
- Row(
- modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.spacedBy(10.dp, Alignment.End)
- ) {
- Surface(
- onClick = {
- showDatePicker = false
- sinceDatePickerState.selectedDateMillis = null
- },
- shape = RoundedCornerShape(14.dp),
- color = Color.White.copy(alpha = 0.08f),
- border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f))
- ) {
- Text(
- context.translation["button.cancel"],
- color = Color.White,
- modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp)
- )
- }
- Surface(
- onClick = { showDatePicker = false },
- shape = RoundedCornerShape(14.dp),
- color = PurrfectPalette.glowPrimary.copy(alpha = 0.32f),
- border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f))
- ) {
- Text(
- context.translation["button.ok"],
- color = Color.White,
- modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp)
- )
- }
- }
}
- }
- }
+ },
+ opaque = true,
+ showCloseButton = false,
+ showIcon = false,
+ showTitle = false
+ )
}
DropdownMenu(
@@ -443,27 +445,33 @@ fun LogsTab(
ExposedDropdownMenuBox(
expanded = dropDownExpanded,
onExpandedChange = { dropDownExpanded = it },
- modifier = Modifier.weight(1f)
+ modifier = Modifier.wrapContentWidth()
) {
Surface(
+ onClick = { dropDownExpanded = true },
modifier = Modifier
- .menuAnchor()
- .fillMaxWidth()
+ .menuAnchor(MenuAnchorType.PrimaryNotEditable)
.border(1.dp, Color.White.copy(alpha = 0.2f), RoundedCornerShape(12.dp)),
shape = RoundedCornerShape(12.dp),
- color = Color.White.copy(alpha = 0.06f)
+ color = Color.White.copy(alpha = 0.06f),
+ tonalElevation = 0.dp
) {
- Text(
- filterType.name,
- modifier = Modifier.padding(horizontal = 10.dp, vertical = 8.dp),
- color = Color.White
- )
+ Row(
+ modifier = Modifier
+ .padding(horizontal = 10.dp, vertical = 8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Text(filterType.name, color = Color.White)
+ ExposedDropdownMenuDefaults.TrailingIcon(expanded = dropDownExpanded)
+ }
}
ExposedDropdownMenu(
expanded = dropDownExpanded,
onDismissRequest = { dropDownExpanded = false },
containerColor = Color(0xFF101220),
- shape = RoundedCornerShape(14.dp)
+ shape = RoundedCornerShape(14.dp),
+ modifier = Modifier.wrapContentWidth()
) {
FriendTrackerManagerRoot.FilterType.entries.forEach { type ->
DropdownMenuItem(
@@ -489,7 +497,6 @@ fun LogsTab(
checked = reverseSortOrder,
onCheckedChange = {
reverseSortOrder = it
- selectionExpanded.value = false
},
colors = purrfectSwitchColors()
)
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/ManageFriendTrackerReposSection.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/ManageFriendTrackerReposSection.kt
index 7ea8833e..4b63380a 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/ManageFriendTrackerReposSection.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/manager/pages/tracker/ManageFriendTrackerReposSection.kt
@@ -29,6 +29,7 @@ import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExtendedFloatingActionButton
+import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -99,7 +100,14 @@ class ManageFriendTrackerReposSection: Routes.Route() {
ExtendedFloatingActionButton(
onClick = { showAddDialog = true },
containerColor = PurrfectPalette.glowPrimary.copy(alpha = 0.34f),
- contentColor = Color.White
+ contentColor = Color.White,
+ shape = RoundedCornerShape(18.dp),
+ elevation = FloatingActionButtonDefaults.elevation(
+ defaultElevation = 0.dp,
+ pressedElevation = 0.dp,
+ focusedElevation = 0.dp,
+ hoveredElevation = 0.dp
+ )
) {
Icon(Icons.Default.Public, contentDescription = null, tint = Color.White)
Spacer(modifier = Modifier.width(8.dp))
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/SetupActivity.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/SetupActivity.kt
index cb4107ac..ad62ca41 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/SetupActivity.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/SetupActivity.kt
@@ -56,12 +56,14 @@ import androidx.compose.material.icons.filled.Flag
import androidx.compose.material.icons.filled.Folder
import androidx.compose.material.icons.filled.Language
import androidx.compose.material.icons.filled.VerifiedUser
+import androidx.compose.material.icons.filled.Warning
import androidx.compose.material3.Icon
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -89,6 +91,7 @@ import androidx.navigation.compose.rememberNavController
import me.eternal.purrfectsnap.RemoteSideContext
import me.eternal.purrfectsnap.SharedContextHolder
import me.eternal.purrfectsnap.common.ui.AppMaterialTheme
+import me.eternal.purrfectsnap.ui.manager.components.AestheticDialog
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
import me.eternal.purrfectsnap.ui.setup.screens.SetupScreen
import me.eternal.purrfectsnap.ui.setup.screens.impl.InstallModeScreen
@@ -97,8 +100,10 @@ import me.eternal.purrfectsnap.ui.setup.screens.impl.MappingsScreen
import me.eternal.purrfectsnap.ui.setup.screens.impl.PermissionsScreen
import me.eternal.purrfectsnap.ui.setup.screens.impl.PickLanguageScreen
import me.eternal.purrfectsnap.ui.setup.screens.impl.PatchSnapchatScreen
+import me.eternal.purrfectsnap.ui.setup.screens.impl.RootInstallSnapchatScreen
import me.eternal.purrfectsnap.ui.setup.screens.impl.SaveFolderScreen
import me.eternal.purrfectsnap.ui.util.scaleOnPress
+import kotlinx.coroutines.delay
private data class SetupStepMeta(
val route: String,
@@ -125,14 +130,19 @@ class SetupActivity : ComponentActivity() {
val isFirstRunFlow = hasRequirement(Requirements.FIRST_RUN) || wasInProgress
val persistedRoute = setupPrefs.getString("setup_current_route", null)
val persistedSkipPatch = setupPrefs.getBoolean("setup_skip_patch", false)
+ val persistedInstallMode = setupPrefs.getString("setup_install_mode", null)
val skipPatchChoice = mutableStateOf(persistedSkipPatch)
+ val installModeChoice = mutableStateOf(
+ runCatching { persistedInstallMode?.let { InstallMode.valueOf(it) } }.getOrNull()
+ )
- fun persistProgress(route: String, skipPatch: Boolean, inProgress: Boolean = true) {
+ fun persistProgress(route: String, skipPatch: Boolean, installMode: InstallMode?, inProgress: Boolean = true) {
if (!isFirstRunFlow) return
setupPrefs.edit()
.putBoolean("setup_in_progress", inProgress)
.putString("setup_current_route", route)
.putBoolean("setup_skip_patch", skipPatch)
+ .putString("setup_install_mode", installMode?.name)
.apply()
}
@@ -141,6 +151,7 @@ class SetupActivity : ComponentActivity() {
.remove("setup_in_progress")
.remove("setup_current_route")
.remove("setup_skip_patch")
+ .remove("setup_install_mode")
.apply()
}
@@ -148,11 +159,19 @@ class SetupActivity : ComponentActivity() {
if (isFirstRunFlow || hasRequirement(Requirements.LANGUAGE)) {
add(PickLanguageScreen().apply { route = "language" })
if (isFirstRunFlow) {
- add(InstallModeScreen { mode ->
- skipPatchChoice.value = mode == InstallMode.ROOT
- }.apply { route = "installMode" })
+ add(InstallModeScreen(
+ onModeChosen = { mode ->
+ installModeChoice.value = mode
+ skipPatchChoice.value = false
+ },
+ onSkipAutoSetup = {
+ skipPatchChoice.value = true
+ installModeChoice.value = null
+ }
+ ).apply { route = "installMode" })
}
if (isFirstRunFlow) {
+ add(RootInstallSnapchatScreen().apply { route = "rootInstallSnapchat" })
add(PatchSnapchatScreen().apply { route = "patchSnapchat" })
}
}
@@ -173,31 +192,46 @@ class SetupActivity : ComponentActivity() {
}
requiredScreens.forEach { screen ->
screen.context = setupContext
+ screen.isFirstRunFlow = isFirstRunFlow
screen.init()
}
- if (!isFirstRunFlow) {
- clearProgress()
- skipPatchChoice.value = false
- }
+ if (!isFirstRunFlow) {
+ clearProgress()
+ skipPatchChoice.value = false
+ installModeChoice.value = null
+ }
setContent {
val navController = rememberNavController()
var canGoNext by remember { mutableStateOf(false) }
+ var lastRoute by rememberSaveable { mutableStateOf("") }
var currentRoute by rememberSaveable {
mutableStateOf(
- when {
- requiredScreens.first().route == "language" -> requiredScreens.first().route
- persistedRoute?.takeIf { route -> requiredScreens.any { it.route == route } } != null -> persistedRoute
- else -> requiredScreens.first().route
- }
+ persistedRoute?.takeIf { route -> requiredScreens.any { it.route == route } }
+ ?: requiredScreens.first().route
)
}
val skipPatch by rememberSaveable { skipPatchChoice }
- val visibleScreens = remember(skipPatch) {
- requiredScreens.filterNot { skipPatch && it is PatchSnapchatScreen }
+ val installMode by installModeChoice
+ val visibleScreens = remember(skipPatch, installMode) {
+ requiredScreens.filterNot { screen ->
+ if (skipPatch && (screen is PatchSnapchatScreen || screen is RootInstallSnapchatScreen)) {
+ return@filterNot true
+ }
+ if (installMode == null && (screen is PatchSnapchatScreen || screen is RootInstallSnapchatScreen)) {
+ return@filterNot true
+ }
+ if (installMode == InstallMode.ROOT && screen is PatchSnapchatScreen) {
+ return@filterNot true
+ }
+ if (installMode == InstallMode.NON_ROOT && screen is RootInstallSnapchatScreen) {
+ return@filterNot true
+ }
+ false
+ }
}
- val stepMeta = remember(skipPatch) { visibleScreens.map { it.meta(setupContext) } }
+ val stepMeta = remember(skipPatch, installMode) { visibleScreens.map { it.meta(setupContext) } }
val currentStepIndex = visibleScreens.indexOfFirst { it.route == currentRoute }.let {
if (it == -1) 0 else it
}
@@ -218,15 +252,18 @@ class SetupActivity : ComponentActivity() {
}
}
- LaunchedEffect(currentRoute, skipPatch) {
- persistProgress(currentRoute, skipPatch, true)
+ LaunchedEffect(currentRoute, skipPatch, installMode) {
+ persistProgress(currentRoute, skipPatch, installMode, true)
if (navController.currentDestination?.route != currentRoute) {
navController.navigate(currentRoute) {
popUpTo(requiredScreens.first().route) { inclusive = false }
launchSingleTop = true
}
}
- canGoNext = false
+ if (lastRoute != currentRoute) {
+ canGoNext = false
+ lastRoute = currentRoute
+ }
}
fun nextScreen() {
@@ -249,10 +286,25 @@ class SetupActivity : ComponentActivity() {
AppMaterialTheme {
val view = LocalView.current
val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()
+ var showImportantDialog by rememberSaveable {
+ mutableStateOf(!setupPrefs.getBoolean("setup_important_notice_shown", false))
+ }
+ var importantTimeout by remember { mutableIntStateOf(5) }
+ LaunchedEffect(showImportantDialog) {
+ if (showImportantDialog) {
+ importantTimeout = 5
+ while (importantTimeout > 0) {
+ delay(1000)
+ importantTimeout--
+ }
+ }
+ }
SideEffect {
val window = (view.context as Activity).window
WindowCompat.setDecorFitsSystemWindows(window, false)
+ @Suppress("DEPRECATION")
window.statusBarColor = Color.Transparent.toArgb()
+ @Suppress("DEPRECATION")
window.navigationBarColor = Color.Transparent.toArgb()
val insetsController = WindowInsetsControllerCompat(window, window.decorView)
insetsController.isAppearanceLightStatusBars = false
@@ -263,6 +315,37 @@ class SetupActivity : ComponentActivity() {
.fillMaxSize()
.background(Color.Transparent)
) {
+ if (showImportantDialog) {
+ val confirmLabel = if (importantTimeout > 0) "I understand (${importantTimeout}s)" else "I understand"
+ AestheticDialog(
+ onDismissRequest = {
+ if (importantTimeout == 0) {
+ showImportantDialog = false
+ setupPrefs.edit().putBoolean("setup_important_notice_shown", true).apply()
+ }
+ },
+ title = "Important!",
+ text = "",
+ icon = Icons.Filled.Warning,
+ confirmButtonText = confirmLabel,
+ onConfirm = {
+ if (importantTimeout == 0) {
+ showImportantDialog = false
+ setupPrefs.edit().putBoolean("setup_important_notice_shown", true).apply()
+ }
+ },
+ confirmEnabled = importantTimeout == 0,
+ showCloseButton = false,
+ customContent = {
+ Text(
+ text = "If you have used SnapEnhance or any other mod besides PurrfectSnap, we recommend uninstalling everything and staying on stock Snapchat for one week. Then switch to PurrfectSnap after next Friday.",
+ color = PurrfectPalette.textSecondary,
+ lineHeight = 18.sp
+ )
+ },
+ opaque = true
+ )
+ }
SetupAuroraBackground()
SetupTopBar()
val bottomPadding = 118.dp + navBarPadding
@@ -386,6 +469,13 @@ private fun SetupScreen.meta(context: RemoteSideContext): SetupStepMeta {
icon = Icons.Filled.Download
)
+ is RootInstallSnapchatScreen -> SetupStepMeta(
+ route = route,
+ title = "Snapchat Installer",
+ subtitle = "Download and install the recommended Snapchat build.",
+ icon = Icons.Filled.Download
+ )
+
is SaveFolderScreen -> SetupStepMeta(
route = route,
title = translation["setup.dialogs.save_folder"] ?: "Where should we save?",
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/SetupScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/SetupScreen.kt
index 099ea286..9a6244da 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/SetupScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/SetupScreen.kt
@@ -28,6 +28,7 @@ abstract class SetupScreen {
lateinit var allowNext: (canGoNext: Boolean) -> Unit
lateinit var goNext: () -> Unit
lateinit var route: String
+ var isFirstRunFlow: Boolean = false
@Composable
fun DialogText(text: String, modifier: Modifier = Modifier) {
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/InstallModeScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/InstallModeScreen.kt
index 43860eb8..ed58b7a6 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/InstallModeScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/InstallModeScreen.kt
@@ -9,19 +9,26 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.ArrowForwardIos
import androidx.compose.material.icons.filled.Shield
import androidx.compose.material.icons.filled.VerifiedUser
+import androidx.compose.material.icons.filled.Warning
import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@@ -32,9 +39,16 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.buildAnnotatedString
+import androidx.compose.ui.text.withStyle
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.interaction.MutableInteractionSource
+import kotlinx.coroutines.delay
+import me.eternal.purrfectsnap.ui.manager.components.AestheticDialog
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
import me.eternal.purrfectsnap.ui.setup.screens.SetupScreen
import me.eternal.purrfectsnap.ui.util.scaleOnPress
@@ -42,25 +56,140 @@ import me.eternal.purrfectsnap.ui.util.scaleOnPress
enum class InstallMode { ROOT, NON_ROOT }
class InstallModeScreen(
- private val onModeChosen: (InstallMode) -> Unit
+ private val onModeChosen: (InstallMode) -> Unit,
+ private val onSkipAutoSetup: () -> Unit
) : SetupScreen() {
private var selectedMode: InstallMode? = null
+ private var skipAutoSetup = false
override fun init() {
selectedMode = null
+ skipAutoSetup = false
}
override fun onLeave() {
- selectedMode?.let(onModeChosen)
+ if (skipAutoSetup) return
}
@Composable
override fun Content() {
var choice by remember { mutableStateOf(selectedMode) }
+ var skipSelected by remember { mutableStateOf(skipAutoSetup) }
+ var showGuides by remember { mutableStateOf(true) }
+ var timeout by remember { mutableIntStateOf(15) }
- LaunchedEffect(choice) {
+ LaunchedEffect(choice, skipSelected) {
selectedMode = choice
- allowNext(choice != null)
+ skipAutoSetup = skipSelected
+ allowNext(choice != null || skipSelected)
+ if (!skipSelected) {
+ choice?.let(onModeChosen)
+ }
+ }
+
+ LaunchedEffect(showGuides) {
+ if (showGuides) {
+ timeout = 15
+ while (timeout > 0) {
+ delay(1000)
+ timeout--
+ }
+ }
+ }
+
+ if (showGuides) {
+ val confirmLabel = if (timeout > 0) "I understand (${timeout}s)" else "I understand"
+ AestheticDialog(
+ onDismissRequest = { if (timeout == 0) showGuides = false },
+ title = "Please note!",
+ text = "",
+ icon = Icons.Filled.Warning,
+ confirmButtonText = confirmLabel,
+ onConfirm = { if (timeout == 0) showGuides = false },
+ confirmEnabled = timeout == 0,
+ showCloseButton = false,
+ customContent = {
+ val bodyStyle = MaterialTheme.typography.bodyMedium.copy(
+ color = PurrfectPalette.textSecondary,
+ lineHeight = 18.sp
+ )
+ Surface(
+ shape = RoundedCornerShape(14.dp),
+ color = PurrfectPalette.cardOverlayColor,
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp,
+ border = BorderStroke(
+ 1.dp,
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.55f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.35f)
+ )
+ )
+ )
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(max = 360.dp)
+ .verticalScroll(rememberScrollState())
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Text(
+ text = "Select the type of device you have: rooted or non-rooted. If you are unsure, choose Non-root and continue.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "Non-rooted devices",
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Start
+ )
+ Text(
+ text = "Select Non-root and the app will handle everything. Tap Install Patched Snapchat when it appears. After it installs, do not open Snapchat yet. Continue the PurrfectSnap setup; once it finishes, you can open Snapchat and enjoy.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "Rooted devices",
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Start
+ )
+ Text(
+ text = "Make sure you have flashed LSPosed first. We recommend JingMatrix LSPosed or LSPosed Irena. After you select Root, the app will install the recommended Snapchat version. Do not open it yet; continue the PurrfectSnap setup. When setup finishes, enable PurrfectSnap in LSPosed and reboot your phone. Then start using Snapchat. We highly recommend detaching Snapchat from the Play Store with the Zygisk Detach module to prevent auto-updates.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "If you run into any installation issues, the solution will appear here. Please read it carefully.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = buildAnnotatedString {
+ withStyle(SpanStyle(fontWeight = FontWeight.Bold, color = Color.White)) {
+ append("Note: ")
+ }
+ append("New Accounts easily get locked! It is recommended to use an older account with PurrfectSnap.")
+ },
+ style = bodyStyle,
+ textAlign = TextAlign.Start,
+ modifier = Modifier.fillMaxWidth()
+ )
+ }
+ }
+ }
+ )
}
SetupCard {
@@ -84,7 +213,10 @@ class InstallModeScreen(
)
),
selected = choice == InstallMode.ROOT,
- onClick = { choice = InstallMode.ROOT }
+ onClick = {
+ choice = InstallMode.ROOT
+ skipSelected = false
+ }
)
ModeOption(
title = "Non-rooted device",
@@ -97,9 +229,54 @@ class InstallModeScreen(
)
),
selected = choice == InstallMode.NON_ROOT,
- onClick = { choice = InstallMode.NON_ROOT }
+ onClick = {
+ choice = InstallMode.NON_ROOT
+ skipSelected = false
+ }
)
}
+ val interactionSource = remember { MutableInteractionSource() }
+ Surface(
+ modifier = Modifier
+ .fillMaxWidth()
+ .scaleOnPress(interactionSource)
+ .clip(RoundedCornerShape(16.dp))
+ .clickable(
+ interactionSource = interactionSource,
+ indication = null
+ ) {
+ skipSelected = true
+ choice = null
+ onSkipAutoSetup()
+ goNext()
+ },
+ color = Color.White.copy(alpha = 0.04f),
+ shape = RoundedCornerShape(16.dp),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.18f))
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween
+ ) {
+ Text(
+ text = "Skip Auto Setup",
+ fontSize = 14.sp,
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+ Icon(
+ imageVector = Icons.AutoMirrored.Filled.ArrowForwardIos,
+ contentDescription = null,
+ tint = PurrfectPalette.glowSecondary,
+ modifier = Modifier.size(16.dp)
+ )
+ }
+ }
}
}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/MappingsScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/MappingsScreen.kt
index f54d73db..e3215a25 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/MappingsScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/MappingsScreen.kt
@@ -11,13 +11,21 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Warning
import androidx.compose.material3.LinearProgressIndicator
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@@ -26,11 +34,15 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import me.eternal.purrfectsnap.ui.manager.components.AestheticDialog
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
import me.eternal.purrfectsnap.ui.setup.screens.SetupScreen
import me.eternal.purrfectsnap.ui.util.AlertDialogs
@@ -42,11 +54,21 @@ class MappingsScreen : SetupScreen() {
val coroutineScope = rememberCoroutineScope()
var infoText by remember { mutableStateOf(null as String?) }
var isGenerating by remember { mutableStateOf(false) }
+ var showCompletionNotice by remember { mutableStateOf(false) }
+ var completionCountdown by remember { mutableIntStateOf(10) }
+
+ fun finishMappings() {
+ if (isFirstRunFlow) {
+ showCompletionNotice = true
+ } else {
+ goNext()
+ }
+ }
if (infoText != null) {
fun dismiss() {
infoText = null
- goNext()
+ finishMappings()
}
var visible by remember { mutableStateOf(false) }
@@ -64,6 +86,100 @@ class MappingsScreen : SetupScreen() {
}
}
+ LaunchedEffect(showCompletionNotice) {
+ if (showCompletionNotice) {
+ completionCountdown = 10
+ while (completionCountdown > 0) {
+ delay(1000)
+ completionCountdown--
+ }
+ }
+ }
+
+ if (showCompletionNotice) {
+ val confirmLabel = if (completionCountdown > 0) {
+ "I understand (${completionCountdown}s)"
+ } else {
+ "I understand"
+ }
+ AestheticDialog(
+ onDismissRequest = { if (completionCountdown == 0) { showCompletionNotice = false; goNext() } },
+ title = "Please note!",
+ text = "",
+ icon = Icons.Filled.Warning,
+ confirmButtonText = confirmLabel,
+ onConfirm = { if (completionCountdown == 0) { showCompletionNotice = false; goNext() } },
+ confirmEnabled = completionCountdown == 0,
+ showCloseButton = false,
+ customContent = {
+ val bodyStyle = MaterialTheme.typography.bodyMedium.copy(
+ color = PurrfectPalette.textSecondary,
+ lineHeight = 18.sp
+ )
+ Surface(
+ shape = RoundedCornerShape(14.dp),
+ color = PurrfectPalette.cardOverlayColor,
+ tonalElevation = 0.dp,
+ shadowElevation = 0.dp,
+ border = BorderStroke(
+ 1.dp,
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.55f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.35f)
+ )
+ )
+ )
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(max = 360.dp)
+ .verticalScroll(rememberScrollState())
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Text(
+ text = "If you see the \"Account temporarily disabled\" error while logging in, do not worry. Follow these steps in order:",
+ style = bodyStyle,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "1. Reopen Snapchat and log in. This fixes it most of the time.",
+ style = bodyStyle,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "2. If it still fails, tap the login button repeatedly. This usually covers the next chunk.",
+ style = bodyStyle,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "3. If it still fails, clear Snapchat's data, disable any VPN, and log in again.",
+ style = bodyStyle,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "For rooted users:",
+ style = MaterialTheme.typography.bodyMedium.copy(
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold,
+ lineHeight = 18.sp
+ ),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "Reopen Snapchat and log in. If it still fails, disable PurrfectSnap in LSPosed, log in, then re-enable PurrfectSnap.",
+ style = bodyStyle,
+ modifier = Modifier.fillMaxWidth()
+ )
+ }
+ }
+ }
+ )
+ }
+
LaunchedEffect(Unit) {
coroutineScope.launch(Dispatchers.IO) {
if (isGenerating) return@launch
@@ -83,7 +199,7 @@ class MappingsScreen : SetupScreen() {
}
withContext(Dispatchers.Main) {
- goNext()
+ finishMappings()
}
}.onFailure {
isGenerating = false
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/PatchSnapchatScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/PatchSnapchatScreen.kt
index d20d496e..1899dfe9 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/PatchSnapchatScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/PatchSnapchatScreen.kt
@@ -12,6 +12,7 @@ import androidx.compose.animation.core.tween
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
+import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -19,12 +20,16 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CheckCircle
+import androidx.compose.material.icons.filled.ContentCopy
import androidx.compose.material.icons.filled.Download
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.ExpandMore
@@ -52,8 +57,10 @@ import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.FileProvider
@@ -66,6 +73,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import me.eternal.purrfectsnap.setup.patch.AutoPatchServer
import me.eternal.purrfectsnap.setup.patch.LSPatch
+import me.eternal.purrfectsnap.ui.manager.components.AestheticDialog
import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
import me.eternal.purrfectsnap.ui.setup.screens.SetupScreen
import me.eternal.purrfectsnap.ui.util.scaleOnPress
@@ -86,6 +94,8 @@ class PatchSnapchatScreen : SetupScreen() {
override fun Content() {
val coroutineScope = rememberCoroutineScope()
val logs = remember { mutableStateListOf("Auto Patcher is ready.") }
+ @Suppress("DEPRECATION")
+ val clipboard = LocalClipboardManager.current
var progress by remember { mutableFloatStateOf(-1f) }
var patchedApkPath by rememberSaveable { mutableStateOf(null) }
var downloadedApkPath by rememberSaveable { mutableStateOf(null) }
@@ -98,6 +108,7 @@ class PatchSnapchatScreen : SetupScreen() {
var installRequested by rememberSaveable { mutableStateOf(false) }
var installWatcher by remember { mutableStateOf(null) }
var downloadFinished by rememberSaveable { mutableStateOf(false) }
+ var showIssuesDialog by remember { mutableStateOf(false) }
val logPulse by rememberInfiniteTransition(label = "logPulse").animateFloat(
initialValue = 0f,
targetValue = 1f,
@@ -112,7 +123,7 @@ class PatchSnapchatScreen : SetupScreen() {
LaunchedEffect(installVerified) { allowNext(installVerified) }
fun pushLog(message: String) {
- if (logs.size > 16) logs.removeFirst()
+ if (logs.size > 120) logs.removeAt(0)
logs.add(message)
}
@@ -235,6 +246,10 @@ class PatchSnapchatScreen : SetupScreen() {
pushStatus("Patched build ready. Install to finish.")
}.onFailure {
error = it.message ?: it.toString()
+ it.stackTraceToString()
+ .lineSequence()
+ .filter { line -> line.isNotBlank() }
+ .forEach { line -> pushLog(line) }
pushStatus("Failed: ${it.message}")
}
isRunning = false
@@ -273,6 +288,66 @@ class PatchSnapchatScreen : SetupScreen() {
)
}
+ if (showIssuesDialog) {
+ AestheticDialog(
+ onDismissRequest = { showIssuesDialog = false },
+ title = "Facing issues?",
+ text = "",
+ icon = Icons.Filled.Info,
+ confirmButtonText = "Got it",
+ onConfirm = { showIssuesDialog = false },
+ showCloseButton = false,
+ customContent = {
+ val bodyStyle = MaterialTheme.typography.bodyMedium.copy(
+ color = PurrfectPalette.textSecondary,
+ lineHeight = 18.sp
+ )
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .heightIn(max = 360.dp)
+ .verticalScroll(rememberScrollState()),
+ verticalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Text(
+ text = "How to fix installation errors",
+ fontWeight = FontWeight.SemiBold,
+ color = Color.White,
+ textAlign = TextAlign.Start,
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ text = "Issue: App cannot be installed because it conflicts with an existing package.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start
+ )
+ Text(
+ text = "Fix: Download Snapchat from the Play Store and uninstall it without keeping data. Run Auto Patcher again. If it still does not work, run:",
+ style = bodyStyle,
+ textAlign = TextAlign.Start
+ )
+ Text(
+ text = "adb uninstall com.snapchat.android",
+ style = bodyStyle,
+ textAlign = TextAlign.Start,
+ softWrap = false,
+ modifier = Modifier.horizontalScroll(rememberScrollState())
+ )
+ Text(
+ text = "Issue: App not installed because the package appears to be invalid.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start
+ )
+ Text(
+ text = "Fix: Download and install JingMatrix LSPatch, then patch Snapchat 13.64.0.52 in Integrated mode. Select Embed Modules and embed the PurrfectSnap APK. Then choose Skip auto setup during PurrfectSnap setup to skip Auto Patcher.",
+ style = bodyStyle,
+ textAlign = TextAlign.Start
+ )
+ }
+ }
+ )
+ }
+
SetupCard {
StepTitle(
title = "Auto Patcher",
@@ -307,33 +382,48 @@ class PatchSnapchatScreen : SetupScreen() {
modifier = Modifier.fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
+ val isDownloading = progress >= 0f
+ val isPatching = isRunning && downloadFinished && !isDownloading
Text(
- text = if (progress >= 0f) {
- "Downloading Snapchat ${(progress * 100).toInt()}%"
- } else if (isRunning && downloadFinished) {
- "Patching..."
- } else {
- "Initializing..."
+ text = when {
+ isDownloading -> "Downloading Snapchat ${(progress * 100).toInt()}%"
+ isPatching -> "Patching..."
+ else -> "Initializing..."
},
color = PurrfectPalette.textPrimary,
fontWeight = FontWeight.Medium
)
- LinearProgressIndicator(
- progress = if (progress >= 0f) progress.coerceIn(0f, 1f) else 0f,
- color = PurrfectPalette.glowPrimary,
- trackColor = Color.White.copy(alpha = 0.12f),
- modifier = Modifier
- .fillMaxWidth()
- .height(8.dp)
- .clip(RoundedCornerShape(12.dp))
- )
+ if (isDownloading) {
+ LinearProgressIndicator(
+ progress = { progress.coerceIn(0f, 1f) },
+ color = PurrfectPalette.glowPrimary,
+ trackColor = Color.White.copy(alpha = 0.12f),
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(8.dp)
+ .clip(RoundedCornerShape(12.dp))
+ )
+ } else {
+ LinearProgressIndicator(
+ color = PurrfectPalette.glowPrimary,
+ trackColor = Color.White.copy(alpha = 0.12f),
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(8.dp)
+ .clip(RoundedCornerShape(12.dp))
+ )
+ }
}
}
LogsPanel(
logs = logs,
pulse = logPulse,
- accent = accent
+ accent = accent,
+ onCopy = {
+ clipboard.setText(AnnotatedString(logs.joinToString("\n")))
+ pushLog("Logs copied to clipboard.")
+ }
)
error?.let {
@@ -389,6 +479,36 @@ class PatchSnapchatScreen : SetupScreen() {
onClick = { installPatchedApk() },
enabled = true
)
+ val issuesInteraction = remember { MutableInteractionSource() }
+ Surface(
+ shape = RoundedCornerShape(14.dp),
+ color = Color.White.copy(alpha = 0.04f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f)),
+ modifier = Modifier
+ .fillMaxWidth()
+ .scaleOnPress(issuesInteraction)
+ .clickable(
+ interactionSource = issuesInteraction,
+ indication = null
+ ) { showIssuesDialog = true }
+ ) {
+ Row(
+ modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Filled.Info,
+ contentDescription = null,
+ tint = Color.White.copy(alpha = 0.9f)
+ )
+ Text(
+ text = "Facing issues?",
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
val manualInteraction = remember { MutableInteractionSource() }
Surface(
shape = RoundedCornerShape(14.dp),
@@ -520,7 +640,8 @@ private fun GradientActionButton(
private fun LogsPanel(
logs: List,
pulse: Float,
- accent: Brush
+ accent: Brush,
+ onCopy: () -> Unit
) {
var expanded by rememberSaveable { mutableStateOf(false) }
val animatedBrush = Brush.linearGradient(
@@ -547,21 +668,54 @@ private fun LogsPanel(
) {
Row(
modifier = Modifier
- .fillMaxWidth()
- .clickable { expanded = !expanded },
+ .fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
- Text(
- text = "Logs",
- color = Color.White,
- fontWeight = FontWeight.Bold
- )
- Icon(
- imageVector = if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
- contentDescription = null,
- tint = Color.White
- )
+ Row(
+ modifier = Modifier
+ .clickable { expanded = !expanded },
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(6.dp)
+ ) {
+ Text(
+ text = "Logs",
+ color = Color.White,
+ fontWeight = FontWeight.Bold
+ )
+ Icon(
+ imageVector = if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
+ contentDescription = null,
+ tint = Color.White
+ )
+ }
+ Surface(
+ shape = RoundedCornerShape(10.dp),
+ color = Color.White.copy(alpha = 0.08f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.16f)),
+ modifier = Modifier
+ .clip(RoundedCornerShape(10.dp))
+ .clickable { onCopy() }
+ ) {
+ Row(
+ modifier = Modifier.padding(horizontal = 10.dp, vertical = 6.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(6.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Filled.ContentCopy,
+ contentDescription = null,
+ tint = Color.White,
+ modifier = Modifier.size(14.dp)
+ )
+ Text(
+ text = "Copy",
+ color = Color.White,
+ fontWeight = FontWeight.Medium,
+ fontSize = 12.sp
+ )
+ }
+ }
}
AnimatedVisibility(visible = expanded) {
Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/RootInstallSnapchatScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/RootInstallSnapchatScreen.kt
new file mode 100644
index 00000000..f179ff10
--- /dev/null
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/RootInstallSnapchatScreen.kt
@@ -0,0 +1,582 @@
+package me.eternal.purrfectsnap.ui.setup.screens.impl
+
+import android.content.Intent
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.RepeatMode
+import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.infiniteRepeatable
+import androidx.compose.animation.core.rememberInfiniteTransition
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.CheckCircle
+import androidx.compose.material.icons.filled.ContentCopy
+import androidx.compose.material.icons.filled.Download
+import androidx.compose.material.icons.filled.ExpandLess
+import androidx.compose.material.icons.filled.ExpandMore
+import androidx.compose.material.icons.filled.Info
+import androidx.compose.material.icons.filled.Verified
+import androidx.compose.material3.Icon
+import androidx.compose.material3.LinearProgressIndicator
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableFloatStateOf
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalClipboardManager
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.core.content.FileProvider
+import java.io.File
+import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import me.eternal.purrfectsnap.setup.patch.AutoPatchServer
+import me.eternal.purrfectsnap.ui.manager.theme.PurrfectPalette
+import me.eternal.purrfectsnap.ui.setup.screens.SetupScreen
+import me.eternal.purrfectsnap.ui.util.scaleOnPress
+import okhttp3.OkHttpClient
+import okhttp3.Request
+
+class RootInstallSnapchatScreen : SetupScreen() {
+ private val autoPatchServer = AutoPatchServer()
+ private val okHttpClient = OkHttpClient.Builder()
+ .callTimeout(1, TimeUnit.HOURS)
+ .connectTimeout(1, TimeUnit.HOURS)
+ .readTimeout(1, TimeUnit.HOURS)
+ .writeTimeout(1, TimeUnit.HOURS)
+ .build()
+ private val targetPackage = "com.snapchat.android"
+
+ @Composable
+ override fun Content() {
+ val coroutineScope = rememberCoroutineScope()
+ val logs = remember { mutableStateListOf("Snapchat installer is ready.") }
+ @Suppress("DEPRECATION")
+ val clipboard = LocalClipboardManager.current
+ var progress by remember { mutableFloatStateOf(-1f) }
+ var downloadedApkPath by rememberSaveable { mutableStateOf(null) }
+ val downloadedApk = remember(downloadedApkPath) { downloadedApkPath?.let(::File) }
+ var isRunning by remember { mutableStateOf(false) }
+ var error by remember { mutableStateOf(null) }
+ var downloadStartedAt by rememberSaveable { mutableStateOf(0L) }
+ var installVerified by rememberSaveable { mutableStateOf(false) }
+ var installRequested by rememberSaveable { mutableStateOf(false) }
+ var installWatcher by remember { mutableStateOf(null) }
+ var downloadFinished by rememberSaveable { mutableStateOf(false) }
+ val logPulse by rememberInfiniteTransition(label = "rootInstallLogPulse").animateFloat(
+ initialValue = 0f,
+ targetValue = 1f,
+ animationSpec = infiniteRepeatable(
+ tween(durationMillis = 2200, easing = FastOutSlowInEasing),
+ RepeatMode.Reverse
+ ),
+ label = "rootInstallLogPulseValue"
+ )
+
+ LaunchedEffect(Unit) { allowNext(false) }
+ LaunchedEffect(installVerified) { allowNext(installVerified) }
+
+ fun pushLog(message: String) {
+ if (logs.size > 120) logs.removeAt(0)
+ logs.add(message)
+ }
+
+ fun isSnapchatInstalledAfter(timestamp: Long): Boolean {
+ if (timestamp == 0L) return false
+ val info = runCatching {
+ context.androidContext.packageManager.getPackageInfo(targetPackage, 0)
+ }.getOrNull() ?: return false
+ return info.lastUpdateTime >= timestamp
+ }
+
+ fun isSnapchatInstalled(): Boolean {
+ return runCatching { context.androidContext.packageManager.getPackageInfo(targetPackage, 0) }.isSuccess
+ }
+
+ fun startInstallWatcher() {
+ if (downloadStartedAt == 0L) return
+ installWatcher?.cancel()
+ installWatcher = coroutineScope.launch {
+ repeat(80) {
+ if (isSnapchatInstalledAfter(downloadStartedAt)) {
+ installVerified = true
+ pushLog("Snapchat install confirmed. You're cleared to continue.")
+ return@launch
+ }
+ delay(1200)
+ }
+ }
+ }
+
+ LaunchedEffect(installRequested, downloadStartedAt) {
+ if (installRequested && downloadStartedAt > 0) {
+ startInstallWatcher()
+ }
+ }
+
+ LaunchedEffect(downloadStartedAt) {
+ if (downloadStartedAt > 0 && isSnapchatInstalledAfter(downloadStartedAt)) {
+ installVerified = true
+ }
+ }
+
+ LaunchedEffect(installVerified) {
+ if (installVerified) {
+ downloadedApk?.let { runCatching { it.delete() } }
+ downloadedApkPath = null
+ }
+ }
+
+ suspend fun pushStatus(message: String) = withContext(Dispatchers.Main) { pushLog(message) }
+ suspend fun setProgress(value: Float) = withContext(Dispatchers.Main) { progress = value }
+
+ suspend fun downloadSnapchatFromAutoPatchServer(): File? = withContext(Dispatchers.IO) {
+ val latestApk = autoPatchServer.fetchLatestSnapchatApk() ?: return@withContext null
+ pushStatus("Downloading recommended Snapchat version (${latestApk.tagName})...")
+
+ okHttpClient.newCall(Request.Builder().url(latestApk.downloadUrl).build()).execute().use { response ->
+ if (!response.isSuccessful) return@withContext null
+ val cacheDir = context.activity?.externalCacheDir ?: context.androidContext.externalCacheDir
+ ?: context.androidContext.cacheDir
+ val outputFile = File(cacheDir, latestApk.apkName)
+ outputFile.outputStream().use { output ->
+ response.body?.byteStream()?.use { input ->
+ val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
+ var read: Int
+ var totalRead = 0L
+ val totalSize = response.body?.contentLength() ?: -1L
+ while (input.read(buffer).also { read = it } != -1) {
+ output.write(buffer, 0, read)
+ totalRead += read
+ if (totalSize > 0) setProgress(totalRead.toFloat() / totalSize.toFloat())
+ }
+ } ?: return@withContext null
+ }
+ setProgress(-1f)
+ outputFile
+ }
+ }
+
+ fun installDownloadedApk() {
+ val apk = downloadedApk ?: return
+ installRequested = true
+ startInstallWatcher()
+ val uri = FileProvider.getUriForFile(
+ context.androidContext,
+ "${context.androidContext.packageName}.fileprovider",
+ apk
+ )
+ val intent = Intent(Intent.ACTION_VIEW).apply {
+ setDataAndType(uri, "application/vnd.android.package-archive")
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ }
+ context.androidContext.startActivity(intent)
+ }
+
+ fun markAlreadyInstalled() {
+ installRequested = false
+ installVerified = true
+ pushLog("Marked as installed manually. You're cleared to continue.")
+ }
+
+ fun startDownloadAndInstall() {
+ coroutineScope.launch(Dispatchers.Main) {
+ isRunning = true
+ allowNext(false)
+ error = null
+ progress = -1f
+ downloadedApkPath = null
+ installVerified = false
+ installRequested = false
+ downloadFinished = false
+ downloadStartedAt = System.currentTimeMillis()
+ logs.clear()
+ pushLog("Starting Snapchat download for rooted install.")
+ runCatching {
+ if (isSnapchatInstalled()) {
+ pushStatus("Snapchat is installed. Please uninstall it first (don't keep data), then try again.")
+ throw IllegalStateException("Snapchat still installed. Uninstall it first, to continue.")
+ }
+ pushStatus("Fetching recommended Snapchat APK...")
+ val downloaded = downloadSnapchatFromAutoPatchServer()
+ ?: throw IllegalStateException("Download failed")
+ downloadedApkPath = downloaded.absolutePath
+ pushStatus("Download completed: ${downloaded.name}")
+ downloadFinished = true
+ pushStatus("Launching installer...")
+ installDownloadedApk()
+ }.onFailure {
+ error = it.message ?: it.toString()
+ it.stackTraceToString()
+ .lineSequence()
+ .filter { line -> line.isNotBlank() }
+ .forEach { line -> pushLog(line) }
+ pushStatus("Failed: ${it.message}")
+ }
+ isRunning = false
+ progress = -1f
+ }
+ }
+
+ val accent = remember {
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowSecondary,
+ PurrfectPalette.glowPrimary
+ )
+ )
+ }
+
+ SetupCard {
+ StepTitle(
+ title = "Snapchat Installer",
+ subtitle = null,
+ modifier = Modifier.align(Alignment.CenterHorizontally),
+ textAlign = TextAlign.Center
+ )
+ Surface(
+ modifier = Modifier.fillMaxWidth(),
+ shape = RoundedCornerShape(24.dp),
+ color = Color.White.copy(alpha = 0.03f),
+ tonalElevation = 0.dp,
+ border = BorderStroke(
+ 1.dp,
+ Brush.linearGradient(
+ listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.4f),
+ PurrfectPalette.glowSecondary.copy(alpha = 0.35f)
+ )
+ )
+ )
+ ) {
+ Column(
+ modifier = Modifier
+ .background(PurrfectPalette.cardOverlay)
+ .padding(horizontal = 18.dp, vertical = 16.dp),
+ verticalArrangement = Arrangement.spacedBy(16.dp)
+ ) {
+ AnimatedVisibility(visible = isRunning || progress >= 0f) {
+ Column(
+ modifier = Modifier.fillMaxWidth(),
+ verticalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ val isDownloading = progress >= 0f
+ Text(
+ text = if (isDownloading) {
+ "Downloading Snapchat ${(progress * 100).toInt()}%"
+ } else {
+ "Preparing installer..."
+ },
+ color = PurrfectPalette.textPrimary,
+ fontWeight = FontWeight.Medium
+ )
+ if (isDownloading) {
+ LinearProgressIndicator(
+ progress = { progress.coerceIn(0f, 1f) },
+ color = PurrfectPalette.glowPrimary,
+ trackColor = Color.White.copy(alpha = 0.12f),
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(8.dp)
+ .clip(RoundedCornerShape(12.dp))
+ )
+ } else {
+ LinearProgressIndicator(
+ color = PurrfectPalette.glowPrimary,
+ trackColor = Color.White.copy(alpha = 0.12f),
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(8.dp)
+ .clip(RoundedCornerShape(12.dp))
+ )
+ }
+ }
+ }
+
+ LogsPanel(
+ logs = logs,
+ pulse = logPulse,
+ accent = accent,
+ onCopy = {
+ clipboard.setText(AnnotatedString(logs.joinToString("\n")))
+ pushLog("Logs copied to clipboard.")
+ }
+ )
+
+ error?.let {
+ Text(
+ text = it,
+ color = MaterialTheme.colorScheme.error,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+
+ Column(
+ modifier = Modifier.fillMaxWidth(),
+ verticalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ if (installVerified) {
+ Surface(
+ shape = RoundedCornerShape(14.dp),
+ color = Color.White.copy(alpha = 0.06f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.18f))
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Filled.CheckCircle,
+ contentDescription = null,
+ tint = Color.White
+ )
+ Text(
+ text = "Snapchat installed",
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
+ } else {
+ if (downloadedApk == null) {
+ GradientActionButton(
+ label = "Download Snapchat",
+ icon = Icons.Filled.Download,
+ onClick = { startDownloadAndInstall() },
+ enabled = !isRunning
+ )
+ }
+ if (downloadedApk != null) {
+ GradientActionButton(
+ label = "Install Snapchat",
+ icon = Icons.Filled.Verified,
+ onClick = { installDownloadedApk() },
+ enabled = true
+ )
+ val manualInteraction = remember { MutableInteractionSource() }
+ Surface(
+ shape = RoundedCornerShape(14.dp),
+ color = Color.White.copy(alpha = 0.04f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f)),
+ modifier = Modifier
+ .fillMaxWidth()
+ .scaleOnPress(manualInteraction)
+ .clickable(
+ interactionSource = manualInteraction,
+ indication = null
+ ) { markAlreadyInstalled() }
+ ) {
+ Row(
+ modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Filled.Info,
+ contentDescription = null,
+ tint = Color.White.copy(alpha = 0.9f)
+ )
+ Text(
+ text = "Already Installed?",
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+private fun GradientActionButton(
+ label: String,
+ icon: ImageVector,
+ onClick: () -> Unit,
+ enabled: Boolean,
+ modifier: Modifier = Modifier
+) {
+ val interaction = remember { MutableInteractionSource() }
+ val gradient = Brush.horizontalGradient(listOf(PurrfectPalette.glowSecondary, PurrfectPalette.glowPrimary))
+ Surface(
+ modifier = modifier
+ .fillMaxWidth()
+ .clip(RoundedCornerShape(16.dp))
+ .background(Color.Transparent)
+ .scaleOnPress(interaction)
+ .clickable(
+ enabled = enabled,
+ interactionSource = interaction,
+ indication = null,
+ onClick = onClick
+ ),
+ tonalElevation = 0.dp,
+ color = Color.Transparent,
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.14f))
+ ) {
+ Box(
+ modifier = Modifier
+ .background(if (enabled) gradient else Brush.horizontalGradient(listOf(Color.White.copy(alpha = 0.08f), Color.White.copy(alpha = 0.08f))))
+ .padding(vertical = 14.dp, horizontal = 16.dp)
+ .clip(RoundedCornerShape(16.dp))
+ ) {
+ Row(
+ modifier = Modifier.align(Alignment.CenterStart),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(10.dp)
+ ) {
+ Icon(
+ imageVector = icon,
+ contentDescription = null,
+ tint = Color.White
+ )
+ Text(
+ text = label,
+ color = Color.White,
+ fontWeight = FontWeight.SemiBold,
+ fontSize = 16.sp
+ )
+ }
+ }
+ }
+}
+
+@Composable
+private fun LogsPanel(
+ logs: List,
+ pulse: Float,
+ accent: Brush,
+ onCopy: () -> Unit
+) {
+ var expanded by rememberSaveable { mutableStateOf(false) }
+ val animatedBrush = Brush.linearGradient(
+ colors = listOf(
+ PurrfectPalette.glowPrimary.copy(alpha = 0.18f + 0.1f * pulse),
+ Color.Transparent,
+ PurrfectPalette.glowSecondary.copy(alpha = 0.12f + 0.1f * (1 - pulse))
+ ),
+ start = Offset.Zero,
+ end = Offset(400f * (0.6f + pulse), 260f * (0.4f + (1 - pulse)))
+ )
+ Surface(
+ modifier = Modifier.fillMaxWidth(),
+ shape = RoundedCornerShape(18.dp),
+ color = Color.White.copy(alpha = 0.03f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.12f))
+ ) {
+ Column(
+ modifier = Modifier
+ .background(animatedBrush)
+ .background(Color.Black.copy(alpha = 0.25f))
+ .padding(horizontal = 14.dp, vertical = 12.dp),
+ verticalArrangement = Arrangement.spacedBy(6.dp)
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Row(
+ modifier = Modifier
+ .clickable { expanded = !expanded },
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(6.dp)
+ ) {
+ Text(
+ text = "Logs",
+ color = Color.White,
+ fontWeight = FontWeight.Bold
+ )
+ Icon(
+ imageVector = if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
+ contentDescription = null,
+ tint = Color.White
+ )
+ }
+ Surface(
+ shape = RoundedCornerShape(10.dp),
+ color = Color.White.copy(alpha = 0.08f),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.16f)),
+ modifier = Modifier
+ .clip(RoundedCornerShape(10.dp))
+ .clickable { onCopy() }
+ ) {
+ Row(
+ modifier = Modifier.padding(horizontal = 10.dp, vertical = 6.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(6.dp)
+ ) {
+ Icon(
+ imageVector = Icons.Filled.ContentCopy,
+ contentDescription = null,
+ tint = Color.White,
+ modifier = Modifier.size(14.dp)
+ )
+ Text(
+ text = "Copy",
+ color = Color.White,
+ fontWeight = FontWeight.Medium,
+ fontSize = 12.sp
+ )
+ }
+ }
+ }
+ AnimatedVisibility(visible = expanded) {
+ Column(verticalArrangement = Arrangement.spacedBy(4.dp)) {
+ logs.forEach { line ->
+ Text(
+ text = "- $line",
+ color = PurrfectPalette.textPrimary,
+ fontSize = 13.sp,
+ lineHeight = 16.sp
+ )
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/SaveFolderScreen.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/SaveFolderScreen.kt
index 66589c3b..be098c90 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/SaveFolderScreen.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/setup/screens/impl/SaveFolderScreen.kt
@@ -142,6 +142,28 @@ class SaveFolderScreen : SetupScreen() {
) {
Text(text = context.translation["setup.dialogs.select_save_folder_button"])
}
+ Spacer(modifier = Modifier.height(10.dp))
+ val defaultSrc = remember { MutableInteractionSource() }
+ OutlinedButton(
+ onClick = {
+ currentFolder = ""
+ context.config.root.downloader.saveFolder.set("")
+ context.sharedPreferences.edit().putBoolean("downloader_use_default_save_folder", true).apply()
+ context.config.writeConfig()
+ goNext()
+ },
+ interactionSource = defaultSrc,
+ modifier = Modifier
+ .fillMaxWidth()
+ .scaleOnPress(defaultSrc),
+ shape = RoundedCornerShape(18.dp),
+ colors = ButtonDefaults.outlinedButtonColors(
+ contentColor = Color.White
+ ),
+ border = BorderStroke(1.dp, Color.White.copy(alpha = 0.18f))
+ ) {
+ Text(text = "Use default location")
+ }
if (showNoPickerDialog) {
Dialog(onDismissRequest = { showNoPickerDialog = false }) {
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/ActivityLauncherHelper.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/ActivityLauncherHelper.kt
index 3019b841..16006d6f 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/ActivityLauncherHelper.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/ActivityLauncherHelper.kt
@@ -40,7 +40,10 @@ class ActivityLauncherHelper(
fun launch(intent: Intent, callback: ActivityLauncherCallback, onFailure: ((Throwable) -> Unit)?) {
if (this.callback != null) {
- throw IllegalStateException("Already launching an activity")
+ val error = IllegalStateException("Already launching an activity")
+ AbstractLogger.directError("Ignored concurrent activity launch", error)
+ onFailure?.invoke(error)
+ return
}
this.callback = callback
@@ -56,7 +59,11 @@ class ActivityLauncherHelper(
fun requestPermission(permission: String, callback: ActivityLauncherCallback) {
if (this.callback != null) {
- throw IllegalStateException("Already launching an activity")
+ AbstractLogger.directError(
+ "Ignored concurrent permission request",
+ IllegalStateException("Already launching an activity")
+ )
+ return
}
this.callback = callback
permissionResultLauncher.launch(permission)
diff --git a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt
index 7e4e80e0..b807e850 100644
--- a/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt
+++ b/app/src/main/kotlin/me/eternal/purrfectsnap/ui/util/AlertDialogs.kt
@@ -207,23 +207,30 @@ class AlertDialogs(
@Composable
@Suppress("UNCHECKED_CAST")
fun UniqueSelectionDialog(property: PropertyPair<*>) {
+ val disabledKey = property.key.params.disabledKey
val keys = (property.value.defaultValues as List).toMutableList().apply {
- add(0, "null")
+ val disabledEntry = disabledKey ?: "null"
+ remove(disabledEntry)
+ add(0, disabledEntry)
+ if (disabledKey == null) {
+ remove("null")
+ add(0, "null")
+ }
}
var selectedValue by remember {
- mutableStateOf(property.value.getNullable()?.toString() ?: "null")
+ mutableStateOf(property.value.getNullable()?.toString() ?: (disabledKey ?: "null"))
}
DefaultDialogCard {
keys.forEachIndexed { index, item ->
fun select() {
selectedValue = item
- property.value.setAny(if (index == 0) {
- null
- } else {
- item
- })
+ if (disabledKey != null && item == disabledKey) {
+ property.value.setAny(disabledKey)
+ return
+ }
+ property.value.setAny(if (disabledKey == null && index == 0) null else item)
}
Row(
@@ -279,6 +286,7 @@ class AlertDialogs(
else -> KeyboardOptions(keyboardType = KeyboardType.Text)
},
singleLine = true,
+ shape = RoundedCornerShape(14.dp),
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.White.copy(alpha = 0.08f),
unfocusedContainerColor = Color.White.copy(alpha = 0.05f),
@@ -362,6 +370,7 @@ class AlertDialogs(
fieldValue.value = it
},
singleLine = true,
+ shape = RoundedCornerShape(14.dp),
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.White.copy(alpha = 0.08f),
unfocusedContainerColor = Color.White.copy(alpha = 0.05f),
diff --git a/app/src/main/res/drawable/pfp_external.jpg b/app/src/main/res/drawable/pfp_external.jpg
new file mode 100644
index 00000000..36c2ee10
Binary files /dev/null and b/app/src/main/res/drawable/pfp_external.jpg differ
diff --git a/app/src/main/res/drawable/pfp_rsr.jpg b/app/src/main/res/drawable/pfp_rsr.jpg
new file mode 100644
index 00000000..10ad4984
Binary files /dev/null and b/app/src/main/res/drawable/pfp_rsr.jpg differ
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
index d3c362a0..d4e9e40e 100644
--- a/app/src/main/res/xml/provider_paths.xml
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -1,4 +1,5 @@
+
diff --git a/build.gradle.kts b/build.gradle.kts
index 6af24f72..206e8563 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -33,8 +33,8 @@ tasks.register("getVersion") {
}
// You can still set these for legacy use by submodules or scripts:
-rootProject.ext.set("appVersionName", providers.gradleProperty("APP_VERSION_NAME").orElse("1.0.0").get())
-rootProject.ext.set("appVersionCode", 210)
+rootProject.ext.set("appVersionName", providers.gradleProperty("APP_VERSION_NAME").orElse("1.1.0").get())
+rootProject.ext.set("appVersionCode", providers.gradleProperty("APP_VERSION_CODE").orElse("1").get().toInt())
rootProject.ext.set("applicationId", "me.eternal.purrfectsnap")
rootProject.ext.set(
"buildHash",
diff --git a/changelogs-prerelease.txt b/changelogs-prerelease.txt
index aa5e8aef..b8540880 100644
--- a/changelogs-prerelease.txt
+++ b/changelogs-prerelease.txt
@@ -1,5 +1,38 @@
## v1.1.0
-- test4
+- Fix: message preview overlap in French.
+- Fix: transparent gallery media send override dialog.
+- Fix: message logger autopurge "Never" no longer resets to 3 days.
+- Fix: crash during auto patching on certain older Android versions.
+- Fix: audio mismatch.
+- Fix: app lock crash.
+- New: translations added.
+- Fix: message list no longer autoscrolls.
+- New: included an Easter egg.
+- Fix: disable Bitmoji feature.
+- UI: various UI elements fixed.
+- UI: add friends dialog now includes an "Unselect all" button.
+- UI: redesigned remaining UI elements.
+- New: select folder screen has "Use default" option for cloned installs.
+- Fix: export memories crash on certain devices.
+- Fix: config state persistence on certain devices.
+- Fix: notification crash on certain devices.
+- Fix: friend suggestions (again).
+- Change: removed pull down gesture to open menu; use Quick Add instead.
+- New: custom color feature for export chat list.
+- New: exported chat messages now include message logger.
+- Fix: unsaveable snaps.
+- UI: many UI elements made symmetrical.
+- UI: redesigned file imports screen.
+- Fix: config.json and update frequency dialogs now open on click.
+- Fix: bypass camera roll limit.
+- Fix: "no friends found" text now visible in bulk messaging action.
+- Fix: search results list no longer autoscrolls while typing.
+- New: in-app guides for rooted and non-rooted devices plus a troubleshooting guide.
+- New: Snapchat auto downloader for rooted devices.
+- Fix: quick tiles appearance.
+- Fix: dialog position in Friend Tracker sort dialog.
+- New: about section added.
+- Improvement: optimizations throughout the app.
## v1.0.0
-- test3
+- Test
diff --git a/changelogs-stable.txt b/changelogs-stable.txt
index 4db86fa5..f289ae2d 100644
--- a/changelogs-stable.txt
+++ b/changelogs-stable.txt
@@ -1,5 +1,38 @@
## v1.1.0
-- test2
+- Fix: message preview overlap in French.
+- Fix: transparent gallery media send override dialog.
+- Fix: message logger autopurge "Never" no longer resets to 3 days.
+- Fix: crash during auto patching on certain older Android versions.
+- Fix: audio mismatch.
+- Fix: app lock crash.
+- New: translations added.
+- Fix: message list no longer autoscrolls.
+- New: included an Easter egg.
+- Fix: disable Bitmoji feature.
+- UI: various UI elements fixed.
+- UI: add friends dialog now includes an "Unselect all" button.
+- UI: redesigned remaining UI elements.
+- New: select folder screen has "Use default" option for cloned installs.
+- Fix: export memories crash on certain devices.
+- Fix: config state persistence on certain devices.
+- Fix: notification crash on certain devices.
+- Fix: friend suggestions (again).
+- Change: removed pull down gesture to open menu; use Quick Add instead.
+- New: custom color feature for export chat list.
+- New: exported chat messages now include message logger.
+- Fix: unsaveable snaps.
+- UI: many UI elements made symmetrical.
+- UI: redesigned file imports screen.
+- Fix: config.json and update frequency dialogs now open on click.
+- Fix: bypass camera roll limit.
+- Fix: "no friends found" text now visible in bulk messaging action.
+- Fix: search results list no longer autoscrolls while typing.
+- New: in-app guides for rooted and non-rooted devices plus a troubleshooting guide.
+- New: Snapchat auto downloader for rooted devices.
+- Fix: quick tiles appearance.
+- Fix: dialog position in Friend Tracker sort dialog.
+- New: about section added.
+- Improvement: optimizations throughout the app.
## v1.0.0
-- test 1
+- Test.
diff --git a/common/src/main/assets/lang/ar_AE.json b/common/src/main/assets/lang/ar_AE.json
index 23989c1a..1446b059 100644
--- a/common/src/main/assets/lang/ar_AE.json
+++ b/common/src/main/assets/lang/ar_AE.json
@@ -3,7 +3,7 @@
"dialogs": {
"select_language": "اللغة المختارة",
"save_folder": "اختر أين تنقذ الحمولات",
- "select_save_folder_button": "Sect Folder"
+ "select_save_folder_button": "???? ??????"
},
"mappings": {
"dialog": "رسم الخرائط...",
@@ -14,7 +14,7 @@
"dialog": "استكمال هذه العناصر الأساسية لمواصلة:",
"notification_access": "الوصول إلى المعلومات",
"battery_optimization": "البطارية",
- "display_over_other_apps": "Display over Other Apps",
+ "display_over_other_apps": "????? ??? ????????? ??????",
"request_button": "الطلب"
}
},
@@ -35,20 +35,20 @@
"logged_stories": "قصص مزروعة",
"friend_tracker": "صديق تراكر",
"friend_tracker_catalog": "صديق تراكر كاتالوغ",
- "manage_friend_tracker_repos": "Manage Friend Tracker Repositories",
+ "manage_friend_tracker_repos": "????? ???????? ????? ????????",
"edit_rule": "القاعدة",
- "file_imports": "File Imports",
+ "file_imports": "??????? ???????",
"manage_repos": "مستودعات إدارة",
"social": "الاجتماعية",
"manage_scope": "نطاق الولاية",
- "messaging_preview": "Preview",
- "scripts": "Scripts",
+ "messaging_preview": "??????",
+ "scripts": "?????????",
"manage_script_repos": "المستودعات العقارية",
"view_logger_history": "التاريخ",
"better_location": "موقع أفضل"
},
"navigation": {
- "customize_bottom_bar_title": "Cuttomize Bottom Bar",
+ "customize_bottom_bar_title": "????? ?????? ??????",
"customize_bottom_bar_subtitle": "إختر أيّ تمثال يظهر على شاشة منزلك",
"available_tabs_title": "المتاح",
"shown_tabs_title": "شون تاب",
@@ -57,13 +57,13 @@
},
"sections": {
"home": {
- "version_title": "v{versionName}· by Eternal",
- "update_title": "Purrfectsnap Update",
- "update_content": "Version{version}متاح!",
+ "version_title": "v{versionName} ? ?????? Eternal",
+ "update_title": "????? PurrfectSnap",
+ "update_content": "??????? {version} ????!",
"update_button": "تحميل",
- "debug_build_summary_title": "أنت تُديرُ a بناء ديبوغِ مِنْ PurrfectSnap",
- "debug_build_summary_content": "Version{versionName})أ({versionCode})",
- "debug_build_summary_date": "تاريخ البناء:{date})أ({days}منذ أيام",
+ "debug_build_summary_title": "??? ?????? ???? ????? ?? PurrfectSnap",
+ "debug_build_summary_content": "??????? {versionName} ({versionCode})",
+ "debug_build_summary_date": "????? ??????: {date} ({days} ????? ???)",
"quick_actions_title": "الإجراءات السريعة"
},
"home_logs": {
@@ -77,47 +77,47 @@
"home_settings": {
"actions_title": "الإجراءات",
"message_logger_title": "رمز الرسالة",
- "debug_title": "Debug",
+ "debug_title": "?????",
"success_toast": "تم!",
- "message_logger_summary": "{messageCount}رسائل\n{storyCount}القصص",
+ "message_logger_summary": "{messageCount} ?????\n{storyCount} ???",
"export_button": "الصادرات",
"clear_button": "آمن",
- "view_logger_history_button": "View Logger History",
- "ui_settings_title": "UI Settings",
- "haptic_feedback_label": "Haptic Feedback",
+ "view_logger_history_button": "??? ??? ??????",
+ "ui_settings_title": "??????? ???????",
+ "haptic_feedback_label": "??????? ?????",
"use_system_toasts_label": "نظام الاستخدام",
"updates_title": "المستجدات",
- "auto_update_check": "Auto Update check",
+ "auto_update_check": "??? ??????? ????????",
"update_check_frequency_daily": "اليومية",
"update_check_frequency_weekly": "أسبوعيا",
"update_check_frequency_monthly": "الشهر",
- "update_channel_stable": "Stable",
+ "update_channel_stable": "?????",
"update_channel_prerelease": "ما قبل الإيجار",
"update_notification_channel_name": "المستجدات",
"update_notification_channel_description": "تُخطر عند توافر إطلاقات جديدة",
"update_notification_title": "معلومات مستكملة جديدة",
"update_notification_text": "تابوت لفتح \"بويرثر سناب\" و تحميل آخر بناء.",
- "app_theme_title": "App Theme",
+ "app_theme_title": "??? ???????",
"theme_icon_description": "اختيار الموضوع المفتوح",
"theme_mode_system": "النظام",
"theme_mode_light": "الضوء",
"theme_mode_dark": "الظلام",
- "friend_notes_title": "Friend Notes",
+ "friend_notes_title": "??????? ????????",
"friend_notes_description": "إدارة ودعم ملاحظات صديقك",
"friend_notes_no_notes_to_backup": "لا ملاحظات للتراجع حتى الآن",
"friend_notes_backup_success": "ملاحظات الأصدقاء",
"friend_notes_restore_success": "عودة مذكرات الصداقة",
"backup_button": "الدعم",
- "restore_button": "Restore",
- "view_button": "View",
- "customize_bottom_bar_title": "Cuttomize Bottom Bar",
+ "restore_button": "???????",
+ "view_button": "???",
+ "customize_bottom_bar_title": "????? ?????? ??????",
"customize_bottom_bar_subtitle": "إختر أيّ تمثال يظهر على شاشة منزلك",
"available_tabs_title": "المتاح",
"reset_button": "إعادة التوطين",
"done_button": "تم",
"clear_friend_feed": "تغذية صديقة واضحة",
- "test_mode_label": "Enable PurrAura",
- "disable_feature_loading_label": "Disable Feading",
+ "test_mode_label": "????? PurrAura",
+ "disable_feature_loading_label": "????? ????? ???????",
"disable_auto_mapper_label": "جهاز امتصاص",
"disable_bypass_indicator_label": "مؤشر التجاوزات غير القابلة للتصرف"
},
@@ -125,11 +125,11 @@
"no_tasks": "لا مهام",
"merge_button": "رقيب",
"failed_to_open_file": "فشل في فتح ملف",
- "merge_files_toast": "الاندماج{count}الملفات",
+ "merge_files_toast": "???? ??? {count} ???",
"remove_selected_tasks_title": "هل أنت متأكد أنك تريد إزالة مهام مختارة؟?",
"remove_all_tasks_title": "هل أنت متأكد أنك تريد إزالة كل المهام؟?",
"delete_files_option": "تحذف أيضا الملفات",
- "remove_selected_tasks_confirm": "إزالة الألغام{count}مهام؟?",
+ "remove_selected_tasks_confirm": "????? {count} ?????",
"remove_all_tasks_confirm": "إزالة كل المهام؟?"
},
"features": {
@@ -139,11 +139,11 @@
"reset_option": "إعادة التوطين",
"config_export_success_toast": "تم تصديره بنجاح",
"config_import_success_toast": "تم استيراده بنجاح",
- "config_import_failure_toast": "غير مؤمنة بالاستيراد{error}",
- "config_export_failure_toast": "الفشل في فرض قيود على الصادرات{error}",
+ "config_import_failure_toast": "??? ??????? ????????? {error}",
+ "config_export_failure_toast": "??? ????? ????????? {error}",
"saved_config_snackbar": "تم إنقاذه",
- "older_required": "This feature requires Snapchat v{version}أو أكبر في العمل بشكل صحيح",
- "newer_required": "This feature requires Snapchat v{version}أو جديد للعمل بشكل صحيح",
+ "older_required": "??? ?????? ????? Snapchat ??????? {version} ?? ???? ????? ???? ????",
+ "newer_required": "??? ?????? ????? Snapchat ??????? {version} ?? ???? ????? ???? ????",
"search_button": "البحث",
"clear_history": "تاريخ البحث",
"subtitle": "البحث والإدارة"
@@ -152,10 +152,10 @@
"disable_state_option": "المعوقين",
"disable_state_subtext": "لن يتأثر أي أصدقاء أو مجموعات",
"whitelist_state_option": "لا أحد إلا...",
- "whitelist_state_subtext": "فقط{count}سيتأثر الأصدقاء/المجموعات بهذه القاعدة",
+ "whitelist_state_subtext": "???? ????? ??? ????? ??? {count} ?? ????????/????????? ???",
"whitelist_state_button": "اختيار الأصدقاء/المجموعات المسموح بها",
"blacklist_state_option": "الجميع ماعدا...",
- "blacklist_state_subtext": "الجميع{count}سيتأثر الأصدقاء/المجموعات بهذه القاعدة",
+ "blacklist_state_subtext": "???? ????? ??? ????? ??? ?????? ???????? {count} ?? ????????/?????????",
"blacklist_state_button": "اختيار الأصدقاء/المجموعات المستبعدة",
"clear_list_button": "قائمة الأصدقاء/المجموعات",
"dialog_clear_confirmation_text": "هل أنت متأكد من أنك تريد تصفية القائمة؟?"
@@ -166,7 +166,7 @@
"empty_hint": "قائمتك فارغة الآن",
"friends_empty_title": "لم يضاف أي أصدقاء بعد",
"groups_empty_title": "لا مجموعات متزامنة حتى الآن",
- "streaks_expiration_short": "{hours}h",
+ "streaks_expiration_short": "{hours}?",
"social_tagline": ":: إدارة النطاقات، والسلاسل، والاستعراضات الأولية",
"social_empty_hint": "اضغطي على الزر لزامنة الأصدقاء أو المجموعات."
},
@@ -178,16 +178,16 @@
"import_base64_button": "قاعدة الواردات",
"invalid_key_size_32_bytes": "بحجم المفتاح الغير متوافق وفر مفتاحاً بـ 32 باوند.",
"successfully_imported_key": "المفتاح المستورد بنجاح.",
- "failed_to_import_key": "عدم استيراد المفتاح:{message}",
+ "failed_to_import_key": "??? ??????? ???????: {message}",
"rules_title": "القواعد",
- "participants_text": "{count}المشاركون",
+ "participants_text": "{count} ???????",
"not_found": "لم يعثر عليه",
"streaks_title": "شرائح اللحم",
- "streaks_length_text": "Length:{length}",
- "streaks_expiration_text": "المحاولات في{eta}",
+ "streaks_length_text": "?????: {length}",
+ "streaks_expiration_text": "????? ???? {eta}",
"streaks_expiration_text_expired": "انتهت",
"reminder_button": "تعيين",
- "delete_scope_confirm_dialog_title": "هل أنت متأكد أنك تريد حذف{scope}؟?",
+ "delete_scope_confirm_dialog_title": "?? ??? ????? ?? ??? {scope}?",
"notes_placeholder": "انقر لإضافة ملاحظة"
},
"logged_stories": {
@@ -203,25 +203,25 @@
"no_message_hint": "لا رسالة",
"subtitle": "عقد الاختيار",
"actions_title": "إجراءات الاعتراض",
- "save_selection_option": "Save Selection",
+ "save_selection_option": "??? ???????",
"save_all_option": "أنقذوا كل شيء",
- "unsave_selection_option": "Unsave Selection",
+ "unsave_selection_option": "????? ??? ???????",
"unsave_all_option": "غير مأمون",
"mark_selection_as_seen_option": "اختار مارك سناب كما شوهد",
"mark_all_as_seen_option": "تذكروا جميع النوافذ",
"delete_selection_option": "يحذف الاختيار",
"delete_all_option": "تحذف الجملة",
- "processed_message_toast": "المعالجة{count}رسائل",
- "processed_messages_toast": "المعالجة{count}رسائل",
- "processed_messages_text": "المعالجة{count}",
+ "processed_message_toast": "??? ?????? {count} ?????",
+ "processed_messages_toast": "??? ?????? {count} ?????",
+ "processed_messages_text": "??? ?????? {count}",
"close_button_description": "اختيار واضح"
},
"logger_history": {
- "list_friend_format": "صديق{name}",
- "list_group_format": "المجموعة{name}",
+ "list_friend_format": "???? {name}",
+ "list_group_format": "?????? {name}",
"no_more_messages": "لا رسائل",
"reverse_order_checkbox": "النظام العكسي",
- "chat_attachment": "الملحق{index}",
+ "chat_attachment": "???? {index}",
"empty_message": "رسالة فارغة",
"message_parse_failed": "فشل في استئصال الرسالة",
"unknown_sender": "غير معروف",
@@ -230,13 +230,13 @@
"file_imports": {
"import_file_button": "مجموعة الواردات",
"file_not_found": "الملف لم يعثر عليه",
- "file_import_failed": "لم يطلع على ملف الاستيراد:{error}",
- "file_imported": "File imported successfully",
+ "file_import_failed": "??? ??????? ?????: {error}",
+ "file_imported": "?? ??????? ????? ?????",
"file_delete_failed": "عدم حذف الملف",
"no_files_hint": "هنا يمكنك استيراد الملفات لاستخدامها في سنابشت اضغط على الزر من الأسفل لاستيراد ملف."
},
"better_location": {
- "spoofed_coordinates_title": "Lat{latitude}Lng{longitude}",
+ "spoofed_coordinates_title": "?? ????? {latitude}? ?? ????? {longitude}",
"save_coordinates_dialog_title": "توفير التنسيق",
"saved_name_dialog_hint": "الاسم المنقذ",
"latitude_dialog_hint": "خط العرض",
@@ -245,14 +245,14 @@
"choose_location_button": "اختر موقعا",
"manual_coordinates_hint": "حسناً، الإحداثيات يدوياً.",
"saved_coordinates_subtitle": "إدارة مواقعكم المنقذة",
- "teleport_to_friend_button": "Teleport to Friend",
+ "teleport_to_friend_button": "???????? ??? ????",
"spoof_location_toggle": "الموقع",
"suspend_location_updates": "تحديث الموقع",
"saved_coordinates_title": "التنسيقيات المنقذة",
"no_saved_coordinates_hint": "لا توجد إحداثيات منقذة",
"delete_dialog_title": "يُحذف التنسيق المنقذ",
"delete_dialog_message": "هل أنت متأكد من أنك تريد حذف هذا التنسيق المنقذ؟?",
- "teleport_to_friend_title": "Teleport to Friend",
+ "teleport_to_friend_title": "???????? ??? ????",
"search_bar": "البحث",
"no_friends_map": "لا أصدقاء على الخريطة",
"no_friends_found": "لا يوجد أصدقاء"
@@ -265,8 +265,8 @@
"fetch_error": "فشل في جلب البيانات",
"category_groups": "المجموعات",
"category_friends": "الأصدقاء",
- "participants_text": "{count}المشاركون",
- "unselect_all_button": "Unselect All"
+ "participants_text": "{count} ???????",
+ "unselect_all_button": "????? ????? ????"
},
"scripting": {
"repo_hint": "إستعراض مستودع"
@@ -276,7 +276,7 @@
"content": "التطهير يتضمن أداة للكتابة، مما يسمح بتنفيذ رمز محدد للمستعملين على جهازك. استخدام الحذر الشديد وتركيب الوحدات فقط من المصادر المعروفة الموثوقة الوحدات غير المرخصة أو غير المتحققة قد تشكل مخاطر أمنية على نظامك."
},
"reset_config": {
- "title": "Reset config",
+ "title": "????? ??? ?????????",
"content": "هل أنت متأكد من أنك تريد إعادة تشكيل الوصية؟?",
"success_toast": "إعادة تشكيل الإتحاد بنجاح"
},
@@ -300,21 +300,21 @@
"scripting": {
"actions_button": "الإجراءات",
"actions_title": "الإجراءات",
- "catalog_tab": "Catalog",
+ "catalog_tab": "????????",
"clear_module_data_button": "بيانات واضحة",
"clear_module_data_failed": "فشل في الحصول على بيانات نموذجية واضحة",
"delete_module_button": "تحذف",
"delete_module_failed": "لم تحذف الوحدة",
- "documentation_button": "Docs",
+ "documentation_button": "?????????",
"download_script_failed": "فشل في تحميل النص",
"downloading_script": "تحميل النص...",
- "edit_module_button": "Edit",
+ "edit_module_button": "?????",
"enter_url_label": "أدخل",
"import_button": "الواردات",
- "import_from_url_button": "Import from URL",
- "import_script_from_url_title": "Import Script from URL",
+ "import_from_url_button": "??????? ?? ????",
+ "import_script_from_url_title": "??????? ????? ?? ????",
"import_script_warning": "فقط تركيب النصوص من مصادر تثق بها.",
- "installed_scripts_tab": "Installed",
+ "installed_scripts_tab": "????",
"manage_repos_button": "إعادة التصرف",
"module_data_cleared": "تم تطهير البيانات!",
"module_not_found": "الوحدة لم تعثر عليها",
@@ -325,14 +325,14 @@
"open_module_failed": "فشل في فتح ملف الوحدة",
"open_scripts_folder_button": "الملفات المفتوحة",
"script_already_installed": "تم تركيبها",
- "select_folder_button": "Choose Folder",
+ "select_folder_button": "???? ??????",
"select_scripts_folder_toast": "الرجاء اختيار ملف النصوص أولا",
"update_module_button": "نموذج آخر",
"update_module_failed": "فشل في تحديث الوحدة",
"use_catalog_to_add_scripts": "استخدم المدونه لإضافة النصوص",
- "ok_button_timeout": "حسناً{timeout}",
+ "ok_button_timeout": "????? {timeout}",
"catalog": {
- "no_repos_added": "No repositories added",
+ "no_repos_added": "?? ??? ????? ?? ????????",
"repo_list_info": "ابحث عن مستودعات هنا",
"link_text": "قائمة المستودعات",
"script_already_installed": "تم تركيبها",
@@ -340,11 +340,11 @@
"could_not_create_file": "لا يمكن أن يخلق الملف",
"no_scripts_folder_selected": "اختيار ملف النصوص أولا",
"no_scripts_available": "لا توجد نصوص متاحة",
- "installed_button": "Installed",
+ "installed_button": "????",
"download_button": "تحميل"
},
"repos": {
- "no_repos_added": "No repositories added",
+ "no_repos_added": "?? ??? ????? ?? ????????",
"add_repo_button": "مضافا إليها",
"add_repo_dialog_title": "مضافا إليها",
"repo_url_label": "المستودع",
@@ -352,7 +352,7 @@
"invalid_repo_title": "مستودعات غير صالحة",
"invalid_repo_error": "هذا المستودع مفقود البيانات المطلوبة.",
"repo_added_toast": "مستودع مضاف",
- "add_repo_failed_toast": "عدم إضافة مستودع:{message}",
+ "add_repo_failed_toast": "??? ????? ????????: {message}",
"remove_button": "إزالة الألغام",
"remove_repo_dialog_title": "مستودع نقل",
"remove_repo_dialog_text": "هل أنت متأكد أنك تريد إزالة هذا المستودع؟?"
@@ -361,7 +361,7 @@
"friend_tracker": {
"rules_tab": "القواعد",
"logs_tab": "اللوز",
- "catalog_button": "Catalog",
+ "catalog_button": "????????",
"add_rule_button": "إضافة",
"import_button": "الواردات",
"filters_title": "الأفلام",
@@ -378,7 +378,7 @@
"no_rules_found": "لا توجد قواعد",
"export_logs_dialog_title": "قروض التصدير",
"export_logs_dialog_confirm_text": "سجلات التصدير باستخدام مرشحات حالية؟?",
- "export_as_button": "الصادرات{type}",
+ "export_as_button": "????? ?? {type}",
"new_rule_title": "القاعدة الجديدة",
"edit_rule_title": "القاعدة",
"general_section_title": "معلومات عامة",
@@ -391,7 +391,7 @@
"scope_blacklist": "الجميع",
"events_section_title": "الأحداث",
"events_suffix": "أحداث",
- "no_events_text": "No events added yet",
+ "no_events_text": "?? ??? ????? ????? ???",
"add_event_dialog_title": "الحدث",
"event_type_label": "الحدث من النوع",
"triggers_title": "الزنوج",
@@ -409,12 +409,12 @@
"discard_changes_dialog_title": "تغيرات التخلّص؟?",
"discard_changes_dialog_text": "لديك تغيرات غير متسامحة تخلص منهم؟?",
"rule_subtitle": "الفرضيات المؤمنة ونطاقات هذه القاعدة.",
- "discard_button": "Discard",
- "enabled_label": "Enabled",
+ "discard_button": "?????",
+ "enabled_label": "????",
"disabled_label": "المعوقين",
"delete_rule_dialog_title": "تحذف المادة",
"delete_rule_dialog_text": "هل أنت متأكد أنك تريد حذف هذه القاعدة؟?",
- "no_repos_added": "No repositories added",
+ "no_repos_added": "?? ??? ????? ?? ????????",
"import_dialog_title": "قواعد الاستيراد",
"bulk_import_button": "الواردات الجماعية",
"individual_import_button": "الواردات الوحيدة",
@@ -434,7 +434,7 @@
"back_button_description": "عُد",
"expand_button_description": "فئة التوسع أو الانهيار",
"exported_toast": "تشكيلة التراكر المصدرة",
- "export_failed_toast": "المتخلف عن متعقب التصدير:{message}"
+ "export_failed_toast": "??? ????? ???????: {message}"
},
"friend_tracker_import": {
"title": "صديق الواردات",
@@ -442,15 +442,15 @@
"back_button_description": "عُد",
"expand_button_description": "فئة التوسع أو الانهيار",
"imported_toast": "تاكر مستورد",
- "import_failed_toast": "غير متجهة إلى متعقب الاستيراد:{message}"
+ "import_failed_toast": "??? ??????? ???????: {message}"
},
"friend_tracker_catalog": {
"title": "صديق تراكر كاتالوغ",
- "no_repos_added": "No repositories added",
+ "no_repos_added": "?? ??? ????? ?? ????????",
"manage_repos_description": "مستودعات إدارة"
},
"friend_tracker_repos": {
- "no_repos_added": "No repositories added",
+ "no_repos_added": "?? ??? ????? ?? ????????",
"add_repo_button": "مضافا إليها",
"add_repo_dialog_title": "مضافا إليها",
"repo_url_label": "المستودع",
@@ -458,7 +458,7 @@
"invalid_repo_title": "مستودعات غير صالحة",
"invalid_repo_error": "هذا المستودع مفقود البيانات المطلوبة.",
"repo_added_toast": "مستودع مضاف",
- "add_repo_failed_toast": "عدم إضافة مستودع:{message}",
+ "add_repo_failed_toast": "??? ????? ????????: {message}",
"remove_button": "إزالة الألغام",
"remove_repo_dialog_title": "مستودع نقل",
"remove_repo_dialog_text": "هل أنت متأكد أنك تريد إزالة هذا المستودع؟?"
@@ -468,31 +468,31 @@
},
"features": {
"config_export": {
- "title": "Export Config Summary",
+ "title": "???? ????? ?????????",
"back_button_description": "عُد",
"save_button": "أنقذ",
"expand_button_description": "فئة التوسع أو الانهيار",
- "enabled": "Enabled",
+ "enabled": "????",
"disabled": "المعوقين",
- "enable_feature": "Enable Feature"
+ "enable_feature": "????? ??????"
},
"config_import": {
"title": "موجز الواردات",
"back_button_description": "عُد",
"confirm_button": "الواردات",
"expand_button_description": "فئة التوسع أو الانهيار",
- "enabled": "Enabled",
+ "enabled": "????",
"disabled": "المعوقين",
- "enable_feature": "Enable Feature",
+ "enable_feature": "????? ??????",
"config_imported_toast": "تم استيراده بنجاح",
- "config_import_failure_toast": "غير مؤمنة بالاستيراد{error}"
+ "config_import_failure_toast": "??? ??????? ????????? {error}"
}
}
},
"rules": {
"toasts": {
- "enabled": "{ruleName}مُتاح",
- "disabled": "{ruleName}المعوقين"
+ "enabled": "{ruleName} ????",
+ "disabled": "{ruleName} ????"
},
"modes": {
"blacklist": "نموذج القائمة السوداء",
@@ -503,12 +503,12 @@
"name": "تحميل السيارات",
"description": "التنزيل الآلي يشاهدونهم",
"options": {
- "blacklist": "Exclued from Auto download",
+ "blacklist": "??????? ?? ??????? ????????",
"whitelist": "الشحن الآلي"
}
},
"stealth": {
- "name": "Stealth Mode",
+ "name": "??? ??????",
"description": "يمنع أي شخص من معرفة أنك فتحت سلاسلهم ومحادثاتهم",
"options": {
"blacklist": "استثناء من أسلوب البيع",
@@ -516,7 +516,7 @@
}
},
"auto_save": {
- "name": "Auto Save",
+ "name": "??? ??????",
"description": "ينقذ الرسائل عندما ينظر إليها",
"options": {
"blacklist": "استبعاد من الادخار الآلي",
@@ -532,31 +532,31 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "??? ???????? ????????",
"description": "يفتتح (سنابس) تلقائياً عندما يستقبلهم",
"options": {
- "blacklist": "Exclued from Auto Open Snaps",
- "whitelist": "Auto Open Snaps"
+ "blacklist": "??????? ?? ??? ???????? ????????",
+ "whitelist": "??? ???????? ????????"
}
},
"hide_friend_feed": {
"name": "إخفاء من صديق فيد"
},
"e2e_encryption": {
- "name": "Use E2E Encryption"
+ "name": "??????? ??????? ??????"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "????? ????????"
},
"exclude_message_logger": {
"name": "استبعاد من رسالة لوغر"
},
"auto_reply": {
- "name": "Auto Reply",
+ "name": "?? ??????",
"description": "يرسل تلقائياً ردوداً على الرسائل الواردة عندما تكون بعيداً",
"options": {
- "blacklist": "Exclude from Auto Reply",
- "whitelist": "Auto Reply"
+ "blacklist": "??????? ?? ???? ????????",
+ "whitelist": "?? ??????"
}
},
"auto_delete_sent_messages": {
@@ -576,11 +576,11 @@
}
},
"auto_read": {
- "name": "Auto Read",
+ "name": "????? ???????",
"description": "علامات ذاتية و دردشة كما يلي:",
"options": {
- "blacklist": "Exclude from Auto Read",
- "whitelist": "Auto Read"
+ "blacklist": "??????? ?? ??????? ?????????",
+ "whitelist": "????? ???????"
}
},
"hide_typing_indicator": {
@@ -595,7 +595,7 @@
},
"actions": {
"clean_snapchat_cache": {
- "name": "نظيف Snapchat Cache",
+ "name": "????? ????? Snapchat ???????",
"description": "ينظف خندق \"سنابشات\""
},
"manage_friend_list": {
@@ -604,11 +604,11 @@
},
"export_chat_messages": {
"name": "رسائل التصدير",
- "description": ":: إصدار رسائل حوارية في ملف مشترك بين شركة JSON/HTML/TXT"
+ "description": "????? ????? ???????? ??? ??? JSON/HTML/TXT"
},
"export_memories": {
"name": "ذكريات التصدير",
- "description": "تصدير الذكريات إلى ملف ZIP"
+ "description": "????? ???????? ??? ??? ZIP"
},
"bulk_messaging_action": {
"name": "رسالة نصية",
@@ -623,7 +623,7 @@
"description": "تغيير لغة التطهير"
},
"file_imports": {
- "name": "File Imports",
+ "name": "??????? ???????",
"description": "ملفات استيراد للاستعمال في سنابشات"
},
"friend_tracker": {
@@ -648,8 +648,8 @@
"null": "نظام المطابقة"
},
"auto_reload": {
- "snapchat_only": "Reload Snapchatt only",
- "all": "Reload Snapchat + Purrfectsnap",
+ "snapchat_only": "????? ????? Snapchat ???",
+ "all": "????? ????? Snapchat + PurrfectSnap",
"null": "التقصير"
},
"walk_radius": {
@@ -659,28 +659,28 @@
"null": "استخدام مستوى البطاريات الحقيقي"
},
"friend_feed_menu_buttons": {
- "auto_download": "⬇️ Auto download",
- "auto_save": "💬 Auto Save Messages",
+ "auto_download": "?? ????? ??????",
+ "auto_save": "?? ??? ??????? ????????",
"unsaveable_messages": "? الرسائل غير القابلة للإنقاذ",
- "auto_open_snaps": " Auto Open Snaps",
- "stealth": " Stealth Mode",
- "auto_reply": " Rep Auto Reply",
- "auto_delete_sent_messages": "ages Auto Delete Sent Messages",
+ "auto_open_snaps": "?? ??? ???????? ????????",
+ "stealth": "?? ??? ??????",
+ "auto_reply": "?? ?? ??????",
+ "auto_delete_sent_messages": "??? ??? ??????? ??????? ????????",
"mark_snaps_as_seen": "? مارك سنابس",
"mark_stories_as_seen_locally": "? قصص العلامات كما شوهدت محليا",
- "conversation_info": "👤 Conversation Info",
- "e2e_encryption": "🔒 Use E2E Encryption",
- "message_logger": "📝 Message Logger",
- "auto_read": "✅ Auto Read",
+ "conversation_info": "?? ??????? ????????",
+ "e2e_encryption": "?? ??????? ??????? ??????",
+ "message_logger": "?? ???? ???????",
+ "auto_read": "? ????? ???????",
"hide_typing_indicator": "مؤشر الاختباء"
},
- "schedule_scheduled_for": "الجدول الزمني{name}في{time}",
- "schedule_sending_in": "إرسال{time}",
- "schedule_sent_to": "Sent to{name}",
+ "schedule_scheduled_for": "????? ?? {name} ???? {time}",
+ "schedule_sending_in": "???? ??????? ???? {time}",
+ "schedule_sent_to": "?? ??????? ??? {name}",
"schedule_sent": "تم إرسالها",
- "schedule_failed_to": "فشل في إرسال{name}",
+ "schedule_failed_to": "??? ??????? ??? {name}",
"schedule_failed": "الكسر المبرمج فشل",
- "schedule_cancelled_for": "ألغيت{name}",
+ "schedule_cancelled_for": "?? ??????? ?? {name}",
"device_model": {
"samsung_s25_ultra": "Samsung Galaxy S25 Ultra",
"google_pixel_10_pro": "Google Pixel 10 Pro",
@@ -690,7 +690,7 @@
},
"settings_menu": {
"default": "التقصير",
- "legacy": "Legacy"
+ "legacy": "????"
},
"path_format": {
"create_author_folder": "إنشاء ملف لكل صاحب",
@@ -714,23 +714,23 @@
"failure": "الفشل"
},
"notifications": {
- "chat_screenshot": "Screenshot",
+ "chat_screenshot": "???? ????",
"chat_screen_record": "سجل السيناريوهات",
- "snap_replay": "Snap Replay",
+ "snap_replay": "????? ????",
"camera_roll_save": "آلة تصوير",
- "chat": "Chat",
- "chat_reply": "Chat Reply",
- "snap": "Snap",
+ "chat": "?????",
+ "chat_reply": "?? ?????",
+ "snap": "????",
"typing": "الطباعة",
"stories": "القصص",
"speaking": "الحديث",
"chat_reaction": "رد الفعل",
"group_chat_reaction": "رد فعل الفريق",
"initiate_audio": "نداء الصوت",
- "abandon_audio": "Missed Audio Call",
+ "abandon_audio": "?????? ????? ?????",
"initiate_video": "نداء الفيديو القادم",
"abandon_video": "نداء الفيديو المفقود",
- "map_live_location": "Map Live Location"
+ "map_live_location": "???? ?? ??? ???????"
},
"auto_read": {
"blacklist": "القائمة السوداء",
@@ -778,10 +778,10 @@
"add_friend_source_spoof": {
"added_by_username": "مستعمل",
"added_by_mention": "بالنص",
- "added_by_group_chat": "By Group Chat",
+ "added_by_group_chat": "?????? ????? ??????",
"added_by_qr_code": "بموجب قانون الجمهورية التشيكية",
- "added_by_community": "By Community",
- "added_by_quick_add": "بـ \" Quick Add \" (خطر كبير بالحظر)",
+ "added_by_community": "?????? ?????",
+ "added_by_quick_add": "?????? Quick Add (??? ???? ?????)",
"added_by_spotlight": "بواسطة الضوء الساطع",
"null": "لا تفسد المصدر"
},
@@ -789,10 +789,10 @@
"null": "النظام"
},
"preferred_transcription_lang": {
- "null": "Use Snapchat Default"
+ "null": "??????? ????????? ?? Snapchat"
},
"custom_emoji_font": {
- "null": "Default Emoji Font"
+ "null": "?? ???????? ?????????"
},
"custom_shared_library": {
"null": "مكتبة التقصير"
@@ -818,13 +818,13 @@
"null": "جهاز تحديد المواقع"
},
"force_voice_note_format": {
- "null": "Use Snapchat default"
+ "null": "??????? ????????? ?? Snapchat"
},
"custom_path_format": {
"null": "نمط التقصير المستخدم"
},
"force_image_format": {
- "null": "Use Snapchat default"
+ "null": "??????? ????????? ?? Snapchat"
},
"custom_video_codec": {
"null": "المدونة الافتراضية(ج)"
@@ -842,28 +842,28 @@
"always_ask": "دائماً ما تسأل",
"ORIGINAL": "وسائط الإعلام",
"NOTE": "ملاحظة",
- "SNAP": "Snap",
- "SAVEABLE_SNAP": "Snap",
- "null": "Snapchat Default"
+ "SNAP": "????",
+ "SAVEABLE_SNAP": "???? ???? ?????",
+ "null": "??????? Snapchat"
},
"strip_media_metadata": {
- "hide_caption_text": "Hide Caption Text",
+ "hide_caption_text": "????? ?? ???????",
"hide_snap_filters": "اختبئوا",
"hide_extras": "الاختباء الإضافي (على سبيل المثال)",
"remove_audio_note_duration": "الفترة",
- "remove_audio_note_transcript_capability": "Remove Audio Note Transcript Capability"
+ "remove_audio_note_transcript_capability": "????? ??????? ?? ???????? ???????"
},
"hide_ui_components": {
- "hide_profile_call_buttons": "Remove Profile Call Buttons",
- "hide_chat_call_buttons": "Remove Chat Call Buttons",
- "hide_live_location_share_button": "Remove Live Location Share Button",
- "hide_stickers_button": "Remove Stickers Button",
- "hide_voice_record_button": "Remove Record Button",
- "hide_unread_chat_hint": "إزالة الألغام Chat Hint",
- "hide_post_to_story_buttons": "نقل البريد إلى أزرار القصة قبل إرسال Snap",
- "hide_billboard_prompt": "Remove Billboard Prompt in Friends Feed",
- "hide_snapchat_plus_gift_reminders": "Remove Snapchat بالإضافة إلى تذكير بالهدايا في المحادثات",
- "hide_map_reactions": "Remove Map Reactions"
+ "hide_profile_call_buttons": "????? ????? ??????? ?????",
+ "hide_chat_call_buttons": "????? ????? ??????? ???????",
+ "hide_live_location_share_button": "????? ?? ?????? ?????? ???????",
+ "hide_stickers_button": "????? ?? ????????",
+ "hide_voice_record_button": "????? ?? ??????? ??????",
+ "hide_unread_chat_hint": "????? ????? ??????? ??? ????????",
+ "hide_post_to_story_buttons": "????? ????? ????? ??? ????? ??? ????? ????",
+ "hide_billboard_prompt": "????? ????? ?????? ?? ???? ????????",
+ "hide_snapchat_plus_gift_reminders": "????? ??????? ????? Snapchat Plus ?? ?????????",
+ "hide_map_reactions": "????? ??????? ???????"
},
"hide_story_suggestions": {
"hide_suggested_friend_stories": "إخفاء قصص الأصدقاء المقترحة",
@@ -871,24 +871,24 @@
},
"home_tab": {
"map": "خريطة",
- "chat": "Chat",
+ "chat": "?????",
"camera": "آلة تصوير",
"discover": "الكشف",
"spotlight": "Spotlight",
- "null": "Snapchat Default"
+ "null": "??????? Snapchat"
},
"spotlight_comments_username_icon": {
- "user": "المستعمل Icon",
+ "user": "?????? ??? ????????",
"👤": "المستعمل Icon",
"[👤]": "المستعمل Icon",
- "default": "المستعمل Icon",
- "no_icon": "No icon"
+ "default": "?????? ??? ????????",
+ "no_icon": "?? ??????"
},
"custom_image_upload_format": {
"null": "الآلية"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "??????"
},
"snapchat_plus": {
"not_subscribed": "غير مدرجة",
@@ -902,15 +902,15 @@
"null": "التقصير"
},
"old_bitmoji_selfie": {
- "2d": "2D Bitmoji",
- "3d": "3D Bitmoji",
- "null": "Default Bitmoji"
+ "2d": "Bitmoji ????? ???????",
+ "3d": "Bitmoji ????? ???????",
+ "null": "Bitmoji ?????????"
},
"disable_confirmation_dialogs": {
- "erase_message": "Erase Message",
+ "erase_message": "??? ???????",
"remove_friend": "نقل صديق",
"block_friend": "صديق",
- "ignore_friend": "Ignore Friend",
+ "ignore_friend": "????? ??????",
"hide_friend": "إخفاء صديق",
"hide_conversation": "الاختباء",
"clear_conversation": "حوار واضح من شركة الأصدقاء"
@@ -921,7 +921,7 @@
},
"auto_purge": {
"never": "أبداً",
- "1_hour": "1 Hour",
+ "1_hour": "???? ?????",
"3_hours": "3 ساعات",
"6_hours": "6 ساعات",
"12_hours": "12 ساعة",
@@ -951,9 +951,9 @@
"disable_permission_requests": {
"notifications": "الإخطارات",
"read_media_images": "اقرأ الصور",
- "read_media_video": "اقرأ Video",
+ "read_media_video": "????? ???????",
"camera": "آلة تصوير",
- "microphone": "Microphone",
+ "microphone": "??????????",
"location": "الموقع",
"read_contacts": "الاتصالات الجاهزة",
"nearby_devices": "الأجهزة القريبة",
@@ -988,11 +988,11 @@
"null": "التقصير"
},
"message_types": {
- "CHAT": "Chat",
- "SNAP": "Snap",
+ "CHAT": "?????",
+ "SNAP": "????",
"NOTE": "ملاحظة",
"EXTERNAL_MEDIA": "وسائط الإعلام الخارجية",
- "STICKER": "Sticker"
+ "STICKER": "????"
},
"double_tap_chat_action_custom_emoji": {
"Custom emoji reaction": "رد فعل إيموجي العرفي"
@@ -1016,19 +1016,19 @@
"friendly, casual, helpful, empathetic": "ودود، عفو، مساعد، تعاطف"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "??? ????",
"formal": "الشكل",
"friendly": "ودود",
"humorous": "رعب",
"empathetic": "التعاطف",
- "toxic": "Edgy",
+ "toxic": "???",
"busy": "مشغول"
},
"ai_temperature": {
"0.7": "الرصيد (0.7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "??????",
"en": "الإنكليزية",
"es": "الإسبانية",
"fr": "الفرنسية",
@@ -1040,7 +1040,7 @@
"ko": "كوريا",
"zh": "الصينية",
"ar": "العربية",
- "hi": "Hindi",
+ "hi": "???????",
"tr": "تركية",
"pl": "بولندا",
"nl": "هولندا",
@@ -1084,7 +1084,7 @@
},
"auto_reply_content_types": {
"chat_messages": "الرسائل الخطية",
- "snap_messages": "Snaps",
+ "snap_messages": "??????",
"story_share_messages": "سلسلة القصص",
"story_reply_messages": "الردود النظرية",
"external_media_messages": "وسائط الإعلام الخارجية",
@@ -1106,16 +1106,16 @@
"ko": "كوريا",
"zh": "الصينية",
"ar": "العربية",
- "hi": "Hindi",
+ "hi": "???????",
"tr": "تركية"
},
"translation_position": {
"above": "فوق النص",
"below": "النص التالي",
- "inline": "Inline"
+ "inline": "??? ?????"
},
"source_language": {
- "auto": "Detect automatically"
+ "auto": "??? ??????"
},
"target_language": {
"en": "الإنكليزية"
@@ -1123,12 +1123,12 @@
},
"properties": {
"global": {
- "name": "Global",
- "description": "Tweak Global Snapchat Settings",
+ "name": "???",
+ "description": "????? ??????? Snapchat ??????",
"properties": {
"better_location": {
"name": "موقع أفضل",
- "description": "Enhances the Snapchat Location",
+ "description": "???? ???? Snapchat",
"properties": {
"spoof_location": {
"name": "الموقع",
@@ -1144,7 +1144,7 @@
},
"always_update_location": {
"name": "دائما تحديث الموقع",
- "description": "Force Snapchat to update location even if no GPS data is received"
+ "description": "????? Snapchat ??? ????? ?????? ??? ???? ?????? GPS"
},
"suspend_location_updates": {
"name": "تحديث الموقع",
@@ -1170,7 +1170,7 @@
},
"media_upload_quality": {
"name": "تحديث وسائط الإعلام",
- "description": "تجاوز نوعية وسائط الإعلام",
+ "description": "?????? ???? ??? ???????",
"properties": {
"force_video_upload_source_quality": {
"name": "المصدر:",
@@ -1191,11 +1191,11 @@
"description": "يؤكد تلقائياً إجراءات مختارة"
},
"auto_updater": {
- "name": "Auto Updater",
+ "name": "???? ??????",
"description": "إجراء عمليات تحقق آليا من أجل تحديثات جديدة"
},
"update_settings": {
- "name": "Update Settings",
+ "name": "??????? ???????",
"description": "التحكم في كيفية فحص التطهير للآخرين",
"properties": {
"auto_update_check": {
@@ -1207,10 +1207,10 @@
}
},
"ui_settings": {
- "name": "UI Settings",
+ "name": "??????? ???????",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "??????? ?????"
}
}
},
@@ -1223,7 +1223,7 @@
"description": "نقل الأقسام من صفحة القصص\nقد يتطلب تجديداً للعمل بشكل سليم"
},
"block_ads": {
- "name": "Block Ads",
+ "name": "??? ?????????",
"description": "منع الإعلانات من الظهور"
},
"disable_custom_tabs": {
@@ -1235,15 +1235,15 @@
"description": "منع سنابشت من طلب إذن محدد"
},
"disable_memories_snap_feed": {
- "name": "Disable Memories Snap Feed",
+ "name": "????? ???? ????????",
"description": "منع (سنابتشات) من إظهار الذكريات الأخيرة عندما ترتجف في الكاميرا"
},
"spotlight_comments_username": {
- "name": "Spotlight Comments Username",
+ "name": "??? ?????? ??????? Spotlight",
"description": "يُظهر لقب المُستخدمين في تعليقات الكشافة"
},
"spotlight_comments_username_icon": {
- "name": "Spotlight Comments Username Icon",
+ "name": "?????? ??? ?????? ??????? Spotlight",
"description": "الإختيار الذي يُعرض على أيقونة بجانب أسماء المستخدمين في التعليقات"
},
"bypass_video_length_restriction": {
@@ -1255,11 +1255,11 @@
"description": "يُحدّدُ السرعةَ الافتراضيةَ لعَبْل الفيديو\nالقيمة يجب أن تكون بين 0.1 و 4.0"
},
"video_playback_rate_slider": {
- "name": "Video Playback Rate Slider",
+ "name": "???? ???? ????? ???????",
"description": "يضيف زلاجة في قائمة أوبرا لتغيير معدل العزف بالفيديو\nملاحظة: لا تنطبق التغييرات إلا على أشرطة الفيديو اللاحقة"
},
"disable_google_play_dialogs": {
- "name": "Disable Google Play Services Dialogs",
+ "name": "????? ?????? Google Play",
"description": ":: منع توافر أجهزة الهاتف المحمولة في جوجل"
},
"default_volume_controls": {
@@ -1267,7 +1267,7 @@
"description": "القوات Snapchat to use system volume controls"
},
"disable_telecom_framework": {
- "name": "Disable Telecom Framework",
+ "name": "????? ???? ?????????",
"description": "منع سنابشت من استخدام إطار أندرويد تيليكوم\nهذا يسمح لك بالاستماع للموسيقى أثناء المكالمة"
},
"hide_active_music": {
@@ -1297,7 +1297,7 @@
"description": "منع أن يتم تحميلك تلقائياً"
},
"path_format": {
- "name": "Path Format",
+ "name": "????? ??????",
"description": "حددوا النموذج"
},
"allow_duplicate": {
@@ -1325,7 +1325,7 @@
"description": "يسمح لك بتحميل الصور من الصفحة"
},
"opera_download_button": {
- "name": "Opera Download Button",
+ "name": "?? ????? ?????",
"description": "يضيف زر تحميل على الركن الأيمن العلوي عندما ينظر إلى سناب\nضغط طويل على الأزرار سيضغط على الحمولة"
},
"download_context_menu": {
@@ -1333,7 +1333,7 @@
"description": "يسمح لكم بتحميل/استعراض رسائل من محادثة أو قصة باستخدام قائمة السياق.\nضغط طويل على الأزرار سيضغط على الحمولة"
},
"ffmpeg_options": {
- "name": "FFmpeg Options",
+ "name": "?????? FFmpeg",
"description": "المبلغ الإضافي FFmpeg options",
"properties": {
"threads": {
@@ -1341,7 +1341,7 @@
"description": "كمية الخيوط المستخدمة"
},
"preset": {
- "name": "Preset",
+ "name": "??????? ??????",
"description": "تحديد سرعة التحويل"
},
"constant_rate_factor": {
@@ -1349,11 +1349,11 @@
"description": "تحديد عامل المعدل المستمر لجهاز تسجيل الفيديو\nمن صفر إلى 51 للرمز libx264"
},
"video_bitrate": {
- "name": "Video Bitrate",
+ "name": "???? ?? ???????",
"description": "جهز الفيديو"
},
"audio_bitrate": {
- "name": "Audio Bitrate",
+ "name": "???? ?? ?????",
"description": "جهزوا المرارة الصوتية"
},
"custom_video_codec": {
@@ -1395,7 +1395,7 @@
}
},
"snap_preview": {
- "name": "Snap Preview",
+ "name": "?????? ??????",
"description": "يصور عرضًا بسيطًا إلى جانب النبضات الغير مرئية في الدردشة"
},
"bootstrap_override": {
@@ -1407,13 +1407,13 @@
"description": "يُحدّدُ التلميح الدائم"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "????? ??????? ????????",
"description": "يُتجاوزُ حكايةَ البدءَ عندما يَفْتحُ Snapchat"
}
}
},
"map_friend_nametags": {
- "name": "Enhanced Friend Map Nametags",
+ "name": "?????? ????? ???????? ??????? ??? ???????",
"description": "تحسّن أسماء الأصدقاء في \"سنابماب\""
},
"prevent_message_list_auto_scroll": {
@@ -1425,11 +1425,11 @@
"description": "يُظهرُ a مُوقّع إستعراضِ ستريكِ بجانب مضادِ ستريكز"
},
"hide_friend_feed_entry": {
- "name": "Hide Friend Feed Entry",
+ "name": "????? ???? ???? ????????",
"description": "يخفي صديقاً محدداً من صديق (فيد)\nاستخدام التابوت الاجتماعي لإدارة هذه السمة"
},
"hide_streak_restore": {
- "name": "Hide Streak Restore",
+ "name": "????? ??????? ???????",
"description": "يَهْبطُ زرَّ ريستوير في إطعامِ الصديقِ"
},
"hide_quick_add_suggestions": {
@@ -1438,14 +1438,14 @@
},
"hide_story_suggestions": {
"name": "اقتراحات الاختباء",
- "description": "Removes suggestions from the Stories page"
+ "description": "???? ?????????? ?? ???? ?????"
},
"hide_ui_components": {
"name": "إخفاء المكونات UI",
"description": "اختيار مكونات UI لإخفاء"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "??????? ????? ?????? ?????",
"description": "تُظهر معلومات مفيدة لوسائط الإعلام مثل تاريخ الإنشاء في قائمة المشاهدين الأوبرا"
},
"old_bitmoji_selfie": {
@@ -1457,7 +1457,7 @@
"description": "تعطل الصفحة"
},
"friend_feed_menu_buttons": {
- "name": "Friend Feed Menu Buttons",
+ "name": "????? ????? ???? ????????",
"description": "اختيار أي أزرار تظهر في صديق مينو"
},
"auto_close_friend_feed_menu": {
@@ -1493,7 +1493,7 @@
"description": "اضغط على موضوع أسود حقيقي عبر تطبيق UI"
},
"settings_menu": {
- "name": "Settings Menu",
+ "name": "????? ?????????",
"description": "الاختيار بين الأماكن الجديدة والميراثية"
}
}
@@ -1503,7 +1503,7 @@
"description": "تغيير كيف تتفاعل مع الأصدقاء",
"properties": {
"bypass_screenshot_detection": {
- "name": "Bypass Screenshot Detection",
+ "name": "????? ??? ???? ??????",
"description": "تمنع (سنابشات) من الكشف عندما تلتقط الشاشة"
},
"anonymous_story_viewing": {
@@ -1515,11 +1515,11 @@
"description": "منع أي شخص من معرفة كنت قد إعادة مشاهدة قصتهم"
},
"hide_peek_a_peek": {
- "name": "Hide Peek-a-Peek",
+ "name": "????? Peek-a-Peek",
"description": "منع إرسال الإخطارات عندما تتسلل نصفين إلى الدردشة"
},
"hide_bitmoji_presence": {
- "name": "Hide Bitmoji Presence",
+ "name": "????? ???? Bitmoji",
"description": "منع بتيموجي الخاص بك من الخروج بينما في تشات"
},
"hide_typing_notifications": {
@@ -1539,15 +1539,15 @@
"description": "يضيف زراً ليضع علامة على \"سناب\" كما شوهد عند رؤيته\nهذا سينجح حتى عندما يُمكن (ستيرث مود)"
},
"skip_when_marking_as_seen": {
- "name": "Skip When Marking as Seen",
+ "name": "???? ??? ??? ????? ??????",
"description": "يَتخطّى تلقائياً إلى سناب القادمِ عندما يَوْسمُ a سناب كما يَرى.\n(استخدم مع (مارك سناب) كـ(سيون بوتون"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "????? ????? ???????",
"description": "ردع وسائط الإعلام عند مشاهدة النقاب/القص"
},
"disable_replay_in_ff": {
- "name": "Disable Replay in FF",
+ "name": "????? ????? ??????? ?? ???? ????????",
"description": "تعطيل القدرة على إعادة اللعب مع صحافة طويلة من صديق التغذية"
},
"half_swipe_notifier": {
@@ -1581,7 +1581,7 @@
"description": "منع إرسال أنواع معينة من الرسائل"
},
"friend_mutation_notifier": {
- "name": "Friend Mutation Notifier",
+ "name": "????? ??????? ????????",
"description": "يخطرك عندما يتغير شيء في صورة صديق"
},
"better_notifications": {
@@ -1593,11 +1593,11 @@
"description": "الإخطارات الجماعية إلى واحد"
},
"chat_preview": {
- "name": "Chat Preview",
+ "name": "?????? ???????",
"description": "يبيّن استعراضاً مسبقاً للرسائل الواردة في الإخطار"
},
"media_preview": {
- "name": "Media Preview",
+ "name": "?????? ???????",
"description": "يُظهر استعراضاً مسبقاً لأنواع مختارة من وسائط الإعلام في الإخطار"
},
"media_caption": {
@@ -1613,11 +1613,11 @@
"description": "يبين مصدر طلب صديق في الإخطار"
},
"reply_button": {
- "name": "Reply Button",
+ "name": "?? ????",
"description": "يضاف زر الرد على الإخطار"
},
"smart_replies": {
- "name": "Smart Replies",
+ "name": "???? ????",
"description": "يضاف ردود مقترحة على الإخطارات (أندرويد 10+). Use in combination with Reply Button"
},
"download_button": {
@@ -1647,7 +1647,7 @@
"description": "منع رسائلك الخاصة من حذفها"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "????? ??????",
"description": "تحذف تلقائياً الرسائل المخبأة التي تكون أكبر من الوقت المحدد"
},
"message_filter": {
@@ -1655,13 +1655,13 @@
"description": "اختيار الرسائل التي ينبغي قطعها (مفرغة لجميع الرسائل)"
},
"deleted_message_color": {
- "name": "Deleted Message Color",
+ "name": "??? ??????? ????????",
"description": "يضع لون الرسائل المحذوفة"
}
}
},
"auto_save_messages_in_conversations": {
- "name": "Auto Save Messages",
+ "name": "??? ??????? ????????",
"description": "بشكل آلي يحفظ كل رسالة في المحادثات"
},
"unsaveable_messages": {
@@ -1673,7 +1673,7 @@
"description": "جعل رسائل الدردشة غير قابلة للتحقيق"
},
"snap": {
- "name": "Snaps",
+ "name": "????????",
"description": "لا يمكن إنقاذها"
},
"external_media": {
@@ -1689,7 +1689,7 @@
"description": "جعل المحتوى المشترك غير قابل للتحقيق"
},
"note": {
- "name": "Audio Notes",
+ "name": "????????? ???????",
"description": "جعل الملاحظات الصوتية غير قابلة للتحقيق"
},
"story_reply": {
@@ -1707,7 +1707,7 @@
"description": "اختر كيف يتم ارسال اعلام المعرض"
},
"include_camera_snaps": {
- "name": "Include Camera Snaps",
+ "name": "????? ????? ????????",
"description": "أيضاً أظهري لهجة التجاوز لكاميرا"
}
}
@@ -1725,7 +1725,7 @@
"description": "يسمح لك بالرد على ضربة دون فتحها أو حفظ رسالة لا يمكن إنقاذها"
},
"remove_groups_locked_status": {
- "name": "Remove Groups Locked Status",
+ "name": "????? ???? ??? ?????????",
"description": "يسمح لك برؤية المعلومات الجماعية بعد أن يتم طردك"
},
"double_tap_chat_action": {
@@ -1737,7 +1737,7 @@
"description": "يضع ردة فعل إيموجي للحديث المزدوج"
},
"auto_reply": {
- "name": "Auto Reply",
+ "name": "?? ??????",
"description": "يرسل تلقائياً ردوداً على الرسائل الواردة عندما تكون بعيداً",
"properties": {
"allow_running_in_background": {
@@ -1749,85 +1749,85 @@
"description": "الحد الأدنى من الوقت بين عمليات النقل الآلي إلى نفس المحادثة (في ثوان)"
},
"message_age_threshold": {
- "name": "Message Age Threshold",
+ "name": "?? ??? ???????",
"description": "الرد فقط على الرسائل الواردة في هذا الإطار الزمني (في ثوان)"
},
"ai_config": {
- "name": "AI Configuration",
- "description": "Settings for AI-powered auto-replies",
+ "name": "??????? ?????? ?????????",
+ "description": "??????? ?????? ????????? ???????? ??? ?????? ?????????",
"properties": {
"enable_ai_replies": {
"name": "ردود الفعل التمكينية",
- "description": "Use AI to generate intelligent auto-replies instead of template messages"
+ "description": "??????? ?????? ????????? ?????? ???? ??????? ???? ????? ?? ???????"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "???? ?????? ?????????",
"description": "Select which AI service to use for generating responses"
},
"ai_endpoint_url": {
- "name": "AI Endpoint URL",
- "description": "API endpoint URL for the AI service (e.g., OpenAI, local AI server)"
+ "name": "????? API ?????? ?????????",
+ "description": "????? ????? API ????? ?????? ????????? (??? OpenAI ?? ???? ????)"
},
"ai_model": {
- "name": "AI Model",
+ "name": "????? ?????? ?????????",
"description": "AI model to use for generating responses (e.g., gpt-3.5-turbo, gpt-4)"
},
"ai_api_key": {
- "name": "AI API Key",
+ "name": "????? API ?????? ?????????",
"description": "مفتاح التوثيق مع دائرة الاستخبارات"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "???? ???? ?????? ?????????",
"description": "النظام يُعرّفُ شخصيةَ و سلوكِ AI"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "???? ?????? ??????",
"description": "الحد الأقصى لعدد الكسور (الكلمات) التي يمكن أن تستخدمها منظمة العفو الدولية في الردود"
},
"ai_temperature": {
- "name": "درجة الحرارة",
- "description": "Controls randomness in AI responses (0.0 = deterministic, 2.0 = very random)"
+ "name": "????? ?? ??????? ?????? (0.0 ????? 2.0 ?????? ????)",
+ "description": "????? ?? ??????? ?????? (0.0 ????? 2.0 ?????? ????)"
},
"ai_context_length": {
- "name": "AI Context Length",
- "description": "Number of previous messages to include as context for AI responses"
+ "name": "??? ???? ?????? ?????????",
+ "description": "??? ??????? ??????? ??????? ????? ????? ?????? ?????????"
},
"ai_personality_traits": {
- "name": "AI Personality Traits",
+ "name": "???? ????? ?????? ?????????",
"description": "سمات الشخصية المنفصلة عن البيانات الخاصة بمنظمة العفو الدولية (مثلاً، الودية، العرضية، المساعدة)"
},
"ai_response_style": {
- "name": "AI Response Style",
+ "name": "????? ????",
"description": "الأسلوب العام لاستجابات التنفيذ الشامل"
},
"ai_response_language": {
- "name": "AI Response Language",
+ "name": "??? ????",
"description": "لغة استجابات AI (auto = نفس الرسالة الواردة)"
},
"ai_use_conversation_history": {
"name": "تاريخ الاعتراض",
- "description": "Include previous messages as context for more relevant AI responses"
+ "description": "????? ??????? ??????? ????? ????? ???? ??????"
},
"ai_include_friend_info": {
- "name": "Include Friend Info",
+ "name": "????? ??????? ??????",
"description": "إدراج اسم الصديق و المعلومات الأخرى المتاحة في سياق AI"
},
"ai_fallback_to_template": {
"name": "التراجع إلى النموذج",
- "description": "Use template messages if AI fails to generate a response"
+ "description": "??????? ????? ???? ??? ??? ?????? ????????? ?? ????? ??"
},
"ai_request_timeout": {
- "name": "AI Request Timeout",
+ "name": "???? ??? ?????? ?????????",
"description": "الحد الأقصى من الوقت للانتظار لاستجابة AI (في ثوان)"
},
"ai_retry_attempts": {
- "name": "AI Retry Attempts",
- "description": "عدد مرات إعادة النظر في الطلبات المقدمة من منظمة العفو الدولية إذا فشلت"
+ "name": "??????? ????? ????????",
+ "description": "??????? ????? ????????"
}
}
},
"auto_trigger_config": {
- "name": "Auto Trigger Configuration",
+ "name": "??????? ??????? ????????",
"description": "تركيبات للزناد الآلي ونماذج الرسائل",
"properties": {
"friendSpecificGreeting": {
@@ -1839,7 +1839,7 @@
"description": "تحياتي لاستخدامها عندما يُمكّن الأصدقاء من التحية المحددة"
},
"auto_reply_content_types": {
- "name": "Auto Reply Triggers",
+ "name": "?????? ???? ????????",
"description": "اختيار أنواع الرسائل التي ينبغي أن تؤدي إلى إعادة شحن السيارات"
},
"chat_messages": {
@@ -1847,11 +1847,11 @@
"description": "رسائل اعادة إرسال ذاتيّة لرسائل الدردشة النصية"
},
"snap_messages": {
- "name": "Snap Replies",
- "description": "رسائل اعادة ترتيب السيارات للقطع"
+ "name": "???? ????????",
+ "description": "??????? ????? ???? ??? ??? ?????? ????????? ?? ????? ??"
},
"story_share_messages": {
- "name": "Story Share Replies",
+ "name": "???? ?????? ?????",
"description": "رسائل إعادة فرز السيارات لحصص القصص"
},
"story_reply_messages": {
@@ -1867,15 +1867,15 @@
"description": "رسائل اعادة ترتيب السيارات لمذكرات الصوت"
},
"sticker_messages": {
- "name": "Sticker Replies",
+ "name": "???? ????????",
"description": "رسائل إعادة شحن السيارات للملصقات"
},
"tiny_snap_messages": {
- "name": "Tny Snap Replies",
+ "name": "???? ???????? ???????",
"description": "رسائل اعادة ترتيب السيارات لقطع صغيرة"
},
"map_reaction_messages": {
- "name": "الردود على الخرائط",
+ "name": "???? ??????? ???????",
"description": "رسائل لرد فعل الخرائط"
},
"half_swipe_messages": {
@@ -1887,7 +1887,7 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps Settings",
+ "name": "??????? ??? ???????? ????????",
"description": "حالات التأخير في فرض القيود والتشكيل",
"properties": {
"allow_running_in_background": {
@@ -1895,24 +1895,24 @@
"description": "يسمح لـ (أوت سنابس) أن يركض في الخلفية ملاحظة: هذا سيستنزف بطاريتك"
},
"min_delay": {
- "name": "Min Delay (ms)",
+ "name": "???? ????? (???? ?????)",
"description": "الحد الأدنى من التأخير في الألف ثانية قبل فتح صفحة"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
- "description": "أكبر تأخير في الألف ثانية"
+ "name": "???? ????? (???? ?????)",
+ "description": "???? ????? ??? ??? ???? (??????? ?????)"
},
"queue_size": {
- "name": "الكمية",
- "description": "الحد الأقصى لعدد المفاجئات للحفاظ على الشك"
+ "name": "??? ???????",
+ "description": "???? ?????? ???? ???????? ?? ???????"
},
"retry_attempts": {
- "name": "المحاولات الاسترجاعية",
- "description": "عدد المرات لفتح الكسرة إذا فشلت"
+ "name": "??? ??????? ???????",
+ "description": "??? ???? ????? ?????? ??? ???? ??? ?????"
},
"retry_delay": {
- "name": "Retry Delay (ms)",
- "description": "التأخير في محاولات إعادة التأهيل"
+ "name": "????? ??????? (???? ?????)",
+ "description": "?????? ??? ??????? ??????? (???? ?????)"
}
}
},
@@ -1975,11 +1975,11 @@
"description": "مكان عرض الترجمة مقارنة بالنص الأصلي"
},
"auto_translate": {
- "name": "Auto Translate",
+ "name": "????? ???????",
"description": "ترجمة تلقائية للرسائل عند تلقيها"
},
"translate_on_tap": {
- "name": "Translate on Tap",
+ "name": "??????? ??? ?????",
"description": "الرسائل المترجمة عند تخطيها"
},
"supported_languages": {
@@ -1991,7 +1991,7 @@
"description": "الترجمة التحريرية عند توقف الخدمة"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "???? ?????? ?????? ????????",
"description": "العدد الأقصى لمحاولات إعادة التجريب"
},
"retry_delay": {
@@ -2011,13 +2011,13 @@
"description": "قواعد التشغيل الآلي",
"properties": {
"auto_read": {
- "name": "Auto Read"
+ "name": "????? ???????"
},
"hide_typing_indicator": {
"name": "مؤشر نموذج الاختباء"
},
"auto_reply": {
- "name": "Auto Reply"
+ "name": "?? ??????"
},
"auto_delete_sent_messages": {
"name": "\" أوتوماتيا \""
@@ -2026,10 +2026,10 @@
"name": "الشحن الآلي"
},
"stealth": {
- "name": "Stealth Mode"
+ "name": "??? ??????"
},
"auto_save": {
- "name": "Auto Save"
+ "name": "??? ??????"
},
"message_logger": {
"name": "رمز الرسالة"
@@ -2056,7 +2056,7 @@
"description": "منع (سنابشات) من حرق الكاميرا\nهذا قد يجعل الكاميرا تدق على بعض الأجهزة"
},
"override_front_resolution": {
- "name": "Override Front Resolution",
+ "name": "????? ??? ???????? ????????",
"description": "تخطي قرار الكاميرا للكاميرا الأمامية"
},
"override_back_resolution": {
@@ -2112,51 +2112,51 @@
"description": "السمات التجريبية",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
- "description": "علامات غير مأمونة التي تدخل في رمز (سنابشات) الأصلي",
+ "name": "?????? ?????",
+ "description": "????? ??? ???? ???? ?????? Snapchat ???????",
"properties": {
"composer_hooks": {
- "name": "Composer Hooks",
- "description": "Injects code into the Composer cross-platform UI framework",
+ "name": "?????? Composer",
+ "description": "??? ??????? ?? ???? ????? Composer ????? ???????",
"properties": {
"show_first_created_username": {
- "name": "المستعمل المبتكر الأول",
- "description": "يُظهر أول اسم مُنشأ للمستخدمين إلى جانب اسم المستخدم الحالي في صفحة الموجز"
+ "name": "??? ??? ???????? ?????",
+ "description": "???? ??? ???????? ????? ????? ????? ?????? ?? ???? ????? ??????"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera roll Limit",
- "description": "زيادة الحد الأقصى من وسائل الإعلام يمكنك إرسالها من لوحة الكاميرا"
+ "name": "????? ?? ????? ????????",
+ "description": "???? ???? ?????? ??????? ???? ????? ??????? ?? ????? ????????"
},
"custom_self_destruct_snap_delay": {
- "name": "التدمير الذاتي العرفي",
- "description": "يعطي المزيد من الخيارات لجهاز توقيت التدمير الذاتي عند إرسال Snap"
+ "name": "????? ???? ????? ??????",
+ "description": "???? ?????? ???? ????? ??????? ?????? ??? ????? ????"
},
"composer_console": {
- "name": "Console",
- "description": "يسمح لك بتنفيذ شفرة جافاسكريبت في كومبوسر (السلحفي 64 فقط)"
+ "name": "?????? Composer",
+ "description": "???? ?????? JavaScript ?? Composer (arm64 ???)"
},
"composer_logs": {
- "name": "اللوغات المركبة",
- "description": "Redirects console logs of Composer to PurrfectSnap"
+ "name": "????? Composer",
+ "description": "????? ????? ????? Composer ??? PurrfectSnap"
}
}
},
"disable_bitmoji": {
- "name": "Disable Bitmoji",
- "description": "Disables Friends Profile Bitmoji"
+ "name": "????? Bitmoji",
+ "description": "???? Bitmoji ?? ????? ????????"
},
"custom_emoji_font": {
- "name": "Custom Emoji Font",
+ "name": "?? ?????? ????",
"description": "مما يسمح لكِ بإستخدام شعار (إيموجي) فقط يعمل مع العفاريت"
},
"custom_shared_library": {
- "name": "المكتبة المشتركة بين العملاء",
- "description": "يتشارك المكتبة في سنابشت هذه السمة فقط لأغراض الاختبار"
+ "name": "????? ?????? ?????",
+ "description": "????? ????? ?????? ????? ??? Snapchat. ??? ?????? ???????? ???"
}
}
},
"spoof": {
- "name": "Spoof",
+ "name": "??????",
"description": "معلومات مختلفة عنك",
"properties": {
"play_store_installer_package_name": {
@@ -2168,11 +2168,11 @@
"description": "منع الناخب من الكشف عن شبكات البرامج المواضيعية"
},
"remove_mock_location_flag": {
- "name": "Remove Mock Location Flag",
+ "name": "????? ????? ?????? ??????",
"description": "منع شنات من الكشف الموقع الشبكي"
},
"force_wifi_transport_flag": {
- "name": "Force Wi-Fi Transport Flag",
+ "name": "??? ????? ??? Wi-Fi",
"description": "النقل الشبكي للقوة Wi-Fi instead of mobile data"
},
"spoof_device_id": {
@@ -2190,7 +2190,7 @@
}
},
"spoof_device": {
- "name": "Spoof Device",
+ "name": "?????? ??????",
"description": "(سنابتشات) الحالي يعمل على نموذج جهاز آخر"
},
"device_model": {
@@ -2208,12 +2208,12 @@
"description": "يسمح لك باختيار أي ملف فيديو أوديو من المعرض"
},
"story_logger": {
- "name": "Story Logger",
- "description": "يقدم تاريخ من قصص الأصدقاء"
+ "name": "???? ?????",
+ "description": "???? ????? ???? ????????"
},
"call_recorder": {
- "name": "Call Recorder",
- "description": "التسجيلات الصوتية"
+ "name": "???? ?????????",
+ "description": "???? ????????? ??????? ????????"
},
"account_switcher": {
"name": "تحويل حساب",
@@ -2235,7 +2235,7 @@
},
"preferred_transcription_lang": {
"name": "لغة التخاطب المفضلة",
- "description": "اللغة المفضّلة لمدوّن الملاحظات الصوتية (مثل EN، ES، FR)"
+ "description": "????? ??????? ?????? ???????? ??????? (??? EN, ES, FR)"
},
"notification_transcript": {
"name": "نص الإخطار",
@@ -2244,11 +2244,11 @@
}
},
"voice_note_auto_play": {
- "name": "Voice Note Auto Play",
+ "name": "????? ????????? ??????? ????????",
"description": "يَلْعبُ بشكل آلي ملاحظةَ الصوتَ التاليةَ بعد الإنتهاءِ الحاليةِ"
},
"friend_notes": {
- "name": "Friend Notes",
+ "name": "??????? ????????",
"description": "يسمح لك بإضافة ملاحظات إلى بيانات الأصدقاء"
},
"cof_experiments": {
@@ -2256,8 +2256,8 @@
"description": "الملامح غير المحررة/البيتا"
},
"context_menu_fix": {
- "name": "Context Menu Fix",
- "description": "محاولة لتصليح مينو الصديق عندما يكون الجهاز خارجاً لا يمكن عرضه بشكل صحيح"
+ "name": "????? ????? ??????",
+ "description": "?????? ????? ????? ???? ???????? ????? ???? ?????? ??? ?????"
},
"app_lock": {
"name": "App lock",
@@ -2304,7 +2304,7 @@
"description": "يفسد مصدر طلب صديق"
},
"hidden_snapchat_plus_features": {
- "name": "Hidden Snapchat Plus Features",
+ "name": "????? Snapchat Plus ???????",
"description": "Enables unreleased/beta Snapchat Plus features\nقد لا يعمل على نسخ من سنابشات القديمة"
},
"custom_streaks_expiration_format": {
@@ -2322,28 +2322,28 @@
}
},
"scripting": {
- "name": "Scripting",
- "description": "تشغيل النصوص العرفية لتوسيع نطاق التطهير",
+ "name": "?????????",
+ "description": "????? ??????? ????? ?????? PurrfectSnap",
"properties": {
"developer_mode": {
"name": "Mode",
"description": "تظهر معلومات عن (سنابشات)"
},
"module_folder": {
- "name": "Module Folder",
+ "name": "???? ???????",
"description": "الملف الذي توجد فيه النصوص"
},
"auto_reload": {
- "name": "Auto Reload",
- "description": "إعادة تحميل النصوص آلياً عند تغييرها"
+ "name": "????? ????? ???????",
+ "description": "???? ????? ????????? ???????? ??? ???????"
},
"integrated_ui": {
"name": "وحدة متكاملة",
"description": "تسمح النصوص بإضافة مكوّنات UI عادة إلى Snapchat"
},
"disable_log_anonymization": {
- "name": "التسمية المعطلة",
- "description": "Disables the anonymization of logs"
+ "name": "????? ????? ?????? ?? ???????",
+ "description": "???? ????? ?????? ?? ???????"
},
"disable_optimization": {
"name": "الاستخدام الأمثل",
@@ -2352,8 +2352,8 @@
}
},
"friend_tracker": {
- "name": "صديق تراكر",
- "description": "نشاط صديق السجلات في سنابشات",
+ "name": "????? ????????",
+ "description": "???? ???? ???????? ??? Snapchat",
"properties": {
"record_messaging_events": {
"name": "أحداث الرسائل المسجلة",
@@ -2361,57 +2361,57 @@
},
"allow_running_in_background": {
"name": "السماح بالبدء في العمل",
- "description": "يسمح للمتتبع بالركض في الخلفية ملاحظة: هذا سيستنزف بطاريتك"
+ "description": "???? ??????? ?????? ?? ???????. ??????: ????? ??? ???????? ???????? ???? ????"
},
"auto_purge": {
- "name": "Auto Purge",
- "description": "تحذف تلقائياً الأحداث المخبأة التي تكون أكبر من الوقت المحدد"
+ "name": "????? ??????",
+ "description": "???? ??????? ??????? ?????? ?? ????? ??????? ????????"
}
}
}
},
"friend_notes": {
- "placeholder": "أضف ملاحظة."
+ "placeholder": "??? ??????..."
}
},
"friend_menu_option": {
"mark_snaps_as_seen": "مارك سنابس",
"mark_stories_as_seen_locally": "قصص العلامات كما شوهدت محليا",
- "preview": "Preview",
- "stealth_mode": "Stealth Mode",
- "auto_download_blacklist": "Auto Download Blacklist",
- "anti_auto_save": "Anti Auto Save"
+ "preview": "??????",
+ "stealth_mode": "??? ??????",
+ "auto_download_blacklist": "??????? ??????? ??????? ????????",
+ "anti_auto_save": "???? ????? ????????"
},
"content_type": {
- "CHAT": "Chat",
- "SNAP": "Snap",
+ "CHAT": "?????",
+ "SNAP": "????",
"EXTERNAL_MEDIA": "وسائط الإعلام الخارجية",
"NOTE": "ملاحظة",
- "STICKER": "Sticker",
- "SHARE": "Share",
+ "STICKER": "????",
+ "SHARE": "??????",
"STATUS": "الحالة",
"LOCATION": "الموقع",
"STATUS_SAVE_TO_CAMERA_ROLL": "أنقذ الكاميرا رول",
- "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "Screenshot",
+ "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "???? ????",
"STATUS_CONVERSATION_CAPTURE_RECORD": "سجل السيناريوهات",
"STATUS_CALL_MISSED_VIDEO": "نداء الفيديو المفقود",
- "STATUS_CALL_MISSED_AUDIO": "Missed Audio Call",
+ "STATUS_CALL_MISSED_AUDIO": "?????? ????? ?????",
"LIVE_LOCATION_SHARE": "الموقع الحية",
"CREATIVE_TOOL_ITEM": "بند المواد الخليعة",
"FAMILY_CENTER_INVITE": "مركز الأسرة",
"FAMILY_CENTER_ACCEPT": "مركز الأسرة",
"FAMILY_CENTER_LEAVE": "إجازة مركز الأسرة",
- "STATUS_PLUS_GIFT": "Status Plus Gift",
+ "STATUS_PLUS_GIFT": "???? ???? ???",
"TINY_SNAP": "Tny Snap",
"STATUS_COUNTDOWN": "العد التنازلي",
"MAP_REACTION": "رد فعل الخرائط",
"chat_messages": "الرسائل الخطية",
- "snap_messages": "Snaps",
+ "snap_messages": "??????",
"story_share_messages": "سلسلة القصص",
"story_reply_messages": "الردود النظرية",
"external_media_messages": "وسائط الإعلام الخارجية",
"voice_note_messages": "ملاحظة صوتية",
- "sticker_messages": "Sticker",
+ "sticker_messages": "??????",
"tiny_snap_messages": "Tny Snap",
"map_reaction_messages": "رد فعل الخرائط",
"half_swipes": "نصف سوبيز"
@@ -2419,18 +2419,18 @@
"media_download_source": {
"none": "لا",
"pending": "تنتهي",
- "chat_media": "Chat Media",
+ "chat_media": "????? ???????",
"story": "قصة",
"public_story": "قصة عامة",
"spotlight": "Spotlight",
"profile_picture": "الصور",
- "story_logger": "Story Logger",
+ "story_logger": "???? ?????",
"message_logger": "رمز الرسالة",
- "merged": "Merged",
- "voice_call": "Voice Call"
+ "merged": "?????",
+ "voice_call": "?????? ?????"
},
"chat_action_menu": {
- "preview_button": "Preview",
+ "preview_button": "??????",
"download_button": "تحميل",
"delete_logged_message_button": "تحذف رسالة مسرعة",
"show_chat_edit_history": "تبين تاريخ تشات إديت",
@@ -2443,7 +2443,7 @@
"expires_at": "النفقات في{date}",
"media_size": "حجم وسائط الإعلام:{size}",
"media_duration": "مدة وسائط الإعلام:{duration}ms",
- "show_debug_info": "Show Debug Info"
+ "show_debug_info": "??? ??????? ???????"
},
"modal_option": {
"profile_info": "موجز المعلومات",
@@ -2453,9 +2453,9 @@
"always_ask": "دائماً ما تسأل",
"ORIGINAL": "وسائط الإعلام",
"NOTE": "ملاحظة",
- "SNAP": "Snap",
+ "SNAP": "????",
"SAVEABLE_SNAP": "Snap",
- "null": "Snapchat Default",
+ "null": "??????? Snapchat",
"multiple_media_toast": "يمكنك فقط أن ترسل وسيلة إعلام واحدة في وقت واحد"
},
"mark_as_seen": {
@@ -2468,7 +2468,7 @@
"conversation_preview": {
"streak_expiration": "تنتهي{day}أيام{hour}ساعات{minute}دقائق",
"total_messages": "مجموع الرسائل المرسلة/المستلمة:\n{count}",
- "title": "Preview",
+ "title": "??????",
"unknown_user": "مستخدم غير معروف",
"no_messages": "لا توجد رسائل!"
},
@@ -2496,7 +2496,7 @@
"mutual": "المتبادلة",
"outgoing": "الخروج",
"blocked": "مقفلة",
- "deleted": "Deleted",
+ "deleted": "?????",
"following": "أعقب",
"suggested": "المقترحة",
"incoming": "واردة",
@@ -2515,7 +2515,7 @@
"remove_friends": "نقل الأصدقاء",
"clear_conversations": "محاور واضحة",
"clear_friend_feed": "تغذية صديقة واضحة{count})",
- "unfollow": "Unfollow",
+ "unfollow": "????? ????????",
"remove": "إزالة الألغام"
},
"leave_groups": "ارحل{count}المجموعات",
@@ -2530,11 +2530,11 @@
"reverse_order": "النظام العكسي",
"search_by_name": "البحث بالاسم",
"no_friends_found": "لا يوجد أصدقاء",
- "no_groups_found": "No groups found",
+ "no_groups_found": "?? ??? ?????? ??? ???????",
"no_friends_or_groups_found": "لا يوجد أصدقاء أو مجموعات",
"relationship": "العلاقة:",
"unknown_group": "المجموعة غير المعروفة",
- "type_group_chat": "Type: Group Chat",
+ "type_group_chat": "?????: ????? ??????",
"clean_conversations": "نظيفة{count}المحادثات",
"remove_friends": "إزالة الألغام{count}أصدقاء",
"clean_conversations_and_remove_friends": "نظيفة{count}المحادثات وازالة{count}أصدقاء",
@@ -2550,7 +2550,7 @@
"blocked": "مقفلة",
"removed_me": "أزلني",
"suggested": "المقترحة",
- "deleted": "Deleted",
+ "deleted": "?????",
"business_accounts": "حسابات الأعمال",
"streaks": "شرائح اللحم",
"non_streaks": "غير مقصود",
@@ -2562,8 +2562,8 @@
"none": "لا",
"username": "المستعمل",
"added_timestamp": "مضافا إليه",
- "snap_score": "Snap Score",
- "streak_length": "Streak Length",
+ "snap_score": "???? ????",
+ "streak_length": "??? ???????",
"most_messages_sent": "معظم الرسائل",
"most_recent_message": "الرسالة الأخيرة",
"nearest_location": "أقرب موقع"
@@ -2599,8 +2599,8 @@
"open": "مفتوح",
"download": "تحميل",
"send": "أرسل",
- "restore_original": "Restore Original",
- "convert_external_media": "Convert External Media"
+ "restore_original": "??????? ?????",
+ "convert_external_media": "????? ??????? ????????"
},
"tracker_events": {
"conversation_enter": "المدخل",
@@ -2612,23 +2612,23 @@
"started_peeking": "بدأت (بيكينغ)",
"stopped_peeking": "توقف (بيكينغ)",
"message_read": "رسالة قراءة",
- "message_deleted": "Message Deleted",
+ "message_deleted": "?? ??? ???????",
"message_saved": "الرسالة المحتفظ بها",
"message_unsaved": "رسالة غير منقّدة",
"message_edited": "رسالة محررة",
"message_reaction_add": "رد الفعل مضافا إليها",
"message_reaction_remove": "رد الفعل",
- "snap_opened": "Snap Opened",
+ "snap_opened": "?? ??? ??????",
"snap_replayed": "Snap Replay",
"snap_replayed_twice": "Snap Replay T twiceice",
- "snap_screenshot": "Snap Screenshot",
+ "snap_screenshot": "???? ???? ??????",
"snap_screen_record": "Snap Screen",
"i_can_see_you": "أستطيع أن أراك"
},
"cleared_from_feed": "مؤمنة من التغذية",
"tracker_actions": {
- "log": "Log",
- "in_app_notification": "In-App Notification",
+ "log": "?????",
+ "in_app_notification": "????? ???? ???????",
"push_notification": "الإخطار بالدفع",
"custom": "العرف"
},
@@ -2642,7 +2642,7 @@
"profile_picture_downloader": {
"button": "صور التنزيل",
"title": "جهاز تحميل الصور",
- "avatar_option": "Avatar",
+ "avatar_option": "?????? ???????",
"background_option": "معلومات أساسية"
},
"call_start_confirmation": {
@@ -2650,17 +2650,17 @@
"dialog_message": "هل أنت متأكد أنك تريد أن تبدأ مكالمة؟?"
},
"half_swipe_notifier": {
- "notification_channel_name": "نصف Swipe",
+ "notification_channel_name": "??? ?????",
"notification_content_dm": "{friend}فقط نِصْف دردشِكَ ل{duration}ثانية",
"notification_content_group": "{friend}فقط نِصْفُ إلى{group}for{duration}ثانية"
},
"download_processor": {
"attachment_type": {
- "snap": "Snap",
- "sticker": "Sticker",
+ "snap": "????",
+ "sticker": "????",
"gif": "GIF",
"external_media": "وسائط الإعلام الخارجية",
- "note": "ملاحظة",
+ "note": "??????",
"original_story": "القصة الأصلية"
},
"select_attachments_title": "ملحقات مختارة",
@@ -2685,7 +2685,7 @@
}
},
"streaks_reminder": {
- "notification_title": "شرائح اللحم",
+ "notification_title": "???????",
"notification_text": "سوف تخسر ستريك مع{friend}في{hoursLeft}ساعات"
},
"biometric_auth": {
@@ -2720,7 +2720,7 @@
"incoming_secret_message": "صديقتك قبلت مفتاحك العام اضغطي على الأقل لتقبلي السر."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
+ "title": "??? ???????? ????????",
"priority_title": "أوتوماتيكيا مفتوحة (الأولوية)",
"error_title": "أوتوماتيكياً مفتوحاً",
"channel_description": "الإخطارات المتعلقة بالفتح الآلي",
@@ -2735,8 +2735,8 @@
"action_clear": "واضح",
"action_reset": "إعادة الكونت",
"error_content": "فشل في فتح صفحة من{sender}:{error}",
- "resumed_feedback": "Auto Open Resumed",
- "paused_feedback": "Auto Open Paused",
+ "resumed_feedback": "?? ??????? ????? ????????",
+ "paused_feedback": "?? ????? ????? ????????",
"resumed_message": "سيستمر التجهيز تلقائياً للقطع المصفورة",
"paused_message": "التجهيز متوقف Queue preserved (({count}طلقات",
"status_paused": "مدفوع",
@@ -2750,16 +2750,16 @@
"unknown_sender": "غير معروف",
"unknown_user": "مستخدم غير معروف",
"content_type_external_media": "وسائط الإعلام الخارجية",
- "content_type_snap": "Snap",
+ "content_type_snap": "????",
"conversation_type_friend_dm": "صديق DM",
- "conversation_type_dm": "DM",
- "conversation_type_group_chat": "Group Chat",
- "conversation_type_chat": "Chat",
+ "conversation_type_dm": "????? ????",
+ "conversation_type_group_chat": "????? ??????",
+ "conversation_type_chat": "?????",
"notification_status": "الحالة",
"notification_statistics": "الإحصاءات",
"notification_queue_size": "الكمية",
"notification_total_opened": "المجموع",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "?????? ???????",
"notification_processing_continue": "المعالجة ستستمر تلقائياً.",
"notification_no_snaps_queue": "لا توجد طلقات في الشوكة.",
"notification_queue_cleared_opened": "تم تبرئة (كويو){opened}فُتح",
@@ -2796,10 +2796,10 @@
"script_no_scripts_found": "لا يوجد نص",
"script_ok_timeout": "حسناً{timeout}",
"scripting_tagline": "تجهيز النصوص والواردات والملفات",
- "installed_scripts_tab": "Installed",
- "catalog_tab": "Catalog",
+ "installed_scripts_tab": "????",
+ "catalog_tab": "????????",
"no_scripts_folder_selected_title": "إختار ملفك ليبدأ",
- "select_folder_button": "Choose Folder",
+ "select_folder_button": "???? ??????",
"select_scripts_folder_toast": "الرجاء اختيار ملف النصوص أولا",
"delete_rule_title": "تحذف المادة",
"delete_rule_description": "هل أنت متأكد أنك تريد حذف هذه القاعدة؟?",
@@ -2869,7 +2869,7 @@
"auto_reply_messages": {
"dialog": {
"add_message": "يضاف الرسالة",
- "edit_message": "Edit Message",
+ "edit_message": "????? ???????",
"message_label": "الرسالة",
"no_messages": "لا رسائل بعد أضف رسالتك الأولى!",
"message_placeholder": "أدخل رسالتك."
@@ -2882,29 +2882,29 @@
},
"translation_position": {
"above": "فوق",
- "below": "Below",
- "inline": "Inline"
+ "below": "????",
+ "inline": "??? ?????"
},
"language_codes": {
- "en": "الإنكليزية",
- "es": "الإسبانية",
- "fr": "الفرنسية",
- "de": "ألمانيا",
- "it": "إيطاليا",
- "pt": "البرتغال",
- "ru": "الروسية",
- "ja": "اليابان",
- "ko": "كوريا",
- "zh": "الصينية",
- "ar": "العربية",
- "hi": "Hindi",
- "tr": "تركية",
- "nl": "هولندا",
- "pl": "بولندا",
- "sv": "السويد",
- "da": "الدانمرك",
- "no": "النرويج",
- "fi": "فنلندا",
+ "en": "??????????",
+ "es": "?????????",
+ "fr": "????????",
+ "de": "?????????",
+ "it": "?????????",
+ "pt": "??????????",
+ "ru": "???????",
+ "ja": "?????????",
+ "ko": "???????",
+ "zh": "???????",
+ "ar": "???????",
+ "hi": "???????",
+ "tr": "???????",
+ "nl": "?????????",
+ "pl": "?????????",
+ "sv": "????????",
+ "da": "???????????",
+ "no": "?????????",
+ "fi": "?????????",
"cs": "التشيكية",
"hu": "هنغاريا",
"ro": "رومانيا",
@@ -2970,7 +2970,7 @@
"snap_replayed": "العزف المكرر",
"snap_replayed_twice": "مكرر مرتين",
"snap_screenshot": "الشاشة",
- "snap_screen_record": "Screen recorded"
+ "snap_screen_record": "????? ??????"
}
},
"logs": {
@@ -2992,14 +2992,14 @@
"log_entry": {
"in_conversation": "في{conversation}",
"unknown_user": "غير معروف",
- "unknown_conversation": "DMs",
+ "unknown_conversation": "????? ????",
"i_can_see_you_entered": "أدخل",
"i_can_see_you_left": "يسار",
"i_can_see_you_duration": "المدة",
- "i_can_see_you_not_available": "N/A",
- "i_can_see_you_unit_hour": "h",
- "i_can_see_you_unit_minute": "m",
- "i_can_see_you_unit_second": "s",
+ "i_can_see_you_not_available": "??? ????",
+ "i_can_see_you_unit_hour": "?",
+ "i_can_see_you_unit_minute": "?",
+ "i_can_see_you_unit_second": "?",
"event_text": "{friend}{event}في{conversation}",
"events": {
"conversation_enter": "دخلت",
@@ -3047,7 +3047,7 @@
}
},
"debug": {
- "title": "Debug",
+ "title": "?????",
"clear": "آمن",
"files": {
"config_json": "مقطورة",
@@ -3063,22 +3063,22 @@
"disable_bypass_status_indicator": "مؤشر حالة التجاوزات"
}
},
- "ui_settings_title": "UI Settings",
- "haptic_feedback_label": "Haptic Feedback",
+ "ui_settings_title": "??????? ???????",
+ "haptic_feedback_label": "??????? ?????",
"updates_title": "المستجدات",
"auto_update_check": "Auto Update check",
"update_check_frequency_daily": "اليومية",
"update_check_frequency_weekly": "أسبوعيا",
"update_check_frequency_monthly": "الشهر",
- "update_channel_stable": "Stable",
+ "update_channel_stable": "?????",
"update_channel_prerelease": "ما قبل الإيجار",
- "friend_notes_title": "Friend Notes",
+ "friend_notes_title": "??????? ????????",
"friend_notes_description": "إدارة ودعم ملاحظات صديقك",
- "app_theme_title": "App Theme",
+ "app_theme_title": "??? ???????",
"theme_mode_system": "النظام",
"theme_mode_light": "الضوء",
"theme_mode_dark": "الظلام",
- "test_mode_label": "Enable PurrAura",
+ "test_mode_label": "????? PurrAura",
"disable_feature_loading_label": "Disable Feading",
"disable_auto_mapper_label": "جهاز امتصاص",
"disable_bypass_indicator_label": "مؤشر التجاوزات غير القابلة للتصرف",
@@ -3098,7 +3098,7 @@
"include_my_eyes_only": "ضم عيناي فقط",
"cancel": "إلغاء",
"export": "الصادرات",
- "quit": "Quit",
+ "quit": "?????",
"done": "تم",
"ok": "حسناً",
"exporting_memories": "تصدير الذكريات... )أ({failed}فشلت)"
@@ -3106,9 +3106,9 @@
"scripting_ui": {
"no_scripts_folder_selected": "لا يوجد ملف مختار",
"select_folder": "الملفات المختارة",
- "import_from_url": "Import from URL",
+ "import_from_url": "??????? ?? ????",
"open_scripts_folder": "\"افتحوا \"الشروط",
- "import_script_from_url": "Import Script from URL",
+ "import_script_from_url": "??????? ????? ?? ????",
"warning_imported_scripts": "النصوص المستوردة يمكن أن تكون ضارة بجهازك فقط نصوص الاستيراد من مصادر موثوق بها.",
"enter_url_here": "ادخل هنا",
"import": "الواردات",
@@ -3119,7 +3119,7 @@
"cancel": "إلغاء",
"add": "مضافا إليها",
"ok": "حسناً",
- "quit": "Quit",
+ "quit": "?????",
"done": "تم",
"back": "العودة",
"unknown": "غير معروف",
@@ -3151,7 +3151,7 @@
"empty_message": "رسالة فارغة",
"no_more_messages": "لا رسائل",
"reverse_order_checkbox": "النظام العكسي",
- "view_logger_history_button": "View Logger History",
+ "view_logger_history_button": "??? ??? ??????",
"posted_at": "الوظائف{date}",
"created_at": "أنشئت في{date}",
"failed_to_open_file": "فشلت في فتح ملف سجلات تحقق لمزيد من المعلومات",
@@ -3170,7 +3170,7 @@
},
"debug_dialogs": {
"info": "المعلومات",
- "refs": "Refs",
+ "refs": "?????",
"arroyo": "Arroyo",
"message": "الرسالة",
"media_references": "المراجع الإعلامية",
@@ -3182,7 +3182,7 @@
"failed_to_edit_message": "فشل في تحرير الرسالة:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "??? ????",
"formal": "الشكل",
"friendly": "ودود",
"humorous": "رعب",
@@ -3202,8 +3202,8 @@
"ja": "اليابان",
"ko": "كوريا",
"zh": "الصينية",
- "ar": "Arabic (UAE) and (KSA)",
- "hi": "Hindi",
+ "ar": "??????? (????????) ?(????????)",
+ "hi": "???????",
"tr": "تركية",
"pl": "بولندا",
"nl": "هولندا",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/da.json b/common/src/main/assets/lang/da.json
index 73ee3446..e99c1629 100644
--- a/common/src/main/assets/lang/da.json
+++ b/common/src/main/assets/lang/da.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Vælg sprog",
@@ -42,7 +42,7 @@
"social": "Sociale",
"manage_scope": "Håndtér anvendelsesområde",
"messaging_preview": "Forhåndsvisning",
- "scripts": "Scripts",
+ "scripts": "Skripter",
"manage_script_repos": "Håndtér script- referater",
"view_logger_history": "Loggerhistorik",
"better_location": "Bedre placering"
@@ -60,7 +60,7 @@
"version_title": "v{versionName}· af den evige",
"update_title": "PurrfectSnap opdatering",
"update_content": "Version{version}er tilgængelig!",
- "update_button": "Download",
+ "update_button": "Hent",
"debug_build_summary_title": "Du kører en debug build af PurrfectSnap",
"debug_build_summary_content": "Version{versionName}({versionCode})",
"debug_build_summary_date": "Byggedato:{date}({days}dage siden)",
@@ -84,7 +84,7 @@
"clear_button": "Ryd",
"view_logger_history_button": "Vis loggerhistorik",
"ui_settings_title": "Brugerindstillinger",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptisk feedback",
"use_system_toasts_label": "Brug systemskåle",
"updates_title": "Opdateringer",
"auto_update_check": "Automatisk opdateringstjek",
@@ -107,7 +107,7 @@
"friend_notes_no_notes_to_backup": "Ingen noter at bakke op endnu",
"friend_notes_backup_success": "Ven noter bakkes op",
"friend_notes_restore_success": "Ven noter genoprettet",
- "backup_button": "Backup",
+ "backup_button": "Sikkerhedskopi",
"restore_button": "Gendan",
"view_button": "Vis",
"customize_bottom_bar_title": "Tilpas underlinjen",
@@ -126,10 +126,10 @@
"merge_button": "Sammenflet",
"failed_to_open_file": "Kunne ikke åbne filen",
"merge_files_toast": "Sammenfletning{count}filer",
- "remove_selected_tasks_title": "Er du sikker på du ønsker at fjerne valgte opgaver?",
- "remove_all_tasks_title": "Er du sikker på, du ønsker at fjerne alle opgaver?",
+ "remove_selected_tasks_title": "Er du sikker p?, at du vil fjerne de valgte opgaver?",
+ "remove_all_tasks_title": "Er du sikker p?, at du vil fjerne alle opgaver?",
"delete_files_option": "Slet også filer",
- "remove_selected_tasks_confirm": "Fjern{count}opgaver?",
+ "remove_selected_tasks_confirm": "Fjern {count} opgaver?",
"remove_all_tasks_confirm": "Fjern alle opgaver?"
},
"features": {
@@ -187,7 +187,7 @@
"streaks_expiration_text": "Udløber{eta}",
"streaks_expiration_text_expired": "Udløb",
"reminder_button": "Sæt påmindelse",
- "delete_scope_confirm_dialog_title": "Er du sikker på, at du ønsker at slette en{scope}?",
+ "delete_scope_confirm_dialog_title": "Er du sikker p?, at du ?nsker at slette en {scope}?",
"notes_placeholder": "Klik for at tilføje en note"
},
"logged_stories": {
@@ -305,7 +305,7 @@
"clear_module_data_failed": "Kunne ikke rydde moduldata",
"delete_module_button": "Slet",
"delete_module_failed": "Kunne ikke slette modulet",
- "documentation_button": "Docs",
+ "documentation_button": "Dokumentation",
"download_script_failed": "Kunne ikke downloade script",
"downloading_script": "Downloader script...",
"edit_module_button": "Redigér",
@@ -341,7 +341,7 @@
"no_scripts_folder_selected": "Vælg en scripts mappe først",
"no_scripts_available": "Ingen scripts tilgængelige",
"installed_button": "Installeret",
- "download_button": "Download"
+ "download_button": "Hent"
},
"repos": {
"no_repos_added": "Ingen datalagre tilføjet",
@@ -407,7 +407,7 @@
"duplicate_rule_name_dialog_title": "Duplikeret regelnavn",
"duplicate_rule_name_dialog_text": "Der findes allerede en regel med dette navn. Vælg et nyt navn.",
"discard_changes_dialog_title": "Kassér ændringer?",
- "discard_changes_dialog_text": "Du har ikke gemt ændringer. Kassere dem?",
+ "discard_changes_dialog_text": "Du har ikke gemt ?ndringer. Kass?r dem?",
"rule_subtitle": "Indstil udløsere og skoper til denne regel.",
"discard_button": "Kassér",
"enabled_label": "Aktiveret",
@@ -416,7 +416,7 @@
"delete_rule_dialog_text": "Er du sikker på, du vil slette denne regel?",
"no_repos_added": "Ingen datalagre tilføjet",
"import_dialog_title": "Importregler",
- "bulk_import_button": "Bulk import",
+ "bulk_import_button": "Masseimport",
"individual_import_button": "Engangsimport",
"invalid_import_type_dialog_title": "Ugyldig import",
"invalid_import_type_dialog_text": "Den valgte filtype matcher ikke importtilstanden.",
@@ -546,7 +546,7 @@
"name": "Brug E2E kryptering"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "Fastg?r samtale"
},
"exclude_message_logger": {
"name": "Ekskl. fra brevlogger"
@@ -615,7 +615,7 @@
"description": "Udfører operationer såsom sletning af venner eller masse sletning af samtaler"
},
"regen_mappings": {
- "name": "Regenerate Mappings",
+ "name": "Gendan mappinger",
"description": "Manuelt regenerere tilknytninger"
},
"change_language": {
@@ -690,7 +690,7 @@
},
"settings_menu": {
"default": "Standard",
- "legacy": "Legacy"
+ "legacy": "Klassisk"
},
"path_format": {
"create_author_folder": "Opret mappe for hver forfatter",
@@ -708,7 +708,7 @@
"spotlight": "Spotlight"
},
"logging": {
- "started": "Started",
+ "started": "Startet",
"success": "Succes",
"progress": "Fremskridt",
"failure": "Fejl"
@@ -716,7 +716,7 @@
"notifications": {
"chat_screenshot": "Skærmbillede",
"chat_screen_record": "Skærmoptegnelse",
- "snap_replay": "Snap Replay",
+ "snap_replay": "Snap-genafspilning",
"camera_roll_save": "Gem kamerarulle",
"chat": "Chat",
"chat_reply": "Chat svar",
@@ -843,7 +843,7 @@
"ORIGINAL": "Originale medier",
"NOTE": "Lydnote",
"SNAP": "Snap",
- "SAVEABLE_SNAP": "Saveable Snap",
+ "SAVEABLE_SNAP": "Snap der kan gemmes",
"null": "Snapchat- standard"
},
"strip_media_metadata": {
@@ -888,12 +888,12 @@
"null": "Automatisk"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatisk"
},
"snapchat_plus": {
"not_subscribed": "Ikke indskrevet",
"basic": "Grundlæggende",
- "ad_free": "Ad Free",
+ "ad_free": "Reklamefri",
"null": "Standard"
},
"bypass_video_length_restriction": {
@@ -1016,19 +1016,19 @@
"friendly, casual, helpful, empathetic": "venlig, afslappet, hjælpsom, empatisk"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Uformel",
"formal": "Formel",
"friendly": "Venlig",
"humorous": "Humoristisk",
"empathetic": "Empatic",
- "toxic": "Edgy",
+ "toxic": "Kantet",
"busy": "Travl"
},
"ai_temperature": {
"0.7": "Afbalanceret (0,7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatisk",
"en": "Engelsk",
"es": "Spansk",
"fr": "Fransk",
@@ -1112,7 +1112,7 @@
"translation_position": {
"above": "Ovenfor tekst",
"below": "Nedenfor tekst",
- "inline": "Inline"
+ "inline": "Indlejret"
},
"source_language": {
"auto": "Detektér automatisk"
@@ -1139,7 +1139,7 @@
"description": "Indstil koordinaterne for den spoofed placering"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "Gangradius",
"description": "Tilfældigt gå rundt inden for denne radius (ft)"
},
"always_update_location": {
@@ -1191,7 +1191,7 @@
"description": "Bekræfter automatisk udvalgte handlinger"
},
"auto_updater": {
- "name": "Auto Updater",
+ "name": "Auto-opdatering",
"description": "Kontrollerer automatisk for nye opdateringer"
},
"update_settings": {
@@ -1210,7 +1210,7 @@
"name": "Brugerindstillinger",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Haptisk feedback"
}
}
},
@@ -1282,7 +1282,7 @@
},
"downloader": {
"name": "Downloader",
- "description": "Download Snapchat Media",
+ "description": "Hent Snapchat-medier",
"properties": {
"save_folder": {
"name": "Gem mappe",
@@ -1399,7 +1399,7 @@
"description": "Viser en lille forhåndsvisning ved siden af usete snaps i chat"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Bootstrap-override",
"description": "Overfører indstillinger for brugergrænseflade bootstrap",
"properties": {
"app_appearance": {
@@ -1445,7 +1445,7 @@
"description": "Vælg hvilke UI- komponenter der skal skjules"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "Opera Media hurtiginfo",
"description": "Viser nyttig information om medier såsom oprettelsesdato i opera viewers kontekstmenu"
},
"old_bitmoji_selfie": {
@@ -1503,7 +1503,7 @@
"description": "Ændre hvordan du interagerer med venner",
"properties": {
"bypass_screenshot_detection": {
- "name": "Bypass Screenshot Detection",
+ "name": "Omg? sk?rmbilleddetektering",
"description": "Forhindrer Snapchat i at opdage når du tager et screenshot"
},
"anonymous_story_viewing": {
@@ -1593,7 +1593,7 @@
"description": "Gruppemeddelelser til en enkelt"
},
"chat_preview": {
- "name": "Chat Preview",
+ "name": "Chat-forh?ndsvisning",
"description": "Viser en forhåndsvisning af modtagne meddelelser i anmeldelsen"
},
"media_preview": {
@@ -1765,7 +1765,7 @@
"description": "Vælg hvilken AI-tjeneste der skal bruges til at generere svar"
},
"ai_endpoint_url": {
- "name": "AI Endpoint URL",
+ "name": "AI-endepunkt-URL",
"description": "API endpoint URL for AI-tjenesten (fx, OpenAI, lokal AI-server)"
},
"ai_model": {
@@ -1781,7 +1781,7 @@
"description": "System prompt, der definerer AI 's personlighed og adfærd"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "AI maks. tokens",
"description": "Maksimalt antal tokens (ord) AI kan bruge i svar"
},
"ai_temperature": {
@@ -1817,7 +1817,7 @@
"description": "Brug skabelonbreve hvis AI ikke genererer et svar"
},
"ai_request_timeout": {
- "name": "AI Request Timeout",
+ "name": "AI-foresp?rgselstimeout",
"description": "Maksimal tid til at vente på AI respons (i sekunder)"
},
"ai_retry_attempts": {
@@ -1899,7 +1899,7 @@
"description": "Mindste forsinkelse i millisekunder før et snap åbnes"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Maks. forsinkelse (ms)",
"description": "Maksimal forsinkelse i millisekunder før et snap åbnes"
},
"queue_size": {
@@ -2090,7 +2090,7 @@
}
},
"streaks_reminder": {
- "name": "Streaks Reminder",
+ "name": "Streaks-p?mindelse",
"description": "Periodisk fortæller dig om dine Streaks",
"properties": {
"interval": {
@@ -2124,11 +2124,11 @@
"description": "Viser det første oprettede brugernavn ved siden af det aktuelle brugernavn i profilsiden"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera Roll Limit",
+ "name": "Omg? kamerarullegr?nse",
"description": "Øger den maksimale mængde medier, du kan sende fra kameraet roll"
},
"custom_self_destruct_snap_delay": {
- "name": "Custom Self Destruct Snap Delay",
+ "name": "Brugerdefineret selvdestruktionsforsinkelse for Snap",
"description": "Giver flere muligheder for selvdestruere timer, når du sender en Snap"
},
"composer_console": {
@@ -2156,7 +2156,7 @@
}
},
"spoof": {
- "name": "Spoof",
+ "name": "Spoofing",
"description": "Spoof forskellige oplysninger om dig",
"properties": {
"play_store_installer_package_name": {
@@ -2208,7 +2208,7 @@
"description": "Giver dig mulighed for at vælge en video / lydfil fra galleriet"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Story-logger",
"description": "Giver en historie om venner historier"
},
"call_recorder": {
@@ -2244,7 +2244,7 @@
}
},
"voice_note_auto_play": {
- "name": "Voice Note Auto Play",
+ "name": "Automatisk afspilning af talenoter",
"description": "Afspiller automatisk den næste stemme note efter den nuværende er færdig"
},
"friend_notes": {
@@ -2260,7 +2260,7 @@
"description": "Forsøg at reparere Venne Feed Menuen som når enheden er offline kan den ikke vises korrekt"
},
"app_lock": {
- "name": "App Lock",
+ "name": "Appl?s",
"description": "Forhindrer adgang til Snapchat uden adgangskode",
"properties": {
"lock_on_resume": {
@@ -2270,7 +2270,7 @@
}
},
"infinite_story_boost": {
- "name": "Infinite Story Boost",
+ "name": "Uendelig Story-boost",
"description": "Bypass Story Boost Limit forsinkelse"
},
"meo_passcode_bypass": {
@@ -2399,7 +2399,7 @@
"LIVE_LOCATION_SHARE": "Live Placering Del",
"CREATIVE_TOOL_ITEM": "Kreativt værktøjs element",
"FAMILY_CENTER_INVITE": "Invitation til familiecenter",
- "FAMILY_CENTER_ACCEPT": "Family Center Accept",
+ "FAMILY_CENTER_ACCEPT": "Family Center accept",
"FAMILY_CENTER_LEAVE": "Familiecenterorlov",
"STATUS_PLUS_GIFT": "Status plus gave",
"TINY_SNAP": "Lille snap",
@@ -2419,19 +2419,19 @@
"media_download_source": {
"none": "Ingen",
"pending": "Afventer",
- "chat_media": "Chat Media",
+ "chat_media": "Chatmedier",
"story": "Historie",
"public_story": "Offentlig historie",
"spotlight": "Spotlight",
"profile_picture": "Profilbillede",
- "story_logger": "Story Logger",
+ "story_logger": "Story-logger",
"message_logger": "BrevloggerComment",
"merged": "Sammenflettet",
"voice_call": "Stemmeopkald"
},
"chat_action_menu": {
"preview_button": "Forhåndsvisning",
- "download_button": "Download",
+ "download_button": "Hent",
"delete_logged_message_button": "Slet indlæst brev",
"show_chat_edit_history": "Vis Chat Redigér historik",
"convert_message": "Konvertér brev"
@@ -2454,7 +2454,7 @@
"ORIGINAL": "Originale medier",
"NOTE": "Lydnote",
"SNAP": "Snap",
- "SAVEABLE_SNAP": "Saveable Snap",
+ "SAVEABLE_SNAP": "Snap der kan gemmes",
"null": "Snapchat- standard",
"multiple_media_toast": "Du kan kun sende et medie ad gangen"
},
@@ -2597,7 +2597,7 @@
"cancel": "Annullér",
"save": "Gem",
"open": "Åbn",
- "download": "Download",
+ "download": "Hent",
"send": "Send",
"restore_original": "Gendan original",
"convert_external_media": "Konverter eksterne medier"
@@ -2622,7 +2622,7 @@
"snap_replayed": "Snap genspillet",
"snap_replayed_twice": "Snap genspillet to gange",
"snap_screenshot": "Snap screenshot",
- "snap_screen_record": "Snap Screen Record",
+ "snap_screen_record": "Snap-sk?rmoptagelse",
"i_can_see_you": "Jeg kan se dig"
},
"cleared_from_feed": "Renset fra foder",
@@ -2635,7 +2635,7 @@
"better_notifications": {
"button": {
"reply": "Svar",
- "download": "Download",
+ "download": "Hent",
"mark_as_read": "Markér som læst"
}
},
@@ -2883,7 +2883,7 @@
"translation_position": {
"above": "Over",
"below": "Nedenfor",
- "inline": "Inline"
+ "inline": "Indlejret"
},
"language_codes": {
"en": "Engelsk",
@@ -2984,7 +2984,7 @@
},
"delete_dialog": {
"title": "Slet log",
- "message": "Er du sikker på, du vil slette alle logfiler? Denne handling kan ikke bringes til ophør.",
+ "message": "Er du sikker p?, du vil slette alle logfiler? Denne handling kan ikke fortrydes.",
"confirm": "Slet alle",
"cancel": "Annullér",
"progress": "Sletning{count}logfiler..."
@@ -3064,7 +3064,7 @@
}
},
"ui_settings_title": "Brugerindstillinger",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptisk feedback",
"updates_title": "Opdateringer",
"auto_update_check": "Automatisk opdateringstjek",
"update_check_frequency_daily": "Daglig",
@@ -3156,9 +3156,9 @@
"created_at": "Oprettet ved{date}",
"failed_to_open_file": "Kunne ikke åbne filen. Tjek logfiler for mere info",
"failed_to_get_file": "Kunne ikke få filen",
- "download_button": "Download",
+ "download_button": "Hent",
"chat_attachment": "Bilag{index}",
- "log_header_format": "{username}?{type}?{date}",
+ "log_header_format": "{username} ? {type} ? {date}",
"edited_at_text": "Edited to \"{message}\"på{date}",
"list_group_format": "Gruppe{name}",
"list_friend_format": "Ven{name}",
@@ -3182,7 +3182,7 @@
"failed_to_edit_message": "Kunne ikke redigere brev:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Uformel",
"formal": "Formel",
"friendly": "Venlig",
"humorous": "Humoristisk",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/de_DE.json b/common/src/main/assets/lang/de_DE.json
index 854a9395..2c10fc26 100644
--- a/common/src/main/assets/lang/de_DE.json
+++ b/common/src/main/assets/lang/de_DE.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Sprache auswählen",
@@ -27,10 +27,10 @@
"tasks": "Aufgaben",
"features": "Eigenschaften",
"manage_rule_feature": "Regelmerkmal verwalten",
- "home": "Home",
+ "home": "Startseite",
"home_about": "Über uns",
"home_settings": "Einstellungen",
- "home_logs": "Logs",
+ "home_logs": "Protokolle",
"logger_history": "Geschichte von Logger",
"logged_stories": "Geloggte Geschichten",
"friend_tracker": "Fröhlicher Tracker",
@@ -58,7 +58,7 @@
"sections": {
"home": {
"version_title": "vgl{versionName}· von Eternal",
- "update_title": "PurrfectSnap Update",
+ "update_title": "PurrfectSnap-Update",
"update_content": "Version{version}ist verfügbar!",
"update_button": "Downloads",
"debug_build_summary_title": "Sie führen einen Debug-Bau von PurrfectSnap",
@@ -107,8 +107,8 @@
"friend_notes_no_notes_to_backup": "Noch keine Notizen",
"friend_notes_backup_success": "Freundschaftsnoten gesichert",
"friend_notes_restore_success": "Freundschaftsnoten restauriert",
- "backup_button": "Backup",
- "restore_button": "Restore",
+ "backup_button": "Sicherung",
+ "restore_button": "Wiederherstellen",
"view_button": "Blick",
"customize_bottom_bar_title": "Anpassen Bottom Bar",
"customize_bottom_bar_subtitle": "Wählen Sie, welche Tabs auf Ihrem Heimbildschirm anzeigen",
@@ -116,7 +116,7 @@
"reset_button": "Zurück zur Übersicht",
"done_button": "Artikel 2",
"clear_friend_feed": "Klarer Friend Feed",
- "test_mode_label": "Enable PurrAura",
+ "test_mode_label": "PurrAura aktivieren",
"disable_feature_loading_label": "Deaktivieren der Funktion",
"disable_auto_mapper_label": "Auto Mapper deaktivieren",
"disable_bypass_indicator_label": "Bypass Indikator deaktivieren"
@@ -126,10 +126,10 @@
"merge_button": "Verschmelzung",
"failed_to_open_file": "Datei nicht öffnen",
"merge_files_toast": "Zusammenführen{count}dateien",
- "remove_selected_tasks_title": "Sind Sie sicher, dass Sie ausgewählte Aufgaben entfernen möchten?",
- "remove_all_tasks_title": "Sind Sie sicher, dass Sie alle Aufgaben entfernen möchten?",
+ "remove_selected_tasks_title": "Sind Sie sicher, dass Sie die ausgew?hlten Aufgaben entfernen m?chten?",
+ "remove_all_tasks_title": "Sind Sie sicher, dass Sie alle Aufgaben entfernen m?chten?",
"delete_files_option": "Löschen von Dateien",
- "remove_selected_tasks_confirm": "Entfernen{count}aufgaben?",
+ "remove_selected_tasks_confirm": "{count} Aufgaben entfernen?",
"remove_all_tasks_confirm": "Alle Aufgaben entfernen?"
},
"features": {
@@ -175,7 +175,7 @@
"e2ee_title": "End-to-End-Verschlüsselung",
"e2ee_subtitle": "Verwalten Sie Ihren gemeinsamen Schlüssel für diesen Freund.",
"export_base64_button": "Ausfuhrbasis64",
- "import_base64_button": "Import Base64",
+ "import_base64_button": "Base64 importieren",
"invalid_key_size_32_bytes": "Ungültige Schlüsselgröße. Geben Sie einen 32-byte Schlüssel.",
"successfully_imported_key": "Schlüssel importiert erfolgreich.",
"failed_to_import_key": "Schlüssel nicht importiert:{message}",
@@ -187,7 +187,7 @@
"streaks_expiration_text": "Abzüge{eta}",
"streaks_expiration_text_expired": "Ausgenommen",
"reminder_button": "Zurück zur Übersicht",
- "delete_scope_confirm_dialog_title": "Sind Sie sicher, dass Sie eine löschen möchten{scope}?",
+ "delete_scope_confirm_dialog_title": "Sind Sie sicher, dass Sie {scope} l?schen m?chten?",
"notes_placeholder": "Klicken Sie auf eine Notiz hinzufügen"
},
"logged_stories": {
@@ -206,7 +206,7 @@
"save_selection_option": "Auswahl speichern",
"save_all_option": "Alle speichern",
"unsave_selection_option": "Auswahl nicht speichern",
- "unsave_all_option": "Unsave All",
+ "unsave_all_option": "Alles nicht speichern",
"mark_selection_as_seen_option": "Mark ausgewählt Snap als gesehen",
"mark_all_as_seen_option": "Markieren Sie alle Snaps wie gesehen",
"delete_selection_option": "Auswahl löschen",
@@ -220,7 +220,7 @@
"list_friend_format": "Freund{name}",
"list_group_format": "Gruppe{name}",
"no_more_messages": "Keine Nachrichten mehr",
- "reverse_order_checkbox": "Reverse Order",
+ "reverse_order_checkbox": "Reihenfolge umkehren",
"chat_attachment": "Anlage{index}",
"empty_message": "Freie Chatbotschaft",
"message_parse_failed": "Versäumte Nachricht",
@@ -245,14 +245,14 @@
"choose_location_button": "Wählen Sie einen Standort",
"manual_coordinates_hint": "Feinabstimmung der Koordinaten manuell.",
"saved_coordinates_subtitle": "Verwalten Sie Ihre gespeicherten Spoof-Standorte",
- "teleport_to_friend_button": "Teleport to Friend",
+ "teleport_to_friend_button": "Zu Freund teleportieren",
"spoof_location_toggle": "Standort des Spoof",
"suspend_location_updates": "Standort-Updates verhängen",
"saved_coordinates_title": "Gespeicherte Koordinaten",
"no_saved_coordinates_hint": "Keine gespeicherten Koordinaten",
"delete_dialog_title": "Gespeicherte Koordinaten löschen",
- "delete_dialog_message": "Sind Sie sicher, dass Sie diese gespeicherte Koordinaten löschen möchten?",
- "teleport_to_friend_title": "Teleport to Friend",
+ "delete_dialog_message": "Sind Sie sicher, dass Sie diese gespeicherte Koordinate l?schen m?chten?",
+ "teleport_to_friend_title": "Zu Freund teleportieren",
"search_bar": "Suche",
"no_friends_map": "Keine Freunde auf der Karte",
"no_friends_found": "Keine Freunde gefunden"
@@ -277,7 +277,7 @@
},
"reset_config": {
"title": "Zurück zur Übersicht",
- "content": "Sind Sie sicher, dass Sie die config zurücksetzen wollen?",
+ "content": "Sind Sie sicher, dass Sie die Konfiguration zur?cksetzen m?chten?",
"success_toast": "Zurücksetzen erfolgreich"
},
"quick_actions_dialog": {
@@ -285,8 +285,8 @@
"subtitle": "Zugriff auf Ihre Lieblingswerkzeuge schneller"
},
"export_config": {
- "title": "Export Sensitive Daten?",
- "content": "Möchten Sie die Config mit sensiblen Daten exportieren? (Sowie Ortskoordinaten, etc.)"
+ "title": "Sensible Daten exportieren?",
+ "content": "M?chten Sie die Konfiguration mit sensiblen Daten exportieren? (z. B. Standortkoordinaten usw.)"
},
"messaging_action": {
"title": "Wählen Sie Inhaltstypen zu verarbeiten",
@@ -347,9 +347,9 @@
"no_repos_added": "Keine Repositorys hinzugefügt",
"add_repo_button": "Repository hinzufügen",
"add_repo_dialog_title": "Repository hinzufügen",
- "repo_url_label": "Repository URL",
+ "repo_url_label": "Repository-URL",
"add_button": "Hinzufügen",
- "invalid_repo_title": "Invalid Repository",
+ "invalid_repo_title": "Ung?ltiges Repository",
"invalid_repo_error": "Dieses Repository fehlt den benötigten Daten.",
"repo_added_toast": "Repository hinzugefügt",
"add_repo_failed_toast": "Fehler beim Hinzufügen von Repository:{message}",
@@ -360,7 +360,7 @@
},
"friend_tracker": {
"rules_tab": "Regeln",
- "logs_tab": "Logs",
+ "logs_tab": "Protokolle",
"catalog_button": "Katalog",
"add_rule_button": "Artikel",
"import_button": "Einfuhr",
@@ -377,7 +377,7 @@
"no_logs_found": "Keine Protokolle gefunden",
"no_rules_found": "Keine Regeln gefunden",
"export_logs_dialog_title": "Exportprotokolle",
- "export_logs_dialog_confirm_text": "Logs mit aktuellen Filtern exportieren?",
+ "export_logs_dialog_confirm_text": "Protokolle mit aktuellen Filtern exportieren?",
"export_as_button": "Ausfuhr{type}",
"new_rule_title": "Neue Regel",
"edit_rule_title": "Artikel",
@@ -406,10 +406,10 @@
"cannot_save_rule_dialog_text": "Füllen Sie die fehlenden Felder aus, um diese Regel zu speichern.",
"duplicate_rule_name_dialog_title": "Duplikate Regelname",
"duplicate_rule_name_dialog_text": "Eine Regel mit diesem Namen existiert bereits. Such dir einen neuen Namen.",
- "discard_changes_dialog_title": "Änderungen deaktivieren?",
- "discard_changes_dialog_text": "Sie haben keine Änderungen. Sie ablenken?",
+ "discard_changes_dialog_title": "?nderungen verwerfen?",
+ "discard_changes_dialog_text": "Sie haben ungespeicherte ?nderungen. Verwerfen?",
"rule_subtitle": "Konfigurieren Sie Trigger und Scopes für diese Regel.",
- "discard_button": "Discard",
+ "discard_button": "Verwerfen",
"enabled_label": "Ermöglicht",
"disabled_label": "Behinderte",
"delete_rule_dialog_title": "Regel",
@@ -423,13 +423,13 @@
"export_dialog_title": "Ausfuhrregeln",
"bulk_export_button": "Ausfuhr",
"individual_export_button": "Einzelausfuhr",
- "reverse_order_checkbox": "Reverse Order",
+ "reverse_order_checkbox": "Reihenfolge umkehren",
"delete_logs_dialog_title": "Logs löschen",
"delete_logs_dialog_confirm_text": "Löschen Sie alle Protokolle, die den aktuellen Filtern entsprechen?",
"select_friends_groups_button": "Freunde / Gruppen auswählen"
},
"friend_tracker_export": {
- "title": "Export Friend Tracker",
+ "title": "Freund-Tracker exportieren",
"save_button": "Speichern",
"back_button_description": "Zurück",
"expand_button_description": "Kategorie erweitern oder zusammenbrechen",
@@ -453,9 +453,9 @@
"no_repos_added": "Keine Repositorys hinzugefügt",
"add_repo_button": "Repository hinzufügen",
"add_repo_dialog_title": "Repository hinzufügen",
- "repo_url_label": "Repository URL",
+ "repo_url_label": "Repository-URL",
"add_button": "Hinzufügen",
- "invalid_repo_title": "Invalid Repository",
+ "invalid_repo_title": "Ung?ltiges Repository",
"invalid_repo_error": "Dieses Repository fehlt den benötigten Daten.",
"repo_added_toast": "Repository hinzugefügt",
"add_repo_failed_toast": "Fehler beim Hinzufügen von Repository:{message}",
@@ -532,11 +532,11 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "Snaps automatisch ?ffnen",
"description": "Öffnet automatisch Snaps beim Empfang",
"options": {
"blacklist": "Ausschließen von Auto Open Snaps",
- "whitelist": "Auto Open Snaps"
+ "whitelist": "Snaps automatisch ?ffnen"
}
},
"hide_friend_feed": {
@@ -546,7 +546,7 @@
"name": "E2E Verschlüsselung verwenden"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "Unterhaltung anheften"
},
"exclude_message_logger": {
"name": "Ausschließen von Message Logger"
@@ -595,7 +595,7 @@
},
"actions": {
"clean_snapchat_cache": {
- "name": "Clean Snapchat Cache",
+ "name": "Snapchat-Cache leeren",
"description": "Reinigt den Snapchat Cache"
},
"manage_friend_list": {
@@ -607,15 +607,15 @@
"description": "Exportiert Konversationsnachrichten in eine JSON/HTML/TXT-Datei"
},
"export_memories": {
- "name": "Export Memories",
+ "name": "Memories exportieren",
"description": "Exportiert Speicher in eine ZIP-Datei"
},
"bulk_messaging_action": {
- "name": "Bulk Messaging Action",
+ "name": "Massen-Nachrichtenaktion",
"description": "Führt Operationen wie das Löschen von Freunden oder das Löschen von Gesprächen durch"
},
"regen_mappings": {
- "name": "Regenerate Mappings",
+ "name": "Zuordnungen neu erstellen",
"description": "Manuelle Mappings regenerieren"
},
"change_language": {
@@ -668,7 +668,7 @@
"auto_delete_sent_messages": "🗑️ Auto Löschen Sent-Nachrichten",
"mark_snaps_as_seen": "👀 Mark Snaps als gesehen",
"mark_stories_as_seen_locally": "👀 Mark Stories als lokal gesehen",
- "conversation_info": "👤 Conversation Info",
+ "conversation_info": "?? Gespr?chsinfo",
"e2e_encryption": "🔒 E2E Verschlüsselung verwenden",
"message_logger": "📝 Nachrichtenlogger",
"auto_read": "✅ Auto Lesen",
@@ -726,9 +726,9 @@
"speaking": "Apropos",
"chat_reaction": "DM-Reaktion",
"group_chat_reaction": "Gruppenreaktion",
- "initiate_audio": "Incoming Audio Call",
+ "initiate_audio": "Eingehender Audioanruf",
"abandon_audio": "Versäumter Audio-Anruf",
- "initiate_video": "Incoming Video Call",
+ "initiate_video": "Eingehender Videoanruf",
"abandon_video": "Vermisste Videoanruf",
"map_live_location": "Karte Live Standort"
},
@@ -786,13 +786,13 @@
"null": "Spuck nicht Quelle"
},
"custom_streaks_expiration_format": {
- "null": "System Default"
+ "null": "Systemstandard"
},
"preferred_transcription_lang": {
"null": "Snapchat Default verwenden"
},
"custom_emoji_font": {
- "null": "Default Emoji Font"
+ "null": "Standard-Emoji-Schriftart"
},
"custom_shared_library": {
"null": "Standardbibliothek verwenden"
@@ -833,18 +833,18 @@
"null": "Standard-Code"
},
"preset": {
- "null": "Default Preset"
+ "null": "Standard-Preset"
},
"app_appearance_override": {
"title": "Erscheinung"
},
"gallery_media_send_override": {
"always_ask": "Immer fragen",
- "ORIGINAL": "Original Media",
+ "ORIGINAL": "Originalmedien",
"NOTE": "Audionote",
"SNAP": "Schnapper",
"SAVEABLE_SNAP": "Speichern von Snap",
- "null": "Snapchat Default"
+ "null": "Snapchat-Standard"
},
"strip_media_metadata": {
"hide_caption_text": "Verstecken Caption Text",
@@ -875,7 +875,7 @@
"camera": "Kamera",
"discover": "Entdecken",
"spotlight": "Scheinwerfer",
- "null": "Snapchat Default"
+ "null": "Snapchat-Standard"
},
"spotlight_comments_username_icon": {
"user": "Benutzername Icon",
@@ -888,7 +888,7 @@
"null": "Automatische Übersetzung"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatisch"
},
"snapchat_plus": {
"not_subscribed": "Nicht angemeldet",
@@ -902,9 +902,9 @@
"null": "Fehler"
},
"old_bitmoji_selfie": {
- "2d": "2D Bitmoji",
- "3d": "3D Bitmoji",
- "null": "Default Bitmoji"
+ "2d": "2D-Bitmoji",
+ "3d": "3D-Bitmoji",
+ "null": "Standard-Bitmoji"
},
"disable_confirmation_dialogs": {
"erase_message": "Nachricht löschen",
@@ -1017,18 +1017,18 @@
},
"ai_response_style": {
"casual": "Lässig",
- "formal": "Formal",
+ "formal": "Formell",
"friendly": "Freundlichkeit",
"humorous": "Humorvoll",
"empathetic": "Empfängnis",
- "toxic": "Edgy",
+ "toxic": "Provokant",
"busy": "Beschäftigt"
},
"ai_temperature": {
"0.7": "Bilanziert (0.7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatisch",
"en": "Englisch",
"es": "Spanisch",
"fr": "Französisch",
@@ -1090,7 +1090,7 @@
"external_media_messages": "Externe Medien",
"voice_note_messages": "Sprachhinweise",
"sticker_messages": "Aufkleber",
- "tiny_snap_messages": "Tiny Snaps",
+ "tiny_snap_messages": "Mini-Snaps",
"map_reaction_messages": "Kartenreaktionen",
"half_swipes": "Halbschweine"
},
@@ -1151,7 +1151,7 @@
"description": "Verhindert, dass Ihr Standort aktualisiert wird"
},
"spoof_battery_level": {
- "name": "Spoof Battery Level",
+ "name": "Akkustand vort?uschen",
"description": "Läust den Batteriepegel Ihres Geräts auf der Karte\nWert muss zwischen 0 und 100 liegen"
},
"spoof_headphones": {
@@ -1255,7 +1255,7 @@
"description": "Stellt die Standardgeschwindigkeit für die Wiedergabe von Videos fest\nWert muss zwischen 0,1 und 4,0 liegen"
},
"video_playback_rate_slider": {
- "name": "Video Playback Rate Slider",
+ "name": "Regler f?r Video-Wiedergabegeschwindigkeit",
"description": "Fügt einen Slider im Kontextmenü der Oper hinzu, um die Videowiedergaberate zu ändern\nHinweis: Änderungen gelten nur für nachfolgende Videos"
},
"disable_google_play_dialogs": {
@@ -1263,7 +1263,7 @@
"description": "Verhindern Sie Google Play Services-Verfügbarkeitsdialoge von angezeigt werden"
},
"default_volume_controls": {
- "name": "Default Volume Controls",
+ "name": "Standard-Lautst?rkeregelung",
"description": "Erzwingt Snapchat, Systemvolumensteuerungen zu verwenden"
},
"disable_telecom_framework": {
@@ -1305,7 +1305,7 @@
"description": "Ermöglicht die gleichen Medien mehrfach heruntergeladen werden"
},
"merge_overlays": {
- "name": "Merge Overlays",
+ "name": "Overlays zusammenf?hren",
"description": "Kombiniert den Text und die Medien eines Snap in eine einzelne Datei"
},
"force_image_format": {
@@ -1349,11 +1349,11 @@
"description": "Setzen Sie den konstanten Ratefaktor für den Video-Encoder\nVon 0 bis 51 für libx264"
},
"video_bitrate": {
- "name": "Video Bitrate",
+ "name": "Video-Bitrate",
"description": "Setzen Sie die Videobitrate (kbps)"
},
"audio_bitrate": {
- "name": "Audio Bitrate",
+ "name": "Audio-Bitrate",
"description": "Einstellen der Audiobitrate (kbps)"
},
"custom_video_codec": {
@@ -1399,7 +1399,7 @@
"description": "Zeigt eine kleine Vorschau neben ungesehenen Snaps im Chat an"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Bootstrap-Override",
"description": "Überträgt Benutzeroberfläche Bootstrap Einstellungen",
"properties": {
"app_appearance": {
@@ -1407,13 +1407,13 @@
"description": "Setzt eine anhaltende Erscheinung"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "Startseite-Tab",
"description": "Übertreibt die Startkarte beim Öffnen von Snapchat"
}
}
},
"map_friend_nametags": {
- "name": "Enhanced Friend Map Nametags",
+ "name": "Erweiterte Freundkarten-Namensschilder",
"description": "Verbessert die Namensschilder von Freunden auf der Snapmap"
},
"prevent_message_list_auto_scroll": {
@@ -1445,7 +1445,7 @@
"description": "Wählen Sie aus, welche UI-Komponenten zu verstecken sind"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "Opera Media Schnellinfo",
"description": "Zeigt nützliche Informationen von Medien wie Erstellungsdatum im Kontextmenü Opera Viewer"
},
"old_bitmoji_selfie": {
@@ -1465,7 +1465,7 @@
"description": "Schließen Sie das Friend Feed Menü automatisch nach dem Drücken einer Einstelltaste"
},
"vertical_story_viewer": {
- "name": "Vertical Story Viewer",
+ "name": "Vertikaler Story-Viewer",
"description": "Ermöglicht den vertikalen Story Viewer für alle Geschichten"
},
"enable_friend_feed_menu_bar": {
@@ -1515,7 +1515,7 @@
"description": "Verhindert, dass jemand weiß, dass Sie ihre Geschichte neu beobachtet haben"
},
"hide_peek_a_peek": {
- "name": "Hide Peek-a-Peek",
+ "name": "Peek-a-Peek ausblenden",
"description": "Verhindert die Benachrichtigung von gesendet werden, wenn Sie halb schwipe in einen Chat"
},
"hide_bitmoji_presence": {
@@ -1539,11 +1539,11 @@
"description": "Fügt eine Schaltfläche hinzu, um einen Snap zu markieren, wie beim Betrachten gesehen.\nDies funktioniert auch, wenn Stealth-Modus aktiviert ist"
},
"skip_when_marking_as_seen": {
- "name": "Skip When Marking as Seen",
+ "name": "Beim Als-gesehen-Markieren ?berspringen",
"description": "Überspringen Sie automatisch zum nächsten Snap, wenn Sie einen Snap wie gesehen markieren.\nVerwendung in Kombination mit Mark Snap als Seen Button"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "Medienwiedergabe in Schleife",
"description": "Loops Medienwiedergabe beim Anzeigen von Snaps / Stories"
},
"disable_replay_in_ff": {
@@ -1707,7 +1707,7 @@
"description": "Wählen Sie, wie Galeriemedien gesendet werden"
},
"include_camera_snaps": {
- "name": "Include Camera Snaps",
+ "name": "Kamera-Snaps einbeziehen",
"description": "Zeigen Sie auch den Override Dialog für Kamera Snaps"
}
}
@@ -1729,7 +1729,7 @@
"description": "Erlauben Sie, Gruppeninformationen nach dem Kick zu sehen"
},
"double_tap_chat_action": {
- "name": "Double Tap Chat Action",
+ "name": "Doppeltippen-Chat-Aktion",
"description": "Führen Sie eine benutzerdefinierte Aktion, wenn Sie eine Nachricht im Chat doppelt tippen"
},
"double_tap_chat_action_custom_emoji": {
@@ -1761,7 +1761,7 @@
"description": "Verwenden Sie KI, um intelligente Auto-Replies anstelle von Template-Nachrichten zu generieren"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "KI-Anbieter",
"description": "Wählen Sie aus, welchen KI-Dienst zur Generierung von Antworten verwendet wird"
},
"ai_endpoint_url": {
@@ -1777,11 +1777,11 @@
"description": "API-Schlüssel zur Authentifizierung mit dem AI-Service"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "KI-System-Prompt",
"description": "Systemaufforderung, die die Persönlichkeit und das Verhalten der KI definiert"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "KI-Max.-Tokens",
"description": "Maximale Anzahl von Token (Worte) kann die KI in Antworten verwenden"
},
"ai_temperature": {
@@ -1817,11 +1817,11 @@
"description": "Verwenden Sie Template-Nachrichten, wenn KI eine Antwort nicht generiert"
},
"ai_request_timeout": {
- "name": "AI Request Timeout",
+ "name": "KI-Anfrage-Timeout",
"description": "Maximale Zeit, um auf KI-Antwort zu warten (in Sekunden)"
},
"ai_retry_attempts": {
- "name": "AI Retry Attempts",
+ "name": "KI-Wiederholungsversuche",
"description": "Anzahl der Zeiten, um KI-Anforderungen wiederherzustellen, wenn sie scheitern"
}
}
@@ -1895,11 +1895,11 @@
"description": "Ermöglicht Auto Open Snaps im Hintergrund laufen. Anmerkung: Dies wird Ihren Akku deutlich entleeren"
},
"min_delay": {
- "name": "Min Delay (ms)",
+ "name": "Min. Verz?gerung (ms)",
"description": "Mindestverzögerung in Millisekunden vor dem Öffnen eines Schnapps"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Max. Verz?gerung (ms)",
"description": "Maximale Verzögerung in Millisekunden vor dem Öffnen eines Schnapps"
},
"queue_size": {
@@ -1907,11 +1907,11 @@
"description": "Maximale Anzahl der Snaps in Warteschlange zu halten"
},
"retry_attempts": {
- "name": "Retry Attempts",
+ "name": "Wiederholungsversuche",
"description": "Anzahl der Zeiten, um einen Snap zu öffnen, wenn es versagt"
},
"retry_delay": {
- "name": "Retry Delay (ms)",
+ "name": "Wiederholungsverz?gerung (ms)",
"description": "Verzögerung in Millisekunden zwischen Retry-Ansätzen"
}
}
@@ -2068,7 +2068,7 @@
"description": "Setzt eine benutzerdefinierte Kameraauflösung, Breite x Höhe (z.B. 1920x1080).\nDie benutzerdefinierte Auflösung muss von Ihrem Gerät unterstützt werden"
},
"front_custom_frame_rate": {
- "name": "Front Custom Frame Rate",
+ "name": "Benutzerdefinierte Front-Bildrate",
"description": "Übertreibt die vordere Kamera-Rahmenrate"
},
"back_custom_frame_rate": {
@@ -2076,7 +2076,7 @@
"description": "Übertreibt die Rückfahrkamera-Rahmenrate"
},
"force_camera_source_encoding": {
- "name": "Force Camera Source Encoding",
+ "name": "Kameraquellenkodierung erzwingen",
"description": "Erzwingt die Kameraquellencodierung"
},
"startup_default_camera": {
@@ -2090,7 +2090,7 @@
}
},
"streaks_reminder": {
- "name": "Streaks Reminder",
+ "name": "Streaks-Erinnerung",
"description": "Benachrichtigt Sie regelmäßig über Ihre Streaks",
"properties": {
"interval": {
@@ -2132,11 +2132,11 @@
"description": "Gibt mehr Optionen für den selbstzerstörenden Timer beim Senden eines Snap"
},
"composer_console": {
- "name": "Composer Console",
+ "name": "Composer-Konsole",
"description": "Ermöglicht die Ausführung von JavaScript-Code in Composer (nur arm64)"
},
"composer_logs": {
- "name": "Composer Logs",
+ "name": "Composer-Logs",
"description": "Redirects Konsolenprotokolle von Composer zu PurrfectSnap"
}
}
@@ -2176,11 +2176,11 @@
"description": "Kraftverkehr zum Bericht WLAN statt mobiler Daten"
},
"spoof_device_id": {
- "name": "Spoof Device ID",
+ "name": "Ger?te-ID spoofen",
"description": "Überschreiben Sie die Android-ID an Snapchat gesendet",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Android-ID spoofen",
"description": "Überschreiben Sie die Android-ID an Snapchat mit einem benutzerdefinierten Wert"
},
"custom_android_id": {
@@ -2204,7 +2204,7 @@
"description": "Konvertiert Snaps, um externe Medien lokal zu chatten. Dies erscheint im Kontextmenü des Chat-Downloads"
},
"media_file_picker": {
- "name": "Media File Picker",
+ "name": "Medien-Dateiauswahl",
"description": "Erlaubt Ihnen, jede Video/Audio-Datei aus der Galerie auszuwählen"
},
"story_logger": {
@@ -2244,7 +2244,7 @@
}
},
"voice_note_auto_play": {
- "name": "Voice Note Auto Play",
+ "name": "Sprachnotizen automatisch abspielen",
"description": "Spielt automatisch die nächste Sprachnote, nachdem die aktuelle beendet ist"
},
"friend_notes": {
@@ -2260,7 +2260,7 @@
"description": "Versuchen Sie, das Friend Feed Menü zu reparieren, als wenn das Gerät offline ist, kann es nicht korrekt angezeigt werden"
},
"app_lock": {
- "name": "App Lock",
+ "name": "App-Sperre",
"description": "Verhindert Zugriff auf Snapchat ohne Passcode",
"properties": {
"lock_on_resume": {
@@ -2270,7 +2270,7 @@
}
},
"infinite_story_boost": {
- "name": "Infinite Story Boost",
+ "name": "Unendlicher Story-Boost",
"description": "Bypass the Story Boost Limit Verzögerung"
},
"meo_passcode_bypass": {
@@ -2278,7 +2278,7 @@
"description": "Bypass the My Eyes Nur Passcode\nDies funktioniert nur, wenn der Passcode korrekt eingegeben wurde, bevor"
},
"no_friend_score_delay": {
- "name": "No Friend Score Delay",
+ "name": "Keine Freundes-Score-Verz?gerung",
"description": "Entfernt die Verzögerung beim Betrachten eines Friends Score"
},
"best_friend_pinning": {
@@ -2301,10 +2301,10 @@
},
"add_friend_source_spoof": {
"name": "Friend Source Spoof",
- "description": "Spoofs the source of a Friend Request"
+ "description": "Spooft die Quelle einer Freundschaftsanfrage"
},
"hidden_snapchat_plus_features": {
- "name": "Hidden Snapchat Plus Features",
+ "name": "Versteckte Snapchat-Plus-Funktionen",
"description": "Ermöglicht unveröffentlichte / Beta Snapchat Plus Funktionen\nVielleicht nicht auf älteren Snapchat-Versionen arbeiten"
},
"custom_streaks_expiration_format": {
@@ -2451,11 +2451,11 @@
},
"gallery_media_send_override": {
"always_ask": "Immer fragen",
- "ORIGINAL": "Original Media",
+ "ORIGINAL": "Originalmedien",
"NOTE": "Audionote",
"SNAP": "Schnapper",
"SAVEABLE_SNAP": "Speichern von Snap",
- "null": "Snapchat Default",
+ "null": "Snapchat-Standard",
"multiple_media_toast": "Sie können nur eine Medien zu einer Zeit senden"
},
"mark_as_seen": {
@@ -2500,7 +2500,7 @@
"following": "Folgen",
"suggested": "Vorschlag",
"incoming": "Einkommen",
- "incoming_follower": "Incoming Follower"
+ "incoming_follower": "Eingehender Follower"
},
"bulk_messaging_action": {
"actions.title": "Maßnahmen",
@@ -2508,14 +2508,14 @@
"progress_status": "Verarbeitung{index}von{total}",
"selection_dialog_continue_button": "Fortsetzung",
"confirmation_dialog": {
- "title": "Bist du sicher?",
+ "title": "Sind Sie sicher?",
"message": "Dies wird alle ausgewählten Auswirkungen haben. Diese Aktion kann nicht rückgängig gemacht werden."
},
"actions": {
"remove_friends": "Freunde entfernen",
"clear_conversations": "Klare Konversationen",
"clear_friend_feed": "Klarer Freund Feed ({count})",
- "unfollow": "Unfollow",
+ "unfollow": "Nicht mehr folgen",
"remove": "Entfernen"
},
"leave_groups": "Weg{count}gruppen",
@@ -2599,12 +2599,12 @@
"open": "Öffnen",
"download": "Downloads",
"send": "Bitte",
- "restore_original": "Restore Original",
+ "restore_original": "Original wiederherstellen",
"convert_external_media": "Externe Medien umrechnen"
},
"tracker_events": {
"conversation_enter": "Konversation eingeben",
- "conversation_exit": "Conversation Exit",
+ "conversation_exit": "Unterhaltung verlassen",
"started_typing": "Gestartet Typing",
"stopped_typing": "Gestoppte Typisierung",
"started_speaking": "Gestartet Apropos",
@@ -2619,10 +2619,10 @@
"message_reaction_add": "Nachrichtenreaktion Hinzufügen",
"message_reaction_remove": "Nachricht Reaction Entfernen",
"snap_opened": "Snap geöffnet",
- "snap_replayed": "Snap Replayed",
- "snap_replayed_twice": "Snap Replayed Twice",
- "snap_screenshot": "Snap Screenshot",
- "snap_screen_record": "Snap Screen Record",
+ "snap_replayed": "Snap erneut abgespielt",
+ "snap_replayed_twice": "Snap zweimal erneut abgespielt",
+ "snap_screenshot": "Snap-Screenshot",
+ "snap_screen_record": "Snap-Bildschirmaufnahme",
"i_can_see_you": "Ich kann dich sehen"
},
"cleared_from_feed": "Vom Futter befreit",
@@ -2646,8 +2646,8 @@
"background_option": "Hintergrund"
},
"call_start_confirmation": {
- "dialog_title": "Start Call",
- "dialog_message": "Willst du sicher einen Anruf starten?"
+ "dialog_title": "Anruf starten",
+ "dialog_message": "Sind Sie sicher, dass Sie einen Anruf starten m?chten?"
},
"half_swipe_notifier": {
"notification_channel_name": "Halbschwein",
@@ -2661,7 +2661,7 @@
"gif": "GIF",
"external_media": "Externe Medien",
"note": "Anmerkung",
- "original_story": "Original Story"
+ "original_story": "Original-Story"
},
"select_attachments_title": "Anhänge auswählen",
"download_started_toast": "Download gestartet",
@@ -2701,8 +2701,8 @@
},
"confirmation_dialogs": {
"title": "End-to-End-Verschlüsselung",
- "confirmation_1": "WARNING: Dies wird Ihren vorhandenen Schlüssel überschreiben. Sie werden den Zugriff auf alle verschlüsselten Nachrichten von diesem Freund verlieren. Bist du sicher, dass du weitermachen willst?",
- "confirmation_2": "Bist du sicher, dass du weitermachen willst? Das ist deine letzte Chance."
+ "confirmation_1": "WARNUNG: Dadurch wird Ihr vorhandener Schl?ssel ?berschrieben. Sie verlieren den Zugriff auf alle verschl?sselten Nachrichten von diesem Freund. Sind Sie sicher, dass Sie fortfahren m?chten?",
+ "confirmation_2": "Sind Sie wirklich sicher, dass Sie fortfahren m?chten? Dies ist Ihre letzte Chance, abzubrechen."
},
"unencrypted_conversation_send_failure_toast": "Sie können verschlüsselte Inhalte nicht an verschlüsselte und unverschlüsselte Gespräche senden!",
"native_hooks_send_failure_toast": "Nicht zu senden! Bitte aktivieren Sie Native Hooks in den Einstellungen.",
@@ -2720,13 +2720,13 @@
"incoming_secret_message": "Dein Freund hat deinen öffentlichen Schlüssel akzeptiert. Klicken Sie unten, um das Geheimnis zu akzeptieren."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
- "priority_title": "Auto Open Snaps (Priority)",
+ "title": "Snaps automatisch ?ffnen",
+ "priority_title": "Snaps automatisch ?ffnen (Priorit?t)",
"error_title": "Auto Open Snaps (Fehler)",
"channel_description": "Notifications for auto-opening Snaps queue status",
"priority_channel_description": "Hohe Prioritätsmeldungen für Auto-Öffnungs-Snaps",
"error_channel_description": "Fehlerbenachrichtigungen, wenn Auto-Öffnung Snaps ausfällt",
- "paused_status": "Auto Open Snaps paused",
+ "paused_status": "Snaps automatisch ?ffnen pausiert",
"processing_status": "Verarbeitung von Schnappern:{queued}in warteschlange,{processed}verarbeitet",
"monitor_status": "Überwachung...",
"recent_snaps": "Neueste Snaps",
@@ -2735,7 +2735,7 @@
"action_clear": "Löschen Sie Ihre Suche",
"action_reset": "Zurück zur Übersicht",
"error_content": "Nicht zu öffnen Snap von{sender}:{error}",
- "resumed_feedback": "Auto Open Resumed",
+ "resumed_feedback": "Automatisches ?ffnen fortgesetzt",
"paused_feedback": "Auto öffnen Pausen",
"resumed_message": "Die Verarbeitung wird automatisch für Queued Snaps fortgesetzt",
"paused_message": "Verarbeitung pausiert. Warteschlangen ({count}schnapper)",
@@ -2759,16 +2759,16 @@
"notification_statistics": "STATISTIK",
"notification_queue_size": "Suchgröße",
"notification_total_opened": "Gesamt Snaps geöffnet",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "WARTESCHLANGE-VORSCHAU",
"notification_processing_continue": "Die Verarbeitung wird automatisch fortgesetzt...",
"notification_no_snaps_queue": "Keine Momente.",
"notification_queue_cleared_opened": "Gelöschte Queue ({opened}geöffnet)",
"content_type_photo_video_snap": "Foto/Video Snap",
"conversation_type_group_with_name": "Gruppe:{name}",
- "delete_logs_title": "Logs löschen?",
+ "delete_logs_title": "Protokolle l?schen?",
"delete_logs_progress": "Löschung{count}logs...",
"delete_logs_description": "Dies wird Protokolle basierend auf dem aktuellen Filter und der Suchanfrage löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
- "export_logs_title": "Logs exportieren?",
+ "export_logs_title": "Protokolle exportieren?",
"export_logs_progress": "Logs exportieren...",
"export_logs_description": "Dies exportiert Protokolle basierend auf dem aktuellen Filter und der Suchanfrage.",
"export_logs_as": "Ausfuhr{type}",
@@ -2830,7 +2830,7 @@
"i_can_see_you": "{friend}tätigkeit{conversation}:{details}"
},
"friend_mutation_observer": {
- "notification_channel_name": "Friend Mutation Observer",
+ "notification_channel_name": "Freund-?nderungsbeobachter",
"friend_removed": "{username}hat dich als freund entfernt",
"birthday_removed": "{username}hat ihren geburtstag entfernt ({birthday})",
"birthday_added": "{username}hat ihren geburtstag hinzugefügt ({birthday})",
@@ -2921,7 +2921,7 @@
},
"tracker": {
"tabs": {
- "logs": "Logs",
+ "logs": "Protokolle",
"rules": "Regeln"
},
"actions": {
@@ -2996,7 +2996,7 @@
"i_can_see_you_entered": "Eingetragen",
"i_can_see_you_left": "Links",
"i_can_see_you_duration": "Dauer",
- "i_can_see_you_not_available": "N/A",
+ "i_can_see_you_not_available": "k. A.",
"i_can_see_you_unit_hour": "h",
"i_can_see_you_unit_minute": "m",
"i_can_see_you_unit_second": "s",
@@ -3078,7 +3078,7 @@
"theme_mode_system": "System",
"theme_mode_light": "Licht",
"theme_mode_dark": "Dunkel",
- "test_mode_label": "Enable PurrAura",
+ "test_mode_label": "PurrAura aktivieren",
"disable_feature_loading_label": "Deaktivieren der Funktion",
"disable_auto_mapper_label": "Auto Mapper deaktivieren",
"disable_bypass_indicator_label": "Bypass Indikator deaktivieren",
@@ -3095,7 +3095,7 @@
"date_range": "Datumsbereich",
"select": "Wählen",
"sort_by_folder": "Sortieren nach Ordner",
- "include_my_eyes_only": "Include My Eyes Only",
+ "include_my_eyes_only": "My Eyes Only einschlie?en",
"cancel": "Abbrechen",
"export": "Ausfuhr",
"quit": "Quitten",
@@ -3158,7 +3158,7 @@
"failed_to_get_file": "Nicht verfügbar",
"download_button": "Downloads",
"chat_attachment": "Anlage{index}",
- "log_header_format": "{username}?{type}?{date}",
+ "log_header_format": "{username} ? {type} ? {date}",
"edited_at_text": "Bearbeitet auf \"{message}\"{date}",
"list_group_format": "Gruppe{name}",
"list_friend_format": "Freund{name}",
@@ -3170,7 +3170,7 @@
},
"debug_dialogs": {
"info": "Info",
- "refs": "Refs",
+ "refs": "Referenzen",
"arroyo": "Arroyo",
"message": "Nachricht",
"media_references": "Medienberichte",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/es_ES.json b/common/src/main/assets/lang/es_ES.json
index 19aae8a3..a1c0740e 100644
--- a/common/src/main/assets/lang/es_ES.json
+++ b/common/src/main/assets/lang/es_ES.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Seleccionar idioma",
@@ -27,14 +27,14 @@
"tasks": "Tareas",
"features": "Características",
"manage_rule_feature": "Función de la regla de gestión",
- "home": "Home",
+ "home": "Inicio",
"home_about": "Acerca de",
"home_settings": "Ajustes",
- "home_logs": "Logs",
+ "home_logs": "Registros",
"logger_history": "Historia del Logger",
"logged_stories": "Historias cargadas",
"friend_tracker": "Amigo Tracker",
- "friend_tracker_catalog": "Friend Tracker Catalog",
+ "friend_tracker_catalog": "Cat?logo de seguimiento de amigos",
"manage_friend_tracker_repos": "Manage Friend Tracker Repositorios",
"edit_rule": "Edición",
"file_imports": "Importaciones de archivos",
@@ -48,17 +48,17 @@
"better_location": "Mejor ubicación"
},
"navigation": {
- "customize_bottom_bar_title": "Customize Bottom Bar",
+ "customize_bottom_bar_title": "Personalizar barra inferior",
"customize_bottom_bar_subtitle": "Escoge qué pestañas muestran en tu pantalla de inicio",
"available_tabs_title": "Tabs disponibles",
- "shown_tabs_title": "Shown Tabs",
- "reset_button": "Reset",
+ "shown_tabs_title": "Pesta?as mostradas",
+ "reset_button": "Restablecer",
"done_button": "Hecho"
},
"sections": {
"home": {
"version_title": "v{versionName}· por Eterno",
- "update_title": "PurrfectSnap Update",
+ "update_title": "Actualizaci?n de PurrfectSnap",
"update_content": "Versión{version}está disponible!",
"update_button": "Descargar",
"debug_build_summary_title": "Estás ejecutando una construcción depuradora de PurrfectSnap",
@@ -69,30 +69,30 @@
"home_logs": {
"no_logs_hint": "No hay registros disponibles",
"clear_logs_button": "Registros claros",
- "export_logs_button": "Export Logs",
+ "export_logs_button": "Exportar registros",
"saving_logs_toast": "Registros de ahorro, esto puede tomar un tiempo ...",
"saved_logs_success_toast": "Logros guardados con éxito",
- "saved_logs_failure_toast": "Failed to save logs"
+ "saved_logs_failure_toast": "No se pudieron guardar los registros"
},
"home_settings": {
"actions_title": "Acciones",
"message_logger_title": "Mensaje Logger",
- "debug_title": "Debug",
+ "debug_title": "Depurar",
"success_toast": "¡Hecho!",
"message_logger_summary": "{messageCount}mensajes\n{storyCount}cuentos",
"export_button": "Exportación",
"clear_button": "Despejado",
"view_logger_history_button": "Ver historia de Logger",
- "ui_settings_title": "UI Settings",
- "haptic_feedback_label": "Haptic Feedback",
+ "ui_settings_title": "Ajustes de IU",
+ "haptic_feedback_label": "Respuesta h?ptica",
"use_system_toasts_label": "Use Toasts del sistema",
"updates_title": "Actualizaciones",
"auto_update_check": "Control de actualización automática",
"update_check_frequency_daily": "Diario",
"update_check_frequency_weekly": "Semanal",
"update_check_frequency_monthly": "Mensual",
- "update_channel_stable": "Stable",
- "update_channel_prerelease": "Pre-release",
+ "update_channel_stable": "Estable",
+ "update_channel_prerelease": "Prelanzamiento",
"update_notification_channel_name": "Actualizaciones",
"update_notification_channel_description": "Obsérvese notificado cuando hay nuevos lanzamientos disponibles",
"update_notification_title": "Nueva actualización disponible",
@@ -110,21 +110,21 @@
"backup_button": "Copia de seguridad",
"restore_button": "Restauración",
"view_button": "Ver",
- "customize_bottom_bar_title": "Customize Bottom Bar",
+ "customize_bottom_bar_title": "Personalizar barra inferior",
"customize_bottom_bar_subtitle": "Escoge qué pestañas muestran en tu pantalla de inicio",
"available_tabs_title": "Tabs disponibles",
- "reset_button": "Reset",
+ "reset_button": "Restablecer",
"done_button": "Hecho",
- "clear_friend_feed": "Clear Friend Feed",
- "test_mode_label": "Enable PurrAura",
+ "clear_friend_feed": "Limpiar feed de amigos",
+ "test_mode_label": "Activar PurrAura",
"disable_feature_loading_label": "Carga desactivada",
"disable_auto_mapper_label": "Desactivado Auto Mapper",
"disable_bypass_indicator_label": "Indicador de bypass deshabilitado"
},
"tasks": {
"no_tasks": "Sin tareas",
- "merge_button": "Merge",
- "failed_to_open_file": "Failed to open file",
+ "merge_button": "Combinar",
+ "failed_to_open_file": "No se pudo abrir el archivo",
"merge_files_toast": "Fusión{count}archivos",
"remove_selected_tasks_title": "¿Estás seguro de que quieres eliminar tareas seleccionadas?",
"remove_all_tasks_title": "¿Estás seguro de que quieres eliminar todas las tareas?",
@@ -136,7 +136,7 @@
"disabled": "Discapacitados",
"export_option": "Exportación",
"import_option": "Importación",
- "reset_option": "Reset",
+ "reset_option": "Restablecer",
"config_export_success_toast": "Config exportado con éxito",
"config_import_success_toast": "Config importado con éxito",
"config_import_failure_toast": "Failed to import config{error}",
@@ -171,7 +171,7 @@
"social_empty_hint": "Pulse el botón + para sincronizar amigos o grupos."
},
"manage_scope": {
- "logged_stories_button": "Show Logged Stories",
+ "logged_stories_button": "Mostrar historias registradas",
"e2ee_title": "Encriptación de extremo a extremo",
"e2ee_subtitle": "Administra tu llave compartida para este amigo.",
"export_base64_button": "Base de exportación64",
@@ -182,16 +182,16 @@
"rules_title": "Reglas",
"participants_text": "{count}participantes",
"not_found": "No se encontró",
- "streaks_title": "Streaks",
+ "streaks_title": "Rachas",
"streaks_length_text": "Duración:{length}",
"streaks_expiration_text": "Excursiones en{eta}",
"streaks_expiration_text_expired": "Gastos",
- "reminder_button": "Set Reminder",
+ "reminder_button": "Configurar recordatorio",
"delete_scope_confirm_dialog_title": "¿Estás seguro de que quieres eliminar un{scope}?",
"notes_placeholder": "Haga clic para añadir una nota"
},
"logged_stories": {
- "story_failed_to_load": "Failed to load",
+ "story_failed_to_load": "No se pudo cargar",
"no_stories": "No hay historias encontradas",
"save_from_cache_button": "Guardar de Cache"
},
@@ -202,7 +202,7 @@
"message_fetch_failed": "Failed para buscar mensajes",
"no_message_hint": "No mensaje",
"subtitle": "Sostener para seleccionar",
- "actions_title": "Conversation Actions",
+ "actions_title": "Acciones de conversaci?n",
"save_selection_option": "Guardar la selección",
"save_all_option": "Guardar todo",
"unsave_selection_option": "Selección desave",
@@ -223,8 +223,8 @@
"reverse_order_checkbox": "Orden inversa",
"chat_attachment": "Adjunción{index}",
"empty_message": "Mensaje de chat vacío",
- "message_parse_failed": "Failed to parse message",
- "unknown_sender": "Unknown Sender",
+ "message_parse_failed": "No se pudo analizar el mensaje",
+ "unknown_sender": "Remitente desconocido",
"download_attachment_failed_toast": "Fallado para descargar el adjunto"
},
"file_imports": {
@@ -232,7 +232,7 @@
"file_not_found": "Archivo no encontrado",
"file_import_failed": "Failed to import file:{error}",
"file_imported": "Archivo importado con éxito",
- "file_delete_failed": "Failed to delete file",
+ "file_delete_failed": "No se pudo eliminar el archivo",
"no_files_hint": "Aquí puede importar archivos para su uso en Snapchat. Presione el botón de abajo para importar un archivo."
},
"better_location": {
@@ -250,7 +250,7 @@
"suspend_location_updates": "Actualizaciones de ubicación suspendidas",
"saved_coordinates_title": "Coordinaciones salvadas",
"no_saved_coordinates_hint": "No hay coordenadas guardadas",
- "delete_dialog_title": "Delete Saved Coordinate",
+ "delete_dialog_title": "Eliminar coordenada guardada",
"delete_dialog_message": "¿Estás seguro de querer borrar esta coordenadas guardada?",
"teleport_to_friend_title": "Teleport a Amigo",
"search_bar": "Búsqueda",
@@ -266,7 +266,7 @@
"category_groups": "Grupos",
"category_friends": "Amigos",
"participants_text": "{count}participantes",
- "unselect_all_button": "Unselect All"
+ "unselect_all_button": "Deseleccionar todo"
},
"scripting": {
"repo_hint": "Pruebe una URL del repositorio"
@@ -276,7 +276,7 @@
"content": "PurrfectSnap incluye una herramienta de scripting, permitiendo la ejecución de código definido por el usuario en su dispositivo. Utilice extrema precaución y sólo instalar módulos de fuentes conocidas y fiables. Los módulos no autorizados o no verificados pueden plantear riesgos de seguridad a su sistema."
},
"reset_config": {
- "title": "Reset config",
+ "title": "Restablecer configuraci?n",
"content": "¿Estás seguro de que quieres restablecer el config?",
"success_toast": "Config reset con éxito"
},
@@ -285,7 +285,7 @@
"subtitle": "Accede a tus herramientas favoritas más rápido"
},
"export_config": {
- "title": "Export Sensitive Data?",
+ "title": "?Exportar datos sensibles?",
"content": "¿Quieres exportar el config con datos sensibles? (Como coordenadas de ubicación, etc.)"
},
"messaging_action": {
@@ -302,10 +302,10 @@
"actions_title": "Acciones",
"catalog_tab": "Catálogo",
"clear_module_data_button": "Datos claros",
- "clear_module_data_failed": "Failed to clear module data",
+ "clear_module_data_failed": "No se pudieron borrar los datos del m?dulo",
"delete_module_button": "Suprimir",
- "delete_module_failed": "Failed to delete module",
- "documentation_button": "Docs",
+ "delete_module_failed": "No se pudo eliminar el m?dulo",
+ "documentation_button": "Documentaci?n",
"download_script_failed": "Failed para descargar script",
"downloading_script": "Descargar script...",
"edit_module_button": "Editar",
@@ -322,13 +322,13 @@
"no_scripts_folder_selected_title": "Seleccione la carpeta de scripts para empezar",
"no_scripts_found_title": "No hay scripts encontrados",
"no_settings_for_module": "Este módulo no tiene ninguna configuración",
- "open_module_failed": "Failed to open module file",
+ "open_module_failed": "No se pudo abrir el archivo del m?dulo",
"open_scripts_folder_button": "Carpeta de scripts abiertos",
"script_already_installed": "Script ya instalado",
"select_folder_button": "Elija la carpeta",
"select_scripts_folder_toast": "Por favor seleccione una carpeta de scripts primero",
"update_module_button": "Módulo de actualización",
- "update_module_failed": "Failed to update module",
+ "update_module_failed": "No se pudo actualizar el m?dulo",
"use_catalog_to_add_scripts": "Utilice el catálogo para agregar scripts",
"ok_button_timeout": "OK{timeout}",
"catalog": {
@@ -360,9 +360,9 @@
},
"friend_tracker": {
"rules_tab": "Reglas",
- "logs_tab": "Logs",
+ "logs_tab": "Registros",
"catalog_button": "Catálogo",
- "add_rule_button": "Add Rule",
+ "add_rule_button": "Agregar regla",
"import_button": "Importación",
"filters_title": "Filtros",
"search_by_label": "Búsqueda por",
@@ -376,7 +376,7 @@
"search_placeholder": "Búsqueda",
"no_logs_found": "No hay registros encontrados",
"no_rules_found": "No hay reglas encontradas",
- "export_logs_dialog_title": "Export Logs",
+ "export_logs_dialog_title": "Exportar registros",
"export_logs_dialog_confirm_text": "Exportar registros usando filtros actuales?",
"export_as_button": "Exportación{type}",
"new_rule_title": "Nueva regla",
@@ -386,7 +386,7 @@
"default_rule_name": "Nueva regla",
"author_name_label": "Autor",
"scope_section_title": "Ámbito",
- "scope_all": "All Friends/Groups",
+ "scope_all": "Todos los amigos/grupos",
"scope_whitelist": "Nadie excepto",
"scope_blacklist": "Todos excepto",
"events_section_title": "Eventos",
@@ -394,7 +394,7 @@
"no_events_text": "No se han añadido aún",
"add_event_dialog_title": "Agregar evento",
"event_type_label": "Tipo de evento",
- "triggers_title": "Triggers",
+ "triggers_title": "Disparadores",
"conditions_title": "Condiciones",
"condition_only_inside_conversation": "Sólo cuando estoy dentro de la conversación",
"condition_only_outside_conversation": "Sólo cuando estoy fuera de la conversación",
@@ -410,7 +410,7 @@
"discard_changes_dialog_text": "Tienes cambios sin salvar. ¿Desvelarlos?",
"rule_subtitle": "Configure disparadores y alcances para esta regla.",
"discard_button": "Divulgación",
- "enabled_label": "Enabled",
+ "enabled_label": "Habilitado",
"disabled_label": "Discapacitados",
"delete_rule_dialog_title": "Artículo",
"delete_rule_dialog_text": "¿Seguro que quieres borrar esta regla?",
@@ -429,7 +429,7 @@
"select_friends_groups_button": "Seleccionar amigos / grupos"
},
"friend_tracker_export": {
- "title": "Export Friend Tracker",
+ "title": "Exportar seguimiento de amigos",
"save_button": "Guardar",
"back_button_description": "Vuelve",
"expand_button_description": "Ampliar o colapsar la categoría",
@@ -441,11 +441,11 @@
"confirm_button": "Importación",
"back_button_description": "Vuelve",
"expand_button_description": "Ampliar o colapsar la categoría",
- "imported_toast": "Tracker imported",
+ "imported_toast": "Seguimiento importado",
"import_failed_toast": "Failed to import tracker:{message}"
},
"friend_tracker_catalog": {
- "title": "Friend Tracker Catalog",
+ "title": "Cat?logo de seguimiento de amigos",
"no_repos_added": "No hay repositorios añadidos",
"manage_repos_description": "Administrar repositorios"
},
@@ -468,22 +468,22 @@
},
"features": {
"config_export": {
- "title": "Export Config Summary",
+ "title": "Exportar resumen de configuraci?n",
"back_button_description": "Vuelve",
"save_button": "Guardar",
"expand_button_description": "Ampliar o colapsar la categoría",
- "enabled": "Enabled",
+ "enabled": "Habilitado",
"disabled": "Discapacitados",
- "enable_feature": "Enable Feature"
+ "enable_feature": "Habilitar funci?n"
},
"config_import": {
"title": "Importar Config Summary",
"back_button_description": "Vuelve",
"confirm_button": "Importación",
"expand_button_description": "Ampliar o colapsar la categoría",
- "enabled": "Enabled",
+ "enabled": "Habilitado",
"disabled": "Discapacitados",
- "enable_feature": "Enable Feature",
+ "enable_feature": "Habilitar funci?n",
"config_imported_toast": "Config importado con éxito",
"config_import_failure_toast": "Failed to import config{error}"
}
@@ -504,7 +504,7 @@
"description": "Descarga automática Snaps al verlos",
"options": {
"blacklist": "Exclude de Auto Download",
- "whitelist": "Auto Download"
+ "whitelist": "Descarga autom?tica"
}
},
"stealth": {
@@ -532,21 +532,21 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "Abrir Snaps autom?ticamente",
"description": "Abre automáticamente Snaps cuando los recibe",
"options": {
"blacklist": "Exclusión de los ajustes de apertura automática",
- "whitelist": "Auto Open Snaps"
+ "whitelist": "Abrir Snaps autom?ticamente"
}
},
"hide_friend_feed": {
"name": "Ocultar de Amigo Feed"
},
"e2e_encryption": {
- "name": "Use E2E Encryption"
+ "name": "Usar cifrado E2E"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "Fijar conversaci?n"
},
"exclude_message_logger": {
"name": "Exclusión del registrador de mensajes"
@@ -584,10 +584,10 @@
}
},
"hide_typing_indicator": {
- "name": "Hide Typing Indicator",
+ "name": "Ocultar indicador de escritura",
"description": "Evitar que otros vean cuando estás escribiendo",
"options": {
- "blacklist": "Exclude from Hide Typing Indicator",
+ "blacklist": "Excluir de ocultar indicador de escritura",
"whitelist": "Ocultar indicador de tipo"
}
}
@@ -607,7 +607,7 @@
"description": "Exporta mensajes de conversación en un archivo JSON/HTML/TXT"
},
"export_memories": {
- "name": "Export Memories",
+ "name": "Exportar recuerdos",
"description": "Exporta recuerdos en un archivo ZIP"
},
"bulk_messaging_action": {
@@ -649,8 +649,8 @@
},
"auto_reload": {
"snapchat_only": "Reload Snapchat sólo",
- "all": "Reload Snapchat + PurrfectSnap",
- "null": "Default"
+ "all": "Recargar Snapchat + PurrfectSnap",
+ "null": "Predeterminado"
},
"walk_radius": {
"null": "Use radio predeterminado"
@@ -669,7 +669,7 @@
"mark_snaps_as_seen": ". Mark Snaps como se ve",
"mark_stories_as_seen_locally": ". Mark Stories como se ve localmente",
"conversation_info": "⋅ Conversation Info",
- "e2e_encryption": "🔒 Use E2E Encryption",
+ "e2e_encryption": "?? Usar cifrado E2E",
"message_logger": "📝 Mensaje Logger",
"auto_read": "Recibir auto Leer",
"hide_typing_indicator": "🙈 Ocultar indicador de clasificación"
@@ -686,11 +686,11 @@
"google_pixel_10_pro": "Google Pixel 10 Pro",
"oneplus_13": "OnePlus 13",
"xiaomi_15_ultra": "Xiaomi 15 Ultra",
- "null": "Device Default"
+ "null": "Predeterminado del dispositivo"
},
"settings_menu": {
- "default": "Default",
- "legacy": "Legacy"
+ "default": "Predeterminado",
+ "legacy": "Cl?sico"
},
"path_format": {
"create_author_folder": "Crear carpeta para cada autor",
@@ -724,7 +724,7 @@
"typing": "Tipografía",
"stories": "Historias",
"speaking": "Hablando",
- "chat_reaction": "DM Reaction",
+ "chat_reaction": "Reacci?n en DM",
"group_chat_reaction": "Reacción del Grupo",
"initiate_audio": "Llamada de audio entrante",
"abandon_audio": "Llamada de audio perdida",
@@ -734,42 +734,42 @@
},
"auto_read": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"hide_typing_indicator": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"auto_delete_sent_messages": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"auto_download": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"stealth": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"auto_save": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"message_logger": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"auto_reply": {
"blacklist": "Lista negra",
- "whitelist": "Whitelist",
+ "whitelist": "Lista blanca",
"disabled": "Discapacitados"
},
"custom_android_id": {
@@ -778,10 +778,10 @@
"add_friend_source_spoof": {
"added_by_username": "Por nombre de usuario",
"added_by_mention": "Por Mención",
- "added_by_group_chat": "By Group Chat",
+ "added_by_group_chat": "Por chat de grupo",
"added_by_qr_code": "Por código QR",
"added_by_community": "Por comunidad",
- "added_by_quick_add": "By Quick Add (high risk of being banned)",
+ "added_by_quick_add": "Por Quick Add (alto riesgo de baneo)",
"added_by_spotlight": "Por Spotlight",
"null": "No saques la fuente"
},
@@ -789,10 +789,10 @@
"null": "Sistema predeterminado"
},
"preferred_transcription_lang": {
- "null": "Use Snapchat Default"
+ "null": "Usar predeterminado de Snapchat"
},
"custom_emoji_font": {
- "null": "Default Emoji Font"
+ "null": "Fuente de emoji predeterminada"
},
"custom_shared_library": {
"null": "Utilice biblioteca predeterminada"
@@ -840,11 +840,11 @@
},
"gallery_media_send_override": {
"always_ask": "Siempre pregunte",
- "ORIGINAL": "Original Media",
+ "ORIGINAL": "Medios originales",
"NOTE": "Nota de audio",
"SNAP": "Snap",
"SAVEABLE_SNAP": "Ajuste ahorrable",
- "null": "Snapchat Default"
+ "null": "Predeterminado de Snapchat"
},
"strip_media_metadata": {
"hide_caption_text": "Ocultar texto de captura",
@@ -861,7 +861,7 @@
"hide_voice_record_button": "Quitar el botón de grabación de voz",
"hide_unread_chat_hint": "Eliminar el pan Chat Hint",
"hide_post_to_story_buttons": "Eliminar Post a Story botones antes de enviar un Snap",
- "hide_billboard_prompt": "Remove Billboard Prompt In Friends Feed",
+ "hide_billboard_prompt": "Eliminar aviso de cartel en el feed de amigos",
"hide_snapchat_plus_gift_reminders": "Quitar Snapchat Más recordatorios de regalo en conversaciones",
"hide_map_reactions": "Eliminar las reacciones de mapa"
},
@@ -875,7 +875,7 @@
"camera": "Cámara",
"discover": "Descubre",
"spotlight": "Spotlight",
- "null": "Snapchat Default"
+ "null": "Predeterminado de Snapchat"
},
"spotlight_comments_username_icon": {
"user": "Nombre de usuario Icon",
@@ -888,23 +888,23 @@
"null": "Automático"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Autom?tico"
},
"snapchat_plus": {
"not_subscribed": "No está suscrito",
"basic": "Básica",
- "ad_free": "Ad Free",
- "null": "Default"
+ "ad_free": "Sin anuncios",
+ "null": "Predeterminado"
},
"bypass_video_length_restriction": {
"single": "Medios individuales",
"split": "Medios de comunicación",
- "null": "Default"
+ "null": "Predeterminado"
},
"old_bitmoji_selfie": {
"2d": "2D Bitmoji",
"3d": "3D Bitmoji",
- "null": "Default Bitmoji"
+ "null": "Bitmoji predeterminado"
},
"disable_confirmation_dialogs": {
"erase_message": "Borrar el mensaje",
@@ -912,8 +912,8 @@
"block_friend": "Amigo de bloque",
"ignore_friend": "Ignoro amigo",
"hide_friend": "Oculto amigo",
- "hide_conversation": "Hide Conversation",
- "clear_conversation": "Clear Conversation from Friend Feed"
+ "hide_conversation": "Ocultar conversaci?n",
+ "clear_conversation": "Eliminar conversaci?n del feed de amigos"
},
"edit_text_override": {
"multi_line_chat_input": "Multilínea Chat Input",
@@ -935,13 +935,13 @@
},
"delete_after_unit": {
"seconds": "Segundos",
- "minutes": "Minutes",
+ "minutes": "Minutos",
"hours": "Horas"
},
"disable_story_sections": {
"friends": "Amigos",
"suggested_stories": "Historias sugeridas",
- "following": "Following",
+ "following": "Siguiendo",
"discover": "Descubre"
},
"disable_cameras": {
@@ -951,7 +951,7 @@
"disable_permission_requests": {
"notifications": "Notificaciones",
"read_media_images": "Read Media Imágenes",
- "read_media_video": "Read Media Video",
+ "read_media_video": "Leer video multimedia",
"camera": "Cámara",
"microphone": "Microfono",
"location": "Ubicación",
@@ -985,7 +985,7 @@
"delete_message": "Borrar el mensaje",
"mark_as_read": "Marcar como Leer",
"custom_emoji_reaction": "Reacción personalizada de Emoji",
- "null": "Default"
+ "null": "Predeterminado"
},
"message_types": {
"CHAT": "Chat",
@@ -1016,19 +1016,19 @@
"friendly, casual, helpful, empathetic": "amigable, casual, servicial, empática"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Informal",
"formal": "Formal",
"friendly": "Amistad",
"humorous": "Humor",
"empathetic": "Patético",
- "toxic": "Edgy",
+ "toxic": "Atrevido",
"busy": "Ocupado"
},
"ai_temperature": {
"0.7": "Saldo (0,7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Autom?tico",
"en": "Inglés",
"es": "Español",
"fr": "Francés",
@@ -1043,7 +1043,7 @@
"hi": "Hindi",
"tr": "Turco",
"pl": "Polaco",
- "nl": "Dutch",
+ "nl": "Neerland?s",
"sv": "Suecia",
"da": "Danés",
"no": "Noruega",
@@ -1085,12 +1085,12 @@
"auto_reply_content_types": {
"chat_messages": "Chat Mensajes",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
+ "story_share_messages": "Compartidos de historias",
"story_reply_messages": "Respuestas de la historia",
"external_media_messages": "Medios externos",
"voice_note_messages": "Notas de voz",
"sticker_messages": "Pegatinas",
- "tiny_snap_messages": "Tiny Snaps",
+ "tiny_snap_messages": "Snaps peque?os",
"map_reaction_messages": "Reacciones de mapa",
"half_swipes": "Medios golpes"
},
@@ -1112,7 +1112,7 @@
"translation_position": {
"above": "Texto anterior",
"below": "Texto siguiente",
- "inline": "Inline"
+ "inline": "En l?nea"
},
"source_language": {
"auto": "Detectar automáticamente"
@@ -1139,7 +1139,7 @@
"description": "Establezca las coordenadas de la ubicación asfaltada"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "Radio de caminata",
"description": "Camina aleatoriamente dentro de este radio (ft)"
},
"always_update_location": {
@@ -1207,10 +1207,10 @@
}
},
"ui_settings": {
- "name": "UI Settings",
+ "name": "Ajustes de IU",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Respuesta h?ptica"
}
}
},
@@ -1267,7 +1267,7 @@
"description": "Fuerzas Snapchat para utilizar controles de volumen del sistema"
},
"disable_telecom_framework": {
- "name": "Disable Telecom Framework",
+ "name": "Desactivar framework de telecomunicaciones",
"description": "Impide Snapchat utilizar el marco Android Telecom\nEsto le permite escuchar música mientras se llama"
},
"hide_active_music": {
@@ -1281,7 +1281,7 @@
}
},
"downloader": {
- "name": "Downloader",
+ "name": "Descargador",
"description": "Descargar Snapchat Media",
"properties": {
"save_folder": {
@@ -1289,7 +1289,7 @@
"description": "Seleccione el directorio al que deben descargarse todos los medios"
},
"auto_download_sources": {
- "name": "Auto Download Sources",
+ "name": "Fuentes de descarga autom?tica",
"description": "Seleccione las fuentes para descargar automáticamente desde"
},
"prevent_self_auto_download": {
@@ -1305,7 +1305,7 @@
"description": "Permite que los mismos medios sean descargados varias veces"
},
"merge_overlays": {
- "name": "Merge Overlays",
+ "name": "Combinar superposiciones",
"description": "Combina el texto y los medios de un Snap en un solo archivo"
},
"force_image_format": {
@@ -1341,7 +1341,7 @@
"description": "La cantidad de hilos para usar"
},
"preset": {
- "name": "Preset",
+ "name": "Preajuste",
"description": "Establecer la velocidad de la conversión"
},
"constant_rate_factor": {
@@ -1353,7 +1353,7 @@
"description": "Establecer el bitrate de vídeo (kbps)"
},
"audio_bitrate": {
- "name": "Audio Bitrate",
+ "name": "Tasa de bits de audio",
"description": "Establecer el bitrate de audio (kbps)"
},
"custom_video_codec": {
@@ -1399,7 +1399,7 @@
"description": "Muestra una pequeña vista previa junto a Snaps invisible en chat"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Anulaci?n de bootstrap",
"description": "Supera los ajustes de arranque de interfaz de usuario",
"properties": {
"app_appearance": {
@@ -1407,7 +1407,7 @@
"description": "Establece una aparición persistente"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "Pesta?a de inicio",
"description": "Anula la pestaña de inicio al abrir Snapchat"
}
}
@@ -1425,7 +1425,7 @@
"description": "Muestra un temporizador de exploración de Streak junto al mostrador Streaks"
},
"hide_friend_feed_entry": {
- "name": "Hide Friend Feed Entry",
+ "name": "Ocultar entrada del feed de amigos",
"description": "Oculta a un amigo específico del Amigo Feed\nUtilice la pestaña social para gestionar esta función"
},
"hide_streak_restore": {
@@ -1445,11 +1445,11 @@
"description": "Seleccione qué componentes UI para ocultar"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "Informaci?n r?pida de medios de Opera",
"description": "Muestra información útil de medios como fecha de creación en el menú contextual de la ópera"
},
"old_bitmoji_selfie": {
- "name": "Old Bitmoji Selfie",
+ "name": "Selfie de Bitmoji antiguo",
"description": "Trae los selfies Bitmoji de versiones anteriores de Snapchat"
},
"disable_spotlight": {
@@ -1465,11 +1465,11 @@
"description": "Cierre automáticamente el menú de alimentación del amigo después de presionar un botón de configuración"
},
"vertical_story_viewer": {
- "name": "Vertical Story Viewer",
+ "name": "Visor vertical de historias",
"description": "Permite al espectador vertical para todas las historias"
},
"enable_friend_feed_menu_bar": {
- "name": "Friend Feed Menu Bar",
+ "name": "Barra de men? del feed de amigos",
"description": "Permite el nuevo Amigo Feed Menu Bar"
},
"message_indicators": {
@@ -1539,11 +1539,11 @@
"description": "Añade un botón para marcar un Snap como se ve al verla.\nEsto funcionará incluso cuando esté habilitado el modo Stealth"
},
"skip_when_marking_as_seen": {
- "name": "Skip When Marking as Seen",
+ "name": "Omitir al marcar como visto",
"description": "Se salta automáticamente al siguiente Snap al marcar un Snap como se ve.\nUsar en combinación con Mark Snap como botón visto"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "Reproducir medios en bucle",
"description": "Interruptores de reproducción de medios al ver Snaps / Stories"
},
"disable_replay_in_ff": {
@@ -1593,7 +1593,7 @@
"description": "Notificaciones de grupos en una sola"
},
"chat_preview": {
- "name": "Chat Preview",
+ "name": "Vista previa de chat",
"description": "Muestra una vista previa de los mensajes recibidos en la notificación"
},
"media_preview": {
@@ -1601,7 +1601,7 @@
"description": "Muestra una vista previa de los tipos de medios seleccionados en la notificación"
},
"media_caption": {
- "name": "Media Caption",
+ "name": "Pie de foto multimedia",
"description": "Muestra la captura adjunta de los medios de comunicación en la notificación"
},
"stacked_media_messages": {
@@ -1647,7 +1647,7 @@
"description": "Impide que sus propios mensajes sean borrados"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Purgado autom?tico",
"description": "Elimina automáticamente mensajes en caché que son mayores que la cantidad especificada de tiempo"
},
"message_filter": {
@@ -1757,15 +1757,15 @@
"description": "Ajustes para auto-replies impulsados por AI",
"properties": {
"enable_ai_replies": {
- "name": "Enable AI Replies",
+ "name": "Habilitar respuestas de IA",
"description": "Utilice AI para generar auto-replies inteligentes en lugar de mensajes de plantilla"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "Proveedor de IA",
"description": "Seleccione qué servicio AI utilizar para generar respuestas"
},
"ai_endpoint_url": {
- "name": "AI Endpoint URL",
+ "name": "URL del endpoint de IA",
"description": "API endpoint URL para el servicio AI (por ejemplo, OpenAI, servidor local AI)"
},
"ai_model": {
@@ -1773,15 +1773,15 @@
"description": "Modelo AI para generar respuestas (por ejemplo, gpt-3.5-turbo, gpt-4)"
},
"ai_api_key": {
- "name": "AI API Key",
+ "name": "Clave de API de IA",
"description": "Clave API para autenticar con el servicio AI"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "Prompt del sistema de IA",
"description": "El impulso del sistema que define la personalidad y el comportamiento de la AI"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "M?ximo de tokens de IA",
"description": "Número máximo de fichas (palabras) que la AI puede utilizar en respuestas"
},
"ai_temperature": {
@@ -1793,7 +1793,7 @@
"description": "Número de mensajes anteriores para incluir como contexto las respuestas de la AI"
},
"ai_personality_traits": {
- "name": "AI Personality Traits",
+ "name": "Rasgos de personalidad de IA",
"description": "Características de personalidad separadas por el comma para la AI (por ejemplo, amistosa, casual, servicial)"
},
"ai_response_style": {
@@ -1801,27 +1801,27 @@
"description": "Estilo general de las respuestas de AI"
},
"ai_response_language": {
- "name": "AI Response Language",
+ "name": "Idioma de respuesta de IA",
"description": "Idioma para respuestas de IA (auto = igual que el mensaje recibido)"
},
"ai_use_conversation_history": {
"name": "Uso Historia de Conversación",
- "description": "Include previous messages as context for more relevant AI responses"
+ "description": "Incluir mensajes anteriores como contexto para respuestas de IA m?s relevantes"
},
"ai_include_friend_info": {
- "name": "Include Friend Info",
+ "name": "Incluir informaci?n del amigo",
"description": "Incluye el nombre de amigo y otra información disponible en contexto AI"
},
"ai_fallback_to_template": {
- "name": "Fallback to Template",
+ "name": "Usar plantilla como respaldo",
"description": "Use mensajes de plantilla si AI no genera una respuesta"
},
"ai_request_timeout": {
- "name": "AI Request Timeout",
+ "name": "Tiempo de espera de solicitud de IA",
"description": "Tiempo máximo para esperar a la respuesta de AI (en segundos)"
},
"ai_retry_attempts": {
- "name": "AI Retry Attempts",
+ "name": "Intentos de reintento de IA",
"description": "Número de veces para volver a enviar solicitudes de AI si fallan"
}
}
@@ -1839,7 +1839,7 @@
"description": "Saludar el texto para usar cuando se habilita el saludo específico de un amigo"
},
"auto_reply_content_types": {
- "name": "Auto Reply Triggers",
+ "name": "Disparadores de respuesta autom?tica",
"description": "Seleccione qué tipo de mensaje debe desencadenar auto-replies"
},
"chat_messages": {
@@ -1847,7 +1847,7 @@
"description": "Mensajes automáticos para mensajes de chat de texto"
},
"snap_messages": {
- "name": "Snap Replies",
+ "name": "Respuestas a Snaps",
"description": "Mensajes automáticos para instantáneas"
},
"story_share_messages": {
@@ -1875,7 +1875,7 @@
"description": "Mensajes automáticos para pequeños snaps"
},
"map_reaction_messages": {
- "name": "Map Reaction Replies",
+ "name": "Respuestas a reacciones de mapa",
"description": "Mensajes automáticos para las reacciones del mapa"
},
"half_swipe_messages": {
@@ -1895,11 +1895,11 @@
"description": "Permite que Auto Open Snaps funcione en el fondo. Nota: Esto va a drenar significativamente su batería"
},
"min_delay": {
- "name": "Min Delay (ms)",
+ "name": "Retardo m?nimo (ms)",
"description": "Retraso mínimo en milisegundos antes de abrir un snap"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Retardo m?ximo (ms)",
"description": "Máxima demora en milisegundos antes de abrir un snap"
},
"queue_size": {
@@ -1907,11 +1907,11 @@
"description": "Número máximo de snaps para mantener en la cola"
},
"retry_attempts": {
- "name": "Retry Attempts",
+ "name": "Intentos de reintento",
"description": "Número de veces para volver a abrir un snap si falla"
},
"retry_delay": {
- "name": "Retry Delay (ms)",
+ "name": "Retardo de reintento (ms)",
"description": "Dilatación en milisegundos entre intentos de retry"
}
}
@@ -1991,11 +1991,11 @@
"description": "Pausa traducción cuando el servicio está bloqueado"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "M?ximo de reintentos",
"description": "Número máximo de intentos de reingreso"
},
"retry_delay": {
- "name": "Retry Delay",
+ "name": "Retardo de reintento",
"description": "Dilatación entre intentos de retry (milliseconds)"
}
}
@@ -2014,7 +2014,7 @@
"name": "Auto Leer"
},
"hide_typing_indicator": {
- "name": "Hide Typing Indicator"
+ "name": "Ocultar indicador de escritura"
},
"auto_reply": {
"name": "Auto Responder"
@@ -2023,7 +2023,7 @@
"name": "Auto Eliminar Mensajes enviados"
},
"auto_download": {
- "name": "Auto Download"
+ "name": "Descarga autom?tica"
},
"stealth": {
"name": "Modo de Stealth"
@@ -2052,7 +2052,7 @@
"description": "Reemplaza fotos capturadas con fondo negro\nLos vídeos no se ven afectados"
},
"immersive_camera_preview": {
- "name": "Immersive Preview",
+ "name": "Vista previa inmersiva",
"description": "Impide Snapchat de Cropping la vista previa de la cámara\nEsto podría causar que la cámara se flicker en algunos dispositivos"
},
"override_front_resolution": {
@@ -2080,7 +2080,7 @@
"description": "Fuerzas de la cámara fuente de codificación"
},
"startup_default_camera": {
- "name": "Startup Default Camera",
+ "name": "C?mara predeterminada al inicio",
"description": "Establece la cámara predeterminada al abrir Snapchat"
},
"hevc_recording": {
@@ -2090,11 +2090,11 @@
}
},
"streaks_reminder": {
- "name": "Streaks Reminder",
+ "name": "Recordatorio de rachas",
"description": "Te notifica periódicamente sobre tus problemas",
"properties": {
"interval": {
- "name": "Interval",
+ "name": "Intervalo",
"description": "El intervalo entre cada recordatorio (horas)"
},
"remaining_hours": {
@@ -2136,17 +2136,17 @@
"description": "Permite ejecutar código JavaScript en Composer (arm64 solamente)"
},
"composer_logs": {
- "name": "Composer Logs",
+ "name": "Registros de Composer",
"description": "Redirige los registros de consola de Composer a PurrfectSnap"
}
}
},
"disable_bitmoji": {
- "name": "Disable Bitmoji",
+ "name": "Desactivar Bitmoji",
"description": "Disables Perfil de amigos Bitmoji"
},
"custom_emoji_font": {
- "name": "Custom Emoji Font",
+ "name": "Fuente de emoji personalizada",
"description": "Permite utilizar una fuente emoji personalizada. Solo funciona con fuentes .ttf"
},
"custom_shared_library": {
@@ -2156,7 +2156,7 @@
}
},
"spoof": {
- "name": "Spoof",
+ "name": "Suplantar",
"description": "Cuchara de información sobre usted",
"properties": {
"play_store_installer_package_name": {
@@ -2180,7 +2180,7 @@
"description": "Anule el ID de Android enviado a Snapchat",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Suplantar ID de Android",
"description": "Anula el ID de Android enviado a Snapchat con un valor personalizado"
},
"custom_android_id": {
@@ -2190,7 +2190,7 @@
}
},
"spoof_device": {
- "name": "Spoof Device",
+ "name": "Suplantar dispositivo",
"description": "Presenta Snapchat como en funcionamiento en otro modelo de dispositivo"
},
"device_model": {
@@ -2204,11 +2204,11 @@
"description": "Convierte snaps en chat de medios externos localmente. Esto aparece en el menú contextual de descarga de chat"
},
"media_file_picker": {
- "name": "Media File Picker",
+ "name": "Selector de archivos multimedia",
"description": "Permite seleccionar cualquier archivo de vídeo/audio de la galería"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Registro de historias",
"description": "Proporciona una historia de historias de amigos"
},
"call_recorder": {
@@ -2256,11 +2256,11 @@
"description": "Permite funciones de Snapchat sin liberación/beta"
},
"context_menu_fix": {
- "name": "Context Menu Fix",
+ "name": "Correcci?n del men? contextual",
"description": "Intento de reparar el menú Amigo Alimentado como cuando el dispositivo está fuera de línea no se puede mostrar correctamente"
},
"app_lock": {
- "name": "App Lock",
+ "name": "Bloqueo de la app",
"description": "Evita el acceso a Snapchat sin código de paso",
"properties": {
"lock_on_resume": {
@@ -2278,7 +2278,7 @@
"description": "Pasa los ojos Sólo contraseña\nEsto sólo funcionará si el contraseña ha sido introducido correctamente antes"
},
"no_friend_score_delay": {
- "name": "No Friend Score Delay",
+ "name": "Sin retraso de puntuaci?n de amigos",
"description": "Elimina el retraso al ver una partición de amigos"
},
"best_friend_pinning": {
@@ -2300,8 +2300,8 @@
}
},
"add_friend_source_spoof": {
- "name": "Add Friend Source Spoof",
- "description": "Spoofs the source of a Friend Request"
+ "name": "Suplantaci?n de origen de agregar amigo",
+ "description": "Suplanta el origen de una solicitud de amistad"
},
"hidden_snapchat_plus_features": {
"name": "Snapchat ocultado más características",
@@ -2312,7 +2312,7 @@
"description": "Personaliza el formato Streaks Expiration\n\nVariables disponibles:\n- %c: Conteo de Escarabajos\n- %e: Timeglass Emoji\n- %d: Días\n- %h: Horas\n- %m: Minutes\n- %s: Seconds\n- %w: Tiempo restante"
},
"prevent_forced_logout": {
- "name": "Prevent Forced Logout",
+ "name": "Evitar cierre de sesi?n forzado",
"description": "Evita que Snapchat lo inicie cuando inicie sesión en otro dispositivo"
},
"snapscore_changes": {
@@ -2322,7 +2322,7 @@
}
},
"scripting": {
- "name": "Scripting",
+ "name": "Scripts",
"description": "Ejecute scripts personalizados para ampliar PurrfectSnap",
"properties": {
"developer_mode": {
@@ -2364,7 +2364,7 @@
"description": "Permite al rastreador correr en el fondo. Nota: Esto va a drenar significativamente su batería"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Purgado autom?tico",
"description": "Elimina automáticamente eventos caché que son mayores que la cantidad especificada de tiempo"
}
}
@@ -2398,33 +2398,33 @@
"STATUS_CALL_MISSED_AUDIO": "Llamada de audio perdida",
"LIVE_LOCATION_SHARE": "Ubicación en vivo Compartir",
"CREATIVE_TOOL_ITEM": "Artículo de la herramienta creativa",
- "FAMILY_CENTER_INVITE": "Family Center Invite",
+ "FAMILY_CENTER_INVITE": "Invitaci?n a Family Center",
"FAMILY_CENTER_ACCEPT": "Family Center Aceptar",
- "FAMILY_CENTER_LEAVE": "Family Center Leave",
+ "FAMILY_CENTER_LEAVE": "Salir de Family Center",
"STATUS_PLUS_GIFT": "Estado más regalo",
- "TINY_SNAP": "Tiny Snap",
+ "TINY_SNAP": "Snap peque?o",
"STATUS_COUNTDOWN": "Cuenta atrás",
- "MAP_REACTION": "Map Reaction",
+ "MAP_REACTION": "Reacci?n de mapa",
"chat_messages": "Chat Mensajes",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
+ "story_share_messages": "Compartidos de historias",
"story_reply_messages": "Respuestas de la historia",
"external_media_messages": "Medios externos",
"voice_note_messages": "Nota de voz",
"sticker_messages": "Pegatina",
- "tiny_snap_messages": "Tiny Snap",
- "map_reaction_messages": "Map Reaction",
+ "tiny_snap_messages": "Snap peque?o",
+ "map_reaction_messages": "Reacci?n de mapa",
"half_swipes": "Medios golpes"
},
"media_download_source": {
"none": "Ninguno",
"pending": "Pendiente",
- "chat_media": "Chat Media",
+ "chat_media": "Medios de chat",
"story": "Historia",
- "public_story": "Public Story",
+ "public_story": "Historia p?blica",
"spotlight": "Spotlight",
"profile_picture": "Perfil Imagen",
- "story_logger": "Story Logger",
+ "story_logger": "Registro de historias",
"message_logger": "Mensaje Logger",
"merged": "Fusión",
"voice_call": "Llamada de voz"
@@ -2451,11 +2451,11 @@
},
"gallery_media_send_override": {
"always_ask": "Siempre pregunte",
- "ORIGINAL": "Original Media",
+ "ORIGINAL": "Medios originales",
"NOTE": "Nota de audio",
"SNAP": "Snap",
"SAVEABLE_SNAP": "Ajuste ahorrable",
- "null": "Snapchat Default",
+ "null": "Predeterminado de Snapchat",
"multiple_media_toast": "Sólo se puede enviar un medio a la vez"
},
"mark_as_seen": {
@@ -2475,13 +2475,13 @@
"profile_info": {
"title": "Información del perfil",
"first_created_username": "Nombre de usuario creado",
- "mutable_username": "Mutable Username",
+ "mutable_username": "Nombre de usuario editable",
"display_name": "Nombre",
"added_date": "Fecha",
"birthday": "Cumpleaños{month}{day}",
"hidden_birthday": "Cumpleaños : Oculto",
"friendship": "Amistad",
- "add_source": "Add Source",
+ "add_source": "Agregar origen",
"snapchat_plus": "Snapchat Plus",
"snapchat_plus_state": {
"subscribed": "Suscrito",
@@ -2493,11 +2493,11 @@
"not_subscribed": "No está suscrito"
},
"friendship_link_type": {
- "mutual": "Mutual",
+ "mutual": "Mutuo",
"outgoing": "Saliendo",
"blocked": "Bloqueados",
"deleted": "Suprimido",
- "following": "Following",
+ "following": "Siguiendo",
"suggested": "Sugerido",
"incoming": "Entrando",
"incoming_follower": "Seguidor entrante"
@@ -2515,7 +2515,7 @@
"remove_friends": "Quitar amigos",
"clear_conversations": "Conversaciones claras",
"clear_friend_feed": "La comida de un amigo claro{count})",
- "unfollow": "Unfollow",
+ "unfollow": "Dejar de seguir",
"remove": "Retirar"
},
"leave_groups": "Vete{count}grupos",
@@ -2533,7 +2533,7 @@
"no_groups_found": "No se encontraron grupos",
"no_friends_or_groups_found": "No hay amigos ni grupos encontrados",
"relationship": "Relación:",
- "unknown_group": "Unknown Group",
+ "unknown_group": "Grupo desconocido",
"type_group_chat": "Tipo: Chat de grupo",
"clean_conversations": "Limpio{count}conversaciones",
"remove_friends": "Retirar{count}amigos",
@@ -2552,10 +2552,10 @@
"suggested": "Sugerido",
"deleted": "Suprimido",
"business_accounts": "Cuentas comerciales",
- "streaks": "Streaks",
- "non_streaks": "Non Streaks",
+ "streaks": "Rachas",
+ "non_streaks": "Sin rachas",
"followed": "Seguido",
- "following": "Following",
+ "following": "Siguiendo",
"location_on_map": "Ubicación en Mapa"
},
"sort_options": {
@@ -2564,14 +2564,14 @@
"added_timestamp": "Añadido Timestamp",
"snap_score": "Partituras",
"streak_length": "Longitud de montaje",
- "most_messages_sent": "Most Messages Sent",
+ "most_messages_sent": "M?s mensajes enviados",
"most_recent_message": "Mensaje más reciente",
"nearest_location": "Ubicación más cercana"
}
},
"chat_export": {
"exporter_dialog": {
- "select_conversations_title": "Select Conversations",
+ "select_conversations_title": "Seleccionar conversaciones",
"text_field_selection": "{amount}seleccionado",
"text_field_selection_all": "Todos",
"export_file_format_title": "Formato de archivo de exportación",
@@ -2618,16 +2618,16 @@
"message_edited": "Mensaje editado",
"message_reaction_add": "Reacción del mensaje Añadir",
"message_reaction_remove": "Reacción del mensaje Remove",
- "snap_opened": "Snap Opened",
- "snap_replayed": "Snap Replayed",
- "snap_replayed_twice": "Snap Replayed Twice",
+ "snap_opened": "Snap abierto",
+ "snap_replayed": "Snap reproducido",
+ "snap_replayed_twice": "Snap reproducido dos veces",
"snap_screenshot": "Snap Captura de Pantalla",
"snap_screen_record": "Grabación de pantalla",
"i_can_see_you": "Puedo verte"
},
"cleared_from_feed": "Despejado de la alimentación",
"tracker_actions": {
- "log": "Log",
+ "log": "Registrar",
"in_app_notification": "Notificación de aplicación",
"push_notification": "Notificación de empuje",
"custom": "Aduanas"
@@ -2641,7 +2641,7 @@
},
"profile_picture_downloader": {
"button": "Descargar Perfil",
- "title": "Profile Picture Downloader",
+ "title": "Descargador de foto de perfil",
"avatar_option": "Avatar",
"background_option": "Antecedentes"
},
@@ -2673,7 +2673,7 @@
"content_saved_toast": "¡Salvado!",
"download_toast": "Descarga{path}...",
"processing_toast": "Procesamiento{path}...",
- "failed_generic_toast": "Failed to download",
+ "failed_generic_toast": "No se pudo descargar",
"failed_to_create_preview_toast": "Failed para crear vista previa",
"failed_processing_toast": "Failed processing{error}",
"failed_gallery_toast": "Failed saving to gallery{error}",
@@ -2685,7 +2685,7 @@
}
},
"streaks_reminder": {
- "notification_title": "Streaks",
+ "notification_title": "Rachas",
"notification_text": "Perderás tu Streak con{friend}dentro{hoursLeft}horas"
},
"biometric_auth": {
@@ -2720,7 +2720,7 @@
"incoming_secret_message": "Tu amigo acaba de aceptar tu llave pública. Haga clic a continuación para aceptar el secreto."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
+ "title": "Abrir Snaps autom?ticamente",
"priority_title": "Auto Open Snaps (Prioridad)",
"error_title": "Auto Open Snaps (Errores)",
"channel_description": "Notificaciones para el estado de cola de apertura automática",
@@ -2732,18 +2732,18 @@
"recent_snaps": "Ajustes recientes",
"action_pause": "Pausa",
"action_resume": "Resumen",
- "action_clear": "Clear Queue",
- "action_reset": "Reset Count",
+ "action_clear": "Limpiar cola",
+ "action_reset": "Restablecer conteo",
"error_content": "Failed to open snap from{sender}:{error}",
- "resumed_feedback": "Auto Open Resumed",
- "paused_feedback": "Auto Open Paused",
+ "resumed_feedback": "Apertura autom?tica reanudada",
+ "paused_feedback": "Apertura autom?tica en pausa",
"resumed_message": "Procesamiento continuará automáticamente para los snaps apagados",
"paused_message": "Procesando se detuvo. Queue kept ({count}snaps)",
"status_paused": "Pausa",
"status_monitoring": "Supervisión",
"status_active": "Activo",
"queue_cleared": "Lugar despejado y reajuste de estadísticas",
- "queue_cleared_title": "Queue cleared",
+ "queue_cleared_title": "Cola limpiada",
"queue_cleared_reset": "Queue Cleared \" Reset",
"queue_cleared_feedback": "Despejado{count}chasis apagadas • Reset{processed}conteo procesado",
"queue_cleared_feedback_simple": "Reset{processed}conteo procesado",
@@ -2751,14 +2751,14 @@
"unknown_user": "Usuario desconocido",
"content_type_external_media": "Medios externos",
"content_type_snap": "Snap",
- "conversation_type_friend_dm": "Friend DM",
+ "conversation_type_friend_dm": "DM de amigo",
"conversation_type_dm": "DM",
"conversation_type_group_chat": "Chat de grupo",
"conversation_type_chat": "Chat",
"notification_status": "Situación",
"notification_statistics": "ESTADÍSTICAS",
"notification_queue_size": "Tamaño de la cola",
- "notification_total_opened": "Total Snaps Opened",
+ "notification_total_opened": "Total de Snaps abiertos",
"notification_queue_preview": "PREVISTA DE PREVISTAS",
"notification_processing_continue": "Procesamiento continuará automáticamente...",
"notification_no_snaps_queue": "No hay problemas en la cola.",
@@ -2830,7 +2830,7 @@
"i_can_see_you": "{friend}actividad{conversation}:{details}"
},
"friend_mutation_observer": {
- "notification_channel_name": "Friend Mutation Observer",
+ "notification_channel_name": "Observador de mutaci?n de amigos",
"friend_removed": "{username}te ha quitado como amigo",
"birthday_removed": "{username}ha quitado su cumpleaños ({birthday})",
"birthday_added": "{username}ha añadido su cumpleaños ({birthday})",
@@ -2845,7 +2845,7 @@
"date_range_picker_end_headline": "A",
"date_range_picker_title": "Seleccionar rango de fecha",
"date_picker_switch_to_calendar_mode": "Calendario",
- "date_picker_switch_to_input_mode": "Input",
+ "date_picker_switch_to_input_mode": "Entrada",
"date_range_picker_scroll_to_previous_month": "Mes anterior",
"date_range_picker_scroll_to_next_month": "Mes siguiente",
"date_picker_today_description": "Hoy",
@@ -2878,12 +2878,12 @@
"auto_delete_sent_messages": {
"countdown_toast": "El mensaje será eliminado en{time}",
"delete_success_toast": "Mensaje eliminado con éxito",
- "delete_failed_toast": "Failed to delete message"
+ "delete_failed_toast": "No se pudo eliminar el mensaje"
},
"translation_position": {
"above": "Arriba",
"below": "A continuación",
- "inline": "Inline"
+ "inline": "En l?nea"
},
"language_codes": {
"en": "Inglés",
@@ -2899,7 +2899,7 @@
"ar": "Árabe",
"hi": "Hindi",
"tr": "Turco",
- "nl": "Dutch",
+ "nl": "Neerland?s",
"pl": "Polaco",
"sv": "Suecia",
"da": "Danés",
@@ -2917,17 +2917,17 @@
"lt": "Lituania",
"mt": "Maltés",
"ga": "Irlandés",
- "cy": "Welsh"
+ "cy": "Gal?s"
},
"tracker": {
"tabs": {
- "logs": "Logs",
+ "logs": "Registros",
"rules": "Reglas"
},
"actions": {
"export": "Exportación",
"delete": "Suprimir",
- "add_rule": "Add Rule",
+ "add_rule": "Agregar regla",
"save_rule": "Regla"
},
"messages": {
@@ -2967,15 +2967,15 @@
"message_reaction_add": "Reacción agregada",
"message_reaction_remove": "Reacción eliminada",
"snap_opened": "Rápido abierto",
- "snap_replayed": "Replayed snap",
+ "snap_replayed": "Reprodujo un snap",
"snap_replayed_twice": "Replayed snap dos veces",
- "snap_screenshot": "Took screenshot",
+ "snap_screenshot": "Hizo una captura de pantalla",
"snap_screen_record": "Pantalla grabada"
}
},
"logs": {
"export_dialog": {
- "title": "Export Logs",
+ "title": "Exportar registros",
"description": "Exportar registros de su amigo rastreador a un archivo",
"progress": "Exportando registros...",
"export_as": "Exportación{type}",
@@ -3018,8 +3018,8 @@
"message_reaction_add": "añadió una reacción",
"message_reaction_remove": "retirada una reacción",
"snap_opened": "abrió un snap",
- "snap_replayed": "replayed a snap",
- "snap_replayed_twice": "replayed a snap twice",
+ "snap_replayed": "reprodujo un snap",
+ "snap_replayed_twice": "reprodujo un snap dos veces",
"snap_screenshot": "tomó una captura de pantalla",
"snap_screen_record": "pantalla grabada",
"i_can_see_you": "activo"
@@ -3032,7 +3032,7 @@
"events": "Eventos",
"add_event": "Agregar evento",
"type": "Tipo",
- "triggers": "Triggers",
+ "triggers": "Disparadores",
"conditions": "Condiciones",
"only_inside_conversation": "Sólo cuando estoy dentro de la conversación",
"only_outside_conversation": "Sólo cuando estoy fuera de la conversación",
@@ -3040,20 +3040,20 @@
"only_when_app_inactive": "Sólo cuando Snapchat está inactivo",
"no_notification_when_app_active": "No hay notificación cuando Snapchat está activo",
"scope_options": {
- "all_friends_groups": "All Friends/Groups",
+ "all_friends_groups": "Todos los amigos/grupos",
"no_one_except": "Nadie excepto",
"everyone_except": "Todos excepto"
}
}
},
"debug": {
- "title": "Debug",
+ "title": "Depurar",
"clear": "Despejado",
"files": {
"config_json": "Archivo de configuración",
- "mappings_json": "Mappings File",
+ "mappings_json": "Archivo de mapeos",
"message_logger_db": "Base de datos del registrador de mensajes",
- "pinned_best_friend_txt": "Pinned Best Friend File",
+ "pinned_best_friend_txt": "Archivo de mejor amigo fijado",
"native_sig_cache_txt": "Firma nativa Cache File"
},
"settings": {
@@ -3063,22 +3063,22 @@
"disable_bypass_status_indicator": "Indicador de estado de bypass deshabilitado"
}
},
- "ui_settings_title": "UI Settings",
- "haptic_feedback_label": "Haptic Feedback",
+ "ui_settings_title": "Ajustes de IU",
+ "haptic_feedback_label": "Respuesta h?ptica",
"updates_title": "Actualizaciones",
"auto_update_check": "Control de actualización automática",
"update_check_frequency_daily": "Diario",
"update_check_frequency_weekly": "Semanal",
"update_check_frequency_monthly": "Mensual",
- "update_channel_stable": "Stable",
- "update_channel_prerelease": "Pre-release",
+ "update_channel_stable": "Estable",
+ "update_channel_prerelease": "Prelanzamiento",
"friend_notes_title": "Notas de amigos",
"friend_notes_description": "Administrar y respaldar las notas de su amigo",
"app_theme_title": "Tema de aplicación",
"theme_mode_system": "Sistema",
"theme_mode_light": "Luz",
"theme_mode_dark": "Oscuro",
- "test_mode_label": "Enable PurrAura",
+ "test_mode_label": "Activar PurrAura",
"disable_feature_loading_label": "Carga desactivada",
"disable_auto_mapper_label": "Desactivado Auto Mapper",
"disable_bypass_indicator_label": "Indicador de bypass deshabilitado",
@@ -3095,10 +3095,10 @@
"date_range": "Fecha de rango",
"select": "Seleccione",
"sort_by_folder": "Ordenar por carpeta",
- "include_my_eyes_only": "Include My Eyes Only",
+ "include_my_eyes_only": "Incluir My Eyes Only",
"cancel": "Cancelar",
"export": "Exportación",
- "quit": "Quit",
+ "quit": "Salir",
"done": "Hecho",
"ok": "OK",
"exporting_memories": "Exportando recuerdos... (G){failed}fracasado)"
@@ -3119,7 +3119,7 @@
"cancel": "Cancelar",
"add": "Añadir",
"ok": "OK",
- "quit": "Quit",
+ "quit": "Salir",
"done": "Hecho",
"back": "Atrás",
"unknown": "Desconocida",
@@ -3127,7 +3127,7 @@
"no_friends_found": "No hay amigos encontrados",
"exporting_memories": "Exportando recuerdos... (G){failed}fracasado)"
},
- "clear_friend_feed": "Clear Friend Feed",
+ "clear_friend_feed": "Limpiar feed de amigos",
"select_date": "Seleccionar fecha",
"schedule_scheduled_for": "Puestos previstos{name}dentro{time}",
"schedule_sending_in": "Enviando{time}",
@@ -3155,7 +3155,7 @@
"posted_at": "Publicado en{date}",
"created_at": "Creado en{date}",
"failed_to_open_file": "Failed to open file. Compruebe los registros para más información",
- "failed_to_get_file": "Failed to get file",
+ "failed_to_get_file": "No se pudo obtener el archivo",
"download_button": "Descargar",
"chat_attachment": "Adjunción{index}",
"log_header_format": "{username}?{type}?{date}",
@@ -3169,8 +3169,8 @@
"search_button_description": "Buscar mensajes"
},
"debug_dialogs": {
- "info": "Info",
- "refs": "Refs",
+ "info": "Informaci?n",
+ "refs": "Referencias",
"arroyo": "Arroyo",
"message": "Mensaje",
"media_references": "Referencias de medios",
@@ -3182,13 +3182,13 @@
"failed_to_edit_message": "Failed to edit message:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Informal",
"formal": "Formal",
"friendly": "Amistad",
"humorous": "Humor",
"empathetic": "Patético",
"busy": "Ocupado",
- "toxic": "Toxic"
+ "toxic": "T?xico"
},
"ai_response_language": {
"auto": "Auto (Lo mismo que se recibió)",
@@ -3206,7 +3206,7 @@
"hi": "Hindi",
"tr": "Turco",
"pl": "Polaco",
- "nl": "Dutch",
+ "nl": "Neerland?s",
"sv": "Suecia",
"da": "Danés",
"no": "Noruega",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/fi.json b/common/src/main/assets/lang/fi.json
index c7d80ee1..c3ef2ee1 100644
--- a/common/src/main/assets/lang/fi.json
+++ b/common/src/main/assets/lang/fi.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Valitse kieli",
@@ -84,7 +84,7 @@
"clear_button": "Tyhjennä",
"view_logger_history_button": "Näytä lokihistoria",
"ui_settings_title": "Käyttöliittymän asetukset",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptinen palaute",
"use_system_toasts_label": "Käytä järjestelmäpaahtoleipää",
"updates_title": "Päivitykset",
"auto_update_check": "Automaattipäivityksen tarkistus",
@@ -245,14 +245,14 @@
"choose_location_button": "Valitse sijainti",
"manual_coordinates_hint": "Säädä koordinaatit käsin.",
"saved_coordinates_subtitle": "Hallitse tallennettuja parof-paikkoja",
- "teleport_to_friend_button": "Teleport to Friend",
+ "teleport_to_friend_button": "Teleportoi yst?v?n luo",
"spoof_location_toggle": "Spoof- sijainti",
"suspend_location_updates": "Keskeytä sijaintipäivitykset",
"saved_coordinates_title": "Tallennetut koordinaatit",
"no_saved_coordinates_hint": "Ei tallennettuja koordinaatteja",
"delete_dialog_title": "Poista tallennettu koordinaatti",
"delete_dialog_message": "Haluatko varmasti poistaa tämän tallennetun koordinaatin?",
- "teleport_to_friend_title": "Teleport to Friend",
+ "teleport_to_friend_title": "Teleportoi yst?v?n luo",
"search_bar": "Etsi",
"no_friends_map": "Ei ystäviä kartalla",
"no_friends_found": "Ei ystäviä löytynyt"
@@ -595,7 +595,7 @@
},
"actions": {
"clean_snapchat_cache": {
- "name": "Clean Snapchat Cache",
+ "name": "Tyhjenn? Snapchat-v?limuisti",
"description": "Puhdistaa Snapchat välimuistin"
},
"manage_friend_list": {
@@ -1021,7 +1021,7 @@
"friendly": "Ystävällinen",
"humorous": "Huvittavaa",
"empathetic": "Empaattinen",
- "toxic": "Edgy",
+ "toxic": "Rohkea",
"busy": "Kiire"
},
"ai_temperature": {
@@ -1112,7 +1112,7 @@
"translation_position": {
"above": "Tekstin yläpuolella",
"below": "Alla oleva teksti",
- "inline": "Inline"
+ "inline": "Riviss?"
},
"source_language": {
"auto": "Tunnista automaattisesti"
@@ -1139,7 +1139,7 @@
"description": "Aseta paroofoidun sijainnin koordinaatit"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "K?velys?de",
"description": "Satunnaisesti kävellä tämän säteen sisällä (ft)"
},
"always_update_location": {
@@ -1173,7 +1173,7 @@
"description": "Ohittaa median lataamisen laadun",
"properties": {
"force_video_upload_source_quality": {
- "name": "Force Video Upload Source Quality",
+ "name": "Pakota videol?hetyksen l?hdelaatu",
"description": "Pakottaa Snapchat käyttämään lähdelaatua ladattaessa videoita\nHuomaa, että tämä ei välttämättä poista metatietoja mediasta"
},
"disable_image_compression": {
@@ -1210,7 +1210,7 @@
"name": "Käyttöliittymän asetukset",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Haptinen palaute"
}
}
},
@@ -1777,7 +1777,7 @@
"description": "API-avain tekoälypalveluun"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "AI-j?rjestelm?kehote",
"description": "Järjestelmäkehotus, joka määrittelee tekoälyn persoonallisuuden ja käyttäytymisen"
},
"ai_max_tokens": {
@@ -1991,7 +1991,7 @@
"description": "Keskeytä käännös, kun palvelu on estetty"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Maks. uudelleenyritykset",
"description": "Uusintayritysten enimmäismäärä"
},
"retry_delay": {
@@ -2090,7 +2090,7 @@
}
},
"streaks_reminder": {
- "name": "Streaks Reminder",
+ "name": "Streaks-muistutus",
"description": "Säännöllisesti ilmoittaa Streaks",
"properties": {
"interval": {
@@ -2112,7 +2112,7 @@
"description": "Kokeelliset ominaisuudet",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
+ "name": "Natiivit hookit",
"description": "Epäturvallisia ominaisuuksia, jotka liittyvät Snapchat'n natiivi-koodiin",
"properties": {
"composer_hooks": {
@@ -2180,7 +2180,7 @@
"description": "Ohita Snapchatiin lähetetty Android-tunnus",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Spoofaa Android ID",
"description": "Ohita Snapchatille lähetetty Android-tunnus omalla arvolla"
},
"custom_android_id": {
@@ -2260,7 +2260,7 @@
"description": "Yritä korjata Friend Feed Menu kuin kun laite on offline se ei voi näyttää oikein"
},
"app_lock": {
- "name": "App Lock",
+ "name": "Sovelluslukko",
"description": "Estää pääsyn Snapchatiin ilman salasanaa",
"properties": {
"lock_on_resume": {
@@ -2270,7 +2270,7 @@
}
},
"infinite_story_boost": {
- "name": "Infinite Story Boost",
+ "name": "Loputon Story-boost",
"description": "Ohita Story Boost Limit -viive"
},
"meo_passcode_bypass": {
@@ -2419,7 +2419,7 @@
"media_download_source": {
"none": "Ei ole",
"pending": "Odotetaan",
- "chat_media": "Chat Media",
+ "chat_media": "Chat-media",
"story": "Tarina",
"public_story": "Julkinen tarina",
"spotlight": "Valokeila",
@@ -2553,7 +2553,7 @@
"deleted": "Poistettu",
"business_accounts": "Yritystilit",
"streaks": "Streakit",
- "non_streaks": "Non Streaks",
+ "non_streaks": "Ilman streakseja",
"followed": "Seuraava",
"following": "Seuraava",
"location_on_map": "Sijainti kartalla"
@@ -2883,7 +2883,7 @@
"translation_position": {
"above": "Yllä",
"below": "Alla",
- "inline": "Inline"
+ "inline": "Riviss?"
},
"language_codes": {
"en": "Englanti",
@@ -3064,7 +3064,7 @@
}
},
"ui_settings_title": "Käyttöliittymän asetukset",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptinen palaute",
"updates_title": "Päivitykset",
"auto_update_check": "Automaattipäivityksen tarkistus",
"update_check_frequency_daily": "Vuorokausi",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/fr_FR.json b/common/src/main/assets/lang/fr_FR.json
index 7a726e56..fb6f61b1 100644
--- a/common/src/main/assets/lang/fr_FR.json
+++ b/common/src/main/assets/lang/fr_FR.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Sélectionner la langue",
@@ -182,7 +182,7 @@
"rules_title": "Règles",
"participants_text": "{count}participants",
"not_found": "Non trouvé",
- "streaks_title": "Streaks",
+ "streaks_title": "S?ries",
"streaks_length_text": "Longueur:{length}",
"streaks_expiration_text": "Expire dans{eta}",
"streaks_expiration_text_expired": "Expiré",
@@ -532,11 +532,11 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "Ouverture auto des Snaps",
"description": "Automatiquement ouvre Snaps lors de leur réception",
"options": {
"blacklist": "Exclure de Auto Open Snaps",
- "whitelist": "Auto Open Snaps"
+ "whitelist": "Ouverture auto des Snaps"
}
},
"hide_friend_feed": {
@@ -716,7 +716,7 @@
"notifications": {
"chat_screenshot": "Capture d'écran",
"chat_screen_record": "Enregistrement de l'écran",
- "snap_replay": "Snap Replay",
+ "snap_replay": "Relecture de Snap",
"camera_roll_save": "Roule-photo Enregistrer",
"chat": "Chat",
"chat_reply": "Répondre au chat",
@@ -909,7 +909,7 @@
"disable_confirmation_dialogs": {
"erase_message": "Effacer le message",
"remove_friend": "Supprimer l'ami",
- "block_friend": "Block Friend",
+ "block_friend": "Bloquer l'ami",
"ignore_friend": "Ignorer son ami",
"hide_friend": "Cacher l'ami",
"hide_conversation": "Cacher la conversation",
@@ -1021,7 +1021,7 @@
"friendly": "Amiable",
"humorous": "Humoreux",
"empathetic": "Empathie",
- "toxic": "Edgy",
+ "toxic": "Cinglant",
"busy": "Occupé"
},
"ai_temperature": {
@@ -1543,7 +1543,7 @@
"description": "Saute automatiquement au prochain Snap lors du marquage d'un Snap tel que vu.\nUtilisation en combinaison avec Mark Snap comme Bouton vu"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "Lecture en boucle des m?dias",
"description": "Loops media playing lors de l'affichage Snaps / Stories"
},
"disable_replay_in_ff": {
@@ -1781,7 +1781,7 @@
"description": "Invitation système qui définit la personnalité et le comportement de l'IA"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "Nombre max de tokens IA",
"description": "Nombre maximal de jetons (mots) que l'IA peut utiliser dans les réponses"
},
"ai_temperature": {
@@ -1991,7 +1991,7 @@
"description": "Pause traduction lorsque le service est bloqué"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Nombre max de tentatives",
"description": "Nombre maximal de tentatives de réessayer"
},
"retry_delay": {
@@ -2552,7 +2552,7 @@
"suggested": "Suggestion",
"deleted": "Supprimé",
"business_accounts": "Comptes d'entreprise",
- "streaks": "Streaks",
+ "streaks": "S?ries",
"non_streaks": "Non streaks",
"followed": "Suivi",
"following": "Suivant",
@@ -2685,7 +2685,7 @@
}
},
"streaks_reminder": {
- "notification_title": "Streaks",
+ "notification_title": "S?ries",
"notification_text": "Vous allez perdre votre Streak avec{friend}en{hoursLeft}heures"
},
"biometric_auth": {
@@ -2720,9 +2720,9 @@
"incoming_secret_message": "Ton ami a accepté ta clé publique. Cliquez ci-dessous pour accepter le secret."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
+ "title": "Ouverture auto des Snaps",
"priority_title": "Auto Open Snaps (Priorité)",
- "error_title": "Auto Open Snaps (Errors)",
+ "error_title": "Ouverture auto des Snaps (erreurs)",
"channel_description": "Notifications pour l'ouverture automatique du statut de file d'attente snaps",
"priority_channel_description": "Notifications hautement prioritaires pour les snaps d'ouverture automatique",
"error_channel_description": "Notifications d'erreur lorsque l'ouverture automatique des snaps échoue",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OuvrirRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/hi_IN.json b/common/src/main/assets/lang/hi_IN.json
index 2747433a..ec8a09da 100644
--- a/common/src/main/assets/lang/hi_IN.json
+++ b/common/src/main/assets/lang/hi_IN.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "भाषा चुनें",
@@ -116,7 +116,7 @@
"reset_button": "रीसेट करें",
"done_button": "दान",
"clear_friend_feed": "स्पष्ट मित्र फ़ीड",
- "test_mode_label": "Enable PurrAura",
+ "test_mode_label": "???????? ????? ????",
"disable_feature_loading_label": "अक्षम सुविधा लोड हो रहा है",
"disable_auto_mapper_label": "अक्षम ऑटो मैपर",
"disable_bypass_indicator_label": "निष्क्रिय सूचक"
@@ -347,9 +347,9 @@
"no_repos_added": "कोई प्रस्ताव जोड़ा नहीं",
"add_repo_button": "Repository जोड़ें",
"add_repo_dialog_title": "Repository जोड़ें",
- "repo_url_label": "Repository URL",
+ "repo_url_label": "?????????? URL",
"add_button": "जोड़ें",
- "invalid_repo_title": "Invalid Repository",
+ "invalid_repo_title": "?????? ??????????",
"invalid_repo_error": "यह प्रस्ताव डेटा की आवश्यकता नहीं है।.",
"repo_added_toast": "Repository जोड़ा",
"add_repo_failed_toast": "प्रस्ताव को जोड़ने में विफल:{message}",
@@ -453,9 +453,9 @@
"no_repos_added": "कोई प्रस्ताव जोड़ा नहीं",
"add_repo_button": "Repository जोड़ें",
"add_repo_dialog_title": "Repository जोड़ें",
- "repo_url_label": "Repository URL",
+ "repo_url_label": "?????????? URL",
"add_button": "जोड़ें",
- "invalid_repo_title": "Invalid Repository",
+ "invalid_repo_title": "?????? ??????????",
"invalid_repo_error": "यह प्रस्ताव डेटा की आवश्यकता नहीं है।.",
"repo_added_toast": "Repository जोड़ा",
"add_repo_failed_toast": "प्रस्ताव को जोड़ने में विफल:{message}",
@@ -910,7 +910,7 @@
"erase_message": "संदेश",
"remove_friend": "दोस्त निकालें",
"block_friend": "ब्लॉक मित्र",
- "ignore_friend": "Ignore Friend",
+ "ignore_friend": "????? ?? ?????? ????",
"hide_friend": "मित्र",
"hide_conversation": "छुपाना",
"clear_conversation": "फ्रेंड फ़ीड से वार्तालाप साफ़ करें"
@@ -1021,7 +1021,7 @@
"friendly": "अनुकूल",
"humorous": "विनम्र",
"empathetic": "सहानुभूति",
- "toxic": "Edgy",
+ "toxic": "????",
"busy": "बुसी"
},
"ai_temperature": {
@@ -1429,7 +1429,7 @@
"description": "मित्र फ़ीड से एक विशिष्ट दोस्त को छुपाएं\nइस सुविधा का प्रबंधन करने के लिए सोशल टैब का उपयोग करें"
},
"hide_streak_restore": {
- "name": "Hide Streak Restore",
+ "name": "??????? ??????? ??????",
"description": "मित्र फ़ीड में पुनर्स्थापित बटन छुपाएं"
},
"hide_quick_add_suggestions": {
@@ -1515,11 +1515,11 @@
"description": "किसी को यह जानने से रोकता है कि आपने अपनी कहानी फिर से देख ली है"
},
"hide_peek_a_peek": {
- "name": "Hide Peek-a-Peek",
+ "name": "???-?-??? ??????",
"description": "जब आप एक चैट में आधे स्वाइप करते हैं तो अधिसूचना को भेजे जाने से रोकता है"
},
"hide_bitmoji_presence": {
- "name": "Hide Bitmoji Presence",
+ "name": "??????? ???????? ??????",
"description": "चैट में अपने बिटमोजी को पॉप अप करने से रोकता है"
},
"hide_typing_notifications": {
@@ -1581,7 +1581,7 @@
"description": "कुछ प्रकार के संदेश भेजने से रोकता है"
},
"friend_mutation_notifier": {
- "name": "Friend Mutation Notifier",
+ "name": "?????? ???????? ????",
"description": "जब एक दोस्त की प्रोफ़ाइल में कुछ बदलाव आता है तो आपको सूचित करें"
},
"better_notifications": {
@@ -1609,7 +1609,7 @@
"description": "कई मीडिया संदेशों को एक पाठ अधिसूचना में जोड़ती है जब उन्हें पूर्वावलोकन नहीं किया जा सकता है। चैट पूर्वावलोकन के साथ संयोजन में उपयोग करें"
},
"friend_add_source": {
- "name": "Friend Add Source",
+ "name": "????? ?????? ?? ?????",
"description": "अधिसूचना में एक मित्र अनुरोध का स्रोत दिखाता है"
},
"reply_button": {
@@ -1911,7 +1911,7 @@
"description": "अगर यह विफल रहता है तो एक स्नैप खोलने के लिए समय की संख्या"
},
"retry_delay": {
- "name": "Retry Delay (ms)",
+ "name": "??????? ???? (ms)",
"description": "पुनः प्रयास के बीच मिलीसेकंड में विलंब"
}
}
@@ -1925,7 +1925,7 @@
"description": "ऑटो डिलीट संत संदेश को पृष्ठभूमि में चलाने की अनुमति देता है। ध्यान दें: इससे आपकी बैटरी काफी बढ़ जाएगी"
},
"delete_after_value": {
- "name": "Delete After (value)",
+ "name": "???? ??? ????? (value)",
"description": "भेजे गए संदेश को हटाने से पहले समय मूल्य"
},
"delete_after_unit": {
@@ -1995,7 +1995,7 @@
"description": "पुनः प्रयास की अधिकतम संख्या"
},
"retry_delay": {
- "name": "Retry Delay",
+ "name": "??????? ????",
"description": "Retry प्रयासों (milliseconds) के बीच विलंब"
}
}
@@ -2090,7 +2090,7 @@
}
},
"streaks_reminder": {
- "name": "Streaks Reminder",
+ "name": "????????? ????????",
"description": "समय-समय पर आपको अपने स्ट्रेक्स के बारे में सूचित करता है",
"properties": {
"interval": {
@@ -2142,8 +2142,8 @@
}
},
"disable_bitmoji": {
- "name": "Disable Bitmoji",
- "description": "Disables Friends Profile Bitmoji"
+ "name": "??????? ????????? ????",
+ "description": "??????? ?? ????????? ??????? ????????? ???? ??"
},
"custom_emoji_font": {
"name": "कस्टम इमोजी फ़ॉन्ट",
@@ -2180,7 +2180,7 @@
"description": "एंड्रॉइड आईडी को स्नैपचैट में भेजा गया ओवरराइड करें",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Android ID ????? ????",
"description": "एक कस्टम मूल्य के साथ स्नैपचैट को भेजे गए एंड्रॉइड आईडी को ओवरराइड करें"
},
"custom_android_id": {
@@ -2342,7 +2342,7 @@
"description": "स्क्रिप्ट को स्नैपचैट में कस्टम यूआई घटकों को जोड़ने की अनुमति देता है"
},
"disable_log_anonymization": {
- "name": "Disable Log Anonymization",
+ "name": "??? ?????????? ????????? ????",
"description": "लॉग का नामकरण अक्षम करें"
},
"disable_optimization": {
@@ -2665,7 +2665,7 @@
},
"select_attachments_title": "संलग्नक चुनें",
"download_started_toast": "प्रारंभ करना",
- "unsupported_content_type_toast": "Unsupported content type!",
+ "unsupported_content_type_toast": "???????? ??????? ??????!",
"failed_no_longer_available_toast": "मीडिया अब उपलब्ध नहीं",
"no_attachments_toast": "कोई संलग्नक नहीं मिला!",
"already_queued_toast": "पहले से ही कतार में मीडिया!",
@@ -2730,7 +2730,7 @@
"processing_status": "प्रसंस्करण तस्वीरें:{queued}कतार में,{processed}प्रक्रिया",
"monitor_status": "निगरानी...",
"recent_snaps": "हाल ही में स्नैप",
- "action_pause": "Pause",
+ "action_pause": "?????",
"action_resume": "फिर से शुरू",
"action_clear": "स्पष्ट कतार",
"action_reset": "रीसेट करें",
@@ -3078,7 +3078,7 @@
"theme_mode_system": "प्रणाली",
"theme_mode_light": "प्रकाश",
"theme_mode_dark": "अंधेरा",
- "test_mode_label": "Enable PurrAura",
+ "test_mode_label": "???????? ????? ????",
"disable_feature_loading_label": "अक्षम सुविधा लोड हो रहा है",
"disable_auto_mapper_label": "अक्षम ऑटो मैपर",
"disable_bypass_indicator_label": "निष्क्रिय सूचक",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/hu_HU.json b/common/src/main/assets/lang/hu_HU.json
index 3d832f2e..d57abbf5 100644
--- a/common/src/main/assets/lang/hu_HU.json
+++ b/common/src/main/assets/lang/hu_HU.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Nyelv kiválasztása",
@@ -80,11 +80,11 @@
"debug_title": "Hibaelhárítás",
"success_toast": "Kész!",
"message_logger_summary": "{messageCount}üzenetek\n{storyCount}történetek",
- "export_button": "Export",
+ "export_button": "Export?l?s",
"clear_button": "Tiszta",
"view_logger_history_button": "A bejelentkezési előzmény megtekintése",
"ui_settings_title": "UI beállítások",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptikus visszajelz?s",
"use_system_toasts_label": "Rendszerköszöntők használata",
"updates_title": "Frissítések",
"auto_update_check": "Automatikus frissítés ellenőrzése",
@@ -134,8 +134,8 @@
},
"features": {
"disabled": "Fogyatékos",
- "export_option": "Export",
- "import_option": "Import",
+ "export_option": "Export?l?s",
+ "import_option": "Import?l?s",
"reset_option": "Újraindítás",
"config_export_success_toast": "Config sikeresen exportált",
"config_import_success_toast": "Sikeresen importált konfig",
@@ -310,7 +310,7 @@
"downloading_script": "Szkript letöltése...",
"edit_module_button": "Szerkesztés",
"enter_url_label": "Adja meg az URL- t",
- "import_button": "Import",
+ "import_button": "Import?l?s",
"import_from_url_button": "Importálás URL-ből",
"import_script_from_url_title": "Szkript importálása URL-ből",
"import_script_warning": "Csak a megbízható forrásból származó szkriptek telepítése.",
@@ -363,7 +363,7 @@
"logs_tab": "Bejelentkezés",
"catalog_button": "Katalógus",
"add_rule_button": "Cikk hozzáadása",
- "import_button": "Import",
+ "import_button": "Import?l?s",
"filters_title": "Szűrők",
"search_by_label": "Keresés",
"newest_first_label": "A következő",
@@ -371,7 +371,7 @@
"until_label": "Amíg",
"unit_label": "Egység",
"pick_a_date_button": "Válasszon időpontot",
- "export_button": "Export",
+ "export_button": "Export?l?s",
"delete_button": "Törlés",
"search_placeholder": "Keresés",
"no_logs_found": "Nem található napló",
@@ -438,7 +438,7 @@
},
"friend_tracker_import": {
"title": "Barát nyomkövető importálása",
- "confirm_button": "Import",
+ "confirm_button": "Import?l?s",
"back_button_description": "Menj vissza",
"expand_button_description": "Kiterjesztés vagy összeomlás kategóriája",
"imported_toast": "Behozott nyomkövető",
@@ -479,7 +479,7 @@
"config_import": {
"title": "Config összefoglaló importálása",
"back_button_description": "Menj vissza",
- "confirm_button": "Import",
+ "confirm_button": "Import?l?s",
"expand_button_description": "Kiterjesztés vagy összeomlás kategóriája",
"enabled": "Engedélyezve",
"disabled": "Fogyatékos",
@@ -702,7 +702,7 @@
"append_type": "A médiatípus hozzáadása a fájlnévhez"
},
"auto_download_sources": {
- "friend_snaps": "Friend Snaps",
+ "friend_snaps": "Bar?t Snaps",
"friend_stories": "Barát történetek",
"public_stories": "Nyilvános történetek",
"spotlight": "Spotlight"
@@ -719,7 +719,7 @@
"snap_replay": "Snap ismétlés",
"camera_roll_save": "Kamera Roll Mentés",
"chat": "Chat",
- "chat_reply": "Chat Reply",
+ "chat_reply": "Chat v?lasz",
"snap": "Snap",
"typing": "Gépelés",
"stories": "Történetek",
@@ -843,7 +843,7 @@
"ORIGINAL": "Eredeti média",
"NOTE": "Hangjegyzet",
"SNAP": "Snap",
- "SAVEABLE_SNAP": "Saveable Snap",
+ "SAVEABLE_SNAP": "Menthet? Snap",
"null": "Snapchat alapértelmezés"
},
"strip_media_metadata": {
@@ -893,12 +893,12 @@
"snapchat_plus": {
"not_subscribed": "Nincs előfizetve",
"basic": "Alap",
- "ad_free": "Ad Free",
+ "ad_free": "Rekl?mmentes",
"null": "Alapértelmezés"
},
"bypass_video_length_restriction": {
"single": "Egységes média",
- "split": "Split media",
+ "split": "M?dia feloszt?sa",
"null": "Alapértelmezés"
},
"old_bitmoji_selfie": {
@@ -909,7 +909,7 @@
"disable_confirmation_dialogs": {
"erase_message": "Üzenet törlése",
"remove_friend": "Barát eltávolítása",
- "block_friend": "Block Friend",
+ "block_friend": "Ismer?s blokkol?sa",
"ignore_friend": "A barát figyelmen kívül hagyása",
"hide_friend": "A barát elrejtése",
"hide_conversation": "A beszélgetés elrejtése",
@@ -1021,7 +1021,7 @@
"friendly": "Barátságos",
"humorous": "Humoros",
"empathetic": "Empatikus",
- "toxic": "Edgy",
+ "toxic": "Provokat?v",
"busy": "Elfoglalt"
},
"ai_temperature": {
@@ -1085,7 +1085,7 @@
"auto_reply_content_types": {
"chat_messages": "Chat üzenetek",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
+ "story_share_messages": "Story megoszt?sok",
"story_reply_messages": "Történet válaszok",
"external_media_messages": "Külső média",
"voice_note_messages": "Hangjegyek",
@@ -1139,7 +1139,7 @@
"description": "Állítsák be a hamis hely koordinátáit"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "S?t?l?si sug?r",
"description": "Véletlenszerűen járkáljon ezen a sugáron belül (ft)"
},
"always_update_location": {
@@ -1173,7 +1173,7 @@
"description": "Felülírja a média feltöltési minőségét",
"properties": {
"force_video_upload_source_quality": {
- "name": "Force Video Upload Source Quality",
+ "name": "Vide?felt?lt?s forr?smin?s?g?nek k?nyszer?t?se",
"description": "Forces Snapchat használni a forrás minőségét feltöltésekor videók\nFelhívjuk figyelmét, hogy ez nem távolíthatja el a metaadatokat a médiából"
},
"disable_image_compression": {
@@ -1210,7 +1210,7 @@
"name": "UI beállítások",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Haptikus visszajelz?s"
}
}
},
@@ -1223,7 +1223,7 @@
"description": "Eltávolítja a szakaszokat a Történetek oldaláról\nSzükség lehet egy frissítésre, hogy megfelelően működjön"
},
"block_ads": {
- "name": "Block Ads",
+ "name": "Hirdet?sek blokkol?sa",
"description": "Megelőzi a hirdetések megjelenését"
},
"disable_custom_tabs": {
@@ -1243,7 +1243,7 @@
"description": "Megjeleníti a szerző felhasználónevét a Spotlight megjegyzésekben"
},
"spotlight_comments_username_icon": {
- "name": "Spotlight Comments Username Icon",
+ "name": "Spotlight megjegyz?sek felhaszn?l?n?v ikon",
"description": "Válassza ki, melyik ikon jelenik meg a felhasználónevek mellett a Spotlight megjegyzésekben"
},
"bypass_video_length_restriction": {
@@ -1313,7 +1313,7 @@
"description": "A képek elmentése egy megadott formátumban"
},
"force_voice_note_format": {
- "name": "Force Voice Note Format",
+ "name": "Hangjegyzet form?tum k?nyszer?t?se",
"description": "Forces Voice A megjegyzések elmentése meghatározott formátumban"
},
"auto_download_voice_notes": {
@@ -1399,7 +1399,7 @@
"description": "Megjelenít egy kis preview mellett láthatatlan Snaps a chat"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Bootstrap fel?lb?r?l?s",
"description": "A felhasználói felület bootstrap beállításainak felülbírálása",
"properties": {
"app_appearance": {
@@ -1407,7 +1407,7 @@
"description": "Állandó app megjelenés beállítása"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "Kezd?lap f?l",
"description": "Felülírja a startup lapot a Snapchat megnyitásakor"
}
}
@@ -1445,11 +1445,11 @@
"description": "Válassza ki, melyik UI-komponenst rejtse el"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "Opera Media gyors inf?",
"description": "Hasznos információkat mutat a médiáról, például a teremtés dátumát az opera nézőinek menüjében"
},
"old_bitmoji_selfie": {
- "name": "Old Bitmoji Selfie",
+ "name": "R?gi Bitmoji szelfi",
"description": "Visszahozza a Bitmoji selfies régebbi Snapchat verziók"
},
"disable_spotlight": {
@@ -1469,7 +1469,7 @@
"description": "Lehetővé teszi a függőleges történet néző minden történet"
},
"enable_friend_feed_menu_bar": {
- "name": "Friend Feed Menu Bar",
+ "name": "Bar?tfolyam men?sor",
"description": "Engedélyezi az új Friend Feed menü"
},
"message_indicators": {
@@ -1511,7 +1511,7 @@
"description": "Megelőzi, hogy bárki megtudja, hogy láttad a történetét"
},
"prevent_story_rewatch_indicator": {
- "name": "Prevent Story Rewatch Indicator",
+ "name": "Story ?jran?z?s jelz? letilt?sa",
"description": "Megelőzi, hogy bárki megtudja, hogy újra megnézted a sztoriját"
},
"hide_peek_a_peek": {
@@ -1543,7 +1543,7 @@
"description": "Automatikusan ugrik a következő Snap, amikor megjelöli a Snap, mint látható.\nAlkalmazása együtt Mark Snap, mint látott gomb"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "M?dia lej?tsz?s ism?tl?se",
"description": "Loops média lejátszás megtekintésekor Snaps / Stories"
},
"disable_replay_in_ff": {
@@ -1593,15 +1593,15 @@
"description": "Csoportos értesítések egyetlen példányban"
},
"chat_preview": {
- "name": "Chat Preview",
+ "name": "Chat el?n?zet",
"description": "Megjeleníti a kapott üzenetek előnézetét a bejelentésben"
},
"media_preview": {
- "name": "Media Preview",
+ "name": "M?dia el?n?zet",
"description": "Megjeleníti a kiválasztott médiatípusok előnézetét a bejelentésben"
},
"media_caption": {
- "name": "Media Caption",
+ "name": "M?dia felirat",
"description": "Megjeleníti a média csatolását a bejelentésben"
},
"stacked_media_messages": {
@@ -1761,7 +1761,7 @@
"description": "Az MI használata intelligens automatikus válaszok generálásához sablon üzenetek helyett"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "MI szolg?ltat?",
"description": "Válassza ki, melyik MI szolgáltatást kell használni a válaszok generálására"
},
"ai_endpoint_url": {
@@ -1781,7 +1781,7 @@
"description": "System prompt, amely meghatározza a MI személyiségét és viselkedését"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "MI max tokenek",
"description": "A válaszokban használható MI-k maximális száma (szavak)"
},
"ai_temperature": {
@@ -1895,7 +1895,7 @@
"description": "Lehetővé teszi az Auto Open Snaps futását a háttérben. Megjegyzés: Ez jelentősen lemeríti az akkumulátorát"
},
"min_delay": {
- "name": "Min Delay (ms)",
+ "name": "Min. k?sleltet?s (ms)",
"description": "Minimális késleltetés milliszekundumban a felbontás előtt"
},
"max_delay_ms": {
@@ -1991,7 +1991,7 @@
"description": "A fordítás megszakítása a szolgáltatás blokkolása esetén"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Max. ?jrapr?b?lkoz?s",
"description": "Az ismételt kísérletek maximális száma"
},
"retry_delay": {
@@ -2094,7 +2094,7 @@
"description": "Időszakos bejelentés a csíkjaidról",
"properties": {
"interval": {
- "name": "Interval",
+ "name": "Intervallum",
"description": "Az egyes emlékeztetők közötti időtartam (óra)"
},
"remaining_hours": {
@@ -2112,11 +2112,11 @@
"description": "Kísérleti jellemzők",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
+ "name": "Native hookok",
"description": "A Snapchat anyavegyületének kódját behálózó biztonsági jellemzők",
"properties": {
"composer_hooks": {
- "name": "Composer Hooks",
+ "name": "Composer hookok",
"description": "Injekciós kód a Composer cross-platform UI keretébe",
"properties": {
"show_first_created_username": {
@@ -2132,7 +2132,7 @@
"description": "Több lehetőséget ad az önmegsemmisítő időzítőre a Snap küldésekor"
},
"composer_console": {
- "name": "Composer Console",
+ "name": "Composer konzol",
"description": "Lehetővé teszi, hogy végrehajtsa a JavaScript kódot a Composer (arm64 csak)"
},
"composer_logs": {
@@ -2204,11 +2204,11 @@
"description": "Konvertálja pattogó chat külső média helyben. Ez jelenik meg a chat letöltési környezet menü"
},
"media_file_picker": {
- "name": "Media File Picker",
+ "name": "M?diaf?jlv?laszt?",
"description": "Lehetővé teszi, hogy válasszon bármilyen videó / audio fájlt a galériából"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Story napl?",
"description": "A barátok történeteinek története"
},
"call_recorder": {
@@ -2230,7 +2230,7 @@
"description": "Javítja a hangjegy átiratot",
"properties": {
"force_transcription": {
- "name": "Force Voice Note Transcription",
+ "name": "Hangjegyzet-?tirat k?nyszer?t?se",
"description": "Lehetővé teszi az összes hangjegy átírását"
},
"preferred_transcription_lang": {
@@ -2256,7 +2256,7 @@
"description": "Nem kiadott / béta Snapchat funkciók engedélyezése"
},
"context_menu_fix": {
- "name": "Context Menu Fix",
+ "name": "Kontextusmen? jav?t?s",
"description": "A Friend Feed Menü javítása, mint amikor a készülék kikapcsolt, nem jelenik meg helyesen"
},
"app_lock": {
@@ -2274,7 +2274,7 @@
"description": "A Story Boost Limit késleltetése"
},
"meo_passcode_bypass": {
- "name": "My Eyes Only Passcode Bypass",
+ "name": "My Eyes Only jelsz? megker?l?se",
"description": "A Szemeim megkerülése Csak jelszó\nEz csak akkor fog működni, ha a jelszó helyesen van bejegyezve, mielőtt"
},
"no_friend_score_delay": {
@@ -2407,7 +2407,7 @@
"MAP_REACTION": "Térkép Reakció",
"chat_messages": "Chat üzenetek",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
+ "story_share_messages": "Story megoszt?sok",
"story_reply_messages": "Történet válaszok",
"external_media_messages": "Külső média",
"voice_note_messages": "Hangjegy",
@@ -2419,12 +2419,12 @@
"media_download_source": {
"none": "Nincs",
"pending": "Függőben",
- "chat_media": "Chat Media",
+ "chat_media": "Chat m?dia",
"story": "Történet",
"public_story": "Nyilvános történet",
"spotlight": "Spotlight",
"profile_picture": "Profilkép",
- "story_logger": "Story Logger",
+ "story_logger": "Story napl?",
"message_logger": "Üzenetjelző",
"merged": "Egyesülve",
"voice_call": "Hanghívás"
@@ -2454,7 +2454,7 @@
"ORIGINAL": "Eredeti média",
"NOTE": "Hangjegyzet",
"SNAP": "Snap",
- "SAVEABLE_SNAP": "Saveable Snap",
+ "SAVEABLE_SNAP": "Menthet? Snap",
"null": "Snapchat alapértelmezés",
"multiple_media_toast": "Egyszerre csak egy médiát küldhetsz"
},
@@ -2514,7 +2514,7 @@
"actions": {
"remove_friends": "A barátok eltávolítása",
"clear_conversations": "Beszélgetések törlése",
- "clear_friend_feed": "Clear Friend Feed ({count})",
+ "clear_friend_feed": "Bar?tfolyam t?rl?se ({count})",
"unfollow": "Nem követi",
"remove": "Eltávolítás"
},
@@ -2580,7 +2580,7 @@
"download_medias_title": "Média letöltése"
},
"dialog_negative_button": "Törlés",
- "dialog_positive_button": "Export",
+ "dialog_positive_button": "Export?l?s",
"exported_to": "Kivitel{path}",
"exporting_chats": "Chats exportálása...",
"processing_chats": "Felfeldolgozás{amount}beszélgetések...",
@@ -2627,7 +2627,7 @@
},
"cleared_from_feed": "Takarmányból megtisztítva",
"tracker_actions": {
- "log": "Log",
+ "log": "Napl?",
"in_app_notification": "Az alkalmazás bejelentése",
"push_notification": "Értesítés",
"custom": "Egyéni"
@@ -2721,7 +2721,7 @@
},
"auto_open_snaps": {
"title": "Automatikus nyitás",
- "priority_title": "Auto Open Snaps (Priority)",
+ "priority_title": "Snaps automatikus megnyit?sa (priorit?s)",
"error_title": "Auto Open Snaps (hibák)",
"channel_description": "Értesítések az automatikus nyitási csatolású csatolások sorban állásáról",
"priority_channel_description": "Az automatikus nyitásra vonatkozó kiemelt értesítések",
@@ -2751,7 +2751,7 @@
"unknown_user": "Ismeretlen felhasználó",
"content_type_external_media": "Külső média",
"content_type_snap": "Snap",
- "conversation_type_friend_dm": "Friend DM",
+ "conversation_type_friend_dm": "Bar?t DM",
"conversation_type_dm": "DM",
"conversation_type_group_chat": "Csoport",
"conversation_type_chat": "Chat",
@@ -2925,7 +2925,7 @@
"rules": "Szabályok"
},
"actions": {
- "export": "Export",
+ "export": "Export?l?s",
"delete": "Törlés",
"add_rule": "Cikk hozzáadása",
"save_rule": "A szabály mentése"
@@ -3053,7 +3053,7 @@
"config_json": "Konfigurációs fájl",
"mappings_json": "Mappings fájl",
"message_logger_db": "Üzenet bejelentkezési adatbázis",
- "pinned_best_friend_txt": "Pinned Best Friend File",
+ "pinned_best_friend_txt": "Kit?z?tt legjobb bar?t f?jl",
"native_sig_cache_txt": "Natív aláírás Cache fájl"
},
"settings": {
@@ -3064,7 +3064,7 @@
}
},
"ui_settings_title": "UI beállítások",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptikus visszajelz?s",
"updates_title": "Frissítések",
"auto_update_check": "Automatikus frissítés ellenőrzése",
"update_check_frequency_daily": "Napi",
@@ -3097,7 +3097,7 @@
"sort_by_folder": "Rendezés mappa szerint",
"include_my_eyes_only": "Csak a szemeimet tartalmazza",
"cancel": "Törlés",
- "export": "Export",
+ "export": "Export?l?s",
"quit": "Kilépés",
"done": "Kész",
"ok": "OKÉ",
@@ -3111,7 +3111,7 @@
"import_script_from_url": "Szkript importálása URL-ből",
"warning_imported_scripts": "Figyelem: Az importált szkriptek károsak lehetnek az eszközre. Csak megbízható forrásból származó forgatókönyveket importálunk.",
"enter_url_here": "Adja meg az URL-t:",
- "import": "Import",
+ "import": "Import?l?s",
"cancel": "Törlés",
"documentation": "Dokumentáció"
},
@@ -3170,7 +3170,7 @@
},
"debug_dialogs": {
"info": "Információ",
- "refs": "Refs",
+ "refs": "Referenci?k",
"arroyo": "Arroyo",
"message": "Üzenet",
"media_references": "Médiahivatkozások",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/id.json b/common/src/main/assets/lang/id.json
index 44b4bf65..279f64c1 100644
--- a/common/src/main/assets/lang/id.json
+++ b/common/src/main/assets/lang/id.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Pilih Bahasa",
@@ -52,7 +52,7 @@
"customize_bottom_bar_subtitle": "Pilih tab mana yang ditampilkan pada layar rumah Anda",
"available_tabs_title": "Tab Tersedia",
"shown_tabs_title": "Tab Shown",
- "reset_button": "Reset",
+ "reset_button": "Atur ulang",
"done_button": "Selesai"
},
"sections": {
@@ -84,13 +84,13 @@
"clear_button": "Hapus",
"view_logger_history_button": "Tilik Riwayat Logger",
"ui_settings_title": "Pengaturan UI",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Umpan balik haptik",
"use_system_toasts_label": "Gunakan Kaus Sistem",
"updates_title": "Pemutakhiran",
"auto_update_check": "Periksa Perbarui Otomatis",
"update_check_frequency_daily": "Harian",
"update_check_frequency_weekly": "Mingguan",
- "update_check_frequency_monthly": "Monthly",
+ "update_check_frequency_monthly": "Bulanan",
"update_channel_stable": "Stabil",
"update_channel_prerelease": "Lepaskan",
"update_notification_channel_name": "Pemutakhiran",
@@ -107,13 +107,13 @@
"friend_notes_no_notes_to_backup": "Belum ada catatan cadangan",
"friend_notes_backup_success": "Catatan teman didukung",
"friend_notes_restore_success": "Catatan teman dipulihkan",
- "backup_button": "Backup",
+ "backup_button": "Cadangan",
"restore_button": "Pulihkan",
"view_button": "Tilik",
"customize_bottom_bar_title": "Ubahan Batang Bawah",
"customize_bottom_bar_subtitle": "Pilih tab mana yang ditampilkan pada layar rumah Anda",
"available_tabs_title": "Tab Tersedia",
- "reset_button": "Reset",
+ "reset_button": "Atur ulang",
"done_button": "Selesai",
"clear_friend_feed": "Hapus Pakan Teman",
"test_mode_label": "Aktifkan PurrAura",
@@ -136,7 +136,7 @@
"disabled": "Dinonaktifkan",
"export_option": "Ekspor",
"import_option": "Impor",
- "reset_option": "Reset",
+ "reset_option": "Atur ulang",
"config_export_success_toast": "Konfigurasi diekspor dengan sukses",
"config_import_success_toast": "Konfigurasi diimpor dengan sukses",
"config_import_failure_toast": "Gagal mengimpor konfigurasi{error}",
@@ -369,7 +369,7 @@
"newest_first_label": "Terbaru pertama",
"since_label": "Sejak",
"until_label": "Sampai",
- "unit_label": "Unit",
+ "unit_label": "Satuan",
"pick_a_date_button": "Pilih tanggal",
"export_button": "Ekspor",
"delete_button": "Hapus",
@@ -385,7 +385,7 @@
"rule_name_label": "Nama Aturan",
"default_rule_name": "Aturan Baru",
"author_name_label": "Penulis",
- "scope_section_title": "Scope",
+ "scope_section_title": "Lingkup",
"scope_all": "Semua Teman / Grup",
"scope_whitelist": "Tidak ada kecuali",
"scope_blacklist": "Semua orang kecuali",
@@ -394,7 +394,7 @@
"no_events_text": "Belum ada kejadian yang ditambahkan",
"add_event_dialog_title": "Tambah Peristiwa",
"event_type_label": "Jenis Kejadian",
- "triggers_title": "Triggers",
+ "triggers_title": "Pemicu",
"conditions_title": "Kondisi",
"condition_only_inside_conversation": "Hanya ketika aku di dalam percakapan",
"condition_only_outside_conversation": "Hanya ketika aku di luar percakapan",
@@ -511,7 +511,7 @@
"name": "Mode Stealth",
"description": "Mencegah siapa pun dari mengetahui Anda telah membuka Snaps mereka / Chats dan percakapan",
"options": {
- "blacklist": "Exclude from Stealth Mode",
+ "blacklist": "Kecualikan dari mode siluman",
"whitelist": "Mode siluman"
}
},
@@ -608,7 +608,7 @@
},
"export_memories": {
"name": "Ekspor Kenangan",
- "description": "Exports memories into a ZIP file"
+ "description": "Ekspor Memories ke file ZIP"
},
"bulk_messaging_action": {
"name": "Aksi Pesan Bolak",
@@ -628,7 +628,7 @@
},
"friend_tracker": {
"name": "Pelacak Teman",
- "description": "Track your friends on Snapchat"
+ "description": "Lacak teman Anda di Snapchat"
},
"logger_history": {
"name": "Riwayat Logger",
@@ -716,7 +716,7 @@
"notifications": {
"chat_screenshot": "Cuplikan layar",
"chat_screen_record": "Catatan Layar",
- "snap_replay": "Snap Replay",
+ "snap_replay": "Putar ulang Snap",
"camera_roll_save": "Kamera Roll Save",
"chat": "Obrolan",
"chat_reply": "Balas Percakapan",
@@ -733,43 +733,43 @@
"map_live_location": "Lokasi Peta Hidup"
},
"auto_read": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"hide_typing_indicator": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"auto_delete_sent_messages": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"auto_download": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"stealth": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"auto_save": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"message_logger": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"auto_reply": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Daftar hitam",
+ "whitelist": "Daftar putih",
"disabled": "Dinonaktifkan"
},
"custom_android_id": {
@@ -1021,7 +1021,7 @@
"friendly": "Ramah",
"humorous": "Humor",
"empathetic": "Empatik",
- "toxic": "Edgy",
+ "toxic": "Kasar",
"busy": "Sibuk"
},
"ai_temperature": {
@@ -1086,7 +1086,7 @@
"chat_messages": "Pesan Percakapan",
"snap_messages": "Snaps",
"story_share_messages": "Tabungan Cerita",
- "story_reply_messages": "Story Replies",
+ "story_reply_messages": "Balasan Story",
"external_media_messages": "Media Eksternal",
"voice_note_messages": "Catatan Suara",
"sticker_messages": "Stiker",
@@ -1112,7 +1112,7 @@
"translation_position": {
"above": "Di atas teks",
"below": "Di bawah teks",
- "inline": "Inline"
+ "inline": "Sebaris"
},
"source_language": {
"auto": "Mendeteksi otomatis"
@@ -1210,7 +1210,7 @@
"name": "Pengaturan UI",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Umpan balik haptik"
}
}
},
@@ -1337,11 +1337,11 @@
"description": "Nyatakan tambahan Pilihan FFmpeg",
"properties": {
"threads": {
- "name": "Threads",
+ "name": "Utas",
"description": "Jumlah thread yang dipakai"
},
"preset": {
- "name": "Preset",
+ "name": "Prasetel",
"description": "Set kecepatan konversi"
},
"constant_rate_factor": {
@@ -1367,7 +1367,7 @@
}
},
"logging": {
- "name": "Logging",
+ "name": "Pencatatan",
"description": "Tampilkan toast ketika media mengunduh"
},
"custom_path_format": {
@@ -1389,7 +1389,7 @@
"description": "Tampilkan pratilik pesan terakhir dalam Pangsa Teman",
"properties": {
"amount": {
- "name": "Amount",
+ "name": "Jumlah",
"description": "Jumlah pesan yang akan ditampilkan"
}
}
@@ -1399,7 +1399,7 @@
"description": "Tampilkan pratinjau kecil di samping Snaps tak terlihat dalam percakapan"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Penggantian bootstrap",
"description": "Timpa pengaturan bootstrap antar muka pengguna",
"properties": {
"app_appearance": {
@@ -1507,7 +1507,7 @@
"description": "Mencegah Snapchat mendeteksi ketika Anda mengambil cuplikan layar"
},
"anonymous_story_viewing": {
- "name": "Anonymous Story Viewing",
+ "name": "Melihat Story secara anonim",
"description": "Mencegah siapa pun dari mengetahui Anda telah melihat cerita mereka"
},
"prevent_story_rewatch_indicator": {
@@ -1617,7 +1617,7 @@
"description": "Tambahkan tombol balasan ke pemberitahuan"
},
"smart_replies": {
- "name": "Smart Replies",
+ "name": "Balasan pintar",
"description": "Tambahkan balasan yang disarankan ke pemberitahuan (Android 10 +). Gunakan dalam kombinasi dengan Tombol Balas"
},
"download_button": {
@@ -1693,7 +1693,7 @@
"description": "Membuat catatan audio tidak dapat diselamatkan"
},
"story_reply": {
- "name": "Story Replies",
+ "name": "Balasan Story",
"description": "Membuat cerita menjawab tak terbalas"
}
}
@@ -1713,7 +1713,7 @@
}
},
"strip_media_metadata": {
- "name": "Strip Media Metadata",
+ "name": "Hapus metadata media",
"description": "Hapus metadata media sebelum mengirim pesan"
},
"bypass_message_retention_policy": {
@@ -1847,11 +1847,11 @@
"description": "Pesan jawaban otomatis untuk pesan obrolan teks"
},
"snap_messages": {
- "name": "Snap Replies",
+ "name": "Balasan Snap",
"description": "Pesan jawaban otomatis untuk terkunci"
},
"story_share_messages": {
- "name": "Story Share Replies",
+ "name": "Balasan berbagi Story",
"description": "Pesan jawaban otomatis untuk berbagi cerita"
},
"story_reply_messages": {
@@ -1867,11 +1867,11 @@
"description": "Pesan jawaban otomatis untuk catatan suara"
},
"sticker_messages": {
- "name": "Sticker Replies",
+ "name": "Balasan stiker",
"description": "Pesan jawaban otomatis bagi stiker"
},
"tiny_snap_messages": {
- "name": "Tiny Snap Replies",
+ "name": "Balasan Snap kecil",
"description": "Pesan jawaban otomatis untuk kecil terkunci"
},
"map_reaction_messages": {
@@ -2090,7 +2090,7 @@
}
},
"streaks_reminder": {
- "name": "Streaks Reminder",
+ "name": "Pengingat streak",
"description": "Secara periodikal memberitahu Anda tentang Streaks Anda",
"properties": {
"interval": {
@@ -2128,7 +2128,7 @@
"description": "Meningkatkan jumlah media maksimum Anda dapat mengirim dari gulungan kamera"
},
"custom_self_destruct_snap_delay": {
- "name": "Custom Self Destruct Snap Delay",
+ "name": "Penundaan Snap hancur sendiri khusus",
"description": "Memberikan lebih banyak pilihan untuk timer penghancuran diri sendiri ketika mengirim Snap"
},
"composer_console": {
@@ -2177,7 +2177,7 @@
},
"spoof_device_id": {
"name": "ID Perangkat Spoof",
- "description": "Override the Android ID sent to Snapchat",
+ "description": "Ganti ID Android yang dikirim ke Snapchat",
"properties": {
"spoof_android_id": {
"name": "ID Android Spoof",
@@ -2264,7 +2264,7 @@
"description": "Mencegah akses ke Snapchat tanpa kode akses",
"properties": {
"lock_on_resume": {
- "name": "Lock On Resume",
+ "name": "Kunci saat dilanjutkan",
"description": "Kunci aplikasi ketika dibuka kembali"
}
}
@@ -2274,7 +2274,7 @@
"description": "Melewati penundaan Batas Boost Cerita"
},
"meo_passcode_bypass": {
- "name": "My Eyes Only Passcode Bypass",
+ "name": "Lewati kode sandi My Eyes Only",
"description": "Melewati Mataku Hanya kode sandi\nIni hanya akan bekerja jika kode akses telah dimasukkan dengan benar sebelum"
},
"no_friend_score_delay": {
@@ -2282,7 +2282,7 @@
"description": "Hapus penundaan ketika melihat Skor Teman"
},
"best_friend_pinning": {
- "name": "Best Friend Pinning",
+ "name": "Penyematan teman terbaik",
"description": "Memungkinkan Anda untuk pin teman sebagai nomor satu teman terbaik Anda. Catatan: Hanya Anda dapat melihat teman terbaik Anda terjepit"
},
"e2ee": {
@@ -2401,18 +2401,18 @@
"FAMILY_CENTER_INVITE": "Undang Pusat Keluarga",
"FAMILY_CENTER_ACCEPT": "Family Center Terima",
"FAMILY_CENTER_LEAVE": "Meninggalkan Pusat Keluarga",
- "STATUS_PLUS_GIFT": "Status Plus Gift",
- "TINY_SNAP": "Tiny Snap",
+ "STATUS_PLUS_GIFT": "Hadiah Status Plus",
+ "TINY_SNAP": "Snap kecil",
"STATUS_COUNTDOWN": "Hitung mundur",
"MAP_REACTION": "Reaksi Peta",
"chat_messages": "Pesan Percakapan",
"snap_messages": "Snaps",
"story_share_messages": "Tabungan Cerita",
- "story_reply_messages": "Story Replies",
+ "story_reply_messages": "Balasan Story",
"external_media_messages": "Media Eksternal",
"voice_note_messages": "Catatan Suara",
"sticker_messages": "Sticker",
- "tiny_snap_messages": "Tiny Snap",
+ "tiny_snap_messages": "Snap kecil",
"map_reaction_messages": "Reaksi Peta",
"half_swipes": "Setengah Berenang"
},
@@ -2493,7 +2493,7 @@
"not_subscribed": "Tidak Berlangganan"
},
"friendship_link_type": {
- "mutual": "Mutual",
+ "mutual": "Saling",
"outgoing": "Keluar",
"blocked": "Diblokir",
"deleted": "Dihapus",
@@ -2553,7 +2553,7 @@
"deleted": "Dihapus",
"business_accounts": "Akun Bisnis",
"streaks": "Streaks",
- "non_streaks": "Non Streaks",
+ "non_streaks": "Tanpa streak",
"followed": "Diikuti",
"following": "Mengikuti",
"location_on_map": "Lokasi pada Peta"
@@ -2582,7 +2582,7 @@
"dialog_negative_button": "Batal",
"dialog_positive_button": "Ekspor",
"exported_to": "Exported to{path}",
- "exporting_chats": "Exporting Chats...",
+ "exporting_chats": "Mengekspor chat...",
"processing_chats": "Proses{amount}percakapan...",
"export_fail": "Gagal mengekspor percakapan{conversation}",
"writing_output": "Menulis keluaran...",
@@ -2622,12 +2622,12 @@
"snap_replayed": "Snap Diputar Ulang",
"snap_replayed_twice": "Snap Replayed Dua kali",
"snap_screenshot": "Cuplikan Snap",
- "snap_screen_record": "Snap Screen Record",
- "i_can_see_you": "I Can See You"
+ "snap_screen_record": "Rekam layar Snap",
+ "i_can_see_you": "Aku bisa melihatmu"
},
"cleared_from_feed": "Dibersihkan dari pakan",
"tracker_actions": {
- "log": "Log",
+ "log": "Catat",
"in_app_notification": "Pemberitahuan In- App",
"push_notification": "Pemberitahuan Push",
"custom": "Gubahan"
@@ -2759,7 +2759,7 @@
"notification_statistics": "STATIK",
"notification_queue_size": "Ukuran Antrian",
"notification_total_opened": "Total Snaps dibuka",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "PRATINJAU ANTRIAN",
"notification_processing_continue": "Proses akan dilanjutkan secara otomatis...",
"notification_no_snaps_queue": "Tidak terkunci dalam antrian.",
"notification_queue_cleared_opened": "Antrian dibersihkan ({opened}dibuka)",
@@ -2883,7 +2883,7 @@
"translation_position": {
"above": "Atas",
"below": "Bawah",
- "inline": "Inline"
+ "inline": "Sebaris"
},
"language_codes": {
"en": "Inggris",
@@ -2915,7 +2915,7 @@
"et": "Estonia",
"lv": "Latvia",
"lt": "Lithuania",
- "mt": "Maltese",
+ "mt": "Malta",
"ga": "Irlandia",
"cy": "Welsh"
},
@@ -3028,11 +3028,11 @@
},
"edit_rule": {
"custom_rule": "Aturan Gubahan",
- "scope": "Scope",
+ "scope": "Lingkup",
"events": "Kejadian",
"add_event": "Tambah Peristiwa",
"type": "Tipe",
- "triggers": "Triggers",
+ "triggers": "Pemicu",
"conditions": "Kondisi",
"only_inside_conversation": "Hanya ketika aku di dalam percakapan",
"only_outside_conversation": "Hanya ketika aku di luar percakapan",
@@ -3064,12 +3064,12 @@
}
},
"ui_settings_title": "Pengaturan UI",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Umpan balik haptik",
"updates_title": "Pemutakhiran",
"auto_update_check": "Periksa Perbarui Otomatis",
"update_check_frequency_daily": "Harian",
"update_check_frequency_weekly": "Mingguan",
- "update_check_frequency_monthly": "Monthly",
+ "update_check_frequency_monthly": "Bulanan",
"update_channel_stable": "Stabil",
"update_channel_prerelease": "Lepaskan",
"friend_notes_title": "Catatan Teman",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/it_IT.json b/common/src/main/assets/lang/it_IT.json
index 93d42350..65bea7c0 100644
--- a/common/src/main/assets/lang/it_IT.json
+++ b/common/src/main/assets/lang/it_IT.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Seleziona la lingua",
@@ -30,10 +30,10 @@
"home": "Home",
"home_about": "Informazioni",
"home_settings": "Impostazioni impostazioni",
- "home_logs": "Logs",
+ "home_logs": "Registri",
"logger_history": "Storia di Logger",
"logged_stories": "Storie intasate",
- "friend_tracker": "Friend Tracker",
+ "friend_tracker": "Tracker amici",
"friend_tracker_catalog": "Catalogo Tracker Friend",
"manage_friend_tracker_repos": "Gestire i repository di Friend Tracker",
"edit_rule": "Modifica",
@@ -42,7 +42,7 @@
"social": "Sociale",
"manage_scope": "Gestisci lo Scope",
"messaging_preview": "Anteprima",
- "scripts": "Scripts",
+ "scripts": "Script",
"manage_script_repos": "Gestione dei repository Script",
"view_logger_history": "Storia di Logger",
"better_location": "Migliore posizione"
@@ -123,7 +123,7 @@
},
"tasks": {
"no_tasks": "Nessuna attività",
- "merge_button": "Merge",
+ "merge_button": "Unisci",
"failed_to_open_file": "Non ha aperto il file",
"merge_files_toast": "Merito{count}file",
"remove_selected_tasks_title": "Sei sicuro di voler rimuovere le attività selezionate?",
@@ -276,7 +276,7 @@
"content": "PurrfectSnap include uno strumento di scripting, consentendo l'esecuzione del codice definito dall'utente sul dispositivo. Utilizzare estrema cautela e installare solo moduli da fonti conosciute e affidabili. I moduli non autorizzati o non verificati possono costituire rischi di sicurezza per il sistema."
},
"reset_config": {
- "title": "Reset config",
+ "title": "Reimposta configurazione",
"content": "Sei sicuro di voler resettare la configurazione?",
"success_toast": "Ripristino configurazione con successo"
},
@@ -305,7 +305,7 @@
"clear_module_data_failed": "Non riuscita a cancellare i dati del modulo",
"delete_module_button": "Cancella",
"delete_module_failed": "Non è stato possibile eliminare il modulo",
- "documentation_button": "Docs",
+ "documentation_button": "Documentazione",
"download_script_failed": "Non è riuscito a scaricare lo script",
"downloading_script": "Scarica lo script...",
"edit_module_button": "Modifica",
@@ -360,7 +360,7 @@
},
"friend_tracker": {
"rules_tab": "Regole",
- "logs_tab": "Logs",
+ "logs_tab": "Registri",
"catalog_button": "Catalogo",
"add_rule_button": "Aggiungere la regola",
"import_button": "Importazioni",
@@ -394,7 +394,7 @@
"no_events_text": "Nessun evento aggiunto",
"add_event_dialog_title": "Aggiungi evento",
"event_type_label": "Tipo Evento",
- "triggers_title": "Triggers",
+ "triggers_title": "Trigger",
"conditions_title": "Condizioni",
"condition_only_inside_conversation": "Solo quando sono dentro la conversazione",
"condition_only_outside_conversation": "Solo quando sono fuori a parlare",
@@ -500,7 +500,7 @@
},
"properties": {
"auto_download": {
- "name": "Auto download",
+ "name": "Download automatico",
"description": "Scaricare automaticamente Snaps quando li visualizza",
"options": {
"blacklist": "Escluso da Auto Download",
@@ -532,11 +532,11 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "Apri Snaps automaticamente",
"description": "Apre automaticamente Snaps quando li riceve",
"options": {
"blacklist": "Escluso da Auto Open Snaps",
- "whitelist": "Auto Open Snaps"
+ "whitelist": "Apri Snaps automaticamente"
}
},
"hide_friend_feed": {
@@ -627,7 +627,7 @@
"description": "Importa i file da usare in Snapchat"
},
"friend_tracker": {
- "name": "Friend Tracker",
+ "name": "Tracker amici",
"description": "Traccia i tuoi amici su Snapchat"
},
"logger_history": {
@@ -659,7 +659,7 @@
"null": "Utilizzare il livello reale della batteria"
},
"friend_feed_menu_buttons": {
- "auto_download": "⬇️ Auto Download",
+ "auto_download": "?? Download automatico",
"auto_save": "💬 Salva automaticamente i messaggi",
"unsaveable_messages": "⬇️ Messaggi non rivelabili",
"auto_open_snaps": "📷 Auto a scatto aperto",
@@ -671,7 +671,7 @@
"conversation_info": "Informazioni sulla conversazione",
"e2e_encryption": "🔒 Utilizzare la crittografia E2E",
"message_logger": "Traduzione:",
- "auto_read": "✅ Auto Read",
+ "auto_read": "? Lettura automatica",
"hide_typing_indicator": "🙈 Nascondi Indicatore di digitazione"
},
"schedule_scheduled_for": "Programmato per{name}in{time}",
@@ -734,42 +734,42 @@
},
"auto_read": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"hide_typing_indicator": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"auto_delete_sent_messages": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"auto_download": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"stealth": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"auto_save": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"message_logger": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"auto_reply": {
"blacklist": "Lista nera",
- "whitelist": "Whitelist",
+ "whitelist": "Lista consentiti",
"disabled": "Disabili"
},
"custom_android_id": {
@@ -792,7 +792,7 @@
"null": "Utilizzare Snapchat predefinito"
},
"custom_emoji_font": {
- "null": "Default Emoji Font"
+ "null": "Font emoji predefinito"
},
"custom_shared_library": {
"null": "Utilizzare la libreria predefinita"
@@ -888,7 +888,7 @@
"null": "Automatico"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatico"
},
"snapchat_plus": {
"not_subscribed": "Non sottoscritto",
@@ -909,7 +909,7 @@
"disable_confirmation_dialogs": {
"erase_message": "Cancellare il messaggio",
"remove_friend": "Rimuovi il tuo amico",
- "block_friend": "Block Friend",
+ "block_friend": "Blocca amico",
"ignore_friend": "Ignore amico",
"hide_friend": "Nascondi amico",
"hide_conversation": "Nascondi Conversazione",
@@ -917,7 +917,7 @@
},
"edit_text_override": {
"multi_line_chat_input": "Linea Multi Input di chat",
- "bypass_text_input_limit": "Bypass Text Input Limit"
+ "bypass_text_input_limit": "Bypass limite input testo"
},
"auto_purge": {
"never": "Mai",
@@ -954,7 +954,7 @@
"read_media_video": "Leggi i media Video",
"camera": "Macchina fotografica",
"microphone": "Microfono",
- "location": "Location",
+ "location": "Posizione",
"read_contacts": "Leggi i contatti",
"nearby_devices": "Dispositivi vicini",
"phone_calls": "Chiamate telefoniche"
@@ -1019,16 +1019,16 @@
"casual": "Casuale",
"formal": "Forma",
"friendly": "Amichevole",
- "humorous": "Humorous",
- "empathetic": "Empathetic",
- "toxic": "Edgy",
+ "humorous": "Spiritoso",
+ "empathetic": "Empatico",
+ "toxic": "Tagliente",
"busy": "Occupato"
},
"ai_temperature": {
"0.7": "Equilibrato (0.7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatico",
"en": "Inglese",
"es": "Spagnolo",
"fr": "Francese",
@@ -1090,7 +1090,7 @@
"external_media_messages": "Supporti esterni",
"voice_note_messages": "Note vocali",
"sticker_messages": "Adesivi",
- "tiny_snap_messages": "Tiny Snaps",
+ "tiny_snap_messages": "Snaps piccoli",
"map_reaction_messages": "Reazioni della mappa",
"half_swipes": "Mezzo Swipes"
},
@@ -1170,7 +1170,7 @@
},
"media_upload_quality": {
"name": "Qualità di caricamento dei media",
- "description": "Overrides the media upload quality",
+ "description": "Sovrascrive la qualit? di caricamento dei media",
"properties": {
"force_video_upload_source_quality": {
"name": "Forza Video Upload Sorgente Qualità",
@@ -1255,7 +1255,7 @@
"description": "Imposta la velocità predefinita per la riproduzione di video\nIl valore deve essere tra 0,1 e 4.0"
},
"video_playback_rate_slider": {
- "name": "Video Playback Rate Slider",
+ "name": "Slider velocit? riproduzione video",
"description": "Aggiunge un cursore nel menu contestuale dell'opera per cambiare la velocità di riproduzione video\nNota: Le modifiche si applicano solo ai video successivi"
},
"disable_google_play_dialogs": {
@@ -1341,7 +1341,7 @@
"description": "La quantità di fili da usare"
},
"preset": {
- "name": "Preset",
+ "name": "Preimpostazione",
"description": "Impostare la velocità della conversione"
},
"constant_rate_factor": {
@@ -1349,7 +1349,7 @@
"description": "Impostare il fattore di tasso costante per l'encoder video\nDa 0 a 51 per libx264"
},
"video_bitrate": {
- "name": "Video Bitrate",
+ "name": "Bitrate video",
"description": "Impostare il bitrate video (kbps)"
},
"audio_bitrate": {
@@ -1399,7 +1399,7 @@
"description": "Visualizza una piccola anteprima accanto a unseen Snaps in chat"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Override Bootstrap",
"description": "Sovrascrive le impostazioni dell'interfaccia utente",
"properties": {
"app_appearance": {
@@ -1407,7 +1407,7 @@
"description": "Imposta un aspetto persistente"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "Scheda Home",
"description": "Sovrascrive la scheda di avvio quando si apre Snapchat"
}
}
@@ -1449,7 +1449,7 @@
"description": "Mostra informazioni utili sui media come la data di creazione nel menu contestuale del visualizzatore d'opera"
},
"old_bitmoji_selfie": {
- "name": "Old Bitmoji Selfie",
+ "name": "Vecchio selfie Bitmoji",
"description": "Riporta i selfie Bitmoji dalle versioni precedenti di Snapchat"
},
"disable_spotlight": {
@@ -1469,7 +1469,7 @@
"description": "Abilita lo spettatore di storia verticale per tutte le storie"
},
"enable_friend_feed_menu_bar": {
- "name": "Friend Feed Menu Bar",
+ "name": "Barra menu del feed amici",
"description": "Abilita il nuovo Friend Feed Menu Bar"
},
"message_indicators": {
@@ -1499,11 +1499,11 @@
}
},
"messaging": {
- "name": "Messaging",
+ "name": "Messaggistica",
"description": "Cambia come interagire con gli amici",
"properties": {
"bypass_screenshot_detection": {
- "name": "Bypass Screenshot Detection",
+ "name": "Bypass rilevamento screenshot",
"description": "Impedisce Snapchat di rilevare quando si prende uno screenshot"
},
"anonymous_story_viewing": {
@@ -1543,7 +1543,7 @@
"description": "Salta automaticamente al prossimo Snap quando si marca uno Snap come visto.\nUtilizzare in combinazione con Mark Snap come pulsante di visualizzazione"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "Riproduzione media in loop",
"description": "Loops riproduzione media quando si visualizza Snaps / Stories"
},
"disable_replay_in_ff": {
@@ -1647,7 +1647,7 @@
"description": "Impedisce ai propri messaggi di essere cancellati"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Pulizia automatica",
"description": "Elimina automaticamente i messaggi memorizzati nella cache che sono più vecchi della quantità di tempo specificata"
},
"message_filter": {
@@ -1717,7 +1717,7 @@
"description": "Rimuove i metadati dei media prima di inviare come messaggio"
},
"bypass_message_retention_policy": {
- "name": "Bypass Message Retention Policy",
+ "name": "Bypass policy di conservazione messaggi",
"description": "Previene che i messaggi vengano cancellati dopo averli visualizzati"
},
"bypass_message_action_restrictions": {
@@ -1761,7 +1761,7 @@
"description": "Utilizzare AI per generare auto-risposte intelligenti invece di messaggi di modello"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "Provider IA",
"description": "Selezionare quale servizio AI da utilizzare per generare risposte"
},
"ai_endpoint_url": {
@@ -1773,7 +1773,7 @@
"description": "Modello AI da usare per generare risposte (ad esempio, gpt-3.5-turbo, gpt-4)"
},
"ai_api_key": {
- "name": "AI API Key",
+ "name": "Chiave API IA",
"description": "Chiave API per l'autenticazione con il servizio AI"
},
"ai_system_prompt": {
@@ -1781,7 +1781,7 @@
"description": "Il prompt del sistema che definisce la personalità e il comportamento dell'AI"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "Token massimi IA",
"description": "Numero massimo di gettoni (parole) che l'IA può usare in risposte"
},
"ai_temperature": {
@@ -1895,11 +1895,11 @@
"description": "Consente a Auto Open Snaps di eseguire in background. Nota: Questo scolicherà significativamente la batteria"
},
"min_delay": {
- "name": "Min Delay (ms)",
+ "name": "Ritardo minimo (ms)",
"description": "Ritardo minimo in millisecondi prima di aprire uno scatto"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Ritardo massimo (ms)",
"description": "Ritardo massimo in millisecondi prima di aprire uno scatto"
},
"queue_size": {
@@ -2124,7 +2124,7 @@
"description": "Mostra il primo nome utente creato accanto al nome utente corrente nella pagina del profilo"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera Roll Limit",
+ "name": "Bypass limite rullino",
"description": "Aumenta la quantità massima di supporti che puoi inviare dal rullo della fotocamera"
},
"custom_self_destruct_snap_delay": {
@@ -2136,7 +2136,7 @@
"description": "Consente di eseguire il codice JavaScript in Composer (solo Arm64)"
},
"composer_logs": {
- "name": "Composer Logs",
+ "name": "Log di Composer",
"description": "Reindirizza i registri delle console di Composer a PurrfectSnap"
}
}
@@ -2161,7 +2161,7 @@
"properties": {
"play_store_installer_package_name": {
"name": "Nome del pacchetto dell'installatore di Play Store",
- "description": "Overrides the installer package name to com.android.vending"
+ "description": "Sovrascrive il nome del pacchetto di installazione a com.android.vending"
},
"remove_vpn_transport_flag": {
"name": "Rimuovere VPN Bandiera di trasporto",
@@ -2256,7 +2256,7 @@
"description": "Consente funzioni Snapchat non avviate/beta"
},
"context_menu_fix": {
- "name": "Context Menu Fix",
+ "name": "Correzione menu contestuale",
"description": "Tentare di riparare il menu di alimentazione Friend come quando il dispositivo è offline non può essere visualizzato correttamente"
},
"app_lock": {
@@ -2270,8 +2270,8 @@
}
},
"infinite_story_boost": {
- "name": "Infinite Story Boost",
- "description": "Bypass the Story Boost Limit delay"
+ "name": "Potenziamento story infinito",
+ "description": "Bypass ritardo limite Story Boost"
},
"meo_passcode_bypass": {
"name": "Solo i miei occhi passano il codice",
@@ -2322,7 +2322,7 @@
}
},
"scripting": {
- "name": "Scripting",
+ "name": "Script",
"description": "Eseguire script personalizzati per estendere PurrfectSnap",
"properties": {
"developer_mode": {
@@ -2352,7 +2352,7 @@
}
},
"friend_tracker": {
- "name": "Friend Tracker",
+ "name": "Tracker amici",
"description": "Registra l'attività dell'amico su Snapchat",
"properties": {
"record_messaging_events": {
@@ -2364,7 +2364,7 @@
"description": "Consente al tracker di eseguire in background. Nota: Questo scolicherà significativamente la batteria"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Pulizia automatica",
"description": "Elimina automaticamente gli eventi cache che sono più vecchi della quantità di tempo specificata"
}
}
@@ -2390,7 +2390,7 @@
"STICKER": "Adesivi Sticker visualizzare",
"SHARE": "Condividi",
"STATUS": "Stato",
- "LOCATION": "Location",
+ "LOCATION": "Posizione",
"STATUS_SAVE_TO_CAMERA_ROLL": "Salvato a rullo della fotocamera",
"STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "Immagine dello schermo",
"STATUS_CONVERSATION_CAPTURE_RECORD": "Registrazione schermo",
@@ -2419,7 +2419,7 @@
"media_download_source": {
"none": "Nessuno",
"pending": "Finanziamenti",
- "chat_media": "Chat Media",
+ "chat_media": "Media chat",
"story": "Storia",
"public_story": "Storia pubblica",
"spotlight": "Faretto",
@@ -2553,7 +2553,7 @@
"deleted": "Cancellato",
"business_accounts": "Conti aziendali",
"streaks": "Righe",
- "non_streaks": "Non Streaks",
+ "non_streaks": "Senza sequenze",
"followed": "Seguito",
"following": "Seguito",
"location_on_map": "Posizione sulla mappa"
@@ -2619,15 +2619,15 @@
"message_reaction_add": "Reazione del messaggio Aggiungi",
"message_reaction_remove": "Rimozione dei messaggi",
"snap_opened": "Aperta di scatto",
- "snap_replayed": "Snap Replayed",
- "snap_replayed_twice": "Snap Replayed Twice",
- "snap_screenshot": "Snap Screenshot",
+ "snap_replayed": "Snap riprodotto",
+ "snap_replayed_twice": "Snap riprodotto due volte",
+ "snap_screenshot": "Screenshot di Snap",
"snap_screen_record": "Registrazione dello schermo di scatto",
"i_can_see_you": "Posso vederti"
},
"cleared_from_feed": "Cancellato da alimentazione",
"tracker_actions": {
- "log": "Log",
+ "log": "Registra",
"in_app_notification": "Notifica dell'applicazione",
"push_notification": "Spingere la notifica",
"custom": "Personale"
@@ -2720,8 +2720,8 @@
"incoming_secret_message": "Il tuo amico ha appena accettato la chiave pubblica. Clicca qui sotto per accettare il segreto."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
- "priority_title": "Auto Open Snaps (Priority)",
+ "title": "Apri Snaps automaticamente",
+ "priority_title": "Apri Snaps automaticamente (priorit?)",
"error_title": "Auto Open Snaps (Errori)",
"channel_description": "Notifiche per l'apertura automatica dello stato della coda di scatto",
"priority_channel_description": "Notifiche ad alta priorità per l'apertura automatica",
@@ -2736,15 +2736,15 @@
"action_reset": "Conteggio di ripristino",
"error_content": "Non ha aperto lo snap da{sender}:{error}",
"resumed_feedback": "Auto aperta ripresa",
- "paused_feedback": "Auto Open Paused",
+ "paused_feedback": "Apertura automatica in pausa",
"resumed_message": "L'elaborazione continuerà automaticamente per gli snap in coda",
"paused_message": "L'elaborazione è interrotta. Coda conservata ({count})",
- "status_paused": "Paused",
+ "status_paused": "In pausa",
"status_monitoring": "Monitoraggio",
"status_active": "Attivo",
"queue_cleared": "Azzeramento delle statistiche",
"queue_cleared_title": "Queue schiarito",
- "queue_cleared_reset": "Queue Cleared & Reset",
+ "queue_cleared_reset": "Coda cancellata e reimpostata",
"queue_cleared_feedback": "Cancellato{count}snap in coda • Ripristino{processed}conteggio elaborato",
"queue_cleared_feedback_simple": "Ripristino{processed}conteggio elaborato",
"unknown_sender": "Sconosciuto",
@@ -2805,7 +2805,7 @@
"delete_rule_description": "Sei sicuro di voler eliminare questa regola?",
"rule_name": "Nome della regola",
"friend_tracker_notifications": {
- "notification_channel_name": "Friend Tracker",
+ "notification_channel_name": "Tracker amici",
"notification_title": "Attività di amico",
"conversation_enter": "{friend}iscritto{conversation}",
"conversation_exit": "{friend}sinistra{conversation}",
@@ -2830,7 +2830,7 @@
"i_can_see_you": "{friend}attività{conversation}:{details}"
},
"friend_mutation_observer": {
- "notification_channel_name": "Friend Mutation Observer",
+ "notification_channel_name": "Osservatore mutazioni amici",
"friend_removed": "{username}ti ha rimosso come amico",
"birthday_removed": "{username}ha rimosso il loro compleanno ({birthday})",
"birthday_added": "{username}ha aggiunto il loro compleanno ({birthday})",
@@ -2845,7 +2845,7 @@
"date_range_picker_end_headline": "A",
"date_range_picker_title": "Seleziona l'intervallo di date",
"date_picker_switch_to_calendar_mode": "Calendario",
- "date_picker_switch_to_input_mode": "Input",
+ "date_picker_switch_to_input_mode": "Inserimento",
"date_range_picker_scroll_to_previous_month": "Precedente mese",
"date_range_picker_scroll_to_next_month": "Il mese prossimo",
"date_picker_today_description": "Oggi",
@@ -2921,7 +2921,7 @@
},
"tracker": {
"tabs": {
- "logs": "Logs",
+ "logs": "Registri",
"rules": "Regole"
},
"actions": {
@@ -3018,7 +3018,7 @@
"message_reaction_add": "aggiunto una reazione",
"message_reaction_remove": "rimosso una reazione",
"snap_opened": "aperto uno scatto",
- "snap_replayed": "replayed a snap",
+ "snap_replayed": "ha riprodotto uno snap",
"snap_replayed_twice": "replayed a snap due volte",
"snap_screenshot": "ha preso uno screenshot",
"snap_screen_record": "schermo registrato",
@@ -3032,7 +3032,7 @@
"events": "Eventi",
"add_event": "Aggiungi evento",
"type": "Tipo",
- "triggers": "Triggers",
+ "triggers": "Trigger",
"conditions": "Condizioni",
"only_inside_conversation": "Solo quando sono dentro la conversazione",
"only_outside_conversation": "Solo quando sono fuori a parlare",
@@ -3051,7 +3051,7 @@
"clear": "Libero",
"files": {
"config_json": "File di configurazione",
- "mappings_json": "Mappings File",
+ "mappings_json": "File di mappatura",
"message_logger_db": "Database del Registratore di messaggi",
"pinned_best_friend_txt": "File migliore amico Pinned",
"native_sig_cache_txt": "Firma nativa File Cache"
@@ -3170,7 +3170,7 @@
},
"debug_dialogs": {
"info": "Info",
- "refs": "Refs",
+ "refs": "Riferimenti",
"arroyo": "Arroyo",
"message": "Messaggio",
"media_references": "Riferimenti",
@@ -3185,8 +3185,8 @@
"casual": "Casuale",
"formal": "Forma",
"friendly": "Amichevole",
- "humorous": "Humorous",
- "empathetic": "Empathetic",
+ "humorous": "Spiritoso",
+ "empathetic": "Empatico",
"busy": "Occupato",
"toxic": "Tossico"
},
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/ku_KU.json b/common/src/main/assets/lang/ku_KU.json
new file mode 100644
index 00000000..ab5f40b8
--- /dev/null
+++ b/common/src/main/assets/lang/ku_KU.json
@@ -0,0 +1,3304 @@
+{
+ "setup": {
+ "dialogs": {
+ "select_language": "زمان دیاریبکە",
+ "save_folder": "شوێنێک دیاریبکە بۆ پاشەکەوتکردنی دابەزاندنەکان",
+ "select_save_folder_button": "فۆڵدەر دیاریبکە"
+ },
+ "mappings": {
+ "dialog": "جێگیرکردنی نەخشەکان...",
+ "generate_failure_no_snapchat": "PurrfectSnap نەیتوانی سناپچات بدۆزێتەوە، تکایە سناپچات بسڕەوە و دایبمەزرێنەرەوە.",
+ "generate_failure": "هەڵەیەک ڕوویدا لە کاتی هەوڵدان بۆ دروستکردنی نەخشەکان، تکایە دووبارە هەوڵبدەرەوە."
+ },
+ "permissions": {
+ "dialog": "ئەم پێداویستییە سەرەکییانە تەواو بکە بۆ بەردەوامبوون:",
+ "notification_access": "دەسەڵاتی ئاگادارکردنەوەکان",
+ "battery_optimization": "باشترکردنی باتری",
+ "display_over_other_apps": "نیشاندان لەسەر بەرنامەکانی تر",
+ "request_button": "داواکردن"
+ }
+ },
+ "scopes": {
+ "friend": "هاوڕێ",
+ "group": "گرووپ"
+ },
+ "manager": {
+ "routes": {
+ "tasks": "ئەرکەکان",
+ "features": "تایبەتمەندییەکان",
+ "manage_rule_feature": "بەڕێوەبردنی یاسای تایبەتمەندی",
+ "home": "سەرەکی",
+ "home_about": "دەربارە",
+ "home_settings": "ڕێکخستنەکان",
+ "home_logs": "تۆمارەکان (Logs)",
+ "logger_history": "مێژووی تۆمارکەر",
+ "logged_stories": "ستۆرییە تۆمارکراوەکان",
+ "friend_tracker": "شوێنهەڵگری هاوڕێ",
+ "friend_tracker_catalog": "کەتەلۆگی شوێنهەڵگری هاوڕێ",
+ "manage_friend_tracker_repos": "بەڕێوەبردنی سەرچاوەکانی شوێنهەڵگری هاوڕێ",
+ "edit_rule": "دەستکاریکردنی یاسا",
+ "file_imports": "هاوردەکردنی فایل",
+ "manage_repos": "بەڕێوەبردنی سەرچاوەکان",
+ "social": "کۆمەڵایەتی",
+ "manage_scope": "بەڕێوەبردنی مەودا",
+ "messaging_preview": "پێشبینین",
+ "scripts": "سکریپتەکان",
+ "manage_script_repos": "بەڕێوەبردنی سەرچاوەی سکریپت",
+ "view_logger_history": "بینینی مێژووی تۆمارکەر",
+ "better_location": "شوێنی باشتر"
+ },
+ "navigation": {
+ "customize_bottom_bar_title": "دەستکاریکردنی باڕی خوارەوە",
+ "customize_bottom_bar_subtitle": "ئەو تاب-انە هەڵبژێرە کە لە پەڕەی سەرەکیدا دەردەکەون",
+ "available_tabs_title": "تابە بەردەستەکان",
+ "shown_tabs_title": "تابە نیشاندراوەکان",
+ "reset_button": "گەڕاندنەوە",
+ "done_button": "تەواو"
+ },
+ "sections": {
+ "home": {
+ "version_title": "وەشانی {versionName} \u00b7 لەلایەن Eternal",
+ "update_title": "نوێکردنەوەی PurrfectSnap",
+ "update_content": "وەشانی {version} بەردەستە!",
+ "update_button": "دابەزاندن",
+ "debug_build_summary_title": "تۆ وەشانی دیبەگی (Debug)ـی PurrfectSnap بەکاردەهێنیت",
+ "debug_build_summary_content": "وەشانی {versionName} ({versionCode})",
+ "debug_build_summary_date": "بەرواری دروستکردن: {date} ({days} ڕۆژ لەمەوبەر)",
+ "quick_actions_title": "کردارە خێراکان"
+ },
+ "home_logs": {
+ "no_logs_hint": "هیچ تۆمارێک بەردەست نییە",
+ "clear_logs_button": "سڕینەوەی تۆمارەکان",
+ "export_logs_button": "هەناردەکردنی تۆمارەکان",
+ "saving_logs_toast": "پاشەکەوتکردنی تۆمارەکان، ئەمە کەمێک دەخایەنێت...",
+ "saved_logs_success_toast": "تۆمارەکان بە سەرکەوتوویی پاشەکەوتکران",
+ "saved_logs_failure_toast": "پاشەکەوتکردنی تۆمارەکان سەرکەوتوو نەبوو"
+ },
+ "home_settings": {
+ "actions_title": "کردارەکان",
+ "message_logger_title": "تۆمارکەری نامە",
+ "debug_title": "دیبەگ (Debug)",
+ "success_toast": "تەواو!",
+ "message_logger_summary": "{messageCount} نامە\n{storyCount} ستۆری",
+ "export_button": "هەناردەکردن",
+ "clear_button": "پاککردنەوە",
+ "view_logger_history_button": "بینینی مێژووی تۆمارکەر",
+ "ui_settings_title": "ڕێکخستنەکانی ڕووکار",
+ "haptic_feedback_label": "لەرینەوە (Haptic Feedback)",
+ "use_system_toasts_label": "بەکارهێنانی پەیامی سیستەم (Toasts)",
+ "updates_title": "نوێکارییەکان",
+ "auto_update_check": "پشکنینی خۆکار بۆ نوێکاری",
+ "update_check_frequency_daily": "ڕۆژانە",
+ "update_check_frequency_weekly": "هەفتانە",
+ "update_check_frequency_monthly": "مانگانە",
+ "update_channel_stable": "جێگیر (Stable)",
+ "update_channel_prerelease": "پێش-وەشان (Pre-release)",
+ "update_notification_channel_name": "نوێکارییەکان",
+ "update_notification_channel_description": "ئاگاداربە کاتێک وەشانی نوێ بەردەست دەبێت",
+ "update_notification_title": "نوێکاری نوێ بەردەستە",
+ "update_notification_text": "دایبگرە بۆ کردنەوەی PurrfectSnap و دابەزاندنی دوایین وەشان.",
+ "app_theme_title": "ڕووکاری بەرنامە",
+ "theme_icon_description": "کردنەوەی هەڵبژاردنی ڕووکار",
+ "theme_mode_system": "سیستەم",
+ "theme_mode_light": "ڕووناک",
+ "theme_mode_dark": "تاریک",
+ "friend_notes_title": "تێبینی هاوڕێکان",
+ "friend_notes_description": "بەڕێوەبردن و باکەپی تێبینی هاوڕێکان",
+ "friend_notes_no_notes_to_backup": "هیچ تێبینییەک نییە بۆ باکەپکردن",
+ "friend_notes_backup_success": "تێبینی هاوڕێکان باکەپ کرا",
+ "friend_notes_restore_success": "تێبینی هاوڕێکان گەڕێندرایەوە",
+ "backup_button": "باکەپ (Backup)",
+ "restore_button": "گەڕاندنەوە (Restore)",
+ "view_button": "بینین",
+ "customize_bottom_bar_title": "دەستکاریکردنی باڕی خوارەوە",
+ "customize_bottom_bar_subtitle": "ئەو تاب-انە هەڵبژێرە کە لە پەڕەی سەرەکیدا دەردەکەون",
+ "available_tabs_title": "تابە بەردەستەکان",
+ "reset_button": "گەڕاندنەوە",
+ "done_button": "تەواو",
+ "clear_friend_feed": "پاککردنەوەی فیدی هاوڕێکان",
+ "test_mode_label": "چالاککردنی PurrAura",
+ "disable_feature_loading_label": "ناچالاککردنی بارکردنی تایبەتمەندییەکان",
+ "disable_auto_mapper_label": "ناچالاککردنی نەخشەسازی خۆکار",
+ "disable_bypass_indicator_label": "ناچالاککردنی نیشاندەری تێپەڕاندن"
+ },
+ "tasks": {
+ "no_tasks": "هیچ ئەرکێک نییە",
+ "merge_button": "یەکخستن",
+ "failed_to_open_file": "نەتوانرا فایلەکە بکرێتەوە",
+ "merge_files_toast": "یەکخستنی {count} فایل",
+ "remove_selected_tasks_title": "دڵنیایت لە سڕینەوەی ئەرکە دیاریکراوەکان؟",
+ "remove_all_tasks_title": "دڵنیایت لە سڕینەوەی هەموو ئەرکەکان؟",
+ "delete_files_option": "هەروەها فایلەکانیش بسڕەوە",
+ "remove_selected_tasks_confirm": "{count} ئەرک بسڕدرێتەوە؟",
+ "remove_all_tasks_confirm": "هەموو ئەرکەکان بسڕدرێتەوە؟"
+ },
+ "features": {
+ "disabled": "ناچالاک کراوە",
+ "export_option": "هەناردەکردن",
+ "import_option": "هاوردەکردن",
+ "reset_option": "گەڕاندنەوە",
+ "config_export_success_toast": "ڕێکخستنەکان بە سەرکەوتوویی هەناردەکران",
+ "config_import_success_toast": "ڕێکخستنەکان بە سەرکەوتوویی هاوردەکران",
+ "config_import_failure_toast": "نەتوانرا ڕێکخستنەکان هاوردە بکرێت {error}",
+ "config_export_failure_toast": "نەتوانرا ڕێکخستنەکان هەناردە بکرێت {error}",
+ "saved_config_snackbar": "ڕێکخستنەکان پاشەکەوتکران",
+ "older_required": "ئەم تایبەتمەندییە پێویستی بە سناپچاتی وەشانی {version} یان کۆنترە بۆ ئەوەی بە دروستی کار بکات",
+ "newer_required": "ئەم تایبەتمەندییە پێویستی بە سناپچاتی وەشانی {version} یان نوێترە بۆ ئەوەی بە دروستی کار بکات",
+ "search_button": "گەڕان",
+ "clear_history": "پاککردنەوەی مێژووی گەڕان",
+ "subtitle": "گەڕان و بەڕێوەبردنی تایبەتمەندییەکان"
+ },
+ "manage_rule_feature": {
+ "disable_state_option": "ناچالاک کراوە",
+ "disable_state_subtext": "هیچ هاوڕێ/گرووپێک کاریگەر نابێت",
+ "whitelist_state_option": "هیچ کەسێک جگە لە ...",
+ "whitelist_state_subtext": "تەنها {count} هاوڕێ/گرووپ کاریگەر دەبن بەم یاسایە",
+ "whitelist_state_button": "هاوڕێ/گرووپی ڕێگەپێدراو دیاریبکە",
+ "blacklist_state_option": "هەمووان جگە لە ...",
+ "blacklist_state_subtext": "هەمووان جگە لە {count} هاوڕێ/گرووپ کاریگەر دەبن بەم یاسایە",
+ "blacklist_state_button": "هاوڕێ/گرووپی دەرکراو (Excluded) دیاریبکە",
+ "clear_list_button": "پاککردنەوەی لیستی هاوڕێ/گرووپەکان",
+ "dialog_clear_confirmation_text": "دڵنیایت دەتەوێت لیستەکە پاک بکەیتەوە؟"
+ },
+ "social": {
+ "friends_tab": "هاوڕێکان",
+ "groups_tab": "گرووپەکان",
+ "empty_hint": "لیستەکەت بەتاڵە لە ئێستادا",
+ "friends_empty_title": "هیچ هاوڕێیەک زیاد نەکراوە",
+ "groups_empty_title": "هیچ گرووپێک سینک نەکراوە",
+ "streaks_expiration_short": "{hours} کاتژمێر",
+ "social_tagline": "بەڕێوەبردنی مەوداكان، ستریكەكان، و پێشبینینەکان",
+ "social_empty_hint": "داگرە لە دوگمەی + بۆ سینک کردنی هاوڕێ یان گرووپەکان."
+ },
+ "manage_scope": {
+ "logged_stories_button": "نیشاندانی ستۆرییە تۆمارکراوەکان",
+ "e2ee_title": "کریپتۆکردنی سەرتاوسەر (E2EE)",
+ "e2ee_subtitle": "بەڕێوەبردنی کلیلە هاوبەشەکانت بۆ ئەم هاوڕێیە.",
+ "export_base64_button": "هەناردەکردنی Base64",
+ "import_base64_button": "هاوردەکردنی Base64",
+ "invalid_key_size_32_bytes": "قەبارەی کلیل هەڵەیە. کلیلێکی 32-بایتی دابین بکە.",
+ "successfully_imported_key": "کلیلەکە بە سەرکەوتوویی هاوردەکرا.",
+ "failed_to_import_key": "نەتوانرا کلیلەکە هاوردە بکرێت: {message}",
+ "rules_title": "یاساکان",
+ "participants_text": "{count} بەشداربوو",
+ "not_found": "نەدۆزرایەوە",
+ "streaks_title": "ستریكەکان",
+ "streaks_length_text": "ماوە: {length}",
+ "streaks_expiration_text": "بەسەردەچێت دوای {eta}",
+ "streaks_expiration_text_expired": "بەسەرچووە",
+ "reminder_button": "دانانی وەبیرهێنەرەوە",
+ "delete_scope_confirm_dialog_title": "دڵنیایت دەتەوێت {scope} بسڕیتەوە؟",
+ "notes_placeholder": "کلیک بکە بۆ زیادکردنی تێبینی"
+ },
+ "logged_stories": {
+ "story_failed_to_load": "بارکردن سەرکەوتوو نەبوو",
+ "no_stories": "هیچ ستۆرییەک نەدۆزرایەوە",
+ "save_from_cache_button": "پاشەکەوتکردن لە کاش (Cache)"
+ },
+ "messaging_preview": {
+ "bridge_connection_failed": "پەیوەندیکردن بە پردەکەوە سەرکەوتوو نەبوو. دڵنیابەرەوە سناپچات لە پاشبنەما (background) کاردەکات",
+ "bridge_connection_error": "پەیوەندیکردن بە پردەکەوە سەرکەوتوو نەبوو. دڵنیابەرەوە سناپچات لە پاشبنەما (background) کاردەکات",
+ "bridge_init_failed": "دەستپێکردنی پردی نامەکان سەرکەوتوو نەبوو. دڵنیابەرەوە سناپچات لە پاشبنەما کاردەکات",
+ "message_fetch_failed": "هێنانی نامەکان سەرکەوتوو نەبوو",
+ "no_message_hint": "نامە نییە",
+ "subtitle": "ڕایبگرە بۆ دیاریکردن",
+ "actions_title": "کردارەکانی گفتوگۆ",
+ "save_selection_option": "پاشەکەوتکردنی دیاریکراوەکان",
+ "save_all_option": "پاشەکەوتکردنی هەمووی",
+ "unsave_selection_option": "لابردنی پاشەکەوتی دیاریکراوەکان",
+ "unsave_all_option": "لابردنی پاشەکەوتی هەمووی",
+ "mark_selection_as_seen_option": "دیاریکردنی سناپی هەڵبژێردراو وەک بینراو",
+ "mark_all_as_seen_option": "دیاریکردنی هەموو سناپەکان وەک بینراو",
+ "delete_selection_option": "سڕینەوەی دیاریکراوەکان",
+ "delete_all_option": "سڕینەوەی هەمووی",
+ "processed_message_toast": "{count} نامە چارەسەرکرا",
+ "processed_messages_toast": "{count} نامە چارەسەرکران",
+ "processed_messages_text": "{count} چارەسەرکرا",
+ "close_button_description": "پاککردنەوەی دیاریکردن"
+ },
+ "logger_history": {
+ "list_friend_format": "هاوڕێ {name}",
+ "list_group_format": "گرووپی {name}",
+ "no_more_messages": "نامەی تر نییە",
+ "reverse_order_checkbox": "پێچەوانەکردنەوەی ڕیزبەندی",
+ "chat_attachment": "هاوپێچ {index}",
+ "empty_message": "نامەی بەتاڵ",
+ "message_parse_failed": "شیکردنەوەی نامە سەرکەوتوو نەبوو",
+ "unknown_sender": "نێرەری نەناسراو",
+ "download_attachment_failed_toast": "دابەزاندنی هاوپێچ سەرکەوتوو نەبوو"
+ },
+ "file_imports": {
+ "import_file_button": "هاوردەکردنی فایل",
+ "file_not_found": "فایل نەدۆزرایەوە",
+ "file_import_failed": "هاوردەکردنی فایل سەرکەوتوو نەبوو: {error}",
+ "file_imported": "فایل بە سەرکەوتوویی هاوردەکرا",
+ "file_delete_failed": "سڕینەوەی فایل سەرکەوتوو نەبوو",
+ "no_files_hint": "لێرە دەتوانیت فایل هاوردە بکەیت بۆ بەکارهێنان لە سناپچات. دوگمەی خوارەوە دابگرە بۆ هاوردەکردنی فایل."
+ },
+ "better_location": {
+ "spoofed_coordinates_title": "پانی {latitude}، درێژی {longitude}",
+ "save_coordinates_dialog_title": "پاشەکەوتکردنی شوێن (Coordinates)",
+ "saved_name_dialog_hint": "ناوی پاشەکەوتکراو",
+ "latitude_dialog_hint": "هێڵی پانی",
+ "longitude_dialog_hint": "هێڵی درێژی",
+ "save_dialog_button": "پاشەکەوتکردن",
+ "choose_location_button": "شوێنێک هەڵبژێرە",
+ "manual_coordinates_hint": "دەستکاریکردنی وردی شوێن بە دەست.",
+ "saved_coordinates_subtitle": "بەڕێوەبردنی شوێنە ساختەکراوە پاشەکەوتکراوەکانت",
+ "teleport_to_friend_button": "گواستنەوە بۆ لای هاوڕێ",
+ "spoof_location_toggle": "ساختەکردنی شوێن",
+ "suspend_location_updates": "ڕاگرتنی نوێکردنەوەکانی شوێن",
+ "saved_coordinates_title": "شوێنە پاشەکەوتکراوەکان",
+ "no_saved_coordinates_hint": "هیچ شوێنێک پاشەکەوت نەکراوە",
+ "delete_dialog_title": "سڕینەوەی شوێنی پاشەکەوتکراو",
+ "delete_dialog_message": "دڵنیایت دەتەوێت ئەم شوێنە پاشەکەوتکراوە بسڕیتەوە؟",
+ "teleport_to_friend_title": "گواستنەوە بۆ لای هاوڕێ",
+ "search_bar": "گەڕان",
+ "no_friends_map": "هیچ هاوڕێیەک لەسەر نەخشە نییە",
+ "no_friends_found": "هیچ هاوڕێیەک نەدۆزرایەوە"
+ }
+ },
+ "dialogs": {
+ "add_friend": {
+ "title": "زیادکردنی هاوڕێ یان گرووپ",
+ "search_hint": "گەڕان",
+ "fetch_error": "هێنانی داتا سەرکەوتوو نەبوو",
+ "category_groups": "گرووپەکان",
+ "category_friends": "هاوڕێکان",
+ "participants_text": "{count} بەشداربوو",
+ "unselect_all_button": "لابردنی دیاریکردنی هەمووی"
+ },
+ "scripting": {
+ "repo_hint": "بەستەری ڕیپۆ (سەرچاوە) لێرە دابنێ"
+ },
+ "scripting_warning": {
+ "title": "ئاگاداری",
+ "content": "PurrfectSnap ئامرازێکی سکریپتکردنی تێدایە، کە ڕێگە دەدات کۆدی دەرەکی لەسەر ئامێرەکەت جێبەجێ بکرێت. زۆر وریا بە و تەنها مۆدیوڵ لە سەرچاوەی ناسراو و جێی متمانە دابمەزرێنە. مۆدیوڵە ڕێگەپێنەدراو یان پشتڕاست نەکراوەکان ڕەنگە مەترسی ئاسایشی بۆ سیستەمەکەت دروست بکەن."
+ },
+ "reset_config": {
+ "title": "گەڕاندنەوەی ڕێکخستنەکان",
+ "content": "دڵنیایت دەتەوێت ڕێکخستنەکان بگەڕێنیتەوە دۆخی سەرەتایی؟",
+ "success_toast": "ڕێکخستنەکان بە سەرکەوتوویی گەڕێندرانەوە"
+ },
+ "quick_actions_dialog": {
+ "title": "کردارە خێراکان",
+ "subtitle": "خێراتر دەستت بگات بە ئامرازە دڵخوازەکانت"
+ },
+ "export_config": {
+ "title": "داتای هەستیار هەناردە بکرێت؟",
+ "content": "دەتەوێت ڕێکخستنەکان هەناردە بکەیت لەگەڵ داتا هەستیارەکان؟ (وەک شوێن و ئحداثیات، هتد)"
+ },
+ "messaging_action": {
+ "title": "جۆری ناوەڕۆک هەڵبژێرە بۆ چارەسەرکردن",
+ "select_all_button": "دیاریکردنی هەمووی"
+ },
+ "file_imports": {
+ "no_files_settings_hint": "هیچ فایلێک نەدۆزرایەوە. دڵنیابەرەوە کە فایلە پێویستەکانت هاوردە کردووە لە بەشی 'هاوردەکردنی فایل'",
+ "settings_select_file_hint": "فایلێکی هاوردەکراو دیاریبکە"
+ }
+ },
+ "scripting": {
+ "actions_button": "کردارەکان",
+ "actions_title": "کردارەکان",
+ "catalog_tab": "کەتەلۆگ",
+ "clear_module_data_button": "پاککردنەوەی داتا",
+ "clear_module_data_failed": "پاککردنەوەی داتای مۆدیوڵ سەرکەوتوو نەبوو",
+ "delete_module_button": "سڕینەوە",
+ "delete_module_failed": "سڕینەوەی مۆدیوڵ سەرکەوتوو نەبوو",
+ "documentation_button": "بەڵگەنامەکان (Docs)",
+ "download_script_failed": "دابەزاندنی سکریپت سەرکەوتوو نەبوو",
+ "downloading_script": "دابەزاندنی سکریپت...",
+ "edit_module_button": "دەستکاری",
+ "enter_url_label": "بەستەر (URL) بنووسە",
+ "import_button": "هاوردەکردن",
+ "import_from_url_button": "هاوردەکردن لە ڕێگەی URL",
+ "import_script_from_url_title": "هاوردەکردنی سکریپت لە URL",
+ "import_script_warning": "تەنها سکریپت لەو سەرچاوانە دابمەزرێنە کە متمانەت پێیانە.",
+ "installed_scripts_tab": "دامەزراو",
+ "manage_repos_button": "بەڕێوەبردنی سەرچاوەکان (Repos)",
+ "module_data_cleared": "داتای مۆدیوڵ پاککرایەوە!",
+ "module_not_found": "مۆدیوڵ نەدۆزرایەوە",
+ "no_description": "وەسف نییە",
+ "no_scripts_folder_selected_title": "فۆڵدەری سکریپتەکانت دیاریبکە بۆ دەستپێکردن",
+ "no_scripts_found_title": "هیچ سکریپتێک نەدۆزرایەوە",
+ "no_settings_for_module": "ئەم مۆدیوڵە هیچ ڕێکخستنێکی نییە",
+ "open_module_failed": "کردنەوەی فایلی مۆدیوڵ سەرکەوتوو نەبوو",
+ "open_scripts_folder_button": "کردنەوەی فۆڵدەری سکریپتەکان",
+ "script_already_installed": "سکریپتەکە پێشتر دامەزراوە",
+ "select_folder_button": "فۆڵدەر هەڵبژێرە",
+ "select_scripts_folder_toast": "تکایە سەرەتا فۆڵدەری سکریپتەکان دیاریبکە",
+ "update_module_button": "نوێکردنەوەی مۆدیوڵ",
+ "update_module_failed": "نوێکردنەوەی مۆدیوڵ سەرکەوتوو نەبوو",
+ "use_catalog_to_add_scripts": "کەتەلۆگ بەکاربهێنە بۆ زیادکردنی سکریپت",
+ "ok_button_timeout": "باشە {timeout}",
+ "catalog": {
+ "no_repos_added": "هیچ سەرچاوەیەک (Repo) زیاد نەکراوە",
+ "repo_list_info": "سەرچاوەکان لێرە بدۆزەرەوە:",
+ "link_text": "لیستی سەرچاوە",
+ "script_already_installed": "سکریپتەکە پێشتر دامەزراوە",
+ "script_downloaded": "سکریپت دابەزێنرا",
+ "could_not_create_file": "نەتوانرا فایل دروست بکرێت",
+ "no_scripts_folder_selected": "سەرەتا فۆڵدەری سکریپتەکان دیاریبکە",
+ "no_scripts_available": "هیچ سکریپتێک بەردەست نییە",
+ "installed_button": "دامەزراوە",
+ "download_button": "دابەزاندن"
+ },
+ "repos": {
+ "no_repos_added": "هیچ سەرچاوەیەک زیاد نەکراوە",
+ "add_repo_button": "زیادکردنی سەرچاوە",
+ "add_repo_dialog_title": "زیادکردنی سەرچاوە",
+ "repo_url_label": "بەستەری سەرچاوە (Repo URL)",
+ "add_button": "زیادکردن",
+ "invalid_repo_title": "سەرچاوەی هەڵە",
+ "invalid_repo_error": "ئەم سەرچاوەیە داتای پێویستی کەمە.",
+ "repo_added_toast": "سەرچاوە زیادکرا",
+ "add_repo_failed_toast": "زیادکردنی سەرچاوە سەرکەوتوو نەبوو: {message}",
+ "remove_button": "لابردن",
+ "remove_repo_dialog_title": "لابردنی سەرچاوە",
+ "remove_repo_dialog_text": "دڵنیایت دەتەوێت ئەم سەرچاوەیە لاببەیت؟"
+ }
+ },
+ "friend_tracker": {
+ "rules_tab": "یاساکان",
+ "logs_tab": "تۆمارەکان (Logs)",
+ "catalog_button": "کەتەلۆگ",
+ "add_rule_button": "زیادکردنی یاسا",
+ "import_button": "هاوردەکردن",
+ "filters_title": "فیلتەرەکان",
+ "search_by_label": "گەڕان بەپێی",
+ "newest_first_label": "نوێترین سەرەتا",
+ "since_label": "لە",
+ "until_label": "تا",
+ "unit_label": "یەکە",
+ "pick_a_date_button": "بەروارێک هەڵبژێرە",
+ "export_button": "هەناردەکردن",
+ "delete_button": "سڕینەوە",
+ "search_placeholder": "گەڕان",
+ "no_logs_found": "هیچ تۆمارێک نەدۆزرایەوە",
+ "no_rules_found": "هیچ یاسایەک نەدۆزرایەوە",
+ "export_logs_dialog_title": "هەناردەکردنی تۆمارەکان",
+ "export_logs_dialog_confirm_text": "تۆمارەکان هەناردە بکرێن بە بەکارهێنانی فیلتەرەکانی ئێستا؟",
+ "export_as_button": "هەناردەکردن وەک {type}",
+ "new_rule_title": "یاسای نوێ",
+ "edit_rule_title": "دەستکاریکردنی یاسا",
+ "general_section_title": "گشتی",
+ "rule_name_label": "ناوی یاسا",
+ "default_rule_name": "یاسای نوێ",
+ "author_name_label": "نووسەر",
+ "scope_section_title": "مەودا (Scope)",
+ "scope_all": "هەموو هاوڕێ/گرووپەکان",
+ "scope_whitelist": "هیچ کەسێک جگە لە",
+ "scope_blacklist": "هەمووان جگە لە",
+ "events_section_title": "ڕووداوەکان",
+ "events_suffix": "ڕووداو",
+ "no_events_text": "هیچ ڕووداوێک زیاد نەکراوە",
+ "add_event_dialog_title": "زیادکردنی ڕووداو",
+ "event_type_label": "جۆری ڕووداو",
+ "triggers_title": "هاندەرەکان (Triggers)",
+ "conditions_title": "مەرجەکان",
+ "condition_only_inside_conversation": "تەنها کاتێک لە ناو گفتوگۆدام",
+ "condition_only_outside_conversation": "تەنها کاتێک لە دەرەوەی گفتوگۆدام",
+ "condition_only_when_app_active": "تەنها کاتێک سناپچات چالاکە",
+ "condition_only_when_app_inactive": "تەنها کاتێک سناپچات ناچالاکە",
+ "condition_no_push_notification_when_app_active": "بێ ئاگادارکردنەوە کاتێک سناپچات چالاکە",
+ "add_button": "زیادکردن",
+ "cannot_save_rule_dialog_title": "نەتوانرا یاساکە پاشەکەوت بکرێت",
+ "cannot_save_rule_dialog_text": "خانووە بەتاڵەکان پڕبکەرەوە بۆ پاشەکەوتکردنی ئەم یاسایە.",
+ "duplicate_rule_name_dialog_title": "ناوی یاسا دووبارەیە",
+ "duplicate_rule_name_dialog_text": "یاسایەک بەم ناوەوە هەیە. ناوێکی نوێ هەڵبژێرە.",
+ "discard_changes_dialog_title": "گۆڕانکارییەکان فەرامۆش بکرێن؟",
+ "discard_changes_dialog_text": "گۆڕانکاری پاشەکەوت نەکراوت هەیە. فەرامۆش بکرێن؟",
+ "rule_subtitle": "ڕێکخستنی هاندەر و مەوداکان بۆ ئەم یاسایە.",
+ "discard_button": "فەرامۆشکردن",
+ "enabled_label": "چالاک کراوە",
+ "disabled_label": "ناچالاک کراوە",
+ "delete_rule_dialog_title": "سڕینەوەی یاسا",
+ "delete_rule_dialog_text": "دڵنیایت دەتەوێت ئەم یاسایە بسڕیتەوە؟",
+ "no_repos_added": "هیچ سەرچاوەیەک زیاد نەکراوە",
+ "import_dialog_title": "هاوردەکردنی یاساکان",
+ "bulk_import_button": "هاوردەکردنی بەکۆمەڵ",
+ "individual_import_button": "هاوردەکردنی تاک",
+ "invalid_import_type_dialog_title": "هاوردەکردنی هەڵە",
+ "invalid_import_type_dialog_text": "جۆری فایلی دیاریکراو لەگەڵ مۆدی هاوردەکردن یەکناگرێتەوە.",
+ "export_dialog_title": "هەناردەکردنی یاساکان",
+ "bulk_export_button": "هەناردەکردنی بەکۆمەڵ",
+ "individual_export_button": "هەناردەکردنی تاک",
+ "reverse_order_checkbox": "پێچەوانەکردنەوەی ڕیزبەندی",
+ "delete_logs_dialog_title": "سڕینەوەی تۆمارەکان",
+ "delete_logs_dialog_confirm_text": "هەموو ئەو تۆمارانە بسڕدرێنەوە کە لەگەڵ فیلتەرەکانی ئێستا دەگونجێن؟",
+ "select_friends_groups_button": "هاوڕێ / گرووپەکان دیاریبکە"
+ },
+ "friend_tracker_export": {
+ "title": "هەناردەکردنی شوێنهەڵگری هاوڕێ",
+ "save_button": "پاشەکەوتکردن",
+ "back_button_description": "گەڕانەوە",
+ "expand_button_description": "گەورەکردن یان بچووککردنەوەی کەتیگۆری",
+ "exported_toast": "ڕێکخستنی شوێنهەڵگر هەناردەکرا",
+ "export_failed_toast": "هەناردەکردنی شوێنهەڵگر سەرکەوتوو نەبوو: {message}"
+ },
+ "friend_tracker_import": {
+ "title": "هاوردەکردنی شوێنهەڵگری هاوڕێ",
+ "confirm_button": "هاوردەکردن",
+ "back_button_description": "گەڕانەوە",
+ "expand_button_description": "گەورەکردن یان بچووککردنەوەی کەتیگۆری",
+ "imported_toast": "شوێنهەڵگر هاوردەکرا",
+ "import_failed_toast": "هاوردەکردنی شوێنهەڵگر سەرکەوتوو نەبوو: {message}"
+ },
+ "friend_tracker_catalog": {
+ "title": "کەتەلۆگی شوێنهەڵگری هاوڕێ",
+ "no_repos_added": "هیچ سەرچاوەیەک زیاد نەکراوە",
+ "manage_repos_description": "بەڕێوەبردنی سەرچاوەکان"
+ },
+ "friend_tracker_repos": {
+ "no_repos_added": "هیچ سەرچاوەیەک زیاد نەکراوە",
+ "add_repo_button": "زیادکردنی سەرچاوە",
+ "add_repo_dialog_title": "زیادکردنی سەرچاوە",
+ "repo_url_label": "بەستەری سەرچاوە (Repo URL)",
+ "add_button": "زیادکردن",
+ "invalid_repo_title": "سەرچاوەی هەڵە",
+ "invalid_repo_error": "ئەم سەرچاوەیە داتای پێویستی کەمە.",
+ "repo_added_toast": "سەرچاوە زیادکرا",
+ "add_repo_failed_toast": "زیادکردنی سەرچاوە سەرکەوتوو نەبوو: {message}",
+ "remove_button": "لابردن",
+ "remove_repo_dialog_title": "لابردنی سەرچاوە",
+ "remove_repo_dialog_text": "دڵنیایت دەتەوێت ئەم سەرچاوەیە لاببەیت؟"
+ },
+ "logger_history": {
+ "select_conversation_placeholder": "گفتوگۆیەک دیاریبکە"
+ },
+ "features": {
+ "config_export": {
+ "title": "هەناردەکردنی کورتەی ڕێکخستن",
+ "back_button_description": "گەڕانەوە",
+ "save_button": "پاشەکەوتکردن",
+ "expand_button_description": "گەورەکردن یان بچووککردنەوەی کەتیگۆری",
+ "enabled": "چالاک کراوە",
+ "disabled": "ناچالاک کراوە",
+ "enable_feature": "چالاککردنی تایبەتمەندی"
+ },
+ "config_import": {
+ "title": "هاوردەکردنی کورتەی ڕێکخستن",
+ "back_button_description": "گەڕانەوە",
+ "confirm_button": "هاوردەکردن",
+ "expand_button_description": "گەورەکردن یان بچووککردنەوەی کەتیگۆری",
+ "enabled": "چالاک کراوە",
+ "disabled": "ناچالاک کراوە",
+ "enable_feature": "چالاککردنی تایبەتمەندی",
+ "config_imported_toast": "ڕێکخستن بە سەرکەوتوویی هاوردەکرا",
+ "config_import_failure_toast": "نەتوانرا ڕێکخستن هاوردە بکرێت {error}"
+ }
+ }
+ },
+ "rules": {
+ "toasts": {
+ "enabled": "{ruleName} چالاککرا",
+ "disabled": "{ruleName} ناچالاککرا"
+ },
+ "modes": {
+ "blacklist": "دۆخی لیستی ڕێپێنەدراو (Blacklist)",
+ "whitelist": "دۆخی لیستی ڕێپێدراو (Whitelist)"
+ },
+ "properties": {
+ "auto_download": {
+ "name": "دابەزاندنی خۆکار",
+ "description": "دابەزاندنی خۆکاری سناپەکان لە کاتی بینینیان",
+ "options": {
+ "blacklist": "بەدەرکردن لە دابەزاندنی خۆکار",
+ "whitelist": "دابەزاندنی خۆکار"
+ }
+ },
+ "stealth": {
+ "name": "دۆخی نهێنی (Stealth Mode)",
+ "description": "ڕێگری دەکات لەوەی کەس بزانێت سناپ/نامە و گفتوگۆکانت کردۆتەوە",
+ "options": {
+ "blacklist": "بەدەرکردن لە دۆخی نهێنی",
+ "whitelist": "دۆخی نهێنی"
+ }
+ },
+ "auto_save": {
+ "name": "پاشەکەوتکردنی خۆکار",
+ "description": "پاشەکەوتکردنی نامەکان لە کاتی بینینیان",
+ "options": {
+ "blacklist": "بەدەرکردن لە پاشەکەوتکردنی خۆکار",
+ "whitelist": "پاشەکەوتکردنی خۆکار"
+ }
+ },
+ "unsaveable_messages": {
+ "name": "نامە پاشەکەوت نەکراوەکان",
+ "description": "ڕێگری دەکات لەوەی نامەکان لەلایەن کەسانی ترەوە پاشەکەوت بکرێن",
+ "options": {
+ "blacklist": "بەدەرکردن لە نامە پاشەکەوت نەکراوەکان",
+ "whitelist": "نامە پاشەکەوت نەکراوەکان"
+ }
+ },
+ "auto_open_snaps": {
+ "name": "کردنەوەی خۆکاری سناپەکان",
+ "description": "کردنەوەی سناپەکان بە شێوەی خۆکار کاتێک پێت دەگەن",
+ "options": {
+ "blacklist": "بەدەرکردن لە کردنەوەی خۆکاری سناپەکان",
+ "whitelist": "کردنەوەی خۆکاری سناپەکان"
+ }
+ },
+ "hide_friend_feed": {
+ "name": "شاردنەوە لە فیدی هاوڕێکان"
+ },
+ "e2e_encryption": {
+ "name": "بەکارهێنانی E2E Encryption"
+ },
+ "pin_conversation": {
+ "name": "پین کردنی گفتوگۆ"
+ },
+ "exclude_message_logger": {
+ "name": "بەدەرکردن لە تۆمارکەری نامە"
+ },
+ "auto_reply": {
+ "name": "وەڵامدانەوەی خۆکار",
+ "description": "بە شێوەی خۆکار وەڵامی نامە هاتووەکان دەداتەوە کاتێک بەردەست نیت",
+ "options": {
+ "blacklist": "بەدەرکردن لە وەڵامدانەوەی خۆکار",
+ "whitelist": "وەڵامدانەوەی خۆکار"
+ }
+ },
+ "auto_delete_sent_messages": {
+ "name": "سڕینەوەی خۆکاری نامە نێردراوەکان",
+ "description": "بە شێوەی خۆکار نامە نێردراوەکان دەسڕێتەوە دوای ماوەیەکی دیاریکراو",
+ "options": {
+ "blacklist": "بەدەرکردن لە سڕینەوەی خۆکاری نامە نێردراوەکان",
+ "whitelist": "سڕینەوەی خۆکاری نامە نێردراوەکان"
+ }
+ },
+ "message_logger": {
+ "name": "تۆمارکەری نامە",
+ "description": "هێشتنەوەی کۆپییەکی نامەکان تەنانەت ئەگەر بسڕدرێنەوە",
+ "options": {
+ "blacklist": "بەدەرکردن لە تۆمارکەری نامە",
+ "whitelist": "تۆمارکەری نامە"
+ }
+ },
+ "auto_read": {
+ "name": "خوێندنەوەی خۆکار",
+ "description": "دیاریکردنی سناپ و نامەکان وەک خوێنراوە بە شێوەی خۆکار",
+ "options": {
+ "blacklist": "بەدەرکردن لە خوێندنەوەی خۆکار",
+ "whitelist": "خوێندنەوەی خۆکار"
+ }
+ },
+ "hide_typing_indicator": {
+ "name": "شاردنەوەی نیشاندەری نووسین",
+ "description": "ڕێگری دەکات لەوانی تر کە ببینن خەریکی نووسینیت",
+ "options": {
+ "blacklist": "بەدەرکردن لە شاردنەوەی نیشاندەری نووسین",
+ "whitelist": "شاردنەوەی نیشاندەری نووسین"
+ }
+ }
+ }
+ },
+ "actions": {
+ "clean_snapchat_cache": {
+ "name": "پاککردنەوەی کاشی سناپچات",
+ "description": "کاشی سناپچات پاک دەکاتەوە"
+ },
+ "manage_friend_list": {
+ "name": "بەڕێوەبردنی لیستی هاوڕێکان",
+ "description": "هاوردن/هەناردەکردنی لیستی هاوڕێکان لە کاتی باکەپکردن"
+ },
+ "export_chat_messages": {
+ "name": "هەناردەکردنی نامەکانی گفتوگۆ",
+ "description": "هەناردەکردنی نامەکانی گفتوگۆ بۆ فایلی JSON/HTML/TXT"
+ },
+ "export_memories": {
+ "name": "هەناردەکردنی میمۆرییەکان",
+ "description": "هەناردەکردنی میمۆرییەکان بۆ فایلی ZIP"
+ },
+ "bulk_messaging_action": {
+ "name": "کرداری نامە ناردنی بەکۆمەڵ",
+ "description": "ئەنجامدانی کردارەکانی وەک سڕینەوەی هاوڕێکان یان سڕینەوەی بەکۆمەڵی گفتوگۆکان"
+ },
+ "regen_mappings": {
+ "name": "دروستکردنەوەی نەخشەکان (Regenerate Mappings)",
+ "description": "دروستکردنەوەی نەخشەکان بە دەستی"
+ },
+ "change_language": {
+ "name": "گۆڕینی زمان",
+ "description": "گۆڕینی زمانی PurrfectSnap"
+ },
+ "file_imports": {
+ "name": "هاوردەکردنی فایل",
+ "description": "هاوردەکردنی فایل بۆ بەکارهێنان لە سناپچات"
+ },
+ "friend_tracker": {
+ "name": "شوێنهەڵگری هاوڕێ",
+ "description": "شوێنهەڵگرتنی هاوڕێکانت لە سناپچات"
+ },
+ "logger_history": {
+ "name": "مێژووی تۆمارکەر",
+ "description": "بینینی مێژووی نامە تۆمارکراوەکان"
+ }
+ },
+ "features": {
+ "notices": {
+ "unstable": "\u26a0 جێگیر نییە",
+ "ban_risk": "\u26a0 ئەم تایبەتمەندییە رەنگە ببێتە هۆی باندکردن",
+ "internal_behavior": "\u26a0 ئەمە رەنگە ڕەفتاری ناوخۆیی سناپچات تێک بدات"
+ },
+ "options": {
+ "empty": "بەتاڵ",
+ "walk_radius": {
+ "empty": "بەتاڵ"
+ },
+ "spoof_battery_level": {
+ "empty": "بەتاڵ"
+ },
+ "custom_android_id": {
+ "empty": "بەتاڵ"
+ },
+ "custom_streaks_expiration_format": {
+ "empty": "بەتاڵ"
+ },
+ "preferred_transcription_lang": {
+ "empty": "بەتاڵ"
+ },
+ "custom_emoji_font": {
+ "empty": "بەتاڵ"
+ },
+ "custom_shared_library": {
+ "empty": "بەتاڵ"
+ },
+ "custom_resolution": {
+ "empty": "بەتاڵ"
+ },
+ "custom_path_format": {
+ "empty": "بەتاڵ"
+ },
+ "custom_video_codec": {
+ "empty": "بەتاڵ"
+ },
+ "custom_audio_codec": {
+ "empty": "بەتاڵ"
+ },
+ "double_tap_chat_action_custom_emoji": {
+ "empty": "بەتاڵ"
+ },
+ "unsaveable_messages": {
+ "blacklist": "دۆخی لیستی ڕەش",
+ "whitelist": "دۆخی لیستی سپی",
+ "null": "ناچالاکە"
+ },
+ "update_check_frequency": {
+ "daily": "ڕۆژانە",
+ "weekly": "هەفتانە",
+ "monthly": "مانگانە"
+ }
+ },
+ "properties": {
+ "global": {
+ "name": "گشتی",
+ "description": "بەربژێرەکان و بنچینەکانی مۆدیوڵی گشتی",
+ "properties": {
+ "ui_settings": {
+ "name": "ڕێکخستنەکانی ڕووکار",
+ "description": "ڕێکخستنی فیدباک و پەیامە کاتییەکان",
+ "properties": {
+ "haptic_feedback": {
+ "name": "لەرینەوەی دەستی",
+ "description": "لەرینەوە لەکاتی ئەنجامدانی کردارەکان"
+ },
+ "use_system_toasts": {
+ "name": "بەکارهێنانی پەیامی سیستەم",
+ "description": "پیشاندانی پەیامی ئەندرۆید لەجیاتی ڕووکاری ناو بەرنامەکە"
+ }
+ }
+ },
+ "update_settings": {
+ "name": "ڕێکخستنەکانی نوێکردنەوە",
+ "description": "کۆنترۆڵکردنی پشکنینی نوێکردنەوەی ئۆتۆماتیکی",
+ "properties": {
+ "auto_update_check": {
+ "name": "پشکنینی نوێکردنەوەی ئۆتۆماتیکی",
+ "description": "پشکنین بۆ وەشانی نوێ بەشێوەی ئۆتۆماتیکی"
+ },
+ "update_check_frequency": {
+ "name": "ماوەی پشکنینی نوێکردنەوە",
+ "description": "چەند جار جارێک پشکنین بکرێت بۆ نوێکردنەوە"
+ }
+ }
+ }
+ }
+ },
+ "downloader": {
+ "name": "دابەزێنەر",
+ "description": "دابەزاندنی میدیای سناپچات",
+ "properties": {
+ "save_folder": {
+ "name": "فۆڵدەری پاشەکەوتکردن",
+ "description": "دیاریکردنی ئەو شوێنەی کە هەموو میدیاکان تێیدا پاشەکەوت دەکرێن"
+ },
+ "auto_download_sources": {
+ "name": "سەرچاوەکانی دابەزاندنی ئۆتۆماتیکی",
+ "description": "دیاریکردنی ئەو سەرچاوانەی کە خۆکارانە دابەزێنرێن"
+ },
+ "prevent_self_auto_download": {
+ "name": "ڕێگری لە دابەزاندنی خودی",
+ "description": "ڕێگری دەکات لە دابەزاندنی سناپەکانی خۆت بەشێوەی ئۆتۆماتیکی"
+ },
+ "path_format": {
+ "name": "فۆرماتی ڕێڕەو",
+ "description": "دیاریکردنی فۆرماتی ڕێڕەوی پەڕگە"
+ },
+ "allow_duplicate": {
+ "name": "ڕێگەدان بە دووبارەبوونەوە",
+ "description": "ڕێگە دەدات هەمان میدیا چەند جارێک دابەزێنرێت"
+ },
+ "merge_overlays": {
+ "name": "تێکەڵکردنی نووسینەکان",
+ "description": "نووسین و میدیای سناپەکە تێکەڵ دەکات بۆ یەک پەڕگە"
+ },
+ "force_image_format": {
+ "name": "سەپاندنی فۆرماتی وێنە",
+ "description": "وێنەکان ناچار دەکات بە فۆرماتێکی دیاریکراو پاشەکەوت بکرێن"
+ },
+ "force_voice_note_format": {
+ "name": "سەپاندنی فۆرماتی دەنگ",
+ "description": "نامە دەنگییەکان ناچار دەکات بە فۆرماتێکی دیاریکراو پاشەکەوت بکرێن"
+ },
+ "auto_download_voice_notes": {
+ "name": "دابەزاندنی ئۆتۆماتیکی دەنگەکان",
+ "description": "خۆکارانە نامە دەنگییەکان دادەبەزێنێت لەکاتی لێدانیان"
+ },
+ "download_profile_pictures": {
+ "name": "دابەزاندنی وێنەی پڕۆفایل",
+ "description": "ڕێگەت دەدات وێنەی پڕۆفایلەکان دابەزێنیت لە پەڕەی پڕۆفایلەوە"
+ },
+ "opera_download_button": {
+ "name": "دوگمەی دابەزاندنی ئۆپێرا",
+ "description": "دوگمەیەکی دابەزاندن زیاد دەکات لە سووچی سەرەوەی ڕاست لەکاتی بینینی سناپێک.\nداگرتنی درێژ لەسەر دوگمەکە دابەزاندن دەسەپێنێت"
+ },
+ "download_context_menu": {
+ "name": "لیستی دابەزاندن",
+ "description": "ڕێگەت دەدات نامەکان دابەزێنیت/پێشبینی بکەیت لە چات یان ستۆری بە بەکارهێنانی لیست.\nداگرتنی درێژ لەسەر دوگمەکە دابەزاندن دەسەپێنێت"
+ },
+ "ffmpeg_options": {
+ "name": "هەڵبژاردەکانی FFmpeg",
+ "description": "دیاریکردنی هەڵبژاردەی زیاتری FFmpeg",
+ "properties": {
+ "threads": {
+ "name": "تریدەکان",
+ "description": "ژمارەی ئەو تریدانەی بەکاردەهێنرێن"
+ },
+ "preset": {
+ "name": "پریسێت",
+ "description": "دیاریکردنی خێرایی گۆڕینەکە"
+ },
+ "constant_rate_factor": {
+ "name": "فاکتەری ڕەیتی جێگیر",
+ "description": "دیاریکردنی فاکتەری ڕەیتی جێگیر بۆ کۆدکەری ڤیدیۆ\nلە 0 بۆ 51 بۆ libx264"
+ },
+ "video_bitrate": {
+ "name": "بیتڕەیتی ڤیدیۆ",
+ "description": "دیاریکردنی بیتڕەیتی ڤیدیۆ (kbps)"
+ },
+ "audio_bitrate": {
+ "name": "بیتڕەیتی دەنگ",
+ "description": "دیاریکردنی بیتڕەیتی دەنگ (kbps)"
+ },
+ "custom_video_codec": {
+ "name": "کۆدێکی ڤیدیۆی دەستکاریکراو",
+ "description": "دانانی کۆدێکی ڤیدیۆی تایبەت (بۆ نموونە libx264)"
+ },
+ "custom_audio_codec": {
+ "name": "کۆدێکی دەنگی دەستکاریکراو",
+ "description": "دانانی کۆدێکی دەنگی تایبەت (بۆ نموونە AAC)"
+ }
+ }
+ },
+ "logging": {
+ "name": "تۆمارکردن",
+ "description": "پیشاندانی پەیام لەکاتی دابەزاندنی میدیا"
+ },
+ "custom_path_format": {
+ "name": "فۆرماتی ڕێڕەوی دەستکاریکراو",
+ "description": "دیاریکردنی فۆرماتێکی ڕێڕەوی تایبەت بۆ میدیا دابەزێنراوەکان\n\nگۆڕاوە بەردەستەکان:\n - %username%\n - %source%\n - %hash%\n - %date_time%"
+ }
+ }
+ },
+ "user_interface": {
+ "name": "ڕووکاری بەکارهێنەر",
+ "description": "گۆڕینی شێوە و هەستی سناپچات",
+ "properties": {
+ "enable_app_appearance": {
+ "name": "چالاککردنی ڕێکخستنەکانی دەرکەوتنی بەرنامە",
+ "description": "ڕێکخستنی شاراوەی دەرکەوتنی بەرنامە چالاک دەکات\nرەنگە لە وەشانە نوێیەکانی سناپچات پێویست نەبێت"
+ },
+ "friend_feed_message_preview": {
+ "name": "پێشبینینی نامەی فیدی هاوڕێیان",
+ "description": "پێشبینینی کۆتا نامەکان لە فیدی هاوڕێیان پیشان دەدات",
+ "properties": {
+ "amount": {
+ "name": "بڕ",
+ "description": "ژمارەی ئەو نامانەی کە پێشبینی دەکرێن"
+ }
+ }
+ },
+ "snap_preview": {
+ "name": "پێشبینینی سناپ",
+ "description": "پێشبینینێکی بچووک پیشان دەدات لە تەنیشت سناپە نەبینراوەکان لە چات"
+ },
+ "bootstrap_override": {
+ "name": "تێپەڕاندنی بووتستراپ",
+ "description": "تێپەڕاندنی ڕێکخستنەکانی بووتستراپی ڕووکاری بەکارهێنەر",
+ "properties": {
+ "app_appearance": {
+ "name": "دەرکەوتنی بەرنامە",
+ "description": "دەرکەوتنێکی جێگیر بۆ بەرنامە دادەنێت"
+ },
+ "home_tab": {
+ "name": "تابی سەرەکی",
+ "description": "گۆڕینی تابی سەرەتایی لەکاتی کردنەوەی سناپچات"
+ }
+ }
+ },
+ "map_friend_nametags": {
+ "name": "ناوەکان لە نەخشەی هاوڕێیان",
+ "description": "باشترکردنی ناوی هاوڕێیان لەسەر نەخشەی سناپ"
+ },
+ "prevent_message_list_auto_scroll": {
+ "name": "ڕێگری لە جوڵەی خۆکاری لیستی نامەکان",
+ "description": "ڕێگری دەکات لەوەی لیستی نامەکان بچێتە خوارەوە لەکاتی ناردن/وەرگرتنی نامە"
+ },
+ "streak_expiration_info": {
+ "name": "پیشاندانی زانیاری بەسەرچوونی ستریک",
+ "description": "کاتی بەسەرچوونی ستریک پیشان دەدات لە تەنیشت ژمارەی ستریکەکان"
+ },
+ "hide_friend_feed_entry": {
+ "name": "شاردنەوەی بەشی فیدی هاوڕێیان",
+ "description": "هاوڕێیەکی دیاریکراو لە فیدی هاوڕێیان دەشارێتەوە\nتابی سۆشیاڵ بەکاربهێنە بۆ بەڕێوەبردنی ئەم تایبەتمەندییە"
+ },
+ "hide_streak_restore": {
+ "name": "شاردنەوەی گەڕاندنەوەی ستریک",
+ "description": "دوگمەی گەڕاندنەوە (Restore) لە فیدی هاوڕێیان دەشارێتەوە"
+ },
+ "hide_quick_add_suggestions": {
+ "name": "شاردنەوەی پێشنیارەکانی زیادکردنی خێرا",
+ "description": "پێشنیارەکانی زیادکردنی هاوڕێ لادەبات"
+ },
+ "hide_story_suggestions": {
+ "name": "شاردنەوەی پێشنیارەکانی ستۆری",
+ "description": "پێشنیارەکان لە پەڕەی ستۆرییەکان لادەبات"
+ },
+ "hide_ui_components": {
+ "name": "شاردنەوەی پێکهاتەکانی ڕووکار",
+ "description": "دیاری بکە کام پێکهاتەی ڕووکار دەشاریتەوە"
+ },
+ "opera_media_quick_info": {
+ "name": "زانیاری خێرای میدیای ئۆپێرا",
+ "description": "زانیاری بەسوود دەربارەی میدیا پیشان دەدات وەک بەرواری دروستکردن لە لیستی بینەری ئۆپێرا"
+ },
+ "old_bitmoji_selfie": {
+ "name": "سێڵفی بیتمۆجی کۆن",
+ "description": "سێڵفییە بیتمۆجییەکانی وەشانە کۆنەکانی سناپچات دەگەڕێنێتەوە"
+ },
+ "disable_spotlight": {
+ "name": "لەکارخستنی سپۆتڵایت",
+ "description": "پەڕەی سپۆتڵایت لەکار دەخات"
+ },
+ "friend_feed_menu_buttons": {
+ "name": "دوگمەکانی لیستی فیدی هاوڕێیان",
+ "description": "دیاری بکە کام دوگمەکان لە لیستی فیدی هاوڕێیان دەربکەون"
+ },
+ "auto_close_friend_feed_menu": {
+ "name": "داخستنی ئۆتۆماتیکی لیستی فیدی هاوڕێیان",
+ "description": "خۆکارانە لیستی فیدی هاوڕێیان دادەخات دوای داگرتنی دوگمەی ڕێکخستنێک"
+ },
+ "vertical_story_viewer": {
+ "name": "بینەری ستۆری ستوونی",
+ "description": "بینەری ستۆری ستوونی بۆ هەموو ستۆرییەکان چالاک دەکات"
+ },
+ "enable_friend_feed_menu_bar": {
+ "name": "باری لیستی فیدی هاوڕێیان",
+ "description": "باری لیستی نوێی فیدی هاوڕێیان چالاک دەکات"
+ },
+ "message_indicators": {
+ "name": "ئاماژەکانی نامە",
+ "description": "ئایکۆنی ئاماژە بۆ نامەکان زیاد دەکات\nتێبینی: رەنگە ئاماژەکان ١٠٠% ورد نەبن"
+ },
+ "stealth_mode_indicator": {
+ "name": "ئاماژەی دۆخی شاراوە",
+ "description": "ئیمۆجییەکی \ud83d\udc7b زیاد دەکات لە تەنیشت ئەو چاتانەی لە دۆخی شاراوەدان"
+ },
+ "edit_text_override": {
+ "name": "تێپەڕاندنی دەستکاریکردنی دەق",
+ "description": "تێپەڕاندنی ڕەفتاری خانەی دەق"
+ },
+ "prevent_forced_keyboard": {
+ "name": "ڕێگری لە کیبۆردی زۆرەملێ",
+ "description": "ڕێگری دەکات لە سناپچات کە کیبۆرد بەرز بکاتەوە کاتێک چاتێک دەکەیتەوە"
+ },
+ "force_amoled_theme": {
+ "name": "سەپاندنی دۆخی ڕەشی تاریک (AMOLED)",
+ "description": "سەپاندنی دۆخی ڕەشی تەواو لە تەواوی ڕووکاری بەرنامەکە"
+ },
+ "settings_menu": {
+ "name": "لیستی ڕێکخستنەکان",
+ "description": "هەڵبژاردن لەنێوان دیزاینی نوێ و کۆنی لیستی ڕێکخستنەکان"
+ }
+ }
+ },
+ "messaging": {
+ "name": "نامە ناردن",
+ "description": "گۆڕینی شێوازی پەیوەندیکردن لەگەڵ هاوڕێیان",
+ "properties": {
+ "bypass_screenshot_detection": {
+ "name": "تێپەڕاندنی ئاشکراکردنی سکرینشۆت",
+ "description": "ڕێگری دەکات لە سناپچات کە بزانێت کەی سکرینشۆتت گرتووە"
+ },
+ "anonymous_story_viewing": {
+ "name": "بینینی ستۆری بە نهێنی",
+ "description": "ڕێگری دەکات لەوەی کەس بزانێت ستۆرییەکەیت بینیوە"
+ },
+ "prevent_story_rewatch_indicator": {
+ "name": "ڕێگری لە ئاماژەی بینینەوەی ستۆری",
+ "description": "ڕێگری دەکات لەوەی کەس بزانێت ستۆرییەکەیت بینیوەتەوە"
+ },
+ "hide_peek_a_peek": {
+ "name": "شاردنەوەی پیک-ئە-پیک",
+ "description": "ڕێگری دەکات لە ناردنی ئاگادارکردنەوە کاتێک بە نیوەیی دەچیتە ناو چاتێک"
+ },
+ "hide_bitmoji_presence": {
+ "name": "شاردنەوەی ئامادەبوونی بیتمۆجی",
+ "description": "ڕێگری دەکات لە دەرکەوتنی بیتمۆجییەکەت کاتێک لە چاتیت"
+ },
+ "hide_typing_notifications": {
+ "name": "شاردنەوەی ئاگادارکردنەوەی نووسین",
+ "description": "ڕێگری دەکات لەوەی کەس بزانێت خەریکی نووسینی نامەیت"
+ },
+ "unlimited_snap_view_time": {
+ "name": "کاتی بینینی سناپی بێسنوور",
+ "description": "کاتی دیاریکراو بۆ بینینی سناپەکان لادەبات"
+ },
+ "auto_mark_as_read": {
+ "name": "خوێندنەوەی ئۆتۆماتیکی",
+ "description": "خۆکارانە نامە/سناپەکان وەک خوێندراوە دیاری دەکات تەنانەت ئەگەر دۆخی شاراوە چالاک بێت"
+ },
+ "mark_snap_as_seen_button": {
+ "name": "دوگمەی دیاریکردنی سناپ وەک بینراو",
+ "description": "دوگمەیەک زیاد دەکات بۆ دیاریکردنی سناپ وەک بینراو لەکاتی کردنەوەی.\nئەمە کار دەکات تەنانەت ئەگەر دۆخی شاراوە چالاک بێت"
+ },
+ "skip_when_marking_as_seen": {
+ "name": "پەڕاندن لەکاتی دیاریکردن وەک بینراو",
+ "description": "خۆکارانە دەچێتە سەر سناپی داهاتوو کاتێک سناپێک وەک بینراو دیاری دەکەیت.\nلەگەڵ دوگمەی دیاریکردنی سناپ وەک بینراو بەکاری بهێنە"
+ },
+ "loop_media_playback": {
+ "name": "دووبارەبوونەوەی میدیا",
+ "description": "لەکاتی بینینی سناپ/ستۆری میدیاکان دووبارە دەبنەوە"
+ },
+ "disable_replay_in_ff": {
+ "name": "لەکارخستنی دووبارە لێدانەوە لە FF",
+ "description": "توانای دووبارە لێدانەوە لە فیدی هاوڕێیان بە داگرتنی درێژ لەکار دەخات"
+ },
+ "half_swipe_notifier": {
+ "name": "ئاگادارکەرەوەی نیوە-سواپی",
+ "description": "ئاگادارت دەکاتەوە کاتێک کەسێک بە نیوەیی دێتە ناو چاتەکەت",
+ "properties": {
+ "min_duration": {
+ "name": "کەمترین ماوە",
+ "description": "کەمترین ماوەی نیوە-سواپەکە (بە چرکە)"
+ },
+ "max_duration": {
+ "name": "زۆرترین ماوە",
+ "description": "زۆرترین ماوەی نیوە-سواپەکە (بە چرکە)"
+ }
+ }
+ },
+ "call_start_confirmation": {
+ "name": "تەئکیدکردنەوەی دەستپێکردنی پەیوەندی",
+ "description": "پەنجەرەی دڵنیابوونەوە پیشان دەدات پێش دەستپێکردنی پەیوەندی"
+ },
+ "unlimited_conversation_pinning": {
+ "name": "پینکردنی بێسنووری چات",
+ "description": "ڕێگەت دەدات ژمارەیەکی بێسنوور چات پین بکەیت"
+ },
+ "disable_snap_mode_restrictions": {
+ "name": "لەکارخستنی سنووردارکردنەکانی دۆخی سناپ",
+ "description": "ڕێگەت دەدات ئەو سناپانە ببینی کە خۆیان دەسڕنەوە بەبێ سنووردارکردن"
+ },
+ "prevent_message_sending": {
+ "name": "ڕێگری لە ناردنی نامە",
+ "description": "ڕێگری دەکات لە ناردنی هەندێک جۆری نامە"
+ },
+ "friend_mutation_notifier": {
+ "name": "ئاگادارکەرەوەی گۆڕانکاری هاوڕێ",
+ "description": "ئاگادارت دەکاتەوە کاتێک شتێک دەگۆڕێت لە پڕۆفایلی هاوڕێیەک"
+ },
+ "better_notifications": {
+ "name": "ئاگادارکردنەوەی باشتر",
+ "description": "زانیاری زیاتر زیاد دەکات بۆ ئاگادارکردنەوەکان",
+ "properties": {
+ "group_notifications": {
+ "name": "ئاگادارکردنەوەی گرووپ",
+ "description": "ئاگادارکردنەوەکان دەکات بە یەک دانە"
+ },
+ "chat_preview": {
+ "name": "پێشبینینی چات",
+ "description": "پێشبینینی نامە وەرگیراوەکان لە ئاگادارکردنەوەکان پیشان دەدات"
+ },
+ "media_preview": {
+ "name": "پێشبینینی میدیا",
+ "description": "پێشبینینی جۆری میدیا دیاریکراوەکان لە ئاگادارکردنەوەکان پیشان دەدات"
+ },
+ "media_caption": {
+ "name": "کاپشنی میدیا",
+ "description": "نووسینی سەر میدیاکان لە ئاگادارکردنەوەکان پیشان دەدات"
+ },
+ "stacked_media_messages": {
+ "name": "نامە میدیاییە کۆکراوەکان",
+ "description": "چەندین نامەی میدیایی کۆدەکاتەوە بۆ یەک ئاگادارکردنەوەی دەقی کاتێک نەتوانرێت پێشبینی بکرێن. لەگەڵ پێشبینینی چات بەکاری بهێنە"
+ },
+ "friend_add_source": {
+ "name": "سەرچاوەی زیادکردنی هاوڕێ",
+ "description": "سەرچاوەی داواکاری هاوڕێیەتی لە ئاگادارکردنەوە پیشان دەدات"
+ },
+ "reply_button": {
+ "name": "دوگمەی وەڵامدانەوە",
+ "description": "دوگمەی وەڵامدانەوە بۆ ئاگادارکردنەوە زیاد دەکات"
+ },
+ "smart_replies": {
+ "name": "وەڵامی زیرەک",
+ "description": "وەڵامی پێشنیارکراو بۆ ئاگادارکردنەوەکان زیاد دەکات (ئەندرۆید ١٠+). لەگەڵ دوگمەی وەڵامدانەوە بەکاری بهێنە"
+ },
+ "download_button": {
+ "name": "دوگمەی دابەزاندن",
+ "description": "ڕێگەت دەدات میدیا دابەزێنیت لە ئاگادارکردنەوەکانەوە"
+ },
+ "mark_as_read_button": {
+ "name": "دوگمەی دیاریکردن وەک خوێندراوە",
+ "description": "ڕێگەت دەدات نامە وەک خوێندراوە دیاری بکەیت لە ئاگادارکردنەوەکانەوە"
+ },
+ "mark_as_read_and_save_in_chat": {
+ "name": "دیاریکردن وەک خوێندراوە و پاشەکەوتکردن",
+ "description": "دوگمەی دیاریکردن وەک خوێندراوە و پاشەکەوتکردن لە چات بۆ ئاگادارکردنەوە زیاد دەکات"
+ }
+ }
+ },
+ "notification_blacklist": {
+ "name": "لیستی ڕەشی ئاگادارکردنەوە",
+ "description": "دیاری بکە کام ئاگادارکردنەوانە بلۆک بکرێن"
+ },
+ "message_logger": {
+ "name": "تۆمارکەری نامە",
+ "description": "ڕێگری دەکات لە سڕینەوەی نامەکان",
+ "properties": {
+ "keep_my_own_messages": {
+ "name": "هێشتنەوەی نامەکانی خۆم",
+ "description": "ڕێگری دەکات لە سڕینەوەی نامەکانی خۆت"
+ },
+ "auto_purge": {
+ "name": "سڕینەوەی ئۆتۆماتیکی",
+ "description": "خۆکارانە نامە پاشەکەوتکراوەکان دەسڕێتەوە کە کۆنترن لە کاتێکی دیاریکراو"
+ },
+ "message_filter": {
+ "name": "فلتەری نامە",
+ "description": "دیاری بکە کام نامانە تۆمار بکرێن (بەتاڵ بۆ هەموو نامەکان)"
+ },
+ "deleted_message_color": {
+ "name": "ڕەنگی نامەی سڕاوە",
+ "description": "ڕەنگی نامە سڕاوەکان دیاری دەکات"
+ }
+ }
+ },
+ "auto_save_messages_in_conversations": {
+ "name": "پاشەکەوتکردنی ئۆتۆماتیکی نامەکان",
+ "description": "خۆکارانە هەموو نامەکانی ناو چات پاشەکەوت دەکات"
+ },
+ "unsaveable_messages": {
+ "name": "نامە پاشەکەوت نەکراوەکان",
+ "description": "ڕێگری دەکات لە پاشەکەوتکردنی جۆرە نامەی دیاریکراو لە چات",
+ "properties": {
+ "chat": {
+ "name": "نامەکانی چات",
+ "description": "نامەکانی چات دەکات بە پاشەکەوت نەکراو"
+ },
+ "snap": {
+ "name": "سناپەکان",
+ "description": "سناپەکان دەکات بە پاشەکەوت نەکراو"
+ },
+ "external_media": {
+ "name": "میدیای دەرەکی",
+ "description": "میدیای دەرەکی دەکات بە پاشەکەوت نەکراو"
+ },
+ "sticker": {
+ "name": "ستیکەرەکان",
+ "description": "ستیکەرەکان دەکات بە پاشەکەوت نەکراو"
+ },
+ "share": {
+ "name": "شەیەرکراوەکان",
+ "description": "بابەتی شەیەرکراو دەکات بە پاشەکەوت نەکراو"
+ },
+ "note": {
+ "name": "تێبینی دەنگی",
+ "description": "تێبینی دەنگی دەکات بە پاشەکەوت نەکراو"
+ },
+ "story_reply": {
+ "name": "وەڵامی ستۆری",
+ "description": "وەڵامی ستۆری دەکات بە پاشەکەوت نەکراو"
+ }
+ }
+ },
+ "gallery_media_send_override": {
+ "name": "تێپەڕاندنی ناردنی میدیای گەلەری",
+ "description": "سەرچاوەی میدیا دەگۆڕێت کاتێک لە گەلەرییەوە دەینێریت",
+ "properties": {
+ "mode": {
+ "name": "دۆخی تێپەڕاندن",
+ "description": "هەڵبژێرە چۆن میدیای گەلەری بنێردرێت"
+ },
+ "include_camera_snaps": {
+ "name": "لەخۆگرتنی سناپی کامێرا",
+ "description": "هەروەها پەنجەرەی تێپەڕاندن بۆ سناپی کامێراش پیشان دەدات"
+ }
+ }
+ },
+ "strip_media_metadata": {
+ "name": "لابردنی داتای میدیا",
+ "description": "داتای (Metadata) میدیا لادەبات پێش ناردنی وەک نامە"
+ },
+ "bypass_message_retention_policy": {
+ "name": "تێپەڕاندنی سیاسەتی مانەوەی نامە",
+ "description": "ڕێگری دەکات لە سڕینەوەی نامەکان دوای بینینیان"
+ },
+ "bypass_message_action_restrictions": {
+ "name": "تێپەڕاندنی سنووردارکردنی کردارەکانی نامە",
+ "description": "ڕێگەت دەدات کاردانەوە بۆ سناپێک بکەیت بەبێ کردنەوەی یان نامەیەکی پاشەکەوت نەکراو پاشەکەوت بکەیت"
+ },
+ "remove_groups_locked_status": {
+ "name": "لابردنی دۆخی داخراوی گرووپ",
+ "description": "ڕێگەت دەدات زانیاری گرووپ ببینیت دوای دەرکردنت"
+ },
+ "double_tap_chat_action": {
+ "name": "کرداری دابڵ تابی چات",
+ "description": "کردارێکی تایبەت ئەنجام دەدات کاتێک دابڵ تاب لە نامەیەکی چات دەکەیت"
+ },
+ "double_tap_chat_action_custom_emoji": {
+ "name": "کاردانەوەی ئیمۆجی تایبەت بۆ دابڵ تابی چات",
+ "description": "کاردانەوەی ئیمۆجییەکی تایبەت دادەنێت بۆ کرداری دابڵ تابی چات"
+ },
+ "auto_reply": {
+ "name": "وەڵامدانەوەی ئۆتۆماتیکی",
+ "description": "خۆکارانە وەڵام بۆ نامەکان دەنێرێت کاتێک بەردەست نیت",
+ "properties": {
+ "allow_running_in_background": {
+ "name": "ڕێگەدان بە کارکردن لە پاشبنەما (Background)",
+ "description": "ڕێگە دەدات وەڵامدانەوەی ئۆتۆماتیکی لە پاشبنەما کار بکات. تێبینی: ئەمە پاتری زۆر دەبات"
+ },
+ "cooldown_seconds": {
+ "name": "چەند چرکە جارێک",
+ "description": "کەمترین ماوە لەنێوان وەڵامە ئۆتۆماتیکییەکان بۆ هەمان چات (بە چرکە)"
+ },
+ "message_age_threshold": {
+ "name": "ڕێژەی تەمەنی نامە",
+ "description": "تەنها وەڵامی ئەو نامانە دەداتەوە کە لەم ماوەیەدا گەیشتوون (بە چرکە)"
+ },
+ "ai_config": {
+ "name": "ڕێکخستنی ژیری دەستکرد",
+ "description": "ڕێکخستنەکان بۆ وەڵامدانەوەی ئۆتۆماتیکی بە ژیری دەستکرد",
+ "properties": {
+ "enable_ai_replies": {
+ "name": "چالاککردنی وەڵامی AI",
+ "description": "بەکارهێنانی ژیری دەستکرد بۆ دروستکردنی وەڵامی زیرەک لەجیاتی نامەی ئامادەکراو"
+ },
+ "ai_provider": {
+ "name": "پێدەر (Provider)ی AI",
+ "description": "دیاریکردنی کامی خزمەتگوزاری AI بەکاربێت بۆ دروستکردنی وەڵام"
+ },
+ "ai_endpoint_url": {
+ "name": "لینکی AI Endpoint",
+ "description": "لینکی API بۆ خزمەتگوزاری AI (بۆ نموونە OpenAI یان سێرڤەری AI ناوخۆیی)"
+ },
+ "ai_model": {
+ "name": "مۆدێلی AI",
+ "description": "مۆدێلی AI بۆ بەکارهێنان بۆ دروستکردنی وەڵام (بۆ نموونە gpt-3.5-turbo, gpt-4)"
+ },
+"ai_api_key": {
+ "name": "کلیلی AI API",
+ "description": "کلیلی API بۆ ناسینەوەی ناسنامە لەگەڵ خزمەتگوزاری زیرەکی دەستکرد"
+ },
+ "ai_system_prompt": {
+ "name": "پرۆمتی سیستەمی AI",
+ "description": "پرۆمتی سیستەم کە کەسایەتی و ڕەفتاری زیرەکی دەستکرد دیاری دەکات"
+ },
+ "ai_max_tokens": {
+ "name": "زۆرترین تۆکنەکانی AI",
+ "description": "زۆرترین ژمارەی تۆکنەکان (وشەکان) کە زیرەکی دەستکرد دەتوانێت لە وەڵامەکاندا بەکاری بهێنێت"
+ },
+ "ai_temperature": {
+ "name": "پلەی گەرمی AI",
+ "description": "کۆنتڕۆڵی هەڕەمەکی وەڵامەکانی زیرەکی دەستکرد دەکات (0.0 = دیاریکراو، 2.0 = زۆر هەڕەمەکی)"
+ },
+ "ai_context_length": {
+ "name": "درێژی ناوەڕۆکی AI",
+ "description": "ژمارەی نامەکانی پێشوو کە وەک ناوەڕۆک بۆ وەڵامەکانی زیرەکی دەستکرد لەبەرچاو دەگیرێن"
+ },
+ "ai_personality_traits": {
+ "name": "سیفەتەکانی کەسایەتی AI",
+ "description": "سیفەتەکانی کەسایەتی بۆ زیرەکی دەستکرد کە بە کۆما لێک جیاکراونەتەوە (بۆ نموونە: هاوڕێیانە، ئاسایی، یارمەتیدەر)"
+ },
+ "ai_response_style": {
+ "name": "شێوازی وەڵامی AI",
+ "description": "شێوازی گشتی بۆ وەڵامەکانی زیرەکی دەستکرد"
+ },
+ "ai_response_language": {
+ "name": "زمانی وەڵامی AI",
+ "description": "زمانی وەڵامەکانی زیرەکی دەستکرد (auto = هەمان زمانی نامە وەرگیراوەکە)"
+ },
+ "ai_use_conversation_history": {
+ "name": "بەکارهێنانی مێژووی گفتوگۆ",
+ "description": "لەبەرچاوگرتنی نامەکانی پێشوو وەک ناوەڕۆک بۆ وەڵامە پەیوەندیدارەکانی زیرەکی دەستکرد"
+ },
+ "ai_include_friend_info": {
+ "name": "لەبەرچاوگرتنی زانیاری هاوڕێ",
+ "description": "لەبەرچاوگرتنی ناوی هاوڕێ و زانیارییەکانی تری بەردەست لە ناوەڕۆکی زیرەکی دەستکرددا"
+ },
+ "ai_fallback_to_template": {
+ "name": "گەڕانەوە بۆ قاڵب",
+ "description": "بەکارهێنانی نامە قاڵبەکان ئەگەر زیرەکی دەستکرد نەیتوانی وەڵام دروست بکات"
+ },
+ "ai_request_timeout": {
+ "name": "کاتی کۆتایی داواکاری AI",
+ "description": "زۆرترین کاتی چاوەڕوانی بۆ وەڵامی زیرەکی دەستکرد (بە چرکە)"
+ },
+ "ai_retry_attempts": {
+ "name": "هەوڵەکانی دووبارەکردنەوەی AI",
+ "description": "ژمارەی هەوڵەکانی دووبارەکردنەوەی داواکارییەکانی AI ئەگەر سەرکەوتوو نەبوو"
+ }
+ }
+ },
+ "auto_trigger_config": {
+ "name": "ڕێکخستنی کارپێکردنی ئۆتۆماتیکی",
+ "description": "ڕێکخستنەکان بۆ کارپێکەرانی وەڵامی ئۆتۆماتیکی و قاڵبی نامەکان",
+ "properties": {
+ "friendSpecificGreeting": {
+ "name": "سڵاوی تایبەت بە هاوڕێ",
+ "description": "زیادکردنی ناوی هاوڕێ بۆ وەڵامە ئۆتۆماتیکییەکان بۆ کەسیتر کردن"
+ },
+ "friendGreeting": {
+ "name": "سڵاوی هاوڕێ",
+ "description": "دەقی سڵاو بۆ بەکارهێنان کاتێک سڵاوی تایبەت بە هاوڕێ چالاک کراوە"
+ },
+ "auto_reply_content_types": {
+ "name": "کارپێکەرانی وەڵامی ئۆتۆماتیکی",
+ "description": "دیاریکردنی ئەوەی کام جۆرە نامانە وەڵامی ئۆتۆماتیکی کارپێبکەن"
+ },
+ "chat_messages": {
+ "name": "وەڵامی نامەکانی چات",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ نامە دەقییەکانی چات"
+ },
+ "snap_messages": {
+ "name": "وەڵامەکانی سناپ",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ سناپەکان"
+ },
+ "story_share_messages": {
+ "name": "وەڵامی هاوبەشکردنی ستۆری",
+ "description": "نامەکانی وەڵامی ئۆتۆmاتیکی بۆ هاوبەشکردنی ستۆرییەکان"
+ },
+ "story_reply_messages": {
+ "name": "وەڵامی ستۆرییەکان",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ وەڵامدانەوەی ستۆرییەکان"
+ },
+ "external_media_messages": {
+ "name": "وەڵامی میدیا دەرەکییەکان",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ میدیا دەرەکییەکان"
+ },
+ "voice_note_messages": {
+ "name": "وەڵامی نامە دەنگییەکان",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ نامە دەنگییەکان"
+ },
+ "sticker_messages": {
+ "name": "وەڵامی ستیکەرەکان",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ ستیکەرەکان"
+ },
+ "tiny_snap_messages": {
+ "name": "وەڵامی سناپە بچووکەکان",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ سناپە بچووکەکان"
+ },
+ "map_reaction_messages": {
+ "name": "وەڵامی کاردانەوەکانی نەخشە",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ کاردانەوەکانی نەخشە"
+ },
+ "half_swipe_messages": {
+ "name": "نامەکانی نیوە-سواپ (Half Swipe)",
+ "description": "نامەکانی وەڵامی ئۆتۆماتیکی بۆ نیوە-سواپەکان"
+ }
+ }
+ }
+ }
+ },
+ "auto_open_snaps": {
+ "name": "ڕێکخستنەکانی کردنەوەی ئۆتۆماتیکی سناپ",
+ "description": "ڕێکخستنی دواکەوتن و ڕیزبەندی بۆ کردنەوەی ئۆتۆماتیکی سناپەکان",
+ "properties": {
+ "allow_running_in_background": {
+ "name": "ڕێگادان بە کارکردن لە پشتەوە",
+ "description": "ڕێگە دەدات بە کردنەوەی ئۆتۆماتیکی سناپ لە پشتەوە کار بکات. تێبینی: ئەمە بە شێوەیەکی بەرچاو پاتری سەرف دەکات"
+ },
+ "min_delay": {
+ "name": "کەمترین دواکەوتن (ms)",
+ "description": "کەمترین کاتی دواکەوتن بە میلی چرکە پێش کردنەوەی سناپێک"
+ },
+ "max_delay_ms": {
+ "name": "زۆرترین دواکەوتن (ms)",
+ "description": "زۆرترین کاتی دواکەوتن بە میلی چرکە پێش کردنەوەی سناپێک"
+ },
+ "queue_size": {
+ "name": "قەبارەی ڕیزبەندی",
+ "description": "زۆرترین ژمارەی سناپەکان بۆ هێشتنەوە لە ڕیزبەندیدا"
+ },
+ "retry_attempts": {
+ "name": "هەوڵەکانی دووبارەکردنەوە",
+ "description": "ژمارەی هەوڵەکان بۆ دووبارە کردنەوەی سناپێک ئەگەر شکستی هێنا"
+ },
+ "retry_delay": {
+ "name": "دواکەوتنی دووبارەکردنەوە (ms)",
+ "description": "دواکەوتن بە میلی چرکە لە نێوان هەوڵەکانی دووبارەکردنەوەدا"
+ }
+ }
+ },
+ "auto_delete_sent_messages": {
+ "name": "سڕینەوەی ئۆتۆماتیکی نامە نێردراوەکان",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی نامە نێردراوەکان دەسڕێتەوە دوای ماوەیەکی دیاریکراو",
+ "properties": {
+ "allow_running_in_background": {
+ "name": "ڕێگادان بە کارکردن لە پشتەوە",
+ "description": "ڕێگە دەدات بە سڕینەوەی ئۆتۆماتیکی نامە نێردراوەکان لە پشتەوە کار بکات. تێبینی: ئەمە بە شێوەیەکی بەرچاو پاتری سەرف دەکات"
+ },
+ "delete_after_value": {
+ "name": "سڕینەوە دوای (بڕ)",
+ "description": "بڕی کات پێش سڕینەوەی نامە نێردراوەکە"
+ },
+ "delete_after_unit": {
+ "name": "یەکەی کات",
+ "description": "یەکەی کات بۆ دواکەوتنی سڕینەوە دیاری بکە"
+ },
+ "message_types": {
+ "name": "جۆرەکانی نامە",
+ "description": "دیاریکردنی ئەوەی کام جۆرە نامانە بە ئۆتۆماتیکی بسڕدرێنەوە"
+ },
+ "show_countdown": {
+ "name": "پیشاندانی کاتی پێچەوانە",
+ "description": "پیشاندانی کاتی پێچەوانە پێش سڕینەوەی نامەکە"
+ },
+ "show_notification": {
+ "name": "پیشاندانی ئاگادارکردنەوە",
+ "description": "پیشاندانی ئاگادارکردنەوە لە کاتی ژماردنی پێچەوانەدا"
+ }
+ }
+ },
+ "instant_translation": {
+ "name": "وەرگێڕی نامە",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی نامە وەرگیراوەکان وەردەگێڕێت بۆ زمانی دڵخوازت",
+ "properties": {
+ "enabled": {
+ "name": "چالاککردنی وەرگێڕی نامە",
+ "description": "چالاککردنی وەرگێڕانی ئۆتۆماتیکی بۆ نامەکان"
+ },
+ "source_language": {
+ "name": "زمانی سەرچاوە",
+ "description": "ئەو زمانەی کە لێوەی وەردەگێڕدرێت (بۆ دۆزینەوەی ئۆتۆماتیکی 'auto' بەکاربهێنە)"
+ },
+ "target_language": {
+ "name": "زمانی مەبەست",
+ "description": "ئەو زمانەی کە بۆی وەردەگێڕدرێت"
+ },
+ "show_original": {
+ "name": "پیشاندانی دەقی ڕەسەن",
+ "description": "پیشاندانی دەقی ڕەسەنی نامەکە"
+ },
+ "show_translation": {
+ "name": "پیشاندانی وەرگێڕان",
+ "description": "پیشاندانی دەقە وەرگێڕدراوەکە"
+ },
+ "translation_position": {
+ "name": "شوێنی وەرگێڕان",
+ "description": "شوێنی پیشاندانی وەرگێڕانەکە بە بەراورد بە دەقی ڕەسەن"
+ },
+ "auto_translate": {
+ "name": "وەرگێڕانی ئۆتۆماتیکی",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی نامەکان وەردەگێڕێت کاتێک وەردەگیرێن"
+ },
+ "translate_on_tap": {
+ "name": "وەرگێڕان بە دەستلێدان",
+ "description": "وەرگێڕانی نامەکان کاتێک دەستیان لێ دەدرێت"
+ },
+ "supported_languages": {
+ "name": "زمانە پشتگیریکراوەکان",
+ "description": "ئەو زمانانەی بۆ وەرگێڕان بەردەستن"
+ },
+ "pause_on_error": {
+ "name": "وەستان لە کاتی هەڵەدا",
+ "description": "وەرگێڕان دەوەستێنێت کاتێک خزمەتگوزارییەکە بلۆک دەکرێت"
+ },
+ "max_retries": {
+ "name": "زۆرترین هەوڵدان",
+ "description": "زۆرترین ژمارەی هەوڵەکانی دووبارەکردنەوە"
+ },
+ "retry_delay": {
+ "name": "دواکەوتنی دووبارەکردنەوە",
+ "description": "دواکەوتن لە نێوان هەوڵەکانی دووبارەکردنەوە (بە میلی چرکە)"
+ }
+ }
+ },
+ "scheduled_send_allow_running_in_background": {
+ "name": "ڕێگادان بە ناردنی کات بۆ دانراو لە پشتەوە",
+ "description": "بەردەوامبوونی پرۆسەی ناردنی نامە کات بۆ دانراوەکان کاتێک سناپچات لە پشتەوەیە"
+ }
+ }
+ },
+ "global": {
+ "name": "گشتی",
+ "description": "دەستکاری ڕێکخستنە گشتییەکانی سناپچات",
+ "properties": {
+ "better_location": {
+ "name": "شوێنی باشتر",
+ "description": "شوێنی سناپچات باشتر دەکات",
+ "properties": {
+ "spoof_location": {
+ "name": "گۆڕینی شوێن (Spoof)",
+ "description": "شوێنەکەت دەگۆڕێت بۆ شوێنێکی دیاریکراو"
+ },
+ "coordinates": {
+ "name": "پۆتانەکان (Coordinates)",
+ "description": "دیاریکردنی پۆتانەکانی شوێنە گۆڕدراوەکە"
+ },
+ "walk_radius": {
+ "name": "بازنەی ڕۆیشتن",
+ "description": "بە شێوەیەکی هەڕەمەکی لەم بازنەیەدا پیاسە بکە (پێ)"
+ },
+ "always_update_location": {
+ "name": "هەمیشە شوێن نوێ بکەرەوە",
+ "description": "سناپچات ناچار دەکات شوێن نوێ بکاتەوە تەنانەت ئەگەر هیچ داتایەکی GPS وەرنەگیرابێت"
+ },
+ "suspend_location_updates": {
+ "name": "ڕاگرتنی نوێکردنەوەی شوێن",
+ "description": "ڕێگری دەکات لە نوێکردنەوەی شوێنەکەت"
+ },
+ "spoof_battery_level": {
+ "name": "گۆڕینی ئاستی پاتری",
+ "description": "ئاستی پاتری ئامێرەکەت لەسەر نەخشە دەگۆڕێت\nدەبێت نرخەکە لە نێوان 0 و 100 بێت"
+ },
+ "spoof_headphones": {
+ "name": "گۆڕینی دۆخی هێدفۆن",
+ "description": "دۆخی گوێگرتن لە مۆسیقا لەسەر نەخشە دەگۆڕێت"
+ },
+ "show_battery_level": {
+ "name": "پیشاندانی ئاستی پاتری",
+ "description": "ئاستی پاتری هاوڕێکانت لەسەر نەخشە پیشان دەدات"
+ }
+ }
+ },
+ "snapchat_plus": {
+ "name": "سناپچات پڵەس",
+ "description": "تایبەتمەندییەکانی سناپچات پڵەس چالاک دەکات\nهەندێک تایبەتمەندی سێرڤەر ڕەنگە کار نەکەن"
+ },
+ "media_upload_quality": {
+ "name": " کوالێتی بەرزکردنەوەی میدیا",
+ "description": "کوالێتی بەرزکردنەوەی میدیا دەگۆڕێت",
+ "properties": {
+ "force_video_upload_source_quality": {
+ "name": "ناچارکردنی کوالێتی سەرچاوەی ڤیدیۆ",
+ "description": "سناپچات ناچار دەکات کوالێتی سەرچاوە بەکاربهێنێت لە کاتی بەرزکردنەوەی ڤیدیۆکان\nتکایە ئاگاداربە ئەمە ڕەنگە مێتاداتای میدیاکە نەسڕێتەوە"
+ },
+ "disable_image_compression": {
+ "name": "ناچالاککردنی پەستانی وێنە",
+ "description": "پەستانی وێنە ناچالاک دەکات لە کاتی بەرزکردنەوەی میدیادا"
+ },
+ "custom_image_upload_format": {
+ "name": "فۆرماتی تایبەتی بەرزکردنەوەی وێنە",
+ "description": "فۆرماتێکی تایبەت بۆ بەرزکردنەوەی وێنە دادەنێت\nفۆرماتێکی بێ وونکردن (وەک PNG) هەڵبژێرە بۆ باشترین کوالێتی"
+ }
+ }
+ },
+ "disable_confirmation_dialogs": {
+ "name": "ناچالاککردنی دیالۆگی دڵنیابوونەوە",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی کارە دیاریکراوەکان پشتڕاست دەکاتەوە"
+ },
+ "auto_updater": {
+ "name": "نوێکاری ئۆتۆماتیکی",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی بۆ نوێکاری نوێ دەگەڕێت"
+ },
+ "update_settings": {
+ "name": "ڕێکخستنەکانی نوێکاری",
+ "description": "کۆنتڕۆڵکردنی چۆنیەتی گەڕانی PurrfectSnap بۆ نوێکارییەکان",
+ "properties": {
+ "auto_update_check": {
+ "name": "پشکنینی ئۆتۆماتیکی بۆ نوێکاری"
+ },
+ "update_check_frequency": {
+ "name": "دووبارەبوونەوەی پشکنینی نوێکاری"
+ }
+ }
+ },
+ "ui_settings": {
+ "name": "ڕێکخستنەکانی ڕووکار (UI)",
+ "properties": {
+ "haptic_feedback": {
+ "name": "کاردانەوەی لەرزین (Haptic Feedback)"
+ }
+ }
+ },
+ "disable_metrics": {
+ "name": "ناچالاککردنی مێتریکەکان",
+ "description": "ڕێگری دەکات لە ناردنی داتای شیکاری تایبەت بۆ سناپچات"
+ },
+ "disable_story_sections": {
+ "name": "ناچالاککردنی بەشەکانی ستۆری",
+ "description": "بەشەکان لە لاپەڕەی ستۆرییەکان لادەبات\nڕەنگە پێویستی بە نوێکردنەوە (Refresh) بێت بۆ ئەوەی بە باشی کار بکات"
+ },
+ "block_ads": {
+ "name": "بلۆککردنی ڕیکلام",
+ "description": "ڕێگری دەکات لە پیشاندانی ڕیکلامەکان"
+ },
+ "disable_custom_tabs": {
+ "name": "ناچالاککردنی تابە تایبەتەکان",
+ "description": "لینکەکان لە ئەپڵیکەیشنە پشتگیریکراوەکان دەکاتەوە لەبری وێبگەڕ"
+ },
+ "disable_permission_requests": {
+ "name": "ناچالاککردنی داواکاری ڕێپێدان",
+ "description": "ڕێگری لە سناپچات دەکات داوای ڕێپێدانی دیاریکراو بکات"
+ },
+ "disable_memories_snap_feed": {
+ "name": "ناچالاککردنی فیدی سناپی میمۆری",
+ "description": "ڕێگری لە سناپچات دەکات یادەوەرییە نوێیەکان پیشان بدات کاتێک لە کامێراوە بۆ سەرەوە دەخزێنیت"
+ },
+ "spotlight_comments_username": {
+ "name": "ناوی بەکارهێنەری کۆمێنتەکانی سپۆتلایت",
+ "description": "ناوی بەکارهێنەری نووسەر لە کۆمێنتەکانی سپۆتلایت پیشان دەدات"
+ },
+ "spotlight_comments_username_icon": {
+ "name": "ئایکۆنی ناوی بەکارهێنەری کۆمێنتەکانی سپۆتلایت",
+ "description": "هەڵبژاردنی ئەو ئایکۆنەی تەنیشت ناوی بەکارهێنەر لە کۆمێنتەکانی سپۆتلایت پیشان دەدرێت"
+ },
+ "bypass_video_length_restriction": {
+ "name": "لادانی سنووری درێژی ڤیدیۆ",
+ "description": "Single: یەک ڤیدیۆ دەنێرێت\nSplit: ڤیدیۆکان لە دوای دەستکاری کەرتبکات"
+ },
+ "default_video_playback_rate": {
+ "name": "خێرایی لێدانی ڤیدیۆی بنەڕەتی",
+ "description": "خێرایی بنەڕەتی بۆ لێدانی ڤیدیۆکان دادەنێت\nدەبێت نرخەکە لە نێوان 0.1 و 4.0 بێت"
+ },
+ "video_playback_rate_slider": {
+ "name": "خلیسکێنەی خێرایی لێدانی ڤیدیۆ",
+ "description": "خلیسکێنەیەک لە مێنووی ئۆپێرا زیاد دەکات بۆ گۆڕینی خێرایی لێدانی ڤیدیۆ\nتێبینی: گۆڕانکارییەکان تەنها بۆ ڤیدیۆکانی دواتر جێبەجێ دەبن"
+ },
+ "disable_google_play_dialogs": {
+ "name": "ناچالاککردنی دیالۆگەکانی خزمەتگوزاری گوگڵ پلەی",
+ "description": "ڕێگری دەکات لە پیشاندانی دیالۆگەکانی بەردەستبوونی خزمەتگوزارییەکانی گوگڵ پلەی"
+ },
+ "default_volume_controls": {
+ "name": "کۆنتڕۆڵی دەنگی بنەڕەتی",
+ "description": "سناپچات ناچار دەکات کۆنتڕۆڵی دەنگی سیستەم بەکاربهێنێت"
+ },
+ "disable_telecom_framework": {
+ "name": "ناچالاککردنی چوارچێوەی Telecom",
+ "description": "ڕێگری لە سناپچات دەکات چوارچێوەی Telecom ی ئەندرۆید بەکاربهێنێت\nئەمە ڕێگەت پێ دەدات گوێ لە مۆسیقا بگریت لە کاتی پەیوەندیدا"
+ },
+ "hide_active_music": {
+ "name": "شاردنەوەی مۆسیقای چالاک",
+ "description": "ڕێگری لە سناپچات دەکات بزانێت کە گوێ لە مۆسیقا دەگریت\nئەمە ڕێگەت پێ دەدات سناپ بگریت بە بەکارهێنانی دوگمەکانی دەنگ لە کاتی گوێگرتن لە مۆسیقا"
+ },
+ "disable_snap_splitting": {
+ "name": "ناچالاککردنی کەرتبوونی سناپ",
+ "description": "ڕێگری لە کەرتبوونی سناپەکان دەکات بۆ چەند بەشێک\nئەو وێنانەی دەیاننێریت دەبنە ڤیدیۆ"
+ }
+ }
+ },
+ "rules": {
+ "name": "یاساکان",
+ "description": "ڕێکخستنی یاساکانی ئۆتۆماتیککردن",
+ "properties": {
+ "auto_read": {
+ "name": "خوێندنەوەی ئۆتۆماتیکی"
+ },
+ "hide_typing_indicator": {
+ "name": "شاردنەوەی نیشاندەری نووسین"
+ },
+ "auto_reply": {
+ "name": "وەڵامی ئۆتۆماتیکی"
+ },
+ "auto_delete_sent_messages": {
+ "name": "سڕینەوەی ئۆتۆماتیکی نامە نێردراوەکان"
+ },
+ "auto_download": {
+ "name": "داگرتنی ئۆتۆماتیکی"
+ },
+ "stealth": {
+ "name": "دۆخی شاردراوە (Stealth)"
+ },
+ "auto_save": {
+ "name": "سەیڤکردنی ئۆتۆماتیکی"
+ },
+ "message_logger": {
+ "name": "تۆمارکەری نامەکان"
+ },
+ "unsaveable_messages": {
+ "name": "نامە سەیڤ نەکراوەکان"
+ }
+ }
+ },
+ "camera": {
+ "name": "کامێرا",
+ "description": "ڕێکخستنی گونجاو بۆ سناپێکی بێخەوش",
+ "properties": {
+ "disable_cameras": {
+ "name": "ناچالاککردنی کامێراکان",
+ "description": "ڕێگری لە سناپچات دەکات کامێرا دیاریکراوەکان بەکاربهێنێت"
+ },
+ "black_photos": {
+ "name": "وێنەی ڕەش",
+ "description": "وێنە گیراوەکان بە پاشبنەمایەکی ڕەش دەگۆڕێت\nڤیدیۆکان کاریگەر نابن"
+ },
+ "immersive_camera_preview": {
+ "name": "پێشاندانی گشتگیر (Immersive)",
+ "description": "ڕێگری لە سناپچات دەکات لە بڕینی (Crop) پێشاندانی کامێرا\nئەمە ڕەنگە ببێتە هۆی لرزینی کامێرا لە هەندێک ئامێردا"
+ },
+ "override_front_resolution": {
+ "name": "گۆڕینی ڕەزۆلوشنی پێشەوە",
+ "description": "ڕەزۆلوشنی کامێرای پێشەوە دەگۆڕێت"
+ },
+ "override_back_resolution": {
+ "name": "گۆڕینی ڕەزۆلوشنی دواوە",
+ "description": "ڕەزۆلوشنی کامێرای دواوە دەگۆڕێت"
+ },
+ "custom_resolution": {
+ "name": "ڕەزۆلوشنی تایبەت",
+ "description": "دانانی ڕەزۆلوشنی تایبەتی کامێرا، پانی x بەرزی (بۆ نموونە 1920x1080).\nپێویستە ڕەزۆلوشنە تایبەتەکە لەلایەن ئامێرەکەتەوە پشتگیری بکرێت"
+ },
+ "front_custom_frame_rate": {
+ "name": "فریم ڕەیتی تایبەتی پێشەوە",
+ "description": "فریم ڕەیتی کامێرای پێشەوە دەگۆڕێت"
+ },
+ "back_custom_frame_rate": {
+ "name": "فریم ڕەیتی تایبەتی دواوە",
+ "description": "فریم ڕەیتی کامێرای دواوە دەگۆڕێت"
+ },
+ "force_camera_source_encoding": {
+ "name": "ناچارکردنی ئینکۆدینگی سەرچاوەی کامێرا",
+ "description": "ئینکۆدینگی سەرچاوەی کامێرا ناچار دەکات"
+ },
+ "startup_default_camera": {
+ "name": "کامێرای بنەڕەتی کاتی کردنەوە",
+ "description": "کامێرای بنەڕەتی دیاری دەکات کاتێک سناپچات دەکرێتەوە"
+ },
+ "hevc_recording": {
+ "name": "تۆمارکردنی HEVC",
+ "description": "کۆدێکی HEVC (H.265) بەکاردەهێنێت بۆ تۆمارکردنی ڤیدیۆ"
+ }
+ }
+ },
+ "streaks_reminder": {
+ "name": "بیرهێنەرەوەی ستریتس (Streaks)",
+ "description": "ماوە ماوە ئاگادارت دەکاتەوە دەربارەی ستریتسەکانت",
+ "properties": {
+ "interval": {
+ "name": "ماوە (Interval)",
+ "description": "ماوەی نێوان هەر بیرهێنانەوەیەک (بە کاتژمێر)"
+ },
+ "remaining_hours": {
+ "name": "کاتی ماوە",
+ "description": "بڕی کاتی ماوە پێش ئەوەی ئاگادارکردنەوەکە پیشان بدرێت (بە کاتژمێر)"
+ },
+ "group_notifications": {
+ "name": "کۆکردنەوەی ئاگادارکردنەوەکان",
+ "description": "ئاگادارکردنەوەکان لە یەک دانەدا کۆدەکاتەوە"
+ }
+ }
+ },
+ "experimental": {
+ "name": "تاقیکاری",
+ "description": "تایبەتمەندییە تاقیکارییەکان",
+ "properties": {
+ "native_hooks": {
+ "name": "هوکە نەیتیڤەکان (Native Hooks)",
+ "description": "تایبەتمەندییە نادڵنیایەکان کە دەچنە ناو کۆدی نەیتیڤی سناپچاتەوە",
+ "properties": {
+ "composer_hooks": {
+ "name": "هوکەکانی کۆمپۆزەر",
+ "description": "کۆد دەخاتە ناو چوارچێوەی ڕووکاری Composer",
+ "properties": {
+ "show_first_created_username": {
+ "name": "پیشاندانی یەکەم ناوی دروستکراو",
+ "description": "یەکەم ناوی بەکارهێنەری دروستکراو لە تەنیشت ناوی ئێستا لە لاپەڕەی پرۆفایل پیشان دەدات"
+ },
+ "bypass_camera_roll_limit": {
+ "name": "لادانی سنووری گەلەری",
+ "description": "زۆرترین بڕی میدیا کە دەتوانیت لە گەلەرییەوە بینێریت زیاد دەکات"
+ },
+ "custom_self_destruct_snap_delay": {
+ "name": "دواکەوتنی تایبەتی لەناوچوونی سناپ",
+ "description": "هەڵبژاردنی زیاتر دەدات بۆ تایمەری خۆ-لەناوچوون لە کاتی ناردنی سناپدا"
+ },
+ "composer_console": {
+ "name": "کۆنسۆڵی کۆمپۆزەر",
+ "description": "ڕێگەت پێ دەدات کۆدی JavaScript لە Composer جێبەجێ بکەیت (تەنها arm64)"
+ },
+ "composer_logs": {
+ "name": "لۆگەکانی کۆمپۆزەر",
+ "description": "لۆگەکانی کۆنسۆڵی Composer ئاڕاستە دەکاتەوە بۆ PurrfectSnap"
+ }
+ }
+ },
+ "disable_bitmoji": {
+ "name": "ناچالاککردنی بیتمۆجی",
+ "description": "بیتمۆجی پرۆفایلی هاوڕێکان ناچالاک دەکات"
+ },
+ "custom_emoji_font": {
+ "name": "فۆنتی ئیمۆجی تایبەت",
+ "description": "ڕێگەت پێ دەدات فۆنتێکی ئیمۆجی تایبەت بەکاربهێنیت. تەنها لەگەڵ فۆنتی .ttf کار دەکات"
+ },
+ "custom_shared_library": {
+ "name": "کتێبخانەی هاوبەشی تایبەت",
+ "description": "کتێبخانەیەکی هاوبەشی تایبەت دەخاتە ناو سناپچات. ئەم تایبەتمەندییە تەنها بۆ مەبەستی تاقیکردنەوەیە"
+ }
+ }
+ },
+"spoof": {
+ "name": "چەواشەکاری (Spoof)",
+ "description": "چەواشەکردنی زانیارییە جیاوازەکان دەربارەی تۆ",
+ "properties": {
+ "play_store_installer_package_name": {
+ "name": "ناوی پاکێجی دامەزرێنەری Play Store",
+ "description": "ناوی پاکێجی دامەزرێنەر دەگۆڕێت بۆ com.android.vending"
+ },
+ "remove_vpn_transport_flag": {
+ "name": "لابردنی نیشانەی گواستنەوەی VPN",
+ "description": "ڕێگری لە سناپچات دەکات لە دۆزینەوەی VPN"
+ },
+ "remove_mock_location_flag": {
+ "name": "لابردنی نیشانەی شوێنی دەستکرد",
+ "description": "ڕێگری لە سناپچات دەکات لە دۆزینەوەی شوێنی دەستکرد (Mock location)"
+ },
+ "force_wifi_transport_flag": {
+ "name": "ناچارکردنی نیشانەی گواستنەوەی Wi-Fi",
+ "description": "ناچارکردنی تۆڕەکە بۆ ئەوەی وەک Wi-Fi دەربکەوێت لەبری داتای مۆبایل"
+ },
+ "spoof_device_id": {
+ "name": "چەواشەکردنی ناسنامەی ئامێر",
+ "description": "گۆڕینی ئەو Android ID-یەی کە بۆ سناپچات دەنێردرێت",
+ "properties": {
+ "spoof_android_id": {
+ "name": "چەواشەکردنی Android ID",
+ "description": "گۆڕینی Android ID کە بۆ سناپچات دەنێردرێت بە نرخێکی دەستکرد"
+ },
+ "custom_android_id": {
+ "name": "Android ID-ی دڵخواز",
+ "description": "ئەو نرخەی بەکاردێت کاتێک Android ID چەواشە دەکرێت"
+ }
+ }
+ },
+ "spoof_device": {
+ "name": "چەواشەکردنی ئامێر",
+ "description": "پیشاندانی سناپچات وەک ئەوەی لەسەر مۆدێلێکی تری ئامێر کار بکات"
+ },
+ "device_model": {
+ "name": "مۆدێلی ئامێر",
+ "description": "هەڵبژاردنی کام مۆدێلی ئامێر چەواشە بکرێت"
+ }
+ }
+ },
+ "convert_message_locally": {
+ "name": "گۆڕینی نامە لە ناوخۆدا",
+ "description": "سناپەکان دەگۆڕێت بۆ میدیای دەرەکی چات لە ناوخۆدا. ئەمە لە مێنیوی داگرتنی چاتدا دەردەکەوێت"
+ },
+ "media_file_picker": {
+ "name": "هەڵبژێرەری پەڕگەی میدیا",
+ "description": "ڕێگەت پێدەدات هەر پەڕگەیەکی ڤیدیۆ یان دەنگ لە گەلەرییەوە هەڵبژێریت"
+ },
+ "story_logger": {
+ "name": "تۆمارکەری ستۆری",
+ "description": "مێژووی ستۆرییەکانی هاوڕێکان دابین دەکات"
+ },
+ "call_recorder": {
+ "name": "تۆمارکەری پەیوەندی",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی پەیوەندییە دەنگییەکان تۆمار دەکات"
+ },
+ "account_switcher": {
+ "name": "گۆڕەری هەژمارەکان",
+ "description": "ڕێگەت پێدەدات لە نێوان هەژمارەکاندا هاتوچۆ بکەیت بەبێ چوونە دەرەوە\nپەنجە دابگرە لەسەر ئایکۆنی گەڕان لە تەنیشت پڕۆفایلی Bitmoji بۆ کردنەوەی مێنووەکە\nتێبینی: ئەم تایبەتمەندییە تاقیکارییە و لەوانەیە لە داهاتوودا بگۆڕێت",
+ "properties": {
+ "auto_backup_current_account": {
+ "name": "پاشەکەوتی ئۆتۆماتیکی هەژماری ئێستا",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی پاشەکەوتی هەژماری ئێستا دەکات کاتێک دەچیتە دەرەوە یان هەژمارەکە دەگۆڕیت"
+ }
+ }
+ },
+ "better_transcript": {
+ "name": "نووسینەوەی دەنگی باشتر",
+ "description": "نووسینەوەی نامە دەنگییەکان باشتر دەکات",
+ "properties": {
+ "force_transcription": {
+ "name": "ناچارکردنی نووسینەوەی دەنگی",
+ "description": "ڕێگە دەدات هەموو نامە دەنگییەکان بنووسرێنەوە"
+ },
+ "preferred_transcription_lang": {
+ "name": "زمانی پەسەندکراو بۆ نووسینەوە",
+ "description": "زمانی پەسەندکراو بۆ نووسینەوەی نامە دەنگییەکان (بۆ نموونە EN, ES, FR)"
+ },
+ "notification_transcript": {
+ "name": "نووسینەوە لە ئاگادارکەرەوەکاندا",
+ "description": "نامە دەنگییەکان لە ناو ئاگادارکەرەوەکاندا دەنووسێتەوە\nئەم تایبەتمەندییە پێویستی بە چالاککردنی Chat Preview هەیە لە Better Notifications"
+ }
+ }
+ },
+ "voice_note_auto_play": {
+ "name": "لێدانی ئۆتۆماتیکی نامەی دەنگی",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی نامەی دەنگی دواتر لێدەدات کاتێک نامەی ئێستا تەواو دەبێت"
+ },
+ "friend_notes": {
+ "name": "تێبینی هاوڕێکان",
+ "description": "ڕێگەت پێدەدات تێبینی بۆ پڕۆفایلی هاوڕێکانت زیاد بکەیت"
+ },
+ "cof_experiments": {
+ "name": "تاقیکردنەوەکانی COF",
+ "description": "تایبەتمەندییە بڵاونەکراوەکان یان بێتای سناپچات چالاک دەکات"
+ },
+ "context_menu_fix": {
+ "name": "چاککردنی مێنیوی هاوڕێکان",
+ "description": "هەوڵدەدات مێنیوی هاوڕێکان چاک بکاتەوە کاتێک ئامێرەکە ئۆفلاینە و بە دروستی دەرناکەوێت"
+ },
+ "app_lock": {
+ "name": "قفڵی ئەپ",
+ "description": "ڕێگری لە چوونە ناو سناپچات دەکات بەبێ کۆدی نهێنی",
+ "properties": {
+ "lock_on_resume": {
+ "name": "قفڵکردن لە کاتی گەڕانەوە",
+ "description": "ئەپەکە قفڵ دەکات کاتێک دووبارە دەکرێتەوە"
+ }
+ }
+ },
+ "infinite_story_boost": {
+ "name": "بەرزکردنەوەی بێسنووری ستۆری",
+ "description": "تێپەڕاندنی دواکەوتنی سنووری Story Boost"
+ },
+ "meo_passcode_bypass": {
+ "name": "تێپەڕاندنی کۆدی نهێنی My Eyes Only",
+ "description": "تێپەڕاندنی کۆدی نهێنی My Eyes Only\nئەمە تەنها کاتێک کار دەکات کە پێشتر کۆدەکە بە دروستی داغڵ کرابێت"
+ },
+ "no_friend_score_delay": {
+ "name": "نەهێشتنی دواکەوتنی نمرەی هاوڕێ",
+ "description": "دواکەوتن لادەبات لە کاتی بینینی نمرەی هاوڕێیان (Friend Score)"
+ },
+ "best_friend_pinning": {
+ "name": "جێگیرکردنی باشترین هاوڕێ",
+ "description": "ڕێگەت پێدەدات هاوڕێیەک وەک باشترین هاوڕێی ژمارە یەک جێگیر بکەیت. تێبینی: تەنها خۆت دەتوانیت هاوڕێ جێگیرکراوەکەت ببینی"
+ },
+ "e2ee": {
+ "name": "کۆدکردنی سەرتاپایی (E2EE)",
+ "description": "نامەکانت بە AES کۆد دەکات بە بەکارهێنانی کلیلی نهێنی هاوبەش\nدڵنیابە لەوەی کلیلەکەت لە شوێنێکی پارێزراو هەڵدەگریت!",
+ "properties": {
+ "encrypted_message_indicator": {
+ "name": "نیشاندەری نامەی کۆدکراو",
+ "description": "ئیمۆجی 🔒 زیاد دەکات بۆ تەنیشت نامە کۆدکراوەکان"
+ },
+ "force_message_encryption": {
+ "name": "ناچارکردنی کۆدکردنی نامە",
+ "description": "ڕێگری دەکات لە ناردنی نامەی کۆدکراو بۆ ئەو کەسانەی E2E-یان چالاک نەکردووە، تەنها کاتێک کە چەند گفتوگۆیەک هەڵبژێردرابن"
+ }
+ }
+ },
+ "add_friend_source_spoof": {
+ "name": "چەواشەکردنی سەرچاوەی زیادکردنی هاوڕێ",
+ "description": "سەرچاوەی داواکاری هاوڕێیەتی چەواشە دەکات"
+ },
+ "hidden_snapchat_plus_features": {
+ "name": "تایبەتمەندییە شاراوەکانی Snapchat Plus",
+ "description": "تایبەتمەندییە بڵاونەکراوەکان یان بێتای Snapchat Plus چالاک دەکات\nلەوانەیە لە وەشانە کۆنەکانی سناپچات کار نەکات"
+ },
+ "custom_streaks_expiration_format": {
+ "name": "شێوازی دڵخوازی بەسەرچوونی Streak",
+ "description": "شێوازی نیشاندانی کاتی بەسەرچوونی Streak دەگۆڕێت\n\nگۆڕاوە بەردەستەکان:\n - %c: ژمارەی Streak\n - %e: ئیمۆجی کاتژمێری لمی\n - %d: ڕۆژەکان\n - %h: کاتژمێرەکان\n - %m: خولەکەکان\n - %s: چرکەکان\n - %w: کاتی ماوە"
+ },
+ "prevent_forced_logout": {
+ "name": "ڕێگری لە دەرچوونی زۆرەملێ",
+ "description": "ڕێگری لە سناپچات دەکات لەوەی بتکاتە دەرەوە کاتێک لە ئامێرێکی ترەوە دەچیتە ناوەوە"
+ },
+ "snapscore_changes": {
+ "name": "گۆڕانکارییەکانی Snapscore",
+ "description": "چاودێری گۆڕانکارییەکانی نمرەی سناپی هاوڕێیان دەکات\nئەم تایبەتمەندییە تەنها لە وەشانە نوێیەکانی سناپچات بەکاربهێنە"
+ }
+ }
+ },
+ "scripting": {
+ "name": "سکریپتینگ (Scripting)",
+ "description": "کارپێکردنی سکریپتی دڵخواز بۆ فراوانکردنی PurrfectSnap",
+ "properties": {
+ "developer_mode": {
+ "name": "دۆخی گەشەپێدەر",
+ "description": "زانیاری هەڵەدۆزینەوە (Debug) لەسەر ڕووکاری سناپچات پیشان دەدات"
+ },
+ "module_folder": {
+ "name": "بوخچەی مۆدیوڵ",
+ "description": "ئەو بوخچەیەی کە سکریپتەکانی تێدایە"
+ },
+ "auto_reload": {
+ "name": "بارکردنەوەی ئۆتۆماتیکی",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی سکریپتەکان بار دەکاتەوە کاتێک دەگۆڕدرێن"
+ },
+ "integrated_ui": {
+ "name": "ڕووکاری یەکخراو",
+ "description": "ڕێگە بە سکریپتەکان دەدات پارچەی ڕووکاری دڵخواز بۆ سناپچات زیاد بکەن"
+ },
+ "disable_log_anonymization": {
+ "name": "ناچالاککردنی بێناوکردنی لۆگ",
+ "description": "بێناوکردنی لۆگەکان ناچالاک دەکات"
+ },
+ "disable_optimization": {
+ "name": "ناچالاککردنی باشترسازی",
+ "description": "باشترسازی (Optimization) سکریپتەکان ناچالاک دەکات. ئەمە لەوانەیە ببێتە هۆی کێشەی خێرایی."
+ }
+ }
+ },
+ "friend_tracker": {
+ "name": "چاودێری هاوڕێ",
+ "description": "چالاکییەکانی هاوڕێ لەسەر سناپچات تۆمار دەکات",
+ "properties": {
+ "record_messaging_events": {
+ "name": "تۆمارکردنی ڕووداوەکانی نامە",
+ "description": "ڕووداوەکانی نامە تۆمار دەکات وەک کردنەوەی سناپ، خوێندنەوەی نامە و هتد."
+ },
+ "allow_running_in_background": {
+ "name": "ڕێگەدان بە کارکردن لە پاشبنەما",
+ "description": "ڕێگە بە چاودێرەکە دەدات لە پاشبنەمادا کار بکات. تێبینی: ئەمە بە ڕێژەیەکی زۆر پاتری سەرف دەکات"
+ },
+ "auto_purge": {
+ "name": "سڕینەوەی ئۆتۆماتیکی",
+ "description": "بە شێوەیەکی ئۆتۆماتیکی ئەو ڕووداوانەی پاشەکەوت کراون و کۆنترن لە کاتی دیاریکراو دەسڕێتەوە"
+ }
+ }
+ }
+ },
+ "options": {
+ "app_appearance": {
+ "always_light": "هەمیشە ڕووناک",
+ "always_dark": "هەمیشە تاریک",
+ "null": "وەک سیستەم"
+ },
+ "auto_reload": {
+ "snapchat_only": "تەنها سناپچات بار بکەرەوە",
+ "all": "بارکردنەوەی سناپچات + PurrfectSnap",
+ "null": "بنەڕەتی"
+ },
+ "walk_radius": {
+ "null": "بەکارهێنانی مەودای بنەڕەتی"
+ },
+ "spoof_battery_level": {
+ "null": "بەکارهێنانی ئاستی ڕاستەقینەی پاتری"
+ },
+ "friend_feed_menu_buttons": {
+ "auto_download": "⬇️ داگرتنی ئۆتۆماتیکی",
+ "auto_save": "💬 پاشەکەوتی ئۆتۆماتیکی نامەکان",
+ "unsaveable_messages": "⬇️ نامە پاشەکەوت نەکراوەکان",
+ "auto_open_snaps": "📷 کردنەوەی ئۆتۆماتیکی سناپەکان",
+ "stealth": "👻 دۆخی نادیار (Stealth)",
+ "auto_reply": "📧 وەڵامدانەوەی ئۆتۆmاتیکی",
+ "auto_delete_sent_messages": "🗑️ سڕینەوەی ئۆتۆماتیکی نامە نێردراوەکان",
+ "mark_snaps_as_seen": "👁️ دیاریکردنی سناپەکان وەک بینراو",
+ "mark_stories_as_seen_locally": "👁️ دیاریکردنی ستۆرییەکان وەک بینراو لە ناوخۆدا",
+ "conversation_info": "👤 زانیاری گفتوگۆ",
+ "e2e_encryption": "🔒 بەکارهێنانی کۆدکردنی E2E",
+ "message_logger": "📝 تۆمارکەری نامە",
+ "auto_read": "✅ خوێندنەوەی ئۆتۆماتیکی",
+ "hide_typing_indicator": "🙈 شاردنەوەی نیشاندەری نووسین"
+ },
+ "schedule_scheduled_for": "بۆردومان کرا بۆ {name} لە {time}",
+ "schedule_sending_in": "دەنێردرێت لە {time}",
+ "schedule_sent_to": "نێردرا بۆ {name}",
+ "schedule_sent": "سناپە کات بۆ دیاریکراوەکە نێردرا",
+ "schedule_failed_to": "نەنێردرا بۆ {name}",
+ "schedule_failed": "سناپە کات بۆ دیاریکراوەکە سەرکەوتوو نەبوو",
+ "schedule_cancelled_for": "هەڵوەشایەوە بۆ {name}",
+ "device_model": {
+ "samsung_s25_ultra": "Samsung Galaxy S25 Ultra",
+ "google_pixel_10_pro": "Google Pixel 10 Pro",
+ "oneplus_13": "OnePlus 13",
+ "xiaomi_15_ultra": "Xiaomi 15 Ultra",
+ "null": "ئامێری بنەڕەتی"
+ },
+ "settings_menu": {
+ "default": "بنەڕەتی",
+ "legacy": "کۆن (Legacy)"
+ },
+ "path_format": {
+ "create_author_folder": "دروستکردنی بوخچە بۆ هەر نووسەرێک",
+ "create_source_folder": "دروستکردنی بوخچە بۆ هەر جۆرە سەرچاوەیەکی میدیا",
+ "append_hash": "زیادکردنی هاشێکی بێهاوتا بۆ ناوی پەڕگەکە",
+ "append_source": "زیادکردنی سەرچاوەی میدیا بۆ ناوی پەڕگەکە",
+ "append_username": "زیادکردنی ناوی بەکارهێنەر بۆ ناوی پەڕگەکە",
+ "append_date_time": "زیادکردنی ڕێکەوت و کات بۆ ناوی پەڕگەکە",
+ "append_type": "زیادکردنی جۆری میدیا بۆ ناوی پەڕگەکە"
+ },
+ "auto_download_sources": {
+ "friend_snaps": "سناپی هاوڕێکان",
+ "friend_stories": "ستۆری هاوڕێکان",
+ "public_stories": "ستۆری گشتی",
+ "spotlight": "سپۆتلایت"
+ },
+ "logging": {
+ "started": "دەستی پێکرد",
+ "success": "سەرکەوتوو بوو",
+ "progress": "لە کاردایە",
+ "failure": "سەرکەوتوو نەبوو"
+ },
+ "notifications": {
+ "chat_screenshot": "وێنەگرتنی شاشە",
+ "chat_screen_record": "تۆمارکردنی ڤیدیۆیی شاشە",
+ "snap_replay": "دووبارە لێدانەوەی سناپ",
+ "camera_roll_save": "پاشەکەوتکردن لە گەلەری",
+ "chat": "چات",
+ "chat_reply": "وەڵامی چات",
+ "snap": "سناپ",
+ "typing": "خەریکی نووسینە",
+ "stories": "ستۆرییەکان",
+ "speaking": "قسە دەکات",
+ "chat_reaction": "پەرچەکرداری DM",
+ "group_chat_reaction": "پەرچەکرداری گرووپ",
+ "initiate_audio": "پەیوەندی دەنگی هاتوو",
+ "abandon_audio": "پەیوەندی دەنگی وەڵام نەدراوە",
+ "initiate_video": "پەیوەندی ڤیدیۆیی هاتوو",
+ "abandon_video": "پەیوەندی ڤیدیۆیی وەڵام نەدراوە",
+ "map_live_location": "شوێنی ڕاستەوخۆی نەخشە"
+ },
+ "auto_read": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "hide_typing_indicator": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "auto_delete_sent_messages": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "auto_download": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "stealth": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "auto_save": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "message_logger": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "auto_reply": {
+ "blacklist": "لیستی ڕەش",
+ "whitelist": "لیستی سپی",
+ "disabled": "ناچالاککراو"
+ },
+ "custom_android_id": {
+ "null": "بەکارهێنانی Android ID ڕاستەقینە"
+ },
+ "add_friend_source_spoof": {
+ "added_by_username": "بەهۆی ناوی بەکارهێنەر",
+ "added_by_mention": "بەهۆی ئاماژەدان (Mention)",
+ "added_by_group_chat": "بەهۆی چاتی گرووپ",
+ "added_by_qr_code": "بەهۆی QR Code",
+ "added_by_community": "بەهۆی کۆمەڵگە",
+ "added_by_quick_add": "بەهۆی Quick Add (مەترسی زۆری باند بوون)",
+ "added_by_spotlight": "بەهۆی سپۆتلایت",
+ "null": "سەرچاوە چەواشە مەکە"
+ },
+ "custom_streaks_expiration_format": {
+ "null": "بنەڕەتی سیستەم"
+ },
+ "preferred_transcription_lang": {
+ "null": "بەکارهێنانی زمانی بنەڕەتی سناپچات"
+ },
+ "custom_emoji_font": {
+ "null": "فۆنتی ئیمۆجی بنەڕەتی"
+ },
+ "custom_shared_library": {
+ "null": "بەکارهێنانی کتێبخانەی بنەڕەتی"
+ },
+ "override_front_resolution": {
+ "null": "بەکارهێنانی کوالێتی بنەڕەتی ئامێر"
+ },
+ "override_back_resolution": {
+ "null": "بەکارهێنانی کوالێتی بنەڕەتی ئامێر"
+ },
+ "custom_resolution": {
+ "null": "بەکارهێنانی کوالێتی ئۆتۆماتیکی"
+ },
+ "startup_default_camera": {
+ "front": "کامێرای پێشەوە",
+ "back": "کامێرای دواوە",
+ "null": "دواهەمین بەکارهێنراو بیربکەرەوە"
+ },
+ "front_custom_frame_rate": {
+ "null": "FPS-ی بنەڕەتی ئامێر"
+ },
+ "back_custom_frame_rate": {
+ "null": "FPS-ی بنەڕەتی ئامێر"
+ },
+ "force_voice_note_format": {
+ "null": "بەکارهێنانی فۆرماتی بنەڕەتی سناپچات"
+ },
+ "custom_path_format": {
+ "null": "بەکارهێنانی شێوازی بنەڕەتی"
+ },
+ "force_image_format": {
+ "null": "بەکارهێنانی فۆرماتی بنەڕەتی سناپچات"
+ },
+ "custom_video_codec": {
+ "null": "کۆدێکی بنەڕەتی (Codec)"
+ },
+ "custom_audio_codec": {
+ "null": "کۆدێکی بنەڕەتی (Codec)"
+ },
+ "preset": {
+ "null": "پێشوەختەی بنەڕەتی"
+ },
+ "app_appearance_override": {
+ "title": "ڕووکار (Appearance)"
+ },
+ "gallery_media_send_override": {
+ "always_ask": "هەمیشە بپرسە",
+ "ORIGINAL": "میدیای ڕەسەن",
+ "NOTE": "نامەی دەنگی",
+ "SNAP": "سناپ",
+ "SAVEABLE_SNAP": "سناپی پاشەکەوتکراو",
+ "null": "بنەڕەتی سناپچات"
+ },
+ "strip_media_metadata": {
+ "hide_caption_text": "شاردنەوەی دەقی نووسراو",
+ "hide_snap_filters": "شاردنەوەی فلتەرەکانی سناپ",
+ "hide_extras": "شاردنەوەی زیادکراوەکان (وەک ئاماژەدانەکان)",
+ "remove_audio_note_duration": "لابردنی ماوەی نامەی دەنگی",
+ "remove_audio_note_transcript_capability": "لابردنی توانای نووسینەوەی نامەی دەنگی"
+ },
+ "hide_ui_components": {
+ "hide_profile_call_buttons": "لابردنی دوگمەکانی پەیوەندی پڕۆفایل",
+ "hide_chat_call_buttons": "لابردنی دوگمەکانی پەیوەندی چات",
+ "hide_live_location_share_button": "لابردنی دوگمەی هاوبەشکردنی شوێنی ڕاستەوخۆ",
+ "hide_stickers_button": "لابردنی دوگمەی ستیکەرەکان",
+ "hide_voice_record_button": "لابردنی دوگمەی تۆمارکردنی دەنگ",
+ "hide_unread_chat_hint": "لابردنی نیشانەی چاتی نەخوێندراوە",
+ "hide_post_to_story_buttons": "لابردنی دوگمەکانی پۆستکردن لە ستۆری پێش ناردنی سناپ",
+ "hide_billboard_prompt": "لابردنی پەیامی Billboard لە فیدی هاوڕێیان",
+ "hide_snapchat_plus_gift_reminders": "لابردنی بیورهێنەرەوەکانی دیاری Snapchat Plus لە گفتوگۆکاندا",
+ "hide_map_reactions": "لابردنی پەرچەکردارەکانی نەخشە"
+ },
+ "hide_story_suggestions": {
+ "hide_suggested_friend_stories": "شاردنەوەی ستۆری پێشنیارکراوی هاوڕێیان",
+ "hide_my_stories": "شاردنەوەی ستۆرییەکانی من"
+ },
+ "home_tab": {
+ "map": "نەخشە",
+ "chat": "چات",
+ "camera": "کامێرا",
+ "discover": "دۆزینەوە",
+ "spotlight": "سپۆتلایت",
+ "null": "بنەڕەتی سناپچات"
+ },
+ "spotlight_comments_username_icon": {
+ "user": "ئایکۆنی ناوی بەکارهێنەر",
+ "👤": "ئایکۆنی ناوی بەکارهێنەر",
+ "[👤]": "ئایکۆنی ناوی بەکارهێنەر",
+ "default": "ئایکۆنی ناوی بەکارهێنەر",
+ "no_icon": "بێ ئایکۆن"
+ },
+ "custom_image_upload_format": {
+ "null": "ئۆتۆماتیکی"
+ },
+ "update_check_frequency": {
+ "null": "ئۆتۆ"
+ },
+ "snapchat_plus": {
+ "not_subscribed": "بەشداری نەکراوە",
+ "basic": "سەرەتایی",
+ "ad_free": "بێ ریکلام",
+ "null": "بنەڕەتی"
+ },
+ "bypass_video_length_restriction": {
+ "single": "تاکە میدیا",
+ "split": "میدیای دابەشکراو",
+ "null": "بنەڕەتی"
+ },
+ "old_bitmoji_selfie": {
+ "2d": "بیتمۆجی دوو ڕەهەندی (2D)",
+ "3d": "بیتمۆجی سێ ڕەهەندی (3D)",
+ "null": "بیتمۆجی بنەڕەتی"
+ },
+ "disable_confirmation_dialogs": {
+ "erase_message": "سڕینەوەی نامە",
+ "remove_friend": "لابردنی هاوڕێ",
+ "block_friend": "بلۆککردنی هاوڕێ",
+ "ignore_friend": "پ پشتگوێخستنی هاوڕێ",
+ "hide_friend": "شاردنەوەی هاوڕێ",
+ "hide_conversation": "شاردنەوەی گفتوگۆ",
+ "clear_conversation": "پاککردنەوەی گفتوگۆ لە فیدی هاوڕێیان"
+ },
+ "edit_text_override": {
+ "multi_line_chat_input": "داخلکردنی چاتی چەند دێڕی",
+ "bypass_text_input_limit": "تێپەڕاندنی سنووری داخڵکردنی دەق"
+ },
+ "auto_purge": {
+ "never": "هەرگیز",
+ "1_hour": "١ کاتژمێر",
+ "3_hours": "٣ کاتژمێر",
+ "6_hours": "٦ کاتژمێر",
+ "12_hours": "١٢ کاتژمێر",
+ "1_day": "١ ڕۆژ",
+ "3_days": "٣ ڕۆژ",
+ "1_week": "١ هەفتە",
+ "2_weeks": "٢ هەفتە",
+ "1_month": "١ مانگ",
+ "3_months": "٣ مانگ",
+ "6_months": "٦ مانگ"
+ },
+ "delete_after_unit": {
+ "seconds": "چرکە",
+ "minutes": "خولەک",
+ "hours": "کاتژمێر"
+ },
+ "disable_story_sections": {
+ "friends": "هاوڕێیان",
+ "suggested_stories": "ستۆرییە پێشنیارکراوەکان",
+ "following": "فۆڵۆوەکان",
+ "discover": "دۆزینەوە"
+ },
+ "disable_cameras": {
+ "front": "کامێرای پێشەوە",
+ "back": "کامێرای دواوە"
+ },
+ "disable_permission_requests": {
+ "notifications": "ئاگادارکەرەوەکان",
+ "read_media_images": "خوێندنەوەی وێنەکان",
+ "read_media_video": "خوێندنەوەی ڤیدیۆکان",
+ "camera": "کامێرا",
+ "microphone": "مایکرۆفۆن",
+ "location": "شوێن (Location)",
+ "read_contacts": "خوێندنەوەی ناوەکان",
+ "nearby_devices": "ئامێرە نزیکەکان",
+ "phone_calls": "پەیوەندی تەلەفۆنی"
+ },
+ "message_indicators": {
+ "encryption_indicator": "ئایکۆنی 🔒 زیاد دەکات بۆ ئەو نامانەی تەنها بۆ تۆ نێردراون",
+ "platform_indicator": "ئایکۆنی ئەو پلاتفۆرمە زیاد دەکات کە میدیاکەی لێوە نێردراوە (وەک Android, iOS, Web)",
+ "location_indicator": "ئایکۆنی 📍 زیاد دەکات بۆ سناپەکان کاتێک بە شوێنی چالاکەوە نێردراون",
+ "ovf_editor_indicator": "پیشانی دەدات ئەگەر سناپێک بە OVF Editor نێردرابێت",
+ "director_mode_indicator": "ئایکۆنی 🖋️ زیاد دەکات کاتێک سناپەکان بە Director Mode نێردرابن، کە دەتوانرێت بۆ ناردنی وێنەی گەلەری وەک سناپ بەکاربێت"
+ },
+ "auto_mark_as_read": {
+ "conversation_read": "دیاریکردنی گفتوگۆ وەک خوێندراوە لە کاتی ناردنی نامەدا",
+ "snap_reply": "دیاریکردنی سناپەکان وەک خوێندراوە لە کاتی وەڵامدانەوەیاندا",
+ "save_snap_in_chat": "دیاریکردنی سناپەکان وەک خوێندراوە کاتێک لە چاتدا پاشەکەوت دەکرێن لە کاتی دۆزی نادیاردا"
+ },
+ "friend_mutation_notifier": {
+ "remove_friend": "ئاگادارکردنەوە کاتێک کەسێک لە هاوڕێیەتی لات دەبات",
+ "birthday_changes": "ئاگادارکردنەوە کاتێک کەسێک ڕۆژی لەدایکبوونی دەگۆڕێت",
+ "bitmoji_selfie_changes": "ئاگادارکردنەوە کاتێک کەسێک وێنەی سێڵفی بیتمۆجییەکەی دەگۆڕێت",
+ "bitmoji_avatar_changes": "ئاگادارکردنەوە کاتێک کەسێک ئاڤاتاری بیتمۆجییەکەی دەگۆڕێت",
+ "bitmoji_background_changes": "ئاگادارکردنەوە کاتێک کەسێک باکگراوندی بیتمۆجییەکەی دەگۆڕێت",
+ "bitmoji_scene_changes": "ئاگادارکردنەوە کاتێک کەسێک دیمەنی بیتمۆجییەکەی دەگۆڕێت"
+ },
+ "double_tap_chat_action": {
+ "like_message": "لایککردنی نامە",
+ "copy_text": "کۆپیکردنی دەق",
+ "delete_message": "سڕینەوەی نامە",
+ "mark_as_read": "دیاریکردن وەک خوێندراوە",
+ "custom_emoji_reaction": "پەرچەکرداری ئیمۆجی دڵخواز",
+ "null": "بنەڕەتی"
+ },
+ "message_types": {
+ "CHAT": "چات",
+ "SNAP": "سناپ",
+ "NOTE": "تێبینی",
+ "EXTERNAL_MEDIA": "میدیای دەرەکی",
+ "STICKER": "ستیکەر"
+ },
+ "double_tap_chat_action_custom_emoji": {
+ "Custom emoji reaction": "پەرچەکرداری ئیمۆجی دڵخواز"
+ },
+ "ai_model": {
+ "gemini-2.5-flash": "Gemini 2.5 Flash"
+ },
+ "ai_api_key": {
+ "": "دیاری نەکراوە"
+ },
+ "ai_system_prompt": {
+ "You are a helpful and friendly assistant responding to messages on Snapchat. Keep responses natural, casual, and conversational. Avoid being overly formal or robotic. Respond as if you're a real person having a normal conversation.": "تۆ یاریدەدەرێکی سوودبەخش و هاوڕێیانەیت کە وەڵامی نامەکان دەدەیتەوە لە سناپچات. وەڵامەکان بە سروشتی و ئاسایی بهێڵەرەوە. وەک کەسێکی ڕاستەقینە وەڵام بدەرەوە."
+ },
+ "ai_provider": {
+ "gemini": "Gemini",
+ "deepseek": "DeepSeek",
+ "openai": "OpenAI",
+ "openrouter": "OpenRouter"
+ },
+ "ai_personality_traits": {
+ "friendly, casual, helpful, empathetic": "هاوڕێیانە، ئاسایی، سوودبەخش، خەمخۆر"
+ },
+ "ai_response_style": {
+ "casual": "ئاسایی",
+ "formal": "فەرمی",
+ "friendly": "هاوڕێیانە",
+ "humorous": "بە پێکەنینەوە",
+ "empathetic": "خەمخۆرانە",
+ "toxic": "توند (Edgy)",
+ "busy": "سەرقاڵ"
+ },
+ "ai_temperature": {
+ "0.7": "هاوسەنگ (0.7)"
+ },
+ "ai_response_language": {
+ "auto": "ئۆتۆماتیکی",
+ "en": "ئینگلیزی",
+ "es": "ئیسپانی",
+ "fr": "فەڕەنسی",
+ "de": "ئەڵمانی",
+ "it": "ئیتاڵی",
+ "pt": "پورتوگالی",
+ "ru": "ڕووسی",
+ "ja": "ژاپۆنی",
+ "ko": "کۆری",
+ "zh": "چینی",
+ "ar": "عەرەبی",
+ "hi": "هیندی",
+ "tr": "تورکی",
+ "pl": "پۆڵەندی",
+ "nl": "هۆڵەندی",
+ "sv": "سویدی",
+ "da": "دانیمارکی",
+ "no": "نەرویجی",
+ "fi": "فینلەندی"
+ },
+ "friendGreeting": {
+ "Hey": "سڵاو"
+ },
+ "half_swipe_messages": {
+ "[\"I noticed you half-swiped! I'll respond soon.\"]": "تێبینیم کرد نیوە-سواپت کرد! بەم زووانە وەڵام دەدەمەوە."
+ },
+ "tiny_snap_messages": {
+ "Thanks for the tiny snap!": "سوپاس بۆ سناپە بچووکەکە!"
+ },
+ "voice_note_messages": {
+ "Thanks for the voice note!": "سوپاس بۆ نامە دەنگییەکە!"
+ },
+ "chat_messages": {
+ "Hello! How are you?": "سڵاو! چۆنیت؟"
+ },
+ "story_reply_messages": {
+ "Thanks for the story reply!": "سوپاس بۆ وەڵامدانەوەی ستۆرییەکە!"
+ },
+ "external_media_messages": {
+ "Nice media!": "میدیایەکی جوانە!"
+ },
+ "sticker_messages": {
+ "Cool sticker!": "ستیکەرێکی شازە!"
+ },
+ "snap_messages": {
+ "Thanks for the snap!": "سوپاس بۆ سناپەکە!"
+ },
+ "story_share_messages": {
+ "Thanks for sharing!": "سوپاس بۆ هاوبەشکردن!"
+ },
+ "map_reaction_messages": {
+ "Thanks for the map reaction!": "سوپاس بۆ پەرچەکردارەکەت لەسەر نەخشە!"
+ },
+"auto_reply_content_types": {
+ "chat_messages": "نامەکانی چات",
+ "snap_messages": "سناپەکان",
+ "story_share_messages": "ناردنی ستۆری",
+ "story_reply_messages": "وەڵامدانەوەی ستۆری",
+ "external_media_messages": "میدیای دەرەکی",
+ "voice_note_messages": "تۆمارە دەنگییەکان",
+ "sticker_messages": "ستیکەرەکان",
+ "tiny_snap_messages": "سناپە بچووکەکان",
+ "map_reaction_messages": "کاردانەوەکانی سەر نەخشە",
+ "half_swipes": "نیوە تێپەڕاندن (Half Swipes)"
+ },
+ "supported_languages": {
+ "en": "ئینگلیزی",
+ "es": "ئیسپانی",
+ "fr": "فەرەنسی",
+ "de": "ئەڵمانی",
+ "it": "ئیتاڵی",
+ "pt": "پورتوگالی",
+ "ru": "ڕووسی",
+ "ja": "ژاپۆنی",
+ "ko": "کۆری",
+ "zh": "چینی",
+ "ar": "عەرەبی",
+ "hi": "هیندی",
+ "tr": "تورکی"
+ },
+ "translation_position": {
+ "above": "سەرووی دەقەکە",
+ "below": "خوارووی دەقەکە",
+ "inline": "لەناو دێڕەکەدا"
+ },
+ "source_language": {
+ "auto": "دۆزینەوەی ئۆتۆماتیکی"
+ },
+ "target_language": {
+ "en": "ئینگلیزی"
+ }
+ },
+ "friend_notes": {
+ "placeholder": "تێبینییەک زیاد بکە..."
+ }
+ },
+ "friend_menu_option": {
+ "mark_snaps_as_seen": "نیشانەکردنی سناپەکان وەک بینراو",
+ "mark_stories_as_seen_locally": "نیشانەکردنی ستۆرییەکان وەک بینراو بە ناوخۆیی",
+ "preview": "پێشبینین",
+ "stealth_mode": "دۆخی نادیار",
+ "auto_download_blacklist": "لیستی ڕەشی داگرتنی ئۆتۆماتیکی",
+ "anti_auto_save": "دژە سەیڤکردنی ئۆتۆماتیکی"
+ },
+ "content_type": {
+ "CHAT": "چات",
+ "SNAP": "سناپ",
+ "EXTERNAL_MEDIA": "میدیای دەرەکی",
+ "NOTE": "تێبینی دەنگی",
+ "STICKER": "ستیکەر",
+ "SHARE": "بڵاوکردنەوە",
+ "STATUS": "بارودۆخ",
+ "LOCATION": "شوێن",
+ "STATUS_SAVE_TO_CAMERA_ROLL": "لە ناو گەلەری سەیڤ کرا",
+ "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "وێنەی شاشە (Screenshot)",
+ "STATUS_CONVERSATION_CAPTURE_RECORD": "تۆمارکردنی شاشە",
+ "STATUS_CALL_MISSED_VIDEO": "پەیوەندی ڤیدیۆیی وەڵامنەدراوە",
+ "STATUS_CALL_MISSED_AUDIO": "پەیوەندی دەنگی وەڵامنەدراوە",
+ "LIVE_LOCATION_SHARE": "بەشکردنی شوێنی ڕاستەوخۆ",
+ "CREATIVE_TOOL_ITEM": "بڕگەی ئامرازی داهێنەرانە",
+ "FAMILY_CENTER_INVITE": "بانگهێشتی سەنتەری خێزان",
+ "FAMILY_CENTER_ACCEPT": "قبوڵکردنی سەنتەری خێزان",
+ "FAMILY_CENTER_LEAVE": "جێهێشتنی سەنتەری خێزان",
+ "STATUS_PLUS_GIFT": "دیاری ستاتۆس پڵەس",
+ "TINY_SNAP": "سناپی بچووک",
+ "STATUS_COUNTDOWN": "ژماردنی پێچەوانە",
+ "MAP_REACTION": "کاردانەوەی نەخشە",
+ "chat_messages": "نامەکانی چات",
+ "snap_messages": "سناپەکان",
+ "story_share_messages": "بڵاوکردنەوەی ستۆری",
+ "story_reply_messages": "وەڵامدانەوەی ستۆری",
+ "external_media_messages": "میدیای دەرەکی",
+ "voice_note_messages": "تۆمارە دەنگییەکان",
+ "sticker_messages": "ستیکەر",
+ "tiny_snap_messages": "سناپی بچووک",
+ "map_reaction_messages": "کاردانەوەی نەخشە",
+ "half_swipes": "نیوە تێپەڕاندن"
+ },
+ "media_download_source": {
+ "none": "هیچ",
+ "pending": "لە چاوەڕوانیدایە",
+ "chat_media": "میدیای ناو چات",
+ "story": "ستۆری",
+ "public_story": "ستۆری گشتی",
+ "spotlight": "سپۆتلایت",
+ "profile_picture": "وێنەی پڕۆفایل",
+ "story_logger": "تۆمارکەری ستۆری",
+ "message_logger": "تۆمارکەری نامە",
+ "merged": "تێکەڵکراو",
+ "voice_call": "پەیوەندی دەنگی"
+ },
+ "chat_action_menu": {
+ "preview_button": "پێشبینین",
+ "download_button": "داگرتن",
+ "delete_logged_message_button": "سڕینەوەی نامە تۆمارکراوەکان",
+ "show_chat_edit_history": "پیشاندانی مێژووی دەستکاری چات",
+ "convert_message": "گۆڕینی نامە"
+ },
+ "opera_context_menu": {
+ "download": "داگرتنی میدیا",
+ "sent_at": "نێردراوە لە {date}",
+ "created_at": "دروستکراوە لە {date}",
+ "expires_at": "بەسەردەچێت لە {date}",
+ "media_size": "قەبارەی میدیا: {size}",
+ "media_duration": "ماوەی میدیا: {duration} ms",
+ "show_debug_info": "پیشاندانی زانیاری هەڵەدۆزین (Debug)"
+ },
+ "modal_option": {
+ "profile_info": "زانیاری پڕۆفایل",
+ "close": "داخستن"
+ },
+ "gallery_media_send_override": {
+ "always_ask": "هەمیشە بپرسە",
+ "ORIGINAL": "میدیای ڕەسەن",
+ "NOTE": "تێبینی دەنگی",
+ "SNAP": "سناپ",
+ "SAVEABLE_SNAP": "سناپی سەیڤکراو",
+ "null": "بنەڕەتی سناپچات",
+ "multiple_media_toast": "تەنها دەتوانی یەک میدیا لە یەک کاتدا بنێریت"
+ },
+ "mark_as_seen": {
+ "no_unseen_snaps_toast": "هیچ سناپێکی نەبینراو نەدۆزرایەوە!",
+ "seen_toast": "وەک بینراو نیشانە کرا!",
+ "unseen_toast": "وەک نەبینراو نیشانە کرا!",
+ "already_seen_toast": "پێشتر وەک بینراو نیشانە کراوە!",
+ "already_unseen_toast": "پێشتر وەک نەبینراو نیشانە کراوە!"
+ },
+ "conversation_preview": {
+ "streak_expiration": "بەسەردەچێت لە {day} ڕۆژ و {hour} کاتژمێر و {minute} خولەکدا",
+ "total_messages": "کۆی نامە نێردراوەکان/وەرگیراوەکان: \n{count}",
+ "title": "پێشبینین",
+ "unknown_user": "بەکارهێنەری نەناسراو",
+ "no_messages": "هیچ نامەیەک نەدۆزرایەوە!"
+ },
+ "profile_info": {
+ "title": "زانیاری پڕۆفایل",
+ "first_created_username": "یەکەم ناوی بەکارهێنەری دروستکراو",
+ "mutable_username": "ناوی بەکارهێنەری گۆڕاو",
+ "display_name": "ناوی دیار",
+ "added_date": "بەرواری زیادکردن",
+ "birthday": "ڕۆژی لەدایکبوون : {month} {day}",
+ "hidden_birthday": "ڕۆژی لەدایکبوون : شاراوە",
+ "friendship": "هاوڕێیەتی",
+ "add_source": "سەرچاوەی زیادکردن",
+ "snapchat_plus": "سناپچات پڵەس",
+ "snapchat_plus_state": {
+ "subscribed": "بەشداربووە",
+ "not_subscribed": "بەشدار نییە"
+ }
+ },
+ "snapchat_plus_state": {
+ "subscribed": "بەشداربووە",
+ "not_subscribed": "بەشدار نییە"
+ },
+ "friendship_link_type": {
+ "mutual": "دوولایەنە",
+ "outgoing": "نێردراو",
+ "blocked": "بلۆککراو",
+ "deleted": "سڕاوەتەوە",
+ "following": "فۆڵۆت کردووە",
+ "suggested": "پێشنیارکراو",
+ "incoming": "وەرگیراو",
+ "incoming_follower": "فۆڵۆوەری وەرگیراو"
+ },
+ "bulk_messaging_action": {
+ "actions.title": "کردارەکان",
+ "choose_action_title": "کردارێک هەڵبژێرە",
+ "progress_status": "پڕۆسێسکردنی {index} لە {total}",
+ "selection_dialog_continue_button": "بەردەوام بە",
+ "confirmation_dialog": {
+ "title": "دڵنیای؟",
+ "message": "ئەمە کاریگەری لەسەر هەموو هەڵبژێردراوەکان دەبێت، ئەم کردارە ناگەڕێتەوە."
+ },
+ "actions": {
+ "remove_friends": "سڕینەوەی هاوڕێکان",
+ "clear_conversations": "پاککردنەوەی گفتوگۆکان",
+ "clear_friend_feed": "پاککردنەوەی فیدی هاوڕێکان ({count})",
+ "unfollow": "لادانی فۆڵۆو",
+ "remove": "سڕینەوە"
+ },
+ "leave_groups": "جێهێشتنی {count} گروپ",
+ "left_group_success": "گروپەکە بە سەرکەوتوویی جێهێڵدرا",
+ "failed_to_leave_group": "جێهێشتنی گروپەکە شکستی هێنا: {error}",
+ "conversation_types": {
+ "friends_only": "تەنها هاوڕێکان",
+ "groups_only": "تەنها گروپەکان",
+ "both": "هاوڕێ و گروپەکان"
+ },
+ "sort_by": "ڕیزکردن بەپێی",
+ "reverse_order": "ڕیزبەندی پێچەوانە",
+ "search_by_name": "گەڕان بەپێی ناو",
+ "no_friends_found": "هیچ هاوڕێیەک نەدۆزرایەوە",
+ "no_groups_found": "هیچ گروپێک نەدۆزرایەوە",
+ "no_friends_or_groups_found": "هیچ هاوڕێ یان گروپێک نەدۆزرایەوە",
+ "relationship": "پەیوەندی: ",
+ "unknown_group": "گروپی نەناسراو",
+ "type_group_chat": "جۆر: چاتی گروپی",
+ "clean_conversations": "پاککردنەوەی {count} گفتوگۆ",
+ "remove_friends": "سڕینەوەی {count} هاوڕێ",
+ "clean_conversations_and_remove_friends": "پاککردنەوەی {count} گفتوگۆ و سڕینەوەی {count} هاوڕێ",
+ "clean_group_conversations": "پاککردنەوەی {count} گفتوگۆی گروپ",
+ "clean_all_conversations": "پاککردنەوەی هەموو {count} گفتوگۆکان",
+ "failed_to_fetch_conversations": "هێنانی گفتوگۆکان شکستی هێنا: {error}",
+ "failed_to_fetch_friend_conversations": "هێنانی گفتوگۆی هاوڕێکان شکستی هێنا: {error}",
+ "failed_to_process": "پڕۆسێسکردنی {id} شکستی هێنا",
+ "deleted_messages": "{count} نامەی سڕاوە",
+ "filters": {
+ "all": "هەموو",
+ "my_friends": "هاوڕێکانم",
+ "blocked": "بلۆککراوەکان",
+ "removed_me": "منیان سڕیوەتەوە",
+ "suggested": "پێشنیارکراو",
+ "deleted": "سڕاوەتەوە",
+ "business_accounts": "هەژماری بازرگانی",
+ "streaks": "ستریکەکان",
+ "non_streaks": "بێ ستریکەکان",
+ "followed": "فۆڵۆکراوە",
+ "following": "فۆڵۆکراوە",
+ "location_on_map": "شوێن لەسەر نەخشە"
+ },
+ "sort_options": {
+ "none": "هیچ",
+ "username": "ناوی بەکارهێنەر",
+ "added_timestamp": "کاتی زیادکردن",
+ "snap_score": "سکۆری سناپ",
+ "streak_length": "درێژی ستریک",
+ "most_messages_sent": "زۆرترین نامەی نێردراو",
+ "most_recent_message": "نوێترین نامە",
+ "nearest_location": "نزیکترین شوێن"
+ }
+ },
+ "chat_export": {
+ "exporter_dialog": {
+ "select_conversations_title": "هەڵبژاردنی گفتوگۆکان",
+ "text_field_selection": "{amount} هەڵبژێردراوە",
+ "text_field_selection_all": "هەموو",
+ "export_file_format_title": "فۆرماتی فایلی هەناردەکراو",
+ "message_type_filter_title": "فیلتەرکردنی نامەکان بەپێی جۆر",
+ "amount_of_messages_title": "ژمارەی نامەکان (بۆ هەمووی، بەتاڵی بهێڵەرەوە)",
+ "download_medias_title": "داگرتنی میدیا"
+ },
+ "dialog_negative_button": "پاشگەزبوونەوە",
+ "dialog_positive_button": "هەناردەکردن",
+ "exported_to": "هەناردە کرا بۆ {path}",
+ "exporting_chats": "هەناردەکردنی چاتەکان...",
+ "processing_chats": "پڕۆسێسکردنی {amount} گفتوگۆ...",
+ "export_fail": "هەناردەکردنی گفتوگۆی {conversation} شکستی هێنا",
+ "writing_output": "نووسینەوەی دەرەنجام...",
+ "finished": "تەواو! ئێستا دەتوانی ئەم پەنجەرەیە دابخەیت.",
+ "no_messages_found": "هیچ نامەیەک نەدۆزرایەوە!",
+ "exporting_message": "هەناردەکردنی {conversation}..."
+ },
+ "button": {
+ "ok": "باشە",
+ "positive": "بەڵێ",
+ "negative": "نەخێر",
+ "cancel": "پاشگەزبوونەوە",
+ "save": "سەیڤکردن",
+ "open": "کردنەوە",
+ "download": "داگرتن",
+ "send": "ناردن",
+ "restore_original": "گێڕانەوەی ڕەسەن",
+ "convert_external_media": "گۆڕینی میدیای دەرەکی"
+ },
+ "tracker_events": {
+ "conversation_enter": "چوونە ناو گفتوگۆ",
+ "conversation_exit": "چوونە دەرەوە لە گفتوگۆ",
+ "started_typing": "دەستی کرد بە نووسین",
+ "stopped_typing": "لە نووسین وەستا",
+ "started_speaking": "دەستی کرد بە قسەکردن",
+ "stopped_speaking": "لە قسەکردن وەستا",
+ "started_peeking": "دەستی کرد بە سەیرکردنی چات (Peeking)",
+ "stopped_peeking": "لە سەیرکردنی چات وەستا",
+ "message_read": "نامە خوێندرایەوە",
+ "message_deleted": "نامە سڕایەوە",
+ "message_saved": "نامە سەیڤ کرا",
+ "message_unsaved": "نامە لە سەیڤ لادرا",
+ "message_edited": "نامە دەستکاری کرا",
+ "message_reaction_add": "کاردانەوە بۆ نامە زیاد کرا",
+ "message_reaction_remove": "کاردانەوەی نامە لادرا",
+ "snap_opened": "سناپ کرایەوە",
+ "snap_replayed": "سناپ دووبارە بینرایەوە",
+ "snap_replayed_twice": "سناپ دووجار دووبارە بینرایەوە",
+ "snap_screenshot": "وێنەی شاشەی سناپ گیرا",
+ "snap_screen_record": "شاشەی سناپ تۆمار کرا",
+ "i_can_see_you": "دەتوانم بتبینم"
+ },
+ "cleared_from_feed": "لە فید سڕایەوە",
+ "tracker_actions": {
+ "log": "تۆمار",
+ "in_app_notification": "ئاگادارکەرەوەی ناو بەرنامە",
+ "push_notification": "ئاگادارکەرەوەی سەر شاشە",
+ "custom": "تایبەت"
+ },
+ "better_notifications": {
+ "button": {
+ "reply": "وەڵامدانەوە",
+ "download": "داگرتن",
+ "mark_as_read": "نیشانەکردن وەک خوێندراوە"
+ }
+ },
+ "profile_picture_downloader": {
+ "button": "داگرتنی وێنەی پڕۆفایل",
+ "title": "داگرکەری وێنەی پڕۆفایل",
+ "avatar_option": "ئاڤاتار",
+ "background_option": "پاشبنەما (Backgroud)"
+ },
+ "call_start_confirmation": {
+ "dialog_title": "دەستپێکردنی پەیوەندی",
+ "dialog_message": "ئایا دڵنیای دەتەوێت پەیوەندی دەستپێبکەیت؟"
+ },
+ "half_swipe_notifier": {
+ "notification_channel_name": "ئاگادارکەرەوەی نیوە تێپەڕاندن",
+ "notification_content_dm": "{friend} تەنها بۆ ماوەی {duration} چرکە سەیری چاتەکەی کردیت",
+ "notification_content_group": "{friend} تەنها بۆ ماوەی {duration} چرکە سەیری {group} کرد"
+ },
+ "download_processor": {
+ "attachment_type": {
+ "snap": "سناپ",
+ "sticker": "ستیکەر",
+ "gif": "گیف",
+ "external_media": "میدیای دەرەکی",
+ "note": "تێبینی",
+ "original_story": "ستۆری ڕەسەن"
+ },
+ "select_attachments_title": "هاوپێچەکان هەڵبژێرە",
+ "download_started_toast": "داگرتن دەستیپێکرد",
+ "unsupported_content_type_toast": "جۆری ناوەڕۆک پشتگیری نەکراوە!",
+ "failed_no_longer_available_toast": "میدیاکە چیتر بەردەست نییە",
+ "no_attachments_toast": "هیچ هاوپێچێک نەدۆزرایەوە!",
+ "already_queued_toast": "میدیاکە پێشتر لە ڕیزدایە!",
+ "already_downloaded_toast": "میدیاکە پێشتر داگیراوە!",
+ "content_saved_toast": "سەیڤ کرا!",
+ "download_toast": "داگرتنی {path}...",
+ "processing_toast": "پڕۆسێسکردنی {path}...",
+ "failed_generic_toast": "داگرتن شکستی هێنا",
+ "failed_to_create_preview_toast": "دروستکردنی پێشبینین شکستی هێنا",
+ "failed_processing_toast": "پڕۆسێسکردن شکستی هێنا {error}",
+ "failed_gallery_toast": "سەیڤکردن لە گەلەری شکستی هێنا {error}",
+ "dash_no_chapter": "هیچ بەشێک نەدۆزرایەوە",
+ "dash_dialog": {
+ "title": "داگرتنی میدیای Dash",
+ "download_all": "داگرتنی هەمووی",
+ "segment_text": "پارچەی {from} - {to}"
+ }
+ },
+ "streaks_reminder": {
+ "notification_title": "ستریکەکان",
+ "notification_text": "ستریکەکەت لەگەڵ {friend} دوای {hoursLeft} کاتژمێر دەفەوتێت"
+ },
+ "biometric_auth": {
+ "unlock_button": "کردنەوە",
+ "title": "کردنەوەی سناپچات",
+ "subtitle": "تکایە خۆت بناسێنە بۆ کردنەوەی سناپچات"
+ },
+ "end_to_end_encryption": {
+ "toolbox": {
+ "no_shared_key": "هێشتا کۆدی هاوبەشت لەگەڵ ئەم هاوڕێیە نییە. لە خوارەوە کلیک بکە بۆ دروستکردنی یەکێکی نوێ.",
+ "shared_key_fingerprint": "پەنجەمۆرەکەت بریتییە لە:\n\n{fingerprint}\n\nدڵنیابەرەوە کە لەگەڵ پەنجەمۆری هاوڕێکەت دەگونجێت!",
+ "initiate_exchange_button": "دەستپێکردنی گۆڕینەوەی کۆد"
+ },
+ "confirmation_dialogs": {
+ "title": "سیمبۆلکردنی سەرتاپا (End-to-end encryption)",
+ "confirmation_1": "ئاگاداری: ئەمە کۆدە کۆنەکەت دەسڕێتەوە. دەستت بەو نامانە ناگات کە پێشتر لەم هاوڕێیەوە بە سیمبۆلکراوی هاتووە. ئایا دڵنیای دەتەوێت بەردەوام بیت؟",
+ "confirmation_2": "ئایا بەڕاستی دڵنیای؟ ئەمە کۆتا دەرفەتتە بۆ پاشگەزبوونەوە."
+ },
+ "unencrypted_conversation_send_failure_toast": "ناتوانی ناوەڕۆکی سیمبۆلکراو بنێریت بۆ گفتوگۆی سیمبۆلنەکراو!",
+ "native_hooks_send_failure_toast": "ناردن شکستی هێنا! تکایە Native Hooks لە ڕێکخستنەکان چالاک بکە.",
+ "no_participants_to_encrypt_toast": "هیچ هاوڕێیەکت لەم گفتوگۆیەدا نییە بۆ ناردنی نامەی سیمبۆلکراو!",
+ "encryption_failed_toast": "سیمبۆلکردنی نامەکە شکستی هێنا! بۆ زانیاری زیاتر سەیری logcat بکە.",
+ "accept_public_key_success_toast": "کۆدی گشتی بە سەرکەوتوویی قبوڵ کرا!",
+ "accept_secret_key_success_toast": "تەواو! ئێستا دەتوانی نامەی سیمبۆلکراو بنێریت و وەربگریت لەم هاوڕێیە.",
+ "accept_public_key_failure_toast": "قبوڵکردنی کۆدی گشتی شکستی هێنا",
+ "accept_secret_key_failure_toast": "قبوڵکردنی کۆدی نهێنی شکستی هێنا",
+ "accept_secret_button": "قبوڵکردنی نهێنی",
+ "accept_public_key_button": "قبوڵکردنی کۆدی گشتی",
+ "outgoing_pk_message": "داواکاری گۆڕینەوەی کۆد",
+ "outgoing_secret_message": "وەڵامی گۆڕینەوەی کۆد",
+ "incoming_pk_message": "داواکارییەکی کۆدی گشتیت بۆ هات. لە خوارەوە کلیک بکە بۆ قبوڵکردنی.",
+ "incoming_secret_message": "هاوڕێکەت کۆدی گشتییەکەی تۆی قبوڵ کرد. لە خوارەوە کلیک بکە بۆ قبوڵکردنی نهێنییەکە."
+ },
+ "auto_open_snaps": {
+ "title": "کردنەوەی ئۆتۆماتیکی سناپ",
+ "priority_title": "کردنەوەی ئۆتۆماتیکی سناپ (پێشینە)",
+ "error_title": "کردنەوەی ئۆتۆماتیکی سناپ (هەڵەکان)",
+ "channel_description": "ئاگادارکەرەوە بۆ دۆخی ڕیزی کردنەوەی ئۆتۆماتیکی سناپەکان",
+ "priority_channel_description": "ئاگادارکەرەوەی پێشینە بەرز بۆ کردنەوەی ئۆتۆماتیکی سناپەکان",
+ "error_channel_description": "ئاگادارکەرەوەی هەڵە کاتێک کردنەوەی ئۆتۆماتیکی سناپ شکستی دەهێنێت",
+ "paused_status": "کردنەوەی ئۆتۆماتیکی سناپ وەستێنراوە",
+ "processing_status": "پڕۆسێسکردنی سناپەکان: {queued} لە ڕیزدا، {processed} پڕۆسێس کراوە",
+ "monitor_status": "چاودێریکردن...",
+ "recent_snaps": "سناپە نوێیەکان",
+ "action_pause": "وەستاندن",
+ "action_resume": "دەستپێکردنەوە",
+ "action_clear": "پاککردنەوەی ڕیز",
+ "action_reset": "سفرکردنەوەی ژمارە",
+ "error_content": "نەتوانرا سناپ لەلایەن {sender} بکرێتەوە: {error}",
+ "resumed_feedback": "کردنەوەی ئۆتۆماتیکی دەستیپێکردەوە",
+ "paused_feedback": "کردنەوەی ئۆتۆماتیکی وەستێنرا",
+ "resumed_message": "پڕۆسێسکردن بە ئۆتۆماتیکی بۆ سناپە ڕیزکراوەکان بەردەوام دەبێت",
+ "paused_message": "پڕۆسێسکردن وەستا. ڕیزەکە پارێزراوە ({count} سناپ)",
+ "status_paused": "وەستێنراوە",
+ "status_monitoring": "چاودێریکردن",
+ "status_active": "چالاک",
+ "queue_cleared": "ڕیزەکە پاککرایەوە و ئامارەکان سفر کرانەوە",
+ "queue_cleared_title": "ڕیز پاککرایەوە",
+ "queue_cleared_reset": "ڕیز پاککرایەوە و سفر کرایەوە",
+ "queue_cleared_feedback": "{count} سناپی ڕیزکراو سڕایەوە \u2022 {processed} ژمارەی پڕۆسێسکراو سفر کرایەوە",
+ "queue_cleared_feedback_simple": "{processed} ژمارەی پڕۆسێسکراو سفر کرایەوە",
+ "unknown_sender": "نەناسراو",
+ "unknown_user": "بەکارهێنەری نەناسراو",
+ "content_type_external_media": "میدیای دەرەکی",
+ "content_type_snap": "سناپ",
+ "conversation_type_friend_dm": "نامەی هاوڕێ",
+ "conversation_type_dm": "نامەی تایبەت",
+ "conversation_type_group_chat": "چاتی گروپی",
+ "conversation_type_chat": "چات",
+ "notification_status": "بارودۆخ",
+ "notification_statistics": "ئامارەکان",
+ "notification_queue_size": "قەبارەی ڕیز",
+ "notification_total_opened": "کۆی سناپە کراوەکان",
+ "notification_queue_preview": "پێشبینینی ڕیز",
+ "notification_processing_continue": "پڕۆسێسکردن بە ئۆتۆماتیکی بەردەوام دەبێت...",
+ "notification_no_snaps_queue": "هیچ سناپێک لە ڕیزدا نییە.",
+ "notification_queue_cleared_opened": "ڕیز پاککرایەوە ({opened} کراوەتەوە)",
+ "content_type_photo_video_snap": "سناپی وێنە/ڤیدیۆ",
+ "conversation_type_group_with_name": "گروپ: {name}",
+ "delete_logs_title": "تۆمارەکان بسڕدرێنەوە؟",
+ "delete_logs_progress": "سڕینەوەی {count} تۆمار...",
+ "delete_logs_description": "ئەمە تۆمارەکان بەپێی فیلتەری ئێستا دەسڕێتەوە. ئەم کردارە ناگەڕێتەوە.",
+ "export_logs_title": "تۆمارەکان هەناردە بکرێن؟",
+ "export_logs_progress": "هەناردەکردنی تۆمارەکان...",
+ "export_logs_description": "ئەمە تۆمارەکان بەپێی فیلتەر و گەڕانی ئێستا هەناردە دەکات.",
+ "export_logs_as": "هەناردەکردن وەک {type}",
+ "export_logs_success": "تۆمارەکان هەناردە کران!",
+ "export_logs_failure": "هەناردەکردنی تۆمارەکان شکستی هێنا. بۆ زانیاری زیاتر logcat بپشکنە.",
+ "deleted_logs_count": "{count} تۆمار سڕایەوە"
+ },
+ "script_imported": "سکرێپتی {name} هاوردە کرا!",
+ "script_import_failed": "هاوردەکردنی سکرێپت شکستی هێنا. {error}. بۆ زانیاری زیاتر سەیری تۆمارەکان بکە",
+ "script_updating": "نوێکردنەوەی سکرێپتی {name}...",
+ "script_updated": "نوێکرایەوە {name} بۆ وەشانەی {version}",
+ "script_update_failed": "نوێکردنەوەی مۆدیوڵ شکستی هێنا. سەیری تۆمارەکان بکە",
+ "script_edit_failed": "کردنەوەی فایلی مۆدیوڵ شکستی هێنا. سەیری تۆمارەکان بکە",
+ "script_data_cleared": "داتای مۆدیوڵ پاککرایەوە!",
+ "script_data_clear_failed": "پاککردنەوەی داتای مۆدیوڵ شکستی هێنا. سەیری تۆمارەکان بکە",
+ "script_deleted": "سکرێپتی {name} سڕایەوە!",
+ "script_delete_failed": "سڕینەوەی مۆدیوڵ شکستی هێنا. سەیری تۆمارەکان بکە",
+ "script_actions": "کردارەکان",
+ "script_no_description": "هیچ وەسفێک نییە",
+ "script_update_available": "نوێکردنەوە بەردەستە: {version}",
+ "script_loaded": "سکرێپتی {name} بارکرا",
+ "script_unloaded": "سکرێپتی {name} لادرا",
+ "script_enable_disable_failed": "شکست لە {action} کردنی سکرێپت. سەیری تۆمارەکان بکە",
+ "script_no_settings": "ئەم مۆدیوڵە هیچ ڕێکخستنێکی نییە",
+ "script_no_scripts_found": "هیچ سکرێپتێک نەدۆزرایەوە",
+ "script_ok_timeout": "باشە {timeout}",
+ "scripting_tagline": "بەڕێوەبردنی سکرێپتەکان، هاوردەکردن و فۆڵدەرەکان",
+ "installed_scripts_tab": "دامەزراوەکان",
+ "catalog_tab": "کەتەلۆگ",
+ "no_scripts_folder_selected_title": "فۆڵدەرێکی سکرێپت هەڵبژێرە بۆ دەستپێکردن",
+ "select_folder_button": "هەڵبژاردنی فۆڵدەر",
+ "select_scripts_folder_toast": "تکایە سەرەتا فۆڵدەرێکی سکرێپت هەڵبژێرە",
+ "delete_rule_title": "سڕینەوەی یاسا (Rule)",
+ "delete_rule_description": "ئایا دڵنیای دەتەوێت ئەم یاسایە بسڕیتەوە؟",
+ "rule_name": "ناوی یاسا",
+ "friend_tracker_notifications": {
+ "notification_channel_name": "چاودێری هاوڕێ",
+ "notification_title": "چالاکی هاوڕێ",
+ "conversation_enter": "{friend} چووە ناو {conversation}",
+ "conversation_exit": "{friend} لە {conversation} چووە دەرەوە",
+ "started_typing": "{friend} دەستی کرد بە نووسین لە {conversation}",
+ "stopped_typing": "{friend} لە نووسین وەستا لە {conversation}",
+ "started_speaking": "{friend} دەستی کرد بە قسەکردن لە {conversation}",
+ "stopped_speaking": "{friend} لە قسەکردن وەستا لە {conversation}",
+ "started_peeking": "{friend} دەستی کرد بە سەیرکردنی چات لە {conversation}",
+ "stopped_peeking": "{friend} لە سەیرکردنی چات وەستا لە {conversation}",
+ "message_read": "{friend} نامەیەکی خوێندەوە لە {conversation}",
+ "message_deleted": "{friend} نامەیەکی سڕییەوە لە {conversation}",
+ "message_saved": "{friend} نامەیەکی سەیڤ کرد لە {conversation}",
+ "message_unsaved": "{friend} نامەیەکی لە سەیڤ لادرا لە {conversation}",
+ "message_edited": "{friend} نامەیەکی دەستکاری کرد لە {conversation}",
+ "message_reaction_add": "{friend} کاردانەوەیەکی زیاد کرد لە {conversation}",
+ "message_reaction_remove": "{friend} کاردانەوەیەکی لادرا لە {conversation}",
+ "snap_opened": "{friend} سناپێکی کردەوە لە {conversation}",
+ "snap_replayed": "{friend} سناپێکی دووبارە بینییەوە لە {conversation}",
+ "snap_replayed_twice": "{friend} دووجار سناپێکی دووبارە بینییەوە لە {conversation}",
+ "snap_screenshot": "{friend} وێنەی شاشەی گرت لە {conversation}",
+ "snap_screen_record": "{friend} شاشەی تۆمار کرد لە {conversation}",
+ "i_can_see_you": "چالاکی {friend} لە {conversation}: {details}"
+ },
+ "friend_mutation_observer": {
+ "notification_channel_name": "چاودێری گۆڕانکاری هاوڕێ",
+ "friend_removed": "{username} تۆی لە لیستی هاوڕێیانی سڕییەوە",
+ "birthday_removed": "{username} ڕۆژی لەدایکبوونی سڕییەوە ({birthday})",
+ "birthday_added": "{username} ڕۆژی لەدایکبوونی زیاد کرد ({birthday})",
+ "birthday_changed": "{username} ڕۆژی لەدایکبوونی گۆڕی لە {oldBirthday} بۆ {newBirthday}",
+ "bitmoji_selfie_changed": "{username} سێڵفی بیتمۆجییەکەی گۆڕی",
+ "bitmoji_avatar_changed": "{username} ئاڤاتاری بیتمۆجییەکەی گۆڕی",
+ "bitmoji_background_changed": "{username} پاشبنەمای بیتمۆجییەکەی گۆڕی",
+ "bitmoji_scene_changed": "{username} دیمەنی بیتمۆجییەکەی گۆڕی"
+ },
+ "material3_strings": {
+ "date_range_picker_start_headline": "لە",
+ "date_range_picker_end_headline": "بۆ",
+ "date_range_picker_title": "مەودای بەروار هەڵبژێرە",
+ "date_picker_switch_to_calendar_mode": "ڕۆژژمێر",
+ "date_picker_switch_to_input_mode": "نووسین",
+ "date_range_picker_scroll_to_previous_month": "مانگی پێشوو",
+ "date_range_picker_scroll_to_next_month": "مانگی داهاتوو",
+ "date_picker_today_description": "ئەمڕۆ",
+ "date_range_picker_day_in_range": "هەڵبژێردراو",
+ "date_input_invalid_for_pattern": "بەرواری نادروست",
+ "date_input_invalid_year_range": "ساڵی نادروست",
+ "date_input_invalid_not_allowed": "بەرواری نادروست",
+ "date_range_input_invalid_range_input": "مەودای بەرواری نادروست"
+ },
+ "send_override_dialog": {
+ "title": "ناردنی میدیا وەک",
+ "duration": "ماوە: {duration}",
+ "saveable_snap_hint": "سناپەکە بکە بە سەیڤکراو لە ناو چات",
+ "unlimited_duration": "بێسنوور",
+ "schedule": "خشتەبەندی",
+ "select_time": "کات هەڵبژێرە",
+ "select": "هەڵبژاردن",
+ "select_date_first": "تکایە سەرەتا بەروارێک هەڵبژێرە",
+ "invalid_time": "تکایە کاتێکی داهاتوو هەڵبژێرە"
+ },
+ "auto_reply_messages": {
+ "dialog": {
+ "add_message": "نامە زیاد بکە",
+ "edit_message": "دەستکاری نامە بکە",
+ "message_label": "نامە",
+ "no_messages": "هێشتا هیچ نامەیەک نییە. یەکەم نامەت زیاد بکە!",
+ "message_placeholder": "نامەی وەڵامدانەوەی ئۆتۆماتیکی بنووسە..."
+ }
+ },
+ "auto_delete_sent_messages": {
+ "countdown_toast": "نامەکە دەسڕێتەوە دوای {time}",
+ "delete_success_toast": "نامەکە بە سەرکەوتوویی سڕایەوە",
+ "delete_failed_toast": "سڕینەوەی نامە شکستی هێنا"
+ },
+ "translation_position": {
+ "above": "سەروو",
+ "below": "خواروو",
+ "inline": "لەناو دێڕ"
+ },
+ "language_codes": {
+ "en": "ئینگلیزی",
+ "es": "ئیسپانی",
+ "fr": "فەرەنسی",
+ "de": "ئەڵمانی",
+ "it": "ئیتاڵی",
+ "pt": "پورتوگالی",
+ "ru": "ڕووسی",
+ "ja": "ژاپۆنی",
+ "ko": "کۆری",
+ "zh": "چینی",
+ "ar": "عەرەبی",
+ "hi": "هیندی",
+ "tr": "تورکی",
+ "nl": "هۆڵەندی",
+ "pl": "پۆڵەندی",
+ "sv": "سویدی",
+ "da": "دانیمارکی",
+ "no": "نەرویجی",
+ "fi": "فینلەندی",
+ "cs": "چیکی",
+ "hu": "هەنگاری",
+ "ro": "ڕۆمانی",
+ "bg": "بولگاری",
+ "hr": "کرواتی",
+ "sk": "سلۆڤاکی",
+ "sl": "سلۆڤینی",
+ "et": "ئیستۆنی",
+ "lv": "لاتڤی",
+ "lt": "لیتوانی",
+ "mt": "ماڵتی",
+ "ga": "ئێرلەندی",
+ "cy": "وێڵزی"
+ },
+ "tracker": {
+ "tabs": {
+ "logs": "تۆمارەکان",
+ "rules": "یاساکان"
+ },
+ "actions": {
+ "export": "هەناردەکردن",
+ "delete": "سڕینەوە",
+ "add_rule": "یاسا زیاد بکە",
+ "save_rule": "یاسا سەیڤ بکە"
+ },
+ "messages": {
+ "no_logs_found": "هیچ تۆمارێک نەدۆزرایەوە",
+ "no_rules_found": "هیچ یاسایەک نەدۆزرایەوە",
+ "no_events": "هیچ ڕووداوێک نییە"
+ },
+ "search": {
+ "placeholder": "گەڕان"
+ },
+ "filters": {
+ "newest_first": "نوێترینەکان سەرەتا",
+ "pick_a_date": "بەروارێک هەڵبژێرە",
+ "title": "فیلتەرەکان",
+ "search_by": "گەڕان بەپێی",
+ "since": "لە کاتی",
+ "until": "تاوەکو",
+ "types": {
+ "username": "ناوی بەکارهێنەر",
+ "conversation": "گفتوگۆ",
+ "event": "ڕووداو"
+ },
+ "event_types": {
+ "conversation_enter": "چوونە ناو گفتوگۆ",
+ "conversation_exit": "جێهێشتنی گفتوگۆ",
+ "started_typing": "دەستپێکردنی نووسین",
+ "stopped_typing": "وەستان لە نووسین",
+ "started_speaking": "دەستپێکردنی قسە",
+ "stopped_speaking": "وەستان لە قسە",
+ "started_peeking": "دەستپێکردنی سەیرکردنی چات",
+ "stopped_peeking": "وەستان لە سەیرکردنی چات",
+ "message_read": "خوێندنەوەی نامە",
+ "message_deleted": "سڕینەوەی نامە",
+ "message_saved": "سەیڤکردنی نامە",
+ "message_unsaved": "لادانی نامە لە سەیڤ",
+ "message_edited": "دەستکاریکردنی نامە",
+ "message_reaction_add": "زیادکردنی کاردانەوە",
+ "message_reaction_remove": "لادانی کاردانەوە",
+ "snap_opened": "کردنەوەی سناپ",
+ "snap_replayed": "دووبارە بینینەوەی سناپ",
+ "snap_replayed_twice": "دووجار دووبارە بینینەوەی سناپ",
+ "snap_screenshot": "گرتنی وێنەی شاشە",
+ "snap_screen_record": "تۆمارکردنی شاشە"
+ }
+ },
+ "logs": {
+ "export_dialog": {
+ "title": "هەناردەکردنی تۆمارەکان",
+ "description": "تۆمارەکانی چاودێری هاوڕێ هەناردەی فایل بکە",
+ "progress": "هەناردەکردنی تۆمارەکان...",
+ "export_as": "هەناردەکردن وەک {type}",
+ "format_json": "JSON",
+ "format_csv": "CSV"
+ },
+ "delete_dialog": {
+ "title": "سڕینەوەی تۆمارەکان",
+ "message": "ئایا دڵنیای دەتەوێت هەموو تۆمارەکان بسڕیتەوە؟ ئەم کردارە ناگەڕێتەوە.",
+ "confirm": "سڕینەوەی هەموو",
+ "cancel": "پاشگەزبوونەوە",
+ "progress": "سڕینەوەی {count} تۆمار..."
+ },
+ "log_entry": {
+ "in_conversation": "لەناو {conversation}",
+ "unknown_user": "نەناسراو",
+ "unknown_conversation": "نامە تایبەتەکان",
+ "i_can_see_you_entered": "چووە ناو",
+ "i_can_see_you_left": "جێیهێشت",
+ "i_can_see_you_duration": "ماوە",
+ "i_can_see_you_not_available": "بەردەست نییە",
+ "i_can_see_you_unit_hour": "ک",
+ "i_can_see_you_unit_minute": "خ",
+ "i_can_see_you_unit_second": "چ",
+ "event_text": "{friend} {event} لە {conversation}",
+ "events": {
+ "conversation_enter": "چووە ناو",
+ "conversation_exit": "جێیهێشت",
+ "started_typing": "دەستی کرد بە نووسین",
+ "stopped_typing": "لە نووسین وەستا",
+ "started_speaking": "دەستی کرد بە قسەکردن",
+ "stopped_speaking": "لە قسەکردن وەستا",
+ "started_peeking": "دەستی کرد بە سەیرکردنی چات",
+ "stopped_peeking": "لە سەیرکردنی چات وەستا",
+ "message_read": "نامەیەکی خوێندەوە",
+ "message_deleted": "نامەیەکی سڕییەوە",
+ "message_saved": "نامەیەکی سەیڤ کرد",
+ "message_unsaved": "نامەیەکی لە سەیڤ لادرا",
+ "message_edited": "نامەیەکی دەستکاری کرد",
+ "message_reaction_add": "کاردانەوەیەکی زیاد کرد",
+ "message_reaction_remove": "کاردانەوەیەکی لادرا",
+ "snap_opened": "سناپێکی کردەوە",
+ "snap_replayed": "سناپێکی دووبارە بینییەوە",
+ "snap_replayed_twice": "دووجار سناپێکی دووبارە بینییەوە",
+ "snap_screenshot": "وێنەی شاشەی گرت",
+ "snap_screen_record": "شاشەی تۆمار کرد",
+ "i_can_see_you": "چالاک بوو"
+ }
+ }
+ },
+ "edit_rule": {
+ "custom_rule": "یاسای دەستکرد",
+ "scope": "مەودا",
+ "events": "ڕووداوەکان",
+ "add_event": "زیادکردنی ڕووداو",
+ "type": "جۆر",
+ "triggers": "بزوێنەرەکان",
+ "conditions": "مەرجەکان",
+ "only_inside_conversation": "تەنها کاتێک لە ناو چاتدام",
+ "only_outside_conversation": "تەنها کاتێک لە دەرەوەی چاتدام",
+ "only_when_app_active": "تەنها کاتێک Snapchat چالاکە",
+ "only_when_app_inactive": "تەنها کاتێک Snapchat ناچالاکە",
+ "no_notification_when_app_active": "ئاگادارکەرەوە نەیەت کاتێک Snapchat چالاکە",
+ "scope_options": {
+ "all_friends_groups": "هەموو هاوڕێکان/گرووپەکان",
+ "no_one_except": "هیچ کەس جگە لە",
+ "everyone_except": "هەموو کەس جگە لە"
+ }
+ }
+ },
+ "debug": {
+ "title": "دیبەگ (Debug)",
+ "clear": "سڕینەوە",
+ "files": {
+ "config_json": "فایلی ڕێکخستن",
+ "mappings_json": "فایلی نەخشەسازی (Mappings)",
+ "message_logger_db": "داتابەیسی تۆماری نامەکان",
+ "pinned_best_friend_txt": "فایلی باشترین هاوڕێی جێگیرکراو",
+ "native_sig_cache_txt": "فایلی کاشی واژۆی ڕەسەن"
+ },
+ "settings": {
+ "test_mode": "دۆخی تاقیکردنەوە (تەنها بۆ دیبەگ)",
+ "disable_feature_loading": "ناچالاککردنی بارکردنی تایبەتمەندییەکان",
+ "disable_auto_mapper": "ناچالاککردنی نەخشەسازەری خۆکار",
+ "disable_bypass_status_indicator": "ناچالاککردنی تێپەڕاندنی نیشاندەری دۆخ"
+ }
+ },
+ "ui_settings_title": "ڕێکخستنەکانی ڕووکار",
+ "haptic_feedback_label": "وەڵامدانەوەی لەرزین (Haptic)",
+ "updates_title": "وەشانە نوێیەکان",
+ "auto_update_check": "پشکنینی خۆکار بۆ وەشانە نوێیەکان",
+ "update_check_frequency_daily": "ڕۆژانە",
+ "update_check_frequency_weekly": "هەفتانە",
+ "update_check_frequency_monthly": "مانگانە",
+ "update_channel_stable": "جێگیر (Stable)",
+ "update_channel_prerelease": "پێش-وەشان (Pre-release)",
+ "friend_notes_title": "تێبینییەکانی هاوڕێ",
+ "friend_notes_description": "بەڕێوەبردن و کۆپییەکی یەدەگی تێبینی هاوڕێکانت",
+ "app_theme_title": "ڕووکاری ئەپ",
+ "theme_mode_system": "سیستەم",
+ "theme_mode_light": "ڕۆشن",
+ "theme_mode_dark": "تاریك",
+ "test_mode_label": "چالاککردنی PurrAura",
+ "disable_feature_loading_label": "ناچالاککردنی بارکردنی تایبەتمەندییەکان",
+ "disable_auto_mapper_label": "ناچالاککردنی نەخشەسازەری خۆکار",
+ "disable_bypass_indicator_label": "ناچالاککردنی نیشاندەری تێپەڕاندن",
+ "friend_list": {
+ "manage_title": "بەڕێوەبردنی لیستی هاوڕێیان",
+ "export_description": "ناردنی هاوڕێیان ڕێگەت پێدەدات لیستی ئایدی هاوڕێکانت لە فایلێکی تێکستدا پاشەکەوت بکەیت. هێنان لە فایلەوە هاوڕێکان لە لیستێکدا پیشان دەدات کە دەتوانیت زیادیان بکەیتەوە.",
+ "export_friends": "ناردنی لیستی هاوڕێیان",
+ "import_from_file": "هێنان لە فایلەوە",
+ "add": "زیادکردن"
+ },
+ "memories": {
+ "export_title": "ناردنی یادەوەرییەکان",
+ "total_memories": "کۆی یادەوەرییەکان: {count}",
+ "date_range": "مەودای بەروار",
+ "select": "دیاریکردن",
+ "sort_by_folder": "ڕیزکردن بەپێی فۆڵدەر",
+ "include_my_eyes_only": "بەشی My Eyes Only بگرێتەوە",
+ "cancel": "پاشگەزبوونەوە",
+ "export": "ناردن (Export)",
+ "quit": "داخستن",
+ "done": "تەواو",
+ "ok": "باشە",
+ "exporting_memories": "یادەوەرییەکان دەنێردرێن... ({failed} سەرنەکەوت)"
+ },
+ "scripting_ui": {
+ "no_scripts_folder_selected": "هیچ فۆڵدەرێکی سکریپت دیاری نەکراوە",
+ "select_folder": "فۆڵدەر دیاری بکە",
+ "import_from_url": "هێنان لە لینکەوە",
+ "open_scripts_folder": "کردنەوەی فۆڵدەری سکریپتەکان",
+ "import_script_from_url": "هێنانی سکریپت لە لینکەوە",
+ "warning_imported_scripts": "ئاگاداری: ئەو سکریپتانەی دەهێنرێن دەکرێت زیانبەخش بن بۆ ئامێرەکەت. تەنها لە سەرچاوەی متمانەپێکراوەوە سکریپت بهێنە.",
+ "enter_url_here": "لینکەکە لێرە بنووسە:",
+ "import": "هێنان (Import)",
+ "cancel": "پاشگەزبوونەوە",
+ "documentation": "بەڵگەنامەکان"
+ },
+ "common": {
+ "cancel": "پاشگەزبوونەوە",
+ "add": "زیادکردن",
+ "ok": "باشە",
+ "quit": "داخستن",
+ "done": "تەواو",
+ "back": "گەڕانەوە",
+ "unknown": "نەناسراو",
+ "added": "زیادکرا",
+ "no_friends_found": "هیچ هاوڕێیەک نەدۆزرایەوە",
+ "exporting_memories": "یادەوەرییەکان دەنێردرێن... ({failed} سەرنەکەوت)"
+ },
+ "clear_friend_feed": "سڕینەوەی فیدی هاوڕێیان",
+ "select_date": "دیاریکردنی بەروار",
+ "schedule_scheduled_for": "خشتەکراوە بۆ {name} لە {time}",
+ "schedule_sending_in": "دەنێردرێت لە {time}",
+ "schedule_sent_to": "نێردرا بۆ {name}",
+ "schedule_sent": "سناپە خشتەکراوەکە نێردرا",
+ "schedule_failed_to": "نەنێردرا بۆ {name}",
+ "schedule_failed": "سناپە خشتەکراوەکە سەرنەکەوت",
+ "schedule_cancelled_for": "هەڵوەشایەوە بۆ {name}",
+ "by_author": "لە لایەن {author}",
+ "version": "وەشانی {version}",
+ "delete_button": "سڕینەوە",
+ "logger_history": {
+ "download_started": "داگرتن دەستی پێکرد!",
+ "downloaded_to": "داگیرا لەم شوێنە: {path}",
+ "failed_to_download": "داگرتن سەرنەکەوت {message}",
+ "select_conversation": "چاتێک دیاری بکە",
+ "select_conversation_placeholder": "چاتێک دیاری بکە",
+ "edited_at": "دەستکاری کراوە لە {date}",
+ "download_attachment_failed_toast": "داگرتنی هاوپێچ سەرنەکەوت",
+ "message_parse_failed": "شیکردنەوەی نامە سەرنەکەوت",
+ "empty_message": "نامەی بەتاڵ",
+ "no_more_messages": "هیچ نامەیەکی تر نەماوە",
+ "reverse_order_checkbox": "پێچەوانەکردنەوەی ڕیزبەندی",
+ "view_logger_history_button": "بینینی مێژووی لۆگەر",
+ "posted_at": "بڵاوکراوەتەوە لە {date}",
+ "created_at": "دروستکراوە لە {date}",
+ "failed_to_open_file": "فایلەکە نەکرایەوە. بۆ زانیاری زیاتر سەیری لۆگەکان بکە",
+ "failed_to_get_file": "فایلەکە دەستنەکەوت",
+ "download_button": "داگرتن",
+ "chat_attachment": "هاوپێچی {index}",
+ "log_header_format": "{username} ؟ {type} ؟ {date}",
+ "edited_at_text": "دەستکاری کرا بۆ \"{message}\" لە {date}",
+ "list_group_format": "گرووپی {name}",
+ "list_friend_format": "هاوڕێ {name}",
+ "download_started_toast": "داگرتن دەستی پێکرد",
+ "download_success_toast": "داگیرا لەم شوێنە: {path}",
+ "download_failed_toast": "داگرتن سەرنەکەوت: {message}",
+ "close_button_description": "داخستنی گەڕان",
+ "search_button_description": "گەڕان لە نامەکاندا"
+ },
+ "debug_dialogs": {
+ "info": "زانیاری",
+ "refs": "سەرچاوەکان",
+ "arroyo": "Arroyo",
+ "message": "نامە",
+ "media_references": "سەرچاوەکانی میدیا",
+ "arroyo_proto": "Arroyo proto",
+ "message_proto": "Message proto"
+ },
+ "error_messages": {
+ "failed_to_fetch_message": "هێنانی نامە سەرنەکەوت: {error}",
+ "failed_to_edit_message": "دەستکاریکردنی نامە سەرنەکەوت: {error}"
+ },
+ "ai_response_style": {
+ "casual": "ئاسایی",
+ "formal": "فەرمی",
+ "friendly": "دۆستانە",
+ "humorous": "بە پێکەنینەوە",
+ "empathetic": "هاوسۆزانە",
+ "busy": "سەرقاڵ",
+ "toxic": "ژەهراوی (Toxic)"
+ },
+ "ai_response_language": {
+ "auto": "خۆکار (هەمان زمانی وەرگیراو)",
+ "en": "ئینگلیزی",
+ "es": "ئیسپانی",
+ "fr": "فەرەنسی",
+ "de": "ئەڵمانی",
+ "it": "ئیتاڵی",
+ "pt": "پورتوگالی",
+ "ru": "ڕووسی",
+ "ja": "ژاپۆنی",
+ "ko": "کۆری",
+ "zh": "چینی",
+ "ar": "عەرەبی (ئیمارات و سعودیە)",
+ "hi": "هیندی",
+ "tr": "تورکی",
+ "pl": "پۆڵەندی",
+ "nl": "هۆڵەندی",
+ "sv": "سویدی",
+ "da": "دانیمارکی",
+ "no": "نەرویجی",
+ "fi": "فینلەندی"
+ },
+ "ai_provider": {
+ "gemini": "Gemini",
+ "deepseek": "DeepSeek",
+ "openai": "OpenAI",
+ "openrouter": "OpenRouter"
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/assets/lang/lv_LV.json b/common/src/main/assets/lang/lv_LV.json
index d79aeba7..65e104f9 100644
--- a/common/src/main/assets/lang/lv_LV.json
+++ b/common/src/main/assets/lang/lv_LV.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Izvēlieties valodu",
@@ -663,16 +663,16 @@
"auto_save": "י Automātiski saglabāt vēstules",
"unsaveable_messages": " Nesaglabājamas vēstules",
"auto_open_snaps": "Snaps automātiska atvēršana",
- "stealth": "👻 Stealth Mode",
+ "stealth": "?? Slepenais re??ms",
"auto_reply": "י Automātiska atbilde",
"auto_delete_sent_messages": "- Automātiski izdzēst nosūtītās vēstules",
"mark_snaps_as_seen": "י Atzīmēt momentus, kā redzams",
"mark_stories_as_seen_locally": "י Atzīmēt stāstus, kā redzams uz vietas",
- "conversation_info": "👤 Conversation Info",
+ "conversation_info": "?? Sarunas inform?cija",
"e2e_encryption": "E2E šifrēšana",
- "message_logger": "📝 Message Logger",
+ "message_logger": "?? Zi?ojumu ?urn?ls",
"auto_read": "י Automātiski lasīt",
- "hide_typing_indicator": "🙈 Hide Typing Indicator"
+ "hide_typing_indicator": "?? Pasl?pt rakst??anas indikatoru"
},
"schedule_scheduled_for": "Plānots{name}skaits{time}",
"schedule_sending_in": "Sūta{time}",
@@ -1021,7 +1021,7 @@
"friendly": "Draudzīgi",
"humorous": "Mitrs",
"empathetic": "Empātiski",
- "toxic": "Edgy",
+ "toxic": "Asu",
"busy": "Aizņemts"
},
"ai_temperature": {
@@ -1050,7 +1050,7 @@
"fi": "Somu"
},
"friendGreeting": {
- "Hey": "Hey"
+ "Hey": "Sveiks"
},
"half_swipe_messages": {
"[\"I noticed you half-swiped! I'll respond soon.\"]": "Es pamanīju, ka tu esi puspeldējis! Es drīz atbildēšu."
@@ -1477,7 +1477,7 @@
"description": "Pievieno ziņojumiem specifisku rādītāju ikonas\nPiezīme: Rādītāji var nebūt 100% precīzi"
},
"stealth_mode_indicator": {
- "name": "Stealth Mode indikators",
+ "name": "Slepen? re??ma indikators",
"description": "Papildina emoji blakus sarunām slēptā režīmā"
},
"edit_text_override": {
@@ -1536,7 +1536,7 @@
},
"mark_snap_as_seen_button": {
"name": "Atzīmēt kā meklēto pogu",
- "description": "Pievieno pogu, lai atzīmētu Snap kā redzams, to aplūkojot.\nTas darbosies pat tad, ja Stealth Mode ir ieslēgts"
+ "description": "Pievieno pogu, lai atz?m?tu Snap k? redz?tu, to apl?kojot.\nTas darbosies pat tad, ja slepenais re??ms ir iesl?gts"
},
"skip_when_marking_as_seen": {
"name": "Izlaist, kad iezīmēt kā redzētu",
@@ -2156,7 +2156,7 @@
}
},
"spoof": {
- "name": "Spoof",
+ "name": "Vilto?ana",
"description": "Spoof dažādu informāciju par jums",
"properties": {
"play_store_installer_package_name": {
@@ -2176,11 +2176,11 @@
"description": "Piespiest tīkla transportu ziņot Wi-Fi mobilo datu vietā"
},
"spoof_device_id": {
- "name": "Spoof Device ID",
+ "name": "Viltot ier?ces ID",
"description": "Aizstāt uz Snapchat nosūtīto Android ID",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Viltot Android ID",
"description": "Aizstāt Android ID nosūtīts uz Snapchat ar pielāgotu vērtību"
},
"custom_android_id": {
@@ -2553,7 +2553,7 @@
"deleted": "Dzēsts",
"business_accounts": "Uzņēmējdarbības konti",
"streaks": "Streaks",
- "non_streaks": "Non Streaks",
+ "non_streaks": "Bez streakiem",
"followed": "Seko",
"following": "Pēc",
"location_on_map": "Vieta uz kartes"
@@ -2759,7 +2759,7 @@
"notification_statistics": "STATISTIKA",
"notification_queue_size": "Rindas izmērs",
"notification_total_opened": "Atvērti visi momenti",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "RINDAS PRIEK?SKATS",
"notification_processing_continue": "Apstrāde tiks turpināta automātiski...",
"notification_no_snaps_queue": "Snaps rindā.",
"notification_queue_cleared_opened": "Rinda noskaidrota ({opened}atvērts)",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/nb_NO.json b/common/src/main/assets/lang/nb_NO.json
index ac73159d..861bc4c0 100644
--- a/common/src/main/assets/lang/nb_NO.json
+++ b/common/src/main/assets/lang/nb_NO.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Velg språk",
@@ -58,7 +58,7 @@
"sections": {
"home": {
"version_title": "v{versionName}Av evig",
- "update_title": "PurrfectSnap Update",
+ "update_title": "Oppdatering av PurrfectSnap",
"update_content": "Utgave{version}er tilgjengelig!",
"update_button": "Last ned",
"debug_build_summary_title": "Du kjører en feilsøkingsbygging av PurrfectSnap",
@@ -84,14 +84,14 @@
"clear_button": "Fjern",
"view_logger_history_button": "Vis Logger Historie",
"ui_settings_title": "UI-innstillinger",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptisk tilbakemelding",
"use_system_toasts_label": "Bruk System Toasts",
"updates_title": "Oppdateringer",
"auto_update_check": "Automatisk oppdateringskontroll",
"update_check_frequency_daily": "Daglig",
"update_check_frequency_weekly": "Uken",
"update_check_frequency_monthly": "Månedlig",
- "update_channel_stable": "Stable",
+ "update_channel_stable": "Stabil",
"update_channel_prerelease": "Forutsetning",
"update_notification_channel_name": "Oppdateringer",
"update_notification_channel_description": "Bli varslet når nye utgivelser er tilgjengelige",
@@ -240,7 +240,7 @@
"save_coordinates_dialog_title": "Lagre koordinater",
"saved_name_dialog_hint": "Lagret navn",
"latitude_dialog_hint": "Lengdegrad",
- "longitude_dialog_hint": "Longitude",
+ "longitude_dialog_hint": "Lengdegrad",
"save_dialog_button": "Lagre",
"choose_location_button": "Velg et sted",
"manual_coordinates_hint": "Finjuster koordinatene manuelt.",
@@ -305,7 +305,7 @@
"clear_module_data_failed": "Klarte ikke å slette moduldata",
"delete_module_button": "Slett",
"delete_module_failed": "Klarte ikke å slette modulen",
- "documentation_button": "Docs",
+ "documentation_button": "Dokumentasjon",
"download_script_failed": "Klarte ikke å laste ned skript",
"downloading_script": "Last ned skript...",
"edit_module_button": "Rediger",
@@ -389,12 +389,12 @@
"scope_all": "Alle venner/grupper",
"scope_whitelist": "Ingen andre enn",
"scope_blacklist": "Alle bortsett fra",
- "events_section_title": "Events",
+ "events_section_title": "Hendelser",
"events_suffix": "hendelser",
"no_events_text": "Ingen hendelser lagt til enda",
"add_event_dialog_title": "Legg til hendelse",
- "event_type_label": "Event Type",
- "triggers_title": "Triggers",
+ "event_type_label": "Hendelsestype",
+ "triggers_title": "Utl?sere",
"conditions_title": "Betingelser",
"condition_only_inside_conversation": "Først når jeg er inne i samtalen",
"condition_only_outside_conversation": "Først når jeg er utenfor samtale",
@@ -546,7 +546,7 @@
"name": "Bruk E2E-kryptering"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "Fest samtale"
},
"exclude_message_logger": {
"name": "Utelat fra meldingslogger"
@@ -595,7 +595,7 @@
},
"actions": {
"clean_snapchat_cache": {
- "name": "Clean Snapchat Cache",
+ "name": "Rens Snapchat-buffer",
"description": "Rengjør Snapchat Cache"
},
"manage_friend_list": {
@@ -645,7 +645,7 @@
"app_appearance": {
"always_light": "Alltid lys",
"always_dark": "Alltid mørk",
- "null": "Match System"
+ "null": "F?lg system"
},
"auto_reload": {
"snapchat_only": "Last bare Snapchat på nytt",
@@ -662,7 +662,7 @@
"auto_download": "⬇️ Automatisk nedlasting",
"auto_save": "💬 Lagre meldinger automatisk",
"unsaveable_messages": "⬇️ Ubesparelige meldinger",
- "auto_open_snaps": "📷 Auto Open Snaps",
+ "auto_open_snaps": "?? ?pne Snaps automatisk",
"stealth": "👻 Stealth-modus",
"auto_reply": "📨 Automatisk svar",
"auto_delete_sent_messages": "🗑️ Auto Slett Sendte meldinger",
@@ -716,7 +716,7 @@
"notifications": {
"chat_screenshot": "Skjermbilde",
"chat_screen_record": "Skjermopptak",
- "snap_replay": "Snap Replay",
+ "snap_replay": "Snap-avspilling",
"camera_roll_save": "Kamerarulle Lagre",
"chat": "Chat",
"chat_reply": "Chat Svar",
@@ -733,43 +733,43 @@
"map_live_location": "Kart Live Beliggenhet"
},
"auto_read": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"hide_typing_indicator": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"auto_delete_sent_messages": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"auto_download": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"stealth": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"auto_save": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"message_logger": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"auto_reply": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svarteliste",
+ "whitelist": "Hviteliste",
"disabled": "Deaktivert"
},
"custom_android_id": {
@@ -888,17 +888,17 @@
"null": "Automatisk"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatisk"
},
"snapchat_plus": {
"not_subscribed": "Ikke Abonnert",
"basic": "Grunnleggende",
- "ad_free": "Ad Free",
+ "ad_free": "Reklamefri",
"null": "Standard"
},
"bypass_video_length_restriction": {
"single": "Enkeltmedier",
- "split": "Split media",
+ "split": "Del opp media",
"null": "Standard"
},
"old_bitmoji_selfie": {
@@ -990,7 +990,7 @@
"message_types": {
"CHAT": "Chat",
"SNAP": "Snap",
- "NOTE": "Note",
+ "NOTE": "Notat",
"EXTERNAL_MEDIA": "Eksterne medier",
"STICKER": "Klistremerke"
},
@@ -1016,19 +1016,19 @@
"friendly, casual, helpful, empathetic": "vennlig, casual, hjelpsom, empatisk"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Uformell",
"formal": "Formell",
"friendly": "Vennlig",
"humorous": "Humorøs",
"empathetic": "Empatisk",
- "toxic": "Edgy",
+ "toxic": "Kantete",
"busy": "Opptatt"
},
"ai_temperature": {
"0.7": "Balansert (0,7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatisk",
"en": "Norsk",
"es": "Spansk",
"fr": "Fransk",
@@ -1085,12 +1085,12 @@
"auto_reply_content_types": {
"chat_messages": "Chatmeldinger",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
+ "story_share_messages": "Story-deling",
"story_reply_messages": "Story Svar",
"external_media_messages": "Eksterne medier",
"voice_note_messages": "Stemmenotater",
"sticker_messages": "Klistremerker",
- "tiny_snap_messages": "Tiny Snaps",
+ "tiny_snap_messages": "Mini-snaps",
"map_reaction_messages": "Kart Reaksjoner",
"half_swipes": "Halvstrekk"
},
@@ -1139,7 +1139,7 @@
"description": "Angi koordinatene for den spekulerte plasseringen"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "G?-radius",
"description": "Tilfeldig gå rundt i denne radiusen (ft)"
},
"always_update_location": {
@@ -1181,7 +1181,7 @@
"description": "Slår av bildekomprimering når du laster opp medier"
},
"custom_image_upload_format": {
- "name": "Custom Image Upload Format",
+ "name": "Tilpasset bildeopplastingsformat",
"description": "Angi et egendefinert bildeopplastingsformat\nVelg et tapsfritt format (som PNG) for den beste kvaliteten"
}
}
@@ -1191,7 +1191,7 @@
"description": "Bekreft automatisk valgte handlinger"
},
"auto_updater": {
- "name": "Auto Updater",
+ "name": "Auto-oppdaterer",
"description": "Kontroller automatisk for nye oppdateringer"
},
"update_settings": {
@@ -1210,7 +1210,7 @@
"name": "UI-innstillinger",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Haptisk tilbakemelding"
}
}
},
@@ -1281,7 +1281,7 @@
}
},
"downloader": {
- "name": "Downloader",
+ "name": "Nedlaster",
"description": "Last ned Snapchat Media",
"properties": {
"save_folder": {
@@ -1543,7 +1543,7 @@
"description": "Hopper automatisk til neste Snap når det markeres en Snap som sett.\nBruk i kombinasjon med Mark Snap som sett knapp"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "Loop av medieavspilling",
"description": "Loops media avspilling når du ser Snaps / Historier"
},
"disable_replay_in_ff": {
@@ -1647,7 +1647,7 @@
"description": "Forhindrer at dine egne meldinger slettes"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Automatisk rensing",
"description": "Sletter automatisk cachede meldinger som er eldre enn angitt tid"
},
"message_filter": {
@@ -1713,7 +1713,7 @@
}
},
"strip_media_metadata": {
- "name": "Strip Media Metadata",
+ "name": "Fjern mediametadata",
"description": "Fjerner metadata av medier før du sender som melding"
},
"bypass_message_retention_policy": {
@@ -1729,7 +1729,7 @@
"description": "Tillater deg å vise gruppeinformasjon etter å ha blitt sparket"
},
"double_tap_chat_action": {
- "name": "Double Tap Chat Action",
+ "name": "Dobbelttrykk-chat-handling",
"description": "Utfører en egendefinert handling når dobbelt trykk på en melding i chat"
},
"double_tap_chat_action_custom_emoji": {
@@ -1781,7 +1781,7 @@
"description": "Systemprompt som definerer AIs personlighet og oppførsel"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "AI maks tokens",
"description": "Maksimalt antall tokens (ord) AI kan bruke i svar"
},
"ai_temperature": {
@@ -1793,11 +1793,11 @@
"description": "Antall tidligere meldinger som skal inkluderes som kontekst for AI-svar"
},
"ai_personality_traits": {
- "name": "AI Personality Traits",
+ "name": "AI-personlighetstrekk",
"description": "Kommaseparerte personlighetstrekk for AI (f.eks. vennlig, uformell, hjelpsom)"
},
"ai_response_style": {
- "name": "AI Response Style",
+ "name": "AI-svarstil",
"description": "Samlet stil for AI svar"
},
"ai_response_language": {
@@ -1839,7 +1839,7 @@
"description": "Hellig tekst å bruke når venn spesifikk hilsen er aktivert"
},
"auto_reply_content_types": {
- "name": "Auto Reply Triggers",
+ "name": "Auto-svar-utl?sere",
"description": "Velg hvilke meldingstyper som skal utløse automatisk"
},
"chat_messages": {
@@ -1991,7 +1991,7 @@
"description": "Paus oversettelse når tjenesten er blokkert"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Maks antall fors?k",
"description": "Maksimalt antall forsøk"
},
"retry_delay": {
@@ -2068,7 +2068,7 @@
"description": "Angi en egendefinert kameraoppløsning, bredde x høyde (f.eks. 1920x1080).\nTilpasset oppløsning må støttes av enheten"
},
"front_custom_frame_rate": {
- "name": "Front Custom Frame Rate",
+ "name": "Tilpasset bildefrekvens foran",
"description": "Overstyrer frontkamerarammehastigheten"
},
"back_custom_frame_rate": {
@@ -2112,7 +2112,7 @@
"description": "Eksperimentelle funksjoner",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
+ "name": "Native hooks",
"description": "Usikre funksjoner som kroker inn i Snapchats opprinnelige kode",
"properties": {
"composer_hooks": {
@@ -2180,7 +2180,7 @@
"description": "Overstyr Android-ID-en sendt til Snapchat",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Spoof Android-ID",
"description": "Overstyr Android-ID-en som sendes til Snapchat med en egendefinert verdi"
},
"custom_android_id": {
@@ -2204,15 +2204,15 @@
"description": "Konverterer snaps til chat eksterne medier lokalt. Dette vises i chat nedlastings-menyen"
},
"media_file_picker": {
- "name": "Media File Picker",
+ "name": "Mediefilvelger",
"description": "La deg velge en video/audio-fil fra galleriet"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Story-logg",
"description": "Gir en historie av venner historier"
},
"call_recorder": {
- "name": "Call Recorder",
+ "name": "Samtalsopptaker",
"description": "Opptak av lydsamtaler automatisk"
},
"account_switcher": {
@@ -2252,7 +2252,7 @@
"description": "Lar deg legge til notater til venner profiler"
},
"cof_experiments": {
- "name": "COF Experiments",
+ "name": "COF-eksperimenter",
"description": "Aktiverer uutgitte/beta Snapchat-funksjoner"
},
"context_menu_fix": {
@@ -2260,7 +2260,7 @@
"description": "Prøv å reparere Venn Feed-menyen som når enheten er frakoblet kan den ikke vises riktig"
},
"app_lock": {
- "name": "App Lock",
+ "name": "App-l?s",
"description": "Forhindrer tilgang til Snapchat uten kode",
"properties": {
"lock_on_resume": {
@@ -2270,7 +2270,7 @@
}
},
"infinite_story_boost": {
- "name": "Infinite Story Boost",
+ "name": "Uendelig Story-boost",
"description": "Overgå historien Boost Limit forsinkelse"
},
"meo_passcode_bypass": {
@@ -2322,7 +2322,7 @@
}
},
"scripting": {
- "name": "Scripting",
+ "name": "Skripting",
"description": "Kjør egendefinerte skript for å utvide PurrfectSnap",
"properties": {
"developer_mode": {
@@ -2364,7 +2364,7 @@
"description": "La sporeren kjøre i bakgrunnen. Merk: Dette vil betydelig drenere batteriet ditt"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Automatisk rensing",
"description": "Sletter automatisk cachede hendelser som er eldre enn den angitte tiden"
}
}
@@ -2402,29 +2402,29 @@
"FAMILY_CENTER_ACCEPT": "Familiesenter aksepterer",
"FAMILY_CENTER_LEAVE": "Familiesenter",
"STATUS_PLUS_GIFT": "Status Plus-gave",
- "TINY_SNAP": "Tiny Snap",
+ "TINY_SNAP": "Mini-snap",
"STATUS_COUNTDOWN": "Nedtelling",
"MAP_REACTION": "Kart Reaksjon",
"chat_messages": "Chatmeldinger",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
+ "story_share_messages": "Story-deling",
"story_reply_messages": "Story Svar",
"external_media_messages": "Eksterne medier",
"voice_note_messages": "Stemmenote",
"sticker_messages": "Klistremerke",
- "tiny_snap_messages": "Tiny Snap",
+ "tiny_snap_messages": "Mini-snap",
"map_reaction_messages": "Kart Reaksjon",
"half_swipes": "Halvstrekk"
},
"media_download_source": {
"none": "Ingen",
"pending": "Venter",
- "chat_media": "Chat Media",
+ "chat_media": "Chat-medier",
"story": "Story",
"public_story": "Offentlig historie",
"spotlight": "Spotlight",
"profile_picture": "Profilbilde",
- "story_logger": "Story Logger",
+ "story_logger": "Story-logg",
"message_logger": "Meldingslogger",
"merged": "Flettet",
"voice_call": "Stemmesamtale"
@@ -2553,7 +2553,7 @@
"deleted": "Slettet",
"business_accounts": "Forretningskontoer",
"streaks": "Streaks",
- "non_streaks": "Non Streaks",
+ "non_streaks": "Uten streaks",
"followed": "Følgt",
"following": "Følger",
"location_on_map": "Beliggenhet på kart"
@@ -2562,7 +2562,7 @@
"none": "Ingen",
"username": "Brukernavn",
"added_timestamp": "Lagt til Timestamp",
- "snap_score": "Snap Score",
+ "snap_score": "Snap-poeng",
"streak_length": "Streak Lengde",
"most_messages_sent": "De fleste meldinger sendt",
"most_recent_message": "Siste melding",
@@ -2619,10 +2619,10 @@
"message_reaction_add": "Meldingsreaksjon Legg til",
"message_reaction_remove": "Meldingsreaksjon Fjern",
"snap_opened": "Snap åpnet",
- "snap_replayed": "Snap Replayed",
+ "snap_replayed": "Snap spilt av igjen",
"snap_replayed_twice": "Snap Replayed to ganger",
"snap_screenshot": "Snap skjermbilde",
- "snap_screen_record": "Snap Screen Record",
+ "snap_screen_record": "Snap-skjermopptak",
"i_can_see_you": "Jeg kan se deg"
},
"cleared_from_feed": "Fjernet fra fôr",
@@ -2660,8 +2660,8 @@
"sticker": "Klistremerke",
"gif": "GIF",
"external_media": "Eksterne medier",
- "note": "Note",
- "original_story": "Original Story"
+ "note": "Notat",
+ "original_story": "Original-story"
},
"select_attachments_title": "Velg vedlegg",
"download_started_toast": "Last ned startet",
@@ -2721,7 +2721,7 @@
},
"auto_open_snaps": {
"title": "Åpne snaps automatisk",
- "priority_title": "Auto Open Snaps (Priority)",
+ "priority_title": "?pne Snaps automatisk (prioritet)",
"error_title": "Åpne snaps automatisk (feil)",
"channel_description": "Varsler for automatisk åpnende snaps kø status",
"priority_channel_description": "Høy prioritetsvarsler for auto-åpning snaps",
@@ -2759,7 +2759,7 @@
"notification_statistics": "STATISTIK",
"notification_queue_size": "Køstørrelse",
"notification_total_opened": "Total Snaps åpnet",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "K?FORH?NDSVISNING",
"notification_processing_continue": "Behandling vil fortsette automatisk...",
"notification_no_snaps_queue": "Ingen snaps i kø.",
"notification_queue_cleared_opened": "Køyeklart ({opened}åpnet)",
@@ -2948,7 +2948,7 @@
"types": {
"username": "Brukernavn",
"conversation": "Kontakt",
- "event": "Event"
+ "event": "Hendelse"
},
"event_types": {
"conversation_enter": "Entert samtale",
@@ -2967,7 +2967,7 @@
"message_reaction_add": "Legg til reaksjon",
"message_reaction_remove": "Fjernet reaksjon",
"snap_opened": "Åpnet snap",
- "snap_replayed": "Replayed snap",
+ "snap_replayed": "Spilte av snap igjen",
"snap_replayed_twice": "Replayed snap to ganger",
"snap_screenshot": "Tatt skjermbilde",
"snap_screen_record": "Skjermen registrert"
@@ -2993,7 +2993,7 @@
"in_conversation": "i{conversation}",
"unknown_user": "Ukjend",
"unknown_conversation": "DMs",
- "i_can_see_you_entered": "Entered",
+ "i_can_see_you_entered": "Gikk inn",
"i_can_see_you_left": "Venstre",
"i_can_see_you_duration": "Varighet",
"i_can_see_you_not_available": "N/A",
@@ -3018,7 +3018,7 @@
"message_reaction_add": "tilsatt en reaksjon",
"message_reaction_remove": "fjernet en reaksjon",
"snap_opened": "åpnet en snap",
- "snap_replayed": "replayed a snap",
+ "snap_replayed": "spilte av en snap igjen",
"snap_replayed_twice": "replayed a snap to ganger",
"snap_screenshot": "ta et skjermbilde",
"snap_screen_record": "skjerm innspilt",
@@ -3029,10 +3029,10 @@
"edit_rule": {
"custom_rule": "Egendefinert regel",
"scope": "Område",
- "events": "Events",
+ "events": "Hendelser",
"add_event": "Legg til hendelse",
"type": "Type",
- "triggers": "Triggers",
+ "triggers": "Utl?sere",
"conditions": "Betingelser",
"only_inside_conversation": "Først når jeg er inne i samtalen",
"only_outside_conversation": "Først når jeg er utenfor samtale",
@@ -3064,13 +3064,13 @@
}
},
"ui_settings_title": "UI-innstillinger",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptisk tilbakemelding",
"updates_title": "Oppdateringer",
"auto_update_check": "Automatisk oppdateringskontroll",
"update_check_frequency_daily": "Daglig",
"update_check_frequency_weekly": "Uken",
"update_check_frequency_monthly": "Månedlig",
- "update_channel_stable": "Stable",
+ "update_channel_stable": "Stabil",
"update_channel_prerelease": "Forutsetning",
"friend_notes_title": "Vennnotater",
"friend_notes_description": "Administrere og sikkerhetskopiere dine vennenotater",
@@ -3182,7 +3182,7 @@
"failed_to_edit_message": "Klarte ikke å redigere melding:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Uformell",
"formal": "Formell",
"friendly": "Vennlig",
"humorous": "Humorøs",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/nl.json b/common/src/main/assets/lang/nl.json
index 62baaabf..ddeb12d3 100644
--- a/common/src/main/assets/lang/nl.json
+++ b/common/src/main/assets/lang/nl.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Taal selecteren",
@@ -30,7 +30,7 @@
"home": "Begin",
"home_about": "Info",
"home_settings": "Instellingen",
- "home_logs": "Logs",
+ "home_logs": "Logboeken",
"logger_history": "Loggergeschiedenis",
"logged_stories": "Gelogde verhalen",
"friend_tracker": "Vriend Tracker",
@@ -52,13 +52,13 @@
"customize_bottom_bar_subtitle": "Kies welke tabbladen getoond worden op uw startscherm",
"available_tabs_title": "Beschikbare tabbladen",
"shown_tabs_title": "Tabbladen tonen",
- "reset_button": "Reset",
+ "reset_button": "Resetten",
"done_button": "Klaar"
},
"sections": {
"home": {
"version_title": "v{versionName}· door Eternal",
- "update_title": "PurrfectSnap Update",
+ "update_title": "PurrfectSnap-update",
"update_content": "Versie{version}is beschikbaar!",
"update_button": "Downloaden",
"debug_build_summary_title": "U draait een debug bouw van PurrfectSnap",
@@ -92,7 +92,7 @@
"update_check_frequency_weekly": "Wekelijks",
"update_check_frequency_monthly": "Maandelijks",
"update_channel_stable": "Stabiel",
- "update_channel_prerelease": "Pre-release",
+ "update_channel_prerelease": "Vooruitgave",
"update_notification_channel_name": "Bijwerken",
"update_notification_channel_description": "Waarschuwen wanneer nieuwe releases beschikbaar zijn",
"update_notification_title": "Nieuwe update beschikbaar",
@@ -113,7 +113,7 @@
"customize_bottom_bar_title": "Onderbalk aanpassen",
"customize_bottom_bar_subtitle": "Kies welke tabbladen getoond worden op uw startscherm",
"available_tabs_title": "Beschikbare tabbladen",
- "reset_button": "Reset",
+ "reset_button": "Resetten",
"done_button": "Klaar",
"clear_friend_feed": "Vriend Feed wissen",
"test_mode_label": "PurrAura inschakelen",
@@ -136,7 +136,7 @@
"disabled": "Uitgeschakeld",
"export_option": "Uitvoer",
"import_option": "Importeren",
- "reset_option": "Reset",
+ "reset_option": "Resetten",
"config_export_success_toast": "Configureren met succes",
"config_import_success_toast": "Configureren met succes",
"config_import_failure_toast": "Kon config niet importeren{error}",
@@ -360,7 +360,7 @@
},
"friend_tracker": {
"rules_tab": "Regels",
- "logs_tab": "Logs",
+ "logs_tab": "Logboeken",
"catalog_button": "Catalogus",
"add_rule_button": "Regel toevoegen",
"import_button": "Importeren",
@@ -711,7 +711,7 @@
"started": "Gestart",
"success": "Succes",
"progress": "Voortgang",
- "failure": "Failure"
+ "failure": "Mislukking"
},
"notifications": {
"chat_screenshot": "Schermafdruk",
@@ -734,42 +734,42 @@
},
"auto_read": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"hide_typing_indicator": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"auto_delete_sent_messages": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"auto_download": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"stealth": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"auto_save": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"message_logger": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"auto_reply": {
"blacklist": "Zwarte lijst",
- "whitelist": "Whitelist",
+ "whitelist": "Witte lijst",
"disabled": "Uitgeschakeld"
},
"custom_android_id": {
@@ -888,7 +888,7 @@
"null": "Automatisch"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatisch"
},
"snapchat_plus": {
"not_subscribed": "Niet ingeschreven",
@@ -1016,7 +1016,7 @@
"friendly, casual, helpful, empathetic": "vriendelijk, casual, behulpzaam, empathisch"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Informeel",
"formal": "Formele",
"friendly": "Vriendelijk",
"humorous": "Humoristisch",
@@ -1028,7 +1028,7 @@
"0.7": "Gebalanceerd (0,7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatisch",
"en": "Engels",
"es": "Spaans",
"fr": "Frans",
@@ -1050,7 +1050,7 @@
"fi": "Fins"
},
"friendGreeting": {
- "Hey": "Hey"
+ "Hey": "Hoi"
},
"half_swipe_messages": {
"[\"I noticed you half-swiped! I'll respond soon.\"]": "Ik zag dat je halfgeknipt was. Ik zal snel reageren."
@@ -1445,7 +1445,7 @@
"description": "Selecteer welke UI-componenten te verbergen zijn"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "Opera Media snelinfo",
"description": "Toont nuttige informatie van media zoals aanmaakdatum in het contextmenu van de operaviewer"
},
"old_bitmoji_selfie": {
@@ -1713,7 +1713,7 @@
}
},
"strip_media_metadata": {
- "name": "Strip Media Metadata",
+ "name": "Metadata van media verwijderen",
"description": "Verwijdert metadata van media voordat u als bericht verstuurt"
},
"bypass_message_retention_policy": {
@@ -1761,7 +1761,7 @@
"description": "Gebruik AI om intelligente automatische antwoorden te genereren in plaats van sjabloonberichten"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "AI-provider",
"description": "Selecteer welke AI-service moet worden gebruikt voor het genereren van antwoorden"
},
"ai_endpoint_url": {
@@ -1781,7 +1781,7 @@
"description": "Systeemprompt die de persoonlijkheid en het gedrag van de AI definieert"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "AI max tokens",
"description": "Maximum aantal tokens (woorden) dat de AI kan gebruiken in antwoorden"
},
"ai_temperature": {
@@ -1991,7 +1991,7 @@
"description": "Vertaling pauzeren bij geblokkeerde dienst"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Max. herhalingen",
"description": "Maximum aantal herhalingspogingen"
},
"retry_delay": {
@@ -2112,7 +2112,7 @@
"description": "Experimentele kenmerken",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
+ "name": "Native hooks",
"description": "Onveilige functies die Snapchat's native code haaken",
"properties": {
"composer_hooks": {
@@ -2124,7 +2124,7 @@
"description": "Toont de eerste aangemaakte gebruikersnaam naast de huidige gebruikersnaam in de profielpagina"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera Roll Limit",
+ "name": "Camerarol-limiet omzeilen",
"description": "Verhoogt de maximale hoeveelheid media die u vanaf de camerarol kunt verzenden"
},
"custom_self_destruct_snap_delay": {
@@ -2180,7 +2180,7 @@
"description": "Android-ID naar Snapchat negeren",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Android-ID spoofen",
"description": "De Android-ID die naar Snapchat wordt verzonden met een aangepaste waarde negeren"
},
"custom_android_id": {
@@ -2208,7 +2208,7 @@
"description": "Hiermee kunt u een video/audiobestand uit de galerij te kiezen"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Story-logger",
"description": "Biedt een geschiedenis van vrienden verhalen"
},
"call_recorder": {
@@ -2238,7 +2238,7 @@
"description": "De voorkeurstaal voor het voicenote transcript (bv. EN, ES, FR)"
},
"notification_transcript": {
- "name": "Notification Transcript",
+ "name": "Notificatietranscript",
"description": "Voice notes overschrijven in meldingen\nDeze functie vereist dat de Chat Preview functie wordt ingeschakeld in betere meldingen"
}
}
@@ -2322,7 +2322,7 @@
}
},
"scripting": {
- "name": "Scripting",
+ "name": "Scripten",
"description": "Aangepaste scripts uitvoeren om PurrfectSnap te verlengen",
"properties": {
"developer_mode": {
@@ -2401,7 +2401,7 @@
"FAMILY_CENTER_INVITE": "Uitnodiging familiecentrum",
"FAMILY_CENTER_ACCEPT": "Familiecentrum accepteren",
"FAMILY_CENTER_LEAVE": "Familiecentrumverlof",
- "STATUS_PLUS_GIFT": "Status Plus Gift",
+ "STATUS_PLUS_GIFT": "Status Plus-cadeau",
"TINY_SNAP": "Kleine snap",
"STATUS_COUNTDOWN": "Aftellen",
"MAP_REACTION": "Kaartreactie",
@@ -2410,7 +2410,7 @@
"story_share_messages": "Story-aandelen",
"story_reply_messages": "Verhaal Antwoorden",
"external_media_messages": "Externe media",
- "voice_note_messages": "Voice Note",
+ "voice_note_messages": "Spraakbericht",
"sticker_messages": "Sticker",
"tiny_snap_messages": "Kleine snap",
"map_reaction_messages": "Kaartreactie",
@@ -2424,7 +2424,7 @@
"public_story": "Publiek verhaal",
"spotlight": "Spotlight",
"profile_picture": "Profielafbeelding",
- "story_logger": "Story Logger",
+ "story_logger": "Story-logger",
"message_logger": "Berichtlogger",
"merged": "Samengevoegd",
"voice_call": "Stemgesprek"
@@ -2596,7 +2596,7 @@
"negative": "Nee",
"cancel": "Annuleren",
"save": "Opslaan",
- "open": "Open",
+ "open": "Openen",
"download": "Downloaden",
"send": "Verzenden",
"restore_original": "Origineel herstellen",
@@ -2627,7 +2627,7 @@
},
"cleared_from_feed": "Ontruimd van voer",
"tracker_actions": {
- "log": "Log",
+ "log": "Loggen",
"in_app_notification": "In-App kennisgeving",
"push_notification": "Aanmelding pushen",
"custom": "Aangepast"
@@ -2679,7 +2679,7 @@
"failed_gallery_toast": "Opslaan in galerij is mislukt{error}",
"dash_no_chapter": "Geen hoofdstuk gevonden",
"dash_dialog": {
- "title": "Download dash media",
+ "title": "Dash-media downloaden",
"download_all": "Alles downloaden",
"segment_text": "Segment{from}-{to}"
}
@@ -2759,7 +2759,7 @@
"notification_statistics": "STATISTIEK",
"notification_queue_size": "Wachtrijgrootte",
"notification_total_opened": "Totaal aantal geopende snaps",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "WACHTRIJ-VOORBEELD",
"notification_processing_continue": "De verwerking gaat automatisch door...",
"notification_no_snaps_queue": "Geen kiekjes in de rij.",
"notification_queue_cleared_opened": "Wachtrij is leeg ({opened}geopend)",
@@ -2921,7 +2921,7 @@
},
"tracker": {
"tabs": {
- "logs": "Logs",
+ "logs": "Logboeken",
"rules": "Regels"
},
"actions": {
@@ -3071,7 +3071,7 @@
"update_check_frequency_weekly": "Wekelijks",
"update_check_frequency_monthly": "Maandelijks",
"update_channel_stable": "Stabiel",
- "update_channel_prerelease": "Pre-release",
+ "update_channel_prerelease": "Vooruitgave",
"friend_notes_title": "Vriendelijke opmerkingen",
"friend_notes_description": "Beheer en backup van uw vriend notities",
"app_theme_title": "App-thema",
@@ -3170,7 +3170,7 @@
},
"debug_dialogs": {
"info": "Informatie",
- "refs": "Refs",
+ "refs": "Referenties",
"arroyo": "Arroyo",
"message": "Bericht",
"media_references": "Media Referenties",
@@ -3182,7 +3182,7 @@
"failed_to_edit_message": "Bewerken van bericht mislukt:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Informeel",
"formal": "Formele",
"friendly": "Vriendelijk",
"humorous": "Humoristisch",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/pl.json b/common/src/main/assets/lang/pl.json
index 5ae40c61..c4107803 100644
--- a/common/src/main/assets/lang/pl.json
+++ b/common/src/main/assets/lang/pl.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Wybierz język",
@@ -52,7 +52,7 @@
"customize_bottom_bar_subtitle": "Wybierz, które karty pokazać na ekranie",
"available_tabs_title": "Dostępne karty",
"shown_tabs_title": "Pokazane karty",
- "reset_button": "Reset",
+ "reset_button": "Resetuj",
"done_button": "Gotowe"
},
"sections": {
@@ -84,7 +84,7 @@
"clear_button": "Czysto",
"view_logger_history_button": "Widok Historia logowania",
"ui_settings_title": "Ustawienia interfejsu użytkownika",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptyczne sprz??enie zwrotne",
"use_system_toasts_label": "Użyj tostów systemowych",
"updates_title": "Aktualizacje",
"auto_update_check": "Automatyczne sprawdzanie aktualizacji",
@@ -113,9 +113,9 @@
"customize_bottom_bar_title": "Dostosuj pasek dolny",
"customize_bottom_bar_subtitle": "Wybierz, które karty pokazać na ekranie",
"available_tabs_title": "Dostępne karty",
- "reset_button": "Reset",
+ "reset_button": "Resetuj",
"done_button": "Gotowe",
- "clear_friend_feed": "Clear Friend Feed",
+ "clear_friend_feed": "Wyczy?? kana? znajomych",
"test_mode_label": "Włącz PurrAura",
"disable_feature_loading_label": "Wyłącz ładowanie funkcji",
"disable_auto_mapper_label": "Wyłącz automapper",
@@ -135,8 +135,8 @@
"features": {
"disabled": "Wyłączone",
"export_option": "Eksport",
- "import_option": "Import",
- "reset_option": "Reset",
+ "import_option": "Importuj",
+ "reset_option": "Resetuj",
"config_export_success_toast": "Konfiguracja eksportowana pomyślnie",
"config_import_success_toast": "Konfiguracja importowana pomyślnie",
"config_import_failure_toast": "Nie udało się zaimportować pliku konfiguracyjnego{error}",
@@ -310,7 +310,7 @@
"downloading_script": "Pobieranie skryptu...",
"edit_module_button": "Edycja",
"enter_url_label": "Wprowadź URL",
- "import_button": "Import",
+ "import_button": "Importuj",
"import_from_url_button": "Importuj z URL",
"import_script_from_url_title": "Importuj skrypt z URL",
"import_script_warning": "Zainstaluj skrypty tylko ze źródeł, którym ufasz.",
@@ -363,10 +363,10 @@
"logs_tab": "Logi",
"catalog_button": "Katalog",
"add_rule_button": "Dodaj zasadę",
- "import_button": "Import",
+ "import_button": "Importuj",
"filters_title": "Filtry",
"search_by_label": "Szukaj",
- "newest_first_label": "Newest first",
+ "newest_first_label": "Najnowsze najpierw",
"since_label": "Od",
"until_label": "Do",
"unit_label": "Jednostka",
@@ -438,7 +438,7 @@
},
"friend_tracker_import": {
"title": "Importuj śledzenie znajomych",
- "confirm_button": "Import",
+ "confirm_button": "Importuj",
"back_button_description": "Wracaj",
"expand_button_description": "Kategoria rozszerzania lub załamania",
"imported_toast": "Tracker importowany",
@@ -479,7 +479,7 @@
"config_import": {
"title": "Importuj podsumowanie konfiguracji",
"back_button_description": "Wracaj",
- "confirm_button": "Import",
+ "confirm_button": "Importuj",
"expand_button_description": "Kategoria rozszerzania lub załamania",
"enabled": "Włączone",
"disabled": "Wyłączone",
@@ -615,7 +615,7 @@
"description": "Wykonuje operacje takie jak usuwanie przyjaciół lub masowe usuwanie rozmów"
},
"regen_mappings": {
- "name": "Regenerate Mappings",
+ "name": "Regeneruj mapowania",
"description": "Mappingi regenerowane ręcznie"
},
"change_language": {
@@ -734,42 +734,42 @@
},
"auto_read": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"hide_typing_indicator": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"auto_delete_sent_messages": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"auto_download": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"stealth": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"auto_save": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"message_logger": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"auto_reply": {
"blacklist": "Czarna lista",
- "whitelist": "Whitelist",
+ "whitelist": "Lista dozwolonych",
"disabled": "Wyłączone"
},
"custom_android_id": {
@@ -888,12 +888,12 @@
"null": "Automatyczne"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatycznie"
},
"snapchat_plus": {
"not_subscribed": "Nie subskrybowane",
"basic": "Podstawowe",
- "ad_free": "Ad Free",
+ "ad_free": "Bez reklam",
"null": "Domyślne"
},
"bypass_video_length_restriction": {
@@ -909,7 +909,7 @@
"disable_confirmation_dialogs": {
"erase_message": "Usuń wiadomość",
"remove_friend": "Usuń przyjaciela",
- "block_friend": "Block Friend",
+ "block_friend": "Zablokuj znajomego",
"ignore_friend": "Ignoruj Przyjaciela",
"hide_friend": "Ukryj przyjaciela",
"hide_conversation": "Ukryj rozmowę",
@@ -1021,14 +1021,14 @@
"friendly": "Przyjazny",
"humorous": "Zabawny",
"empathetic": "Empatia",
- "toxic": "Edgy",
+ "toxic": "Ostry",
"busy": "Zajęty"
},
"ai_temperature": {
"0.7": "Zbalansowany (0,7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatycznie",
"en": "Angielski",
"es": "Hiszpański",
"fr": "Francuski",
@@ -1092,7 +1092,7 @@
"sticker_messages": "Naklejki",
"tiny_snap_messages": "Małe trzaski",
"map_reaction_messages": "Reakcje mapy",
- "half_swipes": "Half Swipes"
+ "half_swipes": "Po?owiczne przesuni?cia"
},
"supported_languages": {
"en": "Angielski",
@@ -1112,7 +1112,7 @@
"translation_position": {
"above": "Powyższy tekst",
"below": "Poniżej tekstu",
- "inline": "Inline"
+ "inline": "W linii"
},
"source_language": {
"auto": "Wykrywanie automatycznie"
@@ -1139,7 +1139,7 @@
"description": "Ustaw współrzędne lokalizacji"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "Promie? chodzenia",
"description": "Losowo chodzić w tym promieniu (ft)"
},
"always_update_location": {
@@ -1191,7 +1191,7 @@
"description": "Automatycznie potwierdza wybrane działania"
},
"auto_updater": {
- "name": "Auto Updater",
+ "name": "Auto-aktualizator",
"description": "Automatyczne sprawdzanie nowych aktualizacji"
},
"update_settings": {
@@ -1210,7 +1210,7 @@
"name": "Ustawienia interfejsu użytkownika",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Haptyczne sprz??enie zwrotne"
}
}
},
@@ -1341,7 +1341,7 @@
"description": "Ilość wątków do użycia"
},
"preset": {
- "name": "Preset",
+ "name": "Ustawienie wst?pne",
"description": "Ustaw prędkość konwersji"
},
"constant_rate_factor": {
@@ -1399,7 +1399,7 @@
"description": "Wyświetla mały podgląd obok niewidocznych Zatrzasków w czacie"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Nadpisanie bootstrap",
"description": "Przekroczenie ustawień interfejsu użytkownika bootstrap",
"properties": {
"app_appearance": {
@@ -1449,7 +1449,7 @@
"description": "Pokazuje użyteczne informacje o mediach, takie jak data utworzenia w menu kontekstowym przeglądarki operowej"
},
"old_bitmoji_selfie": {
- "name": "Old Bitmoji Selfie",
+ "name": "Stare selfie Bitmoji",
"description": "Przynosi Bitmoji selfie ze starszych wersji snapchat"
},
"disable_spotlight": {
@@ -1465,7 +1465,7 @@
"description": "Automatycznie zamyka menu Friend Feed po naciśnięciu przycisku nastawienia"
},
"vertical_story_viewer": {
- "name": "Vertical Story Viewer",
+ "name": "Pionowy podgl?d Story",
"description": "Włącza przeglądarkę pionową dla wszystkich historii"
},
"enable_friend_feed_menu_bar": {
@@ -1535,11 +1535,11 @@
"description": "Automatycznie oznacza wiadomości / zatrzaski jako przeczytane nawet wtedy, gdy włączony jest tryb stealth"
},
"mark_snap_as_seen_button": {
- "name": "Mark Snap as Seen Button",
+ "name": "Przycisk oznaczania Snap jako obejrzany",
"description": "Dodaje przycisk, aby zaznaczyć Snap, jak widać podczas oglądania.\nBędzie to działać nawet wtedy, gdy tryb stealth jest włączony"
},
"skip_when_marking_as_seen": {
- "name": "Skip When Marking as Seen",
+ "name": "Pomijaj przy oznaczaniu jako obejrzane",
"description": "Automatycznie przeskakuje do następnego Snap przy oznaczaniu Snap jak widać.\nUżyj w połączeniu z Mark Snap jako Seen Button"
},
"loop_media_playback": {
@@ -1674,7 +1674,7 @@
},
"snap": {
"name": "Pstryknięcia",
- "description": "Make snaps unsaveable"
+ "description": "Uczy? Snaps niezapisywalne"
},
"external_media": {
"name": "Media zewnętrzne",
@@ -1745,7 +1745,7 @@
"description": "Pozwala na automatyczną odpowiedź w tle. Notatka: To znacznie odsączy akumulator"
},
"cooldown_seconds": {
- "name": "Cooldown Seconds",
+ "name": "Sekundy odnowienia",
"description": "Minimalny czas między auto- odpowiedzi na tę samą rozmowę (w sekundach)"
},
"message_age_threshold": {
@@ -1777,7 +1777,7 @@
"description": "Klucz API do uwierzytelniania w serwisie AI"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "Prompt systemowy AI",
"description": "System prompt, który definiuje osobowość i zachowanie AI"
},
"ai_max_tokens": {
@@ -1847,7 +1847,7 @@
"description": "Automatyczne odpowiedzi dla wiadomości czatu tekstowego"
},
"snap_messages": {
- "name": "Snap Replies",
+ "name": "Odpowiedzi na Snap",
"description": "Automatyczne odpowiedzi na zatrzaski"
},
"story_share_messages": {
@@ -1871,7 +1871,7 @@
"description": "Automatyczne odpowiedzi na naklejki"
},
"tiny_snap_messages": {
- "name": "Tiny Snap Replies",
+ "name": "Odpowiedzi na ma?e Snapy",
"description": "Automatyczne odpowiedzi na małe trzaski"
},
"map_reaction_messages": {
@@ -1895,11 +1895,11 @@
"description": "Pozwala Auto Open Pstryknięcia uruchomić w tle. Notatka: To znacznie odsączy akumulator"
},
"min_delay": {
- "name": "Min Delay (ms)",
+ "name": "Min. op??nienie (ms)",
"description": "Minimalne opóźnienie w milisekundach przed otwarciem zatrzasku"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Maks. op??nienie (ms)",
"description": "Maksymalne opóźnienie w milisekundach przed otwarciem zatrzasku"
},
"queue_size": {
@@ -1991,7 +1991,7 @@
"description": "Zatrzymaj tłumaczenie, gdy usługa jest zablokowana"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Maks. liczba pr?b",
"description": "Maksymalna liczba prób powtórnych"
},
"retry_delay": {
@@ -2112,7 +2112,7 @@
"description": "Cechy doświadczalne",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
+ "name": "Native hooks",
"description": "Niebezpieczne funkcje, które podłączyć do natywnego kodu Snapchat",
"properties": {
"composer_hooks": {
@@ -2180,7 +2180,7 @@
"description": "Override Android ID wysłany do Snapchat",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Podszyj Android ID",
"description": "Przekrocz ID Android wysłany do Snapchat z wartością niestandardową"
},
"custom_android_id": {
@@ -2402,7 +2402,7 @@
"FAMILY_CENTER_ACCEPT": "Zaakceptuj Centrum Rodzinne",
"FAMILY_CENTER_LEAVE": "Centrum Rodzinne",
"STATUS_PLUS_GIFT": "Status Plus prezent",
- "TINY_SNAP": "Tiny Snap",
+ "TINY_SNAP": "Ma?y Snap",
"STATUS_COUNTDOWN": "Odliczanie",
"MAP_REACTION": "Mapa Reakcja",
"chat_messages": "Wiadomości czatowe",
@@ -2412,9 +2412,9 @@
"external_media_messages": "Media zewnętrzne",
"voice_note_messages": "Notatka głosowa",
"sticker_messages": "Naklejka",
- "tiny_snap_messages": "Tiny Snap",
+ "tiny_snap_messages": "Ma?y Snap",
"map_reaction_messages": "Mapa Reakcja",
- "half_swipes": "Half Swipes"
+ "half_swipes": "Po?owiczne przesuni?cia"
},
"media_download_source": {
"none": "Brak",
@@ -2514,8 +2514,8 @@
"actions": {
"remove_friends": "Usuń znajomych",
"clear_conversations": "Wyczyść konwersje",
- "clear_friend_feed": "Clear Friend Feed ({count})",
- "unfollow": "Unfollow",
+ "clear_friend_feed": "Wyczy?? kana? znajomych ({count})",
+ "unfollow": "Przesta? obserwowa?",
"remove": "Usuń"
},
"leave_groups": "Wyjdź{count}grupy",
@@ -2622,7 +2622,7 @@
"snap_replayed": "Snap replained",
"snap_replayed_twice": "Snap ponownie dwukrotnie",
"snap_screenshot": "Zrzut ekranu",
- "snap_screen_record": "Snap Screen Record",
+ "snap_screen_record": "Nagranie ekranu Snap",
"i_can_see_you": "Widzę cię"
},
"cleared_from_feed": "Oczyszczone z paszy",
@@ -2650,7 +2650,7 @@
"dialog_message": "Na pewno chcesz zadzwonić?"
},
"half_swipe_notifier": {
- "notification_channel_name": "Half Swipe",
+ "notification_channel_name": "P??przesuni?cie",
"notification_content_dm": "{friend}po prostu połowicznie wciśnięty do czatu{duration}sekund",
"notification_content_group": "{friend}po prostu połowicznie{group}zamiast{duration}sekund"
},
@@ -2728,7 +2728,7 @@
"error_channel_description": "Powiadomienia o błędach w przypadku awarii automatycznego otwierania",
"paused_status": "Automatyczne otwieranie zamków",
"processing_status": "Przetwarzanie pęknięć:{queued}w kolejce,{processed}przetworzone",
- "monitor_status": "Monitoring...",
+ "monitor_status": "Monitorowanie...",
"recent_snaps": "Ostatnie trzaski",
"action_pause": "Pauza",
"action_resume": "Wznowienie",
@@ -2739,7 +2739,7 @@
"paused_feedback": "Automatyczne otwieranie",
"resumed_message": "Przetwarzanie będzie kontynuowane automatycznie w kolejce zatrzasków",
"paused_message": "Przetwarzanie przerwane. Konserwacja kolejki ({count})",
- "status_paused": "Paused",
+ "status_paused": "Wstrzymane",
"status_monitoring": "Monitorowanie",
"status_active": "Aktywne",
"queue_cleared": "Kolejka oczyszczone i statystyki reset",
@@ -2751,7 +2751,7 @@
"unknown_user": "Nieznany użytkownik",
"content_type_external_media": "Media zewnętrzne",
"content_type_snap": "Snap",
- "conversation_type_friend_dm": "Friend DM",
+ "conversation_type_friend_dm": "DM znajomego",
"conversation_type_dm": "DM",
"conversation_type_group_chat": "Grupa czat",
"conversation_type_chat": "Rozmowa",
@@ -2883,7 +2883,7 @@
"translation_position": {
"above": "Powyżej",
"below": "Poniżej",
- "inline": "Inline"
+ "inline": "W linii"
},
"language_codes": {
"en": "Angielski",
@@ -2939,7 +2939,7 @@
"placeholder": "Szukaj"
},
"filters": {
- "newest_first": "Newest first",
+ "newest_first": "Najnowsze najpierw",
"pick_a_date": "Wybierz datę",
"title": "Filtry",
"search_by": "Szukaj",
@@ -3064,7 +3064,7 @@
}
},
"ui_settings_title": "Ustawienia interfejsu użytkownika",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptyczne sprz??enie zwrotne",
"updates_title": "Aktualizacje",
"auto_update_check": "Automatyczne sprawdzanie aktualizacji",
"update_check_frequency_daily": "Codziennie",
@@ -3111,7 +3111,7 @@
"import_script_from_url": "Importuj skrypt z URL",
"warning_imported_scripts": "Ostrzeżenie: Importowane skrypty mogą być szkodliwe dla urządzenia. Import skryptów tylko z zaufanych źródeł.",
"enter_url_here": "Podaj adres URL tutaj:",
- "import": "Import",
+ "import": "Importuj",
"cancel": "Anuluj",
"documentation": "Dokumentacja"
},
@@ -3127,7 +3127,7 @@
"no_friends_found": "Nie znaleziono przyjaciół",
"exporting_memories": "Eksportowanie wspomnień... ({failed}nieudany)"
},
- "clear_friend_feed": "Clear Friend Feed",
+ "clear_friend_feed": "Wyczy?? kana? znajomych",
"select_date": "Wybierz datę",
"schedule_scheduled_for": "Planowane{name}w{time}",
"schedule_sending_in": "Wysyłanie{time}",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/pt.json b/common/src/main/assets/lang/pt.json
index 484dc7ba..dc90b5e0 100644
--- a/common/src/main/assets/lang/pt.json
+++ b/common/src/main/assets/lang/pt.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Selecionar idioma",
@@ -182,7 +182,7 @@
"rules_title": "Regras",
"participants_text": "{count}participantes",
"not_found": "Não encontrado",
- "streaks_title": "Streaks",
+ "streaks_title": "Sequ?ncias",
"streaks_length_text": "Comprimento:{length}",
"streaks_expiration_text": "Expira em{eta}",
"streaks_expiration_text_expired": "Expirado",
@@ -305,7 +305,7 @@
"clear_module_data_failed": "Falha ao limpar os dados do módulo",
"delete_module_button": "Apagar",
"delete_module_failed": "Falha ao remover o módulo",
- "documentation_button": "Docs",
+ "documentation_button": "Documenta??o",
"download_script_failed": "Falha ao baixar o script",
"downloading_script": "A transferir o programa...",
"edit_module_button": "Editar",
@@ -716,7 +716,7 @@
"notifications": {
"chat_screenshot": "Imagem",
"chat_screen_record": "Ecrã Gravação",
- "snap_replay": "Snap Replay",
+ "snap_replay": "Reprodu??o de Snap",
"camera_roll_save": "Gravar o Rolo da Câmara",
"chat": "Conversar",
"chat_reply": "Responder à Conversa",
@@ -1021,7 +1021,7 @@
"friendly": "Amigável",
"humorous": "Humoroso",
"empathetic": "Empático",
- "toxic": "Edgy",
+ "toxic": "Agressivo",
"busy": "Ocupado"
},
"ai_temperature": {
@@ -1773,7 +1773,7 @@
"description": "Modelo de IA a usar para gerar respostas (por exemplo, gpt-3.5-turbo, gpt-4)"
},
"ai_api_key": {
- "name": "AI API Key",
+ "name": "Chave da API de IA",
"description": "Chave API para autenticação com o serviço de IA"
},
"ai_system_prompt": {
@@ -1817,7 +1817,7 @@
"description": "Usar mensagens de modelo se IA não gerar uma resposta"
},
"ai_request_timeout": {
- "name": "AI Request Timeout",
+ "name": "Tempo limite da solicita??o de IA",
"description": "Tempo máximo para esperar pela resposta de IA (em segundos)"
},
"ai_retry_attempts": {
@@ -2156,7 +2156,7 @@
}
},
"spoof": {
- "name": "Spoof",
+ "name": "Falsificar",
"description": "Spoof várias informações sobre você",
"properties": {
"play_store_installer_package_name": {
@@ -2180,7 +2180,7 @@
"description": "Sobrescrever o ID Android enviado para o Snapchat",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Falsificar ID do Android",
"description": "Sobrescrever o ID Android enviado para o Snapchat com um valor personalizado"
},
"custom_android_id": {
@@ -2401,7 +2401,7 @@
"FAMILY_CENTER_INVITE": "Convidar para o Centro Familiar",
"FAMILY_CENTER_ACCEPT": "Centro Familiar Aceitar",
"FAMILY_CENTER_LEAVE": "Centro de Família",
- "STATUS_PLUS_GIFT": "Status Plus Gift",
+ "STATUS_PLUS_GIFT": "Presente do Status Plus",
"TINY_SNAP": "Pequeno Snap",
"STATUS_COUNTDOWN": "Contagem regressiva",
"MAP_REACTION": "Reacção do Mapa",
@@ -2552,7 +2552,7 @@
"suggested": "Sugerido",
"deleted": "Apagado",
"business_accounts": "Contas de Negócios",
- "streaks": "Streaks",
+ "streaks": "Sequ?ncias",
"non_streaks": "Não Streaks",
"followed": "Seguido",
"following": "Seguir",
@@ -2562,7 +2562,7 @@
"none": "Nenhum",
"username": "Utilizador",
"added_timestamp": "Marca de tempo adicionada",
- "snap_score": "Snap Score",
+ "snap_score": "Pontua??o do Snap",
"streak_length": "Comprimento do Streak",
"most_messages_sent": "A maioria das mensagens enviadas",
"most_recent_message": "Mensagem mais recente",
@@ -2685,7 +2685,7 @@
}
},
"streaks_reminder": {
- "notification_title": "Streaks",
+ "notification_title": "Sequ?ncias",
"notification_text": "Vais perder o teu Streak com{friend}em{hoursLeft}horas"
},
"biometric_auth": {
@@ -2729,7 +2729,7 @@
"paused_status": "Abrir automaticamente os Snaps pausados",
"processing_status": "Processamento de encaixes:{queued}na fila,{processed}processado",
"monitor_status": "A monitorizar...",
- "recent_snaps": "Recent Snaps",
+ "recent_snaps": "Snaps recentes",
"action_pause": "Pausa",
"action_resume": "Continuar",
"action_clear": "Limpar fila",
@@ -2967,7 +2967,7 @@
"message_reaction_add": "Reacção adicionada",
"message_reaction_remove": "Reacção removida",
"snap_opened": "Abrir o encaixe",
- "snap_replayed": "Replayed snap",
+ "snap_replayed": "Reproduziu um snap",
"snap_replayed_twice": "Replayed snap duas vezes",
"snap_screenshot": "Tirar uma imagem",
"snap_screen_record": "Tela gravada"
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/ro.json b/common/src/main/assets/lang/ro.json
index 81cc152e..cc1d4ebe 100644
--- a/common/src/main/assets/lang/ro.json
+++ b/common/src/main/assets/lang/ro.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Alegeți limba",
@@ -115,7 +115,7 @@
"available_tabs_title": "Taburi disponibile",
"reset_button": "Reinițializează",
"done_button": "Gata",
- "clear_friend_feed": "Clear Friend Feed",
+ "clear_friend_feed": "Cur??? fluxul de prieteni",
"test_mode_label": "Activează PurrAura",
"disable_feature_loading_label": "Dezactivează încărcarea caracteristicilor",
"disable_auto_mapper_label": "Dezactivează Maper automat",
@@ -663,16 +663,17 @@
"auto_save": "Mesaje de salvare automată",
"unsaveable_messages": " Mesaje nesalvabile",
"auto_open_snaps": "Snaps Open Auto",
- "stealth": "👻 Stealth Mode",
+ "stealth": "?? Mod invizibil",
"auto_reply": "Răspuns automat",
"auto_delete_sent_messages": "Sterge automat mesajele trimise",
"mark_snaps_as_seen": " Mark Snaps așa cum se vede",
"mark_stories_as_seen_locally": " Mark Stories as seen local",
"conversation_info": "Informaţii de conversaţie",
"e2e_encryption": "Utilizați criptarea E2E",
- "message_logger": "📝 Message Logger",
- "auto_read": "✅ Auto Read",
- "hide_typing_indicator": "🙈 Hide Typing Indicator"
+ "message_logger": "?? Jurnal mesaje",
+ "auto_read": "? Citire automat?",
+ "hide_typing_indicator": "?? Ascunde indicatorul de tastare",
+ "stealth_mode": "?? Mod invizibil"
},
"schedule_scheduled_for": "Programat pentru{name}în{time}",
"schedule_sending_in": "Trimit{time}",
@@ -755,7 +756,8 @@
"stealth": {
"blacklist": "Lista neagră",
"whitelist": "Lista albă",
- "disabled": "Dezactivat"
+ "disabled": "Dezactivat",
+ "stealth": "?? Mod invizibil"
},
"auto_save": {
"blacklist": "Lista neagră",
@@ -892,13 +894,13 @@
},
"snapchat_plus": {
"not_subscribed": "Neabonat",
- "basic": "Basic",
+ "basic": "De baz?",
"ad_free": "Ad free",
"null": "Implicit"
},
"bypass_video_length_restriction": {
"single": "Medii unice",
- "split": "Split media",
+ "split": "?mparte media",
"null": "Implicit"
},
"old_bitmoji_selfie": {
@@ -909,7 +911,7 @@
"disable_confirmation_dialogs": {
"erase_message": "Șterge mesajul",
"remove_friend": "Elimină prietenul",
- "block_friend": "Block Friend",
+ "block_friend": "Blocheaz? prieten",
"ignore_friend": "Ignoră prietenul",
"hide_friend": "Ascunde prietenul",
"hide_conversation": "Ascunde conversația",
@@ -969,7 +971,7 @@
"auto_mark_as_read": {
"conversation_read": "Marchează conversația ca citită atunci când trimiți un mesaj",
"snap_reply": "Marca se fixează ca citit atunci când răspunde la ele",
- "save_snap_in_chat": "Mark plesnește ca citit atunci când le salva în chat în timp ce în Stealth Mode"
+ "save_snap_in_chat": "Marcheaz? snapurile ca v?zute c?nd le salvezi ?n chat ?n timp ce e?ti ?n Modul invizibil"
},
"friend_mutation_notifier": {
"remove_friend": "Anunţă când cineva te elimină ca prieten",
@@ -1016,7 +1018,7 @@
"friendly, casual, helpful, empathetic": "prietenos, ocazional, util, empatic"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Relaxat",
"formal": "Formal",
"friendly": "Prietenos",
"humorous": "Umor",
@@ -1092,7 +1094,7 @@
"sticker_messages": "Autocolante",
"tiny_snap_messages": "Snaps mici",
"map_reaction_messages": "Hartă Reacţii",
- "half_swipes": "Half Swipes"
+ "half_swipes": "Glis?ri pe jum?tate"
},
"supported_languages": {
"en": "Engleză",
@@ -1112,7 +1114,7 @@
"translation_position": {
"above": "Deasupra textului",
"below": "Sub text",
- "inline": "Inline"
+ "inline": "?n linie"
},
"source_language": {
"auto": "Detectează automat"
@@ -1139,7 +1141,7 @@
"description": "Setează coordonatele locației spoofed"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "Raz? de mers",
"description": "Plimbare aleatoare în jurul valorii de pe această rază (ft)"
},
"always_update_location": {
@@ -1173,7 +1175,7 @@
"description": "Suprascrie calitatea de încărcare media",
"properties": {
"force_video_upload_source_quality": {
- "name": "Force Video Upload Source Quality",
+ "name": "For?eaz? calitatea sursei de ?nc?rcare video",
"description": "Forţează Snapchat să folosească calitatea sursei la încărcarea videoclipurilor\nVă rugăm să rețineți că acest lucru nu poate elimina metadatele din mass-media"
},
"disable_image_compression": {
@@ -1341,7 +1343,7 @@
"description": "Cantitatea de fire de utilizat"
},
"preset": {
- "name": "Preset",
+ "name": "Presetare",
"description": "Setează viteza de conversie"
},
"constant_rate_factor": {
@@ -1349,7 +1351,7 @@
"description": "Setează factorul de rată constantă pentru codorul video\nDe la 0 la 51 pentru libx264"
},
"video_bitrate": {
- "name": "Video Bitrate",
+ "name": "Bitrate video",
"description": "Setează rata de biți video (kbps)"
},
"audio_bitrate": {
@@ -1449,7 +1451,7 @@
"description": "Arată informații utile ale mass-media, cum ar fi data creării în meniul contextului vizualizatorului operei"
},
"old_bitmoji_selfie": {
- "name": "Old Bitmoji Selfie",
+ "name": "Selfie Bitmoji vechi",
"description": "Aduce înapoi selfie-urile Bitmoji din versiunile vechi Snapchat"
},
"disable_spotlight": {
@@ -1847,11 +1849,11 @@
"description": "Mesaje de răspuns automat pentru mesajele de chat text"
},
"snap_messages": {
- "name": "Snap Replies",
+ "name": "R?spunsuri la Snap",
"description": "Mesaje de răspuns automat pentru capturi"
},
"story_share_messages": {
- "name": "Story Share Replies",
+ "name": "R?spunsuri la partaj?ri de Story",
"description": "Mesaje de răspuns automat pentru acțiuni de poveste"
},
"story_reply_messages": {
@@ -1991,7 +1993,7 @@
"description": "Pauză traducere atunci când serviciul este blocat"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Num?r maxim de ?ncerc?ri",
"description": "Numărul maxim de încercări de rejudecare"
},
"retry_delay": {
@@ -2124,7 +2126,7 @@
"description": "Arată primul nume de utilizator creat lângă numele de utilizator curent din pagina de profil"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera Roll Limit",
+ "name": "Ocole?te limita rolei foto",
"description": "Crește cantitatea maximă de mass-media pe care o puteți trimite din rola camerei"
},
"custom_self_destruct_snap_delay": {
@@ -2160,7 +2162,7 @@
"description": "Spoof diverse informații despre tine",
"properties": {
"play_store_installer_package_name": {
- "name": "Play Store Installer Package Name",
+ "name": "Nume pachet instalator Play Store",
"description": "Suprascrie numele pachetului instalatorului la com.android.vending"
},
"remove_vpn_transport_flag": {
@@ -2260,7 +2262,7 @@
"description": "Încercarea de a repara meniul de alimentare Friend ca atunci când dispozitivul este offline nu poate fi afișat corect"
},
"app_lock": {
- "name": "App Lock",
+ "name": "Blocare aplica?ie",
"description": "Previne accesul la Snapchat fără cod de acces",
"properties": {
"lock_on_resume": {
@@ -2380,7 +2382,7 @@
"preview": "Previzualizare",
"stealth_mode": "Mod ascuns",
"auto_download_blacklist": "Descărcare automată Lista neagră",
- "anti_auto_save": "Anti Auto Save"
+ "anti_auto_save": "Anti salvare automat?"
},
"content_type": {
"CHAT": "Discută",
@@ -2400,7 +2402,7 @@
"CREATIVE_TOOL_ITEM": "Element instrument creativ",
"FAMILY_CENTER_INVITE": "Family Center Invită",
"FAMILY_CENTER_ACCEPT": "Centrul de Familie Acceptă",
- "FAMILY_CENTER_LEAVE": "Family Center Leave",
+ "FAMILY_CENTER_LEAVE": "P?r?se?te Family Center",
"STATUS_PLUS_GIFT": "Stare Plus cadou",
"TINY_SNAP": "Snap mic",
"STATUS_COUNTDOWN": "Numărătoarea inversă",
@@ -2414,7 +2416,7 @@
"sticker_messages": "Autocolant",
"tiny_snap_messages": "Snap mic",
"map_reaction_messages": "Reacţie pe hartă",
- "half_swipes": "Half Swipes"
+ "half_swipes": "Glis?ri pe jum?tate"
},
"media_download_source": {
"none": "Niciuna",
@@ -2619,8 +2621,8 @@
"message_reaction_add": "Reacție mesaj Adaugă",
"message_reaction_remove": "Elimină reacția mesajului",
"snap_opened": "Snap Deschis",
- "snap_replayed": "Snap Replayed",
- "snap_replayed_twice": "Snap Replayed Twice",
+ "snap_replayed": "Snap reluat",
+ "snap_replayed_twice": "Snap reluat de dou? ori",
"snap_screenshot": "Captură de ecran",
"snap_screen_record": "Snap înregistrare ecran",
"i_can_see_you": "Te pot vedea"
@@ -2650,7 +2652,7 @@
"dialog_message": "Sigur vrei să începi un apel?"
},
"half_swipe_notifier": {
- "notification_channel_name": "Half Swipe",
+ "notification_channel_name": "Glisare pe jum?tate",
"notification_content_dm": "{friend}doar pe jumătate băgat în discuţia ta pentru{duration}secunde",
"notification_content_group": "{friend}doar pe jumătate lovit în{group}pentru{duration}secunde"
},
@@ -2759,7 +2761,7 @@
"notification_statistics": "STATISTICI",
"notification_queue_size": "Mărime coadă",
"notification_total_opened": "Total capturi deschise",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "PREVIZUALIZARE COAD?",
"notification_processing_continue": "Procesarea va continua automat...",
"notification_no_snaps_queue": "Fără pocniri la coadă.",
"notification_queue_cleared_opened": "Coada este închisă ({opened}deschis)",
@@ -2883,7 +2885,7 @@
"translation_position": {
"above": "Deasupra",
"below": "Mai jos",
- "inline": "Inline"
+ "inline": "?n linie"
},
"language_codes": {
"en": "Engleză",
@@ -3127,7 +3129,7 @@
"no_friends_found": "Nu am găsit niciun prieten",
"exporting_memories": "Export amintiri... ({failed}a eșuat)"
},
- "clear_friend_feed": "Clear Friend Feed",
+ "clear_friend_feed": "Cur??? fluxul de prieteni",
"select_date": "Alegeți data",
"schedule_scheduled_for": "Programat pentru{name}în{time}",
"schedule_sending_in": "Trimit{time}",
@@ -3182,7 +3184,7 @@
"failed_to_edit_message": "Eșec la editarea mesajului:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Relaxat",
"formal": "Formal",
"friendly": "Prietenos",
"humorous": "Umor",
@@ -3218,4 +3220,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/ru.json b/common/src/main/assets/lang/ru.json
index 931f5055..288fdf06 100644
--- a/common/src/main/assets/lang/ru.json
+++ b/common/src/main/assets/lang/ru.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Выберите язык",
@@ -97,7 +97,7 @@
"update_notification_channel_description": "Получить уведомление, когда новые релизы доступны",
"update_notification_title": "Новое обновление доступно",
"update_notification_text": "Нажмите, чтобы открыть PurrfectSnap и загрузить последнюю сборку.",
- "app_theme_title": "App Theme",
+ "app_theme_title": "???? ??????????",
"theme_icon_description": "Выбор открытой темы",
"theme_mode_system": "Система",
"theme_mode_light": "Свет",
@@ -532,11 +532,11 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "???????????? ??????",
"description": "Автоматически открывает Snaps при их получении",
"options": {
"blacklist": "Скачать Auto Open Snaps",
- "whitelist": "Auto Open Snaps"
+ "whitelist": "???????????? ??????"
}
},
"hide_friend_feed": {
@@ -611,7 +611,7 @@
"description": "Экспорт памяти в ZIP-файл"
},
"bulk_messaging_action": {
- "name": "Bulk Messaging Action",
+ "name": "???????? ???????? ?????????",
"description": "Выполняет такие операции, как удаление друзей или массовое удаление разговоров"
},
"regen_mappings": {
@@ -833,7 +833,7 @@
"null": "Кодек по умолчанию"
},
"preset": {
- "null": "Default Preset"
+ "null": "????????????? ?? ?????????"
},
"app_appearance_override": {
"title": "Внешний вид"
@@ -893,7 +893,7 @@
"snapchat_plus": {
"not_subscribed": "Не подписывается",
"basic": "Базовый",
- "ad_free": "Ad Free",
+ "ad_free": "??? ???????",
"null": "По умолчанию"
},
"bypass_video_length_restriction": {
@@ -1395,7 +1395,7 @@
}
},
"snap_preview": {
- "name": "Snap Preview",
+ "name": "???????????? ?????",
"description": "Отображает небольшой предварительный просмотр рядом с невидимыми Snaps в чате"
},
"bootstrap_override": {
@@ -1597,7 +1597,7 @@
"description": "Показывает предварительный просмотр полученных сообщений в уведомлении"
},
"media_preview": {
- "name": "Media Preview",
+ "name": "???????????? ?????",
"description": "Показывает предварительный просмотр выбранных типов медиа в уведомлении"
},
"media_caption": {
@@ -1761,7 +1761,7 @@
"description": "Используйте ИИ для создания интеллектуальных автоматических реплик вместо шаблонных сообщений"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "????????? ??",
"description": "Выберите, какой сервис ИИ использовать для генерации ответов"
},
"ai_endpoint_url": {
@@ -2260,7 +2260,7 @@
"description": "Попробуйте отремонтировать меню Friend Feed, так как когда устройство отключено, оно не может отображаться правильно"
},
"app_lock": {
- "name": "App Lock",
+ "name": "?????????? ??????????",
"description": "Предотвращение доступа к Snapchat без пароля",
"properties": {
"lock_on_resume": {
@@ -2396,7 +2396,7 @@
"STATUS_CONVERSATION_CAPTURE_RECORD": "Запись с экрана",
"STATUS_CALL_MISSED_VIDEO": "Пропущенный видеозвонок",
"STATUS_CALL_MISSED_AUDIO": "Пропущенный аудиозвонок",
- "LIVE_LOCATION_SHARE": "Live Location Share",
+ "LIVE_LOCATION_SHARE": "????? ?????? ? ?????????? ? ???????? ???????",
"CREATIVE_TOOL_ITEM": "Креативный инструмент",
"FAMILY_CENTER_INVITE": "Семейный центр приглашает",
"FAMILY_CENTER_ACCEPT": "Семейный центр принимает",
@@ -2720,7 +2720,7 @@
"incoming_secret_message": "Твой друг только что принял твой открытый ключ. Нажмите ниже, чтобы принять секрет."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
+ "title": "???????????? ??????",
"priority_title": "Auto Open Snaps (приоритет)",
"error_title": "Auto Open Snaps (ошибки)",
"channel_description": "Уведомления о статусе очереди после автоматического открытия",
@@ -2842,7 +2842,7 @@
},
"material3_strings": {
"date_range_picker_start_headline": "Из",
- "date_range_picker_end_headline": "To",
+ "date_range_picker_end_headline": "????",
"date_range_picker_title": "Выберите диапазон дат",
"date_picker_switch_to_calendar_mode": "Расписание",
"date_picker_switch_to_input_mode": "Ввод",
@@ -3051,7 +3051,7 @@
"clear": "Чисто",
"files": {
"config_json": "Конфигурационный файл",
- "mappings_json": "Mappings File",
+ "mappings_json": "???? ?????????????",
"message_logger_db": "База данных Message Logger",
"pinned_best_friend_txt": "Файл лучшего друга",
"native_sig_cache_txt": "Родная подпись Файл кэша"
@@ -3074,7 +3074,7 @@
"update_channel_prerelease": "Предварительный выпуск",
"friend_notes_title": "Записки друзей",
"friend_notes_description": "Управление и резервное копирование заметок друзей",
- "app_theme_title": "App Theme",
+ "app_theme_title": "???? ??????????",
"theme_mode_system": "Система",
"theme_mode_light": "Свет",
"theme_mode_dark": "Темный",
@@ -3170,7 +3170,7 @@
},
"debug_dialogs": {
"info": "Информация",
- "refs": "Refs",
+ "refs": "??????",
"arroyo": "Арро",
"message": "Послание",
"media_references": "Ссылки на СМИ",
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/sl_SI.json b/common/src/main/assets/lang/sl_SI.json
index 7d78a682..51f2c1ed 100644
--- a/common/src/main/assets/lang/sl_SI.json
+++ b/common/src/main/assets/lang/sl_SI.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Izberi jezik",
@@ -546,7 +546,7 @@
"name": "Uporabi šifriranje E2E"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "Pripni pogovor"
},
"exclude_message_logger": {
"name": "Izbriši iz dnevnika sporočil"
@@ -659,20 +659,21 @@
"null": "Uporabi pravo raven baterije"
},
"friend_feed_menu_buttons": {
- "auto_download": "⬇️ Auto Download",
- "auto_save": "💬 Auto Save Messages",
- "unsaveable_messages": " Nerešljiva sporočila",
- "auto_open_snaps": "📷 Auto Open Snaps",
- "stealth": "👻 Stealth Mode",
- "auto_reply": "📨 Auto Reply",
- "auto_delete_sent_messages": "🗑️ Auto Delete Sent Messages",
- "mark_snaps_as_seen": " Mark Snaps, kot se vidi",
- "mark_stories_as_seen_locally": " Označite zgodbe, kot jih vidite na lokalni ravni",
- "conversation_info": "👤 Conversation Info",
- "e2e_encryption": "🔒 Use E2E Encryption",
- "message_logger": "📝 Message Logger",
- "auto_read": "✅ Auto Read",
- "hide_typing_indicator": "🙈 Hide Typing Indicator"
+ "auto_download": "?? Samodejni prenos",
+ "auto_save": "?? Samodejno shranjevanje sporo?il",
+ "unsaveable_messages": "Nezapisljiva sporo?ila",
+ "auto_open_snaps": "?? Samodejno odpiranje Snapov",
+ "stealth": "?? Prikriti na?in",
+ "auto_reply": "?? Samodejni odgovor",
+ "auto_delete_sent_messages": "??? Samodejno brisanje poslanih sporo?il",
+ "mark_snaps_as_seen": "Ozna?i Snape kot ogledane",
+ "mark_stories_as_seen_locally": "Ozna?i Stories kot ogledane lokalno",
+ "conversation_info": "?? Informacije o pogovoru",
+ "e2e_encryption": "?? Uporabi E2E ?ifriranje",
+ "message_logger": "?? Bele?enje sporo?il",
+ "auto_read": "? Samodejno branje",
+ "hide_typing_indicator": "?? Skrij indikator tipkanja",
+ "auto_save_messages": "?? Samodejno shranjevanje sporo?il"
},
"schedule_scheduled_for": "Načrtovano za{name}v{time}",
"schedule_sending_in": "Pošiljanje noter{time}",
@@ -760,7 +761,8 @@
"auto_save": {
"blacklist": "Črna lista",
"whitelist": "Bela lista",
- "disabled": "Onemogočeno"
+ "disabled": "Onemogočeno",
+ "auto_save": "?? Samodejno shranjevanje sporo?il"
},
"message_logger": {
"blacklist": "Črna lista",
@@ -1777,7 +1779,7 @@
"description": "API ključ za preverjanje pristnosti z AI storitev"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "Poziv sistema AI",
"description": "Sistem, ki določa osebnost in vedenje AI"
},
"ai_max_tokens": {
@@ -1991,7 +1993,7 @@
"description": "Prekini prevajanje, ko je storitev blokirana"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Najve? ponovitev",
"description": "Največje število poskusov ponovnega preskušanja"
},
"retry_delay": {
@@ -2553,7 +2555,7 @@
"deleted": "Zbrisano",
"business_accounts": "Poslovni računi",
"streaks": "Streaks",
- "non_streaks": "Non Streaks",
+ "non_streaks": "Brez streakov",
"followed": "Sledi",
"following": "Sledi",
"location_on_map": "Lokacija na zemljevidu"
@@ -2562,7 +2564,7 @@
"none": "Brez",
"username": "Uporabniško ime",
"added_timestamp": "Dodan časovni žig",
- "snap_score": "Snap Score",
+ "snap_score": "Snap to?ke",
"streak_length": "Dolžina streak",
"most_messages_sent": "Večina poslanih sporočil",
"most_recent_message": "Najnovejše sporočilo",
@@ -3218,4 +3220,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/sv.json b/common/src/main/assets/lang/sv.json
index 5d64d438..d70cf04c 100644
--- a/common/src/main/assets/lang/sv.json
+++ b/common/src/main/assets/lang/sv.json
@@ -1,4 +1,4 @@
-{
+{
"setup": {
"dialogs": {
"select_language": "Välj språk",
@@ -31,10 +31,10 @@
"home_about": "Om",
"home_settings": "Inställningar",
"home_logs": "Loggar",
- "logger_history": "Logger History",
+ "logger_history": "Logghistorik",
"logged_stories": "Loggade berättelser",
"friend_tracker": "Vän Tracker",
- "friend_tracker_catalog": "Friend Tracker Catalog",
+ "friend_tracker_catalog": "Friend Tracker-katalog",
"manage_friend_tracker_repos": "Hantera Friend Tracker Repositories",
"edit_rule": "Redigera regel",
"file_imports": "Fil Importerar",
@@ -44,7 +44,7 @@
"messaging_preview": "Förhandsgranskning",
"scripts": "Skript",
"manage_script_repos": "Hantera Script Repositories",
- "view_logger_history": "Logger History",
+ "view_logger_history": "Logghistorik",
"better_location": "Bättre plats"
},
"navigation": {
@@ -53,7 +53,7 @@
"available_tabs_title": "Tillgängliga flikar",
"shown_tabs_title": "Visade flikar",
"reset_button": "Återställ",
- "done_button": "Done"
+ "done_button": "Klar"
},
"sections": {
"home": {
@@ -68,7 +68,7 @@
},
"home_logs": {
"no_logs_hint": "Inga loggar tillgängliga",
- "clear_logs_button": "Clear Logs",
+ "clear_logs_button": "Rensa loggar",
"export_logs_button": "Exportloggar",
"saving_logs_toast": "Spara stockar, detta kan ta ett tag ...",
"saved_logs_success_toast": "Loggar sparade framgångsrikt",
@@ -77,22 +77,22 @@
"home_settings": {
"actions_title": "Aktiviteter",
"message_logger_title": "Meddelande Logger",
- "debug_title": "Debug",
+ "debug_title": "Fels?kning",
"success_toast": "Gjort!",
"message_logger_summary": "{messageCount}meddelanden\n{storyCount}historier",
- "export_button": "Export",
- "clear_button": "Clear",
+ "export_button": "Exportera",
+ "clear_button": "Rensa",
"view_logger_history_button": "Visa Logger History",
"ui_settings_title": "UI Inställningar",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptisk feedback",
"use_system_toasts_label": "Använd System Toasts",
"updates_title": "Uppdateringar",
- "auto_update_check": "Auto Update Check",
+ "auto_update_check": "Automatisk uppdateringskontroll",
"update_check_frequency_daily": "Dagligen",
- "update_check_frequency_weekly": "Weekly",
+ "update_check_frequency_weekly": "Veckovis",
"update_check_frequency_monthly": "Månadsvis",
"update_channel_stable": "Stabilt",
- "update_channel_prerelease": "Pre-release",
+ "update_channel_prerelease": "F?rhandsversion",
"update_notification_channel_name": "Uppdateringar",
"update_notification_channel_description": "Få meddelande när nya releaser finns tillgängliga",
"update_notification_title": "Ny uppdatering tillgänglig",
@@ -102,20 +102,20 @@
"theme_mode_system": "Systemsystem",
"theme_mode_light": "Ljus ljus",
"theme_mode_dark": "Mörk",
- "friend_notes_title": "Friend Notes",
+ "friend_notes_title": "V?nanteckningar",
"friend_notes_description": "Hantera och säkerhetskopiera dina vännoter",
"friend_notes_no_notes_to_backup": "Inga anteckningar att backa upp ännu",
"friend_notes_backup_success": "Friend Notes backade upp",
"friend_notes_restore_success": "Vän noter återställda",
- "backup_button": "Backup",
+ "backup_button": "S?kerhetskopia",
"restore_button": "Återställ",
"view_button": "Utsikt",
"customize_bottom_bar_title": "Anpassa Bottom Bar",
"customize_bottom_bar_subtitle": "Välj vilka flikar som visas på din hemskärm",
"available_tabs_title": "Tillgängliga flikar",
"reset_button": "Återställ",
- "done_button": "Done",
- "clear_friend_feed": "Clear Friend Feed",
+ "done_button": "Klar",
+ "clear_friend_feed": "Rensa v?nfl?de",
"test_mode_label": "Aktivera PurrAura",
"disable_feature_loading_label": "Inaktivera funktionen laddar",
"disable_auto_mapper_label": "Inaktivera Auto Mapper",
@@ -123,7 +123,7 @@
},
"tasks": {
"no_tasks": "Inga uppgifter",
- "merge_button": "Merge",
+ "merge_button": "Sammanfoga",
"failed_to_open_file": "Underlåten att öppna filen",
"merge_files_toast": "Merging{count}filer",
"remove_selected_tasks_title": "Är du säker på att du vill ta bort utvalda uppgifter?",
@@ -134,7 +134,7 @@
},
"features": {
"disabled": "Inaktiverad",
- "export_option": "Export",
+ "export_option": "Exportera",
"import_option": "Importera import",
"reset_option": "Återställ",
"config_export_success_toast": "Config exporterade framgångsrikt",
@@ -172,10 +172,10 @@
},
"manage_scope": {
"logged_stories_button": "Visa inloggade berättelser",
- "e2ee_title": "End-to-End Encryption",
+ "e2ee_title": "End-to-end-kryptering",
"e2ee_subtitle": "Hantera din delade nyckel för denna vän.",
- "export_base64_button": "Export Base64",
- "import_base64_button": "Import Base64",
+ "export_base64_button": "Exportera Base64",
+ "import_base64_button": "Importera Base64",
"invalid_key_size_32_bytes": "Ogiltig nyckelstorlek. Ge en 32-byte nyckel.",
"successfully_imported_key": "Viktig importerad framgångsrikt.",
"failed_to_import_key": "Underlåten att importera nyckeln:{message}",
@@ -202,14 +202,14 @@
"message_fetch_failed": "Misslyckades med att hämta meddelanden",
"no_message_hint": "Inget meddelande",
"subtitle": "Håll att välja",
- "actions_title": "Conversation Actions",
+ "actions_title": "Samtals?tg?rder",
"save_selection_option": "Spara urval",
"save_all_option": "Spara alla",
- "unsave_selection_option": "Unsave Selection",
- "unsave_all_option": "Unsave All",
+ "unsave_selection_option": "Spara inte urval",
+ "unsave_all_option": "Spara inte alla",
"mark_selection_as_seen_option": "Mark valde Snap som sett",
"mark_all_as_seen_option": "Markera alla snaps som sett",
- "delete_selection_option": "Delete Selection",
+ "delete_selection_option": "Radera urval",
"delete_all_option": "Ta bort alla",
"processed_message_toast": "Bearbetad{count}meddelanden",
"processed_messages_toast": "Bearbetad{count}meddelanden",
@@ -248,7 +248,7 @@
"teleport_to_friend_button": "Teleport till vän",
"spoof_location_toggle": "Spoof plats",
"suspend_location_updates": "Avbryta platsuppdateringar",
- "saved_coordinates_title": "Saved Coordinates",
+ "saved_coordinates_title": "Sparade koordinater",
"no_saved_coordinates_hint": "Inga sparade koordinater",
"delete_dialog_title": "Radera sparad koordinat",
"delete_dialog_message": "Är du säker på att du vill ta bort denna sparade koordinat?",
@@ -266,7 +266,7 @@
"category_groups": "Grupper",
"category_friends": "Vänner",
"participants_text": "{count}deltagare",
- "unselect_all_button": "Unselect All"
+ "unselect_all_button": "Avmarkera alla"
},
"scripting": {
"repo_hint": "Klistra en repository URL"
@@ -303,12 +303,12 @@
"catalog_tab": "Katalog",
"clear_module_data_button": "Tydliga data",
"clear_module_data_failed": "Misslyckades med tydliga moduldata",
- "delete_module_button": "Delete",
+ "delete_module_button": "Radera",
"delete_module_failed": "Underlåten att ta bort modulen",
- "documentation_button": "Docs",
+ "documentation_button": "Dokumentation",
"download_script_failed": "Misslyckades med att ladda ner script",
"downloading_script": "Ladda ner script...",
- "edit_module_button": "Edit",
+ "edit_module_button": "Redigera",
"enter_url_label": "Ange URL",
"import_button": "Importera import",
"import_from_url_button": "Importera från URL",
@@ -347,9 +347,9 @@
"no_repos_added": "Inga repositorier tillagda",
"add_repo_button": "Lägg till Repository",
"add_repo_dialog_title": "Lägg till Repository",
- "repo_url_label": "Repository URL",
+ "repo_url_label": "Repository-URL",
"add_button": "Lägg till",
- "invalid_repo_title": "Invalid Repository",
+ "invalid_repo_title": "Ogiltigt repository",
"invalid_repo_error": "Detta förvar saknas nödvändiga data.",
"repo_added_toast": "Repository tillagd",
"add_repo_failed_toast": "Underlåten att lägga till förvar:{message}",
@@ -371,8 +371,8 @@
"until_label": "Fram till",
"unit_label": "Enhet",
"pick_a_date_button": "Välj ett datum",
- "export_button": "Export",
- "delete_button": "Delete",
+ "export_button": "Exportera",
+ "delete_button": "Radera",
"search_placeholder": "Sök efter Sök",
"no_logs_found": "Inga loggar hittades",
"no_rules_found": "Inga regler hittades",
@@ -385,7 +385,7 @@
"rule_name_label": "Regelnamn",
"default_rule_name": "Ny regel",
"author_name_label": "Författare",
- "scope_section_title": "Scope",
+ "scope_section_title": "Omfattning",
"scope_all": "Alla vänner/grupper",
"scope_whitelist": "Ingen utom",
"scope_blacklist": "Alla utom",
@@ -393,8 +393,8 @@
"events_suffix": "händelser",
"no_events_text": "Inga händelser till ännu",
"add_event_dialog_title": "Lägg till evenemang",
- "event_type_label": "Event Type",
- "triggers_title": "Triggers",
+ "event_type_label": "H?ndelsetyp",
+ "triggers_title": "Utl?sare",
"conditions_title": "Villkor",
"condition_only_inside_conversation": "Först när jag är inne i konversation",
"condition_only_outside_conversation": "Först när jag är utanför konversation",
@@ -409,27 +409,27 @@
"discard_changes_dialog_title": "Kassera förändringar?",
"discard_changes_dialog_text": "Du har osparade förändringar. Kassera dem?",
"rule_subtitle": "Konfigurera triggers och omfattningar för denna regel.",
- "discard_button": "Discard",
- "enabled_label": "Enabled",
+ "discard_button": "F?rkasta",
+ "enabled_label": "Aktiverad",
"disabled_label": "Inaktiverad",
"delete_rule_dialog_title": "Radera regel",
"delete_rule_dialog_text": "Är du säker på att du vill ta bort denna regel?",
"no_repos_added": "Inga repositorier tillagda",
"import_dialog_title": "Importera regler",
- "bulk_import_button": "Bulk import",
+ "bulk_import_button": "Massimport",
"individual_import_button": "Enskild import",
"invalid_import_type_dialog_title": "Ogiltig import",
"invalid_import_type_dialog_text": "Den valda filtypen matchar inte importläget.",
"export_dialog_title": "Exportregler",
- "bulk_export_button": "Bulk export",
+ "bulk_export_button": "Massexport",
"individual_export_button": "Ensam export",
"reverse_order_checkbox": "Omvänd order",
- "delete_logs_dialog_title": "Delete Logs",
+ "delete_logs_dialog_title": "Radera loggar",
"delete_logs_dialog_confirm_text": "Ta bort alla loggar som matchar de aktuella filtren?",
"select_friends_groups_button": "Välj vänner/grupper"
},
"friend_tracker_export": {
- "title": "Export Friend Tracker",
+ "title": "Exportera Friend Tracker",
"save_button": "Spara",
"back_button_description": "Gå tillbaka",
"expand_button_description": "Expandera eller kollapsa kategori",
@@ -445,7 +445,7 @@
"import_failed_toast": "Underlåtenhet att importera tracker:{message}"
},
"friend_tracker_catalog": {
- "title": "Friend Tracker Catalog",
+ "title": "Friend Tracker-katalog",
"no_repos_added": "Inga repositorier tillagda",
"manage_repos_description": "Hantera repositorier"
},
@@ -453,9 +453,9 @@
"no_repos_added": "Inga repositorier tillagda",
"add_repo_button": "Lägg till Repository",
"add_repo_dialog_title": "Lägg till Repository",
- "repo_url_label": "Repository URL",
+ "repo_url_label": "Repository-URL",
"add_button": "Lägg till",
- "invalid_repo_title": "Invalid Repository",
+ "invalid_repo_title": "Ogiltigt repository",
"invalid_repo_error": "Detta förvar saknas nödvändiga data.",
"repo_added_toast": "Repository tillagd",
"add_repo_failed_toast": "Underlåten att lägga till förvar:{message}",
@@ -472,7 +472,7 @@
"back_button_description": "Gå tillbaka",
"save_button": "Spara",
"expand_button_description": "Expandera eller kollapsa kategori",
- "enabled": "Enabled",
+ "enabled": "Aktiverad",
"disabled": "Inaktiverad",
"enable_feature": "Aktivera funktionen"
},
@@ -481,7 +481,7 @@
"back_button_description": "Gå tillbaka",
"confirm_button": "Importera import",
"expand_button_description": "Expandera eller kollapsa kategori",
- "enabled": "Enabled",
+ "enabled": "Aktiverad",
"disabled": "Inaktiverad",
"enable_feature": "Aktivera funktionen",
"config_imported_toast": "Config importerade framgångsrikt",
@@ -504,15 +504,15 @@
"description": "Automatiskt ladda ner Snappar när man tittar på dem",
"options": {
"blacklist": "Exkludera från Auto Download",
- "whitelist": "Auto Download"
+ "whitelist": "Automatisk nedladdning"
}
},
"stealth": {
- "name": "Stealth Mode",
+ "name": "Smygl?ge",
"description": "Förhindrar någon från att veta att du har öppnat sina Snaps/Chats och samtal",
"options": {
"blacklist": "Exkludera från Stealth Mode",
- "whitelist": "Stealth mode"
+ "whitelist": "Smygl?ge"
}
},
"auto_save": {
@@ -532,11 +532,11 @@
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
+ "name": "?ppna Snaps automatiskt",
"description": "Automatiskt öppnar Snaps när du tar emot dem",
"options": {
"blacklist": "Exkludera från Auto Open Snaps",
- "whitelist": "Auto Open Snaps"
+ "whitelist": "?ppna Snaps automatiskt"
}
},
"hide_friend_feed": {
@@ -546,7 +546,7 @@
"name": "Använd E2E-kryptering"
},
"pin_conversation": {
- "name": "Pin Conversation"
+ "name": "F?st konversation"
},
"exclude_message_logger": {
"name": "Exkludera från Message Logger"
@@ -611,7 +611,7 @@
"description": "Exportera minnen till en ZIP-fil"
},
"bulk_messaging_action": {
- "name": "Bulk Messaging Action",
+ "name": "Massmeddelande?tg?rd",
"description": "Utför operationer som att ta bort vänner eller mass radera samtal"
},
"regen_mappings": {
@@ -631,7 +631,7 @@
"description": "Spåra dina vänner på Snapchat"
},
"logger_history": {
- "name": "Logger History",
+ "name": "Logghistorik",
"description": "Se historien om loggade meddelanden"
}
},
@@ -703,7 +703,7 @@
},
"auto_download_sources": {
"friend_snaps": "Vän Snaps",
- "friend_stories": "Friend Stories",
+ "friend_stories": "V?nners stories",
"public_stories": "Offentliga berättelser",
"spotlight": "Spotlight"
},
@@ -714,9 +714,9 @@
"failure": "Underlåtenhet"
},
"notifications": {
- "chat_screenshot": "Screenshot",
- "chat_screen_record": "Screen Record",
- "snap_replay": "Snap Replay",
+ "chat_screenshot": "Sk?rmbild",
+ "chat_screen_record": "Sk?rminspelning",
+ "snap_replay": "Snap-uppspelning",
"camera_roll_save": "Kamera Roll Spara",
"chat": "Chatta",
"chat_reply": "Chatt svar",
@@ -733,43 +733,43 @@
"map_live_location": "Karta Live Plats"
},
"auto_read": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"hide_typing_indicator": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"auto_delete_sent_messages": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"auto_download": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"stealth": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"auto_save": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"message_logger": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"auto_reply": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Svartlista",
+ "whitelist": "Vitlista",
"disabled": "Inaktiverad"
},
"custom_android_id": {
@@ -807,7 +807,7 @@
"null": "Använd automatisk upplösning"
},
"startup_default_camera": {
- "front": "Front Camera",
+ "front": "Frontkamera",
"back": "Tillbaka kamera",
"null": "Kom ihåg senast använda"
},
@@ -833,7 +833,7 @@
"null": "Standard Codec"
},
"preset": {
- "null": "Default Preset"
+ "null": "Standardf?rinst?llning"
},
"app_appearance_override": {
"title": "Utseende"
@@ -841,14 +841,14 @@
"gallery_media_send_override": {
"always_ask": "Alltid fråga",
"ORIGINAL": "Originalmedier",
- "NOTE": "Audio Note",
+ "NOTE": "R?stanteckning",
"SNAP": "Snap",
"SAVEABLE_SNAP": "Sparabar Snap",
"null": "Snapchat standard"
},
"strip_media_metadata": {
- "hide_caption_text": "Hide Caption Text",
- "hide_snap_filters": "Hide Snap Filters",
+ "hide_caption_text": "D?lj bildtext",
+ "hide_snap_filters": "D?lj Snap-filter",
"hide_extras": "Hide Extras (t.ex. omnämnanden)",
"remove_audio_note_duration": "Ta bort Audio Note Duration",
"remove_audio_note_transcript_capability": "Ta bort Audio Note Transcript Capability"
@@ -857,7 +857,7 @@
"hide_profile_call_buttons": "Ta bort Profile Call Buttons",
"hide_chat_call_buttons": "Ta bort Chat Call Buttons",
"hide_live_location_share_button": "Ta bort Live Location Share Button",
- "hide_stickers_button": "Remove Stickers Button",
+ "hide_stickers_button": "Ta bort klisterm?rkesknapp",
"hide_voice_record_button": "Ta bort Voice Record Button",
"hide_unread_chat_hint": "Ta bort olästa Chat Hint",
"hide_post_to_story_buttons": "Ta bort Post till Story knappar innan du skickar en Snap",
@@ -888,7 +888,7 @@
"null": "Automatisk"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Automatisk"
},
"snapchat_plus": {
"not_subscribed": "Inte prenumererad",
@@ -898,7 +898,7 @@
},
"bypass_video_length_restriction": {
"single": "Ensamstående media",
- "split": "Split media",
+ "split": "Dela upp media",
"null": "Standard"
},
"old_bitmoji_selfie": {
@@ -909,7 +909,7 @@
"disable_confirmation_dialogs": {
"erase_message": "Radera budskap",
"remove_friend": "Ta bort vän",
- "block_friend": "Block Friend",
+ "block_friend": "Blockera v?n",
"ignore_friend": "Ignorera vän",
"hide_friend": "Hej vän",
"hide_conversation": "Dölj konversation",
@@ -917,7 +917,7 @@
},
"edit_text_override": {
"multi_line_chat_input": "Multi Line Chatt Input",
- "bypass_text_input_limit": "Bypass Text Input Limit"
+ "bypass_text_input_limit": "Kringg? textinmatningsgr?ns"
},
"auto_purge": {
"never": "Aldrig aldrig",
@@ -945,7 +945,7 @@
"discover": "Upptäcka"
},
"disable_cameras": {
- "front": "Front Camera",
+ "front": "Frontkamera",
"back": "Tillbaka kamera"
},
"disable_permission_requests": {
@@ -990,9 +990,9 @@
"message_types": {
"CHAT": "Chatta",
"SNAP": "Snap",
- "NOTE": "Note",
+ "NOTE": "Anteckning",
"EXTERNAL_MEDIA": "Externa medier",
- "STICKER": "Sticker"
+ "STICKER": "Klisterm?rke"
},
"double_tap_chat_action_custom_emoji": {
"Custom emoji reaction": "Anpassad emoji reaktion"
@@ -1016,19 +1016,19 @@
"friendly, casual, helpful, empathetic": "vänliga, tillfälliga, hjälpsamma, empatiska"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Avslappnad",
"formal": "Formell",
"friendly": "Vänlig",
"humorous": "Humorös",
"empathetic": "Empatiska",
- "toxic": "Edgy",
- "busy": "Busy"
+ "toxic": "Provokativ",
+ "busy": "Upptagen"
},
"ai_temperature": {
"0.7": "Balanserad (0,7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Automatisk",
"en": "Engelska",
"es": "Spanska spanska",
"fr": "Franska franska",
@@ -1085,12 +1085,12 @@
"auto_reply_content_types": {
"chat_messages": "Chattmeddelanden",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
- "story_reply_messages": "Story Replies",
+ "story_share_messages": "Story-delningar",
+ "story_reply_messages": "Story-svar",
"external_media_messages": "Externa medier",
- "voice_note_messages": "Voice Notes",
- "sticker_messages": "Stickers",
- "tiny_snap_messages": "Tiny Snaps",
+ "voice_note_messages": "R?stanteckningar",
+ "sticker_messages": "Klisterm?rken",
+ "tiny_snap_messages": "Mini-Snaps",
"map_reaction_messages": "Karta reaktioner",
"half_swipes": "Hälften Swipes"
},
@@ -1139,7 +1139,7 @@
"description": "Ange koordinaterna för den bortskämda platsen"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "G?ngradie",
"description": "Slumpmässigt gå runt i denna radie (ft)"
},
"always_update_location": {
@@ -1191,7 +1191,7 @@
"description": "Automatiskt bekräftar valda åtgärder"
},
"auto_updater": {
- "name": "Auto Updater",
+ "name": "Auto-uppdaterare",
"description": "Kontrollera automatiskt för nya uppdateringar"
},
"update_settings": {
@@ -1199,7 +1199,7 @@
"description": "Kontrollera hur PurrfectSnap kontrollerar för uppdateringar",
"properties": {
"auto_update_check": {
- "name": "Auto Update Check"
+ "name": "Automatisk uppdateringskontroll"
},
"update_check_frequency": {
"name": "Uppdatera kontrollfrekvens"
@@ -1210,7 +1210,7 @@
"name": "UI Inställningar",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Haptisk feedback"
}
}
},
@@ -1223,7 +1223,7 @@
"description": "Ta bort avsnitt från sidan Berättelser\nKan kräva en uppfriskning för att fungera ordentligt"
},
"block_ads": {
- "name": "Block Ads",
+ "name": "Blockera annonser",
"description": "Förhindrar annonser från att visas"
},
"disable_custom_tabs": {
@@ -1243,7 +1243,7 @@
"description": "Visar författarens användarnamn i Spotlight kommentarer"
},
"spotlight_comments_username_icon": {
- "name": "Spotlight Comments Username Icon",
+ "name": "Anv?ndarnamnsikon f?r Spotlight-kommentarer",
"description": "Välj vilken ikon som visas bredvid användarnamn i Spotlight-kommentarer"
},
"bypass_video_length_restriction": {
@@ -1255,7 +1255,7 @@
"description": "Anger standardhastigheten för uppspelningen av videor\nVärdet måste vara mellan 0,1 och 4,0"
},
"video_playback_rate_slider": {
- "name": "Video Playback Rate Slider",
+ "name": "Reglage f?r videouppspelningshastighet",
"description": "Lägger till en reglage i operakontextmenyn för att ändra videouppspelningsfrekvensen\nObs!: Ändringar gäller endast för efterföljande videor"
},
"disable_google_play_dialogs": {
@@ -1281,7 +1281,7 @@
}
},
"downloader": {
- "name": "Downloader",
+ "name": "Nedladdare",
"description": "Ladda ner Snapchat Media",
"properties": {
"save_folder": {
@@ -1297,7 +1297,7 @@
"description": "Förhindrar dina egna snaps från att laddas ner automatiskt"
},
"path_format": {
- "name": "Path Format",
+ "name": "S?kv?gsformat",
"description": "Ange filvägsformatet"
},
"allow_duplicate": {
@@ -1305,19 +1305,19 @@
"description": "Tillåter samma media att laddas ner flera gånger"
},
"merge_overlays": {
- "name": "Merge Overlays",
+ "name": "Sammanfoga ?verl?gg",
"description": "Kombinerar texten och media av en Snap i en enda fil"
},
"force_image_format": {
- "name": "Force Image Format",
+ "name": "Tvinga bildformat",
"description": "Kraftbilder som ska sparas i ett specificerat format"
},
"force_voice_note_format": {
- "name": "Force Voice Note Format",
+ "name": "Tvinga r?stanteckningsformat",
"description": "Forces Voice Anteckningar som ska sparas i ett specificerat format"
},
"auto_download_voice_notes": {
- "name": "Auto Download Voice Notes",
+ "name": "Auto-nedladda r?stanteckningar",
"description": "Automatiskt laddar ner röstanteckningar när du spelar dem"
},
"download_profile_pictures": {
@@ -1325,7 +1325,7 @@
"description": "Låter dig ladda ner Profilbilder från profilsidan"
},
"opera_download_button": {
- "name": "Opera Download Button",
+ "name": "Opera nedladdningsknapp",
"description": "Lägger till en nedladdningsknapp på det övre högra hörnet när du tittar på en Snap.\nLång tryck på knappar kommer att tvinga nedladdning"
},
"download_context_menu": {
@@ -1341,7 +1341,7 @@
"description": "Mängden trådar att använda"
},
"preset": {
- "name": "Preset",
+ "name": "F?rinst?llning",
"description": "Ställ hastigheten på omvandlingen"
},
"constant_rate_factor": {
@@ -1349,11 +1349,11 @@
"description": "Ställ in den ständiga hastighetsfaktorn för videokodaren\nFrån 0 till 51 för libx264"
},
"video_bitrate": {
- "name": "Video Bitrate",
+ "name": "Videobitrate",
"description": "Ställ in video bitrate (kbps)"
},
"audio_bitrate": {
- "name": "Audio Bitrate",
+ "name": "Ljudbitrate",
"description": "Ställ in ljudbitrate (kbps)"
},
"custom_video_codec": {
@@ -1367,7 +1367,7 @@
}
},
"logging": {
- "name": "Logging",
+ "name": "Loggning",
"description": "Visar skålar när media laddar ner"
},
"custom_path_format": {
@@ -1385,7 +1385,7 @@
"description": "Möjliggör den dolda Appearance Setting\nKan inte krävas på nyare Snapchat-versioner"
},
"friend_feed_message_preview": {
- "name": "Friend Feed Message Preview",
+ "name": "Meddelandef?rhandsvisning i v?nfl?det",
"description": "Visar en förhandsvisning av de sista meddelandena i Friend Feed",
"properties": {
"amount": {
@@ -1395,11 +1395,11 @@
}
},
"snap_preview": {
- "name": "Snap Preview",
+ "name": "Snap-f?rhandsvisning",
"description": "Visar en liten förhandsvisning bredvid osynliga snaps i chatt"
},
"bootstrap_override": {
- "name": "Bootstrap Override",
+ "name": "Bootstrap-override",
"description": "Overrides användargränssnitt bootstrap inställningar",
"properties": {
"app_appearance": {
@@ -1407,7 +1407,7 @@
"description": "Ställ en ihållande App Appearance"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "Hemflik",
"description": "Överskrider startfliken när du öppnar Snapchat"
}
}
@@ -1421,15 +1421,15 @@
"description": "Förhindrar meddelandelistan från rullning till botten när du skickar / tar emot ett meddelande"
},
"streak_expiration_info": {
- "name": "Show Streak Expiration Info",
+ "name": "Visa info om streaks utg?ng",
"description": "Visar en Streak Expiration timer bredvid Streaks counter"
},
"hide_friend_feed_entry": {
- "name": "Hide Friend Feed Entry",
+ "name": "D?lj post i v?nfl?det",
"description": "Döljer en specifik vän från Friend Feed\nAnvänd den sociala fliken för att hantera den här funktionen"
},
"hide_streak_restore": {
- "name": "Hide Streak Restore",
+ "name": "D?lj ?terst?llning av streak",
"description": "Döljer återställningsknappen i vänflödet"
},
"hide_quick_add_suggestions": {
@@ -1437,7 +1437,7 @@
"description": "Ta bort snabba tillägg vän förslag"
},
"hide_story_suggestions": {
- "name": "Hide Story Suggestions",
+ "name": "D?lj storyf?rslag",
"description": "Ta bort förslag från sidan Berättelser"
},
"hide_ui_components": {
@@ -1469,7 +1469,7 @@
"description": "Möjliggör den vertikala historiens tittare för alla berättelser"
},
"enable_friend_feed_menu_bar": {
- "name": "Friend Feed Menu Bar",
+ "name": "Menyrad f?r v?nfl?de",
"description": "Möjliggör den nya Friend Feed Menu Bar"
},
"message_indicators": {
@@ -1481,7 +1481,7 @@
"description": "Lägger till en emoji bredvid konversationer i stealth mode"
},
"edit_text_override": {
- "name": "Edit Text Override",
+ "name": "?sidos?tt redigeringstext",
"description": "Overrides textfält beteende"
},
"prevent_forced_keyboard": {
@@ -1499,11 +1499,11 @@
}
},
"messaging": {
- "name": "Messaging",
+ "name": "Meddelanden",
"description": "Ändra hur du interagerar med vänner",
"properties": {
"bypass_screenshot_detection": {
- "name": "Bypass Screenshot Detection",
+ "name": "Kringg? sk?rmbildsdetektering",
"description": "Förhindrar Snapchat från att upptäcka när du tar en skärmdump"
},
"anonymous_story_viewing": {
@@ -1523,7 +1523,7 @@
"description": "Förhindrar din Bitmoji från att dyka upp medan du är i Chat"
},
"hide_typing_notifications": {
- "name": "Hide Typing Notifications",
+ "name": "D?lj skrivnotiser",
"description": "Förhindrar någon från att veta att du skriver ett meddelande"
},
"unlimited_snap_view_time": {
@@ -1543,7 +1543,7 @@
"description": "Automatiskt hoppar över till nästa Snap när du markerar en Snap som sett.\nAnvänd i kombination med Mark Snap som Seen Button"
},
"loop_media_playback": {
- "name": "Loop Media Playback",
+ "name": "Loopad medieuppspelning",
"description": "Loops media uppspelning när du tittar på Snaps / Stories"
},
"disable_replay_in_ff": {
@@ -1551,7 +1551,7 @@
"description": "Inaktiverar förmågan att spela med en lång press från Friend Feed"
},
"half_swipe_notifier": {
- "name": "Half Swipe Notifier",
+ "name": "Halv-svep-avisering",
"description": "Meddelar dig när någon halv sveper in i en konversation",
"properties": {
"min_duration": {
@@ -1565,7 +1565,7 @@
}
},
"call_start_confirmation": {
- "name": "Call Start Confirmation",
+ "name": "Bekr?ftelse vid samtalsstart",
"description": "Visar en bekräftelsedialog när du startar ett samtal"
},
"unlimited_conversation_pinning": {
@@ -1581,7 +1581,7 @@
"description": "Förhindrar att skicka vissa typer av meddelanden"
},
"friend_mutation_notifier": {
- "name": "Friend Mutation Notifier",
+ "name": "Avisering om v?n?ndring",
"description": "Meddelar dig när något ändras i en väns profil"
},
"better_notifications": {
@@ -1593,15 +1593,15 @@
"description": "Gruppmeddelanden till en enda"
},
"chat_preview": {
- "name": "Chat Preview",
+ "name": "Chattf?rhandsvisning",
"description": "Visar en förhandsvisning av mottagna meddelanden i meddelandet"
},
"media_preview": {
- "name": "Media Preview",
+ "name": "Mediaf?rhandsvisning",
"description": "Visar en förhandsvisning av de valda medietyperna i meddelandet"
},
"media_caption": {
- "name": "Media Caption",
+ "name": "Mediatext",
"description": "Visar den bifogade bildtexten av media i meddelandet"
},
"stacked_media_messages": {
@@ -1647,7 +1647,7 @@
"description": "Förhindrar dina egna meddelanden från att raderas"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Automatisk rensning",
"description": "Automatiskt raderar cachade meddelanden som är äldre än den angivna tiden"
},
"message_filter": {
@@ -1681,7 +1681,7 @@
"description": "Gör externa medier osaveable"
},
"sticker": {
- "name": "Stickers",
+ "name": "Klisterm?rken",
"description": "Gör klistermärken osaveable"
},
"share": {
@@ -1689,11 +1689,11 @@
"description": "Gör delat innehåll osparabart"
},
"note": {
- "name": "Audio Notes",
+ "name": "R?stanteckningar",
"description": "Gör ljudanteckningar osaveable"
},
"story_reply": {
- "name": "Story Replies",
+ "name": "Story-svar",
"description": "Gör story svar osaveable"
}
}
@@ -1703,7 +1703,7 @@
"description": "Spoofs mediakällan när du skickar från Galleriet",
"properties": {
"mode": {
- "name": "Override Mode",
+ "name": "?sidos?ttningsl?ge",
"description": "Välj hur gallerimedia skickas"
},
"include_camera_snaps": {
@@ -1713,15 +1713,15 @@
}
},
"strip_media_metadata": {
- "name": "Strip Media Metadata",
+ "name": "Ta bort mediametadata",
"description": "Ta bort metadata från media innan du skickar som ett meddelande"
},
"bypass_message_retention_policy": {
- "name": "Bypass Message Retention Policy",
+ "name": "Kringg? policy f?r meddelandelagring",
"description": "Förhindrar meddelanden från att raderas efter att ha visat dem"
},
"bypass_message_action_restrictions": {
- "name": "Bypass Message Action Restrictions",
+ "name": "Kringg? begr?nsningar f?r meddelande?tg?rder",
"description": "Låter dig reagera på en snap utan att ha öppnat den eller spara ett osäkert meddelande"
},
"remove_groups_locked_status": {
@@ -1729,11 +1729,11 @@
"description": "Tillåter dig att visa gruppinformation efter att ha blivit sparkad"
},
"double_tap_chat_action": {
- "name": "Double Tap Chat Action",
+ "name": "Dubbeltrycks?tg?rd i chatt",
"description": "Utför en anpassad åtgärd när dubbla knacka på ett meddelande i chatt"
},
"double_tap_chat_action_custom_emoji": {
- "name": "Double Tap Chat Action Custom Emoji Reaction",
+ "name": "Dubbeltrycks?tg?rd i chatt f?r anpassad emoji-reaktion",
"description": "Ställ en anpassad emoji reaktion för dubbel kranchatt åtgärd"
},
"auto_reply": {
@@ -1745,11 +1745,11 @@
"description": "Tillåter Auto svar att köra i bakgrunden. Notera: Detta kommer att avsevärt dränera ditt batteri"
},
"cooldown_seconds": {
- "name": "Cooldown Seconds",
+ "name": "Nedkylningssekunder",
"description": "Minsta tid mellan auto-replies till samma konversation (i sekunder)"
},
"message_age_threshold": {
- "name": "Message Age Threshold",
+ "name": "Tr?skel f?r meddelandets ?lder",
"description": "Svara bara på meddelanden som tagits emot inom denna tidsram (på några sekunder)"
},
"ai_config": {
@@ -1765,23 +1765,23 @@
"description": "Välj vilken AI-tjänst som ska användas för att generera svar"
},
"ai_endpoint_url": {
- "name": "AI Endpoint URL",
+ "name": "URL f?r AI-endpunkt",
"description": "API endpoint URL för AI-tjänsten (t.ex. OpenAI, lokal AI-server)"
},
"ai_model": {
- "name": "AI Model",
+ "name": "AI-modell",
"description": "AI-modell för att använda för att generera svar (t.ex. gpt-3.5-turbo, gpt-4)"
},
"ai_api_key": {
- "name": "AI API Key",
+ "name": "AI-API-nyckel",
"description": "API nyckel för autentisering med AI-tjänsten"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "AI-systemprompt",
"description": "Systemprompt som definierar AI: s personlighet och beteende"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "AI max tokens",
"description": "Maximalt antal tokens (ord) AI kan använda som svar"
},
"ai_temperature": {
@@ -1827,7 +1827,7 @@
}
},
"auto_trigger_config": {
- "name": "Auto Trigger Configuration",
+ "name": "Konfiguration f?r automatiska utl?sare",
"description": "Inställningar för auto-reply triggers och meddelandemallar",
"properties": {
"friendSpecificGreeting": {
@@ -1835,11 +1835,11 @@
"description": "Lägg till väns namn till auto-replies för personalisering"
},
"friendGreeting": {
- "name": "Friend Greeting",
+ "name": "H?lsning till v?n",
"description": "Hälsning text att använda när vän specifik hälsning är aktiverad"
},
"auto_reply_content_types": {
- "name": "Auto Reply Triggers",
+ "name": "Auto-svarstriggers",
"description": "Välj vilka meddelandetyper som ska utlösa auto-replies"
},
"chat_messages": {
@@ -1851,7 +1851,7 @@
"description": "Auto-reply meddelanden för snaps"
},
"story_share_messages": {
- "name": "Story Share Replies",
+ "name": "Svar p? storydelningar",
"description": "Auto-reply-meddelanden för berättelseaktier"
},
"story_reply_messages": {
@@ -1899,11 +1899,11 @@
"description": "Minsta fördröjning i millisekunder innan du öppnar ett snap"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Max f?rdr?jning (ms)",
"description": "Maximal fördröjning i millisekunder innan du öppnar ett snap"
},
"queue_size": {
- "name": "Queue Size",
+ "name": "K?storlek",
"description": "Maximalt antal snaps för att hålla i kö"
},
"retry_attempts": {
@@ -1911,7 +1911,7 @@
"description": "Antal gånger för att försöka öppna ett snap om det misslyckas"
},
"retry_delay": {
- "name": "Retry Delay (ms)",
+ "name": "?terf?rs?ksf?rdr?jning (ms)",
"description": "Fördröjning i millisekunder mellan försök till retry"
}
}
@@ -1929,7 +1929,7 @@
"description": "Tidsvärde innan du raderar det skickade meddelandet"
},
"delete_after_unit": {
- "name": "Time Unit",
+ "name": "Tidsenhet",
"description": "Välj tidsenheten för raderingsfördröjning"
},
"message_types": {
@@ -1937,7 +1937,7 @@
"description": "Välj vilka meddelandetyper som ska tas bort automatiskt"
},
"show_countdown": {
- "name": "Show Countdown",
+ "name": "Visa nedr?kning",
"description": "Visa nedräkning innan du tar bort meddelandet"
},
"show_notification": {
@@ -1991,11 +1991,11 @@
"description": "Paus översättning när tjänsten blockeras"
},
"max_retries": {
- "name": "Max Retries",
+ "name": "Max antal f?rs?k",
"description": "Maximalt antal retry försök"
},
"retry_delay": {
- "name": "Retry Delay",
+ "name": "?terf?rs?ksf?rdr?jning",
"description": "Fördröjning mellan försök (milliseconds)"
}
}
@@ -2023,10 +2023,10 @@
"name": "Auto Delete Sent meddelanden"
},
"auto_download": {
- "name": "Auto Download"
+ "name": "Automatisk nedladdning"
},
"stealth": {
- "name": "Stealth Mode"
+ "name": "Smygl?ge"
},
"auto_save": {
"name": "Auto Spara"
@@ -2052,11 +2052,11 @@
"description": "Ersätter fångade bilder med en svart bakgrund\nVideor påverkas inte"
},
"immersive_camera_preview": {
- "name": "Immersive Preview",
+ "name": "Uppslukande f?rhandsvisning",
"description": "Förhindrar Snapchat från Cropping the Camera förhandsvisning\nDetta kan leda till att kameran flimrar på vissa enheter"
},
"override_front_resolution": {
- "name": "Override Front Resolution",
+ "name": "?sidos?tt frontuppl?sning",
"description": "Överskrider kameraupplösningen för främre kameran"
},
"override_back_resolution": {
@@ -2068,7 +2068,7 @@
"description": "Anger en anpassad kameraupplösning, bredd x höjd (t.ex. 1920x1080).\nDen anpassade resolutionen måste stödjas av din enhet"
},
"front_custom_frame_rate": {
- "name": "Front Custom Frame Rate",
+ "name": "Anpassad bildfrekvens fram",
"description": "Åsidosätter frontkameraramhastigheten"
},
"back_custom_frame_rate": {
@@ -2076,7 +2076,7 @@
"description": "Åsidosätter ryggkamerans ramhastighet"
},
"force_camera_source_encoding": {
- "name": "Force Camera Source Encoding",
+ "name": "Tvinga kodning f?r kamerak?lla",
"description": "Tvingar kamerakällan kodning"
},
"startup_default_camera": {
@@ -2112,7 +2112,7 @@
"description": "Experimentella funktioner",
"properties": {
"native_hooks": {
- "name": "Native Hooks",
+ "name": "Native hooks",
"description": "Unsafe Funktioner som krokar i Snapchats ursprungliga kod",
"properties": {
"composer_hooks": {
@@ -2124,11 +2124,11 @@
"description": "Visar det första skapade användarnamnet bredvid det aktuella användarnamnet på profilsidan"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera Roll Limit",
+ "name": "Kringg? kamerarolllimit",
"description": "Ökar den maximala mängden media du kan skicka från kamerarullen"
},
"custom_self_destruct_snap_delay": {
- "name": "Custom Self Destruct Snap Delay",
+ "name": "Anpassad sj?lvdestruktionsf?rdr?jning f?r Snap",
"description": "Ger fler alternativ för självförstörande timer när du skickar en Snap"
},
"composer_console": {
@@ -2160,7 +2160,7 @@
"description": "Spoof olika information om dig",
"properties": {
"play_store_installer_package_name": {
- "name": "Play Store Installer Package Name",
+ "name": "Paketnamn f?r Play Store-installerare",
"description": "Överskrider installationspaketnamnet till com.android.vending"
},
"remove_vpn_transport_flag": {
@@ -2176,11 +2176,11 @@
"description": "Tvinga nättransporter att rapportera Wi-Fi istället för mobildata"
},
"spoof_device_id": {
- "name": "Spoof Device ID",
+ "name": "Spoofa enhets-ID",
"description": "Överrid Android-ID skickas till Snapchat",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Spoofa Android-ID",
"description": "Överrid Android-ID skickas till Snapchat med ett anpassat värde"
},
"custom_android_id": {
@@ -2190,7 +2190,7 @@
}
},
"spoof_device": {
- "name": "Spoof Device",
+ "name": "Spoofa enhet",
"description": "Presentera Snapchat som körs på en annan enhetsmodell"
},
"device_model": {
@@ -2204,15 +2204,15 @@
"description": "Konverterar snaps för att chatta externa medier lokalt. Detta visas i chattnedladdning kontextmenyn"
},
"media_file_picker": {
- "name": "Media File Picker",
+ "name": "Mediefilv?ljare",
"description": "Låter dig välja någon video / ljudfil från galleriet"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Story-logg",
"description": "Ger en historia av vänner berättelser"
},
"call_recorder": {
- "name": "Call Recorder",
+ "name": "Samtalsinspelare",
"description": "Automatiskt registrerar ljudsamtal"
},
"account_switcher": {
@@ -2220,7 +2220,7 @@
"description": "Låter dig växla mellan konton utan att logga ut\nLångt tryck på sökikonen bredvid din Bitmoji-profil för att öppna menyn\nNotera: Den här funktionen är experimentell och kommer sannolikt att förändras i framtiden",
"properties": {
"auto_backup_current_account": {
- "name": "Auto Backup Current Account",
+ "name": "Automatisk s?kerhetskopiering av aktuellt konto",
"description": "Automatiskt säkerhetskopierar det aktuella kontot när du loggar ut eller byter konton"
}
}
@@ -2244,11 +2244,11 @@
}
},
"voice_note_auto_play": {
- "name": "Voice Note Auto Play",
+ "name": "Automatisk uppspelning av r?stanteckningar",
"description": "Spelar automatiskt nästa röstnot efter att den nuvarande slutar"
},
"friend_notes": {
- "name": "Friend Notes",
+ "name": "V?nanteckningar",
"description": "Låter dig lägga till anteckningar till vänner profiler"
},
"cof_experiments": {
@@ -2256,11 +2256,11 @@
"description": "Möjligheter outgivna/beta Snapchat-funktioner"
},
"context_menu_fix": {
- "name": "Context Menu Fix",
+ "name": "Korrigering av kontextmeny",
"description": "Försök att reparera Friend Feed-menyn som när enheten är offline kan den inte visas korrekt"
},
"app_lock": {
- "name": "App Lock",
+ "name": "App-l?s",
"description": "Förhindrar tillgång till Snapchat utan lösenord",
"properties": {
"lock_on_resume": {
@@ -2270,7 +2270,7 @@
}
},
"infinite_story_boost": {
- "name": "Infinite Story Boost",
+ "name": "O?ndlig Story-boost",
"description": "Bypass Story Boost Limit försening"
},
"meo_passcode_bypass": {
@@ -2334,7 +2334,7 @@
"description": "Den mapp där skripten finns"
},
"auto_reload": {
- "name": "Auto Reload",
+ "name": "Automatisk omladdning",
"description": "Reloader automatiskt skript när de ändras"
},
"integrated_ui": {
@@ -2356,7 +2356,7 @@
"description": "Records väns aktivitet på Snapchat",
"properties": {
"record_messaging_events": {
- "name": "Record Messaging Events",
+ "name": "Spela in meddelandeh?ndelser",
"description": "Records meddelandehändelser som att öppna en snap, läsa ett meddelande etc."
},
"allow_running_in_background": {
@@ -2364,7 +2364,7 @@
"description": "Tillåter trackern att köra i bakgrunden. Notera: Detta kommer att avsevärt dränera ditt batteri"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Automatisk rensning",
"description": "Automatiskt tar bort cachade händelser som är äldre än den angivna tiden"
}
}
@@ -2378,56 +2378,56 @@
"mark_snaps_as_seen": "Mark Snaps sett",
"mark_stories_as_seen_locally": "Mark Stories som ses lokalt",
"preview": "Förhandsgranskning",
- "stealth_mode": "Stealth Mode",
- "auto_download_blacklist": "Auto Download Blacklist",
+ "stealth_mode": "Smygl?ge",
+ "auto_download_blacklist": "Svartlista f?r automatisk nedladdning",
"anti_auto_save": "Anti Auto Spara"
},
"content_type": {
"CHAT": "Chatta",
"SNAP": "Snap",
"EXTERNAL_MEDIA": "Externa medier",
- "NOTE": "Audio Note",
- "STICKER": "Sticker",
+ "NOTE": "R?stanteckning",
+ "STICKER": "Klisterm?rke",
"SHARE": "Dela",
"STATUS": "Status",
"LOCATION": "Plats",
"STATUS_SAVE_TO_CAMERA_ROLL": "Sparad till Camera Roll",
- "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "Screenshot",
- "STATUS_CONVERSATION_CAPTURE_RECORD": "Screen Record",
+ "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "Sk?rmbild",
+ "STATUS_CONVERSATION_CAPTURE_RECORD": "Sk?rminspelning",
"STATUS_CALL_MISSED_VIDEO": "Missat videosamtal",
"STATUS_CALL_MISSED_AUDIO": "Saknade Audio Call",
- "LIVE_LOCATION_SHARE": "Live Location Share",
- "CREATIVE_TOOL_ITEM": "Creative Tool Item",
+ "LIVE_LOCATION_SHARE": "Dela liveplats",
+ "CREATIVE_TOOL_ITEM": "Kreativt verktygsobjekt",
"FAMILY_CENTER_INVITE": "Hotell nära Family Center Invite",
"FAMILY_CENTER_ACCEPT": "Familjecentrum Acceptera",
"FAMILY_CENTER_LEAVE": "Hotell nära Family Center Leave",
- "STATUS_PLUS_GIFT": "Status Plus Gift",
- "TINY_SNAP": "Tiny Snap",
- "STATUS_COUNTDOWN": "Countdown",
+ "STATUS_PLUS_GIFT": "Status Plus-g?va",
+ "TINY_SNAP": "Mini-Snap",
+ "STATUS_COUNTDOWN": "Nedr?kning",
"MAP_REACTION": "Karta Reaktion",
"chat_messages": "Chattmeddelanden",
"snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
- "story_reply_messages": "Story Replies",
+ "story_share_messages": "Story-delningar",
+ "story_reply_messages": "Story-svar",
"external_media_messages": "Externa medier",
- "voice_note_messages": "Voice Note",
- "sticker_messages": "Sticker",
- "tiny_snap_messages": "Tiny Snap",
+ "voice_note_messages": "R?stanteckning",
+ "sticker_messages": "Klisterm?rke",
+ "tiny_snap_messages": "Mini-Snap",
"map_reaction_messages": "Karta Reaktion",
"half_swipes": "Hälften Swipes"
},
"media_download_source": {
"none": "Ingen",
"pending": "I väntan",
- "chat_media": "Chat Media",
+ "chat_media": "Chattmedia",
"story": "Berättelse",
"public_story": "Offentlig berättelse",
"spotlight": "Spotlight",
"profile_picture": "Profilbild",
- "story_logger": "Story Logger",
+ "story_logger": "Story-logg",
"message_logger": "Meddelande Logger",
"merged": "Sammanslagna",
- "voice_call": "Voice Call"
+ "voice_call": "R?stsamtal"
},
"chat_action_menu": {
"preview_button": "Förhandsgranskning",
@@ -2452,7 +2452,7 @@
"gallery_media_send_override": {
"always_ask": "Alltid fråga",
"ORIGINAL": "Originalmedier",
- "NOTE": "Audio Note",
+ "NOTE": "R?stanteckning",
"SNAP": "Snap",
"SAVEABLE_SNAP": "Sparabar Snap",
"null": "Snapchat standard",
@@ -2475,7 +2475,7 @@
"profile_info": {
"title": "Profil Info",
"first_created_username": "Första Skapat Användarnamn",
- "mutable_username": "Mutable Username",
+ "mutable_username": "?ndringsbart anv?ndarnamn",
"display_name": "Visa namn",
"added_date": "Tillagd datum",
"birthday": "Födelsedag:{month}{day}",
@@ -2494,7 +2494,7 @@
},
"friendship_link_type": {
"mutual": "Ömsesidig",
- "outgoing": "Outgoing",
+ "outgoing": "Utg?ende",
"blocked": "Blockerad",
"deleted": "Raderad",
"following": "Följer",
@@ -2526,7 +2526,7 @@
"groups_only": "Grupper Endast",
"both": "Vänner och grupper"
},
- "sort_by": "Sort by",
+ "sort_by": "Sortera efter",
"reverse_order": "Omvänd order",
"search_by_name": "Sök efter namn",
"no_friends_found": "Inga vänner hittade",
@@ -2562,7 +2562,7 @@
"none": "Ingen",
"username": "Användarnamn",
"added_timestamp": "Tillagd Timestamp",
- "snap_score": "Snap Score",
+ "snap_score": "Snap-po?ng",
"streak_length": "Streak Längd",
"most_messages_sent": "De flesta meddelanden skickas",
"most_recent_message": "De senaste meddelandena",
@@ -2580,7 +2580,7 @@
"download_medias_title": "Ladda ner media"
},
"dialog_negative_button": "Avbokning",
- "dialog_positive_button": "Export",
+ "dialog_positive_button": "Exportera",
"exported_to": "Exporterad till{path}",
"exporting_chats": "Exportera chattar...",
"processing_chats": "Bearbetning{amount}samtal...",
@@ -2603,8 +2603,8 @@
"convert_external_media": "Konvertera externa medier"
},
"tracker_events": {
- "conversation_enter": "Conversation Enter",
- "conversation_exit": "Conversation Exit",
+ "conversation_enter": "Gick in i konversation",
+ "conversation_exit": "L?mnade konversation",
"started_typing": "Startad Typing",
"stopped_typing": "Stoppad Typing",
"started_speaking": "Började tala",
@@ -2614,22 +2614,22 @@
"message_read": "Meddelande Läs",
"message_deleted": "Meddelande raderad",
"message_saved": "Meddelande sparat",
- "message_unsaved": "Message Unsaved",
- "message_edited": "Message Edited",
+ "message_unsaved": "Meddelande sparades inte",
+ "message_edited": "Meddelande redigerat",
"message_reaction_add": "Meddelande Reaktion Lägg till",
- "message_reaction_remove": "Message Reaction Remove",
+ "message_reaction_remove": "Ta bort meddelandereaktion",
"snap_opened": "Snap öppnad",
- "snap_replayed": "Snap Replayed",
+ "snap_replayed": "Snap spelad igen",
"snap_replayed_twice": "Snap spelade två gånger",
- "snap_screenshot": "Snap Screenshot",
- "snap_screen_record": "Snap Screen Record",
+ "snap_screenshot": "Snap-sk?rmbild",
+ "snap_screen_record": "Snap-sk?rminspelning",
"i_can_see_you": "Jag kan se dig"
},
"cleared_from_feed": "Cleared från feed",
"tracker_actions": {
"log": "Logga in",
"in_app_notification": "In-App-meddelande",
- "push_notification": "Push Notification",
+ "push_notification": "Pushnotis",
"custom": "Anpassad"
},
"better_notifications": {
@@ -2646,26 +2646,26 @@
"background_option": "Bakgrund"
},
"call_start_confirmation": {
- "dialog_title": "Start Call",
+ "dialog_title": "Starta samtal",
"dialog_message": "Är du säker på att du vill starta ett samtal?"
},
"half_swipe_notifier": {
- "notification_channel_name": "Half Swipe",
+ "notification_channel_name": "Halv-svep",
"notification_content_dm": "{friend}bara halvswiped in i din chatt för{duration}sekunder",
"notification_content_group": "{friend}bara halvswiped in{group}för{duration}sekunder"
},
"download_processor": {
"attachment_type": {
"snap": "Snap",
- "sticker": "Sticker",
+ "sticker": "Klisterm?rke",
"gif": "GIF",
"external_media": "Externa medier",
- "note": "Note",
- "original_story": "Original Story"
+ "note": "Anteckning",
+ "original_story": "Original-story"
},
"select_attachments_title": "Välja bilagor",
"download_started_toast": "Ladda ner start",
- "unsupported_content_type_toast": "Unsupported content type!",
+ "unsupported_content_type_toast": "Inneh?llstyp st?ds inte!",
"failed_no_longer_available_toast": "Media är inte längre tillgängligt",
"no_attachments_toast": "Inga bilagor hittades!",
"already_queued_toast": "Media redan i kö!",
@@ -2720,7 +2720,7 @@
"incoming_secret_message": "Din vän accepterade bara din offentliga nyckel. Klicka nedan för att acceptera hemligheten."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
+ "title": "?ppna Snaps automatiskt",
"priority_title": "Auto Open Snaps (prioritet)",
"error_title": "Auto Open Snaps (fel)",
"channel_description": "Meddelanden för automatiska snaps köstatus",
@@ -2732,19 +2732,19 @@
"recent_snaps": "Nya Snaps",
"action_pause": "Paus",
"action_resume": "Återkomma",
- "action_clear": "Clear Queue",
+ "action_clear": "Rensa k?",
"action_reset": "Återställ greve",
"error_content": "Misslyckades med att öppna snap från{sender}Från:{error}",
"resumed_feedback": "Auto Open återkallad",
- "paused_feedback": "Auto Open Paused",
+ "paused_feedback": "Automatisk ?ppning pausad",
"resumed_message": "Processing kommer att fortsätta automatiskt för köade snaps",
"paused_message": "Processing paused. Queue bevarad (bevarad){count}snaps)",
- "status_paused": "Paused",
+ "status_paused": "Pausad",
"status_monitoring": "Övervakning",
"status_active": "Aktiv",
"queue_cleared": "Queue cleared och statistikåterställning",
- "queue_cleared_title": "Queue cleared",
- "queue_cleared_reset": "Queue Cleared & Reset",
+ "queue_cleared_title": "K? rensad",
+ "queue_cleared_reset": "K? rensad och ?terst?lld",
"queue_cleared_feedback": "Tydlig{count}kö snaps • Återställ{processed}processed count",
"queue_cleared_feedback_simple": "Återställ{processed}processed count",
"unknown_sender": "Okänd",
@@ -2756,10 +2756,10 @@
"conversation_type_group_chat": "Gruppchatt",
"conversation_type_chat": "Chatta",
"notification_status": "Status",
- "notification_statistics": "STATISTICS",
- "notification_queue_size": "Queue Size",
+ "notification_statistics": "STATISTIK",
+ "notification_queue_size": "K?storlek",
"notification_total_opened": "Totala Snaps öppnade",
- "notification_queue_preview": "QUEUE PREVIEW",
+ "notification_queue_preview": "K?F?RHANDSVISNING",
"notification_processing_continue": "Processing kommer att fortsätta automatiskt...",
"notification_no_snaps_queue": "Inga snaps i kö.",
"notification_queue_cleared_opened": "Queue cleared (förklarad){opened}öppnas)",
@@ -2845,7 +2845,7 @@
"date_range_picker_end_headline": "För att",
"date_range_picker_title": "Välj datumintervallet",
"date_picker_switch_to_calendar_mode": "Kalender",
- "date_picker_switch_to_input_mode": "Input",
+ "date_picker_switch_to_input_mode": "Inmatning",
"date_range_picker_scroll_to_previous_month": "Föregående månad",
"date_range_picker_scroll_to_next_month": "Nästa månad",
"date_picker_today_description": "Idag idag idag",
@@ -2853,7 +2853,7 @@
"date_input_invalid_for_pattern": "Invalid datum",
"date_input_invalid_year_range": "Invalid år",
"date_input_invalid_not_allowed": "Invalid datum",
- "date_range_input_invalid_range_input": "Invalid date range"
+ "date_range_input_invalid_range_input": "Ogiltigt datumintervall"
},
"send_override_dialog": {
"title": "Skicka media som",
@@ -2917,7 +2917,7 @@
"lt": "Litauen",
"mt": "Maltesiska",
"ga": "Irländska",
- "cy": "Welsh"
+ "cy": "Walesiska"
},
"tracker": {
"tabs": {
@@ -2925,8 +2925,8 @@
"rules": "Regler"
},
"actions": {
- "export": "Export",
- "delete": "Delete",
+ "export": "Exportera",
+ "delete": "Radera",
"add_rule": "Lägga till regel",
"save_rule": "Spara regel"
},
@@ -2948,7 +2948,7 @@
"types": {
"username": "Användarnamn",
"conversation": "Konversation",
- "event": "Event"
+ "event": "H?ndelse"
},
"event_types": {
"conversation_enter": "Inmatad konversation",
@@ -2967,9 +2967,9 @@
"message_reaction_add": "Tillagd reaktion",
"message_reaction_remove": "Removed reaktion",
"snap_opened": "Öppna snap",
- "snap_replayed": "Replayed snap",
+ "snap_replayed": "Spelade upp en snap igen",
"snap_replayed_twice": "Replayed snap två gånger",
- "snap_screenshot": "Took screenshot",
+ "snap_screenshot": "Tog sk?rmbild",
"snap_screen_record": "Screen inspelad"
}
},
@@ -2983,7 +2983,7 @@
"format_csv": "CSV"
},
"delete_dialog": {
- "title": "Delete Logs",
+ "title": "Radera loggar",
"message": "Är du säker på att du vill ta bort alla loggar? Denna åtgärd kan inte ångras.",
"confirm": "Ta bort alla",
"cancel": "Avbokning",
@@ -2993,7 +2993,7 @@
"in_conversation": "in i{conversation}",
"unknown_user": "Okänd",
"unknown_conversation": "DMs",
- "i_can_see_you_entered": "Entered",
+ "i_can_see_you_entered": "Gick in",
"i_can_see_you_left": "Vänster",
"i_can_see_you_duration": "Varaktighet",
"i_can_see_you_not_available": "N/A",
@@ -3028,11 +3028,11 @@
},
"edit_rule": {
"custom_rule": "Anpassad regel",
- "scope": "Scope",
+ "scope": "Omfattning",
"events": "Händelser",
"add_event": "Lägg till evenemang",
"type": "Typ",
- "triggers": "Triggers",
+ "triggers": "Utl?sare",
"conditions": "Villkor",
"only_inside_conversation": "Först när jag är inne i konversation",
"only_outside_conversation": "Först när jag är utanför konversation",
@@ -3047,13 +3047,13 @@
}
},
"debug": {
- "title": "Debug",
- "clear": "Clear",
+ "title": "Fels?kning",
+ "clear": "Rensa",
"files": {
"config_json": "Konfigurationsfil",
"mappings_json": "Kartläggningsfil",
"message_logger_db": "Meddelande Logger Database",
- "pinned_best_friend_txt": "Pinned Best Friend File",
+ "pinned_best_friend_txt": "Fil f?r f?st b?sta v?n",
"native_sig_cache_txt": "Native signatur Cache File"
},
"settings": {
@@ -3064,15 +3064,15 @@
}
},
"ui_settings_title": "UI Inställningar",
- "haptic_feedback_label": "Haptic Feedback",
+ "haptic_feedback_label": "Haptisk feedback",
"updates_title": "Uppdateringar",
- "auto_update_check": "Auto Update Check",
+ "auto_update_check": "Automatisk uppdateringskontroll",
"update_check_frequency_daily": "Dagligen",
- "update_check_frequency_weekly": "Weekly",
+ "update_check_frequency_weekly": "Veckovis",
"update_check_frequency_monthly": "Månadsvis",
"update_channel_stable": "Stabilt",
- "update_channel_prerelease": "Pre-release",
- "friend_notes_title": "Friend Notes",
+ "update_channel_prerelease": "F?rhandsversion",
+ "friend_notes_title": "V?nanteckningar",
"friend_notes_description": "Hantera och säkerhetskopiera dina vännoter",
"app_theme_title": "App tema",
"theme_mode_system": "Systemsystem",
@@ -3097,9 +3097,9 @@
"sort_by_folder": "Sortera efter mapp",
"include_my_eyes_only": "Inkludera mina ögon",
"cancel": "Avbokning",
- "export": "Export",
- "quit": "Quit",
- "done": "Done",
+ "export": "Exportera",
+ "quit": "Avsluta",
+ "done": "Klar",
"ok": "OK",
"exporting_memories": "Exportera minnen... (b){failed}misslyckats)"
},
@@ -3119,15 +3119,15 @@
"cancel": "Avbokning",
"add": "Lägg till",
"ok": "OK",
- "quit": "Quit",
- "done": "Done",
+ "quit": "Avsluta",
+ "done": "Klar",
"back": "Tillbaka",
"unknown": "Okänd",
"added": "Tillagd",
"no_friends_found": "Inga vänner hittade",
"exporting_memories": "Exportera minnen... (b){failed}misslyckats)"
},
- "clear_friend_feed": "Clear Friend Feed",
+ "clear_friend_feed": "Rensa v?nfl?de",
"select_date": "Välj datum",
"schedule_scheduled_for": "Schemalagt för{name}in i{time}",
"schedule_sending_in": "Skicka in{time}",
@@ -3138,7 +3138,7 @@
"schedule_cancelled_for": "Avbokad för{name}",
"by_author": "av{author}",
"version": "Version{version}",
- "delete_button": "Delete",
+ "delete_button": "Radera",
"logger_history": {
"download_started": "Ladda ner start!",
"downloaded_to": "Nedladdad till{path}",
@@ -3182,12 +3182,12 @@
"failed_to_edit_message": "Underlåten att redigera meddelande:{error}"
},
"ai_response_style": {
- "casual": "Casual",
+ "casual": "Avslappnad",
"formal": "Formell",
"friendly": "Vänlig",
"humorous": "Humorös",
"empathetic": "Empatiska",
- "busy": "Busy",
+ "busy": "Upptagen",
"toxic": "Toxisk"
},
"ai_response_language": {
@@ -3218,4 +3218,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/tr_TR.json b/common/src/main/assets/lang/tr_TR.json
index a73e1228..bc933d79 100644
--- a/common/src/main/assets/lang/tr_TR.json
+++ b/common/src/main/assets/lang/tr_TR.json
@@ -1,220 +1,220 @@
-{
+{
"setup": {
"dialogs": {
- "select_language": "Dil seçin",
- "save_folder": "Indirmeleri kurtarmak için nerede seçilir",
- "select_save_folder_button": "Select"
+ "select_language": "Dil Seç",
+ "save_folder": "İndirmelerin kaydedileceği yeri seçin",
+ "select_save_folder_button": "Klasör Seç"
},
"mappings": {
- "dialog": "Gening Mappings...",
- "generate_failure_no_snapchat": "PurrfectSnap Snapchat'i tespit edemedi, lütfen Snapchat'i yeniden yüklemeye çalışın.",
- "generate_failure": "Bir hata harita üretmeye çalışırken meydana geldi, lütfen tekrar deneyin."
+ "dialog": "Eşleşmeler oluşturuluyor...",
+ "generate_failure_no_snapchat": "PurrfectSnap Snapchat'i algılayamadı, lütfen Snapchat'i yeniden yükleyin.",
+ "generate_failure": "Eşleşmeler oluşturulurken bir hata oluştu, lütfen tekrar deneyin."
},
"permissions": {
- "dialog": "Bu temelleri sürdürmek için tamamlayın:",
- "notification_access": "Bildirim Access",
- "battery_optimization": "Battery Optimizasyonu",
- "display_over_other_apps": "Diğer Uygulamalar Üzerinde Ekran",
- "request_button": "Talep İste"
+ "dialog": "Devam etmek için şunları tamamlayın:",
+ "notification_access": "Bildirim Erişimi",
+ "battery_optimization": "Pil Optimizasyonu",
+ "display_over_other_apps": "Diğer Uygulamaların Üzerinde Göster",
+ "request_button": "İstek"
}
},
"scopes": {
"friend": "Arkadaş",
- "group": "Grup Grup Grup Grubu"
+ "group": "Grup"
},
"manager": {
"routes": {
"tasks": "Görevler",
"features": "Özellikler",
- "manage_rule_feature": "Rule Feature",
- "home": "Home",
- "home_about": "About",
+ "manage_rule_feature": "Kural Özelliğini Yönet",
+ "home": "Ana Sayfa",
+ "home_about": "Hakkında",
"home_settings": "Ayarlar",
- "home_logs": "Logs",
- "logger_history": "Logger History",
- "logged_stories": "Logged Stories",
- "friend_tracker": "Friend Tracker",
- "friend_tracker_catalog": "Friend Tracker Kataloğu Kataloğu",
- "manage_friend_tracker_repos": "Friend Tracker Repositories",
- "edit_rule": "Düzenleme Kuralı",
- "file_imports": "File Imports",
- "manage_repos": "Repositories Yönetin",
+ "home_logs": "Günlükler",
+ "logger_history": "Kayıt Geçmişi",
+ "logged_stories": "Kayıtlı Hikayeler",
+ "friend_tracker": "Arkadaş Takip",
+ "friend_tracker_catalog": "Arkadaş Takip Kataloğu",
+ "manage_friend_tracker_repos": "Arkadaş Takip Depolarını Yönet",
+ "edit_rule": "Kuralı Düzenle",
+ "file_imports": "Dosya İçe Aktarma",
+ "manage_repos": "Depoları Yönet",
"social": "Sosyal",
- "manage_scope": "Yönetim Kapsam",
- "messaging_preview": "Öpün",
- "scripts": "Senaryolar",
- "manage_script_repos": "Senaryo Repositories",
- "view_logger_history": "Logger History",
+ "manage_scope": "Kapsamı Yönet",
+ "messaging_preview": "Önizleme",
+ "scripts": "Betikler",
+ "manage_script_repos": "Betik Depolarını Yönet",
+ "view_logger_history": "Kayıt Geçmişi",
"better_location": "Daha İyi Konum"
},
"navigation": {
- "customize_bottom_bar_title": "Özelleştir",
- "customize_bottom_bar_subtitle": "Hangi sekmeleri ev ekranınızda göster",
- "available_tabs_title": "Mevcut Tablar",
- "shown_tabs_title": "Shown Tabs",
- "reset_button": "Reset",
- "done_button": "Done"
+ "customize_bottom_bar_title": "Alt Çubuğu Özelleştir",
+ "customize_bottom_bar_subtitle": "Ana ekranda gösterilecek sekmeleri seçin",
+ "available_tabs_title": "Mevcut Sekmeler",
+ "shown_tabs_title": "Gösterilen Sekmeler",
+ "reset_button": "Sıfırla",
+ "done_button": "Bitti"
},
"sections": {
"home": {
- "version_title": "v{versionName}· Sonsuza kadar",
- "update_title": "PurrfectSnap Update",
- "update_content": "Version{version}mevcuttur!",
- "update_button": "Download",
- "debug_build_summary_title": "PurrfectSnap'in bir debug inşasını çalıştırıyorsunuz",
- "debug_build_summary_content": "Version{versionName}({versionCode})",
- "debug_build_summary_date": "Build date:{date}({days}günler önce)",
- "quick_actions_title": "Hızlı Eylemler"
+ "version_title": "v{versionName} · Eternal tarafından",
+ "update_title": "PurrfectSnap Güncellemesi",
+ "update_content": "Sürüm {version} mevcut!",
+ "update_button": "İndir",
+ "debug_build_summary_title": "PurrfectSnap'in hata ayıklama sürümünü kullanıyorsunuz",
+ "debug_build_summary_content": "Sürüm {versionName} ({versionCode})",
+ "debug_build_summary_date": "Derleme tarihi: {date} ({days} gün önce)",
+ "quick_actions_title": "Hızlı İşlemler"
},
"home_logs": {
- "no_logs_hint": "Hiçbir log mevcut",
- "clear_logs_button": "Clear Logs",
- "export_logs_button": "İhracat Logs",
- "saving_logs_toast": "Kayıtları kurtarmak, bu bir süre alabilir ...",
- "saved_logs_success_toast": "Logs başarıyla kurtarıldı",
- "saved_logs_failure_toast": "Logları kurtarmak için başarısız oldu"
+ "no_logs_hint": "Günlük yok",
+ "clear_logs_button": "Günlükleri Temizle",
+ "export_logs_button": "Günlükleri Dışarı Aktar",
+ "saving_logs_toast": "Günlükler kaydediliyor, biraz zaman alabilir ...",
+ "saved_logs_success_toast": "Günlükler başarıyla kaydedildi",
+ "saved_logs_failure_toast": "Günlükler kaydedilemedi"
},
"home_settings": {
"actions_title": "Eylemler",
- "message_logger_title": "Mesaj Logger",
- "debug_title": "Debug",
- "success_toast": "Done!",
- "message_logger_summary": "{messageCount}mesaj mesajları\n{storyCount}hikayeler hikayeleri hikayeler",
- "export_button": "İhracat İhracatı",
- "clear_button": "Clear",
- "view_logger_history_button": "View Logger History",
- "ui_settings_title": "UI Ayarları",
- "haptic_feedback_label": "Haptic Feedback",
- "use_system_toasts_label": "Sistem Tosts",
- "updates_title": "Updates",
- "auto_update_check": "Auto Update Check",
- "update_check_frequency_daily": "Daily",
- "update_check_frequency_weekly": "Weekly",
+ "message_logger_title": "Mesaj Kaydı",
+ "debug_title": "Hata Ayıklama",
+ "success_toast": "Tamam!",
+ "message_logger_summary": "{messageCount} mesaj\n{storyCount} hikaye",
+ "export_button": "Dışarı Aktar",
+ "clear_button": "Temizle",
+ "view_logger_history_button": "Kayıt Geçmişini Görüntüle",
+ "ui_settings_title": "Arayüz Ayarları",
+ "haptic_feedback_label": "Dokunsal Geri Bildirim",
+ "use_system_toasts_label": "Sistem Bildirimlerini Kullan",
+ "updates_title": "Güncellemeler",
+ "auto_update_check": "Otomatik Güncelleme Kontrolü",
+ "update_check_frequency_daily": "Günlük",
+ "update_check_frequency_weekly": "Haftalık",
"update_check_frequency_monthly": "Aylık",
- "update_channel_stable": "Stable",
- "update_channel_prerelease": "Pre-release",
- "update_notification_channel_name": "Updates",
- "update_notification_channel_description": "Yeni sürümler mevcut olduğunda bildirim alın",
+ "update_channel_stable": "Kararlı",
+ "update_channel_prerelease": "Ön sürüm",
+ "update_notification_channel_name": "Güncellemeler",
+ "update_notification_channel_description": "Yeni sürümler yayınlandığında bildirim alın",
"update_notification_title": "Yeni güncelleme mevcut",
- "update_notification_text": "PurrfectSnap açmak ve en son binayı indirmek.",
- "app_theme_title": "App Theme",
- "theme_icon_description": "Açık tema seçinr",
- "theme_mode_system": "Sistem Sistemi",
- "theme_mode_light": "Işık Işığı",
- "theme_mode_dark": "Dark",
+ "update_notification_text": "PurrfectSnap'i açıp en son derlemeyi indirmek için dokunun.",
+ "app_theme_title": "Uygulama Teması",
+ "theme_icon_description": "Tema seçiciyi aç",
+ "theme_mode_system": "Sistem",
+ "theme_mode_light": "Açık",
+ "theme_mode_dark": "Koyu",
"friend_notes_title": "Arkadaş Notları",
- "friend_notes_description": "Arkadaşınızın notlarını yönetin ve yedekleme",
- "friend_notes_no_notes_to_backup": "Henüz geri dönme notları yok",
- "friend_notes_backup_success": "Arkadaş notları desteklendi",
- "friend_notes_restore_success": "Arkadaş notları restore etti",
- "backup_button": "Backup",
- "restore_button": "Geri yükleme geri yükleme",
- "view_button": "View",
- "customize_bottom_bar_title": "Özelleştir",
- "customize_bottom_bar_subtitle": "Hangi sekmeleri ev ekranınızda göster",
- "available_tabs_title": "Mevcut Tablar",
- "reset_button": "Reset",
- "done_button": "Done",
- "clear_friend_feed": "Clear Friend Feed",
- "test_mode_label": "Enable PurrAura",
- "disable_feature_loading_label": "Engelli Özel Yükler",
- "disable_auto_mapper_label": "Disable Auto Mapper",
- "disable_bypass_indicator_label": "Disable Bypass Göstergesi"
+ "friend_notes_description": "Arkadaş notlarını yönetin ve yedekleyin",
+ "friend_notes_no_notes_to_backup": "Yedeklenecek not yok",
+ "friend_notes_backup_success": "Arkadaş notları yedeklendi",
+ "friend_notes_restore_success": "Arkadaş notları geri yüklendi",
+ "backup_button": "Yedekle",
+ "restore_button": "Geri Yükle",
+ "view_button": "Görüntüle",
+ "customize_bottom_bar_title": "Alt Çubuğu Özelleştir",
+ "customize_bottom_bar_subtitle": "Ana ekranda gösterilecek sekmeleri seçin",
+ "available_tabs_title": "Mevcut Sekmeler",
+ "reset_button": "Sıfırla",
+ "done_button": "Bitti",
+ "clear_friend_feed": "Arkadaş Akışını Temizle",
+ "test_mode_label": "PurrAura'yı Etkinleştir",
+ "disable_feature_loading_label": "Özellik Yüklemeyi Devre Dışı Bırak",
+ "disable_auto_mapper_label": "Otomatik Eşleyiciyi Devre Dışı Bırak",
+ "disable_bypass_indicator_label": "Bypass Göstergecini Devre Dışı Bırak"
},
"tasks": {
- "no_tasks": "Hiçbir görev yok",
- "merge_button": "Merge",
- "failed_to_open_file": "Açık dosyayı açmaya başarısız oldu",
- "merge_files_toast": "Merging{count}dosyaları",
- "remove_selected_tasks_title": "Seçilmiş görevleri kaldırmak istediğinizden emin misiniz?",
- "remove_all_tasks_title": "Tüm görevleri kaldırmak istediğinizden emin misiniz?",
- "delete_files_option": "Ayrıca dosyaları silebilirsiniz",
- "remove_selected_tasks_confirm": "Kaldırın{count}görevler?",
- "remove_all_tasks_confirm": "Tüm görevleri kaldır mı?"
+ "no_tasks": "Görev yok",
+ "merge_button": "Birleştir",
+ "failed_to_open_file": "Dosya açılamadı",
+ "merge_files_toast": "{count} dosya birleştiriliyor",
+ "remove_selected_tasks_title": "Seçilen görevleri kaldırmak istediğinize emin misiniz?",
+ "remove_all_tasks_title": "Tüm görevleri kaldırmak istediğinize emin misiniz?",
+ "delete_files_option": "Dosyaları da sil",
+ "remove_selected_tasks_confirm": "{count} görev kaldırılsın mı?",
+ "remove_all_tasks_confirm": "Tüm görevler kaldırılsın mı?"
},
"features": {
- "disabled": "Engelliler",
- "export_option": "İhracat İhracatı",
- "import_option": "İthalat",
- "reset_option": "Reset",
- "config_export_success_toast": "Config başarıyla ihraç etti",
- "config_import_success_toast": "Config başarıyla ithal etti",
- "config_import_failure_toast": "Imarı ithal etmek için başarısız oldu{error}",
- "config_export_failure_toast": "İhracat için başarısız oldu{error}",
- "saved_config_snackbar": "Config kurtarıldı",
- "older_required": "Bu özellik Snapchat v{version}veya daha yaşlı çalışmak doğru düzgün çalışmak için",
- "newer_required": "Bu özellik Snapchat v{version}veya daha yeni çalışmak için",
- "search_button": "Arama",
- "clear_history": "Clear search date",
- "subtitle": "Arama ve yönetme özellikleri"
+ "disabled": "Devre Dışı",
+ "export_option": "Dışarı Aktar",
+ "import_option": "İçe Aktar",
+ "reset_option": "Sıfırla",
+ "config_export_success_toast": "Yapılandırma başarıyla dışarı aktarıldı",
+ "config_import_success_toast": "Yapılandırma başarıyla içe aktarıldı",
+ "config_import_failure_toast": "Yapılandırma içe aktarılamadı {error}",
+ "config_export_failure_toast": "Yapılandırma dışarı aktarılamadı {error}",
+ "saved_config_snackbar": "Yapılandırma kaydedildi",
+ "older_required": "Bu özellik Snapchat v{version} veya daha eski sürümle doğru çalışır",
+ "newer_required": "Bu özellik Snapchat v{version} veya daha yeni sürümle doğru çalışır",
+ "search_button": "Ara",
+ "clear_history": "Arama geçmişini temizle",
+ "subtitle": "Özellikleri ara ve yönet"
},
"manage_rule_feature": {
- "disable_state_option": "Engelliler",
- "disable_state_subtext": "Hiçbir arkadaş / grup etkilenecek",
- "whitelist_state_option": "Dışında kimse yok...",
- "whitelist_state_subtext": "Sadece{count}arkadaşlar/gruplar bu kuraldan etkilenecek",
- "whitelist_state_button": "İzin verilen arkadaşlar/grupları seçin",
- "blacklist_state_option": "Herkes dışında...",
- "blacklist_state_subtext": "Herkes dışında herkes hariç{count}arkadaşlar/gruplar bu kuraldan etkilenecek",
- "blacklist_state_button": "Dışlanmış arkadaşlar / gruplar seçin",
- "clear_list_button": "Clear friends /gruplar listesi",
- "dialog_clear_confirmation_text": "Listeyi temizlemek istediğinizden emin misiniz?"
+ "disable_state_option": "Devre Dışı",
+ "disable_state_subtext": "Hiçbir arkadaş/grup etkilenmeyecek",
+ "whitelist_state_option": "Kimse hariç...",
+ "whitelist_state_subtext": "Bu kuraldan yalnızca {count} arkadaş/grup etkilenecek",
+ "whitelist_state_button": "İzin verilen arkadaş/grupları seç",
+ "blacklist_state_option": "Herkes hariç...",
+ "blacklist_state_subtext": "Bu kuraldan {count} arkadaş/grup dışında herkes etkilenecek",
+ "blacklist_state_button": "Dışlanan arkadaş/grupları seç",
+ "clear_list_button": "Arkadaş/grup listesini temizle",
+ "dialog_clear_confirmation_text": "Listeyi temizlemek istediğinize emin misiniz?"
},
"social": {
- "friends_tab": "Arkadaşları",
- "groups_tab": "Grup Grup Grupları",
+ "friends_tab": "Arkadaşlar",
+ "groups_tab": "Gruplar",
"empty_hint": "Listeniz şimdilik boş",
- "friends_empty_title": "Henüz arkadaş eklemedi",
- "groups_empty_title": "Hiçbir grup henüz senkronize edilmedi",
- "streaks_expiration_short": "{hours}h",
- "social_tagline": "Kapsam yönetin, çizgiler ve önizlemeler",
- "social_empty_hint": "Arkadaşlar veya gruplar için + düğmesine tıklayın."
+ "friends_empty_title": "Henüz arkadaş eklenmedi",
+ "groups_empty_title": "Henüz grup senkronize edilmedi",
+ "streaks_expiration_short": "{hours}sa",
+ "social_tagline": "Kapsamları, serileri ve önizlemeleri yönetin",
+ "social_empty_hint": "+ düğmesine dokunarak arkadaş veya grup senkronize edin."
},
"manage_scope": {
- "logged_stories_button": "Show Logged Stories",
- "e2ee_title": "End-to-Bitki",
+ "logged_stories_button": "Kayıtlı Hikayeleri Göster",
+ "e2ee_title": "Uçtan Uca Şifreleme",
"e2ee_subtitle": "Bu arkadaş için paylaşılan anahtarınızı yönetin.",
- "export_base64_button": "Export Base64",
- "import_base64_button": "Import Base64",
- "invalid_key_size_32_bytes": "Invalid anahtar büyüklüğü. 32-bayt anahtarı sağlayın.",
- "successfully_imported_key": "Anahtar başarıyla ithal edildi.",
- "failed_to_import_key": "Anahtar ithal etmek için başarısız oldu:{message}",
- "rules_title": "Kurallar Kuralları",
- "participants_text": "{count}katılımcılar katılımcı",
+ "export_base64_button": "Base64 Dışarı Aktar",
+ "import_base64_button": "Base64 İçe Aktar",
+ "invalid_key_size_32_bytes": "Geçersiz anahtar boyutu. 32 baytlık anahtar sağlayın.",
+ "successfully_imported_key": "Anahtar başarıyla içe aktarıldı.",
+ "failed_to_import_key": "Anahtar içe aktarılamadı: {message}",
+ "rules_title": "Kurallar",
+ "participants_text": "{count} katılımcı",
"not_found": "Bulunamadı",
- "streaks_title": "Streaks",
- "streaks_length_text": "Uzunluk:{length}",
- "streaks_expiration_text": "Expires in the Expires in{eta}",
- "streaks_expiration_text_expired": "Açıklama",
- "reminder_button": "Set Hatırlatıcı",
- "delete_scope_confirm_dialog_title": "Bir silmek istediğinizden emin misiniz{scope}??",
- "notes_placeholder": "Bir not eklemek için tıklayın"
+ "streaks_title": "Seriler",
+ "streaks_length_text": "Uzunluk: {length}",
+ "streaks_expiration_text": "{eta} içinde sona erer",
+ "streaks_expiration_text_expired": "Süresi doldu",
+ "reminder_button": "Hatırlatıcı Ayarla",
+ "delete_scope_confirm_dialog_title": "Bir {scope} silmek istediğinize emin misiniz?",
+ "notes_placeholder": "Not eklemek için tıklayın"
},
"logged_stories": {
- "story_failed_to_load": "Yüklemek için başarısız oldu",
- "no_stories": "Hiçbir hikaye bulunamadı",
- "save_from_cache_button": "Cache'den Kaydet"
+ "story_failed_to_load": "Yüklenemedi",
+ "no_stories": "Hikaye bulunamadı",
+ "save_from_cache_button": "Önbellekten Kaydet"
},
"messaging_preview": {
- "bridge_connection_failed": "Köprüye bağlanmak için başarısız oldu. Snapchat'in arka planda çalıştığından emin olun",
- "bridge_connection_error": "Köprüye bağlanmak için başarısız oldu. Snapchat'in arka planda çalıştığından emin olun",
- "bridge_init_failed": "Mesajlaşma köprüsünü başlatmak için başarısız oldu. Snapchat'in arka planda çalıştığından emin olun",
- "message_fetch_failed": "Mesajları getiremedi",
- "no_message_hint": "Hiçbir mesaj yok",
- "subtitle": "Seçmek için tutmak",
- "actions_title": "Konuşma Eylemleri",
- "save_selection_option": "Save Selection",
- "save_all_option": "Tüm Kaydet",
- "unsave_selection_option": "Unsave Selection",
- "unsave_all_option": "Bütün Filmler",
- "mark_selection_as_seen_option": "Mark, Gördüğünüz gibi Snap'i seçti",
- "mark_all_as_seen_option": "Mark all Snaps as seen",
- "delete_selection_option": "Delete Selection",
- "delete_all_option": "Delete All",
- "processed_message_toast": "Süreçlendi{count}mesaj mesajları",
- "processed_messages_toast": "Süreçlendi{count}mesaj mesajları",
- "processed_messages_text": "Süreçlendi{count}",
- "close_button_description": "Clear seçimi"
+ "bridge_connection_failed": "Köprüye bağlanılamadı. Snapchat'in arka planda çalıştığından emin olun",
+ "bridge_connection_error": "Köprüye bağlanılamadı. Snapchat'in arka planda çalıştığından emin olun",
+ "bridge_init_failed": "Mesajlaşma köprüsü başlatılamadı. Snapchat'in arka planda çalıştığından emin olun",
+ "message_fetch_failed": "Mesajlar getirilemedi",
+ "no_message_hint": "Mesaj yok",
+ "subtitle": "Seçmek için basılı tut",
+ "actions_title": "Sohbet Eylemleri",
+ "save_selection_option": "Seçileni Kaydet",
+ "save_all_option": "Tümünü Kaydet",
+ "unsave_selection_option": "Seçileni Kaydetme",
+ "unsave_all_option": "Tümünü Kaydetme",
+ "mark_selection_as_seen_option": "Seçili Snap'i görüldü olarak işaretle",
+ "mark_all_as_seen_option": "Tüm Snap'leri görüldü olarak işaretle",
+ "delete_selection_option": "Seçileni Sil",
+ "delete_all_option": "Tümünü Sil",
+ "processed_message_toast": "{count} mesaj işlendi",
+ "processed_messages_toast": "{count} mesaj işlendi",
+ "processed_messages_text": "{count} işlendi",
+ "close_button_description": "Seçimi temizle"
},
"logger_history": {
"list_friend_format": "Arkadaş{name}",
@@ -238,21 +238,21 @@
"better_location": {
"spoofed_coordinates_title": "Lat{latitude}Lng{longitude}",
"save_coordinates_dialog_title": "Kaydet koordinatları",
- "saved_name_dialog_hint": "Saved Name",
+ "saved_name_dialog_hint": "Kaydedilen Ad",
"latitude_dialog_hint": "Hayali",
"longitude_dialog_hint": "Uzunlık",
"save_dialog_button": "Kaydet",
"choose_location_button": "Bir yer seçin",
"manual_coordinates_hint": "Güzel-tune koordinatları manuel olarak.",
"saved_coordinates_subtitle": "Kurtarılan yerleri yönetin",
- "teleport_to_friend_button": "Teleport to Friend",
- "spoof_location_toggle": "Spoof Location",
- "suspend_location_updates": "Suspend Location Updates",
+ "teleport_to_friend_button": "Arkadaşa Işınlan",
+ "spoof_location_toggle": "Konumu Sahteleştir",
+ "suspend_location_updates": "Konum Güncellemelerini Askıya Al",
"saved_coordinates_title": "Kurtarılan koordinatlar",
"no_saved_coordinates_hint": "Hiçbir kurtarma koordinatları",
"delete_dialog_title": "Delete Saved koordinate",
"delete_dialog_message": "Bu kurtarma koordinatını silmek istediğinizden emin misiniz?",
- "teleport_to_friend_title": "Teleport to Friend",
+ "teleport_to_friend_title": "Arkadaşa Işınlan",
"search_bar": "Arama",
"no_friends_map": "Haritada hiç arkadaş yok",
"no_friends_found": "Hiçbir arkadaş bulunamadı"
@@ -261,378 +261,378 @@
"dialogs": {
"add_friend": {
"title": "Arkadaş veya Grup Ekle",
- "search_hint": "Arama",
- "fetch_error": "Veri toplamak için başarısız oldu",
- "category_groups": "Grup Grup Grupları",
- "category_friends": "Arkadaşları",
- "participants_text": "{count}katılımcılar katılımcı",
- "unselect_all_button": "Unselect All"
+ "search_hint": "Ara",
+ "fetch_error": "Veri alınamadı",
+ "category_groups": "Gruplar",
+ "category_friends": "Arkadaşlar",
+ "participants_text": "{count} katılımcı",
+ "unselect_all_button": "Tüm Seçimi Kaldır"
},
"scripting": {
- "repo_hint": "Paste a repository URL"
+ "repo_hint": "Depo URL'si yapıştırın"
},
"scripting_warning": {
"title": "Uyarı",
- "content": "PurrfectSnap, cihazınızdaki kullanıcı tanımlı kodunun uygulanmasına izin vermek için bir senaryolama aracı içerir. Aşırı uyarı kullanın ve sadece bilinen, güvenilir kaynaklardan modüller yükleyin. Una Yetkili veya öngörülemeyen modüller, sisteminize güvenlik riskleri oluşturabilir."
+ "content": "PurrfectSnap, cihazınızda kullanıcı tanımlı kodun çalıştırılmasına izin veren bir betik aracı içerir. Son derece dikkatli olun ve yalnızca bilinen, güvenilir kaynaklardan modül yükleyin. Yetkisiz veya doğrulanmamış modüller sisteminiz için güvenlik riskleri oluşturabilir."
},
"reset_config": {
- "title": "Yeniden yapılandırın",
- "content": "Yapıyı sıfırlamak istediğinizden emin misiniz?",
- "success_toast": "Config reset başarıyla"
+ "title": "Yapılandırmayı sıfırla",
+ "content": "Yapılandırmayı sıfırlamak istediğinize emin misiniz?",
+ "success_toast": "Yapılandırma başarıyla sıfırlandı"
},
"quick_actions_dialog": {
- "title": "Hızlı Eylemler",
- "subtitle": "En sevdiğiniz araçlarınıza daha hızlı erişim"
+ "title": "Hızlı İşlemler",
+ "subtitle": "Favori araçlarınıza daha hızlı erişin"
},
"export_config": {
- "title": "Hassas Veriler?",
- "content": "Yapıyı hassas verilerle ihraç etmek ister misiniz? (Yer koordinatları gibi, vs.)"
+ "title": "Hassas Veriler Dışarı Aktarılsın mı?",
+ "content": "Yapılandırmayı hassas verilerle birlikte dışarı aktarmak istiyor musunuz? (Konum koordinatları vb.)"
},
"messaging_action": {
- "title": "Süreç için içerik türlerini seçin",
- "select_all_button": "All Select All"
+ "title": "İşlenecek içerik türlerini seçin",
+ "select_all_button": "Tümünü Seç"
},
"file_imports": {
- "no_files_settings_hint": "Hiçbir dosya bulunamadı. Dosya İthalat bölümünde gerekli dosyaları ithal ettiğinizden emin olun",
- "settings_select_file_hint": "Ithal bir dosyayı seçin"
+ "no_files_settings_hint": "Dosya bulunamadı. Dosya İçe Aktarma bölümünden gerekli dosyaları içe aktardığınızdan emin olun",
+ "settings_select_file_hint": "İçe aktarılan bir dosya seçin"
}
},
"scripting": {
"actions_button": "Eylemler",
"actions_title": "Eylemler",
- "catalog_tab": "Kataloğu",
- "clear_module_data_button": "Clear data",
- "clear_module_data_failed": "Net modül verileri başarısız oldu",
- "delete_module_button": "Delete",
- "delete_module_failed": "Modülü silmek için başarısız oldu",
- "documentation_button": "Docs",
- "download_script_failed": "Senaryo indirmek için başarısız oldu",
- "downloading_script": "Downloading script...",
- "edit_module_button": "Edit",
- "enter_url_label": "URL'ye girin",
- "import_button": "İthalat",
- "import_from_url_button": "URL'den ithal",
- "import_script_from_url_title": "URL",
- "import_script_warning": "Sadece güvendiğiniz kaynaklardan senaryolar yükleyin.",
- "installed_scripts_tab": "Yükleme",
- "manage_repos_button": "Yeniden yönetme",
+ "catalog_tab": "Katalog",
+ "clear_module_data_button": "Verileri temizle",
+ "clear_module_data_failed": "Modül verileri temizlenemedi",
+ "delete_module_button": "Sil",
+ "delete_module_failed": "Modül silinemedi",
+ "documentation_button": "Dokümanlar",
+ "download_script_failed": "Betik indirilemedi",
+ "downloading_script": "Betik indiriliyor...",
+ "edit_module_button": "Düzenle",
+ "enter_url_label": "URL girin",
+ "import_button": "İçe Aktar",
+ "import_from_url_button": "URL'den içe aktar",
+ "import_script_from_url_title": "URL'den Betik İçe Aktar",
+ "import_script_warning": "Yalnızca güvendiğiniz kaynaklardan betik yükleyin.",
+ "installed_scripts_tab": "Yüklü",
+ "manage_repos_button": "Depoları yönet",
"module_data_cleared": "Modül verileri temizlendi!",
"module_not_found": "Modül bulunamadı",
- "no_description": "Hiçbir açıklama",
- "no_scripts_folder_selected_title": "Başlamak için senaryolarınızı klasörünü seçin",
- "no_scripts_found_title": "Hiçbir senaryo bulunamadı",
- "no_settings_for_module": "Bu modül herhangi bir ayara sahip değildir",
- "open_module_failed": "Modül dosyasını açmaya başarısız oldu",
- "open_scripts_folder_button": "Open scripts klasörü",
- "script_already_installed": "Script zaten kuruldu",
- "select_folder_button": "Folder",
- "select_scripts_folder_toast": "Lütfen önce bir senaryo seçin",
- "update_module_button": "Update modülü",
- "update_module_failed": "Modül güncellemeye başarısız oldu",
- "use_catalog_to_add_scripts": "Senaryoları eklemek için katalog kullanın",
- "ok_button_timeout": "TAMAM TAMAM{timeout}",
+ "no_description": "Açıklama yok",
+ "no_scripts_folder_selected_title": "Başlamak için betik klasörünü seçin",
+ "no_scripts_found_title": "Betik bulunamadı",
+ "no_settings_for_module": "Bu modülün ayarı yok",
+ "open_module_failed": "Modül dosyası açılamadı",
+ "open_scripts_folder_button": "Betik klasörünü aç",
+ "script_already_installed": "Betik zaten yüklü",
+ "select_folder_button": "Klasör Seç",
+ "select_scripts_folder_toast": "Lütfen önce bir betik klasörü seçin",
+ "update_module_button": "Modülü güncelle",
+ "update_module_failed": "Modül güncellenemedi",
+ "use_catalog_to_add_scripts": "Betik eklemek için kataloğu kullanın",
+ "ok_button_timeout": "Tamam {timeout}",
"catalog": {
- "no_repos_added": "No repositories eklendi",
- "repo_list_info": "Burada repositories bulun:",
- "link_text": "Repository listesi",
- "script_already_installed": "Script zaten kuruldu",
- "script_downloaded": "Script indir",
- "could_not_create_file": "Dosya oluşturmayabilir",
- "no_scripts_folder_selected": "İlk önce bir senaryo seçin",
- "no_scripts_available": "Mevcut senaryolar mevcut değildir",
- "installed_button": "Yükleme",
- "download_button": "Download"
+ "no_repos_added": "Depo eklenmedi",
+ "repo_list_info": "Depoları burada bulun:",
+ "link_text": "Depo listesi",
+ "script_already_installed": "Betik zaten yüklü",
+ "script_downloaded": "Betik indirildi",
+ "could_not_create_file": "Dosya oluşturulamadı",
+ "no_scripts_folder_selected": "Önce betik klasörü seçin",
+ "no_scripts_available": "Betik bulunamadı",
+ "installed_button": "Yüklü",
+ "download_button": "İndir"
},
"repos": {
- "no_repos_added": "No repositories eklendi",
- "add_repo_button": "Add Repository",
- "add_repo_dialog_title": "Add Repository",
- "repo_url_label": "Repository URL",
- "add_button": "Add",
- "invalid_repo_title": "Invalid Repository",
- "invalid_repo_error": "Bu repository gerekli verileri eksik.",
- "repo_added_toast": "Repository ek eklendi",
- "add_repo_failed_toast": "Repository eklemek için başarısız oldu:{message}",
- "remove_button": "Kaldırın",
- "remove_repo_dialog_title": "Kaldır Repository",
- "remove_repo_dialog_text": "Bu repository kaldırmak istediğinizden emin misiniz?"
+ "no_repos_added": "Depo eklenmedi",
+ "add_repo_button": "Depo Ekle",
+ "add_repo_dialog_title": "Depo Ekle",
+ "repo_url_label": "Depo URL'si",
+ "add_button": "Ekle",
+ "invalid_repo_title": "Geçersiz Depo",
+ "invalid_repo_error": "Bu depoda gerekli veriler eksik.",
+ "repo_added_toast": "Depo eklendi",
+ "add_repo_failed_toast": "Depo eklenemedi: {message}",
+ "remove_button": "Kaldır",
+ "remove_repo_dialog_title": "Depo Kaldır",
+ "remove_repo_dialog_text": "Bu depoyu kaldırmak istediğinize emin misiniz?"
}
},
"friend_tracker": {
- "rules_tab": "Kurallar Kuralları",
- "logs_tab": "Logs",
- "catalog_button": "Kataloğu",
- "add_rule_button": "Ekle Kural Ekle",
- "import_button": "İthalat",
+ "rules_tab": "Kurallar",
+ "logs_tab": "Günlükler",
+ "catalog_button": "Katalog",
+ "add_rule_button": "Kural Ekle",
+ "import_button": "İçe Aktar",
"filters_title": "Filtreler",
- "search_by_label": "Search Tarafından",
- "newest_first_label": "En yeni",
- "since_label": "O zamandan beri",
- "until_label": "Olana kadar",
- "unit_label": "Unit",
- "pick_a_date_button": "Bir tarih seçin",
- "export_button": "İhracat İhracatı",
- "delete_button": "Delete",
- "search_placeholder": "Arama",
- "no_logs_found": "Hiçbir log bulunamadı",
- "no_rules_found": "Hiçbir kural bulunamadı",
- "export_logs_dialog_title": "İhracat Logs",
- "export_logs_dialog_confirm_text": "Mevcut filtreler kullanarak ihracat günlükleri?",
- "export_as_button": "İhracat olarak{type}",
+ "search_by_label": "Şuna göre ara",
+ "newest_first_label": "En yeni önce",
+ "since_label": "Başlangıç",
+ "until_label": "Bitiş",
+ "unit_label": "Birim",
+ "pick_a_date_button": "Tarih seç",
+ "export_button": "Dışarı Aktar",
+ "delete_button": "Sil",
+ "search_placeholder": "Ara",
+ "no_logs_found": "Günlük bulunamadı",
+ "no_rules_found": "Kural bulunamadı",
+ "export_logs_dialog_title": "Günlükleri Dışarı Aktar",
+ "export_logs_dialog_confirm_text": "Mevcut filtrelerle günlükler dışa aktarılsın mı?",
+ "export_as_button": "{type} olarak dışarı aktar",
"new_rule_title": "Yeni Kural",
- "edit_rule_title": "Düzenleme Kuralı",
- "general_section_title": "General",
+ "edit_rule_title": "Kuralı Düzenle",
+ "general_section_title": "Genel",
"rule_name_label": "Kural Adı",
"default_rule_name": "Yeni Kural",
"author_name_label": "Yazar",
"scope_section_title": "Kapsam",
- "scope_all": "Bütün Arkadaşlar / Gruplar",
+ "scope_all": "Tüm Arkadaşlar/Gruplar",
"scope_whitelist": "Kimse hariç",
- "scope_blacklist": "Herkes dışında herkes hariç",
- "events_section_title": "Etkinlikler",
- "events_suffix": "olaylar olayları",
- "no_events_text": "Hiçbir olay henüz eklemedi",
- "add_event_dialog_title": "Etkinlik ekle",
- "event_type_label": "Event Type",
+ "scope_blacklist": "Herkes hariç",
+ "events_section_title": "Olaylar",
+ "events_suffix": "olay",
+ "no_events_text": "Henüz olay eklenmedi",
+ "add_event_dialog_title": "Olay Ekle",
+ "event_type_label": "Olay Türü",
"triggers_title": "Tetikleyiciler",
"conditions_title": "Koşullar",
- "condition_only_inside_conversation": "Sadece konuşmamda",
+ "condition_only_inside_conversation": "Sadece konuşma içindeyken",
"condition_only_outside_conversation": "Sadece konuşma dışındayken",
- "condition_only_when_app_active": "Sadece Snapchat aktif olduğunda",
- "condition_only_when_app_inactive": "Sadece Snapchat inaktif olduğunda",
- "condition_no_push_notification_when_app_active": "Snapchat aktif olduğunda hiçbir bildirim",
- "add_button": "Add",
- "cannot_save_rule_dialog_title": "Cannot Save Rule",
- "cannot_save_rule_dialog_text": "Bu kuralı kurtarmak için eksik alanlarda doldurun.",
- "duplicate_rule_name_dialog_title": "Kural adı",
- "duplicate_rule_name_dialog_text": "Bu isimle bir kural zaten var. Yeni bir isim seçin.",
- "discard_changes_dialog_title": "Kartpostaları?",
- "discard_changes_dialog_text": "Uyarılanmamış değişiklikler var. Onlara izin vermek?",
- "rule_subtitle": "Bu kural için tetikler ve kapsamı.",
- "discard_button": "Discard",
- "enabled_label": "Enabled",
- "disabled_label": "Engelliler",
- "delete_rule_dialog_title": "Delete Rule",
- "delete_rule_dialog_text": "Bu kuralı silmek istediğinizden emin misiniz?",
- "no_repos_added": "No repositories eklendi",
- "import_dialog_title": "İthalat Kuralları",
- "bulk_import_button": "Bulk import",
- "individual_import_button": "Single import",
- "invalid_import_type_dialog_title": "Invalid import",
- "invalid_import_type_dialog_text": "Seçilmiş dosya türü, ithalat modunda eşleşmez.",
- "export_dialog_title": "İhracat Kuralları",
- "bulk_export_button": "Bulk Export",
- "individual_export_button": "Tek ihracat",
- "reverse_order_checkbox": "Ters Order",
- "delete_logs_dialog_title": "Delete Logs",
- "delete_logs_dialog_confirm_text": "Mevcut filtrelerle eşleşen tüm loglar mı?",
- "select_friends_groups_button": "Arkadaşlar / gruplar seçin"
+ "condition_only_when_app_active": "Sadece Snapchat aktifken",
+ "condition_only_when_app_inactive": "Sadece Snapchat pasifken",
+ "condition_no_push_notification_when_app_active": "Snapchat aktifken bildirim yok",
+ "add_button": "Ekle",
+ "cannot_save_rule_dialog_title": "Kural Kaydedilemedi",
+ "cannot_save_rule_dialog_text": "Bu kuralı kaydetmek için eksik alanları doldurun.",
+ "duplicate_rule_name_dialog_title": "Yinelenen kural adı",
+ "duplicate_rule_name_dialog_text": "Bu adla bir kural zaten var. Yeni bir ad seçin.",
+ "discard_changes_dialog_title": "Değişiklikler iptal edilsin mi?",
+ "discard_changes_dialog_text": "Kaydedilmemiş değişiklikler var. İptal edilsin mi?",
+ "rule_subtitle": "Bu kural için tetikleyicileri ve kapsamları ayarlayın.",
+ "discard_button": "Vazgeç",
+ "enabled_label": "Etkin",
+ "disabled_label": "Devre Dışı",
+ "delete_rule_dialog_title": "Kuralı Sil",
+ "delete_rule_dialog_text": "Bu kuralı silmek istediğinize emin misiniz?",
+ "no_repos_added": "Depo eklenmedi",
+ "import_dialog_title": "Kuralları İçe Aktar",
+ "bulk_import_button": "Toplu içe aktar",
+ "individual_import_button": "Tekli içe aktar",
+ "invalid_import_type_dialog_title": "Geçersiz içe aktarma",
+ "invalid_import_type_dialog_text": "Seçilen dosya türü içe aktarma moduyla uyuşmuyor.",
+ "export_dialog_title": "Kuralları Dışarı Aktar",
+ "bulk_export_button": "Toplu dışa aktar",
+ "individual_export_button": "Tekli dışa aktar",
+ "reverse_order_checkbox": "Ters Sıra",
+ "delete_logs_dialog_title": "Günlükleri Sil",
+ "delete_logs_dialog_confirm_text": "Mevcut filtrelere uyan tüm günlükler silinsin mi?",
+ "select_friends_groups_button": "Arkadaş/grup seç"
},
"friend_tracker_export": {
- "title": "Export Friend Tracker",
+ "title": "Arkadaş Takip Dışarı Aktar",
"save_button": "Kaydet",
- "back_button_description": "Go back back back",
- "expand_button_description": "Genişleme veya çök kategori kategorisi",
- "exported_toast": "Çıkış",
- "export_failed_toast": "İhracat pisti için başarısız oldu:{message}"
+ "back_button_description": "Geri dön",
+ "expand_button_description": "Kategoriyi genişlet veya daralt",
+ "exported_toast": "Takip yapılandırması dışa aktarıldı",
+ "export_failed_toast": "Takip dışa aktarılamadı: {message}"
},
"friend_tracker_import": {
- "title": "Import Friend Tracker",
- "confirm_button": "İthalat",
- "back_button_description": "Go back back back",
- "expand_button_description": "Genişleme veya çök kategori kategorisi",
- "imported_toast": "Ray",
- "import_failed_toast": "Depolama için başarısız oldu:{message}"
+ "title": "Arkadaş Takip İçe Aktar",
+ "confirm_button": "İçe Aktar",
+ "back_button_description": "Geri dön",
+ "expand_button_description": "Kategoriyi genişlet veya daralt",
+ "imported_toast": "Takip içe aktarıldı",
+ "import_failed_toast": "Takip içe aktarılamadı: {message}"
},
"friend_tracker_catalog": {
- "title": "Friend Tracker Kataloğu Kataloğu",
- "no_repos_added": "No repositories eklendi",
- "manage_repos_description": "Açıklamalar"
+ "title": "Arkadaş Takip Kataloğu",
+ "no_repos_added": "Depo eklenmedi",
+ "manage_repos_description": "Depoları yönet"
},
"friend_tracker_repos": {
- "no_repos_added": "No repositories eklendi",
- "add_repo_button": "Add Repository",
- "add_repo_dialog_title": "Add Repository",
- "repo_url_label": "Repository URL",
- "add_button": "Add",
- "invalid_repo_title": "Invalid Repository",
- "invalid_repo_error": "Bu repository gerekli verileri eksik.",
- "repo_added_toast": "Repository ek eklendi",
- "add_repo_failed_toast": "Repository eklemek için başarısız oldu:{message}",
- "remove_button": "Kaldırın",
- "remove_repo_dialog_title": "Kaldır Repository",
- "remove_repo_dialog_text": "Bu repository kaldırmak istediğinizden emin misiniz?"
+ "no_repos_added": "Depo eklenmedi",
+ "add_repo_button": "Depo Ekle",
+ "add_repo_dialog_title": "Depo Ekle",
+ "repo_url_label": "Depo URL'si",
+ "add_button": "Ekle",
+ "invalid_repo_title": "Geçersiz Depo",
+ "invalid_repo_error": "Bu depoda gerekli veriler eksik.",
+ "repo_added_toast": "Depo eklendi",
+ "add_repo_failed_toast": "Depo eklenemedi: {message}",
+ "remove_button": "Kaldır",
+ "remove_repo_dialog_title": "Depo Kaldır",
+ "remove_repo_dialog_text": "Bu depoyu kaldırmak istediğinize emin misiniz?"
},
"logger_history": {
- "select_conversation_placeholder": "Bir konuşma seçin"
+ "select_conversation_placeholder": "Bir sohbet seçin"
},
"features": {
"config_export": {
- "title": "Export Config Özet",
- "back_button_description": "Go back back back",
+ "title": "Yapılandırma Dışarı Aktarma Özeti",
+ "back_button_description": "Geri dön",
"save_button": "Kaydet",
- "expand_button_description": "Genişleme veya çök kategori kategorisi",
- "enabled": "Enabled",
- "disabled": "Engelliler",
- "enable_feature": "Enable Feature"
+ "expand_button_description": "Kategoriyi genişlet veya daralt",
+ "enabled": "Etkin",
+ "disabled": "Devre Dışı",
+ "enable_feature": "Özelliği Etkinleştir"
},
"config_import": {
- "title": "Import Config Özet",
- "back_button_description": "Go back back back",
- "confirm_button": "İthalat",
- "expand_button_description": "Genişleme veya çök kategori kategorisi",
- "enabled": "Enabled",
- "disabled": "Engelliler",
- "enable_feature": "Enable Feature",
- "config_imported_toast": "Config başarıyla ithal etti",
- "config_import_failure_toast": "Imarı ithal etmek için başarısız oldu{error}"
+ "title": "Yapılandırma İçe Aktarma Özeti",
+ "back_button_description": "Geri dön",
+ "confirm_button": "İçe Aktar",
+ "expand_button_description": "Kategoriyi genişlet veya daralt",
+ "enabled": "Etkin",
+ "disabled": "Devre Dışı",
+ "enable_feature": "Özelliği Etkinleştir",
+ "config_imported_toast": "Yapılandırma başarıyla içe aktarıldı",
+ "config_import_failure_toast": "Yapılandırma içe aktarılamadı {error}"
}
}
},
"rules": {
"toasts": {
- "enabled": "{ruleName}etkinleştiren",
- "disabled": "{ruleName}evsiz engelliler"
+ "enabled": "{ruleName} etkinleştirildi",
+ "disabled": "{ruleName} devre dışı bırakıldı"
},
"modes": {
- "blacklist": "Blacklist modu",
- "whitelist": "Beyaz liste modu"
+ "blacklist": "Kara Liste Modu",
+ "whitelist": "Beyaz Liste Modu"
},
"properties": {
"auto_download": {
- "name": "Auto download",
- "description": "Otomatik olarak indirme indir Onları görünce Snaps",
+ "name": "Otomatik İndir",
+ "description": "Görüntülerken Snap'leri otomatik indirir",
"options": {
- "blacklist": "Exclude from Auto Download",
- "whitelist": "Auto Download Auto Download"
+ "blacklist": "Otomatik İndirme dışında bırak",
+ "whitelist": "Otomatik İndir"
}
},
"stealth": {
- "name": "Stealth Mode",
- "description": "Snaps / Chats'larını açtığınızı bilmekten kimseyi engeller ve konuşmaları",
+ "name": "Gizli Mod",
+ "description": "Snap'leri/Sohbetleri ve konuşmaları açtığınızı kimsenin bilmesini engeller",
"options": {
- "blacklist": "Exclude from Stealth Mode",
- "whitelist": "Stealth mode"
+ "blacklist": "Gizli Mod dışında bırak",
+ "whitelist": "Gizli Mod"
}
},
"auto_save": {
- "name": "Auto Save Auto Kaydet",
- "description": "Onları izleyen Chat Mesajlarını Kurtarın",
+ "name": "Otomatik Kaydet",
+ "description": "Sohbet mesajlarını görüntülerken kaydeder",
"options": {
- "blacklist": "Auto'dan Exclude",
- "whitelist": "Auto save Auto Kaydet"
+ "blacklist": "Otomatik Kaydet dışında bırak",
+ "whitelist": "Otomatik Kaydet"
}
},
"unsaveable_messages": {
- "name": "İnanılmaz Mesajlar",
- "description": "Diğer insanlar tarafından sohbet edildiğinden mesajları engeller",
+ "name": "Kaydedilemeyen Mesajlar",
+ "description": "Mesajların diğer kişiler tarafından sohbette kaydedilmesini engeller",
"options": {
- "blacklist": "Unsaveable Mesajlardan Exclude",
- "whitelist": "İnanılmaz Mesajlar"
+ "blacklist": "Kaydedilemeyen Mesajlar dışında bırak",
+ "whitelist": "Kaydedilemeyen Mesajlar"
}
},
"auto_open_snaps": {
- "name": "Auto Open Snaps",
- "description": "Otomatik olarak onları alırken Snaps açılır",
+ "name": "Snap'leri Otomatik Aç",
+ "description": "Snap'ler geldiğinde otomatik açar",
"options": {
- "blacklist": "Auto Open Snaps'tan Exclude",
- "whitelist": "Auto Open Snaps"
+ "blacklist": "Snap'leri Otomatik Aç dışında bırak",
+ "whitelist": "Snap'leri Otomatik Aç"
}
},
"hide_friend_feed": {
- "name": "Gizle Arkadaş Feed"
+ "name": "Arkadaş Akışından Gizle"
},
"e2e_encryption": {
- "name": "E2E Encryption"
+ "name": "Uçtan Uca Şifreleme Kullan"
},
"pin_conversation": {
- "name": "Pin Talk"
+ "name": "Sohbeti Sabitle"
},
"exclude_message_logger": {
- "name": "Exclude From Mesaj Logger"
+ "name": "Mesaj Kaydediciden Hariç Tut"
},
"auto_reply": {
- "name": "Auto Reply",
- "description": "Otomatik olarak uzaktayken gelen mesajlara cevap gönderir",
+ "name": "Otomatik Yanıt",
+ "description": "Uzakta olduğunuzda gelen mesajlara otomatik yanıt gönderir",
"options": {
- "blacklist": "Exclude from Auto Reply",
- "whitelist": "Auto Reply"
+ "blacklist": "Otomatik Yanıt dışında bırak",
+ "whitelist": "Otomatik Yanıt"
}
},
"auto_delete_sent_messages": {
- "name": "Auto Delete Sent Mesajları",
- "description": "Otomatik olarak belirlenen bir süre periyodundan sonra mesajları gönderir",
+ "name": "Gönderilen Mesajları Otomatik Sil",
+ "description": "Gönderilen mesajları belirli bir süre sonra otomatik siler",
"options": {
- "blacklist": "Auto Delete Sent Mesajlarından Exclude",
- "whitelist": "Auto Delete Sent Mesajları"
+ "blacklist": "Gönderilen Mesajları Otomatik Sil dışında bırak",
+ "whitelist": "Gönderilen Mesajları Otomatik Sil"
}
},
"message_logger": {
- "name": "Mesaj Logger",
- "description": "Silinmiş olsalar bile mesajların bir kopyasını tut",
+ "name": "Mesaj Kaydedici",
+ "description": "Mesajlar silinse bile bir kopyasını saklar",
"options": {
- "blacklist": "Mesajdan Exclude",
- "whitelist": "Mesaj Logger"
+ "blacklist": "Mesaj Kaydediciden hariç tut",
+ "whitelist": "Mesaj Kaydedici"
}
},
"auto_read": {
- "name": "Auto Read Auto Read",
- "description": "Otomatik olarak snaps and chats as read",
+ "name": "Otomatik Okuma",
+ "description": "Snap ve sohbetleri otomatik olarak okundu işaretler",
"options": {
- "blacklist": "Exclude from Auto Read",
- "whitelist": "Auto Read Auto Read"
+ "blacklist": "Otomatik Okuma dışında bırak",
+ "whitelist": "Otomatik Okuma"
}
},
"hide_typing_indicator": {
- "name": "Hide Typing Göstergesi",
- "description": "Başkalarını görmekten alıkoyurken",
+ "name": "Yazıyor Göstergesini Gizle",
+ "description": "Yazdığınızda başkalarının görmesini engeller",
"options": {
- "blacklist": "Exclude from Hide Typing Gösterge",
- "whitelist": "Gizle tipleme göstergesi"
+ "blacklist": "Yazıyor Göstergesini Gizle dışında bırak",
+ "whitelist": "Yazıyor göstergesini gizle"
}
}
}
},
"actions": {
"clean_snapchat_cache": {
- "name": "Temiz Snapchat Cache",
- "description": "Snapchat Cache"
+ "name": "Snapchat Önbelleğini Temizle",
+ "description": "Snapchat önbelleğini temizler"
},
"manage_friend_list": {
- "name": "Arkadaş Listesi Yönetin",
- "description": "Import/export your friends list when backing up"
+ "name": "Arkadaş Listesini Yönet",
+ "description": "Yedekleme yaparken arkadaş listenizi içe/dışa aktarın"
},
"export_chat_messages": {
- "name": "Export Chat Messages",
- "description": "Satış mesajları JSON/HTML/TXT bir dosyaya"
+ "name": "Sohbet Mesajlarını Dışarı Aktar",
+ "description": "Konşma mesajlarını JSON/HTML/TXT dosyasına aktarır"
},
"export_memories": {
- "name": "İhracat Anıları",
- "description": "Bir ZIP dosyasına ihracat"
+ "name": "Anıları Dışarı Aktar",
+ "description": "Anıları ZIP dosyasına aktarır"
},
"bulk_messaging_action": {
- "name": "Bulk Messaging Action",
- "description": "Arkadaşları ya da konuşmaların kitlesel silinmesi gibi işlemleri gerçekleştirin"
+ "name": "Toplu Mesaj İşlemi",
+ "description": "Arkadaş silme veya konuşmaları topluca silme gibi işlemler yapar"
},
"regen_mappings": {
- "name": "Regenerate Mappings",
- "description": "Manually regenerate mappings"
+ "name": "Eşlemeleri Yeniden Oluştur",
+ "description": "Eşlemeleri manuel olarak yeniden oluştur"
},
"change_language": {
- "name": "Dil Değiştiri",
- "description": "PurrfectSnap dilini değiştirin"
+ "name": "Dili Değiştir",
+ "description": "PurrfectSnap dilini değiştir"
},
"file_imports": {
- "name": "File Imports",
- "description": "Snapchat'te kullanım için İthalat dosyaları"
+ "name": "Dosya İçe Aktarma",
+ "description": "Snapchat'te kullanmak için dosya içe aktarın"
},
"friend_tracker": {
- "name": "Friend Tracker",
- "description": "Arkadaşlarınızı Snapchat'te izleyin"
+ "name": "Arkadaş Takip",
+ "description": "Snapchat'te arkadaşlarını takip et"
},
"logger_history": {
- "name": "Logger History",
- "description": "Giriş mesajlarının tarihini görün"
+ "name": "Kaydetme Geçmişi",
+ "description": "Kaydedilen mesajların geçmişini görüntüle"
}
},
"features": {
@@ -645,11 +645,11 @@
"app_appearance": {
"always_light": "Her zaman Işık",
"always_dark": "Her zaman karanlık",
- "null": "Match System"
+ "null": "Sistemle eşleştir"
},
"auto_reload": {
"snapchat_only": "Reload Snapchat sadece",
- "all": "Reload Snapchat + PurrfectSnap",
+ "all": "Snapchat + PurrfectSnap'i yeniden yükle",
"null": "Tembel"
},
"walk_radius": {
@@ -671,13 +671,13 @@
"conversation_info": "Konuşma Bilgileri",
"e2e_encryption": " E2E Encryption",
"message_logger": " Mesaj Logger",
- "auto_read": "✅ Auto Read",
+ "auto_read": "✅ Otomatik Okuma",
"hide_typing_indicator": " Hide Typing Göstergesi"
},
"schedule_scheduled_for": "Zamanlama için{name}in{time}",
"schedule_sending_in": "Yemin ederim{time}",
"schedule_sent_to": "Sen{name}",
- "schedule_sent": "Scheduled snap sent",
+ "schedule_sent": "Planlanan snap gönderildi",
"schedule_failed_to": "Göndermek için başarısız oldu{name}",
"schedule_failed": "Scheduled snap başarısız oldu",
"schedule_cancelled_for": "İptal için{name}",
@@ -686,7 +686,7 @@
"google_pixel_10_pro": "Google Pixel 10 Pro",
"oneplus_13": "13 OnePlus 13",
"xiaomi_15_ultra": "Xiaomi 15 Ultra Ultra",
- "null": "Device Default"
+ "null": "Cihaz Varsayılanı"
},
"settings_menu": {
"default": "Tembel",
@@ -716,60 +716,60 @@
"notifications": {
"chat_screenshot": "Ekran görüntüsü",
"chat_screen_record": "Ekran Kaydı",
- "snap_replay": "Snap Replay",
+ "snap_replay": "Snap Tekrarı",
"camera_roll_save": "Kamera Roll Save",
- "chat": "Chat",
- "chat_reply": "Chat Reply",
+ "chat": "Sohbet",
+ "chat_reply": "Sohbet Yanıtı",
"snap": "Snap",
- "typing": "Typing",
+ "typing": "Yazıyor",
"stories": "Hikaye Hikayeleri",
"speaking": "Konuşma",
- "chat_reaction": "DM Reaction",
- "group_chat_reaction": "Group Reaction",
- "initiate_audio": "Incoming Audio Call",
+ "chat_reaction": "DM Tepkisi",
+ "group_chat_reaction": "Grup Tepkisi",
+ "initiate_audio": "Gelen Sesli Arama",
"abandon_audio": "Bayan Audio Call",
- "initiate_video": "Incoming Video Call",
+ "initiate_video": "Gelen Görüntülü Arama",
"abandon_video": "Bayan Video Call",
- "map_live_location": "Map Live Location"
+ "map_live_location": "Harita Canlı Konum"
},
"auto_read": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"hide_typing_indicator": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"auto_delete_sent_messages": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"auto_download": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"stealth": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"auto_save": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"message_logger": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"auto_reply": {
- "blacklist": "Blacklist",
- "whitelist": "Whitelist",
+ "blacklist": "Kara Liste",
+ "whitelist": "Beyaz Liste",
"disabled": "Engelliler"
},
"custom_android_id": {
@@ -778,12 +778,12 @@
"add_friend_source_spoof": {
"added_by_username": "Kullanıcı adı",
"added_by_mention": "Yemin olsun",
- "added_by_group_chat": "By Group Chat",
+ "added_by_group_chat": "Grup Sohbetiyle",
"added_by_qr_code": "QR Code",
"added_by_community": "Topluluğun",
"added_by_quick_add": "Hızlı Add (ya da yasaklanma riski)",
"added_by_spotlight": "Tarafından Spotlight",
- "null": "Don't spoof source"
+ "null": "Kayna?ı sahteleştirme"
},
"custom_streaks_expiration_format": {
"null": "Sistem"
@@ -808,7 +808,7 @@
},
"startup_default_camera": {
"front": "Front Kamera",
- "back": "Back Camera",
+ "back": "Arka Kamera",
"null": "Son kullanılanı hatırlayın"
},
"front_custom_frame_rate": {
@@ -821,7 +821,7 @@
"null": "Snapchat varsayılan varsayılan"
},
"custom_path_format": {
- "null": "Use default pattern"
+ "null": "Varsayılan deseni kullan"
},
"force_image_format": {
"null": "Snapchat varsayılan varsayılan"
@@ -847,7 +847,7 @@
"null": "Snapchat"
},
"strip_media_metadata": {
- "hide_caption_text": "Hide Caption Text",
+ "hide_caption_text": "Açıklama Metnini Gizle",
"hide_snap_filters": "Gizle",
"hide_extras": "Gizle Ekstralar (örneğin)",
"remove_audio_note_duration": "Download Audio Not Süre",
@@ -867,37 +867,37 @@
},
"hide_story_suggestions": {
"hide_suggested_friend_stories": "Hide, arkadaş hikayelerini önerdi",
- "hide_my_stories": "Hide My Stories"
+ "hide_my_stories": "Hikayelerimi Gizle"
},
"home_tab": {
- "map": "Map",
- "chat": "Chat",
+ "map": "Harita",
+ "chat": "Sohbet",
"camera": "Kamera",
- "discover": "Discover",
+ "discover": "Keşfet",
"spotlight": "Spotlight",
"null": "Snapchat"
},
"spotlight_comments_username_icon": {
- "user": "Username Icon",
- "👤": "Username Icon",
- "[👤]": "Username Icon",
- "default": "Username Icon",
+ "user": "Kullanıcı Adı Simgesi",
+ "👤": "Kullanıcı Adı Simgesi",
+ "[👤]": "Kullanıcı Adı Simgesi",
+ "default": "Kullanıcı Adı Simgesi",
"no_icon": "Hayır ikon yok"
},
"custom_image_upload_format": {
"null": "Otomatik"
},
"update_check_frequency": {
- "null": "Auto"
+ "null": "Otomatik"
},
"snapchat_plus": {
"not_subscribed": "Abone değil",
"basic": "Temel",
- "ad_free": "Ad Free",
+ "ad_free": "Reklamsız",
"null": "Tembel"
},
"bypass_video_length_restriction": {
- "single": "Single media",
+ "single": "Tek medya",
"split": "Split medyası",
"null": "Tembel"
},
@@ -907,10 +907,10 @@
"null": "Varsayılan olarak Bitmoji"
},
"disable_confirmation_dialogs": {
- "erase_message": "Erase Message",
+ "erase_message": "Mesajı Sil",
"remove_friend": "Kaldır Arkadaş",
- "block_friend": "Block Friend",
- "ignore_friend": "Ignore Friend",
+ "block_friend": "Arkadaş Engelle",
+ "ignore_friend": "Arkadaşı Yok Say",
"hide_friend": "Gizle Arkadaş",
"hide_conversation": "Hide Talk",
"clear_conversation": "Arkadaş Feed"
@@ -920,7 +920,7 @@
"bypass_text_input_limit": "Bypass Text Giriş Limit"
},
"auto_purge": {
- "never": "Never",
+ "never": "Asla",
"1_hour": "1 Saat",
"3_hours": "3 Saat 3 Saat",
"6_hours": "6 Saat",
@@ -942,21 +942,21 @@
"friends": "Arkadaşları",
"suggested_stories": "Önerilen Hikayeler",
"following": "Takip",
- "discover": "Discover"
+ "discover": "Keşfet"
},
"disable_cameras": {
"front": "Front Kamera",
- "back": "Back Camera"
+ "back": "Arka Kamera"
},
"disable_permission_requests": {
"notifications": "Bildirimler",
"read_media_images": "Media Read Media Fotoğraflar",
"read_media_video": "Media Read Media Video Video Video",
"camera": "Kamera",
- "microphone": "Microphone",
+ "microphone": "Mikrofon",
"location": "Konum Location",
"read_contacts": "Read Contact",
- "nearby_devices": "Nearby Devices",
+ "nearby_devices": "Yakındaki Cihazlar",
"phone_calls": "Telefon Çağrıları"
},
"message_indicators": {
@@ -982,13 +982,13 @@
"double_tap_chat_action": {
"like_message": "Mesaj gibi",
"copy_text": "Videoboard'a kopyala",
- "delete_message": "Delete Message",
- "mark_as_read": "Mark as Read",
+ "delete_message": "Mesajı Sil",
+ "mark_as_read": "Okundu Olarak İşaretle",
"custom_emoji_reaction": "Özel Emoji Reaksiyon",
"null": "Tembel"
},
"message_types": {
- "CHAT": "Chat",
+ "CHAT": "Sohbet",
"SNAP": "Snap",
"NOTE": "Not",
"EXTERNAL_MEDIA": "Dış Medya",
@@ -1017,18 +1017,18 @@
},
"ai_response_style": {
"casual": "Günlük",
- "formal": "Formal",
+ "formal": "Resmi",
"friendly": "Dostu",
- "humorous": "Humorous",
+ "humorous": "Esprili",
"empathetic": "Empati",
- "toxic": "Edgy",
- "busy": "Busy"
+ "toxic": "Sert",
+ "busy": "Meşgul"
},
"ai_temperature": {
"0.7": "Dengeli (0.7)"
},
"ai_response_language": {
- "auto": "Auto",
+ "auto": "Otomatik",
"en": "İngilizce İngilizce İngilizce English",
"es": "İspanyolca",
"fr": "Fransız",
@@ -1040,7 +1040,7 @@
"ko": "Koreli",
"zh": "Çin",
"ar": "Arapça",
- "hi": "Hindi",
+ "hi": "Hintçe",
"tr": "Türk Türkçesi",
"pl": "Polonya",
"nl": "Hollandalı Hollanda",
@@ -1050,7 +1050,7 @@
"fi": "Finlandiya"
},
"friendGreeting": {
- "Hey": "Hey"
+ "Hey": "Merhaba"
},
"half_swipe_messages": {
"[\"I noticed you half-swiped! I'll respond soon.\"]": "Seni yarı çıplak fark ettim! Yakında cevap vereceğim."
@@ -1083,16 +1083,16 @@
"Thanks for the map reaction!": "Harita reaksiyonu için teşekkürler!"
},
"auto_reply_content_types": {
- "chat_messages": "Chat Messages",
- "snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
- "story_reply_messages": "Story Replies",
+ "chat_messages": "Sohbet Mesajları",
+ "snap_messages": "Snap'ler",
+ "story_share_messages": "Hikaye Paylaşımları",
+ "story_reply_messages": "Hikaye Yanıtları",
"external_media_messages": "Dış Medya",
"voice_note_messages": "Ses Notları",
"sticker_messages": "Styles",
- "tiny_snap_messages": "Tiny Snaps",
- "map_reaction_messages": "Map Reactions",
- "half_swipes": "Half Swipes"
+ "tiny_snap_messages": "Mini Snap'ler",
+ "map_reaction_messages": "Harita Tepkileri",
+ "half_swipes": "Yarım Kaydırmalar"
},
"supported_languages": {
"en": "İngilizce İngilizce İngilizce English",
@@ -1106,13 +1106,13 @@
"ko": "Koreli",
"zh": "Çin",
"ar": "Arapça",
- "hi": "Hindi",
+ "hi": "Hintçe",
"tr": "Türk Türkçesi"
},
"translation_position": {
"above": "Yukarıdaki metin",
"below": "Aşağıda metin",
- "inline": "Inline"
+ "inline": "Satır içinde"
},
"source_language": {
"auto": "Otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik otomatik olarak otomatik otomatik otomatik olarak otomatik otomatik otomatik otomatik olarak otomatik otomatik otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak otomatik olarak"
@@ -1123,7 +1123,7 @@
},
"properties": {
"global": {
- "name": "Global",
+ "name": "Genel",
"description": "Tweak Global Snapchat Ayarları",
"properties": {
"better_location": {
@@ -1131,7 +1131,7 @@
"description": "Snapchat Konumunu Geliştirin",
"properties": {
"spoof_location": {
- "name": "Spoof Location",
+ "name": "Konumu Sahteleştir",
"description": "Yerinizi belirli bir kişiye Spoofs"
},
"coordinates": {
@@ -1139,15 +1139,15 @@
"description": "Spoofed yerin koordinatlarını ayarlayın"
},
"walk_radius": {
- "name": "Walk Radius",
+ "name": "Yürüme Yarıçapı",
"description": "Bu yarının içinde rastgele yürüyüş (ft)"
},
"always_update_location": {
- "name": "Always Update Location",
+ "name": "Konumu Her Zaman Güncelle",
"description": "Force Snapchat, GPS verileri almasa bile yerini güncellemek için"
},
"suspend_location_updates": {
- "name": "Suspend Location Updates",
+ "name": "Konum Güncellemelerini Askıya Al",
"description": "Yerinizi güncellenmekten Engeller"
},
"spoof_battery_level": {
@@ -1159,7 +1159,7 @@
"description": "Spoofs müzik dinlemek durumu haritada"
},
"show_battery_level": {
- "name": "Show Battery Level",
+ "name": "Pil Düzeyini Göster",
"description": "Haritadaki arkadaşlarınızın batarya seviyesini gösterir"
}
}
@@ -1169,11 +1169,11 @@
"description": "Enables Snapchat Plus özellikleri\nBazı Server-sided özellikleri çalışmayabilir"
},
"media_upload_quality": {
- "name": "Media Upload Quality",
- "description": "Overrides the media upload quality",
+ "name": "Medya Yükleme Kalitesi",
+ "description": "Medya yükleme kalitesini geçersiz kılar",
"properties": {
"force_video_upload_source_quality": {
- "name": "Force Video Upload Source Quality",
+ "name": "Video Yükleme Kaynak Kalitesini Zorla",
"description": "Power Snapchat, video yükleme yaparken kaynak kalitesini kullanmak için\nLütfen bunun metadata'yı medyadan kaldıramayacağına dikkat edin"
},
"disable_image_compression": {
@@ -1191,7 +1191,7 @@
"description": "Otomatik olarak seçilmiş eylemleri onaylar"
},
"auto_updater": {
- "name": "Auto Updater",
+ "name": "Otomatik Güncelleyici",
"description": "Yeni güncelleştirmeler için otomatik olarak kontroller"
},
"update_settings": {
@@ -1199,7 +1199,7 @@
"description": "PurrfectSnap Güncellemeler için nasıl kontrol eder",
"properties": {
"auto_update_check": {
- "name": "Auto Update Check"
+ "name": "Otomatik Güncelleme Kontrolü"
},
"update_check_frequency": {
"name": "Update Check Frekans"
@@ -1210,7 +1210,7 @@
"name": "UI Ayarları",
"properties": {
"haptic_feedback": {
- "name": "Haptic Feedback"
+ "name": "Dokunsal Geri Bildirim"
}
}
},
@@ -1223,7 +1223,7 @@
"description": "Hikaye sayfalarından alıntılar\nDüzgün çalışmak için bir yenileme gerektirir"
},
"block_ads": {
- "name": "Block Ads",
+ "name": "Reklamları Engelle",
"description": "Reklamların görüntülenmesi"
},
"disable_custom_tabs": {
@@ -1239,15 +1239,15 @@
"description": "Snapchat'i kamerada kaydırdığınızda son anıları göstermesini önler"
},
"spotlight_comments_username": {
- "name": "Spotlight Comments Username",
+ "name": "Spotlight Yorum Kullanıcı Adı",
"description": "Shows author name in Spotlight comments"
},
"spotlight_comments_username_icon": {
- "name": "Spotlight Comments Username Icon",
+ "name": "Spotlight Yorum Kullanıcı Adı Simgesi",
"description": "Hangi ikonun, Spotlight yorumlarında kullanıcı adı altında görüntülendiğini seçin"
},
"bypass_video_length_restriction": {
- "name": "Bypass Video Length Restrictions",
+ "name": "Video Süre Sınırını Aş",
"description": "Single: tek bir video gönder\nSplit: düzenlemeden sonra videolar bölün"
},
"default_video_playback_rate": {
@@ -1255,7 +1255,7 @@
"description": "Videoların oyun geri kalanı için varsayılan hızı ayarlar\nDeğer 0.1 ve 4.0 arasında olmalıdır"
},
"video_playback_rate_slider": {
- "name": "Video Playback Rate Slider",
+ "name": "Video Oynatma Hızı Kaydırıcısı",
"description": "Video playback oranını değiştirmek için opera ortamında menüde bir kaydırıcı ekleyin\nNot: Değişiklikler sadece sonraki videolar için geçerlidir"
},
"disable_google_play_dialogs": {
@@ -1267,7 +1267,7 @@
"description": "Sistem hacmi kontrol etmek için güç Snapchat"
},
"disable_telecom_framework": {
- "name": "Disable Telecom Framework",
+ "name": "Telekom Çerçevesini Devre Dışı Bırak",
"description": "Snapchat'i Android Telecom framework kullanarak önlemek\nBu, bir çağrıdayken müzik dinlemenizi sağlar"
},
"hide_active_music": {
@@ -1275,21 +1275,21 @@
"description": "Snapchat'ı müzik dinlemekten alıkoyuyor\nBu, müzik dinlemek için kontrol hacim düğmelerini kullanarak çırpmanıza izin verecektir"
},
"disable_snap_splitting": {
- "name": "Disable Snap Splitting",
+ "name": "Snap Bölmeyi Devre Dışı Bırak",
"description": "Snaps'in birden fazla parçaya bölünmesini önler\nGönderdiğiniz resimler videoya dönüşür"
}
}
},
"downloader": {
- "name": "Downloader",
- "description": "Download Snapchat Media",
+ "name": "İndirici",
+ "description": "Snapchat medyasını indir",
"properties": {
"save_folder": {
- "name": "Save Folder",
+ "name": "Kayıt Klasörü",
"description": "Tüm medyanın indirilmesi gereken diziyi seçin"
},
"auto_download_sources": {
- "name": "Auto Download Sources",
+ "name": "Otomatik İndirme Kaynakları",
"description": "Kaynakları otomatik olarak indirme kaynakları seçin"
},
"prevent_self_auto_download": {
@@ -1297,7 +1297,7 @@
"description": "Kendi Snaps'lerinizi otomatik olarak indirilmeden engeller"
},
"path_format": {
- "name": "Path Format",
+ "name": "Yol Biçimi",
"description": "File Path Formatını belirtin"
},
"allow_duplicate": {
@@ -1305,15 +1305,15 @@
"description": "Aynı medyanın birden fazla kez indirilmesine izin verir"
},
"merge_overlays": {
- "name": "Merge Overlays",
+ "name": "Kaplamaları Birleştir",
"description": "Bir Snap'in Text ve medyası tek bir dosyaya bağlanır"
},
"force_image_format": {
- "name": "Force Image Format",
+ "name": "Görüntü Formatını Zorla",
"description": "Belirtilen bir Biçimde kurtarılacak güç görüntüleri"
},
"force_voice_note_format": {
- "name": "Force Voice Note Format",
+ "name": "Sesli Not Formatını Zorla",
"description": "Güçler Voice Belirtilen bir Biçimde Kurtarılacak Notlar"
},
"auto_download_voice_notes": {
@@ -1321,7 +1321,7 @@
"description": "Otomatik olarak onları oynarken ses notlarını indirin"
},
"download_profile_pictures": {
- "name": "Download Profile Pictures",
+ "name": "Profil Resimlerini İndir",
"description": "Profil Resimleri profil sayfasından indirmenize izin verin"
},
"opera_download_button": {
@@ -1329,7 +1329,7 @@
"description": "Bir Snap'i izleyen üst köşede bir indirme düğmesine ekleyin.\ndüğmelerde uzun basın indirecek"
},
"download_context_menu": {
- "name": "Download Context Menu",
+ "name": "İndirme Bağlam Menüsü",
"description": "Bir konuşmadan veya bağlam menüsünü kullanarak bir mesaj indirmenize izin verin.\ndüğmelerde uzun basın indirecek"
},
"ffmpeg_options": {
@@ -1341,19 +1341,19 @@
"description": "Kullanım için iplik miktarı"
},
"preset": {
- "name": "Preset",
+ "name": "Ön Ayar",
"description": "Dönüşüm hızını ayarlayın"
},
"constant_rate_factor": {
- "name": "Constant Rate Factor",
+ "name": "Sabit Oran Faktörü",
"description": "Video encoder için sürekli oran faktörü ayarlayın\n0 ila 51 libx264 için"
},
"video_bitrate": {
- "name": "Video Bitrate",
+ "name": "Video Bit Hızı",
"description": "Videoyu biraz ayarlar (kbps)"
},
"audio_bitrate": {
- "name": "Audio Bitrate",
+ "name": "Ses Bit Hızı",
"description": "Sesi biraz ayarlar (kbps)"
},
"custom_video_codec": {
@@ -1367,7 +1367,7 @@
}
},
"logging": {
- "name": "Logging",
+ "name": "Günlükleme",
"description": "Medya indirildiğinde tostlar Gösteriyor"
},
"custom_path_format": {
@@ -1377,7 +1377,7 @@
}
},
"user_interface": {
- "name": "User Interface",
+ "name": "Kullanıcı Arayüzü",
"description": "Snapchat'in görünümünü değiştirmek ve hissetmek",
"properties": {
"enable_app_appearance": {
@@ -1395,7 +1395,7 @@
}
},
"snap_preview": {
- "name": "Snap Preview",
+ "name": "Snap Önizleme",
"description": "Sohbette görünmez Snaps'a bir sonraki küçük bir önizleme görüntüler"
},
"bootstrap_override": {
@@ -1407,7 +1407,7 @@
"description": "Sürekli bir App Görünümü"
},
"home_tab": {
- "name": "Home Tab",
+ "name": "Ana Sekme",
"description": "Overrides the startup sekmesi when open Snapchat"
}
}
@@ -1421,7 +1421,7 @@
"description": "Mesaj listesini gönderirken alta kaydırır / mesaj gönderirken"
},
"streak_expiration_info": {
- "name": "Show Streak Expiration Info",
+ "name": "Seri Sona Erme Bilgisini Göster",
"description": "Streak Expiration timer next to the Streaks counter"
},
"hide_friend_feed_entry": {
@@ -1429,7 +1429,7 @@
"description": "Arkadaş Feed'ten özel bir arkadaş\nBu özelliği yönetmek için sosyal sekmeyi kullanın"
},
"hide_streak_restore": {
- "name": "Hide Streak Restore",
+ "name": "Seri Geri Yüklemeyi Gizle",
"description": "Arkadaştaki geri yükleme düğmesine basın"
},
"hide_quick_add_suggestions": {
@@ -1437,7 +1437,7 @@
"description": "Hızlı ekle arkadaş önerileri"
},
"hide_story_suggestions": {
- "name": "Hide Story Suggestions",
+ "name": "Hikaye Önerilerini Gizle",
"description": "Hikaye sayfasının önerileri kaldırıldı"
},
"hide_ui_components": {
@@ -1445,7 +1445,7 @@
"description": "Hangi UI bileşenlerini gizlemek için seçin"
},
"opera_media_quick_info": {
- "name": "Opera Media Quick Info",
+ "name": "Opera Medya Hızlı Bilgi",
"description": "Opera view menüsünde yaratım tarihi gibi medyanın faydalı bilgilerini gösterir"
},
"old_bitmoji_selfie": {
@@ -1453,7 +1453,7 @@
"description": "Bitmoji Selfielerini eski Snapchat sürümlerinden geri getiriyor"
},
"disable_spotlight": {
- "name": "Disable Spotlight",
+ "name": "Spotlight’ı Devre Dışı Bırak",
"description": "The Spotlight page"
},
"friend_feed_menu_buttons": {
@@ -1461,7 +1461,7 @@
"description": "Arkadaş Feed Menüde hangi düğmelerin göstereceğini seçin"
},
"auto_close_friend_feed_menu": {
- "name": "Auto Close Friend Feed Menu",
+ "name": "Arkadaş Akışı Menüsünü Otomatik Kapat",
"description": "Otomatik olarak bir ayar düğmesine basmadan sonra Friend Feed Menu'i kapatır"
},
"vertical_story_viewer": {
@@ -1481,8 +1481,8 @@
"description": "Playth modunda konuşmaları için bir 👻 emoji ekleyin"
},
"edit_text_override": {
- "name": "Edit Text Override",
- "description": "Overrides text field behavior"
+ "name": "Metin Düzenleme Geçersiz Kılma",
+ "description": "Metin alanı davranışını geçersiz kılar"
},
"prevent_forced_keyboard": {
"name": "Zorlanmış Klavye",
@@ -1499,7 +1499,7 @@
}
},
"messaging": {
- "name": "Messaging",
+ "name": "Mesajlaşma",
"description": "Arkadaşlarınızla nasıl etkileşim kurduğunuzu değiştirin",
"properties": {
"bypass_screenshot_detection": {
@@ -1519,7 +1519,7 @@
"description": "Bir sohbete yarım saat içinde gönderilirken bildirimin önlenmesi"
},
"hide_bitmoji_presence": {
- "name": "Hide Bitmoji Presence",
+ "name": "Bitmoji Görünürlüğünü Gizle",
"description": "Bitmoji'nizi Chat'da iken ayağa kaldırır"
},
"hide_typing_notifications": {
@@ -1531,7 +1531,7 @@
"description": "Snaps'i görmek için Zaman Sınırını Çıkarır"
},
"auto_mark_as_read": {
- "name": "Auto Mark as Read",
+ "name": "Otomatik Okundu İşaretle",
"description": "Stealth Mode etkinleştirildiğinde bile otomatik olarak mesajları /snaps işaret eder / hatta okunur"
},
"mark_snap_as_seen_button": {
@@ -1551,7 +1551,7 @@
"description": "Arkadaş Feed'den uzun bir basınla yeniden oynama yeteneği başarısız olur"
},
"half_swipe_notifier": {
- "name": "Half Swipe Notifier",
+ "name": "Yarım Kaydırma Bildirici",
"description": "Birinin yarısı bir sohbete geçtiğinde sizi ifade etmiyor",
"properties": {
"min_duration": {
@@ -1573,7 +1573,7 @@
"description": "Yerel olarak sınırsız bir konuşma miktarını belirlemenize izin verin"
},
"disable_snap_mode_restrictions": {
- "name": "Disable Snap Mode Restrictions",
+ "name": "Snap Modu Kısıtlamalarını Devre Dışı Bırak",
"description": "Sınırlama olmadan kendini imha eden Snaps'leri görmenize izin verir"
},
"prevent_message_sending": {
@@ -1597,11 +1597,11 @@
"description": "Bildirimde alınan mesajların bir önizlemesini gösterir"
},
"media_preview": {
- "name": "Media Preview",
+ "name": "Medya Önizlemesi",
"description": "Bildirimde seçilmiş medya türlerinin bir önizlemesini gösterir"
},
"media_caption": {
- "name": "Media Caption",
+ "name": "Medya Açıklaması",
"description": "Bildirimde medyanın ek başlığını gösterir"
},
"stacked_media_messages": {
@@ -1609,7 +1609,7 @@
"description": "Birden çok medya mesajlarını bir metin bildirimine sokamazlarken. Chat Preview Preview ile birlikte kullanın"
},
"friend_add_source": {
- "name": "Friend Add Source",
+ "name": "Arkadaş Ekleme Kaynağı",
"description": "Bir arkadaşınızın isteğinin kaynağını bildirimde gösterin"
},
"reply_button": {
@@ -1617,7 +1617,7 @@
"description": "Bildirim düğmesine bir cevap düğmesine ekleyin"
},
"smart_replies": {
- "name": "Smart Replies",
+ "name": "Akıllı Yanıtlar",
"description": "Adds, bildirimlerin cevaplarını önerdi (Android 10 +). Reply Düğme ile birlikte kullanın"
},
"download_button": {
@@ -1625,11 +1625,11 @@
"description": "Medyayı bildirimden indirmenize izin verin"
},
"mark_as_read_button": {
- "name": "Mark as Read Button",
+ "name": "Okundu Düğmesi",
"description": "Bildirimden okuduğunuz gibi bir mesajı işaretlemenize izin verin"
},
"mark_as_read_and_save_in_chat": {
- "name": "Mark as Read and Save in Chat",
+ "name": "Okundu İşaretle ve Sohbette Kaydet",
"description": "Bildirim için bir işaret ekleyin ve sohbet düğmesine bildirimde tasarruf edin"
}
}
@@ -1647,7 +1647,7 @@
"description": "Kendi mesajlarınızı silinmekten kaçının"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Otomatik Temizleme",
"description": "Otomatik olarak belirtilen miktardan daha yaşlı olan önbellekli mesajları silinir"
},
"message_filter": {
@@ -1655,13 +1655,13 @@
"description": "Hangi mesajların giriş yapması gerektiğini seçin (tüm mesajlar için boşluk)"
},
"deleted_message_color": {
- "name": "Deleted Message Color",
+ "name": "Silinen Mesaj Rengi",
"description": "Silinmiş mesajların rengini ayarlar"
}
}
},
"auto_save_messages_in_conversations": {
- "name": "Auto Save Messages",
+ "name": "Sohbetlerde Mesajları Otomatik Kaydet",
"description": "Konuşmalarda her mesajı otomatik olarak kurtarır"
},
"unsaveable_messages": {
@@ -1669,11 +1669,11 @@
"description": "Seçilmiş mesaj türleri sohbette kurtarılıyor",
"properties": {
"chat": {
- "name": "Chat Messages",
+ "name": "Sohbet Mesajları",
"description": "Sohbet mesajları güvenilmez"
},
"snap": {
- "name": "Snaps",
+ "name": "Snap'ler",
"description": "Yavaşlayın"
},
"external_media": {
@@ -1685,7 +1685,7 @@
"description": "Etiketler güvenilmez"
},
"share": {
- "name": "Shares",
+ "name": "Paylaşımlar",
"description": "Paylaşılan içeriği güvenilmez"
},
"note": {
@@ -1693,7 +1693,7 @@
"description": "Ses notları güvenilmez"
},
"story_reply": {
- "name": "Story Replies",
+ "name": "Hikaye Yanıtları",
"description": "Hikaye cevaplanabilir"
}
}
@@ -1703,7 +1703,7 @@
"description": "Gallery'den gönderdiği zaman medya kaynağı",
"properties": {
"mode": {
- "name": "Override Mode",
+ "name": "Geçersiz Kılma Modu",
"description": "Galeri medyasının nasıl gönderildiğini seçin"
},
"include_camera_snaps": {
@@ -1713,15 +1713,15 @@
}
},
"strip_media_metadata": {
- "name": "Strip Media Metadata",
+ "name": "Medya Meta Verisini Temizle",
"description": "Bir mesaj olarak göndermeden önce metadata medya çıkarın"
},
"bypass_message_retention_policy": {
- "name": "Bypass Message Retention Policy",
+ "name": "Mesaj Saklama Politikasını Aş",
"description": "Onları izlemekten sonra mesajları önlemek"
},
"bypass_message_action_restrictions": {
- "name": "Bypass Message Action Restrictions",
+ "name": "Mesaj İşlem Kısıtlamalarını Aş",
"description": "Onu açmadan ya da güvenilmez bir mesaj kurtarmanıza izin verin"
},
"remove_groups_locked_status": {
@@ -1737,7 +1737,7 @@
"description": "Çift dokunuş sohbet eylemi için özel bir emoji reaksiyonu ayarlar"
},
"auto_reply": {
- "name": "Auto Reply",
+ "name": "Otomatik Yanıt",
"description": "Otomatik olarak uzaktayken gelen mesajlara cevap gönderir",
"properties": {
"allow_running_in_background": {
@@ -1745,7 +1745,7 @@
"description": "Auto, arka planda koşmaya izin verir. Not: Bu, bataryanızı önemli ölçüde boşaltacaktır"
},
"cooldown_seconds": {
- "name": "Cooldown Seconds",
+ "name": "Bekleme Saniyeleri",
"description": "Auto-replies to the same conversation (in saniye) arasındaki en az zaman"
},
"message_age_threshold": {
@@ -1757,19 +1757,19 @@
"description": "AI destekli oto-repler için platformlar",
"properties": {
"enable_ai_replies": {
- "name": "Enable AI Replies",
+ "name": "AI Yanıtlarını Etkinleştir",
"description": "Şablon mesajları yerine akıllı oto-repler oluşturmak için AI kullanın"
},
"ai_provider": {
- "name": "AI Provider",
+ "name": "AI Sağlayıcı",
"description": "Cevap oluşturmak için hangi AI hizmeti seçin"
},
"ai_endpoint_url": {
- "name": "AI Endpoint URL",
+ "name": "AI Uç Nokta URL'si",
"description": "AI hizmeti için API uç noktası URL (örneğin, OpenAI, yerel AI sunucusu)"
},
"ai_model": {
- "name": "AI Model",
+ "name": "AI Modeli",
"description": "Cevap üretmek için AI modeli (e.g., gpt-3.5-turbo, gpt-4)"
},
"ai_api_key": {
@@ -1777,11 +1777,11 @@
"description": "AI hizmeti ile gerçekleştirilmesi için API anahtarı"
},
"ai_system_prompt": {
- "name": "AI System Prompt",
+ "name": "AI Sistem İstemi",
"description": "Sistem, AI'nın kişiliğini ve davranışını tanımlaması için çabuk"
},
"ai_max_tokens": {
- "name": "AI Max Tokens",
+ "name": "AI Maksimum Token",
"description": "En fazla sayıda jeton (words) AI cevaplarında kullanabilir"
},
"ai_temperature": {
@@ -1789,19 +1789,19 @@
"description": "AI yanıtlarında rastgelelik (0.0 = deterministic, 2.0 = çok rastgele)"
},
"ai_context_length": {
- "name": "AI Context Length",
+ "name": "AI Bağlam Uzunluğu",
"description": "AI yanıtları için bağlam olarak eklemek için önceki mesajların sayısı"
},
"ai_personality_traits": {
- "name": "AI Personality Traits",
+ "name": "AI Kişilik Özellikleri",
"description": "AI için karşılıklı kişilik özellikleri (örneğin, dost, rahat, yararlı)"
},
"ai_response_style": {
- "name": "AI Response Style",
+ "name": "AI Yanıt Stili",
"description": "AI yanıtları için genel stil"
},
"ai_response_language": {
- "name": "AI Response Language",
+ "name": "AI Yanıt Dili",
"description": "AI yanıtları için dil (auto = aynı as receive message)"
},
"ai_use_conversation_history": {
@@ -1817,7 +1817,7 @@
"description": "AI bir yanıt üretmek için başarısız olursa şablon mesajları kullanın"
},
"ai_request_timeout": {
- "name": "AI Request Timeout",
+ "name": "AI İstek Zaman Aşımı",
"description": "AI yanıtını beklemek için maksimum süre ( saniyeler)"
},
"ai_retry_attempts": {
@@ -1843,15 +1843,15 @@
"description": "Hangi mesaj türlerini seçin otomatik-replies"
},
"chat_messages": {
- "name": "Chat Message Replies",
+ "name": "Sohbet Mesajı Yanıtları",
"description": "Metin sohbet mesajları için Auto-reply mesajları"
},
"snap_messages": {
- "name": "Snap Replies",
+ "name": "Snap Yanıtları",
"description": "Parlaklar için Auto-reply mesajları"
},
"story_share_messages": {
- "name": "Story Share Replies",
+ "name": "Hikaye Paylaşım Yanıtları",
"description": "Hikaye için Auto-reply mesajları"
},
"story_reply_messages": {
@@ -1871,11 +1871,11 @@
"description": "Çıkartmalar için Auto-reply mesajları"
},
"tiny_snap_messages": {
- "name": "Tiny Snap Replies",
+ "name": "Mini Snap Yanıtları",
"description": "Küçük snaps için Auto-reply mesajları"
},
"map_reaction_messages": {
- "name": "Map Reaction Replies",
+ "name": "Harita Tepkisi Yanıtları",
"description": "Harita reaksiyonları için Auto-reply mesajları"
},
"half_swipe_messages": {
@@ -1899,7 +1899,7 @@
"description": "Bir snapsan açmadan önce milisaniyelerde Asgari gecikme"
},
"max_delay_ms": {
- "name": "Max Delay (ms)",
+ "name": "Maks Gecikme (ms)",
"description": "Bir snapsan açmadan önce milisaniyelerde maksimum gecikme"
},
"queue_size": {
@@ -1911,7 +1911,7 @@
"description": "Başarısız olursa yeniden başlamak için zaman sayısı"
},
"retry_delay": {
- "name": "Retry Delay (ms)",
+ "name": "Yeniden Deneme Gecikmesi (ms)",
"description": "Yeniden deneme girişimleri arasındaki milisaniyelerde gecikme"
}
}
@@ -1925,7 +1925,7 @@
"description": "Auto Delete Sent Mesajlarının arka planda çalışmasını sağlar. Not: Bu, bataryanızı önemli ölçüde boşaltacaktır"
},
"delete_after_value": {
- "name": "Delete After (value)",
+ "name": "Sonra Sil (değer)",
"description": "Gönderilen mesajı silmeden önce zaman değeri"
},
"delete_after_unit": {
@@ -1937,7 +1937,7 @@
"description": "Hangi mesaj türlerinin otomatik olarak kapatılmalıdır"
},
"show_countdown": {
- "name": "Show Countdown",
+ "name": "Geri Sayımı Göster",
"description": "Mesajı silmeden önce notdown"
},
"show_notification": {
@@ -1963,11 +1963,11 @@
"description": "Dili tercüme etmek için"
},
"show_original": {
- "name": "Show Original Text",
+ "name": "Orijinal Metni Göster",
"description": "Orijinal mesaj metnini Gösterin"
},
"show_translation": {
- "name": "Show Translation",
+ "name": "Çeviriyi Göster",
"description": "Kelimenin çevirisi"
},
"translation_position": {
@@ -1975,11 +1975,11 @@
"description": "Çeviriyi orijinal metine göre nerede görüntülemek için"
},
"auto_translate": {
- "name": "Auto Translate",
+ "name": "Otomatik Çevir",
"description": "Alınan mesajları otomatik olarak çevirin"
},
"translate_on_tap": {
- "name": "Translate on Tap",
+ "name": "Dokunarak Çevir",
"description": "Çeviri mesajları"
},
"supported_languages": {
@@ -2017,7 +2017,7 @@
"name": "Hide Typing Göstergesi"
},
"auto_reply": {
- "name": "Auto Reply"
+ "name": "Otomatik Yanıt"
},
"auto_delete_sent_messages": {
"name": "Auto Delete Sent Mesajları"
@@ -2026,7 +2026,7 @@
"name": "Auto Download Auto Download"
},
"stealth": {
- "name": "Stealth Mode"
+ "name": "Gizli Mod"
},
"auto_save": {
"name": "Auto Save Auto Kaydet"
@@ -2068,19 +2068,19 @@
"description": "Özel bir kamera kararı, genişlik x yükseklik (e.g. 1920x 1080).\nÖzel karar cihazınız tarafından desteklenmeli"
},
"front_custom_frame_rate": {
- "name": "Front Custom Frame Rate",
+ "name": "Ön Özel Kare Hızı",
"description": "Ön kamera çerçeve oranı"
},
"back_custom_frame_rate": {
- "name": "Back Custom Frame Rate",
+ "name": "Arka Özel Kare Hızı",
"description": "Geri kamera çerçeve oranı"
},
"force_camera_source_encoding": {
- "name": "Force Camera Source Encoding",
+ "name": "Kamera Kaynak Kodlamasını Zorla",
"description": "Kamera kaynağı kodlamak"
},
"startup_default_camera": {
- "name": "Startup Default Camera",
+ "name": "Başlangıç Varsayılan Kamera",
"description": "Snapchat açtığında varsayılan kamerayı ayarlar"
},
"hevc_recording": {
@@ -2094,7 +2094,7 @@
"description": "Dönemsel olarak sizi Streaks hakkında bilgilendirmiyor",
"properties": {
"interval": {
- "name": "Interval",
+ "name": "Aralık",
"description": "Her hatırlatma arasındaki aralığı (saatler)"
},
"remaining_hours": {
@@ -2116,7 +2116,7 @@
"description": "Snapchat'in ana koduna kancasız Özellikler",
"properties": {
"composer_hooks": {
- "name": "Composer Hooks",
+ "name": "Composer Kancaları",
"description": "İndüktör çapraz platform UI çerçevesine kodlama kodu",
"properties": {
"show_first_created_username": {
@@ -2124,7 +2124,7 @@
"description": "Profil sayfasındaki mevcut kullanıcı adının yanında ilk yaratılan kullanıcıyı gösterir"
},
"bypass_camera_roll_limit": {
- "name": "Bypass Camera Roll Limit",
+ "name": "Kamera Rulosu Sınırını Aş",
"description": "Kamera ruloundan gönderebileceğiniz maksimum medya miktarını artırır"
},
"custom_self_destruct_snap_delay": {
@@ -2132,17 +2132,17 @@
"description": "Bir Snap gönderirken kendini tahrip eden zamanlayıcı için daha fazla seçenek verin"
},
"composer_console": {
- "name": "Composer Console",
+ "name": "Composer Konsolu",
"description": "JavaScript kodunu Pr (arm64 sadece) çalıştırmanıza izin verin"
},
"composer_logs": {
- "name": "Composer Logs",
+ "name": "Composer Günlükleri",
"description": "Redirects konsolu, PurrfectSnap'a kadar Kombine giriş yapar"
}
}
},
"disable_bitmoji": {
- "name": "Disable Bitmoji",
+ "name": "Bitmoji’yi Devre Dışı Bırak",
"description": "Engelli Arkadaşlar Profil Bitmoji"
},
"custom_emoji_font": {
@@ -2156,7 +2156,7 @@
}
},
"spoof": {
- "name": "Spoof",
+ "name": "Sahteleştirme",
"description": "Sizinle ilgili çeşitli bilgiler",
"properties": {
"play_store_installer_package_name": {
@@ -2172,16 +2172,16 @@
"description": "Snapchat'i tespit etmekten alıkoymak Mock lokasyonu"
},
"force_wifi_transport_flag": {
- "name": "Force Wi-Fi Transport Flag",
+ "name": "Wi-Fi Aktarım Bayrağını Zorla",
"description": "Rapor için Force network taşımacılık Mobil veriler yerine Wi-Fi"
},
"spoof_device_id": {
- "name": "Spoof Device ID",
- "description": "Override the Android ID sent to Snapchat",
+ "name": "Cihaz ID'sini Sahteleştir",
+ "description": "Snapchat'e gönderilen Android ID'sini geçersiz kıl",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
- "description": "Override the Android ID sent to Snapchat with a custom value"
+ "name": "Android ID'sini Sahteleştir",
+ "description": "Snapchat'e gönderilen Android ID'sini özel bir değerle değiştir"
},
"custom_android_id": {
"name": "Özel Android ID",
@@ -2190,11 +2190,11 @@
}
},
"spoof_device": {
- "name": "Spoof Device",
+ "name": "Cihazı Sahteleştir",
"description": "Present Snapchat başka bir cihaz modeli üzerinde çalışırken"
},
"device_model": {
- "name": "Device Model",
+ "name": "Cihaz Modeli",
"description": "Hangi cihaz modelini spoof için seçin"
}
}
@@ -2204,15 +2204,15 @@
"description": "Dış medyayı yerel olarak sohbet etmek için dönüştürücüler. Bu, chat download context menüsünde görünüyor"
},
"media_file_picker": {
- "name": "Media File Picker",
+ "name": "Medya Dosya Seçici",
"description": "Galeriden herhangi bir video / video seçmenize izin verin"
},
"story_logger": {
- "name": "Story Logger",
+ "name": "Hikaye Kaydedici",
"description": "Arkadaş hikayelerinin tarihini sağlayın"
},
"call_recorder": {
- "name": "Call Recorder",
+ "name": "Arama Kaydedici",
"description": "Otomatik olarak kayıt ses aramaları"
},
"account_switcher": {
@@ -2226,11 +2226,11 @@
}
},
"better_transcript": {
- "name": "Better Transcript",
+ "name": "Gelişmiş Döküm",
"description": "Ses notu transkriptini geliştirir",
"properties": {
"force_transcription": {
- "name": "Force Voice Note Transcription",
+ "name": "Sesli Not Transkripsiyonunu Zorla",
"description": "Tüm ses notlarının tranaught olmasına izin verir"
},
"preferred_transcription_lang": {
@@ -2256,15 +2256,15 @@
"description": "Enables unreleased /beta Snapchat özellikleri"
},
"context_menu_fix": {
- "name": "Context Menu Fix",
+ "name": "Bağlam Menüsü Düzeltmesi",
"description": "Cihazın çevrimdışı olduğu zaman Friend Feed Menu'i tamir etmeye çalışmak doğru görüntülenemez"
},
"app_lock": {
- "name": "App Lock",
+ "name": "Uygulama Kilidi",
"description": "Bir geçiş kodu olmadan Snapchat'a erişim",
"properties": {
"lock_on_resume": {
- "name": "Lock On Resume",
+ "name": "Devamda Kilitle",
"description": "Uygulamayı yeniden açıldığında kilitler"
}
}
@@ -2274,7 +2274,7 @@
"description": "Bypass the Story Boost Limit gecikme gecikme"
},
"meo_passcode_bypass": {
- "name": "My Eyes Only Passcode Bypass",
+ "name": "My Eyes Only Parola Atlama",
"description": "Bölüm Adı Only passcode\nBu sadece geçiş kodu daha önce doğru girilmişse çalışacaktır"
},
"no_friend_score_delay": {
@@ -2286,7 +2286,7 @@
"description": "Bir arkadaşınızı bir numaralı en iyi arkadaşınız olarak belirlemenize izin verin. Not: Sadece en iyi arkadaşınızı görebilirsiniz"
},
"e2ee": {
- "name": "End-To-End Encryption",
+ "name": "Uçtan Uca Şifreleme",
"description": "AES ile mesajlarınızı paylaşılan bir gizli anahtar kullanarak şifreler\nAnahtarınızı güvenli bir yerde kurtarmak için emin olun!",
"properties": {
"encrypted_message_indicator": {
@@ -2294,13 +2294,13 @@
"description": "Bir 🔒 emojiyi şifreli mesajlara ekleyin"
},
"force_message_encryption": {
- "name": "Force Message Encryption",
+ "name": "Mesaj Şifrelemeyi Zorla",
"description": "E2E Encryption'a sahip olmayan insanlara şifreli mesajları göndermeyi önler, ancak birden fazla konuşma seçildiğinde etkinleştirilir"
}
}
},
"add_friend_source_spoof": {
- "name": "Add Friend Source Spoof",
+ "name": "Arkadaş Ekleme Kaynağını Sahteleştir",
"description": "Bir Friend Request kaynağı"
},
"hidden_snapchat_plus_features": {
@@ -2334,7 +2334,7 @@
"description": "Senaryoların bulunduğu klasör nerede bulunur"
},
"auto_reload": {
- "name": "Auto Reload",
+ "name": "Otomatik Yeniden Yükle",
"description": "Otomatik olarak değiştirme senaryoları değiştirirken"
},
"integrated_ui": {
@@ -2342,7 +2342,7 @@
"description": "Snapchat bileşenlerini Snapchat’e eklemek için senaryolar"
},
"disable_log_anonymization": {
- "name": "Disable Log Anonymization",
+ "name": "Günlük Anonimleştirmeyi Devre Dışı Bırak",
"description": "Kayıtların anonimleştirilmesi"
},
"disable_optimization": {
@@ -2352,11 +2352,11 @@
}
},
"friend_tracker": {
- "name": "Friend Tracker",
+ "name": "Arkadaş Takip",
"description": "Records Friend's activity on Snapchat",
"properties": {
"record_messaging_events": {
- "name": "Record Messaging Events",
+ "name": "Mesajlaşma Olaylarını Kaydet",
"description": "Add a snap, reading a message, etc gibi mesajlaşma olayları."
},
"allow_running_in_background": {
@@ -2364,7 +2364,7 @@
"description": "Takipçinin arka planda koşmasına izin verin. Not: Bu, bataryanızı önemli ölçüde boşaltacaktır"
},
"auto_purge": {
- "name": "Auto Purge",
+ "name": "Otomatik Temizleme",
"description": "Otomatik olarak belirlenen miktardan daha yaşlı olan önbellekli olayları silir"
}
}
@@ -2375,842 +2375,843 @@
}
},
"friend_menu_option": {
- "mark_snaps_as_seen": "Mark Snaps görüldüğü gibi",
- "mark_stories_as_seen_locally": "Yerel olarak görülen Mark Stories",
- "preview": "Öpün",
- "stealth_mode": "Stealth Mode",
- "auto_download_blacklist": "Auto Download Blacklist",
- "anti_auto_save": "Anti Auto Save"
+ "mark_snaps_as_seen": "Snap'leri görüldü olarak işaretle",
+ "mark_stories_as_seen_locally": "Hikayeleri yerel olarak görüldü işaretle",
+ "preview": "Önizleme",
+ "stealth_mode": "Gizli Mod",
+ "auto_download_blacklist": "Otomatik İndirme Kara Listesi",
+ "anti_auto_save": "Otomatik Kaydetme Engeli"
},
"content_type": {
- "CHAT": "Chat",
+ "CHAT": "Sohbet",
"SNAP": "Snap",
- "EXTERNAL_MEDIA": "Dış Medya",
- "NOTE": "Audio Not",
- "STICKER": "Versiyon",
- "SHARE": "Share",
- "STATUS": "Durum durumu",
- "LOCATION": "Konum Location",
- "STATUS_SAVE_TO_CAMERA_ROLL": "Kamera Roll'a Kurtarıldı",
- "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "Ekran görüntüsü",
+ "EXTERNAL_MEDIA": "Harici Medya",
+ "NOTE": "Sesli Not",
+ "STICKER": "Çıkartma",
+ "SHARE": "Paylaş",
+ "STATUS": "Durum",
+ "LOCATION": "Konum",
+ "STATUS_SAVE_TO_CAMERA_ROLL": "Kamera Rulosuna Kaydedildi",
+ "STATUS_CONVERSATION_CAPTURE_SCREENSHOT": "Ekran Görüntüsü",
"STATUS_CONVERSATION_CAPTURE_RECORD": "Ekran Kaydı",
- "STATUS_CALL_MISSED_VIDEO": "Bayan Video Call",
- "STATUS_CALL_MISSED_AUDIO": "Bayan Audio Call",
- "LIVE_LOCATION_SHARE": "Canlı Konum Share",
- "CREATIVE_TOOL_ITEM": "Creative Tool Item",
- "FAMILY_CENTER_INVITE": "Family Center Invite",
- "FAMILY_CENTER_ACCEPT": "Family Center Kabul Ediyor",
- "FAMILY_CENTER_LEAVE": "Family Center Leave",
- "STATUS_PLUS_GIFT": "Durum Plus Hediye",
- "TINY_SNAP": "Tiny Snap",
- "STATUS_COUNTDOWN": "Kontdown",
- "MAP_REACTION": "Map Reaction",
- "chat_messages": "Chat Messages",
- "snap_messages": "Snaps",
- "story_share_messages": "Story Shares",
- "story_reply_messages": "Story Replies",
- "external_media_messages": "Dış Medya",
- "voice_note_messages": "Ses Not",
- "sticker_messages": "Versiyon",
- "tiny_snap_messages": "Tiny Snap",
- "map_reaction_messages": "Map Reaction",
- "half_swipes": "Half Swipes"
+ "STATUS_CALL_MISSED_VIDEO": "Cevapsız Görüntülü Arama",
+ "STATUS_CALL_MISSED_AUDIO": "Cevapsız Sesli Arama",
+ "LIVE_LOCATION_SHARE": "Canlı Konum Paylaşımı",
+ "CREATIVE_TOOL_ITEM": "Yaratıcı Araç Öğesi",
+ "FAMILY_CENTER_INVITE": "Aile Merkezi Daveti",
+ "FAMILY_CENTER_ACCEPT": "Aile Merkezi Kabul",
+ "FAMILY_CENTER_LEAVE": "Aile Merkezinden Ayrıl",
+ "STATUS_PLUS_GIFT": "Plus Durum Hediyesi",
+ "TINY_SNAP": "Mini Snap",
+ "STATUS_COUNTDOWN": "Geri Sayım",
+ "MAP_REACTION": "Harita Tepkisi",
+ "chat_messages": "Sohbet Mesajları",
+ "snap_messages": "Snap'ler",
+ "story_share_messages": "Hikaye Paylaşımları",
+ "story_reply_messages": "Hikaye Yanıtları",
+ "external_media_messages": "Harici Medya",
+ "voice_note_messages": "Sesli Not",
+ "sticker_messages": "Çıkartma",
+ "tiny_snap_messages": "Mini Snap",
+ "map_reaction_messages": "Harita Tepkisi",
+ "half_swipes": "Yarım Kaydırmalar"
},
"media_download_source": {
- "none": "Hiçbir şey yok",
- "pending": "Pending",
- "chat_media": "Chat Media",
- "story": "Story",
- "public_story": "Public Story",
+ "none": "Yok",
+ "pending": "Beklemede",
+ "chat_media": "Sohbet Medyası",
+ "story": "Hikaye",
+ "public_story": "Herkese Açık Hikaye",
"spotlight": "Spotlight",
- "profile_picture": "Profil resmi",
- "story_logger": "Story Logger",
- "message_logger": "Mesaj Logger",
- "merged": "Merged",
- "voice_call": "Ses Çağrısı"
+ "profile_picture": "Profil Fotoğrafı",
+ "story_logger": "Hikaye Kaydedici",
+ "message_logger": "Mesaj Kaydedici",
+ "merged": "Birleştirildi",
+ "voice_call": "Sesli Arama"
},
"chat_action_menu": {
- "preview_button": "Öpün",
- "download_button": "Download",
- "delete_logged_message_button": "Delete Logged Message",
- "show_chat_edit_history": "Show Chat Edit History",
- "convert_message": "Dönüştürücü Mesaj"
+ "preview_button": "Önizleme",
+ "download_button": "İndir",
+ "delete_logged_message_button": "Kaydedilen Mesajı Sil",
+ "show_chat_edit_history": "Sohbet Düzenleme Geçmişini Göster",
+ "convert_message": "Mesajı Dönüştür"
},
"opera_context_menu": {
- "download": "Download Media",
- "sent_at": "Sent at{date}",
- "created_at": "Oluşturulduğunda{date}",
- "expires_at": "Expires at{date}",
- "media_size": "Medya büyüklüğü:{size}",
- "media_duration": "Medya süresi:{duration}ms m",
- "show_debug_info": "Show Debug Info"
+ "download": "Medyayı İndir",
+ "sent_at": "Gönderilme: {date}",
+ "created_at": "Oluşturulma: {date}",
+ "expires_at": "Süresi: {date}",
+ "media_size": "Medya boyutu: {size}",
+ "media_duration": "Medya süresi: {duration} ms",
+ "show_debug_info": "Hata Ayıklama Bilgisini Göster"
},
"modal_option": {
- "profile_info": "Profil bilgisi",
- "close": "Close"
+ "profile_info": "Profil Bilgisi",
+ "close": "Kapat"
},
"gallery_media_send_override": {
- "always_ask": "Her zaman sorun",
+ "always_ask": "Her Zaman Sor",
"ORIGINAL": "Orijinal Medya",
- "NOTE": "Audio Not",
+ "NOTE": "Sesli Not",
"SNAP": "Snap",
- "SAVEABLE_SNAP": "Kurtarılabilir Snap",
- "null": "Snapchat",
- "multiple_media_toast": "Bir seferde sadece bir medya gönderebilirsiniz"
+ "SAVEABLE_SNAP": "Kaydedilebilir Snap",
+ "null": "Snapchat Varsayılanı",
+ "multiple_media_toast": "Aynı anda yalnızca bir medya gönderebilirsiniz"
},
"mark_as_seen": {
- "no_unseen_snaps_toast": "Hiç görünmeyen Snaps bulunamadı!",
- "seen_toast": "Görüldüğü gibi Marked!",
- "unseen_toast": "Görünüşe göre Marked!",
- "already_seen_toast": "Zaten görüldükçe işaretlendi!",
- "already_unseen_toast": "Zaten görünmez olarak işaretlendi!"
+ "no_unseen_snaps_toast": "Görülmemiş Snap bulunamadı!",
+ "seen_toast": "Görüldü olarak işaretlendi!",
+ "unseen_toast": "Görülmedi olarak işaretlendi!",
+ "already_seen_toast": "Zaten görüldü olarak işaretli!",
+ "already_unseen_toast": "Zaten görülmedi olarak işaretli!"
},
"conversation_preview": {
- "streak_expiration": "süresi sona erer{day}günler{hour}saatler saat saatler saatler{minute}dakika",
- "total_messages": "Total sent/received mesajları:\n{count}",
- "title": "Öpün",
+ "streak_expiration": "Şu süre sonra sona erer: {day} gün {hour} saat {minute} dakika",
+ "total_messages": "Toplam gönderilen/alınan mesajlar:\n{count}",
+ "title": "Önizleme",
"unknown_user": "Bilinmeyen Kullanıcı",
- "no_messages": "Bululan mesajlar yok!"
+ "no_messages": "Mesaj bulunamadı!"
},
"profile_info": {
- "title": "Profil bilgisi",
- "first_created_username": "İlk Oluşturucu Kullanıcı adı",
- "mutable_username": "Mutable Kullanıcı adı",
- "display_name": "Ekran Adı",
- "added_date": "Eklenen Tarih",
- "birthday": "Doğum günü:{month}{day}",
- "hidden_birthday": "Doğum günü: Hidden",
+ "title": "Profil Bilgisi",
+ "first_created_username": "İlk Oluşturulan Kullanıcı Adı",
+ "mutable_username": "Değiştirilebilir Kullanıcı Adı",
+ "display_name": "Görünen Ad",
+ "added_date": "Eklenme Tarihi",
+ "birthday": "Doğum Günü: {month} {day}",
+ "hidden_birthday": "Doğum Günü: Gizli",
"friendship": "Arkadaşlık",
- "add_source": "Add Source",
+ "add_source": "Ekleme Kaynağı",
"snapchat_plus": "Snapchat Plus",
"snapchat_plus_state": {
- "subscribed": "Abone olun",
- "not_subscribed": "Abone değil"
+ "subscribed": "Abone",
+ "not_subscribed": "Abone Değil"
}
},
"snapchat_plus_state": {
- "subscribed": "Abone olun",
- "not_subscribed": "Abone değil"
+ "subscribed": "Abone",
+ "not_subscribed": "Abone Değil"
},
"friendship_link_type": {
"mutual": "Karşılıklı",
- "outgoing": "Outgoing",
- "blocked": "Bloked",
- "deleted": "Deleted",
- "following": "Takip",
- "suggested": "Önerilendi",
- "incoming": "Incoming",
- "incoming_follower": "Incoming Follower"
+ "outgoing": "Giden",
+ "blocked": "Engellendi",
+ "deleted": "Silindi",
+ "following": "Takip Ediliyor",
+ "suggested": "Önerilen",
+ "incoming": "Gelen",
+ "incoming_follower": "Gelen Takipçi"
},
"bulk_messaging_action": {
"actions.title": "Eylemler",
"choose_action_title": "Bir eylem seçin",
- "progress_status": "İşleme{index}of{total}",
- "selection_dialog_continue_button": "Devam etmeye devam et",
+ "progress_status": "{index} / {total} i?leniyor",
+ "selection_dialog_continue_button": "Devam Et",
"confirmation_dialog": {
"title": "Emin misiniz?",
- "message": "Bu, tüm seçilenleri etkileyecektir, Bu eylem geri alınamaz."
+ "message": "Bu işlem seçilenlerin tamamını etkileyecek, geri alınamaz."
},
"actions": {
"remove_friends": "Arkadaşları Kaldır",
- "clear_conversations": "Açık Konuşmalar",
- "clear_friend_feed": "Clear Friend Feed (İngilizce){count})",
- "unfollow": "Takipsiz",
- "remove": "Kaldırın"
+ "clear_conversations": "Konşmaları Temizle",
+ "clear_friend_feed": "Arkadaş Akışını Temizle ({count})",
+ "unfollow": "Takipten Çık",
+ "remove": "Kaldır",
+ "title": "Eylemler"
},
- "leave_groups": "Leave{count}grup grupları grup grupları",
- "left_group_success": "Sol grup başarılı bir şekilde",
- "failed_to_leave_group": "Gruptan ayrılmak için başarısız oldu:{error}",
+ "leave_groups": "{count} gruptan ayrıl",
+ "left_group_success": "Gruptan başarıyla çıkıldı",
+ "failed_to_leave_group": "Gruptan çıkılamadı: {error}",
"conversation_types": {
- "friends_only": "Arkadaşlar Sadece Arkadaşlar",
- "groups_only": "Sadece Gruplar Sadece Gruplar",
- "both": "Arkadaşlar & Gruplar"
+ "friends_only": "Sadece Arkadaşlar",
+ "groups_only": "Sadece Gruplar",
+ "both": "Arkadaşlar ve Gruplar"
},
- "sort_by": "Sort by Sort by Sort",
- "reverse_order": "Ters sipariş",
- "search_by_name": "Search by name",
- "no_friends_found": "Hiçbir arkadaş bulunamadı",
- "no_groups_found": "Hiçbir grup bulunamadı",
- "no_friends_or_groups_found": "Hiçbir arkadaş veya grup bulunamadı",
- "relationship": "İlişki:",
+ "sort_by": "Şuna göre sırala",
+ "reverse_order": "Ters sıralama",
+ "search_by_name": "İsme göre ara",
+ "no_friends_found": "Arkadaş bulunamadı",
+ "no_groups_found": "Grup bulunamadı",
+ "no_friends_or_groups_found": "Arkadaş veya grup bulunamadı",
+ "relationship": "İlişki: ",
"unknown_group": "Bilinmeyen Grup",
"type_group_chat": "Tür: Grup Sohbeti",
- "clean_conversations": "Temiz{count}konuşma konuşmaları",
- "remove_friends": "Kaldırın{count}arkadaşları",
- "clean_conversations_and_remove_friends": "Temiz{count}konuşmaları ve kaldırmak{count}arkadaşları",
- "clean_group_conversations": "Temiz{count}grup konuşmaları",
- "clean_all_conversations": "Temiz{count}konuşma konuşmaları",
- "failed_to_fetch_conversations": "Konuşmaları getiremedi:{error}",
- "failed_to_fetch_friend_conversations": "Arkadaş konuşmaları getiremedi:{error}",
- "failed_to_process": "Süreç başarısız oldu{id}",
- "deleted_messages": "{count}silinmiş mesajlar silindi",
+ "clean_conversations": "{count} konuşmayı temizle",
+ "remove_friends": "{count} arkadaşı kaldır",
+ "clean_conversations_and_remove_friends": "{count} konuşmayı temizle ve {count} arkadaşı kaldır",
+ "clean_group_conversations": "{count} grup konuşmasını temizle",
+ "clean_all_conversations": "{count} konuşmayı temizle",
+ "failed_to_fetch_conversations": "Konşmalar alınamadı: {error}",
+ "failed_to_fetch_friend_conversations": "Arkadaş konuşmaları alınamadı: {error}",
+ "failed_to_process": "{id} işlenemedi",
+ "deleted_messages": "{count} silinen mesaj",
"filters": {
- "all": "Bütün Bütün Hepsi",
+ "all": "Tümü",
"my_friends": "Arkadaşlarım",
- "blocked": "Bloked",
- "removed_me": "Kaldır beni",
- "suggested": "Önerilendi",
- "deleted": "Deleted",
- "business_accounts": "İş Hesapları",
- "streaks": "Streaks",
- "non_streaks": "Azizler",
- "followed": "Takip Edildi",
- "following": "Takip",
- "location_on_map": "Map on Map"
+ "blocked": "Engellendi",
+ "removed_me": "Beni kaldırdı",
+ "suggested": "Önerilen",
+ "deleted": "Silindi",
+ "business_accounts": "İşletme Hesapları",
+ "streaks": "Seriler",
+ "non_streaks": "Seri Yok",
+ "followed": "Takip Edilen",
+ "following": "Takip Ediliyor",
+ "location_on_map": "Haritadaki Konum"
},
"sort_options": {
- "none": "Hiçbir şey yok",
- "username": "Username",
- "added_timestamp": "Timestampamp",
- "snap_score": "Snap Score",
- "streak_length": "Streak Uzunluk",
- "most_messages_sent": "Çoğu Mesaj Sent",
+ "none": "Yok",
+ "username": "Kullanıcı Adı",
+ "added_timestamp": "Eklenme Zamanı",
+ "snap_score": "Snap Puanı",
+ "streak_length": "Seri Uzunluğu",
+ "most_messages_sent": "En Çok Gönderilen Mesaj",
"most_recent_message": "En Son Mesaj",
- "nearest_location": "En yakın Konum"
+ "nearest_location": "En Yakın Konum"
}
},
"chat_export": {
"exporter_dialog": {
- "select_conversations_title": "Konuşmaları seçin",
- "text_field_selection": "{amount}seçilen",
- "text_field_selection_all": "Bütün Bütün Hepsi",
- "export_file_format_title": "Export File Format",
- "message_type_filter_title": "Filtre Mesajları Type",
- "amount_of_messages_title": "Mesaj Count (hepsi için boş bırak)",
- "download_medias_title": "Download Media"
+ "select_conversations_title": "Sohbetleri Seç",
+ "text_field_selection": "{amount} seçildi",
+ "text_field_selection_all": "Tümü",
+ "export_file_format_title": "Dışa Aktarma Dosya Biçimi",
+ "message_type_filter_title": "Mesajları Türüne Göre Filtrele",
+ "amount_of_messages_title": "Mesaj Sayısı (tümü için boş bırakın)",
+ "download_medias_title": "Medyayı İndir"
},
- "dialog_negative_button": "Cancel",
- "dialog_positive_button": "İhracat İhracatı",
- "exported_to": "İhracata ihracat yapmak için{path}",
- "exporting_chats": "Chats'ı ihraç etmek...",
- "processing_chats": "İşleme{amount}konuşmaları...",
- "export_fail": "Konuşmayı ihraç etmek için başarısız oldu{conversation}",
- "writing_output": "Yazı çıktı...",
- "finished": "Done! Şimdi bu dialogu kapatabilirsiniz.",
- "no_messages_found": "Bululan mesajlar yok!",
- "exporting_message": "İhracatı{conversation}..."
+ "dialog_negative_button": "İptal",
+ "dialog_positive_button": "Dışa Aktar",
+ "exported_to": "{path} konumuna dışa aktarıldı",
+ "exporting_chats": "Sohbetler dışa aktarılıyor...",
+ "processing_chats": "{amount} sohbet işleniyor...",
+ "export_fail": "{conversation} konuşması dışa aktarılamadı",
+ "writing_output": "Çıktı yazılıyor...",
+ "finished": "Bitti! Artık bu iletişim kutusunu kapatabilirsiniz.",
+ "no_messages_found": "Mesaj bulunamadı!",
+ "exporting_message": "{conversation} dışa aktarılıyor..."
},
"button": {
- "ok": "TAMAM TAMAM",
+ "ok": "Tamam",
"positive": "Evet",
- "negative": "Hayır hayır hayır",
- "cancel": "Cancel",
+ "negative": "Hayır",
+ "cancel": "İptal",
"save": "Kaydet",
- "open": "Açık",
- "download": "Download",
- "send": "Send Send Send Gönder",
- "restore_original": "Geri yükleme",
- "convert_external_media": "Dış Medya"
+ "open": "Aç",
+ "download": "İndir",
+ "send": "Gönder",
+ "restore_original": "Orijinali Geri Yükle",
+ "convert_external_media": "Harici Medyayı Dönüştür"
},
"tracker_events": {
- "conversation_enter": "Konuşmaya Girin",
- "conversation_exit": "Konuşma Çıkışı",
- "started_typing": "Typing başladı",
- "stopped_typing": "Stopped Typing",
- "started_speaking": "Konuşmaya başladı",
+ "conversation_enter": "Sohbete Girdi",
+ "conversation_exit": "Sohbetten Çıktı",
+ "started_typing": "Yazmaya Başladı",
+ "stopped_typing": "Yazmayı Durdurdu",
+ "started_speaking": "Konuşmaya Başladı",
"stopped_speaking": "Konuşmayı Durdurdu",
- "started_peeking": "Peeking başladı Peeking",
- "stopped_peeking": "Durmuş Peeking",
- "message_read": "Mesaj Oku",
- "message_deleted": "Mesaj Deleted",
- "message_saved": "Mesaj Saved",
- "message_unsaved": "Mesaj Unsaved",
- "message_edited": "Mesaj Edited",
- "message_reaction_add": "Mesaj Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add Add",
- "message_reaction_remove": "Mesaj Reaksiyonu Kaldır",
- "snap_opened": "Snap Opened",
- "snap_replayed": "Snap Replayed",
- "snap_replayed_twice": "Snap Replayed Two",
- "snap_screenshot": "Snap Screenshot",
+ "started_peeking": "Göz Atmaya Başladı",
+ "stopped_peeking": "Göz Atmayı Durdurdu",
+ "message_read": "Mesaj Okundu",
+ "message_deleted": "Mesaj Silindi",
+ "message_saved": "Mesaj Kaydedildi",
+ "message_unsaved": "Mesaj Kaydetme Kaldırıldı",
+ "message_edited": "Mesaj Düzenlendi",
+ "message_reaction_add": "Mesaj Tepkisi Eklendi",
+ "message_reaction_remove": "Mesaj Tepkisi Kaldırıldı",
+ "snap_opened": "Snap Açıldı",
+ "snap_replayed": "Snap Tekrarlandı",
+ "snap_replayed_twice": "Snap İki Kez Tekrarlandı",
+ "snap_screenshot": "Snap Ekran Görüntüsü",
"snap_screen_record": "Snap Ekran Kaydı",
- "i_can_see_you": "Seni Görebilir miyim"
+ "i_can_see_you": "Seni Görebiliyorum"
},
- "cleared_from_feed": "Feed from feed",
+ "cleared_from_feed": "Akıştan temizlendi",
"tracker_actions": {
- "log": "Log",
- "in_app_notification": "In-App Bildirim",
- "push_notification": "Push Bildirim",
+ "log": "Günlükle",
+ "in_app_notification": "Uygulama İçi Bildirim",
+ "push_notification": "Push Bildirimi",
"custom": "Özel"
},
"better_notifications": {
"button": {
- "reply": "BeğenBeğen Cevap",
- "download": "Download",
- "mark_as_read": "Mark as Read"
+ "reply": "Yanıtla",
+ "download": "İndir",
+ "mark_as_read": "Okundu Olarak İşaretle"
}
},
"profile_picture_downloader": {
- "button": "Download Profile Picture",
- "title": "Profil resmi",
+ "button": "Profil Resmini İndir",
+ "title": "Profil Resmi İndirici",
"avatar_option": "Avatar",
- "background_option": "Arka plan arka plan arka plan"
+ "background_option": "Arka Plan"
},
"call_start_confirmation": {
- "dialog_title": "Start Call",
- "dialog_message": "Bir çağrı başlatmak istediğinizden emin misiniz?"
+ "dialog_title": "Arama Başlat",
+ "dialog_message": "Arama başlatmak istediğinize emin misiniz?"
},
"half_swipe_notifier": {
- "notification_channel_name": "Half Swipe",
- "notification_content_dm": "{friend}sadece yarısı sohbetinize sohbete girdi{duration}saniye",
- "notification_content_group": "{friend}sadece yarı çıplak{group}çünkü{duration}saniye"
+ "notification_channel_name": "Yarım Kaydırma",
+ "notification_content_dm": "{friend} az önce sohbetinize {duration} saniye yarım kaydırdı",
+ "notification_content_group": "{friend} az önce {group} için {duration} saniye yarım kaydırdı"
},
"download_processor": {
"attachment_type": {
"snap": "Snap",
- "sticker": "Versiyon",
+ "sticker": "Çıkartma",
"gif": "GIF",
- "external_media": "Dış Medya",
+ "external_media": "Harici Medya",
"note": "Not",
"original_story": "Orijinal Hikaye"
},
- "select_attachments_title": "Bağları seçin",
- "download_started_toast": "Download kullanmaya başladı",
- "unsupported_content_type_toast": "Desteklenen içerik türü!",
- "failed_no_longer_available_toast": "Media artık mevcut değil",
- "no_attachments_toast": "Hiçbir ek bulunamadı!",
+ "select_attachments_title": "Ekleri seç",
+ "download_started_toast": "İndirme başladı",
+ "unsupported_content_type_toast": "Desteklenmeyen içerik türü!",
+ "failed_no_longer_available_toast": "Medya artık mevcut değil",
+ "no_attachments_toast": "Ek bulunamadı!",
"already_queued_toast": "Medya zaten kuyrukta!",
- "already_downloaded_toast": "Medya zaten indirilmiştir!",
- "content_saved_toast": "Kurtarın!",
- "download_toast": "Downloading{path}...",
- "processing_toast": "İşleme{path}...",
- "failed_generic_toast": "Indirmek için başarısız oldu",
- "failed_to_create_preview_toast": "Önizleme oluşturmak için başarısız oldu",
- "failed_processing_toast": "Başarısız işleme{error}",
- "failed_gallery_toast": "Galeriye tasarruf etme{error}",
- "dash_no_chapter": "Hiçbir bölüm bulunamadı",
+ "already_downloaded_toast": "Medya zaten indirildi!",
+ "content_saved_toast": "Kaydedildi!",
+ "download_toast": "{path} indiriliyor...",
+ "processing_toast": "{path} işleniyor...",
+ "failed_generic_toast": "İndirme başarısız",
+ "failed_to_create_preview_toast": "Önizleme oluşturulamadı",
+ "failed_processing_toast": "{error} işlenemedi",
+ "failed_gallery_toast": "Galeriye kaydedilemedi {error}",
+ "dash_no_chapter": "Bölüm bulunamadı",
"dash_dialog": {
- "title": "Download dash media",
- "download_all": "Download All Download All Download Download Download Download All Download Download",
- "segment_text": "Bölüm{from}-{to}"
+ "title": "Dash medyası indir",
+ "download_all": "Tümünü İndir",
+ "segment_text": "Parça {from} - {to}"
}
},
"streaks_reminder": {
- "notification_title": "Streaks",
- "notification_text": "Streak'ı seninle kaybedersiniz{friend}in{hoursLeft}saatler saat saatler saatler"
+ "notification_title": "Seriler",
+ "notification_text": "{friend} ile seriyi {hoursLeft} saat içinde kaybedeceksiniz"
},
"biometric_auth": {
- "unlock_button": "Unlock",
- "title": "Unlock Snapchat",
- "subtitle": "Lütfen Snapchat'i açmak için otantiklik"
+ "unlock_button": "Kilidi Aç",
+ "title": "Snapchat Kilidini Aç",
+ "subtitle": "Snapchat kilidini açmak için kimliğinizi doğrulayın"
},
"end_to_end_encryption": {
"toolbox": {
- "no_shared_key": "Henüz bu arkadaşıyla paylaşılan bir sırrınız yok. Yeni bir tane başlatmak için aşağıda tıklayın.",
- "shared_key_fingerprint": "Parmaklarınız:\n\n{fingerprint}Arkadaşınızın parmak iziyle eşleşmesini kontrol ettiğinizden emin olun!",
- "initiate_exchange_button": "Anahtar Değişimi"
+ "no_shared_key": "Bu arkadaşla henüz paylaşılan bir sırrınız yok. Yenisini başlatmak için aşağıya tıklayın.",
+ "shared_key_fingerprint": "Parmak iziniz:\n\n{fingerprint}\n\nArkadaşınızın parmak iziyle eşleştiğinden emin olun!",
+ "initiate_exchange_button": "Anahtar Değişimini Başlat"
},
"confirmation_dialogs": {
- "title": "End-to-end şifreleme",
- "confirmation_1": "WARNING: Bu, mevcut anahtarınızı yazacaktır. Bu arkadaştan tüm şifreli mesajlara erişeceksiniz. Devam etmek istediğinizden emin misiniz?",
- "confirmation_2": "Gerçekten devam etmek istediğinizden emin misiniz? Bu geri dönmenin son şansın."
+ "title": "Uçtan uca Şifreleme",
+ "confirmation_1": "UYARI: Bu işlem mevcut anahtarınızın üzerine yazar. Bu arkadaşın tüm şifreli mesajlarına erişiminizi kaybedersiniz. Devam etmek istediğinize emin misiniz?",
+ "confirmation_2": "Devam etmek istediğinizden GERÇEKTEN emin misiniz? Geri dönmek için son şansınız."
},
- "unencrypted_conversation_send_failure_toast": "Şifreli içeriği hem şifreli hem de şifrelenmemiş sohbetlere gönderemezsiniz!",
- "native_hooks_send_failure_toast": "Göndermek için başarısız oldu! Lütfen yerel Hook'ları ayarlarda etkinleştirin.",
- "no_participants_to_encrypt_toast": "Bu sohbette şifre mesajları ile şifrelemek için herhangi bir arkadaşınız yok!",
- "encryption_failed_toast": "Şifreli mesaj almak için başarısız oldu! Daha fazla ayrıntı için logcat kontrol edin.",
- "accept_public_key_success_toast": "Kamu anahtarı başarıyla kabul edildi!",
- "accept_secret_key_success_toast": "Done! Artık bu arkadaşınızla şifreli mesajlar gönderebilir ve alabilirsiniz.",
- "accept_public_key_failure_toast": "Kamu anahtarını kabul etmek için başarısız oldu",
- "accept_secret_key_failure_toast": "Gizli anahtarı kabul etmek için başarısız oldu",
- "accept_secret_button": "Kabul Eden Gizli",
- "accept_public_key_button": "Halk Kabul Ediyor Anahtar Anahtar Anahtar Anahtar",
+ "unencrypted_conversation_send_failure_toast": "Hem şifreli hem şifresiz konuşmalara şifreli içerik gönderemezsiniz!",
+ "native_hooks_send_failure_toast": "Gönderilemedi! Lütfen ayarlardan Native Hooks’u etkinleştirin.",
+ "no_participants_to_encrypt_toast": "Bu konuşmada mesajları şifrelemek için hiçbir arkadaşınız yok!",
+ "encryption_failed_toast": "Mesaj şifrelenemedi! Daha fazla bilgi için logcat’i kontrol edin.",
+ "accept_public_key_success_toast": "Açık anahtar başarıyla kabul edildi!",
+ "accept_secret_key_success_toast": "Tamam! Artık bu arkadaşla şifreli mesaj gönderebilir ve alabilirsiniz.",
+ "accept_public_key_failure_toast": "Açık anahtar kabul edilemedi",
+ "accept_secret_key_failure_toast": "Gizli anahtar kabul edilemedi",
+ "accept_secret_button": "Gizli Anahtarı Kabul Et",
+ "accept_public_key_button": "Açık Anahtarı Kabul Et",
"outgoing_pk_message": "Anahtar değişim isteği",
- "outgoing_secret_message": "Anahtar değişim yanıt",
- "incoming_pk_message": "Sadece kamu anahtar isteği aldın. Kabul etmek için aşağıda tıklayın.",
- "incoming_secret_message": "Arkadaşınız sadece halkın anahtarını kabul etti. sırrı kabul etmek için aşağıda tıklayın."
+ "outgoing_secret_message": "Anahtar değişim yanıtı",
+ "incoming_pk_message": "Az önce bir açık anahtar isteği aldınız. Kabul etmek için aşağıya tıklayın.",
+ "incoming_secret_message": "Arkadaşınız açık anahtarınızı kabul etti. Gizliyi kabul etmek için aşağıya tıklayın."
},
"auto_open_snaps": {
- "title": "Auto Open Snaps",
- "priority_title": "Auto Open Snaps (Priority)",
- "error_title": "Auto Open Snaps (Errors)",
- "channel_description": "Otomatik açılmak için bildirimler kuyruk durumu durumu",
- "priority_channel_description": "Otomatik açma için yüksek öncelik bildirimleri",
- "error_channel_description": "Otomatik açılırken hata bildirimleri başarısız olur",
- "paused_status": "Auto Open Snaps durakladı",
- "processing_status": "Processing snaps:{queued}kuyrukta,{processed}işlenmiş iş",
- "monitor_status": "İzleme...",
- "recent_snaps": "Son zamanlarda Snaps",
- "action_pause": "Pause",
- "action_resume": "Resume",
- "action_clear": "Clear Queue",
- "action_reset": "Sıfır Kont",
- "error_content": "Yavaştan açılmak için başarısız oldu{sender}:{error}",
- "resumed_feedback": "Auto Open Resumed",
- "paused_feedback": "Auto Open Pa used",
- "resumed_message": "İşleme otomatik olarak kuyruklanmış snaps için devam edecek",
- "paused_message": "İşleme durakladı. Queue korunmuştur ({count}yavaşlar)",
- "status_paused": "Pa used Pa used",
- "status_monitoring": "İzleme",
- "status_active": "Aktif",
- "queue_cleared": "Queue temizlendi ve istatistikler sıfırlandı",
- "queue_cleared_title": "Queue temizlendi",
- "queue_cleared_reset": "Queue Cleared & reset",
- "queue_cleared_feedback": "Cleared{count}kuyruklar reset{processed}processed count",
- "queue_cleared_feedback_simple": "Reset{processed}processed count",
+ "title": "Snap'leri Otomatik Aç",
+ "priority_title": "Snap'leri Otomatik Aç (Öncelik)",
+ "error_title": "Snap'leri Otomatik Aç (Hatalar)",
+ "channel_description": "Snap'leri otomatik açma kuyruğu durumu için bildirimler",
+ "priority_channel_description": "Snap'leri otomatik açma için yüksek öncelikli bildirimler",
+ "error_channel_description": "Snap'leri otomatik açma başarısız olduğunda hata bildirimleri",
+ "paused_status": "Snap'leri Otomatik Aç duraklatıldı",
+ "processing_status": "Snap'ler işleniyor: {queued} kuyrukta, {processed} işlendi",
+ "monitor_status": "İzleniyor...",
+ "recent_snaps": "Son Snap'ler",
+ "action_pause": "Duraklat",
+ "action_resume": "Sürdür",
+ "action_clear": "Kuyruğu Temizle",
+ "action_reset": "Sayacı Sıfırla",
+ "error_content": "{sender} gönderenden Snap açılamadı: {error}",
+ "resumed_feedback": "Otomatik Açma Sürdürüldü",
+ "paused_feedback": "Otomatik Açma Duraklatıldı",
+ "resumed_message": "Kuyruktaki Snap'ler otomatik işlenmeye devam edecek",
+ "paused_message": "İşlem duraklatıldı. Kuyruk korundu ({count} Snap)",
+ "status_paused": "Duraklatıldı",
+ "status_monitoring": "İzleniyor",
+ "status_active": "Etkin",
+ "queue_cleared": "Kuyruk temizlendi ve istatistikler sıfırlandı",
+ "queue_cleared_title": "Kuyruk temizlendi",
+ "queue_cleared_reset": "Kuyruk Temizlendi ve Sıfırlandı",
+ "queue_cleared_feedback": "Kuyruktaki {count} Snap temizlendi • İşlenen {processed} sayısı sıfırlandı",
+ "queue_cleared_feedback_simple": "İşlenen {processed} sayısı sıfırlandı",
"unknown_sender": "Bilinmeyen",
"unknown_user": "Bilinmeyen Kullanıcı",
- "content_type_external_media": "Dış Medya",
+ "content_type_external_media": "Harici Medya",
"content_type_snap": "Snap",
"conversation_type_friend_dm": "Arkadaş DM",
"conversation_type_dm": "DM",
- "conversation_type_group_chat": "Grup Chat",
- "conversation_type_chat": "Chat",
- "notification_status": "Durum durumu",
- "notification_statistics": "STATISTICS",
- "notification_queue_size": "Queue Boyut",
- "notification_total_opened": "Total Snaps Açıklandı",
- "notification_queue_preview": "QUEUE PREVIEW",
- "notification_processing_continue": "İşleme otomatik olarak devam edecek...",
- "notification_no_snaps_queue": "Kuyrukta yok.",
- "notification_queue_cleared_opened": "Queue temizlendi ({opened}açıldı)",
- "content_type_photo_video_snap": "Photo/Video Snap",
- "conversation_type_group_with_name": "Grup:{name}",
- "delete_logs_title": "Delete loglar?",
- "delete_logs_progress": "Deleting{count}loglar...",
- "delete_logs_description": "Bu, mevcut filtreye ve arama sorgularına dayanan logları silecektir. Bu eylem geri alınamaz.",
- "export_logs_title": "İhracat logları?",
- "export_logs_progress": "Satış girişleri ...",
- "export_logs_description": "Bu, mevcut filtreye ve arama sorgularına dayanan logları ihraç edecektir.",
- "export_logs_as": "İhracat olarak{type}",
- "export_logs_success": "İhracatlı loglar!",
- "export_logs_failure": "Girişleri ihraç etmek için başarısız oldu. Daha fazla ayrıntı için logcat kontrol edin.",
- "deleted_logs_count": "Deleted{count}loglar"
+ "conversation_type_group_chat": "Grup Sohbeti",
+ "conversation_type_chat": "Sohbet",
+ "notification_status": "Durum",
+ "notification_statistics": "İSTATİSTİKLER",
+ "notification_queue_size": "Kuyruk Boyutu",
+ "notification_total_opened": "Toplam Açılan Snap",
+ "notification_queue_preview": "KUYRUK ÖNİZLEMESİ",
+ "notification_processing_continue": "İşlem otomatik devam edecek...",
+ "notification_no_snaps_queue": "Kuyrukta Snap yok.",
+ "notification_queue_cleared_opened": "Kuyruk temizlendi ({opened} açıldı)",
+ "content_type_photo_video_snap": "Fotoğraf/Video Snap",
+ "conversation_type_group_with_name": "Grup: {name}",
+ "delete_logs_title": "Günlükler silinsin mi?",
+ "delete_logs_progress": "{count} günlük siliniyor...",
+ "delete_logs_description": "Bu, mevcut filtre ve arama sorgusuna göre günlükleri silecektir. Bu işlem geri alınamaz.",
+ "export_logs_title": "Günlükler dışa aktarılsın mı?",
+ "export_logs_progress": "Günlükler dışa aktarılıyor...",
+ "export_logs_description": "Bu, mevcut filtre ve arama sorgusuna göre günlükleri dışa aktaracaktır.",
+ "export_logs_as": "{type} olarak dışa aktar",
+ "export_logs_success": "Günlükler dışa aktarıldı!",
+ "export_logs_failure": "Günlükler dışa aktarılamadı. Daha fazla bilgi için logcat’i kontrol edin.",
+ "deleted_logs_count": "{count} günlük silindi"
},
- "script_imported": "Senaryo{name}ithal!",
- "script_import_failed": "Senaryoyu ithal etmek için başarısız oldu.{error}. Daha fazla ayrıntı için kontrol logları",
- "script_updating": "Updating script{name}...",
- "script_updated": "Güncelleme{name}sürüm için{version}",
- "script_update_failed": "Modül güncellemek için başarısız oldu. Daha fazla ayrıntı için kontrol logları",
- "script_edit_failed": "Modül dosyasını açmaya başarısız oldu. Daha fazla ayrıntı için kontrol logları",
+ "script_imported": "Betik {name} içe aktarıldı!",
+ "script_import_failed": "Betik içe aktarılamadı. {error}. Daha fazla bilgi için logları kontrol edin",
+ "script_updating": "Betik {name} güncelleniyor...",
+ "script_updated": "{name} {version} sürümüne güncellendi",
+ "script_update_failed": "Modül güncellenemedi. Daha fazla bilgi için logları kontrol edin",
+ "script_edit_failed": "Modül dosyası açılamadı. Daha fazla bilgi için logları kontrol edin",
"script_data_cleared": "Modül verileri temizlendi!",
- "script_data_clear_failed": "Net modül verileri başarısız oldu. Daha fazla ayrıntı için kontrol logları",
- "script_deleted": "Deleted script{name}!",
- "script_delete_failed": "Modülü silmek için başarısız oldu. Daha fazla ayrıntı için kontrol logları",
+ "script_data_clear_failed": "Modül verileri temizlenemedi. Daha fazla bilgi için logları kontrol edin",
+ "script_deleted": "Betik {name} silindi!",
+ "script_delete_failed": "Modül silinemedi. Daha fazla bilgi için logları kontrol edin",
"script_actions": "Eylemler",
- "script_no_description": "Hiçbir açıklama",
- "script_update_available": "Güncelleme kullanılabilir:{version}",
- "script_loaded": "Loaded script{name}",
- "script_unloaded": "Unloaded script{name}",
- "script_enable_disable_failed": "Başarısız olmak için{action}senaryo. Daha fazla ayrıntı için kontrol logları",
- "script_no_settings": "Bu modül herhangi bir ayara sahip değildir",
- "script_no_scripts_found": "Hiçbir senaryo bulunamadı",
- "script_ok_timeout": "TAMAM TAMAM{timeout}",
- "scripting_tagline": "Senaryoları yönetin, ithalat ve klasörler",
- "installed_scripts_tab": "Yükleme",
- "catalog_tab": "Kataloğu",
- "no_scripts_folder_selected_title": "Başlamak için senaryolarınızı klasörünü seçin",
- "select_folder_button": "Folder",
- "select_scripts_folder_toast": "Lütfen önce bir senaryo seçin",
- "delete_rule_title": "Delete Rule",
- "delete_rule_description": "Bu kuralı silmek istediğinizden emin misiniz?",
+ "script_no_description": "Açıklama yok",
+ "script_update_available": "Güncelleme mevcut: {version}",
+ "script_loaded": "Betik {name} yüklendi",
+ "script_unloaded": "Betik {name} kaldırıldı",
+ "script_enable_disable_failed": "Betik {action} işlemi başarısız. Daha fazla bilgi için logları kontrol edin",
+ "script_no_settings": "Bu modülün ayarı yok",
+ "script_no_scripts_found": "Betik bulunamadı",
+ "script_ok_timeout": "Tamam {timeout}",
+ "scripting_tagline": "Betikleri, içe aktarmayı ve klasörleri yönetin",
+ "installed_scripts_tab": "Yüklü",
+ "catalog_tab": "Katalog",
+ "no_scripts_folder_selected_title": "Başlamak için betik klasörünü seçin",
+ "select_folder_button": "Klasör Seç",
+ "select_scripts_folder_toast": "Lütfen önce bir betik klasörü seçin",
+ "delete_rule_title": "Kuralı Sil",
+ "delete_rule_description": "Bu kuralı silmek istediğinize emin misiniz?",
"rule_name": "Kural Adı",
"friend_tracker_notifications": {
- "notification_channel_name": "Friend Tracker",
- "notification_title": "Friend Activity",
- "conversation_enter": "{friend}gire girdi{conversation}",
- "conversation_exit": "{friend}sol sol sol sol soldan ayrıldı{conversation}",
- "started_typing": "{friend}yazmaya başladı{conversation}",
- "stopped_typing": "{friend}yazmayı durdurma{conversation}",
- "started_speaking": "{friend}konuşmaya başladı{conversation}",
- "stopped_speaking": "{friend}konuşmayı bıraktı{conversation}",
- "started_peeking": "{friend}bakmaya başladı{conversation}",
- "stopped_peeking": "{friend}durmak{conversation}",
- "message_read": "{friend}bir mesaj oku{conversation}",
- "message_deleted": "{friend}bir mesaj silindi{conversation}",
- "message_saved": "{friend}bir mesaj kurtardı{conversation}",
- "message_unsaved": "{friend}a message in unsav{conversation}",
- "message_edited": "{friend}bir mesaj düzenlenmiş{conversation}",
- "message_reaction_add": "{friend}bir reaksiyon ekledi{conversation}",
- "message_reaction_remove": "{friend}bir reaksiyon kaldırıldı{conversation}",
- "snap_opened": "{friend}bir snap in açıldı{conversation}",
- "snap_replayed": "{friend}yeniden bir çırpın{conversation}",
- "snap_replayed_twice": "{friend}bir iki kez tekrar tekrar oyna{conversation}",
- "snap_screenshot": "{friend}bir ekran görüntüsü aldı{conversation}",
- "snap_screen_record": "{friend}ekran kaydedilen ekranda kaydedilen{conversation}",
- "i_can_see_you": "{friend}aktivitede aktivite{conversation}:{details}"
+ "notification_channel_name": "Arkadaş Takip",
+ "notification_title": "Arkadaş Etkinliği",
+ "conversation_enter": "{friend} {conversation} sohbetine girdi",
+ "conversation_exit": "{friend} {conversation} sohbetinden çıktı",
+ "started_typing": "{friend} {conversation} içinde yazmaya başladı",
+ "stopped_typing": "{friend} {conversation} içinde yazmayı durdurdu",
+ "started_speaking": "{friend} {conversation} içinde konuşmaya başladı",
+ "stopped_speaking": "{friend} {conversation} içinde konuşmayı durdurdu",
+ "started_peeking": "{friend} {conversation} içinde göz atmaya başladı",
+ "stopped_peeking": "{friend} {conversation} içinde göz atmayı durdurdu",
+ "message_read": "{friend} {conversation} içinde bir mesajı okudu",
+ "message_deleted": "{friend} {conversation} içinde bir mesajı sildi",
+ "message_saved": "{friend} {conversation} içinde bir mesajı kaydetti",
+ "message_unsaved": "{friend} {conversation} içinde bir mesajın kaydını kaldırdı",
+ "message_edited": "{friend} {conversation} içinde bir mesajı düzenledi",
+ "message_reaction_add": "{friend} {conversation} içinde bir tepki ekledi",
+ "message_reaction_remove": "{friend} {conversation} içinde bir tepki kaldırdı",
+ "snap_opened": "{friend} {conversation} içinde bir Snap açtı",
+ "snap_replayed": "{friend} {conversation} içinde bir Snap'i tekrar oynattı",
+ "snap_replayed_twice": "{friend} {conversation} içinde bir Snap'i iki kez tekrar oynattı",
+ "snap_screenshot": "{friend} {conversation} içinde ekran görüntüsü aldı",
+ "snap_screen_record": "{friend} {conversation} içinde ekran kaydı aldı",
+ "i_can_see_you": "{friend} etkinliği {conversation} içinde: {details}"
},
"friend_mutation_observer": {
- "notification_channel_name": "Friend Mutation Observer",
- "friend_removed": "{username}seni bir arkadaş olarak kaldırdı",
- "birthday_removed": "{username}doğum gününü kaldırdı ({birthday})",
- "birthday_added": "{username}doğum gününü ekledi ({birthday})",
- "birthday_changed": "{username}doğum günlerini doğum gününü değiştirdi{oldBirthday}toklanmak için{newBirthday}",
- "bitmoji_selfie_changed": "{username}bitmoji Selfielerini değiştirdi",
- "bitmoji_avatar_changed": "{username}bitmoji avatarlarını değiştirdi",
- "bitmoji_background_changed": "{username}bitmoji arka planlarını değiştirdi",
- "bitmoji_scene_changed": "{username}bitmoji sahnelerini değiştirdi"
+ "notification_channel_name": "Arkadaş Değişim İzleyici",
+ "friend_removed": "{username} sizi arkadaş olarak kaldırdı",
+ "birthday_removed": "{username} doğum gününü kaldırdı ({birthday})",
+ "birthday_added": "{username} doğum gününü ekledi ({birthday})",
+ "birthday_changed": "{username} doğum gününü {oldBirthday} tarihinden {newBirthday} tarihine değiştirdi",
+ "bitmoji_selfie_changed": "{username} Bitmoji selfie'sini değiştirdi",
+ "bitmoji_avatar_changed": "{username} Bitmoji avatarını değiştirdi",
+ "bitmoji_background_changed": "{username} Bitmoji arka planını değiştirdi",
+ "bitmoji_scene_changed": "{username} Bitmoji sahnesini değiştirdi"
},
"material3_strings": {
- "date_range_picker_start_headline": "From",
- "date_range_picker_end_headline": "To",
- "date_range_picker_title": "Select date range",
+ "date_range_picker_start_headline": "Başlangıç",
+ "date_range_picker_end_headline": "Bitiş",
+ "date_range_picker_title": "Tarih aralığı seç",
"date_picker_switch_to_calendar_mode": "Takvim",
- "date_picker_switch_to_input_mode": "Giriş giriş",
+ "date_picker_switch_to_input_mode": "Giriş",
"date_range_picker_scroll_to_previous_month": "Önceki ay",
"date_range_picker_scroll_to_next_month": "Sonraki ay",
"date_picker_today_description": "Bugün",
- "date_range_picker_day_in_range": "Seçilmiş seçilmiş",
- "date_input_invalid_for_pattern": "Invalid date",
- "date_input_invalid_year_range": "Invalid year",
- "date_input_invalid_not_allowed": "Invalid date",
- "date_range_input_invalid_range_input": "Invalid date range"
+ "date_range_picker_day_in_range": "Seçildi",
+ "date_input_invalid_for_pattern": "Geçersiz tarih",
+ "date_input_invalid_year_range": "Geçersiz yıl",
+ "date_input_invalid_not_allowed": "Geçersiz tarih",
+ "date_range_input_invalid_range_input": "Geçersiz tarih aralığı"
},
"send_override_dialog": {
- "title": "Medyayı gönder",
- "duration": "Süre:{duration}",
- "saveable_snap_hint": "Snap saveable in the chat",
+ "title": "Medya gönderme biçimi",
+ "duration": "Süre: {duration}",
+ "saveable_snap_hint": "Snap'i sohbette kaydedilebilir yap",
"unlimited_duration": "Sınırsız",
- "schedule": "Schedule",
- "select_time": "Zaman seçin",
- "select": "Select",
+ "schedule": "Planla",
+ "select_time": "Saat seç",
+ "select": "Seç",
"select_date_first": "Lütfen bir tarih seçin",
- "invalid_time": "Lütfen gelecekte bir zaman seçin"
+ "invalid_time": "Lütfen gelecekte bir saat seçin"
},
"auto_reply_messages": {
"dialog": {
- "add_message": "Add Message",
- "edit_message": "Mesaj",
+ "add_message": "Mesaj Ekle",
+ "edit_message": "Mesajı Düzenle",
"message_label": "Mesaj",
- "no_messages": "Henüz mesajlar yok. İlk mesajınızı ekleyin!",
- "message_placeholder": "Auto-reply mesajınızı girin..."
+ "no_messages": "Henüz mesaj yok. İlk mesajınızı ekleyin!",
+ "message_placeholder": "Otomatik yanıt mesajınızı girin..."
}
},
"auto_delete_sent_messages": {
- "countdown_toast": "Mesaj silinecektir{time}",
- "delete_success_toast": "Mesaj silindi başarıyla",
- "delete_failed_toast": "Mesajı silmek için başarısız oldu"
+ "countdown_toast": "Mesaj {time} içinde silinecek",
+ "delete_success_toast": "Mesaj başarıyla silindi",
+ "delete_failed_toast": "Mesaj silinemedi"
},
"translation_position": {
- "above": "Above",
- "below": "Aşağıda",
- "inline": "Inline"
+ "above": "Üstte",
+ "below": "Altta",
+ "inline": "Satır içinde"
},
"language_codes": {
- "en": "İngilizce İngilizce İngilizce English",
+ "en": "İngilizce",
"es": "İspanyolca",
- "fr": "Fransız",
- "de": "Alman",
- "it": "İtalyan İtalyanca",
- "pt": "Portekiz",
- "ru": "Rus",
- "ja": "Japon Japonca",
- "ko": "Koreli",
- "zh": "Çin",
+ "fr": "Fransızca",
+ "de": "Almanca",
+ "it": "İtalyanca",
+ "pt": "Portekizce",
+ "ru": "Rusça",
+ "ja": "Japonca",
+ "ko": "Korece",
+ "zh": "Çince",
"ar": "Arapça",
- "hi": "Hindi",
- "tr": "Türk Türkçesi",
- "nl": "Hollandalı Hollanda",
- "pl": "Polonya",
- "sv": "İsveç",
- "da": "Danimarka",
- "no": "Norveç",
- "fi": "Finlandiya",
- "cs": "Çek",
- "hu": "Macar",
- "ro": "Romanya",
- "bg": "Bulgar",
- "hr": "Hırvatistan",
- "sk": "Slovakya",
- "sl": "Slovenyan",
- "et": "Estonya",
- "lv": "Letonya",
- "lt": "Litvanyalı",
- "mt": "Malta",
- "ga": "İrlandalı",
- "cy": "Welsh"
+ "hi": "Hintçe",
+ "tr": "Türkçe",
+ "nl": "Hollandaca",
+ "pl": "Lehçe",
+ "sv": "İsveççe",
+ "da": "Danca",
+ "no": "Norveççe",
+ "fi": "Fince",
+ "cs": "Çekçe",
+ "hu": "Macarca",
+ "ro": "Rumence",
+ "bg": "Bulgarca",
+ "hr": "Hırvatça",
+ "sk": "Slovakça",
+ "sl": "Slovence",
+ "et": "Estonca",
+ "lv": "Letonca",
+ "lt": "Litvanca",
+ "mt": "Maltaca",
+ "ga": "İrlandaca",
+ "cy": "Galce"
},
"tracker": {
"tabs": {
- "logs": "Logs",
- "rules": "Kurallar Kuralları"
+ "logs": "Günlükler",
+ "rules": "Kurallar"
},
"actions": {
- "export": "İhracat İhracatı",
- "delete": "Delete",
- "add_rule": "Ekle Kural Ekle",
- "save_rule": "Tasarruf Kuralı"
+ "export": "Dışarı Aktar",
+ "delete": "Sil",
+ "add_rule": "Kural Ekle",
+ "save_rule": "Kuralı Kaydet"
},
"messages": {
- "no_logs_found": "Hiçbir log bulunamadı",
- "no_rules_found": "Hiçbir kural bulunamadı",
- "no_events": "Hiçbir olay yok"
+ "no_logs_found": "Günlük bulunamadı",
+ "no_rules_found": "Kural bulunamadı",
+ "no_events": "Olay yok"
},
"search": {
- "placeholder": "Arama"
+ "placeholder": "Ara"
},
"filters": {
- "newest_first": "En yeni",
- "pick_a_date": "Bir tarih seçin",
+ "newest_first": "En yeni önce",
+ "pick_a_date": "Tarih seç",
"title": "Filtreler",
- "search_by": "Search Tarafından",
- "since": "O zamandan beri",
- "until": "Olana kadar",
+ "search_by": "Şuna göre ara",
+ "since": "Başlangıç",
+ "until": "Bitiş",
"types": {
- "username": "Username",
- "conversation": "Konuşma",
- "event": "Event"
+ "username": "Kullanıcı Adı",
+ "conversation": "Konşma",
+ "event": "Olay"
},
"event_types": {
- "conversation_enter": "Entered conversation",
- "conversation_exit": "Sol konuşma",
+ "conversation_enter": "Sohbete girdi",
+ "conversation_exit": "Sohbetten çıktı",
"started_typing": "Yazmaya başladı",
- "stopped_typing": "Tartışmayı Durdurdu",
+ "stopped_typing": "Yazmayı durdurdu",
"started_speaking": "Konuşmaya başladı",
- "stopped_speaking": "Konuşmayı Durdurdu",
- "started_peeking": "Önce peeking",
- "stopped_peeking": "Durmuş peeking",
- "message_read": "Mesaj oku",
- "message_deleted": "Deleted message",
- "message_saved": "Kurtarılan mesaj",
- "message_unsaved": "Unsaved message",
- "message_edited": "İlgili mesaj",
- "message_reaction_add": "Eklenen reaksiyon",
- "message_reaction_remove": "Kaldırılmış tepki",
- "snap_opened": "Açıklandı",
- "snap_replayed": "Replayed snap",
- "snap_replayed_twice": "Replayed snap twice two",
- "snap_screenshot": "Took ekran görüntüsü",
- "snap_screen_record": "Ekran kaydedildi"
+ "stopped_speaking": "Konuşmayı durdurdu",
+ "started_peeking": "Göz atmaya başladı",
+ "stopped_peeking": "Göz atmayı durdurdu",
+ "message_read": "Mesaj okundu",
+ "message_deleted": "Mesaj silindi",
+ "message_saved": "Mesaj kaydedildi",
+ "message_unsaved": "Mesaj kaydı kaldırıldı",
+ "message_edited": "Mesaj düzenlendi",
+ "message_reaction_add": "Tepki eklendi",
+ "message_reaction_remove": "Tepki kaldırıldı",
+ "snap_opened": "Snap açıldı",
+ "snap_replayed": "Snap tekrarlandı",
+ "snap_replayed_twice": "Snap iki kez tekrarlandı",
+ "snap_screenshot": "Ekran görüntüsü alındı",
+ "snap_screen_record": "Ekran kaydı alındı"
}
},
"logs": {
"export_dialog": {
- "title": "İhracat Logs",
- "description": "Arkadaş tracker girişlerinizi bir dosyaya açın",
- "progress": "Satış girişleri ...",
- "export_as": "İhracat olarak{type}",
+ "title": "Günlükleri Dışarı Aktar",
+ "description": "Arkadaş takip günlüklerinizi bir dosyaya aktarın",
+ "progress": "Günlükler dışa aktarılıyor...",
+ "export_as": "{type} olarak dışa aktar",
"format_json": "JSON",
"format_csv": "CSV"
},
"delete_dialog": {
- "title": "Delete Logs",
- "message": "Tüm logları silmek istediğinizden emin misiniz? Bu eylem geri alınamaz.",
- "confirm": "Delete All",
- "cancel": "Cancel",
- "progress": "Deleting{count}loglar..."
+ "title": "Günlükleri Sil",
+ "message": "Tüm günlükleri silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
+ "confirm": "Tümünü Sil",
+ "cancel": "İptal",
+ "progress": "{count} günlük siliniyor..."
},
"log_entry": {
- "in_conversation": "in{conversation}",
+ "in_conversation": "{conversation} içinde",
"unknown_user": "Bilinmeyen",
- "unknown_conversation": "DMs",
+ "unknown_conversation": "DM'ler",
"i_can_see_you_entered": "Girdi",
- "i_can_see_you_left": "Sol sol sol sol",
- "i_can_see_you_duration": "Süre süresi",
- "i_can_see_you_not_available": "N/A",
- "i_can_see_you_unit_hour": "h",
- "i_can_see_you_unit_minute": "m",
- "i_can_see_you_unit_second": "s",
- "event_text": "{friend}{event}in{conversation}",
+ "i_can_see_you_left": "Çıktı",
+ "i_can_see_you_duration": "Süre",
+ "i_can_see_you_not_available": "Yok",
+ "i_can_see_you_unit_hour": "s",
+ "i_can_see_you_unit_minute": "dk",
+ "i_can_see_you_unit_second": "sn",
+ "event_text": "{friend} {event} {conversation} içinde",
"events": {
- "conversation_enter": "gire girdi",
- "conversation_exit": "sol sol sol sol soldan ayrıldı",
+ "conversation_enter": "girdi",
+ "conversation_exit": "çıktı",
"started_typing": "yazmaya başladı",
- "stopped_typing": "tartışmayı durdurmayı bıraktı",
- "started_speaking": "konuşmaya başladı konuşmaya başladı",
- "stopped_speaking": "konuşmayı bıraktı",
- "started_peeking": "peeking başladı",
- "stopped_peeking": "durmayı bıraktı",
- "message_read": "bir mesaj oku",
- "message_deleted": "bir mesaj silindi",
- "message_saved": "bir mesaj kurtardı",
- "message_unsaved": "a message",
- "message_edited": "bir mesaj yazdı",
- "message_reaction_add": "bir reaksiyon ekledi",
- "message_reaction_remove": "bir reaksiyon kaldırıldı",
- "snap_opened": "bir snap açıldı",
- "snap_replayed": "bir snap yeniden oyna",
- "snap_replayed_twice": "bir iki kez yeniden oyna",
+ "stopped_typing": "yazmayı durdurdu",
+ "started_speaking": "konuşmaya başladı",
+ "stopped_speaking": "konuşmayı durdurdu",
+ "started_peeking": "göz atmaya başladı",
+ "stopped_peeking": "göz atmayı durdurdu",
+ "message_read": "bir mesajı okudu",
+ "message_deleted": "bir mesajı sildi",
+ "message_saved": "bir mesajı kaydetti",
+ "message_unsaved": "mesaj kaydını kaldırdı",
+ "message_edited": "bir mesajı düzenledi",
+ "message_reaction_add": "bir tepki ekledi",
+ "message_reaction_remove": "bir tepki kaldırdı",
+ "snap_opened": "bir Snap açtı",
+ "snap_replayed": "bir Snap'i tekrar oynattı",
+ "snap_replayed_twice": "bir Snap'i iki kez tekrar oynattı",
"snap_screenshot": "bir ekran görüntüsü aldı",
- "snap_screen_record": "ekran kaydedildi",
- "i_can_see_you": "aktif olarak aktif oldu"
+ "snap_screen_record": "ekran kaydı aldı",
+ "i_can_see_you": "aktifti"
}
}
},
"edit_rule": {
"custom_rule": "Özel Kural",
"scope": "Kapsam",
- "events": "Etkinlikler",
- "add_event": "Etkinlik ekle",
- "type": "Tipi",
+ "events": "Olaylar",
+ "add_event": "Olay Ekle",
+ "type": "Tür",
"triggers": "Tetikleyiciler",
"conditions": "Koşullar",
- "only_inside_conversation": "Sadece konuşmamda",
+ "only_inside_conversation": "Sadece konuşma içindeyken",
"only_outside_conversation": "Sadece konuşma dışındayken",
- "only_when_app_active": "Sadece Snapchat aktif olduğunda",
- "only_when_app_inactive": "Sadece Snapchat inaktif olduğunda",
- "no_notification_when_app_active": "Snapchat aktif olduğunda hiçbir bildirim",
+ "only_when_app_active": "Sadece Snapchat aktifken",
+ "only_when_app_inactive": "Sadece Snapchat pasifken",
+ "no_notification_when_app_active": "Snapchat aktifken bildirim yok",
"scope_options": {
- "all_friends_groups": "Bütün Arkadaşlar / Gruplar",
+ "all_friends_groups": "Tüm Arkadaşlar/Gruplar",
"no_one_except": "Kimse hariç",
- "everyone_except": "Herkes dışında herkes hariç"
+ "everyone_except": "Herkes hariç"
}
}
},
"debug": {
- "title": "Debug",
- "clear": "Clear",
+ "title": "Hata Ayıklama",
+ "clear": "Temizle",
"files": {
- "config_json": "Build File",
- "mappings_json": "Mappings File",
- "message_logger_db": "Mesaj Logger Database",
- "pinned_best_friend_txt": "Pinned Best Friend File",
- "native_sig_cache_txt": "Yerli İmza File"
+ "config_json": "Yapılandırma Dosyası",
+ "mappings_json": "Eşleme Dosyası",
+ "message_logger_db": "Mesaj Kaydedici Veritabanı",
+ "pinned_best_friend_txt": "Sabitlenmiş En İyi Arkadaş Dosyası",
+ "native_sig_cache_txt": "Yerel İmza Önbellek Dosyası"
},
"settings": {
- "test_mode": "Test Mode (FOR DEBUGGING VAR)",
- "disable_feature_loading": "Engelli Özel Yükler",
- "disable_auto_mapper": "Disable Auto Mapper",
- "disable_bypass_status_indicator": "Disable Bypass Status Gösterge"
+ "test_mode": "Test Modu (SADECE HATA AYIKLAMA İÇİN)",
+ "disable_feature_loading": "Özellik Yüklemeyi Devre Dışı Bırak",
+ "disable_auto_mapper": "Otomatik Eşleyiciyi Devre Dışı Bırak",
+ "disable_bypass_status_indicator": "Bypass Durum Göstergesini Devre Dışı Bırak"
}
},
- "ui_settings_title": "UI Ayarları",
- "haptic_feedback_label": "Haptic Feedback",
- "updates_title": "Updates",
- "auto_update_check": "Auto Update Check",
- "update_check_frequency_daily": "Daily",
- "update_check_frequency_weekly": "Weekly",
+ "ui_settings_title": "Arayüz Ayarları",
+ "haptic_feedback_label": "Dokunsal Geri Bildirim",
+ "updates_title": "Güncellemeler",
+ "auto_update_check": "Otomatik Güncelleme Kontrolü",
+ "update_check_frequency_daily": "Günlük",
+ "update_check_frequency_weekly": "Haftalık",
"update_check_frequency_monthly": "Aylık",
- "update_channel_stable": "Stable",
- "update_channel_prerelease": "Pre-release",
+ "update_channel_stable": "Kararlı",
+ "update_channel_prerelease": "Ön sürüm",
"friend_notes_title": "Arkadaş Notları",
- "friend_notes_description": "Arkadaşınızın notlarını yönetin ve yedekleme",
- "app_theme_title": "App Theme",
- "theme_mode_system": "Sistem Sistemi",
- "theme_mode_light": "Işık Işığı",
- "theme_mode_dark": "Dark",
- "test_mode_label": "Enable PurrAura",
- "disable_feature_loading_label": "Engelli Özel Yükler",
- "disable_auto_mapper_label": "Disable Auto Mapper",
- "disable_bypass_indicator_label": "Disable Bypass Göstergesi",
+ "friend_notes_description": "Arkadaş notlarını yönetin ve yedekleyin",
+ "app_theme_title": "Uygulama Teması",
+ "theme_mode_system": "Sistem",
+ "theme_mode_light": "Açık",
+ "theme_mode_dark": "Koyu",
+ "test_mode_label": "PurrAura'yı Etkinleştir",
+ "disable_feature_loading_label": "Özellik Yüklemeyi Devre Dışı Bırak",
+ "disable_auto_mapper_label": "Otomatik Eşleyiciyi Devre Dışı Bırak",
+ "disable_bypass_indicator_label": "Bypass Göstergesini Devre Dışı Bırak",
"friend_list": {
- "manage_title": "Arkadaş Listesi Yönetin",
- "export_description": "İhracat dostları, bir metin dosyasında arkadaşlarınızın kimliklerinin listesini kurtarmanıza izin verir. Bir dosyadan ithal etmek, onları ekleyebileceğiniz bir listedeki arkadaşlarını gösterecektir.",
- "export_friends": "Export friends",
- "import_from_file": "File from file",
- "add": "Add"
+ "manage_title": "Arkadaş Listesini Yönet",
+ "export_description": "Arkadaşları dışa aktarmak, arkadaşlarınızın kimliklerinin listesini bir metin dosyasına kaydetmenizi sağlar. Dosyadan içe aktarma, arkadaşları ekleyebileceğiniz bir listede gösterir.",
+ "export_friends": "Arkadaşları dışa aktar",
+ "import_from_file": "Dosyadan içe aktar",
+ "add": "Ekle"
},
"memories": {
- "export_title": "İhracat anıları",
- "total_memories": "Toplam anılar:{count}",
- "date_range": "Date Range",
- "select": "Select",
- "sort_by_folder": "Sort Tarafından Sort",
- "include_my_eyes_only": "My Eyes Only",
- "cancel": "Cancel",
- "export": "İhracat İhracatı",
- "quit": "Oldukça haklı",
- "done": "Done",
- "ok": "TAMAM TAMAM",
- "exporting_memories": "Anıları ihraç etmek... ({failed}başarısız oldu)"
+ "export_title": "Anıları dışa aktar",
+ "total_memories": "Toplam anı: {count}",
+ "date_range": "Tarih Aralığı",
+ "select": "Seç",
+ "sort_by_folder": "Klasöre göre sırala",
+ "include_my_eyes_only": "My Eyes Only dahil",
+ "cancel": "İptal",
+ "export": "Dışarı Aktar",
+ "quit": "Çık",
+ "done": "Bitti",
+ "ok": "Tamam",
+ "exporting_memories": "Anılar dışa aktarılıyor... ({failed} başarısız)"
},
"scripting_ui": {
- "no_scripts_folder_selected": "Hiçbir scripts klasörü seçilen",
- "select_folder": "Klasörü seçin",
- "import_from_url": "URL'den ithal",
- "open_scripts_folder": "Open scripts Folder",
- "import_script_from_url": "URL",
- "warning_imported_scripts": "Uyarı: İthalatlanmış senaryolar cihazınıza zararlı olabilir. Sadece güvenilir kaynaklardan gelen ithalat senaryoları.",
+ "no_scripts_folder_selected": "Betik klasörü seçilmedi",
+ "select_folder": "Klasör seç",
+ "import_from_url": "URL'den içe aktar",
+ "open_scripts_folder": "Betik Klasörünü Aç",
+ "import_script_from_url": "URL'den Betik İçe Aktar",
+ "warning_imported_scripts": "Uyarı: İçe aktarılan betikler cihazınıza zarar verebilir. Yalnızca güvenilir kaynaklardan betik içe aktarın.",
"enter_url_here": "URL'yi buraya girin:",
- "import": "İthalat",
- "cancel": "Cancel",
+ "import": "İçe Aktar",
+ "cancel": "İptal",
"documentation": "Dokümantasyon"
},
"common": {
- "cancel": "Cancel",
- "add": "Add",
- "ok": "TAMAM TAMAM",
- "quit": "Oldukça haklı",
- "done": "Done",
- "back": "Geri dön",
+ "cancel": "İptal",
+ "add": "Ekle",
+ "ok": "Tamam",
+ "quit": "Çık",
+ "done": "Bitti",
+ "back": "Geri",
"unknown": "Bilinmeyen",
- "added": "Eklenen",
- "no_friends_found": "Hiçbir arkadaş bulunamadı",
- "exporting_memories": "Anıları ihraç etmek... ({failed}başarısız oldu)"
+ "added": "Eklendi",
+ "no_friends_found": "Arkadaş bulunamadı",
+ "exporting_memories": "Anılar dışa aktarılıyor... ({failed} başarısız)"
},
- "clear_friend_feed": "Clear Friend Feed",
- "select_date": "Select Date",
- "schedule_scheduled_for": "Zamanlama için{name}in{time}",
- "schedule_sending_in": "Yemin ederim{time}",
- "schedule_sent_to": "Sen{name}",
- "schedule_sent": "Scheduled snap sent",
- "schedule_failed_to": "Göndermek için başarısız oldu{name}",
- "schedule_failed": "Scheduled snap başarısız oldu",
- "schedule_cancelled_for": "İptal için{name}",
- "by_author": "yemin ederim{author}",
- "version": "Version{version}",
- "delete_button": "Delete",
+ "clear_friend_feed": "Arkadaş Akışını Temizle",
+ "select_date": "Tarih Seç",
+ "schedule_scheduled_for": "{name} için {time} içinde planlandı",
+ "schedule_sending_in": "{time} içinde gönderiliyor",
+ "schedule_sent_to": "{name} kişisine gönderildi",
+ "schedule_sent": "Planlanan snap gönderildi",
+ "schedule_failed_to": "{name} kişisine gönderilemedi",
+ "schedule_failed": "Planlanan snap başarısız oldu",
+ "schedule_cancelled_for": "{name} için iptal edildi",
+ "by_author": "{author} tarafından",
+ "version": "Sürüm {version}",
+ "delete_button": "Sil",
"logger_history": {
- "download_started": "Download başladı!",
- "downloaded_to": "İndirmek için{path}",
- "failed_to_download": "Indirmek için başarısız oldu{message}",
- "select_conversation": "Bir konuşma seçin",
- "select_conversation_placeholder": "Bir konuşma seçin",
- "edited_at": "düzenlendikten sonra{date}",
- "download_attachment_failed_toast": "Bağ indirmek için başarısız oldu",
- "message_parse_failed": "Mesaj parse başarısız oldu",
+ "download_started": "İndirme başladı!",
+ "downloaded_to": "{path} konumuna indirildi",
+ "failed_to_download": "{message} indirilemedi",
+ "select_conversation": "Bir sohbet seçin",
+ "select_conversation_placeholder": "Bir sohbet seçin",
+ "edited_at": "{date} tarihinde düzenlendi",
+ "download_attachment_failed_toast": "Ek indirilemedi",
+ "message_parse_failed": "Mesaj ayrıştırılamadı",
"empty_message": "Boş mesaj",
- "no_more_messages": "Daha fazla mesaj yok",
- "reverse_order_checkbox": "Ters sipariş",
- "view_logger_history_button": "View Logger History",
- "posted_at": "Yayınlanan{date}",
- "created_at": "Oluşturulduğunda{date}",
- "failed_to_open_file": "Dosyayı açmaya başarısız oldu. Daha fazla bilgi için girişleri kontrol edin",
- "failed_to_get_file": "Dosyayı almak için başarısız oldu",
- "download_button": "Download",
- "chat_attachment": "Ata{index}",
- "log_header_format": "{username}??{type}??{date}",
- "edited_at_text": "Edited to \"{message}\" at \"{date}",
- "list_group_format": "Grup Grup Grup Grubu{name}",
- "list_friend_format": "Arkadaş{name}",
- "download_started_toast": "Download kullanmaya başladı",
- "download_success_toast": "İndirmek için{path}",
- "download_failed_toast": "İndirme başarısız:{message}",
- "close_button_description": "Yakın arama",
- "search_button_description": "Arama mesajları"
+ "no_more_messages": "Başka mesaj yok",
+ "reverse_order_checkbox": "Ters sıra",
+ "view_logger_history_button": "Kaydetme Geçmişini Görüntüle",
+ "posted_at": "{date} tarihinde yayınlandı",
+ "created_at": "{date} tarihinde oluşturuldu",
+ "failed_to_open_file": "Dosya açılamadı. Daha fazla bilgi için logları kontrol edin",
+ "failed_to_get_file": "Dosya alınamadı",
+ "download_button": "İndir",
+ "chat_attachment": "Ek {index}",
+ "log_header_format": "{username} • {type} • {date}",
+ "edited_at_text": "\"{message}\" {date} tarihinde düzenlendi",
+ "list_group_format": "Grup {name}",
+ "list_friend_format": "Arkadaş {name}",
+ "download_started_toast": "İndirme başladı",
+ "download_success_toast": "{path} konumuna indirildi",
+ "download_failed_toast": "İndirme başarısız: {message}",
+ "close_button_description": "Aramayı kapat",
+ "search_button_description": "Mesajlarda ara"
},
"debug_dialogs": {
- "info": "Info",
+ "info": "Bilgi",
"refs": "Referanslar",
"arroyo": "Arroyo",
"message": "Mesaj",
- "media_references": "Media Referansları",
+ "media_references": "Medya Referansları",
"arroyo_proto": "Arroyo proto",
- "message_proto": "Mesaj protototo"
+ "message_proto": "Mesaj proto"
},
"error_messages": {
- "failed_to_fetch_message": "Mesaj getiremedi:{error}",
- "failed_to_edit_message": "Mesaj düzenlemek için başarısız oldu:{error}"
+ "failed_to_fetch_message": "Mesaj alınamadı: {error}",
+ "failed_to_edit_message": "Mesaj düzenlenemedi: {error}"
},
"ai_response_style": {
- "casual": "Günlük",
- "formal": "Formal",
- "friendly": "Dostu",
- "humorous": "Humorous",
- "empathetic": "Empati",
- "busy": "Busy",
+ "casual": "Rahat",
+ "formal": "Resmi",
+ "friendly": "Samimi",
+ "humorous": "Esprili",
+ "empathetic": "Empatik",
+ "busy": "Meşgul",
"toxic": "Toksik"
},
"ai_response_language": {
- "auto": "Auto (Same as received)",
- "en": "İngilizce İngilizce İngilizce English",
+ "auto": "Otomatik (Alınanla aynı)",
+ "en": "İngilizce",
"es": "İspanyolca",
- "fr": "Fransız",
- "de": "Alman",
- "it": "İtalyan İtalyanca",
- "pt": "Portekiz",
- "ru": "Rus",
- "ja": "Japon Japonca",
- "ko": "Koreli",
- "zh": "Çin",
- "ar": "Arapça (UAE) ve (KSA)",
- "hi": "Hindi",
- "tr": "Türk Türkçesi",
- "pl": "Polonya",
- "nl": "Hollandalı Hollanda",
- "sv": "İsveç",
- "da": "Danimarka",
- "no": "Norveç",
- "fi": "Finlandiya"
+ "fr": "Fransızca",
+ "de": "Almanca",
+ "it": "İtalyanca",
+ "pt": "Portekizce",
+ "ru": "Rusça",
+ "ja": "Japonca",
+ "ko": "Korece",
+ "zh": "Çince",
+ "ar": "Arapça (BAE) ve (KSA)",
+ "hi": "Hintçe",
+ "tr": "Türkçe",
+ "pl": "Lehçe",
+ "nl": "Hollandaca",
+ "sv": "İsveççe",
+ "da": "Danca",
+ "no": "Norveççe",
+ "fi": "Fince"
},
"ai_provider": {
"gemini": "Gemini",
@@ -3218,4 +3219,4 @@
"openai": "OpenAI",
"openrouter": "OpenRouter"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/assets/lang/uk_UA.json b/common/src/main/assets/lang/uk_UA.json
index 2b8d67bd..6784d4ba 100644
--- a/common/src/main/assets/lang/uk_UA.json
+++ b/common/src/main/assets/lang/uk_UA.json
@@ -702,7 +702,7 @@
"append_type": "Додавання медіа типу до імені файлу"
},
"auto_download_sources": {
- "friend_snaps": "Friend Snaps",
+ "friend_snaps": "Снепи друзів",
"friend_stories": "Історія",
"public_stories": "Громадські історії",
"spotlight": "Мапа"
@@ -2180,7 +2180,7 @@
"description": "Ознайомитися з Android ID, надісланим на Snapchat",
"properties": {
"spoof_android_id": {
- "name": "Spoof Android ID",
+ "name": "Підмінити Android ID",
"description": "На відміну від Android ID, відправленого на Snapchat з індивідуальним значенням"
},
"custom_android_id": {
@@ -2629,7 +2629,7 @@
"tracker_actions": {
"log": "Увійти",
"in_app_notification": "Повідомлення",
- "push_notification": "Push Notification",
+ "push_notification": "Push-сповіщення",
"custom": "Написати"
},
"better_notifications": {
@@ -3218,4 +3218,4 @@
"openai": "Про компанію",
"openrouter": "Проксимус"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/Constants.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/Constants.kt
index 50d7c19c..57b108bf 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/Constants.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/Constants.kt
@@ -2,6 +2,6 @@ package me.eternal.purrfectsnap.common
object Constants {
val SNAPCHAT_PACKAGE_NAME get() = "com.snapchat.android"
- val SE_PACKAGE_NAME get() = BuildConfig.APPLICATION_ID
+ val MODULE_PACKAGE_NAME get() = BuildConfig.APPLICATION_ID
const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.3"
-}
\ No newline at end of file
+}
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/bridge/BridgeFiles.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/bridge/BridgeFiles.kt
index 9a1f8e73..6994d34f 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/bridge/BridgeFiles.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/bridge/BridgeFiles.kt
@@ -18,7 +18,7 @@ enum class FileHandleScope(
INTERNAL("internal"),
LOCALE("locale"),
USER_IMPORT("user_import"),
- COMPOSER("composer");
+ VALDI("valdi");
companion object {
fun fromValue(name: String): FileHandleScope? = entries.find { it.key == name }
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/ModConfig.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/ModConfig.kt
index 3debd893..b61c00be 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/ModConfig.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/ModConfig.kt
@@ -35,16 +35,19 @@ class ModConfig(
fun load() {
wasPresent = fileWrapper.exists()
- root = createRootConfig().apply {
- if (!wasPresent) {
- writeConfigObject(this)
- return@apply
- }
- runCatching {
- loadConfig(this)
- }.onFailure {
- writeConfigObject(this)
- }
+ val targetRoot = if (::root.isInitialized) {
+ root
+ } else {
+ createRootConfig().also { root = it }
+ }
+ if (!wasPresent) {
+ writeConfigObject(targetRoot)
+ return
+ }
+ runCatching {
+ loadConfig(targetRoot)
+ }.onFailure {
+ writeConfigObject(targetRoot)
}
}
@@ -136,4 +139,4 @@ class ModConfig(
root.fromJson(configObject)
writeConfig()
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Experimental.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Experimental.kt
index 69f2d25f..67195973 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Experimental.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Experimental.kt
@@ -24,16 +24,16 @@ class Experimental : ConfigContainer() {
val notificationTranscript = boolean("notification_transcript") { requireRestart() }
}
- class ComposerHooksConfig: ConfigContainer(hasGlobalState = true) {
+ class ValdiHooksConfig: ConfigContainer(hasGlobalState = true) {
val showFirstCreatedUsername = boolean("show_first_created_username")
val bypassCameraRollLimit = boolean("bypass_camera_roll_limit")
val customSelfDestructSnapDelay = boolean("custom_self_destruct_snap_delay")
- val composerConsole = boolean("composer_console")
- val composerLogs = boolean("composer_logs")
+ val valdiConsole = boolean("composer_console")
+ val valdiLogs = boolean("composer_logs")
}
class NativeHooks : ConfigContainer() {
- val composerHooks = container("composer_hooks", ComposerHooksConfig()) { requireRestart() }
+ val valdiHooks = container("composer_hooks", ValdiHooksConfig()) { requireRestart() }
val disableBitmoji = boolean("disable_bitmoji")
val customEmojiFont = string("custom_emoji_font") {
requireRestart()
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Global.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Global.kt
index 3eba6223..2901d711 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Global.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Global.kt
@@ -61,10 +61,12 @@ class Global : ConfigContainer() {
inner class UpdateSettings : ConfigContainer() {
val autoUpdateCheck = boolean("auto_update_check")
val updateCheckFrequency = unique("update_check_frequency", "daily", "weekly", "monthly")
+ val updateChannel = unique("update_channel", "stable", "prerelease")
}
inner class UISettings : ConfigContainer() {
val hapticFeedback = boolean("haptic_feedback", true)
+ val useSystemToasts = boolean("use_system_toasts", false)
}
val updateSettings = container("update_settings", UpdateSettings()) { addFlags(ConfigFlag.HIDDEN) }
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/MessagingTweaks.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/MessagingTweaks.kt
index bdcb5db7..e8f959ec 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/MessagingTweaks.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/MessagingTweaks.kt
@@ -67,7 +67,7 @@ class MessagingTweaks : ConfigContainer() {
inner class AiConfig : ConfigContainer(hasGlobalState = false) {
val enableAiReplies = boolean("enable_ai_replies", false)
- val aiProvider = unique("ai_provider", "gemini", "deepseek", "openai") {
+ val aiProvider = unique("ai_provider", "gemini", "deepseek", "openai", "openrouter") {
customOptionTranslationPath = "ai_provider"
}.apply { set("gemini") }
val aiModel = string("ai_model", defaultValue = "gemini-2.5-flash") {
@@ -159,10 +159,6 @@ class MessagingTweaks : ConfigContainer() {
}
class AutoOpenSnapsConfig : ConfigContainer(hasGlobalState = true) {
- init {
- globalState = false
- }
-
val allowRunningInBackground = boolean("allow_running_in_background", false)
val minDelay = integer("min_delay", defaultValue = 50) {
inputCheck = { it.toIntOrNull()?.coerceAtLeast(0) != null }
@@ -223,6 +219,19 @@ class MessagingTweaks : ConfigContainer() {
"EXTERNAL_MEDIA",
"STICKER"
) { requireRestart(); customOptionTranslationPath = "content_type" }
+
+ class UnsaveableMessagesConfig : ConfigContainer() {
+ val chat = boolean("chat", defaultValue = true)
+ val snap = boolean("snap")
+ val externalMedia = boolean("external_media")
+ val sticker = boolean("sticker")
+ val share = boolean("share")
+ val note = boolean("note")
+ val storyReply = boolean("story_reply")
+ }
+
+ val unsaveableMessages = container("unsaveable_messages", UnsaveableMessagesConfig()) { requireRestart() }
+
val preventMessageSending = multiple("prevent_message_sending", *NotificationType.getOutgoingValues().map { it.key }.toTypedArray()) {
customOptionTranslationPath = "features.options.notifications"
}
@@ -239,7 +248,16 @@ class MessagingTweaks : ConfigContainer() {
customOptionTranslationPath = "features.options.notifications"
}
val messageLogger = container("message_logger", MessageLoggerConfig()) { requireRestart() }
- val galleryMediaSendOverride = unique("gallery_media_send_override", "always_ask", "SNAP", "NOTE", "SAVEABLE_SNAP") { requireRestart() }
+
+ class GalleryMediaSendOverrideConfig : ConfigContainer() {
+ val mode = unique("mode", "always_ask", "SNAP", "NOTE", "SAVEABLE_SNAP") {
+ requireRestart()
+ customOptionTranslationPath = "gallery_media_send_override"
+ }
+ val includeCameraSnaps = boolean("include_camera_snaps", false) { requireRestart() }
+ }
+
+ val galleryMediaSendOverride = container("gallery_media_send_override", GalleryMediaSendOverrideConfig()) { requireRestart() }
val scheduledSendAllowRunningInBackground = boolean("scheduled_send_allow_running_in_background", false)
val stripMediaMetadata = multiple("strip_media_metadata", "hide_caption_text", "hide_snap_filters", "hide_extras", "remove_audio_note_duration", "remove_audio_note_transcript_capability") { requireRestart() }
val bypassMessageRetentionPolicy = boolean("bypass_message_retention_policy") { addNotices(FeatureNotice.UNSTABLE); requireRestart() }
@@ -286,3 +304,4 @@ class MessagingTweaks : ConfigContainer() {
val instantTranslation = container("instant_translation", InstantTranslationConfig()) { requireRestart() }
}
+
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Spoof.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Spoof.kt
index 2204b423..1abf5400 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Spoof.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/config/impl/Spoof.kt
@@ -4,15 +4,19 @@ import me.eternal.purrfectsnap.common.config.ConfigContainer
import me.eternal.purrfectsnap.common.config.ConfigFlag
class Spoof : ConfigContainer(hasGlobalState = true) {
+ inner class SpoofDeviceIdConfig : ConfigContainer() {
+ val spoofAndroidId = boolean("spoof_android_id") { requireRestart() }
+ val customAndroidId = string("custom_android_id") {
+ requireRestart()
+ inputCheck = { it.isEmpty() || (it.length == 16 && it.all { c -> c in '0'..'9' || c in 'a'..'f' || c in 'A'..'F' }) }
+ }
+ }
+
val overridePlayStoreInstallerPackageName = boolean("play_store_installer_package_name") { requireRestart() }
val removeVpnTransportFlag = boolean("remove_vpn_transport_flag") { requireRestart() }
val removeMockLocationFlag = boolean("remove_mock_location_flag") { requireRestart() }
val forceWifiTransportFlag = boolean("force_wifi_transport_flag") { requireRestart() }
- val spoofAndroidId = boolean("spoof_android_id") { requireRestart() }
- val customAndroidId = string("custom_android_id") {
- requireRestart()
- inputCheck = { it.isEmpty() || (it.length == 16 && it.all { c -> c in '0'..'9' || c in 'a'..'f' || c in 'A'..'F' }) }
- }
+ val spoofDeviceId = container("spoof_device_id", SpoofDeviceIdConfig()) { requireRestart() }
val spoofDevice = boolean("spoof_device") { requireRestart() }
val deviceModel = unique("device_model",
"samsung_s25_ultra",
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/data/MessagingCoreObjects.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/data/MessagingCoreObjects.kt
index a41547f9..bb9f40c9 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/data/MessagingCoreObjects.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/data/MessagingCoreObjects.kt
@@ -57,7 +57,7 @@ enum class MessagingRuleType(
HIDE_FRIEND_FEED("hide_friend_feed", false, Icons.Outlined.VisibilityOff, showInFriendMenu = false),
E2E_ENCRYPTION("e2e_encryption", false, Icons.Outlined.Lock),
PIN_CONVERSATION("pin_conversation", false, Icons.Outlined.PushPin, showInFriendMenu = false),
- MESSAGE_LOGGER("message_logger", true, Icons.AutoMirrored.Filled.Message, showInFriendMenu = true),
+ MESSAGE_LOGGER("message_logger", true, Icons.AutoMirrored.Filled.Message, showInFriendMenu = true, defaultValue = "blacklist"),
AUTO_READ("auto_read", true, Icons.Outlined.DoneAll, defaultValue = "whitelist"),
AUTO_REPLY("auto_reply", true, Icons.AutoMirrored.Outlined.Reply, defaultValue = "blacklist"),
AUTO_DELETE_SENT_MESSAGES("auto_delete_sent_messages", true, Icons.Outlined.DeleteSweep, defaultValue = "blacklist");
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/JSModule.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/JSModule.kt
index 51c62580..a2d8ce2f 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/JSModule.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/JSModule.kt
@@ -52,7 +52,8 @@ class JSModule(
putConst("description", this, moduleInfo.description)
putConst("author", this, moduleInfo.author)
putConst("minSnapchatVersion", this, moduleInfo.minSnapchatVersion)
- putConst("minSEVersion", this, moduleInfo.minSEVersion)
+ putConst("minPSVersion", this, moduleInfo.minPSVersion)
+ putConst("minSEVersion", this, moduleInfo.minPSVersion)
putConst("grantedPermissions", this, moduleInfo.grantedPermissions)
})
})
@@ -311,4 +312,4 @@ class JSModule(
}
} ?: "null"
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/ScriptRuntime.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/ScriptRuntime.kt
index 5c3ea2c1..c0fd0d53 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/ScriptRuntime.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/ScriptRuntime.kt
@@ -58,8 +58,8 @@ open class ScriptRuntime(
val bufferedReader = content.bufferedReader()
val moduleInfo = bufferedReader.readModuleInfo()
- if (moduleInfo.minSEVersion != null && moduleInfo.minSEVersion > BuildConfig.VERSION_CODE) {
- throw Exception("Module requires a newer version of PurrfectSnap (min version: ${moduleInfo.minSEVersion})")
+ if (moduleInfo.minPSVersion != null && moduleInfo.minPSVersion > BuildConfig.VERSION_CODE) {
+ throw Exception("Module requires a newer version of PurrfectSnap (min version: ${moduleInfo.minPSVersion})")
}
return JSModule(
@@ -73,4 +73,4 @@ open class ScriptRuntime(
modules[scriptPath] = this
}
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/type/ModuleInfo.kt b/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/type/ModuleInfo.kt
index 9d9a6489..7355fb91 100644
--- a/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/type/ModuleInfo.kt
+++ b/common/src/main/kotlin/me/eternal/purrfectsnap/common/scripting/type/ModuleInfo.kt
@@ -10,7 +10,7 @@ data class ModuleInfo(
val updateUrl: String? = null,
val author: String? = null,
val minSnapchatVersion: Long? = null,
- val minSEVersion: Long? = null,
+ val minPSVersion: Long? = null,
val grantedPermissions: List,
val executionSides: List? = null,
) {
@@ -23,14 +23,14 @@ data class ModuleInfo(
fun BufferedReader.readModuleInfo(): ModuleInfo {
val header = readLine()
- if (!header.startsWith("// ==SE_module==")) {
+ if (!header.startsWith("// ==PS_module==") && !header.startsWith("// ==SE_module==")) {
throw Exception("Invalid module header")
}
val properties = mutableMapOf()
while (true) {
val line = readLine()
- if (line.startsWith("// ==/SE_module==")) {
+ if (line.startsWith("// ==/PS_module==") || line.startsWith("// ==/SE_module==")) {
break
}
val split = line.replaceFirst("//", "").split(":", limit = 2)
@@ -52,7 +52,8 @@ fun BufferedReader.readModuleInfo(): ModuleInfo {
updateUrl = properties["updateUrl"],
author = properties["author"],
minSnapchatVersion = properties["minSnapchatVersion"]?.toLongOrNull(),
- minSEVersion = properties["minSEVersion"]?.toLongOrNull(),
+ minPSVersion = properties["minPSVersion"]?.toLongOrNull()
+ ?: properties["minSEVersion"]?.toLongOrNull(),
grantedPermissions = properties["permissions"]?.split(",")?.map { it.trim() } ?: emptyList(),
executionSides = properties["executionSides"]?.lowercase()?.split(",")?.map { it.trim() },
)
diff --git a/composer/rollup.config.js b/composer/rollup.config.js
deleted file mode 100644
index 9abfff40..00000000
--- a/composer/rollup.config.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default {
- input: "./build/typescript/main.js",
- output: {
- file: "./build/loader.js",
- format: "iife",
- }
-};
\ No newline at end of file
diff --git a/composer/src/main/ts/modules/bypassCameraRollSelectionLimit.ts b/composer/src/main/ts/modules/bypassCameraRollSelectionLimit.ts
deleted file mode 100644
index f04d3061..00000000
--- a/composer/src/main/ts/modules/bypassCameraRollSelectionLimit.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineModule } from "../types";
-import { interceptComponent } from "../utils";
-
-export default defineModule({
- name: "Bypass Camera Roll Selection Limit",
- enabled: config => config.bypassCameraRollLimit,
- init() {
- interceptComponent(
- 'memories_ui/src/clickhandlers/MultiSelectClickHandler',
- 'MultiSelectClickHandler',
- {
- "": (args: any[], superCall: () => void) => {
- args[1].selectionLimit = 9999999;
- superCall();
- }
- }
- )
- }
-});
\ No newline at end of file
diff --git a/config/config.json b/config/config.json
index 4a51436d..5dcb38b6 100644
--- a/config/config.json
+++ b/config/config.json
@@ -1,23 +1,35 @@
{
"allowed_eps_active": [
"/messagingcoreservice.MessagingCoreService/",
+ "/GetConvoSafetyPrompt",
"/GetSnapchatterPublicInfo",
- "/UserRecentlyActive",
- "/socialsms.SocialSms/UpdateLink",
+ "/snapchat.friending.server.RecentlyActive/UserRecentlyActive",
+ "/snapchat.friending.server.ContactBook/",
+ "/snapchat.friending.server.FriendRequests/",
+ "/snapchat.friending.server.FriendAction/",
"/com.snapchat.atlas.gw.AtlasGw/SyncFriendData",
"/com.snapchat.atlas.gw.AtlasGw/GetFriendsUserScore",
- "/com.snapchat.atlas.gw.AtlasGw/GetUserRecentlyActive",
- "/snapchat.friending.server.FriendAction/",
- "/snapchat.friending.server.FriendRequests/",
+ "/com.snapchat.atlas.gw.AtlasGw/SetUserDisplayName",
"/snapchat.music.music_service.MusicService/",
+ "/snapchat.music.external_music_service.ExternalMusicService/",
+ "/snapchat.content.v2.MediaDeliveryService/",
+ "/snapchat.content.v2.MediaOriginService/",
+ "/snapchat.map.",
+ "/snapchat.notif.DeviceStateReceiver/",
+ "/snapchat.creativetools.",
+ "/snapchat.lens.",
+ "/snapchat.bitmoji.",
+ "/snapchat.aura.api.AuraService/",
"/com.snapchat.ads.notification.ProfileNotificationCRUDService/",
- "ClientIntegrityService",
- "/ClientIntegrityService",
- "/ClientIntegrityService/",
- "/GetAttestationHeaders",
- "/AttestationHeaders",
- "/getAttestationHeaders",
- "/GetAttestationPayload",
- "/AttestationPayload"
+ "/com.snapchat.commerce.",
+ "/snapchat.payments.commerce.",
+ "/snapchat.abuse.support.AppealService/",
+ "/snapchat.local.snapzen.userdata.",
+ "/snapchat.valis.Valis/",
+ "com.snap.identity.network.suggestion.BqSuggestFriendHttpInterface.fetchHighQualitySuggestedFriend",
+ "/snap.security.ArgosService/GetTokens",
+ "com.snap.playstate.net.ReadReceiptHttpInterface.batchUploadReadReceipts",
+ "com.snap.identity.network.suggestion.BqSuggestFriendHttpInterface.fetchLegacySuggestedFriend",
+ "com.snap.identity.FriendingHttpInterface.submitSuggestedFriendsAction"
]
}
diff --git a/core/build.gradle.kts b/core/build.gradle.kts
index 95d1418f..bf87a4fc 100644
--- a/core/build.gradle.kts
+++ b/core/build.gradle.kts
@@ -35,7 +35,7 @@ dependencies {
implementation(project(":common"))
implementation(project(":mapper"))
implementation(project(":native"))
- implementation(project(":composer"))
+ implementation(project(":valdi"))
implementation(libs.androidx.activity.ktx)
implementation(platform(libs.androidx.compose.bom))
@@ -45,4 +45,5 @@ dependencies {
implementation(libs.androidx.material.icons.extended)
implementation(libs.androidx.material3)
implementation(libs.hiddenapibypass)
-}
\ No newline at end of file
+ implementation(libs.colorpicker.compose)
+}
diff --git a/core/src/main/assets/web/export_template.html b/core/src/main/assets/web/export_template.html
index a99ef065..13b6388f 100644
--- a/core/src/main/assets/web/export_template.html
+++ b/core/src/main/assets/web/export_template.html
@@ -114,6 +114,7 @@
justify-content: flex-start;
flex-wrap: nowrap;
margin: 5px 15px;
+ --sender-color: #ffd3b6;
}
main>.message .header {
@@ -127,16 +128,9 @@
align-items: center;
}
- main>.message:nth-child(2n) .username {
- color: #dcedc1;
- }
-
- main>.message:nth-child(2n + 1) .username {
- color: #ffd3b6;
- }
-
main>.message .username {
font-weight: bold;
+ color: var(--sender-color);
}
main>.message .time {
@@ -145,14 +139,6 @@
font-weight: 600;
}
- main>.message:nth-child(2n) .content {
- border-color: #dcedc1;
- }
-
- main>.message:nth-child(2n + 1) .content {
- border-color: #ffd3b6;
- }
-
main>.message .content {
background-color: var(--Snap-sigBackgroundMessageSaved);
border-left: 3px solid;
@@ -160,6 +146,7 @@
margin-top: 4px;
padding-left: 4px;
padding: 3px 0 3px 6px;
+ border-color: var(--sender-color);
}
main>.message .content div:has(.chat_media:not(audio):not(.overlay_media)) {
@@ -203,6 +190,17 @@
main>.message .red_snap_svg {
color: var(--Snap-sigSnapWithoutSound);
}
+ main>.message .time.with_deleted {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ }
+
+ main>.message .deleted_icon_svg {
+ width: 12px;
+ height: 12px;
+ color: var(--Snap-sigTextNegative);
+ }
@@ -220,6 +218,9 @@
+
-
\ No newline at end of file
+