6.7.0 - Alpha12 - 插件中心 M1 - 插件中心支持安装 (本地/URL), 卸载, 启用, 禁用, 详情展示.

This commit is contained in:
SuperMonster003
2025-12-08 23:30:02 +08:00
parent 1fcfd7233f
commit a99247b80c
39 changed files with 2792 additions and 203 deletions

View File

@@ -8,6 +8,7 @@ import kotlinx.coroutines.withContext
import org.autojs.autojs.core.plugin.ocr.PaddleOcrPluginHost
import org.autojs.autojs6.R
import org.autojs.plugin.paddle.ocr.PluginInfo
import java.io.File
/**
* Local installed plugin discovery (based on existing PaddleOcrPluginHost.discover).
@@ -23,8 +24,9 @@ class InstalledPluginRepository {
val author: String?,
val versionName: String,
val versionCode: Long?,
val installTime: Long?,
val updateTime: Long?,
val packageSize: Long,
val firstInstallTime: Long?,
val lastUpdateTime: Long?,
val icon: Drawable?,
val pluginInfo: PluginInfo?,
)
@@ -45,6 +47,16 @@ class InstalledPluginRepository {
val versionCode = pkgInfo?.let { PackageInfoCompat.getLongVersionCode(it) } ?: d.pluginInfo?.versionCode
val firstInstallTime = pkgInfo?.firstInstallTime
val lastUpdateTime = pkgInfo?.lastUpdateTime
val packageSize = run calcPackageSize@{
val baseApkSize = appInfo?.publicSourceDir?.let { File(it).length() }
?: appInfo?.sourceDir?.let { File(it).length() }
val splitApkTotalSize = when {
appInfo?.splitPublicSourceDirs != null -> appInfo.splitPublicSourceDirs!!.sumOf { File(it).length() }
appInfo?.splitSourceDirs != null -> appInfo.splitSourceDirs!!.sumOf { File(it).length() }
else -> 0L
}
baseApkSize?.let { it + splitApkTotalSize } ?: 0L
}
InstalledPlugin(
packageName = packageName,
@@ -53,8 +65,9 @@ class InstalledPluginRepository {
author = d.pluginInfo?.author,
versionName = versionName,
versionCode = versionCode,
installTime = firstInstallTime,
updateTime = lastUpdateTime,
packageSize = packageSize,
firstInstallTime = firstInstallTime,
lastUpdateTime = lastUpdateTime,
icon = icon,
pluginInfo = d.pluginInfo,
)

View File

@@ -4,7 +4,19 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.DialogAction
import com.afollestad.materialdialogs.MaterialDialog
import kotlinx.coroutines.launch
import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor
import org.autojs.autojs.ui.BaseActivity
import org.autojs.autojs.ui.error.ErrorDialogActivity
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance
import org.autojs.autojs.util.ViewUtils.setNavigationIconColorByThemeColorLuminance
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivityPluginCenterBinding
@@ -13,6 +25,13 @@ class PluginCenterActivity : BaseActivity() {
private lateinit var binding: ActivityPluginCenterBinding
private val pickApkLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri ->
uri ?: return@registerForActivityResult
lifecycleScope.launch {
PluginInstaller.installFromFileUriWithPrompt(this@PluginCenterActivity, uri)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -28,6 +47,90 @@ class PluginCenterActivity : BaseActivity() {
setToolbarAsBack(R.string.text_plugin_center)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_plugin_center, menu)
setUpToolbarColors()
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_install_from_local_file -> {
pickApkLauncher.launch(arrayOf("application/vnd.android.package-archive"))
true
}
R.id.action_install_from_url -> {
MaterialDialog.Builder(this)
.title(R.string.text_install_plugin_from_url)
.content(R.string.instruction_install_plugin_from_url)
.input(null, null) { d, input ->
val positiveButton = d.getActionButton(DialogAction.POSITIVE)
when {
input.isNullOrBlank() -> {
positiveButton.setOnClickListener(null)
positiveButton.setTextColor(d.context.getColor(R.color.dialog_button_unavailable))
}
else -> {
positiveButton.setOnClickListener {
d.dismiss()
val url = input.trim().toString()
lifecycleScope.launch {
runCatching {
PluginInstaller.installFromUrlWithPrompt(this@PluginCenterActivity, url)
}.onFailure { e ->
ErrorDialogActivity.showErrorDialog(
this@PluginCenterActivity,
R.string.text_failed_to_retrieve,
e.message ?: e.toString(),
)
}
}
}
positiveButton.setTextColor(d.context.getColor(R.color.dialog_button_attraction))
}
}
}
.alwaysCallInputCallback()
.widgetThemeColor()
.negativeText(R.string.text_cancel)
.negativeColorRes(R.color.dialog_button_default)
.onNegative { d, _ -> d.dismiss() }
.positiveText(R.string.dialog_button_retrieve)
.positiveColorRes(R.color.dialog_button_unavailable)
.autoDismiss(false)
.cancelable(false)
.show()
true
}
R.id.action_search -> {
// TODO action_search
ViewUtils.showToast(this, R.string.text_under_development)
true
}
R.id.action_sort -> {
// TODO action_sort
ViewUtils.showToast(this, R.string.text_under_development)
true
}
R.id.action_filter -> {
// TODO action_filter
ViewUtils.showToast(this, R.string.text_under_development)
true
}
R.id.action_global_settings -> {
// TODO action_global_settings
ViewUtils.showToast(this, R.string.text_under_development)
true
}
else -> super.onOptionsItemSelected(item)
}
}
private fun setUpToolbarColors() {
binding.toolbar.setMenuIconsColorByThemeColorLuminance(this)
binding.toolbar.setNavigationIconColorByThemeColorLuminance(this)
}
companion object {
fun startActivity(context: Context) {

View File

@@ -1,8 +1,13 @@
package org.autojs.autojs.core.plugin.center
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
@@ -22,17 +27,40 @@ class PluginCenterFragment : Fragment(R.layout.fragment_plugin_center) {
private val vm: PluginCenterViewModel by viewModels()
private lateinit var adapter: PluginCenterItemAdapter
private lateinit var context: Context
private lateinit var contextRef: Context
private val uninstallLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
vm.load(requireContext())
}
private var pkgReceiver: BroadcastReceiver? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentPluginCenterBinding.bind(view)
val context = requireContext().also { context = it }
val context = requireContext().also { contextRef = it }
adapter = PluginCenterItemAdapter(object : PluginCenterItemAdapter.Listener {
override fun onToggleEnable(item: PluginCenterItem, enabled: Boolean) {
vm.setEnabled(contextRef, item.packageName, enabled)
item.isEnabled = enabled
}
override fun onUninstall(item: PluginCenterItem) {
val uri = Uri.parse("package:${item.packageName}")
val intent = Intent(Intent.ACTION_DELETE, uri)
uninstallLauncher.launch(intent)
}
override fun onDetails(item: PluginCenterItem) {
PluginInfoDialogManager.showPluginInfoDialog(contextRef, item)
}
})
binding.pluginCenterRecyclerView.apply {
layoutManager = LinearLayoutManager(context)
adapter = PluginCenterItemAdapter().also { this@PluginCenterFragment.adapter = it }
adapter = this@PluginCenterFragment.adapter
addItemDecoration(DividerItemDecoration(context, VERTICAL))
excludePaddingClippableViewFromBottomNavigationBar()
}
@@ -50,6 +78,55 @@ class PluginCenterFragment : Fragment(R.layout.fragment_plugin_center) {
}
}
override fun onStart() {
super.onStart()
run registerPackageReceiver@{
pkgReceiver ?: return@registerPackageReceiver
pkgReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val data = intent.data ?: return
val packageName = data.schemeSpecificPart ?: return
val replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)
when (intent.action) {
Intent.ACTION_PACKAGE_ADDED -> {
// Package installation (update) does not record "Recently installed" when replacing, but will refresh.
// zh-CN: 替换安装 (更新) 不记录 "最近安装", 但会刷新.
if (!replacing) PluginRecentStore.setLastInstalled(packageName)
vm.load(context)
}
Intent.ACTION_PACKAGE_REMOVED -> {
// Package uninstallation (pre-update phase) does not record "Recently uninstalled" when replacing.
// zh-CN: 替换卸载 (更新前阶段) 不记录 "最近卸载".
if (!replacing) PluginRecentStore.setLastUninstalled(packageName)
vm.load(context)
}
}
}
}
val filter = IntentFilter().apply {
addAction(Intent.ACTION_PACKAGE_ADDED)
addAction(Intent.ACTION_PACKAGE_REMOVED)
addDataScheme("package")
}
requireContext().registerReceiver(pkgReceiver, filter)
}
}
override fun onStop() {
super.onStop()
pkgReceiver?.let { runCatching { requireContext().unregisterReceiver(it) } }
pkgReceiver = null
}
override fun onResume() {
super.onResume()
// Refresh once when returning to the page to update install/uninstall status.
// zh-CN: 回到页面时刷新一次, 覆盖安装/卸载后的状态.
if (::contextRef.isInitialized) {
vm.load(contextRef)
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null

View File

@@ -1,18 +1,66 @@
package org.autojs.autojs.core.plugin.center
import android.graphics.drawable.Drawable
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
data class PluginCenterItem(
val packageName: String,
val title: String,
val description: String,
val author: String? = null,
val collaborators: List<String> = emptyList(),
val packageName: String,
val versionName: String,
val versionCode: Long? = null,
val versionDate: String? = null,
val isEnabled: Boolean = true,
val isUpdatable: Boolean = false,
var updatableVersionName: String? = null,
var updatableVersionCode: Long? = null,
var updatableVersionDate: String? = null,
val author: String? = null,
val collaborators: List<String> = emptyList(),
val description: String,
// Size of installed package (aggregated base + splits), 0 for uninstalled.
// zh-CN: 已安装包大小 (聚合 base + splits), 未安装为 0.
val packageSize: Long = 0L,
// Installable package metadata (from index or network detection).
// zh-CN: 可安装包元信息 (来自索引或网络探测).
val installableApkUrl: String? = null,
val installableApkSha256: String? = null,
val installableApkSizeBytes: Long? = null,
val icon: Drawable? = null,
var isEnabled: Boolean = true,
val isInstalled: Boolean,
val firstInstallTime: Long? = null,
val lastUpdateTime: Long? = null,
val settings: PluginCenterItemSettings? = null,
)
) {
val versionSummary: String
get() = formatVersionInfo(versionName, versionCode, versionDate)
val updatableVersionSummary: String?
get() = updatableVersionName?.let { formatVersionInfo(it, updatableVersionCode, updatableVersionDate) }
val isUpdatable: Boolean
get() = updatableVersionName != null
var lastInstallTime: Long?
get() = PluginRecentStore.getLastInstalled(packageName)
set(value) = PluginRecentStore.setLastInstalled(packageName, value ?: System.currentTimeMillis())
var lastUninstallTime: Long?
get() = PluginRecentStore.getLastUninstalled(packageName)
set(value) = PluginRecentStore.setLastUninstalled(packageName, value ?: System.currentTimeMillis())
private fun formatVersionInfo(versionName: String, versionCode: Long?, versionDate: String?): String {
val code = versionCode?.takeIf { it > 0 }
val date = versionDate?.runCatching {
DateTimeFormat.forPattern("yyyy-MM-dd").print(DateTime.parse(this))
}?.getOrNull()
return buildString {
append(versionName)
code?.let { append(" ($it)") }
date?.let { append(" | $it") }
}
}
}

View File

@@ -7,13 +7,15 @@ import androidx.recyclerview.widget.RecyclerView
import org.autojs.autojs6.databinding.PluginCenterRecyclerViewItemBinding
@SuppressLint("NotifyDataSetChanged")
class PluginCenterItemAdapter : RecyclerView.Adapter<PluginCenterItemViewHolder>() {
class PluginCenterItemAdapter(
private val listener: Listener,
) : RecyclerView.Adapter<PluginCenterItemViewHolder>() {
internal var items = emptyList<PluginCenterItem>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PluginCenterItemViewHolder {
val binding = PluginCenterRecyclerViewItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return PluginCenterItemViewHolder(binding)
return PluginCenterItemViewHolder(binding, listener)
}
override fun onBindViewHolder(holder: PluginCenterItemViewHolder, position: Int) {
@@ -29,4 +31,10 @@ class PluginCenterItemAdapter : RecyclerView.Adapter<PluginCenterItemViewHolder>
notifyDataSetChanged()
}
interface Listener {
fun onToggleEnable(item: PluginCenterItem, enabled: Boolean)
fun onUninstall(item: PluginCenterItem)
fun onDetails(item: PluginCenterItem)
}
}

View File

@@ -1,8 +1,6 @@
package org.autojs.autojs.core.plugin.center
import android.content.res.ColorStateList
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.PorterDuff
import android.view.View
import android.widget.ImageView
@@ -17,12 +15,16 @@ import de.hdodenhof.circleimageview.CircleImageView
import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs.util.ViewUtils.colorFilterWithDesaturateOrNull
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.PluginCenterRecyclerViewItemBinding
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
class PluginCenterItemViewHolder(itemViewBinding: PluginCenterRecyclerViewItemBinding) : RecyclerView.ViewHolder(itemViewBinding.root) {
class PluginCenterItemViewHolder(
itemViewBinding: PluginCenterRecyclerViewItemBinding,
private val listener: PluginCenterItemAdapter.Listener,
) : RecyclerView.ViewHolder(itemViewBinding.root) {
private val context = itemViewBinding.root.context
@@ -51,7 +53,11 @@ class PluginCenterItemViewHolder(itemViewBinding: PluginCenterRecyclerViewItemBi
private val btnSettingsView = itemViewBinding.btnSettings
private val btnDetailsView = itemViewBinding.btnDetails
private lateinit var currentItem: PluginCenterItem
fun bind(item: PluginCenterItem) {
currentItem = item
item.icon?.let { iconView.setImageDrawable(it) } ?: AppCompatResources.getDrawable(
iconView.context,
R.drawable.ic_plugin_center_default
@@ -61,48 +67,67 @@ class PluginCenterItemViewHolder(itemViewBinding: PluginCenterRecyclerViewItemBi
iconView.setImageDrawable(d)
} ?: iconView.setImageResource(R.mipmap.ic_app_shortcut_plugin_center_adaptive_round)
switchView.setOnCheckedChangeListener(null)
switchView.isChecked = item.isEnabled
titleView.text = item.title
versionInfoView.text = formatVersionInfo(item.versionName, item.versionCode, item.versionDate)
versionInfoView.text = item.versionSummary
authorView.text = item.author
descriptionView.text = item.description
btnDeleteView.setButtonState(true) {
ViewUtils.showToast(context, R.string.text_under_development)
if (item.isInstalled) {
btnDeleteView.setButtonState(true) {
listener.onUninstall(currentItem)
}
} else {
btnDeleteView.setButtonState(false)
}
if (item.isUpdatable) {
if (item.isInstalled && item.isUpdatable) {
updatableBadgeView.isVisible = true
versionInfoForUpdateView.isVisible = true
versionInfoForUpdateView.text = formatVersionInfo(item.versionName, item.versionCode?.let { it + 16 }, item.versionDate?.let {
// test
val updatableVersionName = item.versionName.also {
item.updatableVersionName = it
}
// test
val updatableVersionCode = item.versionCode?.let { it + 16 }?.also {
item.updatableVersionCode = it
}
// test
val updatableVersionDate = item.versionDate?.let {
DateTime.parse(it).plusDays(3).toString("yyyy-MM-dd")
})
}?.also {
item.updatableVersionDate = it
}
versionInfoForUpdateView.text = formatVersionInfo(updatableVersionName, updatableVersionCode, updatableVersionDate)
btnUpdateView.setButtonState(true) {
ViewUtils.showToast(context, R.string.text_under_development)
}
} else {
updatableBadgeView.isVisible = false
versionInfoForUpdateView.isVisible = false
btnUpdateView.setButtonState(false) {
ViewUtils.showToast(context, R.string.text_unavailable)
}
btnUpdateView.setButtonState(false)
}
if (item.settings != null) {
btnSettingsView.setButtonState(true) {
ViewUtils.showToast(context, R.string.text_under_development)
}
} else {
btnSettingsView.setButtonState(false) {
ViewUtils.showToast(context, R.string.text_unavailable)
}
btnSettingsView.setButtonState(false)
}
btnDetailsView.setButtonState(true) {
ViewUtils.showToast(context, R.string.text_under_development)
listener.onDetails(currentItem)
}
applyUiBySwitch(switchView.isChecked, item)
switchView.setOnCheckedChangeListener { _, isChecked ->
listener.onToggleEnable(currentItem, isChecked)
applyUiBySwitch(isChecked, item)
}
}
@@ -119,8 +144,8 @@ class PluginCenterItemViewHolder(itemViewBinding: PluginCenterRecyclerViewItemBi
}
}
private fun LinearLayout.setButtonState(enabled: Boolean, onClickListener: View.OnClickListener) {
isEnabled = enabled
private fun LinearLayout.setButtonState(enabled: Boolean, onClickListener: View.OnClickListener? = null) {
this.isEnabled = enabled
this.setOnClickListener(onClickListener)
}
@@ -130,7 +155,11 @@ class PluginCenterItemViewHolder(itemViewBinding: PluginCenterRecyclerViewItemBi
val colorPrimaryA30 = context.getColor(R.color.text_color_primary_alpha_30)
val colorPrimaryA20 = context.getColor(R.color.text_color_primary_alpha_20)
btnDeleteView.setActionColors(iconColor = colorPrimaryA50, textColor = colorPrimary)
if (btnDeleteView.isEnabled) {
btnDeleteView.setActionColors(iconColor = colorPrimaryA50, textColor = colorPrimary)
} else {
btnDeleteView.setActionColors(iconColor = colorPrimaryA20, textColor = colorPrimaryA30)
}
if (btnUpdateView.isEnabled) {
if (isOn) {
@@ -158,20 +187,7 @@ class PluginCenterItemViewHolder(itemViewBinding: PluginCenterRecyclerViewItemBi
updatableBadgeTextView.setTextColor(colorPrimary)
}
if (isOn) {
iconView.colorFilter = null
} else {
// Construct the desaturation matrix.
// zh-CN: 构造灰度矩阵.
val desaturate = ColorMatrix().apply { setSaturation(0f) }
// Construct the alpha scaling matrix.
// zh-CN: 构造透明度缩放矩阵.
val alphaMatrix = ColorMatrix().apply { setScale(1f, 1f, 1f, 0.5f) }
// Concatenate: first desaturate, then apply alpha.
// zh-CN: 叠加: 先灰度, 再透明度.
desaturate.postConcat(alphaMatrix)
iconView.colorFilter = ColorMatrixColorFilter(desaturate)
}
iconView.colorFilterWithDesaturateOrNull(isOn, 0.5F)
}
private fun LinearLayout.setActionColors(iconColor: Int, textColor: Int) {

View File

@@ -19,6 +19,7 @@ class PluginCenterViewModel : ViewModel() {
private val indexRepo = PluginIndexRepository()
private val installedRepo = InstalledPluginRepository()
private val enableStore = PluginEnableStore()
private val _items = MutableStateFlow<List<PluginCenterItem>>(emptyList())
val items: StateFlow<List<PluginCenterItem>> = _items
@@ -47,9 +48,23 @@ class PluginCenterViewModel : ViewModel() {
.map { local -> toPluginCenterItem(context, index = null, local = local) }
_items.value = fromIndex + extraLocals
// Refresh dialog if showing when returning to the page.
// zh-CN: 返回页面时, 对话框如果正在显示则刷新.
PluginInfoDialogManager.refreshIfShowing(context, _items.value)
}
}
fun setEnabled(context: Context, packageName: String, enabled: Boolean) {
enableStore.setEnabled(context, packageName, enabled)
// Update in-memory state too, to avoid a second full refresh.
// zh-CN: 内存态也更新, 避免二次全量刷新.
_items.value = _items.value.map {
if (it.packageName == packageName) it.copy(isEnabled = enabled) else it
}
PluginInfoDialogManager.refreshIfShowing(context, _items.value)
}
private fun toPluginCenterItem(context: Context, index: PluginIndexEntry?, local: InstalledPluginRepository.InstalledPlugin?): PluginCenterItem {
val packageName = local?.packageName ?: index?.packageName.orEmpty()
val title = local?.title ?: index?.title ?: packageName
@@ -58,25 +73,34 @@ class PluginCenterViewModel : ViewModel() {
val collaborators = index?.collaborators ?: emptyList()
val versionName = local?.versionName ?: index?.versionName ?: context.getString(R.string.text_unknown)
val localCode = local?.versionCode
val indexCode = index?.versionCode
val isInstalled = local != null
val isUpdatable = isInstalled && (indexCode != null && indexCode > (localCode ?: -1))
val enabled = enableStore.isEnabled(context, packageName, defaultEnabled = isInstalled)
return PluginCenterItem(
packageName = packageName,
title = title,
description = description,
packageName = packageName,
versionName = versionName,
versionCode = local?.versionCode ?: index?.versionCode,
// TODO M1: 显示索引日期; 仅本地项时可为空.
versionDate = index?.versionDate,
updatableVersionName = index?.versionName,
updatableVersionCode = index?.versionCode,
updatableVersionDate = index?.versionDate,
author = author,
collaborators = collaborators,
versionName = versionName,
versionCode = localCode ?: indexCode,
versionDate = index?.versionDate, // M1: 显示索引日期; 仅本地项时可为空
isEnabled = true, // M1: 先统一 true, M2 再接入启用状态持久化
isUpdatable = isUpdatable,
icon = local?.icon, // 已安装优先用应用图标; 未安装走默认占位图
settings = null, // M1 暂不接入单插件设置入口
description = description,
packageSize = local?.packageSize ?: 0,
installableApkUrl = index?.apkUrl,
installableApkSha256 = index?.apkSha256,
installableApkSizeBytes = index?.apkSizeBytes,
// TODO 已安装优先用应用图标; 未安装走默认占位图.
icon = local?.icon,
isEnabled = enabled,
isInstalled = isInstalled,
firstInstallTime = local?.firstInstallTime,
lastUpdateTime = local?.lastUpdateTime,
// TODO M1 暂不接入单插件设置入口.
settings = null,
)
}
}

View File

@@ -0,0 +1,22 @@
package org.autojs.autojs.core.plugin.center
import android.content.Context
import androidx.core.content.edit
class PluginEnableStore {
private val spName = "plugin_center_enable_state"
fun isEnabled(context: Context, packageName: String, defaultEnabled: Boolean = true): Boolean {
val sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE)
return sp.getBoolean(key(packageName), defaultEnabled)
}
fun setEnabled(context: Context, packageName: String, enabled: Boolean) {
val sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE)
sp.edit { putBoolean(key(packageName), enabled) }
}
private fun key(packageName: String) = "key_\$_enabled_plugin_\$_$packageName"
}

View File

@@ -16,12 +16,16 @@ data class PluginIndexEntry(
val engine: String? = null,
/** @sample "v5" */
val variant: String? = null,
/** @sample "paddle-ocr-v5" */
/** @sample "paddle-ocr-pp-ocrv5" */
val engineId: String? = null,
val versionName: String,
val versionCode: Long? = null,
val versionDate: String? = null,
val apkUrl: String? = null,
val apkSha256: String? = null,
val apkSizeBytes: Long? = null,
val tags: List<String> = emptyList(),
)

View File

@@ -8,7 +8,7 @@ import android.content.Context
class PluginIndexRepository {
suspend fun fetchOfficialIndex(context: Context): List<PluginIndexEntry> {
// M1 先预置 1 条官方样例 "Paddle OCR (PP-OCRv5)", 便于与本地已安装合并显示.
// TODO M1 先预置 1 条官方样例 "Paddle OCR (PP-OCRv5)", 便于与本地已安装合并显示.
return listOf(
PluginIndexEntry(
packageName = "io.github.supermonster003.autojs6.plugin.paddleocr.v5",
@@ -19,11 +19,16 @@ class PluginIndexRepository {
versionName = "0.1.0",
versionCode = 17L,
versionDate = "2025-11-21",
iconUrl = null, // M1 暂不拉网图标, 使用应用图标或默认图标.
// TODO M1 若索引的下载地址/哈希/尺寸未知, 则先设置为 null.
apkUrl = null,
apkSha256 = null,
apkSizeBytes = null,
// TODO M1 暂不拉网图标, 使用应用图标或默认图标.
iconUrl = null,
tags = listOf("official", "ocr", "paddle", "v5"),
engine = "paddle-ocr",
variant = "v5",
engineId = "paddle-ocr-v5",
engineId = "paddle-ocr-pp-ocrv5",
),
)
}

View File

@@ -0,0 +1,333 @@
package org.autojs.autojs.core.plugin.center
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.PorterDuff
import android.view.LayoutInflater
import android.view.View.MeasureSpec.UNSPECIFIED
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.net.toUri
import androidx.core.view.isVisible
import com.afollestad.materialdialogs.DialogAction
import com.afollestad.materialdialogs.MaterialDialog
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.autojs.autojs.extension.MaterialDialogExtensions.makeSettingsLaunchable
import org.autojs.autojs.extension.MaterialDialogExtensions.makeTextCopyable
import org.autojs.autojs.extension.MaterialDialogExtensions.setCopyableTextIfAbsent
import org.autojs.autojs.runtime.api.augment.converter.core.Bytes
import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.ColorUtils
import org.autojs.autojs.util.DisplayUtils
import org.autojs.autojs.util.TimeUtils
import org.autojs.autojs.util.ViewUtils.colorFilterWithDesaturateOrNull
import org.autojs.autojs.util.ViewUtils.toCircular
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.PluginInfoDialogItemsBinding
import java.lang.ref.WeakReference
import kotlin.math.roundToInt
object PluginInfoDialogManager {
// Hold the current dialog and package name for refreshing on onResume.
// zh-CN: 持有当前对话框与包名, 便于 onResume 时刷新.
private var currentDialog: WeakReference<MaterialDialog>? = null
private var currentPackageName: String? = null
fun refreshIfShowing(context: Context, allItems: List<PluginCenterItem>) {
val dialog = currentDialog?.get() ?: return
val pkg = currentPackageName ?: return
if (!dialog.isShowing) return
val target = allItems.firstOrNull { it.packageName == pkg } ?: return
dialog.dismiss()
showPluginInfoDialog(context, target)
}
@JvmStatic
fun showPluginInfoDialog(context: Context, item: PluginCenterItem) {
if (item.isInstalled) {
showInstalledPluginInfoDialog(context, item)
} else {
showInstallablePluginInfoDialog(context, item)
}
}
private fun showInstallablePluginInfoDialog(context: Context, item: PluginCenterItem) {
val states = listOf(context.getString(R.string.text_installable))
val info = PluginInfoInstallable(
title = item.title,
states = states,
packageName = item.packageName,
version = item.versionSummary,
author = item.author,
collaborators = item.collaborators,
description = item.description,
packageSize = item.installableApkSizeBytes ?: 0L,
lastInstallTime = item.lastInstallTime,
lastUninstallTime = item.lastUninstallTime,
apkUrl = item.installableApkUrl,
)
showPluginInfoDialogInternal(context, item, info)
}
private fun showInstalledPluginInfoDialog(context: Context, item: PluginCenterItem) {
val enabledRes = if (item.isEnabled) R.string.text_enabled else R.string.text_disabled
val states = mutableListOf(context.getString(enabledRes)).apply {
if (item.isUpdatable) add(context.getString(R.string.text_updatable))
}
val info = PluginInfoInstalled(
title = item.title,
states = states,
packageName = item.packageName,
version = item.versionSummary,
author = item.author,
collaborators = item.collaborators,
description = item.description,
packageSize = item.packageSize,
updatableVersion = item.updatableVersionSummary,
firstInstallTime = item.firstInstallTime,
lastUpdateTime = item.lastUpdateTime,
)
showPluginInfoDialogInternal(context, item, info)
}
private fun showPluginInfoDialogInternal(context: Context, item: PluginCenterItem, info: PluginInfoBase) {
val binding = PluginInfoDialogItemsBinding.inflate(LayoutInflater.from(context))
val dialog = MaterialDialog.Builder(context)
.title(info.title)
.customView(binding.root, false)
.autoDismiss(false)
.iconRes(R.drawable.ic_three_dots_outline_small)
.limitIconToDefaultSize()
.negativeText(R.string.dialog_button_dismiss)
.onNegative { d, _ -> d.dismiss() }
.apply {
when (info) {
is PluginInfoInstallable -> {
positiveText(R.string.text_install)
positiveColorRes(R.color.dialog_button_attraction)
onPositive { d, _ ->
info.apkUrl?.let { url ->
d.dismiss()
CoroutineScope(Dispatchers.IO).launch {
PluginInstaller.installFromUrlWithPrompt(context, url, item.installableApkSha256)
}
} ?: run {
val positiveButton = d.getActionButton(DialogAction.POSITIVE)
positiveButton.setTextColor(d.context.getColor(R.color.dialog_button_unavailable))
MaterialDialog.Builder(d.context)
.title(R.string.text_failed_to_install)
.content(d.context.getString(R.string.error_no_available_url_provided_for_current_plugin))
}
}
}
is PluginInfoInstalled -> {
positiveText(R.string.text_uninstall)
positiveColorRes(R.color.dialog_button_warn)
onPositive { d, _ ->
// TODO 确定卸载对话框.
d.dismiss()
context.startActivity(Intent(Intent.ACTION_DELETE, "package:${item.packageName}".toUri()))
}
if (item.isUpdatable) {
neutralText(R.string.text_update)
neutralColorRes(R.color.dialog_button_attraction)
onNeutral { d, _ ->
d.dismiss()
// TODO 后续实现更新逻辑 (下载新包 -> 安装).
}
}
}
}
}
.show()
.apply {
makeTextCopyable { titleView }
}
// Hold the current dialog and package name for refreshing on onResume.
// zh-CN: 记录 "当前对话框" 与包名, 便于 onResume 刷新.
currentDialog = WeakReference(dialog)
currentPackageName = item.packageName
restoreEssentialViews(binding, context, info)
updateGuidelines(binding)
binding.stateValueFirst.text = info.states.getOrNull(0)
if (info.states.size > 1) {
binding.stateValueSecond.text = info.states[1]
binding.stateSpliterFirstSecond.isVisible = true
binding.stateValueSecond.isVisible = true
}
dialog.setCopyableTextIfAbsent(binding.packageNameValue, info.packageName)
dialog.setCopyableTextIfAbsent(binding.versionValue, info.version)
dialog.setCopyableTextIfAbsent(binding.pluginItemInfoAuthorValue, info.author)
dialog.setCopyableTextIfAbsent(binding.descriptionValue, info.description)
dialog.setCopyableTextIfAbsent(binding.pluginItemInfoPackageSizeValue, info.packageSize.takeIf { it > 0 }?.let { formatSize(it) })
val dialogIcon = item.icon ?: AppCompatResources.getDrawable(context, R.drawable.ic_plugin_center_default)?.mutate()?.also { d ->
val adjustedImageContrastColor = ColorUtils.adjustColorForContrast(context.getColor(R.color.window_background), ThemeColorManager.colorPrimary, 2.3)
DrawableCompat.setTint(d, adjustedImageContrastColor)
DrawableCompat.setTintMode(d, PorterDuff.Mode.SRC_IN)
} ?: AppCompatResources.getDrawable(context, R.mipmap.ic_app_shortcut_plugin_center_adaptive_round)
if (dialogIcon != null) {
dialog.setIcon(
dialogIcon.toCircular(
context = context,
sizePx = DisplayUtils.dpToPx(48.0F).roundToInt(),
borderWidthPx = context.resources.getDimensionPixelSize(R.dimen.plugin_center_item_icon_border_width),
borderColor = context.getColor(R.color.plugin_center_item_icon_border),
)
)
dialog.iconView.colorFilterWithDesaturateOrNull(item.isEnabled, 0.5F)
if (info is PluginInfoInstalled) {
dialog.makeSettingsLaunchable({ it.iconView }, info.packageName)
}
}
// Installable package: If the index does not provide size, try to HEAD request to get it, update display after success.
// zh-CN: 可安装包: 若索引未给 size, 尝试 HEAD 获取, 成功后更新显示.
if (info is PluginInfoInstallable && info.packageSize <= 0 && !info.apkUrl.isNullOrBlank()) {
// Asynchronously probe the size and refresh the view.
// zh-CN: 异步探测大小并刷新视图.
CoroutineScope(Dispatchers.IO).launch {
val size = PluginInstaller.probeContentLength(info.apkUrl)
if (size != null && size > 0 && currentDialog?.get() === dialog) {
// TODO 更新当前 item 的 "可安装包大小" 仅用于对话框展示 (持久化可留到 M2).
withContext(Dispatchers.Main) {
dialog.setCopyableTextIfAbsent(binding.pluginItemInfoPackageSizeValue, formatSize(size))
}
}
}
}
}
@SuppressLint("SetTextI18n")
private fun restoreEssentialViews(binding: PluginInfoDialogItemsBinding, context: Context, info: PluginInfoBase) {
if (info.collaborators.isNotEmpty()) {
binding.pluginItemInfoCollaboratorsFirstLabel.text = "${context.getString(R.string.plugin_item_info_collaborators)} [1/${info.collaborators.size}]"
binding.pluginItemInfoCollaboratorsFirstValue.text = info.collaborators[0]
binding.pluginItemInfoCollaboratorsFirstParent.isVisible = true
}
if (info.collaborators.size > 1) {
binding.pluginItemInfoCollaboratorsSecondLabel.text = "${context.getString(R.string.plugin_item_info_collaborators)} [2/${info.collaborators.size}]"
binding.pluginItemInfoCollaboratorsSecondValue.text = info.collaborators[1]
binding.pluginItemInfoCollaboratorsSecondParent.isVisible = true
}
if (info.collaborators.size > 2) {
binding.pluginItemInfoCollaboratorsThirdLabel.text = "${context.getString(R.string.plugin_item_info_collaborators)} [3/${info.collaborators.size}]"
binding.pluginItemInfoCollaboratorsThirdValue.text = info.collaborators[2]
binding.pluginItemInfoCollaboratorsThirdParent.isVisible = true
}
when (info) {
is PluginInfoInstalled -> {
info.updatableVersion?.let {
binding.versionLabel.text = context.getString(R.string.plugin_item_info_installed_version)
binding.updatableVersionValue.text = it
binding.updatableVersionParent.isVisible = true
}
info.firstInstallTime?.setupListItemView(binding.pluginItemInfoFirstInstallTimeParent, binding.pluginItemInfoFirstInstallTimeValue)
info.lastUpdateTime?.setupListItemView(binding.pluginItemInfoLastUpdateTimeParent, binding.pluginItemInfoLastUpdateTimeValue)
}
is PluginInfoInstallable -> {
info.lastInstallTime?.setupListItemView(binding.pluginItemInfoLastInstallTimeParent, binding.pluginItemInfoLastInstallTimeValue)
info.lastUninstallTime?.setupListItemView(binding.pluginItemInfoLastUninstallTimeParent, binding.pluginItemInfoLastUninstallTimeValue)
}
}
}
private fun updateGuidelines(binding: PluginInfoDialogItemsBinding) {
val filteredBindings = listOf(
binding.stateLabel to binding.stateGuideline,
binding.packageNameLabel to binding.packageNameGuideline,
binding.versionLabel to binding.versionGuideline,
binding.updatableVersionLabel to binding.updatableVersionGuideline,
binding.pluginItemInfoAuthorLabel to binding.pluginItemInfoAuthorGuideline,
binding.pluginItemInfoCollaboratorsFirstLabel to binding.pluginItemInfoCollaboratorsFirstGuideline,
binding.pluginItemInfoCollaboratorsSecondLabel to binding.pluginItemInfoCollaboratorsSecondGuideline,
binding.pluginItemInfoCollaboratorsThirdLabel to binding.pluginItemInfoCollaboratorsThirdGuideline,
binding.descriptionLabel to binding.descriptionGuideline,
binding.pluginItemInfoPackageSizeLabel to binding.pluginItemInfoPackageSizeGuideline,
binding.pluginItemInfoFirstInstallTimeLabel to binding.pluginItemInfoFirstInstallTimeGuideline,
binding.pluginItemInfoLastUpdateTimeLabel to binding.pluginItemInfoLastUpdateTimeGuideline,
binding.pluginItemInfoLastInstallTimeLabel to binding.pluginItemInfoLastInstallTimeGuideline,
binding.pluginItemInfoLastUninstallTimeLabel to binding.pluginItemInfoLastUninstallTimeGuideline,
).filter { (it.first.parent as? ConstraintLayout)?.isVisible == true }
@Suppress("DuplicatedCode")
val maxWidth = filteredBindings.maxOfOrNull { it.first.apply { measure(UNSPECIFIED, UNSPECIFIED) }.measuredWidth } ?: return
filteredBindings.forEach { (_, guideline) ->
guideline.layoutParams = (guideline.layoutParams as ConstraintLayout.LayoutParams).also {
it.guideBegin = maxWidth
}
}
}
private fun Long.setupListItemView(parentView: ConstraintLayout, valueView: TextView) {
this.takeIf { it > 0 }?.let {
valueView.text = TimeUtils.formatTimestamp(it)
parentView.isVisible = true
}
}
private fun formatSize(size: Long): String = Bytes.string(
source = size.toDouble(),
fromUnit = "B",
toUnit = "AUTO",
useIecIdentifier = true,
useSpace = true,
fractionDigits = 1,
trimTrailingZero = false,
signature = "pluginItemInfo.getPackageSize",
)
private sealed interface PluginInfoBase {
val title: String
val states: List<String>
val packageName: String
val version: String
val author: String?
val collaborators: List<String>
val description: String
val packageSize: Long
}
private data class PluginInfoInstallable(
override val title: String,
override val states: List<String>,
override val packageName: String,
override val version: String,
override val author: String?,
override val collaborators: List<String>,
override val description: String,
override val packageSize: Long,
val apkUrl: String?,
val lastInstallTime: Long?,
val lastUninstallTime: Long?,
) : PluginInfoBase
private data class PluginInfoInstalled(
override val title: String,
override val states: List<String>,
override val packageName: String,
override val version: String,
override val author: String?,
override val collaborators: List<String>,
override val description: String,
override val packageSize: Long,
val updatableVersion: String? = null,
val firstInstallTime: Long?,
val lastUpdateTime: Long?,
) : PluginInfoBase
}

View File

@@ -0,0 +1,246 @@
package org.autojs.autojs.core.plugin.center
import android.content.Context
import android.content.Intent
import android.content.res.ColorStateList
import android.net.Uri
import androidx.core.content.FileProvider
import com.afollestad.materialdialogs.DialogAction
import com.afollestad.materialdialogs.MaterialDialog
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.autojs.autojs.network.download.DownloadManager
import org.autojs.autojs.runtime.api.Mime
import org.autojs.autojs.ui.error.ErrorDialogActivity
import org.autojs.autojs.ui.main.scripts.ApkInfoDialogManager
import org.autojs.autojs.util.FileUtils
import org.autojs.autojs.util.FileUtils.toCacheFile
import org.autojs.autojs6.R
import org.spongycastle.pqc.math.linearalgebra.IntegerFunctions.pow
import java.io.EOFException
import java.io.File
import java.io.IOException
import java.net.HttpURLConnection
import java.net.URL
import java.security.DigestInputStream
import java.security.MessageDigest
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.math.roundToInt
/**
* Installer:
* - Local file: Uri installation (display APK info dialog before installation)
* - URL: Install after downloading to cache (display progress dialog during download)
*
* zh-CN:
*
* 安装器:
* - 本地文件: Uri 安装 (安装前显示 APK 信息对话框)
* - URL: 下载到缓存后安装 (下载时显示进度对话框)
*/
object PluginInstaller {
suspend fun installFromFileUriWithPrompt(context: Context, uri: Uri) = runCatching {
ApkInfoDialogManager.showApkInfoDialog(context, uri.toCacheFile(context)) {
onPositive { dialog, _ ->
dialog.dismiss()
if (FileUtils.isLikelyApk(context, uri)) {
installFromFileUri(context, uri)
return@onPositive
}
MaterialDialog.Builder(context)
.title(R.string.text_prompt)
.content(context.getString(R.string.prompt_file_may_not_be_a_valid_plugin_package_with_uri, "$uri"))
.negativeText(R.string.dialog_button_quit)
.negativeColorRes(R.color.dialog_button_default)
.onNegative { d, _ -> d.dismiss() }
.positiveText(R.string.dialog_button_continue)
.positiveColorRes(R.color.dialog_button_not_recommended)
.onPositive { d, _ ->
d.dismiss()
installFromFileUri(context, uri)
}
.autoDismiss(false)
.cancelable(false)
.show()
}
}
}.onFailure { e ->
ErrorDialogActivity.showErrorDialog(
context.applicationContext,
R.string.text_failed_to_install,
e.message ?: e.toString(),
)
}
fun installFromFileUri(context: Context, uri: Uri) {
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, Mime.APPLICATION_VND_ANDROID_PACKAGE_ARCHIVE)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(intent)
}
suspend fun installFromUrlWithPrompt(context: Context, url: String, expectedSha256: String? = null) {
when (val result = downloadWithProgress(context, url, expectedSha256)) {
is DownloadResult.Success -> installFromFileUriWithPrompt(context, result.uri)
is DownloadResult.Failure -> ErrorDialogActivity.showErrorDialog(
context,
result.titleRes,
result.message,
)
is DownloadResult.Cancelled -> {
// User cancelled, no need to prompt.
// zh-CN: 用户取消, 无需提示.
}
}
}
suspend fun installFromUrl(context: Context, url: String, expectedSha256: String? = null) {
val result = downloadWithProgress(context, url, expectedSha256)
if (result is DownloadResult.Success) {
installFromFileUri(context, result.uri)
} else if (result is DownloadResult.Failure) {
ErrorDialogActivity.showErrorDialog(context, result.titleRes, result.message)
}
}
// Probe URL size (HEAD).
// zh-CN: 探测 URL 大小 (HEAD).
suspend fun probeContentLength(url: String): Long? = withContext(Dispatchers.IO) {
val conn = (URL(url).openConnection() as HttpURLConnection).apply {
requestMethod = "HEAD"
connectTimeout = 12_000
readTimeout = 12_000
}
runCatching {
conn.connect()
val code = conn.responseCode
if (code in 200..299) {
val len = conn.getHeaderFieldLong("Content-Length", -1L)
if (len > 0) len else null
} else null
}.onFailure { conn.disconnect() }
.also { conn.disconnect() }
.getOrNull()
}
private suspend fun downloadWithProgress(
context: Context,
url: String,
expectedSha256: String?,
): DownloadResult {
val cancelFlag = AtomicBoolean(false)
val dialog = MaterialDialog.Builder(context)
.title(R.string.text_downloading)
.progress(false, 100, true)
.negativeText(R.string.text_cancel)
.negativeColorRes(R.color.dialog_button_default)
.onNegative { d, _ ->
cancelFlag.set(true)
d.getActionButton(DialogAction.NEGATIVE).isEnabled = false
}
.cancelable(false)
.autoDismiss(false)
.show()
dialog.setProgressNumberFormat(context.getString(R.string.text_half_ellipsis))
dialog.setProgress(0)
val progressBar = dialog.getProgressBar()
progressBar.setProgressTintList(ColorStateList.valueOf(context.getColor(R.color.dialog_progress_download_tint)))
progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(context.getColor(R.color.dialog_progress_download_bg_tint)))
try {
val cache = File(context.cacheDir, "plugin_dl").apply { if (!exists()) mkdirs() }
val name = guessFileName(url)
val out = File(cache, name)
val (len, sha256Hex) = withContext(Dispatchers.IO) {
val conn = (URL(url).openConnection() as HttpURLConnection).apply {
connectTimeout = 15_000
readTimeout = 30_000
}
conn.connect()
val code = conn.responseCode
if (code !in 200..299) throw HttpStatusException(code, conn.responseMessage ?: "HTTP error")
val total = conn.contentLengthLong.takeIf { it > 0 } ?: -1L
conn.inputStream.use { input ->
val md = MessageDigest.getInstance("SHA-256")
DigestInputStream(input, md).use { din ->
out.outputStream().use { fos ->
val buf = ByteArray(DEFAULT_BUFFER_SIZE)
var read: Int
var downloaded = 0L
var lastUpdateTs = 0L
while (true) {
if (cancelFlag.get()) throw CancellationException("User cancelled")
read = din.read(buf)
if (read == -1) break
fos.write(buf, 0, read)
downloaded += read
val now = System.currentTimeMillis()
if (total > 0 && (now - lastUpdateTs > 80)) {
val pct = ((downloaded * 100f) / total).coerceIn(0f, 100f)
withContext(Dispatchers.Main) {
dialog.setProgressNumberFormat(DownloadManager.getProgressMegaBytesFormat(
context,
downloaded.toFloat() / pow(2, 20),
total.toFloat() / pow(2, 20),
))
dialog.setProgress(pct.roundToInt())
}
lastUpdateTs = now
}
}
fos.flush()
}
}
val hex = md.digest().joinToString("") { "%02x".format(it) }
Pair(if (total > 0) total else out.length(), hex)
}
}
if (expectedSha256 != null && !expectedSha256.equals(sha256Hex, ignoreCase = true)) {
throw ChecksumMismatchException(expectedSha256, sha256Hex)
}
val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", out)
return DownloadResult.Success(uri, len, sha256Hex)
} catch (_: CancellationException) {
return DownloadResult.Cancelled
} catch (he: HttpStatusException) {
return DownloadResult.Failure(R.string.text_failed_to_retrieve, "HTTP ${he.code}: ${he.message}")
} catch (me: ChecksumMismatchException) {
return DownloadResult.Failure(R.string.text_integrity_verification_failed, context.getString(R.string.text_sha256_mismatch_multiline_expected_actual, me.expected, me.actual))
} catch (ioe: EOFException) {
return DownloadResult.Failure(R.string.text_failed_to_retrieve, "Unexpected EOF: ${ioe.message}")
} catch (ioe: IOException) {
return DownloadResult.Failure(R.string.text_failed_to_retrieve, "Network/IO error: ${ioe.message}")
} catch (e: SecurityException) {
return DownloadResult.Failure(R.string.text_failed_to_install, "Security error: ${e.message}")
} catch (e: Throwable) {
return DownloadResult.Failure(R.string.text_failed_to_retrieve, e.message ?: e.toString())
} finally {
dialog.dismiss()
}
}
private fun guessFileName(url: String): String {
val last = url.substringAfterLast('/').substringBefore('?')
require(last.isNotBlank()) { "Invalid url: $url" }
return if (last.endsWith(".apk", ignoreCase = true)) last else "$last.apk"
}
private data class HttpStatusException(val code: Int, override val message: String) : RuntimeException(message)
private data class ChecksumMismatchException(val expected: String, val actual: String) : RuntimeException("sha256 mismatch")
sealed interface DownloadResult {
data class Success(val uri: Uri, val length: Long, val sha256: String) : DownloadResult
data class Failure(val titleRes: Int, val message: String) : DownloadResult
data object Cancelled : DownloadResult
}
}

View File

@@ -0,0 +1,37 @@
package org.autojs.autojs.core.plugin.center
import android.content.Context
import androidx.core.content.edit
import org.autojs.autojs.app.GlobalAppContext
object PluginRecentStore {
private const val SP = "plugin_center_recent"
private val context by lazy { GlobalAppContext.get() }
fun setLastInstalled(packageName: String, ts: Long = System.currentTimeMillis()) {
context.getSharedPreferences(SP, Context.MODE_PRIVATE).edit {
putLong(keyInstalled(packageName), ts)
}
}
fun setLastUninstalled(packageName: String, ts: Long = System.currentTimeMillis()) {
context.getSharedPreferences(SP, Context.MODE_PRIVATE).edit {
putLong(keyUninstalled(packageName), ts)
}
}
fun getLastInstalled(packageName: String): Long? {
return context.getSharedPreferences(SP, Context.MODE_PRIVATE).getLong(keyInstalled(packageName), 0L).takeIf { it > 0 }
}
fun getLastUninstalled(packageName: String): Long? {
return context.getSharedPreferences(SP, Context.MODE_PRIVATE).getLong(keyUninstalled(packageName), 0L).takeIf { it > 0 }
}
private fun keyInstalled(packageName: String) = "key_\$_last_install_time_\$_$packageName"
private fun keyUninstalled(packageName: String) = "key_\$_last_uninstall_time_\$_$packageName"
}

View File

@@ -99,7 +99,7 @@ object PaddleOcrPluginHost {
suspend fun select(
context: Context,
// e.g. "paddle-ocr-v5"
// e.g. "paddle-ocr-pp-ocrv5"
engineId: String? = null,
// e.g. "paddle-ocr"
engine: String? = null,

View File

@@ -100,7 +100,7 @@ object Pref {
return null
}
val dt = DateTime(ts)
val fmt = DateTimeFormat.forPattern("yyyy/MM/dd HH:mm")
val fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm")
return fmt.print(dt)
}
@@ -313,9 +313,15 @@ object Pref {
@JvmStatic
fun putLong(@KeyRes keyRes: Int, value: Long) = sPref.edit { putLong(key(keyRes), value) }
@JvmStatic
fun putLong(key: String, value: Long) = sPref.edit { putLong(key, value) }
@JvmStatic
fun getLong(@KeyRes keyRes: Int, defValue: Long) = sPref.getLong(key(keyRes), defValue)
@JvmStatic
fun getLong(key: String, defValue: Long) = sPref.getLong(key, defValue)
@JvmStatic
fun putStringSet(@KeyRes keyRes: Int, values: MutableSet<String>) = sPref.edit { putStringSet(key(keyRes), values) }

View File

@@ -253,13 +253,13 @@ public class DownloadManager {
}
}
private String getProgressKiloBytesFormat(Context context, float readKiloBytes, float totalKiloBytes) {
public static String getProgressKiloBytesFormat(Context context, float readKiloBytes, float totalKiloBytes) {
return String.format(Language.getPrefLanguage().getLocale(),
context.getString(R.string.format_dialog_progress_number_format_kilo_bytes),
readKiloBytes, totalKiloBytes);
}
private String getProgressMegaBytesFormat(Context context, float readMegaBytes, float totalMegaBytes) {
public static String getProgressMegaBytesFormat(Context context, float readMegaBytes, float totalMegaBytes) {
return String.format(Language.getPrefLanguage().getLocale(),
context.getString(R.string.format_dialog_progress_number_format_mega_bytes),
readMegaBytes, totalMegaBytes);

View File

@@ -32,15 +32,16 @@ import org.autojs.autojs.runtime.api.AppUtils
import org.autojs.autojs.util.IntentUtils
import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ApkFileInfoDialogListItemBinding
import org.autojs.autojs6.databinding.ApkFileInfoDialogItemsBinding
import java.io.File
object ApkInfoDialogManager {
@JvmStatic
@JvmOverloads
@SuppressLint("SetTextI18n")
fun showApkInfoDialog(context: Context, apkFile: File) {
val binding = ApkFileInfoDialogListItemBinding.inflate(LayoutInflater.from(context))
fun showApkInfoDialog(context: Context, apkFile: File, builderApplier: (MaterialDialog.Builder.() -> Unit)? = null) {
val binding = ApkFileInfoDialogItemsBinding.inflate(LayoutInflater.from(context))
// Create an independent Scope for the Dialog, bind its lifecycle with the Dialog.
// zh-CN: 针对 Dialog 独立创建一个 Scope, 生命周期与 Dialog 绑定.
@@ -70,6 +71,7 @@ object ApkInfoDialogManager {
.negativeColorRes(R.color.dialog_button_default)
.neutralColorRes(R.color.dialog_button_hint)
.onNegative { materialDialog, _ -> materialDialog.dismiss() }
.also { builder -> builderApplier?.invoke(builder) }
.show()
.apply {
makeTextCopyable { titleView }
@@ -192,7 +194,7 @@ object ApkInfoDialogManager {
packageManager.getPackageArchiveInfo(apkFilePath, GET_META_DATA)
}.getOrNull()
private fun restoreEssentialViews(binding: ApkFileInfoDialogListItemBinding, context: Context) {
private fun restoreEssentialViews(binding: ApkFileInfoDialogItemsBinding, context: Context) {
listOf(
Triple(binding.labelNameLabel, binding.labelNameColon, binding.labelNameValue) to R.string.text_label_name,
Triple(binding.packageNameLabel, binding.packageNameColon, binding.packageNameValue) to R.string.apk_info_package_name,
@@ -211,7 +213,7 @@ object ApkInfoDialogManager {
}
}
private fun updateGuidelines(binding: ApkFileInfoDialogListItemBinding) {
private fun updateGuidelines(binding: ApkFileInfoDialogItemsBinding) {
val filteredBindings = listOf(
binding.labelNameLabel to binding.labelNameGuideline,
binding.packageNameLabel to binding.packageNameGuideline,

View File

@@ -71,7 +71,7 @@ public abstract class Task {
if (mTimedTask != null) {
long nextTime = mTimedTask.getNextTime(mContext);
return mContext.getString(R.string.text_next_run_time) + ": " +
DateTimeFormat.forPattern("yyyy/MM/dd HH:mm").print(nextTime);
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm").print(nextTime);
} else {
assert mIntentTask != null;
Integer desc = TimedTaskSettingActivity.ACTION_DESC_MAP.get(mIntentTask.getAction());

View File

@@ -1,9 +1,16 @@
package org.autojs.autojs.util
import android.content.Context
import android.net.Uri
import android.provider.OpenableColumns
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.autojs.autojs.project.ProjectConfig
import org.autojs.autojs.util.FileUtils.TYPE.Companion.TYPE_NAME_PREFIX_REGEX
import java.io.File
import java.util.function.Predicate
import java.util.zip.ZipFile
import java.util.zip.ZipInputStream
import kotlin.text.RegexOption.IGNORE_CASE
/**
@@ -39,6 +46,109 @@ object FileUtils {
}
}
@JvmStatic
fun probeApk(file: File): ApkProbeResult {
if (!file.isFile || file.length() < 4) {
return ApkProbeResult(false, false, false, false, false)
}
var zipReadable = false
var hasManifest = false
var hasDex = false
var hasArsc = false
var hasRes = false
try {
ZipFile(file).use { zip ->
zipReadable = true
val entries = zip.entries()
while (entries.hasMoreElements()) {
val e = entries.nextElement()
val name = e.name
when {
name.equals("AndroidManifest.xml", ignoreCase = false) -> hasManifest = true
name.equals("classes.dex", ignoreCase = false) -> hasDex = true
name.equals("resources.arsc", ignoreCase = false) -> hasArsc = true
// Must be a directory entry, or any entry starting with "res/".
// zh-CN: 需要是目录项, 或存在以 "res/" 开头的任何条目.
name.startsWith("res/") -> hasRes = true
}
if (hasManifest && (hasDex || hasArsc || hasRes)) break
}
}
} catch (_: Throwable) {
// Not a valid ZIP or failed to read.
// zh-CN: 不是合法 ZIP 或读取失败.
zipReadable = false
}
return ApkProbeResult(
isZipReadable = zipReadable,
hasAndroidManifest = hasManifest,
hasClassesDex = hasDex,
hasResourcesArsc = hasArsc,
hasResDir = hasRes,
)
}
@JvmStatic
fun isLikelyApk(file: File): Boolean = probeApk(file).isLikelyApk
@JvmStatic
fun isLikelyApk(context: Context, uri: Uri): Boolean {
context.contentResolver.openInputStream(uri)?.use { input ->
ZipInputStream(input).use { zis ->
var hasManifest = false
var hasDexOrArscOrRes = false
var entry = zis.nextEntry
while (entry != null) {
val name = entry.name
if (name == "AndroidManifest.xml") hasManifest = true
if (name == "classes.dex" || name == "resources.arsc" || name.startsWith("res/")) {
hasDexOrArscOrRes = true
}
if (hasManifest && hasDexOrArscOrRes) return true
entry = zis.nextEntry
}
}
}
return false
}
suspend fun Uri.toCacheFile(
context: Context,
subDir: String = "from_uri",
preferName: String? = null,
): File = withContext(Dispatchers.IO) {
val uri = this@toCacheFile
val dir = File(context.cacheDir, subDir).apply { if (!exists()) mkdirs() }
val finalName = preferName
?: run getNameFromMeta@{
context.contentResolver.query(
/* uri = */ uri,
/* projection = */ arrayOf(OpenableColumns.DISPLAY_NAME),
/* selection = */ null,
/* selectionArgs = */ null,
/* sortOrder = */ null,
)?.use { cursor ->
val idx = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
if (idx >= 0 && cursor.moveToFirst()) cursor.getString(idx) else null
}
}
?: uri.lastPathSegment?.substringAfterLast('/')
?: "temp_${System.currentTimeMillis()}"
val outFile = File(dir, finalName)
context.contentResolver.openInputStream(uri)?.use { input ->
outFile.outputStream().use { output ->
input.copyTo(output)
}
} ?: error("Unable to open input stream for uri: $uri")
outFile
}
private fun withRegexPrefix(regexGetter: () -> String) = TYPE_NAME_PREFIX_REGEX + regexGetter.invoke()
// @Hint by SuperMonster003 on Dec 1, 2024.
@@ -2907,7 +3017,8 @@ object FileUtils {
}
private fun File.isMpeg2TsLike(): Boolean {
@JvmStatic
fun File.isMpeg2TsLike(): Boolean {
val magicByte = 0x47.toByte()
val tsPacketSize = 188
return runCatching {
@@ -2921,29 +3032,35 @@ object FileUtils {
}.getOrElse { false }
}
private fun File.isTypeScriptLike(): Boolean {
@JvmStatic
fun File.isTypeScriptLike(): Boolean {
return checkStartsWith("function", "import", "export", "interface", "class")
}
private fun File.isObjectiveCLike(): Boolean {
@JvmStatic
fun File.isObjectiveCLike(): Boolean {
return checkContains("@interface", "@implementation", "#import")
}
private fun File.isMatlabLike(): Boolean {
@JvmStatic
fun File.isMatlabLike(): Boolean {
return checkStartsWith("function", "%", "end")
}
private fun File.isGenerateDataLike(): Boolean {
@JvmStatic
fun File.isGenerateDataLike(): Boolean {
return checkStartsWith("DATA", "INFO", "HEADER", "META", "RECORD", "BINARY")
|| checkContains("DATA_TYPE", "VERSION", "FORMAT")
}
private fun File.isWavefrontObjLike(): Boolean {
@JvmStatic
fun File.isWavefrontObjLike(): Boolean {
return checkContains("Wavefront", "mtllib", "3ds max")
|| checkRegex(Regex("^v\\s+-?\\d"))
}
private fun File.isVcdDataLike() = runCatching {
@JvmStatic
fun File.isVcdDataLike() = runCatching {
val riffMagicNumber = byteArrayOf(0x52, 0x49, 0x46, 0x46) // "RIFF"
this@isVcdDataLike.inputStream().use { inputStream ->
val buffer = ByteArray(4)
@@ -2952,7 +3069,8 @@ object FileUtils {
}
}.getOrElse { false }
private fun File.isBinArchiveLike() = runCatching {
@JvmStatic
fun File.isBinArchiveLike() = runCatching {
val zipMagicNumber = byteArrayOf(0x50.toByte(), 0x4B.toByte(), 0x03.toByte(), 0x04.toByte())
val gzipMagicNumber = byteArrayOf(0x1F.toByte(), 0x8B.toByte())
this@isBinArchiveLike.inputStream().use { inputStream ->
@@ -2966,7 +3084,8 @@ object FileUtils {
false
}.getOrElse { false }
private fun File.isBinDiscImageLike() = runCatching {
@JvmStatic
fun File.isBinDiscImageLike() = runCatching {
this@isBinDiscImageLike.inputStream().use { inputStream ->
val header = ByteArray(2048) // Read first sector
if (inputStream.read(header) != header.size) return false
@@ -2978,7 +3097,8 @@ object FileUtils {
}.getOrElse { false }
// Determines if a CUE file describes audio tracks
private fun File.isAudioCueSheetLike() = runCatching {
@JvmStatic
fun File.isAudioCueSheetLike() = runCatching {
this@isAudioCueSheetLike.useLines { lines ->
lines.any { line ->
line.contains(Regex("""(?i)FILE .* (\.wav|\.mp3|\.flac)""")) || // Checks for common audio extensions
@@ -2988,7 +3108,8 @@ object FileUtils {
}.getOrElse { false }
// Determines if a CUE file describes a disk image
private fun File.isDiskImageCueSheetLike() = runCatching {
@JvmStatic
fun File.isDiskImageCueSheetLike() = runCatching {
this@isDiskImageCueSheetLike.useLines { lines ->
lines.any { line ->
line.contains(Regex("""(?i)FILE .* (\.bin|\.iso)""")) || // Checks for common binary extensions
@@ -2998,7 +3119,8 @@ object FileUtils {
}.getOrElse { false }
// Determines if an M3U file is likely an audio playlist
private fun File.isAudioM3ULike() = runCatching {
@JvmStatic
fun File.isAudioM3ULike() = runCatching {
this@isAudioM3ULike.useLines { lines ->
lines.any { line ->
line.contains(Regex("""(?i)\.(mp3|wav|aac|flac|ape|m4a|ogg)$""")) // Checks for common audio file extensions
@@ -3007,7 +3129,8 @@ object FileUtils {
}.getOrElse { false }
// Determines if an M3U file is likely a video playlist
private fun File.isVideoM3ULike() = runCatching {
@JvmStatic
fun File.isVideoM3ULike() = runCatching {
this@isVideoM3ULike.useLines { lines ->
lines.any { line ->
line.contains(Regex("""(?i)\.(mp4|avi|mkv|mov|wmv|ts)$""")) // Checks for common video file extensions
@@ -3015,17 +3138,20 @@ object FileUtils {
}
}.getOrElse { false }
private fun File.isProguardConfigLike() = checkContains(
@JvmStatic
fun File.isProguardConfigLike() = checkContains(
"-injars", "-outjars", "-libraryjars", "-printmapping", "-overloadaggressively",
maxLinesToCheck = 200,
)
private fun File.isQmakeProjectLike() = checkContains(
@JvmStatic
fun File.isQmakeProjectLike() = checkContains(
"TEMPLATE", "TARGET", "CONFIG", "SOURCES", "HEADERS", "RESOURCES", "INCLUDEPATH", "LIBS", "DEFINES",
maxLinesToCheck = 200,
)
private fun File.isMarkdownMDLike() = runCatching {
@JvmStatic
fun File.isMarkdownMDLike() = runCatching {
this@isMarkdownMDLike.useLines { lines ->
lines.any { line ->
return@any line.startsWith("#")
@@ -3035,7 +3161,8 @@ object FileUtils {
}
}.getOrElse { false }
private fun File.isSegaMDLike() = runCatching {
@JvmStatic
fun File.isSegaMDLike() = runCatching {
this@isSegaMDLike.inputStream().use { inputStream ->
val header = ByteArray(512) // 假设 SEGA 游戏文件有特定的头部
if (inputStream.read(header) != header.size) return false
@@ -3048,7 +3175,8 @@ object FileUtils {
}.getOrElse { false }
// Function to check if a file is likely a macro based on scripting patterns found in samples
private fun File.isMacroFileLike(): Boolean {
@JvmStatic
fun File.isMacroFileLike(): Boolean {
return runCatching {
this.useLines { lines ->
lines.any { line ->
@@ -3069,7 +3197,8 @@ object FileUtils {
}
// Function to determine if a file is likely a Monkey's Audio (.ape) file
private fun File.isMonkeyAudioLike(): Boolean {
@JvmStatic
fun File.isMonkeyAudioLike(): Boolean {
return runCatching {
this.inputStream().use { inputStream ->
val header = ByteArray(4)
@@ -3082,7 +3211,8 @@ object FileUtils {
}.getOrElse { false }
}
private fun File.isEbuStlLike(): Boolean {
@JvmStatic
fun File.isEbuStlLike(): Boolean {
// EBU - Subtitling data exchange format
return runCatching {
this.inputStream().use { inputStream ->
@@ -3116,7 +3246,8 @@ object FileUtils {
}.getOrElse { false }
}
private fun File.isModelStlLike(): Boolean {
@JvmStatic
fun File.isModelStlLike(): Boolean {
return runCatching {
this.inputStream().use { inputStream ->
val header = ByteArray(80) // STL binary files start with an 80-byte header
@@ -3146,7 +3277,8 @@ object FileUtils {
}.getOrElse { false }
}
private fun File.isModel3dsLike(): Boolean {
@JvmStatic
fun File.isModel3dsLike(): Boolean {
return runCatching {
this.inputStream().use { inputStream ->
val header = ByteArray(2)
@@ -3158,7 +3290,8 @@ object FileUtils {
}.getOrElse { false }
}
private fun File.isNintendo3dsLike(): Boolean {
@JvmStatic
fun File.isNintendo3dsLike(): Boolean {
return runCatching {
this.inputStream().use { inputStream ->
val magicBytes = ByteArray(4)
@@ -3242,4 +3375,14 @@ object FileUtils {
*/
data class CandidateCriterion(val criterion: Predicate<File>, val weight: Int)
data class ApkProbeResult(
val isZipReadable: Boolean,
val hasAndroidManifest: Boolean,
val hasClassesDex: Boolean,
val hasResourcesArsc: Boolean,
val hasResDir: Boolean,
) {
val isLikelyApk = isZipReadable && hasAndroidManifest && (hasClassesDex || hasResourcesArsc || hasResDir)
}
}

View File

@@ -32,7 +32,7 @@ object TimeUtils {
@JvmStatic
@JvmOverloads
fun formatTimestamp(ts: Long, pattern: String = "yyyy/MM/dd HH:mm"): String {
fun formatTimestamp(ts: Long, pattern: String = "yyyy-MM-dd HH:mm"): String {
val dt = DateTime(ts)
val fmt = DateTimeFormat.forPattern(pattern)
return fmt.print(dt)

View File

@@ -11,11 +11,20 @@ import android.content.res.Configuration
import android.content.res.Configuration.UI_MODE_NIGHT_MASK
import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.ColorFilter
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuff.Mode.SRC_IN
import android.graphics.PorterDuffColorFilter
import android.graphics.Rect
import android.graphics.Shader
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
@@ -61,6 +70,7 @@ import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.StringUtils.key
import org.autojs.autojs6.R
import kotlin.math.floor
import kotlin.math.min
import kotlin.math.roundToInt
/**
@@ -623,6 +633,76 @@ object ViewUtils {
this.setColorsByColorLuminance(context, ThemeColorManager.colorPrimary)
}
fun ImageView.colorFilterWithDesaturateOrNull(isOn: Boolean, alpha: Float = 0.5F) {
if (isOn) {
this.colorFilter = null
} else {
this.colorFilterWithDesaturate(alpha)
}
}
fun ImageView.colorFilterWithDesaturate(alpha: Float = 0.5F) {
// Construct the desaturation matrix.
// zh-CN: 构造灰度矩阵.
val desaturate = ColorMatrix().apply { setSaturation(0f) }
// Construct the alpha scaling matrix.
// zh-CN: 构造透明度缩放矩阵.
val alphaMatrix = ColorMatrix().apply { setScale(1f, 1f, 1f, 0.5f) }
// Concatenate: first desaturate, then apply alpha.
// zh-CN: 叠加: 先灰度, 再透明度.
desaturate.postConcat(alphaMatrix)
this.colorFilter = ColorMatrixColorFilter(desaturate)
}
@JvmStatic
fun Drawable.toCircular(
context: Context,
sizePx: Int,
borderWidthPx: Int = 0,
borderColor: Int = Color.TRANSPARENT,
): Drawable {
val src = this
val bmp = Bitmap.createBitmap(sizePx, sizePx, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bmp)
// First stretch/center draw the source drawable to sizePx * sizePx bitmap.
// zh-CN: 先把源 drawable 拉伸/居中绘制到 sizePx * sizePx 的位图上.
val tmp = Bitmap.createBitmap(sizePx, sizePx, Bitmap.Config.ARGB_8888)
Canvas(tmp).apply {
val w = src.intrinsicWidth.takeIf { it > 0 } ?: sizePx
val h = src.intrinsicHeight.takeIf { it > 0 } ?: sizePx
val scale = min(sizePx / w.toFloat(), sizePx / h.toFloat())
val dw = (w * scale).roundToInt()
val dh = (h * scale).roundToInt()
val left = (sizePx - dw) / 2
val top = (sizePx - dh) / 2
src.setBounds(left, top, left + dw, top + dh)
src.draw(this)
}
// Draw circle using BitmapShader.
// zh-CN: 用 BitmapShader 画圆.
val shader = BitmapShader(tmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DITHER_FLAG).apply {
this.shader = shader
}
val radius = sizePx / 2f
val contentRadius = radius - borderWidthPx.coerceAtLeast(0)
canvas.drawCircle(radius, radius, contentRadius, paint)
// Optional stroke.
// zh-CN: 可选描边.
if (borderWidthPx > 0) {
val stroke = Paint(Paint.ANTI_ALIAS_FLAG).apply {
style = Paint.Style.STROKE
color = borderColor
strokeWidth = borderWidthPx.toFloat()
}
canvas.drawCircle(radius, radius, radius - borderWidthPx / 2f, stroke)
}
return BitmapDrawable(context.resources, bmp)
}
@JvmStatic
fun setSearchViewColorsByColorLuminance(context: Context, searchView: SearchView, aimColor: Int) {
searchView.setColorsByColorLuminance(context, aimColor)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:popupTheme="@style/Widget.AppCompat.PopupMenu">
<item
android:icon="@drawable/ic_add_black_48dp"
android:title="@string/text_install"
app:showAsAction="always">
<menu>
<item
android:id="@+id/action_install_from_local_file"
android:title="@string/text_install_from_local_file" />
<item
android:id="@+id/action_install_from_url"
android:title="@string/text_install_from_url" />
</menu>
</item>
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_search_smaller_black_48dp"
android:title="@string/text_search"
app:showAsAction="always" />
<item
android:id="@+id/action_sort"
android:title="@string/text_sort"
app:showAsAction="never" />
<item
android:id="@+id/action_filter"
android:title="@string/text_filter"
app:showAsAction="never" />
<item
android:id="@+id/action_global_settings"
android:title="@string/text_global_settings"
app:showAsAction="never" />
</menu>

View File

@@ -112,6 +112,7 @@
<string name="dialog_button_open_color_palette">فتح لوحة الألوان</string>
<string name="dialog_button_quit">يترك</string>
<string name="dialog_button_remove">إزالة</string>
<string name="dialog_button_retrieve">جلب</string>
<string name="dialog_button_retry">إعادة المحاولة</string>
<string name="dialog_button_save">يحفظ</string>
<string name="dialog_button_system_settings">اعدادات النظام</string>
@@ -303,6 +304,7 @@
<string name="hint_long_click_run_to_debug">انقر الطويل على زر \"تشغيل\" لتصحيح الأخطاء</string>
<string name="hint_loop_delay">تأخير قبل الحلقة</string>
<string name="hint_loop_times">0 للحلقة اللانهائية</string>
<string name="instruction_install_plugin_from_url">أدخل عنوان URL يشير إلى ملحق (Plugin) بعيد.\nمثال: \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">آخر استخدام: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">فشل خيط \"blob"\</string>
<string name="logger_ver_history_blob_thread_success">نجح خيط \"blob"\ وجرى حفظ التخزين المؤقت دون اتصال</string>
@@ -339,7 +341,17 @@
<string name="mt_custom">العادة</string>
<string name="no_apk_builder_plugin">لم يتم تثبيت منشئ APK</string>
<string name="no_root_access_for_record">لا يتمتع AutoJs6 بالوصول إلى الجذر لتسجيل البرنامج النصي</string>
<string name="plugin_item_info_author">المؤلف</string>
<string name="plugin_item_info_collaborators">المتعاونون</string>
<string name="plugin_item_info_first_install_time">أول تثبيت</string>
<string name="plugin_item_info_installed_version">الإصدار المثبّت</string>
<string name="plugin_item_info_last_install_time">آخر تثبيت</string>
<string name="plugin_item_info_last_uninstall_time">آخر إزالة</string>
<string name="plugin_item_info_last_update_time">آخر تحديث</string>
<string name="plugin_item_info_package_size">حجم الحزمة</string>
<string name="plugin_item_info_updatable_version">إصدار متاح</string>
<string name="prompt_add_ignored_version">هل أنت متأكد من تجاهل إصدار التحديث الحالي؟\nيمكنك إدارة جميع الإصدارات التي تم تجاهلها بواسطة إعدادات التطبيق.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">قد لا يكون الملف الحالي حزمة ملحق صالحة. هل تريد المتابعة بالتثبيت؟\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">هناك حاجة إلى إعادة تشغيل التطبيق لتطبيق إعدادات جديدة</string>
<string name="prompt_restart_may_be_needed_for_language_switch">قد تكون هناك حاجة إلى إعادة تشغيل التطبيق لجعل اللغة مطبقًا كما هو متوقع</string>
<string name="screen_capturer_foreground_notification_channel_name">شاشة كابتوري فريجرونيد خدمة</string>
@@ -435,6 +447,8 @@
<string name="text_app_shortcut_docs_short_label">توثيق</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 سجل</string>
<string name="text_app_shortcut_log_short_label">سجل</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 إعدادات</string>
<string name="text_app_shortcut_settings_short_label">إعدادات</string>
<string name="text_app_source_code">مصدر الرمز</string>
@@ -483,9 +497,11 @@
<string name="text_clear_file_selection">مسح اختيار الملف</string>
<string name="text_clear_pre_execute_script">مسح السيناريو قبل التنفيذ</string>
<string name="text_clear_updates_checked_states">تحديثات مسح الحالات التي تم فحصها</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">انقر فوق العنصر لإزالته</string>
<string name="text_click_item_to_show_details">اضغط على العنصر لعرض التفاصيل</string>
<string name="text_click_ok_to_go_to_settings">انقر فوق \"نعم\" للانتقال إلى الإعدادات</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">التشغيل المتكرر</string>
<string name="text_client_mode">وضع العميل</string>
<string name="text_clone_color_library">استنساخ مكتبة ألوان</string>
@@ -542,6 +558,7 @@
<string name="text_delete">حذف</string>
<string name="text_delete_all">حذف الكل</string>
<string name="text_delete_line">حذف الخط</string>
<string name="text_description">الوصف</string>
<string name="text_details">تفاصيل</string>
<string name="text_developer_details_under_development">تفاصيل المطور قيد التطوير</string>
<string name="text_developer_options">خيارات للمطور</string>
@@ -555,6 +572,7 @@
<string name="text_device_screen_resolution">دقّة شاشة الجهاز</string>
<string name="text_directly_download">التحميل الان</string>
<string name="text_directory">الدليل</string>
<string name="text_disabled">معطّل</string>
<string name="text_display_over_other_app">عرض على تطبيقات أخرى</string>
<string name="text_display_over_other_app_is_recommended">يوصى بإذن \"العرض عبر التطبيقات الأخرى\" لعرض جميع عناصر واجهة المستخدم بشكل صحيح</string>
<string name="text_disposable_task">مهمة يمكن التخلص منها</string>
@@ -587,6 +605,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">تمكين خدمة إمكانية الوصول مع توقيت الوصول إلى الجذر</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">تمكين خدمة إمكانية الوصول مع إعدادات آمنة تلقائيًا</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">تمكين خدمة إمكانية الوصول مع إعدادات آمنة</string>
<string name="text_enable_plugin">تفعيل الملحق</string>
<string name="text_enabled">مفعّل</string>
<string name="text_error">خطأ</string>
<string name="text_error_copy_file" formatted="true">فشل نسخ الملف: %s</string>
<string name="text_error_report">تقرير الشوائب</string>
@@ -617,10 +637,12 @@
<string name="text_failed_to_grant_access">فشل في منح الوصول</string>
<string name="text_failed_to_grant_draw_overlays_permission">فشل في منح الشاشة على إذن التطبيقات الأخرى</string>
<string name="text_failed_to_import">فشل في الاستيراد</string>
<string name="text_failed_to_install">فشل التثبيت</string>
<string name="text_failed_to_locate">فشل في تحديد الموقع</string>
<string name="text_failed_to_login">فشل في تسجيل الدخول</string>
<string name="text_failed_to_register">فشل في تسجيل</string>
<string name="text_failed_to_report">فشل في تقديم</string>
<string name="text_failed_to_retrieve">فشل الجلب</string>
<string name="text_failed_to_save_remote_project_to_local_storage">فشل حفظ المشروع البعيد في التخزين المحلي</string>
<string name="text_failed_to_send_log_entries">فشل في إرسال إدخالات السجل</string>
<string name="text_failed_to_write_file">فشل في كتابة الملف</string>
@@ -637,6 +659,7 @@
<string name="text_filename_cannot_contain_invalid_character">اسم الملف لا يمكن أن يحتوي على أي من الأحرف التالية: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">اسم الملف طويل جدًا</string>
<string name="text_files_transfer">نقل الملفات</string>
<string name="text_filter">تصفية</string>
<string name="text_find">تجد</string>
<string name="text_find_java_classes">العثور على فصول جافا</string>
<string name="text_find_next_simplified">التالي</string>
@@ -655,6 +678,7 @@
<string name="text_generated_code">رمز تم إنشاؤه</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">استرداد ملاحظات الإصدار ...</string>
<string name="text_github_backup_url_used">تم استخدام عنوان URL للنسخ الاحتياطي</string>
<string name="text_global_settings">إعدادات عامة</string>
<string name="text_go_to_settings">اذهب للاعدادات\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">منح الوصول إلى AutoJs6 في تطبيق Shizuku</string>
<string name="text_granted">ممنوح</string>
@@ -682,6 +706,10 @@
<string name="text_inspect_layout_bounds">فحص حدود التصميم</string>
<string name="text_inspect_layout_hierarchy">فحص التسلسل الهرمي للتخطيط</string>
<string name="text_install">تثبيت</string>
<string name="text_install_from_local_file">التثبيت من \"ملف محلي\"</string>
<string name="text_install_from_url">التثبيت من \"URL\"</string>
<string name="text_install_plugin_from_url">تثبيت الملحق من \"URL\"</string>
<string name="text_installable">قابل للتثبيت</string>
<string name="text_invalid_character_is_removed">تمت إزالة حرف غير صالح</string>
<string name="text_invalid_package_name">اسم الحزمة غير صالح</string>
<string name="text_invalid_project">مشروع غير صالح</string>
@@ -701,6 +729,7 @@
<string name="text_key_store_has_not_been_verified">لم يتم التحقق من المخزن</string>
<string name="text_key_store_password">كلمة مرور مخزن المفاتيح</string>
<string name="text_label_name">ملصق</string>
<string name="text_label_state">الحالة</string>
<string name="text_last_updates_checked_time">آخر فحص: %s</string>
<string name="text_latest_activity">النشاط الاخير</string>
<string name="text_latest_package">أحدث حزمة</string>
@@ -879,6 +908,9 @@
<string name="text_please_input_name">اسم الإدخال</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">الرجاء الانتظار...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">يرجى المحاولة مرة أخرى لاحقًا...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">تفاصيل الملحق</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">موقع المؤشر</string>
<string name="text_pointer_location_toggle_failed_with_hint">فشل تبديل \"موقع المؤشر\".\nالوصول إلى الجذر مطلوب.</string>
<string name="text_post_notifications_permission">نشر الإخطارات</string>
@@ -994,6 +1026,7 @@
<string name="text_signature_scheme">خطة التوقيع</string>
<string name="text_size">مقاس</string>
<string name="text_some_items_exported">تم تصدير %d من العناصر</string>
<string name="text_sort">فرز</string>
<string name="text_source_file_path">مسار رمز المصدر</string>
<string name="text_special_permissions">أذونات خاصة</string>
<string name="text_stable_mode">وضع مستقر</string>
@@ -1035,8 +1068,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">الغاء التحميل</string>
<string name="text_undo_simplified">ينسحب</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">غير معروف</string>
<string name="text_unverified">لم يتم التحقق</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">التحديثات</string>
<string name="text_updates_checked_states_cleared">تم مسح الحالات التي تم فحصها</string>
<string name="text_updates_snack_bar_act_later">في وقت لاحق</string>
@@ -1079,14 +1115,8 @@
<string name="text_write_secure_settings">اكتب إعدادات الأمان</string>
<string name="text_write_secure_settings_description">إعدادات النظام الآمنة ، التي تحتوي على تفضيلات النظام التي يمكن أن تقرأها التطبيقات ولكن لا يُسمح لها بالكتابة.\nهذه هي لتفضيلات يجب على المستخدم تعديلها بشكل صريح من خلال واجهة المستخدم لتطبيق النظام.\nمع إذن إعدادات النظام الآمن ، يمكن للتطبيقات العادية تعديل الإعدادات الآمنة مباشرة (مثل خدمة إمكانية الوصول).</string>
<string name="text_write_system_settings">كتابة إعدادات النظام</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">فشل التحقق من السلامة</string>
<string name="text_sha256_mismatch_multiline_expected_actual">عدم تطابق SHA-256.\n\nالمتوقّع: %1$s\nالفعلي: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">لم يتم توفير عنوان URL متاح للملحق الحالي</string>
</resources>

View File

@@ -107,6 +107,7 @@
<string name="dialog_button_open_color_palette">Palette</string>
<string name="dialog_button_quit">Quit</string>
<string name="dialog_button_remove">Remove</string>
<string name="dialog_button_retrieve">Retrieve</string>
<string name="dialog_button_retry">Retry</string>
<string name="dialog_button_save">Save</string>
<string name="dialog_button_system_settings">System settings</string>
@@ -298,6 +299,7 @@
<string name="hint_long_click_run_to_debug">Long click \"Run\" button to debug</string>
<string name="hint_loop_delay">Delay before loop</string>
<string name="hint_loop_times">0 for infinite loop</string>
<string name="instruction_install_plugin_from_url">Enter a URL pointing to a remote plugin address.\nFor example \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">Latest used: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" thread request failed</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" thread request successful, writing offline cache</string>
@@ -334,7 +336,17 @@
<string name="mt_custom">Custom</string>
<string name="no_apk_builder_plugin">APK Builder is not installed</string>
<string name="no_root_access_for_record">AutoJs6 has no root access to record a script</string>
<string name="plugin_item_info_author">Author</string>
<string name="plugin_item_info_collaborators">Collaborators</string>
<string name="plugin_item_info_first_install_time">First install</string>
<string name="plugin_item_info_installed_version">Installed ver.</string>
<string name="plugin_item_info_last_install_time">Last install</string>
<string name="plugin_item_info_last_uninstall_time">Last uninstall</string>
<string name="plugin_item_info_last_update_time">Last update</string>
<string name="plugin_item_info_package_size">Package size</string>
<string name="plugin_item_info_updatable_version">Updatable ver.</string>
<string name="prompt_add_ignored_version">Are you sure to ignore current update version?\nYou can manage all ignored versions by app settings.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">The current file may not be a valid plugin package, do you want to continue with installation?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">An app restart is needed to apply new settings</string>
<string name="prompt_restart_may_be_needed_for_language_switch">An app restart may be needed to make language applied as expected</string>
<string name="screen_capturer_foreground_notification_channel_name">Screen capturer foreground service</string>
@@ -430,6 +442,8 @@
<string name="text_app_shortcut_docs_short_label">Docs</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 Log</string>
<string name="text_app_shortcut_log_short_label">Log</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 Settings</string>
<string name="text_app_shortcut_settings_short_label">Settings</string>
<string name="text_app_source_code">Source code</string>
@@ -478,9 +492,11 @@
<string name="text_clear_file_selection">Clear file selection</string>
<string name="text_clear_pre_execute_script">Clear pre-execute script</string>
<string name="text_clear_updates_checked_states">Clear updates checked states</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">Click the item to remove</string>
<string name="text_click_item_to_show_details">Click an item to view details</string>
<string name="text_click_ok_to_go_to_settings">Click \"OK\" to go to settings</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">Frequent operation</string>
<string name="text_client_mode">Client mode</string>
<string name="text_clone_color_library">Clone a color library</string>
@@ -537,6 +553,7 @@
<string name="text_delete">Delete</string>
<string name="text_delete_all">Delete All</string>
<string name="text_delete_line">Delete line</string>
<string name="text_description">Description</string>
<string name="text_details">Details</string>
<string name="text_developer_details_under_development">Developer details is under development</string>
<string name="text_developer_options">Developer options</string>
@@ -550,6 +567,7 @@
<string name="text_device_screen_resolution">Device screen resolution</string>
<string name="text_directly_download">Download now</string>
<string name="text_directory">Directory</string>
<string name="text_disabled">Disabled</string>
<string name="text_display_over_other_app">Display over other apps</string>
<string name="text_display_over_other_app_is_recommended">\"Display over other apps\" permission is recommended to make all widgets displayed properly</string>
<string name="text_disposable_task">Disposable task</string>
@@ -582,6 +600,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">Enable accessibility service with root access timed out</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">Enable accessibility service with secure settings automatically</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">Enable accessibility service with secure settings timed out</string>
<string name="text_enable_plugin">Enable plugin</string>
<string name="text_enabled">Enabled</string>
<string name="text_error">Error</string>
<string name="text_error_copy_file" formatted="true">Failed to copy file: %s</string>
<string name="text_error_report">Bug report</string>
@@ -612,10 +632,12 @@
<string name="text_failed_to_grant_access">Failed to grant access</string>
<string name="text_failed_to_grant_draw_overlays_permission">Failed to grant display over other apps permission</string>
<string name="text_failed_to_import">Failed to import</string>
<string name="text_failed_to_install">Failed to install</string>
<string name="text_failed_to_locate">Failed to locate</string>
<string name="text_failed_to_login">Failed to login</string>
<string name="text_failed_to_register">Failed to register</string>
<string name="text_failed_to_report">Failed to submit</string>
<string name="text_failed_to_retrieve">Failed to retrieve</string>
<string name="text_failed_to_save_remote_project_to_local_storage">Failed to save remote project to local storage</string>
<string name="text_failed_to_send_log_entries">Failed to send log entries</string>
<string name="text_failed_to_write_file">Failed to write file</string>
@@ -632,6 +654,7 @@
<string name="text_filename_cannot_contain_invalid_character">Filename cannot contain the following characters: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">Filename is too long</string>
<string name="text_files_transfer">Files transfer</string>
<string name="text_filter">Filter</string>
<string name="text_find">Find</string>
<string name="text_find_java_classes">Find Java classes</string>
<string name="text_find_next_simplified">Next</string>
@@ -650,6 +673,7 @@
<string name="text_generated_code">Generated code</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">Retrieving release notes...</string>
<string name="text_github_backup_url_used">Backup URL has been used</string>
<string name="text_global_settings">Global settings</string>
<string name="text_go_to_settings">Go to \"Settings\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Grant AutoJs6 access in Shizuku app</string>
<string name="text_granted">Granted</string>
@@ -677,6 +701,10 @@
<string name="text_inspect_layout_bounds">Inspect layout bounds</string>
<string name="text_inspect_layout_hierarchy">Inspect layout hierarchy</string>
<string name="text_install">Install</string>
<string name="text_install_from_local_file">Install from \"Local File\"</string>
<string name="text_install_from_url">Install from \"URL\"</string>
<string name="text_install_plugin_from_url">Install plugin from \"URL\"</string>
<string name="text_installable">Installable</string>
<string name="text_invalid_character_is_removed">Invalid character is removed</string>
<string name="text_invalid_package_name">Invalid package name</string>
<string name="text_invalid_project">Invalid project</string>
@@ -696,6 +724,7 @@
<string name="text_key_store_has_not_been_verified">Keystore has not been verified</string>
<string name="text_key_store_password">Key Store Password</string>
<string name="text_label_name">Label</string>
<string name="text_label_state">State</string>
<string name="text_last_updates_checked_time">Last checked: %s</string>
<string name="text_latest_activity">Latest activity</string>
<string name="text_latest_package">Latest package</string>
@@ -874,6 +903,9 @@
<string name="text_please_input_name">Input name</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Please wait...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">Please wait a moment before trying again...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">Plugin details</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">Pointer location</string>
<string name="text_pointer_location_toggle_failed_with_hint">Toggle \"pointer location\" failed.\nRoot access is required.</string>
<string name="text_post_notifications_permission">Post notifications</string>
@@ -989,6 +1021,7 @@
<string name="text_signature_scheme">Signature Scheme</string>
<string name="text_size">Size</string>
<string name="text_some_items_exported">%d items exported</string>
<string name="text_sort">Sort</string>
<string name="text_source_file_path">Source code path</string>
<string name="text_special_permissions">Special permissions</string>
<string name="text_stable_mode">Stable mode</string>
@@ -1030,8 +1063,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">Undo</string>
<string name="text_undo_simplified">Undo</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">Unknown</string>
<string name="text_unverified">Unverified</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">Updates</string>
<string name="text_updates_checked_states_cleared">Updates checked states cleared</string>
<string name="text_updates_snack_bar_act_later">Later</string>
@@ -1074,14 +1110,8 @@
<string name="text_write_secure_settings">Write security settings</string>
<string name="text_write_secure_settings_description">Secure system settings, containing system preferences that applications can read but are not allowed to write.\nThese are for preferences that the user must explicitly modify through the UI of a system app.\nWith secure system settings permission, normal applications can directly modify the secure settings (such as accessibility service).</string>
<string name="text_write_system_settings">Write system settings</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">Integrity verification failed</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 mismatch.\n\nExpected: %1$s\nActual: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">No available URL provided for current plugin</string>
</resources>

View File

@@ -110,6 +110,7 @@
<string name="dialog_button_open_color_palette">Abrir paleta</string>
<string name="dialog_button_quit">Salir</string>
<string name="dialog_button_remove">Eliminar</string>
<string name="dialog_button_retrieve">Obtener</string>
<string name="dialog_button_retry">Reintentar</string>
<string name="dialog_button_save">Guardar</string>
<string name="dialog_button_system_settings">Configuración del sistema</string>
@@ -301,6 +302,7 @@
<string name="hint_long_click_run_to_debug">Haga un clic largo en el botón \"Ejecutar\" para depurar</string>
<string name="hint_loop_delay">Retraso antes del bucle</string>
<string name="hint_loop_times">0 para bucle infinito</string>
<string name="instruction_install_plugin_from_url">Introduce una URL que apunte a la dirección de un complemento remoto.\nPor ejemplo, \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">Último uso: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">Hilo \"blob\" fallido</string>
<string name="logger_ver_history_blob_thread_success">Hilo \"blob\" exitoso, escribiendo caché sin conexión</string>
@@ -337,7 +339,17 @@
<string name="mt_custom">Personalizado</string>
<string name="no_apk_builder_plugin">APK Builder no está instalado</string>
<string name="no_root_access_for_record">AutoJs6 no tiene acceso a la raíz para grabar un script</string>
<string name="plugin_item_info_author">Autor</string>
<string name="plugin_item_info_collaborators">Colaboradores</string>
<string name="plugin_item_info_first_install_time">Primera inst.</string>
<string name="plugin_item_info_installed_version">Vers. inst.</string>
<string name="plugin_item_info_last_install_time">Última inst.</string>
<string name="plugin_item_info_last_uninstall_time">Última desinst.</string>
<string name="plugin_item_info_last_update_time">Última act.</string>
<string name="plugin_item_info_package_size">Tamaño paquete</string>
<string name="plugin_item_info_updatable_version">Vers. actualiz.</string>
<string name="prompt_add_ignored_version">¿Está seguro de ignorar la versión actual de la actualización?\nPuedes gestionar todas las versiones ignoradas en los ajustes de la aplicación.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">El archivo actual puede no ser un paquete de complemento válido. ¿Deseas continuar con la instalación?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">Es necesario reiniciar la aplicación para aplicar los nuevos ajustes</string>
<string name="prompt_restart_may_be_needed_for_language_switch">Puede ser necesario reiniciar la aplicación para que el idioma se aplique como se espera</string>
<string name="screen_capturer_foreground_notification_channel_name">Servicio de primer plano del capturador de pantalla</string>
@@ -433,6 +445,8 @@
<string name="text_app_shortcut_docs_short_label">Docs</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 Registrar</string>
<string name="text_app_shortcut_log_short_label">Registrar</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 Configuración</string>
<string name="text_app_shortcut_settings_short_label">Configuración</string>
<string name="text_app_source_code">Código fuente</string>
@@ -481,9 +495,11 @@
<string name="text_clear_file_selection">Borrar selección de archivos</string>
<string name="text_clear_pre_execute_script">Borrar script de pre-ejecución</string>
<string name="text_clear_updates_checked_states">Borrar los estados de comprobación de las actualizaciones</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">Haga clic en el elemento a eliminar</string>
<string name="text_click_item_to_show_details">Toca un elemento para ver los detalles</string>
<string name="text_click_ok_to_go_to_settings">Haga clic en \"Aceptar\" para ir a la configuración</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">Funcionamiento frecuente</string>
<string name="text_client_mode">Modo cliente</string>
<string name="text_clone_color_library">Clonar biblioteca de colores</string>
@@ -540,6 +556,7 @@
<string name="text_delete">Borrar</string>
<string name="text_delete_all">Eliminar todo</string>
<string name="text_delete_line">Borrar línea</string>
<string name="text_description">Descripción</string>
<string name="text_details">Detalles</string>
<string name="text_developer_details_under_development">Los detalles del desarrollador están en desarrollo</string>
<string name="text_developer_options">Opciones del desarrollador</string>
@@ -553,6 +570,7 @@
<string name="text_device_screen_resolution">Resolución de pantalla del dispositivo</string>
<string name="text_directly_download">Descargar ahora</string>
<string name="text_directory">Directorio</string>
<string name="text_disabled">Desactivado</string>
<string name="text_display_over_other_app">Mostrar sobre otras aplicaciones</string>
<string name="text_display_over_other_app_is_recommended">Se recomienda el permiso \"Mostrar sobre otras aplicaciones\" para que todos los widgets se muestren correctamente</string>
<string name="text_disposable_task">Tarea desechable</string>
@@ -585,6 +603,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">Habilitar el servicio de accesibilidad con acceso a la raíz con tiempo de espera</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">Habilitar el servicio de accesibilidad con configuración segura automáticamente</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">Habilitación del servicio de accesibilidad con configuración segura agotada</string>
<string name="text_enable_plugin">Activar complemento</string>
<string name="text_enabled">Activado</string>
<string name="text_error">Error</string>
<string name="text_error_copy_file" formatted="true">No se ha podido copiar el archivo: %s</string>
<string name="text_error_report">Informe de error</string>
@@ -615,10 +635,12 @@
<string name="text_failed_to_grant_access">Fallo al conceder el acceso</string>
<string name="text_failed_to_grant_draw_overlays_permission">Fallo al conceder el permiso de visualización sobre otras aplicaciones</string>
<string name="text_failed_to_import">Fallo en la importación</string>
<string name="text_failed_to_install">Error al instalar</string>
<string name="text_failed_to_locate">No se pudo localizar</string>
<string name="text_failed_to_login">Fallo en el inicio de sesión</string>
<string name="text_failed_to_register">Fallo en el registro</string>
<string name="text_failed_to_report">Fallo al enviar</string>
<string name="text_failed_to_retrieve">Error al obtener</string>
<string name="text_failed_to_save_remote_project_to_local_storage">Error al guardar el proyecto remoto en el almacenamiento local</string>
<string name="text_failed_to_send_log_entries">Error al enviar entradas de registro</string>
<string name="text_failed_to_write_file">Fallo al escribir el archivo</string>
@@ -635,6 +657,7 @@
<string name="text_filename_cannot_contain_invalid_character">El nombre del archivo no puede contener ninguno de los siguientes caracteres: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">El nombre del archivo es demasiado largo</string>
<string name="text_files_transfer">Transferencia de archivos</string>
<string name="text_filter">Filtrar</string>
<string name="text_find">Buscar</string>
<string name="text_find_java_classes">Buscar clases Java</string>
<string name="text_find_next_simplified">Sigui</string>
@@ -653,6 +676,7 @@
<string name="text_generated_code">Código generado</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">Recuperando las notas de la versión...</string>
<string name="text_github_backup_url_used">Se ha utilizado la URL de copia de seguridad</string>
<string name="text_global_settings">Ajustes globales</string>
<string name="text_go_to_settings">Ir a \"Configuración\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Conceder privilegios AutoJs6 en una aplicación Shizuku</string>
<string name="text_granted">Concedido</string>
@@ -680,6 +704,10 @@
<string name="text_inspect_layout_bounds">Inspeccionar los límites del diseño</string>
<string name="text_inspect_layout_hierarchy">Inspeccionar la jerarquía del diseño</string>
<string name="text_install">Instalar</string>
<string name="text_install_from_local_file">Instalar desde \"Archivo local\"</string>
<string name="text_install_from_url">Instalar desde \"URL\"</string>
<string name="text_install_plugin_from_url">Instalar complemento desde \"URL\"</string>
<string name="text_installable">Instalable</string>
<string name="text_invalid_character_is_removed">Carácter inválido ha sido removido</string>
<string name="text_invalid_package_name">Nombre de paquete no válido</string>
<string name="text_invalid_project">Proyecto no válido</string>
@@ -699,6 +727,7 @@
<string name="text_key_store_has_not_been_verified">El almacén de claves no ha sido verificado</string>
<string name="text_key_store_password">Contraseña del almacén de claves</string>
<string name="text_label_name">Etiqueta</string>
<string name="text_label_state">Estado</string>
<string name="text_last_updates_checked_time">Última comprobación: %s</string>
<string name="text_latest_activity">Última actividad</string>
<string name="text_latest_package">Último paquete</string>
@@ -877,6 +906,9 @@
<string name="text_please_input_name">Nombre de entrada</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Por favor, espere...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">Por favor, inténtalo de nuevo más tarde...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">Detalles del complemento</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">Ubicación del puntero</string>
<string name="text_pointer_location_toggle_failed_with_hint">Falló la conmutación de la \"ubicación del puntero\".\nSe requiere acceso a la raíz.</string>
<string name="text_post_notifications_permission">Notificaciones postales</string>
@@ -992,6 +1024,7 @@
<string name="text_signature_scheme">Esquema de firma</string>
<string name="text_size">Tamaño</string>
<string name="text_some_items_exported">%d elementos exportados</string>
<string name="text_sort">Ordenar</string>
<string name="text_source_file_path">Ruta del código fuente</string>
<string name="text_special_permissions">Permisos especiales</string>
<string name="text_stable_mode">Modo estable</string>
@@ -1033,8 +1066,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">Revocar</string>
<string name="text_undo_simplified">Revoc</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">Desconocido</string>
<string name="text_unverified">No verificado</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">Actualizaciones</string>
<string name="text_updates_checked_states_cleared">Actualizaciones comprobadas estados borrados</string>
<string name="text_updates_snack_bar_act_later">Más adelante</string>
@@ -1077,14 +1113,8 @@
<string name="text_write_secure_settings">Escribir la configuración de seguridad</string>
<string name="text_write_secure_settings_description">Ajustes de seguridad del sistema, que contienen preferencias del sistema que las aplicaciones pueden leer pero no pueden escribir.\nSe trata de preferencias que el usuario debe modificar explícitamente a través de la interfaz de usuario de una aplicación del sistema.\nCon el permiso de configuración segura del sistema, las aplicaciones normales pueden modificar directamente la configuración segura (como el servicio de accesibilidad).</string>
<string name="text_write_system_settings">Escribir la configuración del sistema</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_sha256_mismatch_multiline_expected_actual">Discordancia de SHA-256.\n\nEsperado: %1$s\nReal: %2$s</string>
<string name="text_integrity_verification_failed">La verificación de integridad falló</string>
<string name="error_no_available_url_provided_for_current_plugin">No se proporcionó ninguna URL disponible para el complemento actual</string>
</resources>

View File

@@ -110,6 +110,7 @@
<string name="dialog_button_open_color_palette">Palette</string>
<string name="dialog_button_quit">Quit</string>
<string name="dialog_button_remove">Supprimer</string>
<string name="dialog_button_retrieve">Récupérer</string>
<string name="dialog_button_retry">Retourner</string>
<string name="dialog_button_save">Enregistrer</string>
<string name="dialog_button_system_settings">Paramètres du système</string>
@@ -301,6 +302,7 @@
<string name="hint_long_click_run_to_debug">Cliquez longuement sur le bouton \"Run\" pour déboguer</string>
<string name="hint_loop_delay">Délai avant boucle</string>
<string name="hint_loop_times">0 pour une boucle infinie</string>
<string name="instruction_install_plugin_from_url">Saisissez une URL pointant vers l\'adresse d\'un plugin distant.\nPar exemple \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">Dernière utilisation : %1$s</string>
<string name="logger_ver_history_blob_thread_failure">Échec du thread \"blob\"</string>
<string name="logger_ver_history_blob_thread_success">Thread \"blob\" réussi, écriture du cache hors ligne</string>
@@ -337,7 +339,17 @@
<string name="mt_custom">Custom</string>
<string name="no_apk_builder_plugin">APK Builder n\'est pas installé</string>
<string name="no_root_access_for_record">AutoJs6 n\'a pas d\'accès root pour enregistrer un script</string>.
<string name="plugin_item_info_author">Auteur</string>
<string name="plugin_item_info_collaborators">Collaborateurs</string>
<string name="plugin_item_info_first_install_time">1re inst.</string>
<string name="plugin_item_info_installed_version">Ver. installée</string>
<string name="plugin_item_info_last_install_time">Dern. inst.</string>
<string name="plugin_item_info_last_uninstall_time">Dern. désinst.</string>
<string name="plugin_item_info_last_update_time">Dern. maj</string>
<string name="plugin_item_info_package_size">Taille du paquet</string>
<string name="plugin_item_info_updatable_version">Ver. maj disp.</string>
<string name="prompt_add_ignored_version">Êtes-vous sûr d\'ignorer la version de mise à jour actuelle?\nVous pouvez gérer toutes les versions ignorées dans les paramètres de l\'application.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">Le fichier actuel n\'est peutêtre pas un paquet de plugin valide. Voulezvous continuer l\'installation ?\n\nURI : \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">Un redémarrage de l\'application est nécessaire pour appliquer les nouveaux paramètres</string>.
<string name="prompt_restart_may_be_needed_for_language_switch">Un redémarrage de l\'appli peut être nécessaire pour que la langue soit appliquée comme prévu</string>.
<string name="screen_capturer_foreground_notification_channel_name">Service de capture d\'écran en avant-plan</string>
@@ -433,6 +445,8 @@
<string name="text_app_shortcut_docs_short_label">Docs</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 Journal</string>
<string name="text_app_shortcut_log_short_label">Journal</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 Réglages</string>
<string name="text_app_shortcut_settings_short_label">Réglages</string>
<string name="text_app_source_code">Code source</string>
@@ -481,9 +495,11 @@
<string name="text_clear_file_selection">Effacer la sélection de fichiers</string>
<string name="text_clear_pre_execute_script">Effacer le script de pré-exécution</string>
<string name="text_clear_updates_checked_states">Effacer les états vérifiés des mises à jour</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">Cliquez sur l\'élément à supprimer</string>
<string name="text_click_item_to_show_details">Touchez un élément pour afficher les détails</string>
<string name="text_click_ok_to_go_to_settings">Cliquez sur \"OK\" pour accéder aux paramètres</string>.
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">Une opération fréquente</string>
<string name="text_client_mode">Mode client</string>
<string name="text_clone_color_library">Cloner une bibliothèque de couleurs</string>
@@ -540,6 +556,7 @@
<string name="text_delete">Suppression</string>
<string name="text_delete_all">Tout supprimer</string>
<string name="text_delete_line">Supprimer la ligne</string>
<string name="text_description">Description</string>
<string name="text_details">Détails</string>
<string name="text_developer_details_under_development">Les détails du développeur sont en cours de développement</string>
<string name="text_developer_options">Les options du développeur</string>
@@ -553,6 +570,7 @@
<string name="text_device_screen_resolution">Résolution d\'écran de l\'appareil</string>
<string name="text_directly_download">Téléchargement immédiat</string>
<string name="text_directory">Directory</string>
<string name="text_disabled">Désactivé</string>
<string name="text_display_over_other_app">Affichage sur les autres apps</string>
<string name="text_display_over_other_app_is_recommended">La permission \"Display over other apps\" est recommandée pour que tous les widgets s\'affichent correctement</string>.
<string name="text_disposable_task">Tâche à supprimer</string>
@@ -585,6 +603,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">Activation du service d\'accessibilité avec accès root temporisé</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">Activer le service d\'accessibilité avec des paramètres sécurisés automatiquement</string>.
<string name="text_enable_a11y_service_with_secure_settings_timeout">Activer le service d\'accessibilité avec des paramètres sécurisés temporairement</string>.
<string name="text_enable_plugin">Activer le plugin</string>
<string name="text_enabled">Activé</string>
<string name="text_error">Erreur</string>
<string name="text_error_copy_file" formatted="true">Failed to copy file : %s</string>
<string name="text_error_report">Rapport de bug</string>
@@ -615,10 +635,12 @@
<string name="text_failed_to_grant_access">Failed to grant access</string>
<string name="text_failed_to_grant_draw_overlays_permission">Fail to grant display over other apps permission</string>
<string name="text_failed_to_import">Fail to import</string>
<string name="text_failed_to_install">Échec de l\'installation</string>
<string name="text_failed_to_locate">Échec de la localisation</string>
<string name="text_failed_to_login">Fail to login</string>
<string name="text_failed_to_register">Failed to register</string>
<string name="text_failed_to_report">Failed to submit</string>
<string name="text_failed_to_retrieve">Échec de la récupération</string>
<string name="text_failed_to_save_remote_project_to_local_storage">Échec de l\'enregistrement du projet distant dans le stockage local</string>
<string name="text_failed_to_send_log_entries">Échec de l\'envoi des entrées de journal</string>
<string name="text_failed_to_write_file">Fail to write file</string>
@@ -635,6 +657,7 @@
<string name="text_filename_cannot_contain_invalid_character">Le nom du fichier ne peut pas contenir les caractères suivants : \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">Le nom du fichier est trop long</string>
<string name="text_files_transfer">Transfert de fichiers</string>
<string name="text_filter">Filtrer</string>
<string name="text_find">Recherche</string>
<string name="text_find_java_classes">Recherche de classes Java</string>
<string name="text_find_next_simplified">Suiv</string>
@@ -653,6 +676,7 @@
<string name="text_generated_code">Code généré</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">Retrouver les release notes...</string>
<string name="text_github_backup_url_used">L\'URL de sauvegarde a été utilisée</string>
<string name="text_global_settings">Paramètres globaux</string>
<string name="text_go_to_settings">Aller à \"Settings\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Accorder des privilèges AutoJs6 dans une application Shizuku</string>
<string name="text_granted">Granted</string>
@@ -680,6 +704,10 @@
<string name="text_inspect_layout_bounds">Inspecter les limites de la mise en page</string>
<string name="text_inspect_layout_hierarchy">Inspecter la hiérarchie des dispositions</string>
<string name="text_install">Installation</string>
<string name="text_install_from_local_file">Installer depuis \"Fichier local\"</string>
<string name="text_install_from_url">Installer depuis \"URL\"</string>
<string name="text_install_plugin_from_url">Installer le plugin depuis \"URL\"</string>
<string name="text_installable">Installable</string>
<string name="text_invalid_character_is_removed">Caractère invalide est supprimé</string>
<string name="text_invalid_package_name">Nom de paquet non valide</string>
<string name="text_invalid_project">Projet non valide</string>
@@ -699,6 +727,7 @@
<string name="text_key_store_has_not_been_verified">Le magasin de clés n\'a pas été vérifié</string>
<string name="text_key_store_password">Mot de passe du magasin de clés</string>
<string name="text_label_name">Étiquette</string>
<string name="text_label_state">État</string>
<string name="text_last_updates_checked_time">Dernière vérification : %s</string>
<string name="text_latest_activity">Dernière activité</string>
<string name="text_latest_package">Dernier paquet</string>
@@ -877,6 +906,9 @@
<string name="text_please_input_name">Nom de l\'entrée</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Veuillez patienter...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">Veuillez réessayer cette opération plus tard...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">Détails du plugin</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">L\'emplacement du pointeur</string>
<string name="text_pointer_location_toggle_failed_with_hint">Toggle \"pointer location\" failed.\nL\'accès à la racine est nécessaire.</string>
<string name="text_post_notifications_permission">Notifications postales</string>
@@ -992,6 +1024,7 @@
<string name="text_signature_scheme">Schéma de signature</string>
<string name="text_size">Taille</string>
<string name="text_some_items_exported">%d items exported</string>
<string name="text_sort">Trier</string>
<string name="text_source_file_path">Chemin du code source</string>
<string name="text_special_permissions">Autorisations spéciales</string>
<string name="text_stable_mode">Mode stable</string>
@@ -1033,8 +1066,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">Révoquer</string>
<string name="text_undo_simplified">Révoq</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">Inconnu</string>
<string name="text_unverified">Non vérifié</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">Mises à jour</string>
<string name="text_updates_checked_states_cleared">Mise à jour des états vérifiés et effacés</string>
<string name="text_updates_snack_bar_act_later">Plus tard</string>
@@ -1077,14 +1113,8 @@
<string name="text_write_secure_settings">Écrire les paramètres de sécurité</string>.
<string name="text_write_secure_settings_description">Paramètres de sécurité du système, contenant les préférences du système que les applications peuvent lire mais ne sont pas autorisées à écrire.\nIl s\'agit des préférences que l\'utilisateur doit explicitement modifier par le biais de l\'interface utilisateur d\'une application système.\nAvec l\'autorisation de paramètres de sécurité du système, les applications normales peuvent directement modifier les paramètres de sécurité (comme le service d\'accessibilité).</string>
<string name="text_write_system_settings">Écrire les paramètres système</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">Échec de la vérification de l\'intégrité</string>
<string name="text_sha256_mismatch_multiline_expected_actual">Incohérence du SHA-256.\n\nAttendu : %1$s\nObtenu : %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">Aucune URL disponible n\'a été fournie pour le plug-in actuel</string>
</resources>

View File

@@ -111,6 +111,7 @@
<string name="dialog_button_open_color_palette">パレットを開く</string>
<string name="dialog_button_quit">終了する</string>
<string name="dialog_button_remove">削除</string>
<string name="dialog_button_retrieve">取得</string>
<string name="dialog_button_retry">再試行</string>
<string name="dialog_button_save">保存する</string>
<string name="dialog_button_system_settings">システム設定</string>
@@ -302,6 +303,7 @@
<string name="hint_long_click_run_to_debug">実行」ボタン長押しでデバッグ</string>
<string name="hint_loop_delay">ループ前の遅延時間</string>
<string name="hint_loop_times">無限ループの場合は 0</string>
<string name="instruction_install_plugin_from_url">リモートプラグインの URL を入力してください. \n例: \"https://example.com/plugin.apk\"</string>
<string name="label_latest_used_time">最終使用時: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" スレッドが失敗</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" スレッドが成功、オフラインキャッシュを書き込み</string>
@@ -338,7 +340,17 @@
<string name="mt_custom">カスタム</string>
<string name="no_apk_builder_plugin">APK Builder がインストールされていない</string>
<string name="no_root_access_for_record">AutoJs6 にスクリプトを記録するためのルートアクセス権がない</string>
<string name="plugin_item_info_author">作者</string>
<string name="plugin_item_info_collaborators">協力者</string>
<string name="plugin_item_info_first_install_time">初回インストール</string>
<string name="plugin_item_info_installed_version">インストール済み Ver.</string>
<string name="plugin_item_info_last_install_time">最終インストール</string>
<string name="plugin_item_info_last_uninstall_time">最終アンインストール</string>
<string name="plugin_item_info_last_update_time">最終更新</string>
<string name="plugin_item_info_package_size">パッケージサイズ</string>
<string name="plugin_item_info_updatable_version">更新可 Ver.</string>
<string name="prompt_add_ignored_version">現在のアップデートバージョンを無視して大丈夫ですか?\n無視したバージョンは, アプリの設定で管理することができます</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">このファイルは有効なプラグインパッケージではない可能性があります. インストールを続行しますか?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">新しい設定を適用するには, アプリの再起動が必要です</string>
<string name="prompt_restart_may_be_needed_for_language_switch">言語を正しく適用するために, アプリの再起動が必要な場合があります</string>
<string name="screen_capturer_foreground_notification_channel_name">スクリーンキャプチャーのフォアグラウンドサービス</string>
@@ -434,6 +446,8 @@
<string name="text_app_shortcut_docs_short_label">文書</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 ログ</string>
<string name="text_app_shortcut_log_short_label">ログ</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 設定</string>
<string name="text_app_shortcut_settings_short_label">設定</string>
<string name="text_app_source_code">ソースコード</string>
@@ -482,9 +496,11 @@
<string name="text_clear_file_selection">ファイル選択の解除</string>
<string name="text_clear_pre_execute_script">実行前スクリプトのクリア</string>
<string name="text_clear_updates_checked_states">アップデートのチェック状態をクリアする</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">削除する項目をクリックします</string>
<string name="text_click_item_to_show_details">項目をタップして詳細を表示します</string>
<string name="text_click_ok_to_go_to_settings">\"OK\" をクリックすると設定に進みます</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">頻繁に行う操作</string>
<string name="text_client_mode">クライアントモード</string>
<string name="text_clone_color_library">カラーライブラリを複製</string>
@@ -541,6 +557,7 @@
<string name="text_delete">削除</string>
<string name="text_delete_all">すべて削除</string>
<string name="text_delete_line">行削除</string>
<string name="text_description">説明</string>
<string name="text_details">詳細</string>
<string name="text_developer_details_under_development">デベロッパーの詳細については, 現在開発中です</string>
<string name="text_developer_options">デベロッパーオプション</string>
@@ -554,6 +571,7 @@
<string name="text_device_screen_resolution">デバイスの画面解像度</string>
<string name="text_directly_download">今すぐダウンロード</string>
<string name="text_directory">ディレクトリ</string>
<string name="text_disabled">無効</string>
<string name="text_display_over_other_app">他のアプリの上に表示する</string>
<string name="text_display_over_other_app_is_recommended">すべてのウィジェットを正しく表示するために, \"Display over other apps\" パーミッションの使用を推奨します</string>
<string name="text_disposable_task">使い捨てタスク</string>
@@ -586,6 +604,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">ルートアクセスがタイムアウトした状態でアクセシビリティサービスを有効にする</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">セキュアな設定でアクセシビリティサービスを自動的に有効にする</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">セキュアな設定でアクセシビリティサービスを有効化するとタイムアウトする</string>
<string name="text_enable_plugin">プラグインを有効化</string>
<string name="text_enabled">有効</string>
<string name="text_error">エラー</string>
<string name="text_error_copy_file" formatted="true">ファイルのコピーに失敗しました. %s</string>
<string name="text_error_report">バグレポート</string>
@@ -616,10 +636,12 @@
<string name="text_failed_to_grant_access">アクセス権の付与に失敗しました</string>
<string name="text_failed_to_grant_draw_overlays_permission">他のアプリの上に表示する権限の付与に失敗しました</string>
<string name="text_failed_to_import">インポートに失敗しました</string>
<string name="text_failed_to_install">インストールに失敗</string>
<string name="text_failed_to_locate">見つかりませんでした</string>
<string name="text_failed_to_login">ログインに失敗しました</string>
<string name="text_failed_to_register">登録の失敗</string>
<string name="text_failed_to_report">投稿の失敗</string>
<string name="text_failed_to_retrieve">取得に失敗</string>
<string name="text_failed_to_save_remote_project_to_local_storage">リモートプロジェクトをローカルストレージに保存できませんでした</string>
<string name="text_failed_to_send_log_entries">ログ・エントリの送信に失敗しました</string>
<string name="text_failed_to_write_file">ファイルの書き込みに失敗しました</string>
@@ -636,6 +658,7 @@
<string name="text_filename_cannot_contain_invalid_character">ファイル名に以下の文字を含めることはできません: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">ファイル名が長すぎます</string>
<string name="text_files_transfer">ファイルの転送</string>
<string name="text_filter">フィルター</string>
<string name="text_find">検索</string>
<string name="text_find_java_classes">Java クラスの検索</string>
<string name="text_find_next_simplified">次へ</string>
@@ -654,6 +677,7 @@
<string name="text_generated_code">生成されたコード</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">リリースノートの取得中...</string>
<string name="text_github_backup_url_used">バックアップ URL を使用しました</string>
<string name="text_global_settings">グローバル設定</string>
<string name="text_go_to_settings">\"設定\" に進む</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Shizuku アプリケーションで AutoJs6 権限を付与する</string>
<string name="text_granted">許可する</string>
@@ -681,6 +705,10 @@
<string name="text_inspect_layout_bounds">レイアウト境界の検査</string>
<string name="text_inspect_layout_hierarchy">レイアウト階層の検査</string>
<string name="text_install">インストール</string>
<string name="text_install_from_local_file">\"ローカルファイル\" からインストール</string>
<string name="text_install_from_url">\"URL\" からインストール</string>
<string name="text_install_plugin_from_url">\"URL\" からプラグインをインストール</string>
<string name="text_installable">インストール可</string>
<string name="text_invalid_character_is_removed">無効な文字が削除されました</string>
<string name="text_invalid_package_name">パッケージ名が無効です</string>
<string name="text_invalid_project">プロジェクトが無効です</string>
@@ -700,6 +728,7 @@
<string name="text_key_store_has_not_been_verified">キーストアは確認されていません</string>
<string name="text_key_store_password">キーストアのパスワード</string>
<string name="text_label_name">ラベル</string>
<string name="text_label_state">状態</string>
<string name="text_last_updates_checked_time">最終チェック: %s</string>
<string name="text_latest_activity">最新の活動</string>
<string name="text_latest_package">最新のパッケージ</string>
@@ -878,6 +907,9 @@
<string name="text_please_input_name">入力名</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">しばらくお待ちください...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">しばらくしてからもう一度お試しください...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">プラグイン詳細</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">ポインターの位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">トグル「ポインターの位置」に失敗しました.\nroot 権限が必要です</string>
<string name="text_post_notifications_permission">ゆうびんけいほう</string>
@@ -993,6 +1025,7 @@
<string name="text_signature_scheme">署名スキーム</string>
<string name="text_size">サイズ</string>
<string name="text_some_items_exported">エクスポートされた項目 %d</string>
<string name="text_sort">並べ替え</string>
<string name="text_source_file_path">ソースコードのパス</string>
<string name="text_special_permissions">特殊な権限</string>
<string name="text_stable_mode">安定モード</string>
@@ -1034,8 +1067,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">元に戻す</string>
<string name="text_undo_simplified">戻る</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">不明</string>
<string name="text_unverified">未確認</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">アップデート</string>
<string name="text_updates_checked_states_cleared">更新のチェック状態を解除</string>
<string name="text_updates_snack_bar_act_later">後日</string>
@@ -1078,14 +1114,8 @@
<string name="text_write_secure_settings">セキュリティ設定の書き込み</string>
<string name="text_write_secure_settings_description">アプリケーションが読み取ることはできるが, 書き込むことはできないシステム環境設定を含む, 安全なシステム設定です.\nこれは, ユーザーがシステムアプリの UI を通じて明示的に変更する必要がある環境設定のためのものです.\nセキュアなシステム設定を許可すると, 通常のアプリケーションはセキュアな設定 (アクセシビリティサービスなど) を直接変更できるようになります</string>
<string name="text_write_system_settings">システム設定の書き込み</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">整合性の検証に失敗しました</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 が一致しません.\n\n期待値: %1$s\n実際: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">現在のプラグインに利用可能な URL は提供されていません</string>
</resources>

View File

@@ -112,6 +112,7 @@
<string name="dialog_button_open_color_palette">팔레트 열기</string>
<string name="dialog_button_quit">그만두다</string>
<string name="dialog_button_remove">제거하다</string>
<string name="dialog_button_retrieve">가져오기</string>
<string name="dialog_button_retry">다시 해 보다</string>
<string name="dialog_button_save">구하다</string>
<string name="dialog_button_system_settings">환경 설정</string>
@@ -303,6 +304,7 @@
<string name="hint_long_click_run_to_debug">\"실행\" 버튼을 긴 클릭하여 디버그를 클릭하십시오</string>
<string name="hint_loop_delay">루프 전 지연</string>
<string name="hint_loop_times">무한 루프의 경우 0</string>
<string name="instruction_install_plugin_from_url">원격 플러그인 주소를 가리키는 URL을 입력하세요.\n예: \"https://example.com/plugin.apk\"</string>
<string name="label_latest_used_time">최종 사용: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" 스레드 요청 실패</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" 스레드 요청 성공, 오프라인 캐시 기록</string>
@@ -339,7 +341,17 @@
<string name="mt_custom">관습</string>
<string name="no_apk_builder_plugin">APK 빌더가 설치되지 않았습니다</string>
<string name="no_root_access_for_record">AutoJs6 에는 스크립트를 기록 할 루트 액세스가 없습니다</string>
<string name="plugin_item_info_author">제작자</string>
<string name="plugin_item_info_collaborators">협력자</string>
<string name="plugin_item_info_first_install_time">최초 설치</string>
<string name="plugin_item_info_installed_version">설치 버전</string>
<string name="plugin_item_info_last_install_time">마지막 설치</string>
<string name="plugin_item_info_last_uninstall_time">마지막 제거</string>
<string name="plugin_item_info_last_update_time">마지막 업데이트</string>
<string name="plugin_item_info_package_size">패키지 크기</string>
<string name="plugin_item_info_updatable_version">업데이트 가능</string>
<string name="prompt_add_ignored_version">현재 업데이트 버전을 무시해야합니까?\n앱 설정으로 무시 된 버전을 모두 관리 할 수 있습니다.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">현재 파일이 유효한 플러그인 패키지가 아닐 수 있습니다. 설치를 계속하시겠습니까?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">새로운 설정을 적용하려면 앱 재시작이 필요합니다</string>
<string name="prompt_restart_may_be_needed_for_language_switch">예상대로 언어를 적용하려면 앱 재시작이 필요할 수 있습니다.</string>
<string name="screen_capturer_foreground_notification_channel_name">스크린 캡처 전경 서비스</string>
@@ -435,6 +447,8 @@
<string name="text_app_shortcut_docs_short_label">문서</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 통나무</string>
<string name="text_app_shortcut_log_short_label">통나무</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 설정</string>
<string name="text_app_shortcut_settings_short_label">설정</string>
<string name="text_app_source_code">소스 코드</string>
@@ -483,9 +497,11 @@
<string name="text_clear_file_selection">파일 선택을 지우십시오</string>
<string name="text_clear_pre_execute_script">사전 에코 슈트 스크립트를 지우십시오</string>
<string name="text_clear_updates_checked_states">확인 된 상태에서 명확한 업데이트</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">제거하려면 항목을 클릭하십시오</string>
<string name="text_click_item_to_show_details">항목을 탭하면 자세한 정보를 볼 수 있습니다</string>
<string name="text_click_ok_to_go_to_settings">\"확인\"을 클릭하여 설정으로 이동하십시오</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">빈번한 작동</string>
<string name="text_client_mode">클라이언트 모드</string>
<string name="text_clone_color_library">색상 라이브러리 복제</string>
@@ -542,6 +558,7 @@
<string name="text_delete">삭제</string>
<string name="text_delete_all">모두 삭제</string>
<string name="text_delete_line">라인 삭제</string>
<string name="text_description">설명</string>
<string name="text_details">세부</string>
<string name="text_developer_details_under_development">개발자 세부 사항이 개발 중입니다</string>
<string name="text_developer_options">개발자 옵션</string>
@@ -555,6 +572,7 @@
<string name="text_device_screen_resolution">기기 화면 해상도</string>
<string name="text_directly_download">지금 다운로드하십시오</string>
<string name="text_directory">예배 규칙서</string>
<string name="text_disabled">비활성화됨</string>
<string name="text_display_over_other_app">다른 앱에 표시됩니다</string>
<string name="text_display_over_other_app_is_recommended">\"다른 앱 위의 디스플레이\"권한은 모든 위젯을 올바르게 표시하는 것이 좋습니다.</string>
<string name="text_disposable_task">일회용 작업</string>
@@ -587,6 +605,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">루트 액세스 시간이 초과 된 접근성 서비스를 활성화하십시오</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">안전한 설정을 통해 접근성 서비스를 자동으로 활성화하십시오</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">안전한 설정 시간이 초과되는 접근성 서비스를 활성화하십시오</string>
<string name="text_enable_plugin">플러그인 활성화</string>
<string name="text_enabled">활성화됨</string>
<string name="text_error">오류</string>
<string name="text_error_copy_file" formatted="true">파일을 복사하지 못했습니다: %s</string>
<string name="text_error_report">버그 보고서</string>
@@ -617,10 +637,12 @@
<string name="text_failed_to_grant_access">액세스 권한을 부여하지 못했습니다</string>
<string name="text_failed_to_grant_draw_overlays_permission">다른 앱 권한을 통해 디스플레이를 부여하지 못했습니다</string>
<string name="text_failed_to_import">가져 오지 못했습니다</string>
<string name="text_failed_to_install">설치 실패</string>
<string name="text_failed_to_locate">찾을 수 없음</string>
<string name="text_failed_to_login">로그인 실패</string>
<string name="text_failed_to_register">등록하지 못했습니다</string>
<string name="text_failed_to_report">제출하지 못했습니다</string>
<string name="text_failed_to_retrieve">가져오기 실패</string>
<string name="text_failed_to_save_remote_project_to_local_storage">원격 프로젝트를 로컬 저장소에 저장하지 못했습니다</string>
<string name="text_failed_to_send_log_entries">로그 항목을 보내지 못했습니다</string>
<string name="text_failed_to_write_file">파일을 쓰지 못했습니다</string>
@@ -637,6 +659,7 @@
<string name="text_filename_cannot_contain_invalid_character">파일 이름에 다음 문자를 포함할 수 없습니다: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">파일 이름이 너무 깁니다</string>
<string name="text_files_transfer">파일 전송</string>
<string name="text_filter">필터</string>
<string name="text_find">찾다</string>
<string name="text_find_java_classes">Java 클래스를 찾으십시오</string>
<string name="text_find_next_simplified">다음을</string>
@@ -655,6 +678,7 @@
<string name="text_generated_code">생성 된 코드</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">릴리스 노트 검색 ...</string>
<string name="text_github_backup_url_used">백업 URL 이 사용되었습니다</string>
<string name="text_global_settings">전역 설정</string>
<string name="text_go_to_settings">설정으로 바로 가기\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Shizuku 애플리케이션에서 AutoJs6 권한 부여하기</string>
<string name="text_granted">부여된</string>
@@ -682,6 +706,10 @@
<string name="text_inspect_layout_bounds">레이아웃 경계를 검사하십시오</string>
<string name="text_inspect_layout_hierarchy">레이아웃 계층 구조를 검사하십시오</string>
<string name="text_install">설치</string>
<string name="text_install_from_local_file">\"로컬 파일\"에서 설치</string>
<string name="text_install_from_url">\"URL\"에서 설치</string>
<string name="text_install_plugin_from_url">\"URL\"에서 플러그인 설치</string>
<string name="text_installable">설치 가능</string>
<string name="text_invalid_character_is_removed">잘못된 문자가 제거되었습니다</string>
<string name="text_invalid_package_name">잘못된 패키지 이름</string>
<string name="text_invalid_project">잘못된 프로젝트</string>
@@ -701,6 +729,7 @@
<string name="text_key_store_has_not_been_verified">키 저장소가 확인되지 않았습니다</string>
<string name="text_key_store_password">키 저장소 비밀번호</string>
<string name="text_label_name">이름</string>
<string name="text_label_state">상태</string>
<string name="text_last_updates_checked_time">마지막으로 확인 된: %s</string>
<string name="text_latest_activity">최신 활동</string>
<string name="text_latest_package">최신 패키지</string>
@@ -879,6 +908,9 @@
<string name="text_please_input_name">입력 이름</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">잠시만 기다려주세요...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">잠시 후 다시 시도해 주세요...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">플러그인 상세</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">포인터 위치</string>
<string name="text_pointer_location_toggle_failed_with_hint">\"포인터 위치\"토글이 실패했습니다.\n루트 액세스가 필요합니다.</string>
<string name="text_post_notifications_permission">게시물 알림</string>
@@ -994,6 +1026,7 @@
<string name="text_signature_scheme">서명 스킴</string>
<string name="text_size">크기</string>
<string name="text_some_items_exported">내보낸 %d 항목</string>
<string name="text_sort">정렬</string>
<string name="text_source_file_path">소스 코드 경로</string>
<string name="text_special_permissions">특수 권한</string>
<string name="text_stable_mode">안정적인 모드</string>
@@ -1035,8 +1068,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">실행 취소</string>
<string name="text_undo_simplified"></string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">알 수 없음</string>
<string name="text_unverified">미확인</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">업데이트</string>
<string name="text_updates_checked_states_cleared">확인 된 상태가 지워졌습니다</string>
<string name="text_updates_snack_bar_act_later">나중</string>
@@ -1079,14 +1115,8 @@
<string name="text_write_secure_settings">보안 설정을 작성하십시오</string>
<string name="text_write_secure_settings_description">애플리케이션이 읽을 수 있지만 쓸 수없는 시스템 환경 설정을 포함하는 보안 시스템 설정.\n이들은 사용자가 시스템 앱의 UI 를 통해 명시 적으로 수정 해야하는 선호도입니다.\n보안 시스템 설정 권한을 사용하면 일반 애플리케이션이 보안 설정 (예: 접근성 서비스)을 직접 수정할 수 있습니다.</string>
<string name="text_write_system_settings">시스템 설정을 작성하십시오</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">무결성 검증에 실패했습니다</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 값이 일치하지 않습니다.\n\n예상: %1$s\n실제: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">현재 플러그인에 사용 가능한 URL 이 제공되지 않았습니다</string>
</resources>

View File

@@ -33,6 +33,7 @@
<color name="dialog_button_attraction">#C7A4FF</color>
<color name="dialog_button_hint">#0DA798</color>
<color name="dialog_button_reset">#BCAAA4</color>
<color name="dialog_button_not_recommended">#BCAAA4</color>
<color name="dialog_button_unavailable">@color/md_gray_700</color>
<color name="dialog_button_finish">#009624</color>
<color name="dialog_button_success">@color/dialog_button_finish</color>

View File

@@ -110,6 +110,7 @@
<string name="dialog_button_open_color_palette">Открыть палитру</string>
<string name="dialog_button_quit">Выйти</string>
<string name="dialog_button_remove">Удалить</string>
<string name="dialog_button_retrieve">Получить</string>
<string name="dialog_button_retry">Повторная попытка</string>
<string name="dialog_button_save">Сохранить</string>
<string name="dialog_button_system_settings">Системные настройки</string>
@@ -301,6 +302,7 @@
<string name="hint_long_click_run_to_debug">Длительное нажатие кнопки \"Выполнить\" для отладки</string>
<string name="hint_loop_delay">Задержка перед циклом</string>
<string name="hint_loop_times">0 для бесконечного цикла</string>
<string name="instruction_install_plugin_from_url">Введите URL, указывающий на удалённый плагин.\nНапример: \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">Последнее использование: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">Поток \"blob\" неудачен</string>
<string name="logger_ver_history_blob_thread_success">Поток \"blob\" успешен, запись офлайн-кеша</string>
@@ -337,7 +339,17 @@
<string name="mt_custom">Пользовательский</string>
<string name="no_apk_builder_plugin">APK Builder не установлен</string>
<string name="no_root_access_for_record">AutoJs6 не имеет root-доступа для записи скрипта</string>
<string name="plugin_item_info_author">Автор</string>
<string name="plugin_item_info_collaborators">Соавторы</string>
<string name="plugin_item_info_first_install_time">Перв. устан.</string>
<string name="plugin_item_info_installed_version">Уст. вер.</string>
<string name="plugin_item_info_last_install_time">Посл. устан.</string>
<string name="plugin_item_info_last_uninstall_time">Посл. удал.</string>
<string name="plugin_item_info_last_update_time">Посл. обновл.</string>
<string name="plugin_item_info_package_size">Размер пакета</string>
<string name="plugin_item_info_updatable_version">Обновл. вер.</string>
<string name="prompt_add_ignored_version">Вы уверены, что игнорируете текущую версию обновления?\nВы можете управлять всеми игнорируемыми версиями в настройках приложения.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">Текущий файл может быть недействительным пакетом плагина. Продолжить установку?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">Для применения новых настроек требуется перезапуск приложения</string>
<string name="prompt_restart_may_be_needed_for_language_switch">Перезапуск приложения может потребоваться для того, чтобы язык применялся как положено</string>
<string name="screen_capturer_foreground_notification_channel_name">Служба захвата экрана на переднем плане</string>
@@ -433,6 +445,8 @@
<string name="text_app_shortcut_docs_short_label">документы</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 Журнал</string>
<string name="text_app_shortcut_log_short_label">Журнал</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 Настройки</string>
<string name="text_app_shortcut_settings_short_label">Настройки</string>
<string name="text_app_source_code">Исходный код</string>
@@ -481,9 +495,11 @@
<string name="text_clear_file_selection">Очистить выбор файла</string>
<string name="text_clear_pre_execute_script">Очистить сценарий предварительного выполнения</string>
<string name="text_clear_updates_checked_states">Очистить состояния проверки обновлений</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">Нажмите на элемент для удаления</string>
<string name="text_click_item_to_show_details">Нажмите на пункт, чтобы просмотреть подробности</string>
<string name="text_click_ok_to_go_to_settings">Нажмите \"OK\" для перехода к настройкам</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">Частые операции</string>
<string name="text_client_mode">Режим клиента</string>
<string name="text_clone_color_library">Клонировать цветовую библиотеку</string>
@@ -540,6 +556,7 @@
<string name="text_delete">Удалить</string>
<string name="text_delete_all">Удалить все</string>
<string name="text_delete_line">Удалить строку</string>
<string name="text_description">Описание</string>
<string name="text_details">Детали</string>
<string name="text_developer_details_under_development">Детали разработчика находятся в стадии разработки</string>
<string name="text_developer_options">Параметры разработчика</string>
@@ -553,6 +570,7 @@
<string name="text_device_screen_resolution">Разрешение экрана устройства</string>
<string name="text_directly_download">Загрузить сейчас</string>
<string name="text_directory">Каталог</string>
<string name="text_disabled">Отключено</string>
<string name="text_display_over_other_app">Отображать поверх других приложений</string>
<string name="text_display_over_other_app_is_recommended">Разрешение \"Отображать поверх других приложений\" рекомендуется для правильного отображения всех виджетов.</string>
<string name="text_disposable_task">Одноразовая задача</string>
@@ -585,6 +603,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">Включить службу доступности с корневым доступом по таймеру</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">Автоматическое включение службы доступности с безопасными настройками</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">Включить службу доступа с безопасными настройками по таймеру</string>
<string name="text_enable_plugin">Включить плагин</string>
<string name="text_enabled">Включено</string>
<string name="text_error">Ошибка</string>
<string name="text_error_copy_file" formatted="true">Не удалось скопировать файл: %s</string>
<string name="text_error_report">Отчет об ошибке</string>
@@ -615,10 +635,12 @@
<string name="text_failed_to_grant_access">Не удалось предоставить доступ</string>
<string name="text_failed_to_grant_draw_overlays_permission">Не удалось предоставить разрешение на отображение поверх других приложений</string>
<string name="text_failed_to_import">Не удалось импортировать</string>
<string name="text_failed_to_install">Не удалось установить</string>
<string name="text_failed_to_locate">Не удалось найти</string>
<string name="text_failed_to_login">Не удалось войти в систему</string>
<string name="text_failed_to_register">Не удалось зарегистрироваться</string>
<string name="text_failed_to_report">Не удалось отправить</string>
<string name="text_failed_to_retrieve">Не удалось получить</string>
<string name="text_failed_to_save_remote_project_to_local_storage">Не удалось сохранить удаленный проект в локальное хранилище</string>
<string name="text_failed_to_send_log_entries">Не удалось отправить записи журнала</string>
<string name="text_failed_to_write_file">Не удалось записать файл</string>
@@ -635,6 +657,7 @@
<string name="text_filename_cannot_contain_invalid_character">Имя файла не может содержать следующие символы: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">Имя файла слишком длинное</string>
<string name="text_files_transfer">Передача файлов</string>
<string name="text_filter">Фильтр</string>
<string name="text_find">Найти</string>
<string name="text_find_java_classes">Найти классы Java</string>
<string name="text_find_next_simplified">Следу</string>
@@ -653,6 +676,7 @@
<string name="text_generated_code">Сгенерированный код</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">Извлечение заметок о выпуске...</string>
<string name="text_github_backup_url_used">Использован URL-адрес резервной копии</string>
<string name="text_global_settings">Глобальные настройки</string>
<string name="text_go_to_settings">Перейдите в \"Настройки\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Предоставление привилегий AutoJs6 в приложении Shizuku</string>
<string name="text_granted">Разрешено</string>
@@ -680,6 +704,10 @@
<string name="text_inspect_layout_bounds">Осмотр границ макета</string>
<string name="text_inspect_layout_hierarchy">Проверить иерархию макета</string>
<string name="text_install">Установить</string>
<string name="text_install_from_local_file">Установить из \"Локального файла\"</string>
<string name="text_install_from_url">Установить из \"URL\"</string>
<string name="text_install_plugin_from_url">Установить плагин из \"URL\"</string>
<string name="text_installable">Устанавливаемый</string>
<string name="text_invalid_character_is_removed">Недопустимый символ удален</string>
<string name="text_invalid_package_name">Неверное имя пакета</string>
<string name="text_invalid_project">Неверный проект</string>
@@ -699,6 +727,7 @@
<string name="text_key_store_has_not_been_verified">Хранилище ключей не подтверждено</string>
<string name="text_key_store_password">Пароль хранилища ключей</string>
<string name="text_label_name">Метка</string>
<string name="text_label_state">Состояние</string>
<string name="text_last_updates_checked_time">Последняя проверка: %s</string>
<string name="text_latest_activity">Последняя активность</string>
<string name="text_latest_package">Последний пакет</string>
@@ -877,6 +906,9 @@
<string name="text_please_input_name">Имя ввода</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Пожалуйста, подождите...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">Пожалуйста, повторите попытку позже...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">Сведения о плагине</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">Расположение указателя</string>
<string name="text_pointer_location_toggle_failed_with_hint">Переключение \"Расположение указателя\" не удалось.\nТребуется корневой доступ.</string>
<string name="text_post_notifications_permission">почтовые уведомления</string>
@@ -992,6 +1024,7 @@
<string name="text_signature_scheme">Схема подписи</string>
<string name="text_size">Размер</string>
<string name="text_some_items_exported">Экспортировано %d элементов</string>
<string name="text_sort">Сортировать</string>
<string name="text_source_file_path">Путь к исходному коду</string>
<string name="text_special_permissions">Специальные разрешения</string>
<string name="text_stable_mode">Стабильный режим</string>
@@ -1033,8 +1066,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">Отозвать</string>
<string name="text_undo_simplified">Верни</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">Неизвестно</string>
<string name="text_unverified">Не подтверждено</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">Обновления</string>
<string name="text_updates_checked_states_cleared">Обновления проверенные состояния очищены</string>
<string name="text_updates_snack_bar_act_later">Позже</string>
@@ -1077,14 +1113,8 @@
<string name="text_write_secure_settings">Параметры безопасности записи</string>
<string name="text_write_secure_settings_description">Настройки безопасности системы, содержащие системные предпочтения, которые приложения могут читать, но не имеют права записывать.\nОни предназначены для параметров, которые пользователь должен явно изменить через пользовательский интерфейс системного приложения.\nПри наличии разрешения на безопасные системные настройки обычные приложения могут напрямую изменять безопасные настройки (например, служба доступности).</string>
<string name="text_write_system_settings">Запись системных настроек</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">Сбой проверки целостности</string>
<string name="text_sha256_mismatch_multiline_expected_actual">Несовпадение SHA-256.\n\nОжидалось: %1$s\nФактически: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">Для текущего плагина не указан доступный URL-адрес</string>
</resources>

View File

@@ -108,6 +108,7 @@
<string name="dialog_button_open_color_palette">打開調色盤</string>
<string name="dialog_button_quit">放棄</string>
<string name="dialog_button_remove">移除</string>
<string name="dialog_button_retrieve">獲取</string>
<string name="dialog_button_retry">重試</string>
<string name="dialog_button_save">保存</string>
<string name="dialog_button_system_settings">系統設置</string>
@@ -299,6 +300,7 @@
<string name="hint_long_click_run_to_debug">長按 \"運行\" 圖標可啓動調試</string>
<string name="hint_loop_delay">開始循環前的延遲</string>
<string name="hint_loop_times">0 表示無限循環</string>
<string name="instruction_install_plugin_from_url">輸入一個指向遠程插件地址的 URL.\n例如 \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">最近使用: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">線程 "blob" 請求失敗</string>
<string name="logger_ver_history_blob_thread_success">線程 "blob" 請求成功, 寫入離線緩存</string>
@@ -335,7 +337,17 @@
<string name="mt_custom">自定義</string>
<string name="no_apk_builder_plugin">打包插件未安裝</string>
<string name="no_root_access_for_record">AutoJs6 無 root 權限, 無法錄製腳本</string>
<string name="plugin_item_info_author">開發者</string>
<string name="plugin_item_info_collaborators">合作者</string>
<string name="plugin_item_info_first_install_time">首次安裝</string>
<string name="plugin_item_info_installed_version">已安裝版本</string>
<string name="plugin_item_info_last_install_time">最近安裝</string>
<string name="plugin_item_info_last_uninstall_time">最近卸載</string>
<string name="plugin_item_info_last_update_time">最近更新</string>
<string name="plugin_item_info_package_size">安裝包大小</string>
<string name="plugin_item_info_updatable_version">可更新版本</string>
<string name="prompt_add_ignored_version">確定忽略當前更新版本嗎?\n在應用設置中可管理已忽略的所有版本.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">當前文件可能不是有效的插件包, 是否繼續安裝?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">需要重啓應用才能完成文檔源切換</string>
<string name="prompt_restart_may_be_needed_for_language_switch">部分內容可能需要重啓應用才能完成語言切換</string>
<string name="screen_capturer_foreground_notification_channel_name">屏幕捕獲器前台服務</string>
@@ -431,6 +443,8 @@
<string name="text_app_shortcut_docs_short_label">文檔</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 日誌</string>
<string name="text_app_shortcut_log_short_label">日誌</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 設置</string>
<string name="text_app_shortcut_settings_short_label">設置</string>
<string name="text_app_source_code">軟件源碼</string>
@@ -479,9 +493,11 @@
<string name="text_clear_file_selection">清空文件選擇</string>
<string name="text_clear_pre_execute_script">清空預執行腳本</string>
<string name="text_clear_updates_checked_states">清除更新檢查狀態</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">點擊條目可移除</string>
<string name="text_click_item_to_show_details">點擊條目可查看詳情</string>
<string name="text_click_ok_to_go_to_settings">點擊 \"確定\" 跳轉到設置頁面</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">操作頻率過快</string>
<string name="text_client_mode">客户端模式</string>
<string name="text_clone_color_library">克隆顏色庫</string>
@@ -538,6 +554,7 @@
<string name="text_delete">刪除</string>
<string name="text_delete_all">刪除全部</string>
<string name="text_delete_line">刪除行</string>
<string name="text_description">描述</string>
<string name="text_details">詳情</string>
<string name="text_developer_details_under_development" tools:ignore="TypographyEllipsis">\"開發者詳情\" 正在開發中...</string>
<string name="text_developer_options">開發者選項</string>
@@ -551,6 +568,7 @@
<string name="text_device_screen_resolution">設備屏幕分辨率</string>
<string name="text_directly_download">直接下載</string>
<string name="text_directory">文件夾</string>
<string name="text_disabled">已禁用</string>
<string name="text_display_over_other_app">顯示在其他應用上層</string>
<string name="text_display_over_other_app_is_recommended">建議授予 \"顯示在其他應用上層\" 權限以確保應用窗口組件正常顯示</string>
<string name="text_disposable_task">一次性任務</string>
@@ -583,6 +601,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">使用 root 權限啓用無障礙服務超時</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">使用修改安全設置權限自動啓用無障礙服務</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">使用修改安全設置權限啓用無障礙服務超時</string>
<string name="text_enable_plugin">啓用插件</string>
<string name="text_enabled">已啓用</string>
<string name="text_error">錯誤</string>
<string name="text_error_copy_file">文件複製失敗: %s</string>
<string name="text_error_report">錯誤報告</string>
@@ -613,10 +633,12 @@
<string name="text_failed_to_grant_access">授權失敗</string>
<string name="text_failed_to_grant_draw_overlays_permission">顯示在其他應用上層權限授予失敗</string>
<string name="text_failed_to_import">導入失敗</string>
<string name="text_failed_to_install">安裝失敗</string>
<string name="text_failed_to_locate">定位失敗</string>
<string name="text_failed_to_login">登錄失敗</string>
<string name="text_failed_to_register">註冊失敗</string>
<string name="text_failed_to_report">提交失敗</string>
<string name="text_failed_to_retrieve">獲取失敗</string>
<string name="text_failed_to_save_remote_project_to_local_storage">無法保存遠程項目至本地</string>
<string name="text_failed_to_send_log_entries">日誌條目發送失敗</string>
<string name="text_failed_to_write_file">文件寫入失敗</string>
@@ -633,6 +655,7 @@
<string name="text_filename_cannot_contain_invalid_character">文件名不能包含以下字符: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">文件名太長</string>
<string name="text_files_transfer">文件遷移</string>
<string name="text_filter">篩選</string>
<string name="text_find">查找</string>
<string name="text_find_java_classes">搜索 Java 類</string>
<string name="text_find_next_simplified">下一個</string>
@@ -651,6 +674,7 @@
<string name="text_generated_code">已生成代碼</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">正在獲取版本信息...</string>
<string name="text_github_backup_url_used">備用 URL 已使用</string>
<string name="text_global_settings">全局設置</string>
<string name="text_go_to_settings">打開 \"設置\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">在 Shizuku 應用中授予 AutoJs6 權限</string>
<string name="text_granted">已授予</string>
@@ -678,6 +702,10 @@
<string name="text_inspect_layout_bounds">佈局範圍分析</string>
<string name="text_inspect_layout_hierarchy">佈局層次分析</string>
<string name="text_install">安裝</string>
<string name="text_install_from_local_file">從 \"本地文件\" 安裝</string>
<string name="text_install_from_url">從 \"URL\" 安裝</string>
<string name="text_install_plugin_from_url">從 \"URL\" 安裝插件</string>
<string name="text_installable">可安裝</string>
<string name="text_invalid_character_is_removed">無效字符已被移除</string>
<string name="text_invalid_package_name">無效包名</string>
<string name="text_invalid_project">無效項目</string>
@@ -697,6 +725,7 @@
<string name="text_key_store_has_not_been_verified">密鑰尚未驗證</string>
<string name="text_key_store_password">密鑰庫密碼</string>
<string name="text_label_name">名稱</string>
<string name="text_label_state">狀態</string>
<string name="text_last_updates_checked_time">上次檢查: %s</string>
<string name="text_latest_activity">最近活動</string>
<string name="text_latest_package">最近包名</string>
@@ -875,6 +904,9 @@
<string name="text_please_input_name">請輸入名稱</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">請稍候...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">請稍後再嘗試此操作...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">插件詳情</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">指針位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">切換 \"指針位置\" 顯示狀態失敗\n可能缺少 root 權限</string>
<string name="text_post_notifications_permission">發佈通知權限</string>
@@ -990,6 +1022,7 @@
<string name="text_signature_scheme">簽名方案</string>
<string name="text_size">大小</string>
<string name="text_some_items_exported">已導出 %d 個條目</string>
<string name="text_sort">排序</string>
<string name="text_source_file_path">源代碼路徑</string>
<string name="text_special_permissions">特殊權限</string>
<string name="text_stable_mode">穩定模式</string>
@@ -1031,8 +1064,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">撤銷</string>
<string name="text_undo_simplified">撤銷</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">未知</string>
<string name="text_unverified">未驗證</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">更新</string>
<string name="text_updates_checked_states_cleared">更新檢查狀態已清除</string>
<string name="text_updates_snack_bar_act_later">稍後提示</string>
@@ -1075,14 +1111,8 @@
<string name="text_write_secure_settings">修改安全設置</string>
<string name="text_write_secure_settings_description">安全設置包含應用程序可讀但不可寫入的設置選項, 這些選項只能由 UI 或系統級別應用修改.\n被授予 \"修改安全設置權限\" 後, 普通應用可直接修改上述安全設置 (例如無障礙服務).</string>
<string name="text_write_system_settings">修改系統設置</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">完整性驗證失敗</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 驗證不一致.\n\n期望值: %1$s\n實際值: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">當前插件未提供可用的 URL</string>
</resources>

View File

@@ -108,6 +108,7 @@
<string name="dialog_button_open_color_palette">開啟調色盤</string>
<string name="dialog_button_quit">放棄</string>
<string name="dialog_button_remove">移除</string>
<string name="dialog_button_retrieve">獲取</string>
<string name="dialog_button_retry">重試</string>
<string name="dialog_button_save">儲存</string>
<string name="dialog_button_system_settings">系統設定</string>
@@ -299,6 +300,7 @@
<string name="hint_long_click_run_to_debug">長按 \"執行\" 圖示可啟動除錯</string>
<string name="hint_loop_delay">開始迴圈前的延遲</string>
<string name="hint_loop_times">0 表示無限迴圈</string>
<string name="instruction_install_plugin_from_url">輸入一個指向遠端外掛地址的 URL.\n例如 \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">最近使用: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">執行緒 "blob" 請求失敗</string>
<string name="logger_ver_history_blob_thread_success">執行緒 "blob" 請求成功, 寫入離線快取</string>
@@ -335,7 +337,17 @@
<string name="mt_custom">自定義</string>
<string name="no_apk_builder_plugin">打包外掛未安裝</string>
<string name="no_root_access_for_record">AutoJs6 無 root 許可權, 無法錄製指令碼</string>
<string name="plugin_item_info_author">開發者</string>
<string name="plugin_item_info_collaborators">合作者</string>
<string name="plugin_item_info_first_install_time">首次安裝</string>
<string name="plugin_item_info_installed_version">已安裝版本</string>
<string name="plugin_item_info_last_install_time">最近安裝</string>
<string name="plugin_item_info_last_uninstall_time">最近解除安裝</string>
<string name="plugin_item_info_last_update_time">最近更新</string>
<string name="plugin_item_info_package_size">安裝包大小</string>
<string name="plugin_item_info_updatable_version">可更新版本</string>
<string name="prompt_add_ignored_version">確定忽略當前更新版本嗎?\n在應用設定中可管理已忽略的所有版本.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">當前檔案可能不是有效的外掛包, 是否繼續安裝?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">需要重啟應用才能完成文件源切換</string>
<string name="prompt_restart_may_be_needed_for_language_switch">部分內容可能需要重啟應用才能完成語言切換</string>
<string name="screen_capturer_foreground_notification_channel_name">螢幕捕獲器前臺服務</string>
@@ -431,6 +443,8 @@
<string name="text_app_shortcut_docs_short_label">文件</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 日誌</string>
<string name="text_app_shortcut_log_short_label">日誌</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 設定</string>
<string name="text_app_shortcut_settings_short_label">設定</string>
<string name="text_app_source_code">軟體原始碼</string>
@@ -479,9 +493,11 @@
<string name="text_clear_file_selection">清空檔案選擇</string>
<string name="text_clear_pre_execute_script">清空預執行指令碼</string>
<string name="text_clear_updates_checked_states">清除更新檢查狀態</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">點選條目可移除</string>
<string name="text_click_item_to_show_details">點選條目可檢視詳情</string>
<string name="text_click_ok_to_go_to_settings">點選 \"確定\" 跳轉到設定頁面</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">操作頻率過快</string>
<string name="text_client_mode">客戶端模式</string>
<string name="text_clone_color_library">克隆顏色庫</string>
@@ -538,6 +554,7 @@
<string name="text_delete">刪除</string>
<string name="text_delete_all">刪除全部</string>
<string name="text_delete_line">刪除行</string>
<string name="text_description">描述</string>
<string name="text_details">詳情</string>
<string name="text_developer_details_under_development" tools:ignore="TypographyEllipsis">\"開發者詳情\" 正在開發中...</string>
<string name="text_developer_options">開發者選項</string>
@@ -551,6 +568,7 @@
<string name="text_device_screen_resolution">裝置螢幕解析度</string>
<string name="text_directly_download">直接下載</string>
<string name="text_directory">資料夾</string>
<string name="text_disabled">已禁用</string>
<string name="text_display_over_other_app">顯示在其他應用上層</string>
<string name="text_display_over_other_app_is_recommended">建議授予 \"顯示在其他應用上層\" 許可權以確保應用視窗元件正常顯示</string>
<string name="text_disposable_task">一次性任務</string>
@@ -583,6 +601,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">使用 root 許可權啟用無障礙服務超時</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">使用修改安全設定許可權自動啟用無障礙服務</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">使用修改安全設定許可權啟用無障礙服務超時</string>
<string name="text_enable_plugin">啟用外掛</string>
<string name="text_enabled">已啟用</string>
<string name="text_error">錯誤</string>
<string name="text_error_copy_file">檔案複製失敗: %s</string>
<string name="text_error_report">錯誤報告</string>
@@ -613,10 +633,12 @@
<string name="text_failed_to_grant_access">授權失敗</string>
<string name="text_failed_to_grant_draw_overlays_permission">顯示在其他應用上層許可權授予失敗</string>
<string name="text_failed_to_import">匯入失敗</string>
<string name="text_failed_to_install">安裝失敗</string>
<string name="text_failed_to_locate">定位失敗</string>
<string name="text_failed_to_login">登入失敗</string>
<string name="text_failed_to_register">註冊失敗</string>
<string name="text_failed_to_report">提交失敗</string>
<string name="text_failed_to_retrieve">獲取失敗</string>
<string name="text_failed_to_save_remote_project_to_local_storage">無法儲存遠端專案至本地</string>
<string name="text_failed_to_send_log_entries">日誌條目傳送失敗</string>
<string name="text_failed_to_write_file">檔案寫入失敗</string>
@@ -633,6 +655,7 @@
<string name="text_filename_cannot_contain_invalid_character">檔案名稱不能包含以下字符: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">檔案名稱太長</string>
<string name="text_files_transfer">檔案遷移</string>
<string name="text_filter">篩選</string>
<string name="text_find">查詢</string>
<string name="text_find_java_classes">搜尋 Java 類</string>
<string name="text_find_next_simplified">下一個</string>
@@ -651,6 +674,7 @@
<string name="text_generated_code">已生成程式碼</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">正在獲取版本資訊...</string>
<string name="text_github_backup_url_used">備用 URL 已使用</string>
<string name="text_global_settings">全域性設定</string>
<string name="text_go_to_settings">開啟 \"設定\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">在 Shizuku 應用中授予 AutoJs6 許可權</string>
<string name="text_granted">已授予</string>
@@ -678,6 +702,10 @@
<string name="text_inspect_layout_bounds">佈局範圍分析</string>
<string name="text_inspect_layout_hierarchy">佈局層次分析</string>
<string name="text_install">安裝</string>
<string name="text_install_from_local_file">從 \"本地檔案\" 安裝</string>
<string name="text_install_from_url">從 \"URL\" 安裝</string>
<string name="text_install_plugin_from_url">從 \"URL\" 安裝外掛</string>
<string name="text_installable">可安裝</string>
<string name="text_invalid_character_is_removed">無效字元已被移除</string>
<string name="text_invalid_package_name">無效包名</string>
<string name="text_invalid_project">無效專案</string>
@@ -697,6 +725,7 @@
<string name="text_key_store_has_not_been_verified">密鑰尚未驗證</string>
<string name="text_key_store_password">密鑰庫密碼</string>
<string name="text_label_name">名稱</string>
<string name="text_label_state">狀態</string>
<string name="text_last_updates_checked_time">上次檢查: %s</string>
<string name="text_latest_activity">最近活動</string>
<string name="text_latest_package">最近包名</string>
@@ -875,6 +904,9 @@
<string name="text_please_input_name">請輸入名稱</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">請稍候...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">請稍後再嘗試此操作...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">外掛詳情</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">指標位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">切換 \"指標位置\" 顯示狀態失敗\n可能缺少 root 許可權</string>
<string name="text_post_notifications_permission">釋出通知許可權</string>
@@ -990,6 +1022,7 @@
<string name="text_signature_scheme">簽名方案</string>
<string name="text_size">大小</string>
<string name="text_some_items_exported">已匯出 %d 個條目</string>
<string name="text_sort">排序</string>
<string name="text_source_file_path">原始碼路徑</string>
<string name="text_special_permissions">特殊許可權</string>
<string name="text_stable_mode">穩定模式</string>
@@ -1031,8 +1064,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">撤銷</string>
<string name="text_undo_simplified">撤銷</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">未知</string>
<string name="text_unverified">未驗證</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">更新</string>
<string name="text_updates_checked_states_cleared">更新檢查狀態已清除</string>
<string name="text_updates_snack_bar_act_later">稍後提示</string>
@@ -1075,14 +1111,8 @@
<string name="text_write_secure_settings">修改安全設定</string>
<string name="text_write_secure_settings_description">安全設定包含應用程式可讀但不可寫入的設定選項, 這些選項只能由 UI 或系統級別應用修改.\n被授予 \"修改安全設定許可權\" 後, 普通應用可直接修改上述安全設定 (例如無障礙服務).</string>
<string name="text_write_system_settings">修改系統設定</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">完整性驗證失敗</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 驗證不一致.\n\n期望值: %1$s\n實際值: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">當前外掛未提供可用的 URL</string>
</resources>

View File

@@ -108,6 +108,7 @@
<string name="dialog_button_open_color_palette">打开调色盘</string>
<string name="dialog_button_quit">放弃</string>
<string name="dialog_button_remove">移除</string>
<string name="dialog_button_retrieve">获取</string>
<string name="dialog_button_retry">重试</string>
<string name="dialog_button_save">保存</string>
<string name="dialog_button_system_settings">系统设置</string>
@@ -299,6 +300,7 @@
<string name="hint_long_click_run_to_debug">长按 \"运行\" 图标可启动调试</string>
<string name="hint_loop_delay">开始循环前的延迟</string>
<string name="hint_loop_times">0 表示无限循环</string>
<string name="instruction_install_plugin_from_url">输入一个指向远程插件地址的 URL.\n例如 \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">最近使用: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">线程 \"blob\" 请求失败</string>
<string name="logger_ver_history_blob_thread_success">线程 \"blob\" 请求成功, 写入离线缓存</string>
@@ -335,7 +337,17 @@
<string name="mt_custom">自定义</string>
<string name="no_apk_builder_plugin">打包插件未安装</string>
<string name="no_root_access_for_record">AutoJs6 无 root 权限, 无法录制脚本</string>
<string name="plugin_item_info_author">开发者</string>
<string name="plugin_item_info_collaborators">合作者</string>
<string name="plugin_item_info_first_install_time">首次安装</string>
<string name="plugin_item_info_installed_version">已安装版本</string>
<string name="plugin_item_info_last_install_time">最近安装</string>
<string name="plugin_item_info_last_uninstall_time">最近卸载</string>
<string name="plugin_item_info_last_update_time">最近更新</string>
<string name="plugin_item_info_package_size">安装包大小</string>
<string name="plugin_item_info_updatable_version">可更新版本</string>
<string name="prompt_add_ignored_version">确定忽略当前更新版本吗?\n在应用设置中可管理已忽略的所有版本.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">当前文件可能不是有效的插件包, 是否继续安装?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">需要重启应用才能完成文档源切换</string>
<string name="prompt_restart_may_be_needed_for_language_switch">部分内容可能需要重启应用才能完成语言切换</string>
<string name="screen_capturer_foreground_notification_channel_name">屏幕捕获器前台服务</string>
@@ -431,6 +443,8 @@
<string name="text_app_shortcut_docs_short_label">文档</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 日志</string>
<string name="text_app_shortcut_log_short_label">日志</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 插件中心</string>
<string name="text_app_shortcut_plugin_center_short_label">插件</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 设置</string>
<string name="text_app_shortcut_settings_short_label">设置</string>
<string name="text_app_source_code">软件源码</string>
@@ -479,9 +493,11 @@
<string name="text_clear_file_selection">清空文件选择</string>
<string name="text_clear_pre_execute_script">清空预执行脚本</string>
<string name="text_clear_updates_checked_states">清除更新检查状态</string>
<string name="text_click_icon_to_add_launcher_shortcut">点击图标添加启动器快捷方式</string>
<string name="text_click_item_to_remove">点击条目可移除</string>
<string name="text_click_item_to_show_details">点击条目可查看详情</string>
<string name="text_click_ok_to_go_to_settings">点击 \"确定\" 跳转到设置页面</string>
<string name="text_click_other_areas_to_exit_selection">点击其他区域退出选择</string>
<string name="text_click_too_frequently">操作频率过快</string>
<string name="text_client_mode">客户端模式</string>
<string name="text_clone_color_library">克隆颜色库</string>
@@ -538,6 +554,7 @@
<string name="text_delete">删除</string>
<string name="text_delete_all">删除全部</string>
<string name="text_delete_line">删除行</string>
<string name="text_description">描述</string>
<string name="text_details">详情</string>
<string name="text_developer_details_under_development" tools:ignore="TypographyEllipsis">\"开发者详情\" 正在开发中...</string>
<string name="text_developer_options">开发者选项</string>
@@ -551,6 +568,7 @@
<string name="text_device_screen_resolution">设备屏幕分辨率</string>
<string name="text_directly_download">直接下载</string>
<string name="text_directory">文件夹</string>
<string name="text_disabled">已禁用</string>
<string name="text_display_over_other_app">显示在其他应用上层</string>
<string name="text_display_over_other_app_is_recommended">建议授予 \"显示在其他应用上层\" 权限以确保应用窗口组件正常显示</string>
<string name="text_disposable_task">一次性任务</string>
@@ -583,6 +601,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">使用 root 权限启用无障碍服务超时</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">使用修改安全设置权限自动启用无障碍服务</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">使用修改安全设置权限启用无障碍服务超时</string>
<string name="text_enable_plugin">启用插件</string>
<string name="text_enabled">已启用</string>
<string name="text_error">错误</string>
<string name="text_error_copy_file">文件复制失败: %s</string>
<string name="text_error_report">错误报告</string>
@@ -613,10 +633,12 @@
<string name="text_failed_to_grant_access">授权失败</string>
<string name="text_failed_to_grant_draw_overlays_permission">显示在其他应用上层权限授予失败</string>
<string name="text_failed_to_import">导入失败</string>
<string name="text_failed_to_install">安装失败</string>
<string name="text_failed_to_locate">定位失败</string>
<string name="text_failed_to_login">登录失败</string>
<string name="text_failed_to_register">注册失败</string>
<string name="text_failed_to_report">提交失败</string>
<string name="text_failed_to_retrieve">获取失败</string>
<string name="text_failed_to_save_remote_project_to_local_storage">无法保存远程项目至本地</string>
<string name="text_failed_to_send_log_entries">日志条目发送失败</string>
<string name="text_failed_to_write_file">文件写入失败</string>
@@ -633,6 +655,7 @@
<string name="text_filename_cannot_contain_invalid_character">文件名不能包含下列任何字符: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">文件名太长</string>
<string name="text_files_transfer">文件迁移</string>
<string name="text_filter">筛选</string>
<string name="text_find">查找</string>
<string name="text_find_java_classes">搜索 Java 类</string>
<string name="text_find_next_simplified">下一个</string>
@@ -651,6 +674,7 @@
<string name="text_generated_code">已生成代码</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">正在获取版本信息...</string>
<string name="text_github_backup_url_used">备用 URL 已使用</string>
<string name="text_global_settings">全局设置</string>
<string name="text_go_to_settings">打开 \"设置\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">在 Shizuku 应用中授予 AutoJs6 权限</string>
<string name="text_granted">已授予</string>
@@ -678,6 +702,10 @@
<string name="text_inspect_layout_bounds">布局范围分析</string>
<string name="text_inspect_layout_hierarchy">布局层次分析</string>
<string name="text_install">安装</string>
<string name="text_install_from_local_file">从 \"本地文件\" 安装</string>
<string name="text_install_from_url">从 \"URL\" 安装</string>
<string name="text_install_plugin_from_url">从 \"URL\" 安装插件</string>
<string name="text_installable">可安装</string>
<string name="text_invalid_character_is_removed">无效字符已被移除</string>
<string name="text_invalid_package_name">无效包名</string>
<string name="text_invalid_project">无效项目</string>
@@ -697,6 +725,7 @@
<string name="text_key_store_has_not_been_verified">密钥尚未验证</string>
<string name="text_key_store_password">密钥库密码</string>
<string name="text_label_name">名称</string>
<string name="text_label_state">状态</string>
<string name="text_last_updates_checked_time">上次检查: %s</string>
<string name="text_latest_activity">最近活动</string>
<string name="text_latest_package">最近包名</string>
@@ -875,6 +904,9 @@
<string name="text_please_input_name">请输入名称</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">请稍候...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">请稍后再尝试此操作...</string>
<string name="text_plugin_center">插件中心</string>
<string name="text_plugin_details">插件详情</string>
<string name="text_plugins">插件</string>
<string name="text_pointer_location">指针位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">切换 \"指针位置\" 显示状态失败\n可能缺少 root 权限</string>
<string name="text_post_notifications_permission">发布通知权限</string>
@@ -990,6 +1022,7 @@
<string name="text_signature_scheme">签名方案</string>
<string name="text_size">大小</string>
<string name="text_some_items_exported">已导出 %d 个条目</string>
<string name="text_sort">排序</string>
<string name="text_source_file_path">源代码路径</string>
<string name="text_special_permissions">特殊权限</string>
<string name="text_stable_mode">稳定模式</string>
@@ -1031,8 +1064,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">撤销</string>
<string name="text_undo_simplified">撤销</string>
<string name="text_uninstall">卸载</string>
<string name="text_unknown">未知</string>
<string name="text_unverified">未验证</string>
<string name="text_updatable">可更新</string>
<string name="text_update">更新</string>
<string name="text_updates">更新</string>
<string name="text_updates_checked_states_cleared">更新检查状态已清除</string>
<string name="text_updates_snack_bar_act_later">稍后提示</string>
@@ -1075,14 +1111,8 @@
<string name="text_write_secure_settings">修改安全设置</string>
<string name="text_write_secure_settings_description">安全设置包含应用程序可读但不可写入的设置选项, 这些选项只能由 UI 或系统级别应用修改.\n被授予 \"修改安全设置权限\" 后, 普通应用可直接修改上述安全设置 (例如无障碍服务).</string>
<string name="text_write_system_settings">修改系统设置</string>
<string name="text_update">更新</string>
<string name="text_plugin_center">插件中心</string>
<string name="text_plugins">插件</string>
<string name="text_updatable">可更新</string>
<string name="text_uninstall">卸载</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 插件中心</string>
<string name="text_app_shortcut_plugin_center_short_label">插件</string>
<string name="text_click_icon_to_add_launcher_shortcut">点击图标添加启动器快捷方式</string>
<string name="text_click_other_areas_to_exit_selection">点击其他区域退出选择</string>
<string name="text_integrity_verification_failed">完整性验证失败</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 验证不一致.\n\n期望值: %1$s\n实际值: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">当前插件未提供可用的 URL</string>
</resources>

View File

@@ -87,6 +87,7 @@
<color name="dialog_button_finish">#009624</color>
<color name="dialog_button_hint">#0DA798</color>
<color name="dialog_button_reset">#A1887F</color>
<color name="dialog_button_not_recommended">#A1887F</color>
<color name="dialog_button_success">@color/dialog_button_finish</color>
<color name="dialog_button_unavailable">#BDBDBD</color>
<color name="dialog_button_warn">#F57C00</color>

View File

@@ -182,6 +182,7 @@
<string name="property_key_app_version_code" translatable="false">VERSION_BUILD</string>
<string name="property_key_app_version_name" translatable="false">VERSION_NAME</string>
<string name="symbol_colon" translatable="false">:</string>
<string name="symbol_pipe" translatable="false">|</string>
<string name="symbol_question_mark" translatable="false">\?</string>
<string name="text_abis" translatable="false">ABIs</string>
<string name="text_app_name_accuweather" translatable="false">AccuWeather</string>
@@ -359,6 +360,7 @@
<string name="dialog_button_open_color_palette">Palette</string>
<string name="dialog_button_quit">Quit</string>
<string name="dialog_button_remove">Remove</string>
<string name="dialog_button_retrieve">Retrieve</string>
<string name="dialog_button_retry">Retry</string>
<string name="dialog_button_save">Save</string>
<string name="dialog_button_system_settings">System Settings</string>
@@ -553,6 +555,7 @@
<string name="hint_long_click_run_to_debug">Long click \"Run\" button to debug</string>
<string name="hint_loop_delay">Delay before loop</string>
<string name="hint_loop_times">0 for infinite loop</string>
<string name="instruction_install_plugin_from_url">Enter a URL pointing to a remote plugin address.\nFor example \"https://example.com/plugin.apk\".</string>
<string name="label_latest_used_time">Latest used: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" thread request failed</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" thread request successful, writing offline cache</string>
@@ -589,7 +592,17 @@
<string name="mt_custom">Custom</string>
<string name="no_apk_builder_plugin">APK Builder is not installed</string>
<string name="no_root_access_for_record">AutoJs6 has no root access to record a script</string>
<string name="plugin_item_info_author">Author</string>
<string name="plugin_item_info_collaborators">Collaborators</string>
<string name="plugin_item_info_first_install_time">First install</string>
<string name="plugin_item_info_installed_version">Installed ver.</string>
<string name="plugin_item_info_last_install_time">Last install</string>
<string name="plugin_item_info_last_uninstall_time">Last uninstall</string>
<string name="plugin_item_info_last_update_time">Last update</string>
<string name="plugin_item_info_package_size">Package size</string>
<string name="plugin_item_info_updatable_version">Updatable ver.</string>
<string name="prompt_add_ignored_version">Are you sure to ignore current update version?\nYou can manage all ignored versions by app settings.</string>
<string name="prompt_file_may_not_be_a_valid_plugin_package_with_uri">The current file may not be a valid plugin package, do you want to continue with installation?\n\nURI: \"%1$s\"</string>
<string name="prompt_restart_is_needed_for_docs_source_switch">An app restart is needed to apply new settings</string>
<string name="prompt_restart_may_be_needed_for_language_switch">An app restart may be needed to make language applied as expected</string>
<string name="screen_capturer_foreground_notification_channel_name">Screen capturer foreground service</string>
@@ -685,6 +698,8 @@
<string name="text_app_shortcut_docs_short_label">Docs</string>
<string name="text_app_shortcut_log_long_label">AutoJs6 Log</string>
<string name="text_app_shortcut_log_short_label">Log</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_app_shortcut_settings_long_label">AutoJs6 Settings</string>
<string name="text_app_shortcut_settings_short_label">Settings</string>
<string name="text_app_source_code">Source code</string>
@@ -733,9 +748,11 @@
<string name="text_clear_file_selection">Clear file selection</string>
<string name="text_clear_pre_execute_script">Clear pre-execute script</string>
<string name="text_clear_updates_checked_states">Clear updates checked states</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_item_to_remove">Click the item to remove</string>
<string name="text_click_item_to_show_details">Click an item to view details</string>
<string name="text_click_ok_to_go_to_settings">Click \"OK\" to go to settings</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_click_too_frequently">Frequent operation</string>
<string name="text_client_mode">Client mode</string>
<string name="text_clone_color_library">Clone a color library</string>
@@ -792,6 +809,7 @@
<string name="text_delete">Delete</string>
<string name="text_delete_all">Delete All</string>
<string name="text_delete_line">Delete line</string>
<string name="text_description">Description</string>
<string name="text_details">Details</string>
<string name="text_developer_details_under_development">Developer details is under development</string>
<string name="text_developer_options">Developer options</string>
@@ -805,6 +823,7 @@
<string name="text_device_screen_resolution">Device screen resolution</string>
<string name="text_directly_download">Download now</string>
<string name="text_directory">Directory</string>
<string name="text_disabled">Disabled</string>
<string name="text_display_over_other_app">Display over other apps</string>
<string name="text_display_over_other_app_is_recommended">\"Display over other apps\" permission is recommended to make all widgets displayed properly</string>
<string name="text_disposable_task">Disposable task</string>
@@ -837,6 +856,8 @@
<string name="text_enable_a11y_service_with_root_access_timeout">Enable accessibility service with root access timed out</string>
<string name="text_enable_a11y_service_with_secure_settings_automatically">Enable accessibility service with secure settings automatically</string>
<string name="text_enable_a11y_service_with_secure_settings_timeout">Enable accessibility service with secure settings timed out</string>
<string name="text_enable_plugin">Enable plugin</string>
<string name="text_enabled">Enabled</string>
<string name="text_error">Error</string>
<string name="text_error_copy_file" formatted="true">Failed to copy file: %s</string>
<string name="text_error_report">Bug report</string>
@@ -867,10 +888,12 @@
<string name="text_failed_to_grant_access">Failed to grant access</string>
<string name="text_failed_to_grant_draw_overlays_permission">Failed to grant display over other apps permission</string>
<string name="text_failed_to_import">Failed to import</string>
<string name="text_failed_to_install">Failed to install</string>
<string name="text_failed_to_locate">Failed to locate</string>
<string name="text_failed_to_login">Failed to login</string>
<string name="text_failed_to_register">Failed to register</string>
<string name="text_failed_to_report">Failed to submit</string>
<string name="text_failed_to_retrieve">Failed to retrieve</string>
<string name="text_failed_to_save_remote_project_to_local_storage">Failed to save remote project to local storage</string>
<string name="text_failed_to_send_log_entries">Failed to send log entries</string>
<string name="text_failed_to_write_file">Failed to write file</string>
@@ -887,6 +910,7 @@
<string name="text_filename_cannot_contain_invalid_character">Filename cannot contain the following characters: \\ / : * ? &quot; &lt; &gt; |</string>
<string name="text_filename_is_too_long">Filename is too long</string>
<string name="text_files_transfer">Files transfer</string>
<string name="text_filter">Filter</string>
<string name="text_find">Find</string>
<string name="text_find_java_classes">Find Java classes</string>
<string name="text_find_next_simplified">Next</string>
@@ -905,6 +929,7 @@
<string name="text_generated_code">Generated code</string>
<string name="text_getting_release_notes" tools:ignore="TypographyEllipsis">Retrieving release notes...</string>
<string name="text_github_backup_url_used">Backup URL has been used</string>
<string name="text_global_settings">Global settings</string>
<string name="text_go_to_settings">Go to \"Settings\"</string>
<string name="text_grant_autojs6_access_in_shizuku_app">Grant AutoJs6 access in Shizuku app</string>
<string name="text_granted">Granted</string>
@@ -932,6 +957,10 @@
<string name="text_inspect_layout_bounds">Inspect layout bounds</string>
<string name="text_inspect_layout_hierarchy">Inspect layout hierarchy</string>
<string name="text_install">Install</string>
<string name="text_install_from_local_file">Install from \"Local File\"</string>
<string name="text_install_from_url">Install from \"URL\"</string>
<string name="text_install_plugin_from_url">Install plugin from \"URL\"</string>
<string name="text_installable">Installable</string>
<string name="text_invalid_character_is_removed">Invalid character is removed</string>
<string name="text_invalid_package_name">Invalid package name</string>
<string name="text_invalid_project">Invalid project</string>
@@ -951,6 +980,7 @@
<string name="text_key_store_has_not_been_verified">Keystore has not been verified</string>
<string name="text_key_store_password">Key Store Password</string>
<string name="text_label_name">Label</string>
<string name="text_label_state">State</string>
<string name="text_last_updates_checked_time">Last checked: %s</string>
<string name="text_latest_activity">Latest activity</string>
<string name="text_latest_package">Latest package</string>
@@ -1129,6 +1159,9 @@
<string name="text_please_input_name">Input name</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Please wait...</string>
<string name="text_please_wait_a_moment_before_trying_again" tools:ignore="TypographyEllipsis">Please wait a moment before trying again...</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugin_details">Plugin details</string>
<string name="text_plugins">Plugins</string>
<string name="text_pointer_location">Pointer location</string>
<string name="text_pointer_location_toggle_failed_with_hint">Toggle \"pointer location\" failed.\nRoot access is required.</string>
<string name="text_post_notifications_permission">Post notifications</string>
@@ -1244,6 +1277,7 @@
<string name="text_signature_scheme">Signature Scheme</string>
<string name="text_size">Size</string>
<string name="text_some_items_exported">%d items exported</string>
<string name="text_sort">Sort</string>
<string name="text_source_file_path">Source code path</string>
<string name="text_special_permissions">Special permissions</string>
<string name="text_stable_mode">Stable mode</string>
@@ -1285,8 +1319,11 @@
<string name="text_under_development_title">@string/text_under_development</string>
<string name="text_undo">Undo</string>
<string name="text_undo_simplified">Undo</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_unknown">Unknown</string>
<string name="text_unverified">Unverified</string>
<string name="text_updatable">Updatable</string>
<string name="text_update">Update</string>
<string name="text_updates">Updates</string>
<string name="text_updates_checked_states_cleared">Updates checked states cleared</string>
<string name="text_updates_snack_bar_act_later">Later</string>
@@ -1329,14 +1366,8 @@
<string name="text_write_secure_settings">Write security settings</string>
<string name="text_write_secure_settings_description">Secure system settings, containing system preferences that applications can read but are not allowed to write.\nThese are for preferences that the user must explicitly modify through the UI of a system app.\nWith secure system settings permission, normal applications can directly modify the secure settings (such as accessibility service).</string>
<string name="text_write_system_settings">Write system settings</string>
<string name="text_update">Update</string>
<string name="text_plugin_center">Plugin center</string>
<string name="text_plugins">Plugins</string>
<string name="text_updatable">Updatable</string>
<string name="text_uninstall">Uninstall</string>
<string name="text_app_shortcut_plugin_center_long_label">AutoJs6 Plugin Center</string>
<string name="text_app_shortcut_plugin_center_short_label">Plugins</string>
<string name="text_click_icon_to_add_launcher_shortcut">Click icon to add launcher shortcut</string>
<string name="text_click_other_areas_to_exit_selection">Click other areas to exit selection</string>
<string name="text_integrity_verification_failed">Integrity verification failed</string>
<string name="text_sha256_mismatch_multiline_expected_actual">SHA-256 mismatch.\n\nExpected: %1$s\nActual: %2$s</string>
<string name="error_no_available_url_provided_for_current_plugin">No available URL provided for current plugin</string>
</resources>