6.6.3 - Alpha5 - 代码编辑器支持显示文件详细信息 (issue #395)
This commit is contained in:
@@ -40,18 +40,26 @@ object MaterialDialogExtensions {
|
||||
}
|
||||
}
|
||||
|
||||
fun MaterialDialog.setCopyableTextIfAbsent(textView: TextView, textValue: String?) {
|
||||
fun MaterialDialog.setCopyableTextIfAbsent(textView: TextView, textValuePair: Pair<String?, String?>) {
|
||||
setCopyableTextIfAbsent(textView, textValuePair.first, textValuePair.second)
|
||||
}
|
||||
|
||||
fun MaterialDialog.setCopyableTextIfAbsent(textView: TextView, textValue: String?, suffix: String? = null) {
|
||||
if (textView.text == context.getString(R.string.ellipsis_six)) {
|
||||
textView.text = textValue.takeUnless { it.isNullOrBlank() } ?: context.getString(R.string.text_unknown)
|
||||
textView.text = textValue.takeUnless { it.isNullOrBlank() }?.let { it + (suffix ?: "") } ?: context.getString(R.string.text_unknown)
|
||||
}
|
||||
this.makeTextCopyable(textView, textValue)
|
||||
}
|
||||
|
||||
fun MaterialDialog.setCopyableTextIfAbsent(textView: TextView, scope: CoroutineScope, f: () -> String?) {
|
||||
setCopyableTextIfAbsent(textView, scope, f, suffix = null)
|
||||
}
|
||||
|
||||
fun MaterialDialog.setCopyableTextIfAbsent(textView: TextView, scope: CoroutineScope, f: () -> String?, suffix: String?) {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
val textValue = f.invoke()
|
||||
withContext(Dispatchers.Main) {
|
||||
setCopyableTextIfAbsent(textView, textValue)
|
||||
setCopyableTextIfAbsent(textView, textValue, suffix)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,11 @@ package org.autojs.autojs.extension
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import android.widget.PopupMenu
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import org.autojs.autojs.util.ViewUtils.onceGlobalLayout
|
||||
|
||||
/**
|
||||
* Created by SuperMonster003 on May 7, 2025.
|
||||
@@ -26,4 +30,43 @@ object ViewExtensions {
|
||||
}
|
||||
}
|
||||
|
||||
val Toolbar.titleView: TextView?
|
||||
get() = this.findViewById(com.google.android.material.R.id.action_bar_title)
|
||||
?: Toolbar::class.java.getDeclaredField("mTitleTextView").apply { isAccessible = true }.get(this@titleView) as TextView?
|
||||
|
||||
val Toolbar.subtitleView: TextView?
|
||||
get() = this.findViewById(com.google.android.material.R.id.action_bar_subtitle)
|
||||
?: Toolbar::class.java.getDeclaredField("mSubtitleTextView").apply { isAccessible = true }.get(this@subtitleView) as TextView?
|
||||
|
||||
@JvmStatic
|
||||
fun Toolbar.setOnTitleViewClickListener(l: View.OnClickListener?) {
|
||||
this.setOnTitleViewClickListener(l, withFallback = true)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun Toolbar.setOnTitleViewClickListener(l: View.OnClickListener?, withFallback: Boolean) {
|
||||
this.onceGlobalLayout {
|
||||
this.titleView?.setOnClickListener(l) ?: run { if (withFallback) this.setOnClickListener(l) }
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun Toolbar.setOnSubtitleViewClickListener(l: View.OnClickListener?) {
|
||||
this.onceGlobalLayout {
|
||||
this.subtitleView?.setOnClickListener(l)
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun Toolbar.setOnTitleViewLongClickListener(l: View.OnLongClickListener?) {
|
||||
this.setOnTitleViewLongClickListener(l, withFallback = true)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun Toolbar.setOnTitleViewLongClickListener(l: View.OnLongClickListener?, withFallback: Boolean) {
|
||||
this.onceGlobalLayout {
|
||||
this.titleView?.setOnLongClickListener(l) ?: run { if (withFallback) this.setOnLongClickListener(l) }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.autojs.autojs.external.ScriptIntents
|
||||
import org.autojs.autojs.external.fileprovider.AppFileProvider
|
||||
import org.autojs.autojs.external.shortcut.Shortcut
|
||||
import org.autojs.autojs.external.shortcut.ShortcutActivity
|
||||
import org.autojs.autojs.runtime.api.Mime
|
||||
import org.autojs.autojs.runtime.exception.ScriptInterruptedException
|
||||
import org.autojs.autojs.script.ScriptSource
|
||||
import org.autojs.autojs.ui.edit.EditActivity
|
||||
@@ -81,7 +82,7 @@ object Scripts {
|
||||
IntentUtils.viewFile(
|
||||
globalAppContext,
|
||||
uri,
|
||||
"text/plain",
|
||||
Mime.TEXT_PLAIN,
|
||||
AppFileProvider.AUTHORITY,
|
||||
ToastExceptionHolder(globalAppContext),
|
||||
)
|
||||
|
||||
@@ -69,7 +69,7 @@ class DisplayOverOtherAppsPermission(override val context: Context) : Permission
|
||||
.negativeText(R.string.text_cancel)
|
||||
.negativeColorRes(R.color.dialog_button_default)
|
||||
.onNegative { dialog, _ -> dialog.dismiss() }
|
||||
.positiveText(R.string.text_ok)
|
||||
.positiveText(R.string.dialog_button_confirm)
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.onPositive { dialog, _ -> dialog.dismiss().also { config() } }
|
||||
.cancelable(false)
|
||||
|
||||
@@ -68,10 +68,8 @@ object ColorInfoDialogManager {
|
||||
Colors.toHsvStringRhino(colorWithoutAlpha).let { binding.colorHsvValue.bindWith(dialog, it) }
|
||||
ColorUtils.toInt(colorWithoutAlpha).let { binding.colorIntValue.bindWith(dialog, it.toString()) }
|
||||
}
|
||||
withContext(Dispatchers.Main) {
|
||||
restoreEssentialViews(binding)
|
||||
updateGuidelines(binding)
|
||||
}
|
||||
restoreEssentialViews(binding)
|
||||
updateGuidelines(binding)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ import androidx.recyclerview.widget.RecyclerView.VERTICAL
|
||||
import androidx.recyclerview.widget.ThemeColorRecyclerView
|
||||
import org.autojs.autojs.core.image.ColorItems
|
||||
import org.autojs.autojs.core.pref.Pref
|
||||
import org.autojs.autojs.extension.ViewExtensions.setOnSubtitleViewClickListener
|
||||
import org.autojs.autojs.extension.ViewExtensions.setOnTitleViewClickListener
|
||||
import org.autojs.autojs.theme.ThemeChangeNotifier
|
||||
import org.autojs.autojs.theme.ThemeColorManager
|
||||
import org.autojs.autojs.theme.app.ColorLibrariesActivity.Companion.COLOR_LIBRARY_ID_DEFAULT
|
||||
@@ -105,7 +107,10 @@ class ColorItemsActivity : ColorSelectBaseActivity() {
|
||||
showColorDetails(ThemeColorManager.colorPrimary, getSubtitle(false))
|
||||
}
|
||||
else -> null
|
||||
}.let { toolbar.setOnClickListener(it) }
|
||||
}.let {
|
||||
toolbar.setOnTitleViewClickListener(it)
|
||||
toolbar.setOnSubtitleViewClickListener(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSubtitle(withHexSuffix: Boolean): String? = when (mLibrary.id) {
|
||||
|
||||
@@ -12,6 +12,8 @@ import androidx.recyclerview.widget.RecyclerView.VERTICAL
|
||||
import androidx.recyclerview.widget.ThemeColorRecyclerView
|
||||
import org.autojs.autojs.core.image.ColorItems
|
||||
import org.autojs.autojs.core.pref.Pref
|
||||
import org.autojs.autojs.extension.ViewExtensions.setOnSubtitleViewClickListener
|
||||
import org.autojs.autojs.extension.ViewExtensions.setOnTitleViewClickListener
|
||||
import org.autojs.autojs.theme.ThemeChangeNotifier
|
||||
import org.autojs.autojs.theme.ThemeColorManager
|
||||
import org.autojs.autojs.util.ViewUtils
|
||||
@@ -52,7 +54,8 @@ class ColorLibrariesActivity : ColorSelectBaseActivity() {
|
||||
setUpAppBar(it.appBar, it.appBarContainer)
|
||||
it.toolbar.let { toolbar ->
|
||||
setUpToolbar(toolbar)
|
||||
toolbar.setOnClickListener { true.also { showThemeColorDetails() } }
|
||||
toolbar.setOnTitleViewClickListener { showThemeColorDetails() }
|
||||
toolbar.setOnSubtitleViewClickListener { showThemeColorDetails() }
|
||||
toolbar.setOnLongClickListener { true.also { /* toggleFabVisibility() */ } }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,8 +123,8 @@ open class MaterialListPreference : MaterialDialogPreference {
|
||||
.title(R.string.text_prompt)
|
||||
.content(content)
|
||||
.widgetThemeColor()
|
||||
.positiveText(R.string.dialog_button_dismiss)
|
||||
.positiveColorRes(R.color.dialog_button_default)
|
||||
.positiveText(R.string.dialog_button_confirm)
|
||||
.positiveColorRes(R.color.dialog_button_hint)
|
||||
.dismissListener { onChangeConfirmed(getDialog()) }
|
||||
.show()
|
||||
}
|
||||
|
||||
@@ -392,7 +392,7 @@ public class ScriptOperations {
|
||||
.title(mContext.getString(R.string.text_confirm_to_delete))
|
||||
.content(scriptFile.getName())
|
||||
.negativeText(R.string.text_cancel)
|
||||
.positiveText(R.string.text_ok)
|
||||
.positiveText(R.string.dialog_button_confirm)
|
||||
.positiveColorRes(R.color.dialog_button_caution)
|
||||
.onPositive((dialog, which) -> deleteWithoutConfirm(scriptFile))
|
||||
.build()
|
||||
@@ -413,7 +413,7 @@ public class ScriptOperations {
|
||||
.content(content)
|
||||
.negativeText(R.string.text_cancel)
|
||||
.negativeColorRes(R.color.dialog_button_default)
|
||||
.positiveText(R.string.text_ok)
|
||||
.positiveText(R.string.dialog_button_confirm)
|
||||
.positiveColorRes(R.color.dialog_button_warn)
|
||||
.onPositive((dialog, which) -> setAsWorkingDirNow(scriptFile))
|
||||
.build()
|
||||
@@ -491,7 +491,7 @@ public class ScriptOperations {
|
||||
.justScriptFile()
|
||||
.singleChoice(file -> importFile(file.getPath()).subscribe())
|
||||
.title(R.string.text_select_file_to_import)
|
||||
.positiveText(R.string.text_ok)
|
||||
.positiveText(R.string.dialog_button_confirm)
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.show();
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import android.view.ActionMode
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
@@ -26,11 +25,14 @@ import org.autojs.autojs.app.OnActivityResultDelegate.DelegateHost
|
||||
import org.autojs.autojs.core.permission.OnRequestPermissionsResultCallback
|
||||
import org.autojs.autojs.core.permission.PermissionRequestProxyActivity
|
||||
import org.autojs.autojs.core.permission.RequestPermissionCallbacks
|
||||
import org.autojs.autojs.extension.ViewExtensions.setOnTitleViewClickListener
|
||||
import org.autojs.autojs.extension.ViewExtensions.titleView
|
||||
import org.autojs.autojs.pio.PFiles
|
||||
import org.autojs.autojs.storage.file.TmpScriptFiles
|
||||
import org.autojs.autojs.theme.widget.ThemeColorToolbar
|
||||
import org.autojs.autojs.ui.BaseActivity
|
||||
import org.autojs.autojs.ui.main.MainActivity
|
||||
import org.autojs.autojs.ui.main.scripts.EditableFileInfoDialogManager
|
||||
import org.autojs.autojs.util.Observers
|
||||
import org.autojs.autojs.util.ViewUtils.onceGlobalLayout
|
||||
import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance
|
||||
@@ -38,6 +40,8 @@ import org.autojs.autojs6.R
|
||||
import org.autojs.autojs6.databinding.ActivityEditBinding
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import androidx.core.view.get
|
||||
import androidx.core.view.size
|
||||
|
||||
/**
|
||||
* Created by Stardust on Jan 29, 2017.
|
||||
@@ -61,6 +65,11 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
val binding = ActivityEditBinding.inflate(layoutInflater).also { setContentView(it.root) }
|
||||
mToolbar = findViewById<ThemeColorToolbar>(R.id.toolbar).apply {
|
||||
setTitleTextAppearance(this@EditActivity, R.style.TextAppearanceEditorTitle)
|
||||
setOnTitleViewClickListener {
|
||||
EditableFileInfoDialogManager.showEditableFileInfoDialog(this@EditActivity, mEditorView.uri.path?.let { File(it) }) {
|
||||
mEditorView.editor.text
|
||||
}
|
||||
}
|
||||
}
|
||||
mEditorView = binding.editorView.apply {
|
||||
handleIntent(intent)
|
||||
@@ -91,27 +100,24 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
menuInflater.inflate(R.menu.menu_editor, menu)
|
||||
mToolbar?.let { toolbar ->
|
||||
toolbar.setMenuIconsColorByThemeColorLuminance(this)
|
||||
toolbar.onceGlobalLayout {
|
||||
val titleView = toolbar.findViewById(com.google.android.material.R.id.action_bar_title) ?: run {
|
||||
Toolbar::class.java.getDeclaredField("mTitleTextView").apply { isAccessible = true }.get(toolbar) as TextView?
|
||||
}
|
||||
titleView?.adjustTitleTextView()
|
||||
}
|
||||
toolbar.onceGlobalLayout { toolbar.titleView?.adjustTitleTextView() }
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private fun TextView.adjustTitleTextView() = this.post {
|
||||
ValueAnimator.ofFloat(this.textSize, calculatedTextSize(this) ?: return@post).let {
|
||||
it.duration = 120L
|
||||
it.addUpdateListener { this.setTextSize(TypedValue.COMPLEX_UNIT_PX, it.animatedValue as Float) }
|
||||
it.start()
|
||||
ValueAnimator.ofFloat(this.textSize, calculatedTextSize(this) ?: return@post).let { animator ->
|
||||
animator.duration = 120L
|
||||
animator.addUpdateListener { this.setTextSize(TypedValue.COMPLEX_UNIT_PX, it.animatedValue as Float) }
|
||||
animator.start()
|
||||
}
|
||||
}
|
||||
|
||||
// @Created by JetBrains AI Assistant on Mar 24, 2025.
|
||||
private fun calculatedTextSize(textView: TextView): Float? {
|
||||
// 可用宽度, 排除内边距
|
||||
|
||||
// Available width excluding padding.
|
||||
// zh-CN: 可用宽度, 排除内边距.
|
||||
val availableWidth = textView.width - textView.paddingLeft - textView.paddingRight
|
||||
if (availableWidth <= 0) return null
|
||||
|
||||
@@ -120,7 +126,8 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
val paint: TextPaint = textView.paint
|
||||
val step = resources.getDimension(R.dimen.editor_title_text_size_step)
|
||||
|
||||
/* ---------- 尝试一行显示 (单行) ---------- */
|
||||
/* Try single line display.
|
||||
* zh-CN: 尝试一行显示 (单行). */
|
||||
|
||||
textView.isSingleLine = true
|
||||
textView.maxLines = 1
|
||||
@@ -128,27 +135,32 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
var oneLineTextSizePx = textView.textSize
|
||||
val minOneLineSizePx = resources.getDimension(R.dimen.editor_title_min_text_size_single_line)
|
||||
|
||||
// 测量一行文字宽度
|
||||
// Measure single line text width.
|
||||
// zh-CN: 测量一行文字宽度.
|
||||
paint.textSize = oneLineTextSizePx
|
||||
var measuredWidth = paint.measureText(textStr)
|
||||
// 当文字宽度超出可用宽度并且字号还高于下限的时候逐步降低字号
|
||||
// Gradually decrease text size when width exceeds and size is above minimum.
|
||||
// zh-CN: 当文字宽度超出可用宽度并且字号还高于下限的时候逐步降低字号.
|
||||
while (measuredWidth > availableWidth && oneLineTextSizePx > minOneLineSizePx) {
|
||||
oneLineTextSizePx -= step
|
||||
paint.textSize = oneLineTextSizePx
|
||||
measuredWidth = paint.measureText(textStr)
|
||||
}
|
||||
|
||||
// 如果一行能够显示文字, 则直接应用修改
|
||||
// If text fits in one line, apply changes directly.
|
||||
// zh-CN: 如果一行能够显示文字, 则直接应用修改.
|
||||
if (measuredWidth <= availableWidth) {
|
||||
return oneLineTextSizePx
|
||||
}
|
||||
|
||||
/* ---------- 切换为两行显示 ---------- */
|
||||
/* Switch to double line display.
|
||||
* zh-CN: 切换为两行显示. */
|
||||
|
||||
textView.isSingleLine = false
|
||||
textView.maxLines = 2
|
||||
|
||||
// 重置字号
|
||||
// Reset text size.
|
||||
// zh-CN: 重置字号.
|
||||
var twoLineTextSize = when (isNonAscii) {
|
||||
true -> resources.getDimension(R.dimen.editor_title_text_size_double_line_non_ascii)
|
||||
else -> resources.getDimension(R.dimen.editor_title_text_size_double_line_ascii)
|
||||
@@ -157,7 +169,8 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
val minTwoLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_double_line)
|
||||
paint.textSize = twoLineTextSize
|
||||
|
||||
// 检查两行显示是否足够: 利用 StaticLayout 测量文字显示效果
|
||||
// Check if two lines are sufficient using StaticLayout to measure text display.
|
||||
// zh-CN: 检查两行显示是否足够: 利用 StaticLayout 测量文字显示效果.
|
||||
fun createStaticLayout(textSize: Float): StaticLayout {
|
||||
paint.textSize = textSize
|
||||
return StaticLayout.Builder
|
||||
@@ -168,7 +181,8 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
}
|
||||
|
||||
var layout = createStaticLayout(twoLineTextSize)
|
||||
// 当行数超出了两行且字号尚未到达最低要求, 则逐步降低字号
|
||||
// When line count exceeds 2 and text size is above minimum, decrease size gradually.
|
||||
// zh-CN: 当行数超出了两行且字号尚未到达最低要求, 则逐步降低字号.
|
||||
while (layout.lineCount > 2 && twoLineTextSize > minTwoLineSize) {
|
||||
twoLineTextSize -= step
|
||||
layout = createStaticLayout(twoLineTextSize)
|
||||
@@ -177,7 +191,8 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
return twoLineTextSize
|
||||
}
|
||||
|
||||
/* ---------- 切换为三行显示 ---------- */
|
||||
/* Switch to triple line display.
|
||||
* zh-CN: 切换为三行显示. */
|
||||
|
||||
textView.maxLines = 3
|
||||
|
||||
@@ -205,7 +220,7 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc
|
||||
Log.d(LOG_TAG, "onActionModeStarted: $mode")
|
||||
|
||||
val menu = mode.menu
|
||||
val item = menu.getItem(menu.size() - 1)
|
||||
val item = menu[menu.size - 1]
|
||||
|
||||
addMenuItem(menu, item.groupId, R.id.action_delete_line, 10000, R.string.text_delete_line) { mEditorMenu.deleteLine() }
|
||||
addMenuItem(menu, item.groupId, R.id.action_copy_line, 20000, R.string.text_copy_line) { mEditorMenu.copyLine() }
|
||||
|
||||
@@ -2,23 +2,21 @@ package org.autojs.autojs.ui.edit;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.text.InputType;
|
||||
import android.text.TextUtils;
|
||||
import android.view.MenuItem;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import org.autojs.autojs.core.pref.Language;
|
||||
import org.autojs.autojs.core.pref.Pref;
|
||||
import org.autojs.autojs.extension.MaterialDialogExtensions;
|
||||
import org.autojs.autojs.model.indices.AndroidClass;
|
||||
import org.autojs.autojs.model.indices.ClassSearchingItem;
|
||||
import org.autojs.autojs.pio.PFiles;
|
||||
import org.autojs.autojs.script.JavaScriptFileSource;
|
||||
import org.autojs.autojs.ui.common.NotAskAgainDialog;
|
||||
import org.autojs.autojs.ui.edit.editor.CodeEditor;
|
||||
import org.autojs.autojs.ui.main.scripts.EditableFileInfoDialogManager;
|
||||
import org.autojs.autojs.ui.project.BuildActivity;
|
||||
import org.autojs.autojs.util.ClipboardUtils;
|
||||
import org.autojs.autojs.util.ConsoleUtils;
|
||||
@@ -27,6 +25,7 @@ import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder;
|
||||
import org.autojs.autojs.util.ViewUtils;
|
||||
import org.autojs.autojs6.R;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -138,8 +137,8 @@ public class EditorMenu {
|
||||
if (itemId == R.id.action_open_by_other_apps) {
|
||||
return tryDoing(mEditorView::openByOtherApps);
|
||||
}
|
||||
if (itemId == R.id.action_info) {
|
||||
showInfo();
|
||||
if (itemId == R.id.action_file_details) {
|
||||
showFileDetails();
|
||||
return true;
|
||||
}
|
||||
if (itemId == R.id.action_build_apk) {
|
||||
@@ -209,10 +208,7 @@ public class EditorMenu {
|
||||
}
|
||||
|
||||
private void startBuildApkActivity() {
|
||||
Uri uri = mEditorView.uri;
|
||||
if (uri != null) {
|
||||
BuildActivity.launch(mContext, uri.getPath());
|
||||
}
|
||||
BuildActivity.launch(mContext, mEditorView.uri.getPath());
|
||||
}
|
||||
|
||||
private void setPinchToZoomStrategy() {
|
||||
@@ -338,24 +334,9 @@ public class EditorMenu {
|
||||
builder.show();
|
||||
}
|
||||
|
||||
@SuppressLint("StringFormatMatches")
|
||||
private void showInfo() {
|
||||
Observable
|
||||
.zip(Observable.just(mEditor.getText()), mEditor.getLineCount(), (text, lineCount) -> {
|
||||
String size = PFiles.getHumanReadableSize(text.length());
|
||||
return String.format(Language.getPrefLanguage().getLocale(), mContext.getString(R.string.format_editor_info),
|
||||
text.length(), lineCount, size);
|
||||
})
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(this::showInfo);
|
||||
|
||||
}
|
||||
|
||||
private void showInfo(String info) {
|
||||
new MaterialDialog.Builder(mContext)
|
||||
.title(R.string.text_info)
|
||||
.content(info)
|
||||
.show();
|
||||
private void showFileDetails() {
|
||||
var path = mEditorView.uri.getPath();
|
||||
EditableFileInfoDialogManager.showEditableFileInfoDialog(mContext, new File(path), mEditor::getText);
|
||||
}
|
||||
|
||||
protected boolean copyLine() {
|
||||
|
||||
@@ -27,10 +27,13 @@ import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import org.autojs.autojs.AutoJs
|
||||
import org.autojs.autojs.core.pref.Pref.getEditorTextSize
|
||||
import org.autojs.autojs.core.pref.Pref.setEditorTextSize
|
||||
import org.autojs.autojs.engine.JavaScriptEngine
|
||||
import org.autojs.autojs.engine.ScriptEngine
|
||||
import org.autojs.autojs.event.BackPressedHandler.HostActivity
|
||||
import org.autojs.autojs.execution.ScriptExecution
|
||||
import org.autojs.autojs.extension.MaterialDialogExtensions.choiceWidgetThemeColor
|
||||
import org.autojs.autojs.model.autocomplete.AutoCompletion
|
||||
import org.autojs.autojs.model.autocomplete.CodeCompletions
|
||||
import org.autojs.autojs.model.autocomplete.Symbols
|
||||
@@ -44,11 +47,7 @@ import org.autojs.autojs.model.script.Scripts.openByOtherApps
|
||||
import org.autojs.autojs.model.script.Scripts.runWithBroadcastSender
|
||||
import org.autojs.autojs.pio.PFiles.getNameWithoutExtension
|
||||
import org.autojs.autojs.pio.PFiles.move
|
||||
import org.autojs.autojs.pio.PFiles.read
|
||||
import org.autojs.autojs.pio.PFiles.write
|
||||
import org.autojs.autojs.core.pref.Pref.getEditorTextSize
|
||||
import org.autojs.autojs.core.pref.Pref.setEditorTextSize
|
||||
import org.autojs.autojs.extension.MaterialDialogExtensions.choiceWidgetThemeColor
|
||||
import org.autojs.autojs.storage.file.TmpScriptFiles
|
||||
import org.autojs.autojs.tool.Callback
|
||||
import org.autojs.autojs.ui.doc.ManualDialog
|
||||
@@ -72,11 +71,15 @@ import org.autojs.autojs.ui.widget.SimpleTextWatcher
|
||||
import org.autojs.autojs.util.DisplayUtils.pxToSp
|
||||
import org.autojs.autojs.util.DocsUtils.getUrl
|
||||
import org.autojs.autojs.util.Observers
|
||||
import org.autojs.autojs.util.StringUtils
|
||||
import org.autojs.autojs.util.ViewUtils.showSnack
|
||||
import org.autojs.autojs.util.ViewUtils.showToast
|
||||
import org.autojs.autojs6.R
|
||||
import org.autojs.autojs6.databinding.EditorViewBinding
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.nio.charset.Charset
|
||||
import java.nio.charset.StandardCharsets
|
||||
|
||||
/**
|
||||
* Created by Stardust on Sep 28, 2017.
|
||||
@@ -94,11 +97,9 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
@JvmField
|
||||
val debugBar: DebugBar = binding.debugBar
|
||||
|
||||
@JvmField
|
||||
var name: String? = null
|
||||
lateinit var name: String
|
||||
|
||||
@JvmField
|
||||
var uri: Uri? = null
|
||||
lateinit var uri: Uri
|
||||
|
||||
var scriptExecutionId = 0
|
||||
private set
|
||||
@@ -126,6 +127,8 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
private val mDocsWebView: EWebView = binding.docs
|
||||
private val mDrawerLayout: DrawerLayout = binding.drawerLayout
|
||||
|
||||
private var mCurrentCharset: Charset = StandardCharsets.UTF_8
|
||||
private var mHadBom = false
|
||||
private var mReadOnly = false
|
||||
private var mAutoCompletion: AutoCompletion? = null
|
||||
private var mEditorTheme: Theme? = null
|
||||
@@ -193,7 +196,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
}
|
||||
|
||||
fun handleIntent(intent: Intent): Observable<String> {
|
||||
name = intent.getStringExtra(EXTRA_NAME)
|
||||
intent.getStringExtra(EXTRA_NAME)?.let { name = it }
|
||||
return handleText(intent)
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.doOnNext {
|
||||
@@ -228,15 +231,28 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
} else {
|
||||
Uri.fromFile(File(path))
|
||||
}
|
||||
if (name == null) {
|
||||
name = getNameWithoutExtension(uri!!.path!!)
|
||||
if (!::name.isInitialized) {
|
||||
name = getNameWithoutExtension(uri.path!!)
|
||||
}
|
||||
return loadUri(uri)
|
||||
}
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
private fun loadUri(uri: Uri?): Observable<String> {
|
||||
return Observable.fromCallable { read(context.contentResolver.openInputStream(uri!!)!!) }
|
||||
private fun loadUri(uri: Uri): Observable<String> {
|
||||
return Observable
|
||||
.fromCallable {
|
||||
val resolver = context.contentResolver
|
||||
val rawBytes = resolver.openInputStream(uri)?.use { it.readBytes() } ?: ByteArray(0)
|
||||
|
||||
mCurrentCharset = StringUtils.detectCharset(rawBytes).charsetOrDefault()
|
||||
mHadBom = StringUtils.hasBom(rawBytes, mCurrentCharset)
|
||||
|
||||
val effectiveBytes = if (mHadBom) {
|
||||
StringUtils.dropBom(rawBytes, mCurrentCharset)
|
||||
} else rawBytes
|
||||
|
||||
String(effectiveBytes, mCurrentCharset)
|
||||
}
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.doOnNext { text: String -> setInitialText(text) }
|
||||
@@ -386,7 +402,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
fun run(showMessage: Boolean, file: File? = uri!!.path?.let { File(it) }, overriddenFullPath: String? = null): ScriptExecution? {
|
||||
fun run(showMessage: Boolean, file: File? = uri.path?.let { File(it) }, overriddenFullPath: String? = null): ScriptExecution? {
|
||||
file ?: return null
|
||||
if (showMessage) {
|
||||
showSnack(this, R.string.text_start_running)
|
||||
@@ -394,7 +410,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
// TODO by Stardust on Oct 24, 2018.
|
||||
val execution = runWithBroadcastSender(
|
||||
file,
|
||||
workingDirectory = uri!!.path?.let { File(it).parent },
|
||||
workingDirectory = uri.path?.let { File(it).parent },
|
||||
overriddenFullPath,
|
||||
) ?: return null
|
||||
scriptExecutionId = execution.id
|
||||
@@ -402,8 +418,8 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
return execution
|
||||
}
|
||||
|
||||
private fun runTmpFile(file: File? = uri!!.path?.let { File(it) }): ScriptExecution? {
|
||||
return run(true, file, uri!!.path)
|
||||
private fun runTmpFile(file: File? = uri.path?.let { File(it) }): ScriptExecution? {
|
||||
return run(true, file, uri.path)
|
||||
}
|
||||
|
||||
private fun undo() = editor.undo()
|
||||
@@ -411,12 +427,16 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
private fun redo() = editor.redo()
|
||||
|
||||
fun save(): Observable<String> {
|
||||
val path = uri!!.path
|
||||
val path = uri.path!!
|
||||
val backPath = "$path.save"
|
||||
move(path!!, backPath)
|
||||
return Observable.just(editor.text)
|
||||
move(path, backPath)
|
||||
return Observable
|
||||
.fromCallable {
|
||||
editor.text.apply {
|
||||
writeTextWithCharset(uri, this)
|
||||
}
|
||||
}
|
||||
.observeOn(Schedulers.io())
|
||||
.doOnNext { s: String? -> write(context.contentResolver.openOutputStream(uri!!)!!, s!!) }
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.doOnNext {
|
||||
editor.markTextAsSaved()
|
||||
@@ -429,6 +449,13 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
}
|
||||
}
|
||||
|
||||
private fun writeTextWithCharset(uri: Uri, text: String) {
|
||||
context.contentResolver.openOutputStream(uri, "rwt")?.use { out ->
|
||||
if (mHadBom) out.write(StringUtils.bomBytes(mCurrentCharset))
|
||||
out.write(text.toByteArray(mCurrentCharset))
|
||||
} ?: throw IOException("Cannot open output stream for $uri")
|
||||
}
|
||||
|
||||
fun forceStop() {
|
||||
doWithCurrentEngine { obj: ScriptEngine<*> -> obj.forceStop() }
|
||||
}
|
||||
@@ -468,9 +495,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag
|
||||
}
|
||||
|
||||
fun openByOtherApps() {
|
||||
if (uri != null) {
|
||||
openByOtherApps(uri!!)
|
||||
}
|
||||
openByOtherApps(uri)
|
||||
}
|
||||
|
||||
fun beautifyCode() {
|
||||
|
||||
@@ -62,8 +62,8 @@ class FindOrReplaceDialogBuilder(context: Context, private val mEditorView: Edit
|
||||
|
||||
title(R.string.text_find_or_replace)
|
||||
customView(binding.root, true)
|
||||
positiveText(R.string.text_ok)
|
||||
negativeText(R.string.text_cancel)
|
||||
positiveText(R.string.dialog_button_confirm)
|
||||
negativeText(R.string.dialog_button_cancel)
|
||||
}
|
||||
|
||||
private fun storeState() {
|
||||
|
||||
@@ -58,7 +58,7 @@ public class TextSizeSettingDialogBuilder extends MaterialDialog.Builder impleme
|
||||
negativeText(R.string.text_cancel);
|
||||
negativeColorRes(R.color.dialog_button_default);
|
||||
onNegative((dialog, which) -> dialog.dismiss());
|
||||
positiveText(R.string.text_ok);
|
||||
positiveText(R.string.dialog_button_confirm);
|
||||
positiveColorRes(R.color.dialog_button_attraction);
|
||||
onPositive((dialog, which) -> dialog.dismiss());
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ public class DebugToolbarFragment extends ToolbarFragment<FragmentDebugToolbarBi
|
||||
mDebugger = DebuggerSingleton.get();
|
||||
mDebugger.setWeakDebugCallback(new WeakReference<>(this));
|
||||
setInterrupted(false);
|
||||
mCurrentEditorSourceUrl = mInitialEditorSourceUrl = mEditorView.uri != null ? mEditorView.uri.toString() : null;
|
||||
mCurrentEditorSourceUrl = mInitialEditorSourceUrl = mEditorView.uri.toString();
|
||||
mInitialEditorSource = mEditorView.editor.getText();
|
||||
setupEditor();
|
||||
ScriptExecution execution = mEditorView.run(false);
|
||||
|
||||
@@ -36,6 +36,7 @@ import org.autojs.autojs.core.pref.Pref
|
||||
import org.autojs.autojs.event.BackPressedHandler
|
||||
import org.autojs.autojs.event.BackPressedHandler.DoublePressExit
|
||||
import org.autojs.autojs.event.BackPressedHandler.HostActivity
|
||||
import org.autojs.autojs.extension.ViewExtensions.setOnTitleViewLongClickListener
|
||||
import org.autojs.autojs.model.explorer.Explorers
|
||||
import org.autojs.autojs.permission.DisplayOverOtherAppsPermission
|
||||
import org.autojs.autojs.permission.ManageAllFilesPermission
|
||||
@@ -178,7 +179,7 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
|
||||
val toolbar = mToolbar.also {
|
||||
setSupportActionBar(it)
|
||||
it.setTitle(R.string.app_name)
|
||||
it.setOnLongClickListener { true.also { PreferencesActivity.launch(this) } }
|
||||
it.setOnTitleViewLongClickListener { true.also { PreferencesActivity.launch(this) } }
|
||||
}
|
||||
|
||||
mActionBarDrawerToggle = object : ActionBarDrawerToggle(
|
||||
|
||||
@@ -13,6 +13,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.core.view.isVisible
|
||||
import com.afollestad.materialdialogs.DialogAction
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import com.android.apksig.ApkVerifier
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
@@ -71,8 +72,8 @@ object ApkInfoDialogManager {
|
||||
.onNegative { materialDialog, _ -> materialDialog.dismiss() }
|
||||
.show()
|
||||
.apply {
|
||||
makeTextCopyable { titleView }
|
||||
setOnDismissListener { scope.cancel() }
|
||||
makeTextCopyable { it.titleView }
|
||||
}
|
||||
|
||||
scope.launch {
|
||||
@@ -226,15 +227,32 @@ object ApkInfoDialogManager {
|
||||
}
|
||||
|
||||
private fun getApkSignatureInfo(apkFile: File): String? = runCatching {
|
||||
// ApkVerifier.Builder(apkFile).build().verify().run {
|
||||
// listOfNotNull(
|
||||
// "V1".takeIf { isVerifiedUsingV1Scheme || hasV1Signature(apkFile) },
|
||||
// "V2".takeIf { isVerifiedUsingV2Scheme },
|
||||
// "V3".takeIf { isVerifiedUsingV3Scheme },
|
||||
// "V4".takeIf { isVerifiedUsingV4Scheme },
|
||||
// ).takeUnless { it.isEmpty() }?.joinToString(" + ")
|
||||
// }
|
||||
// @Hint by JetBrains AI Assistant on May 21, 2025.
|
||||
// ! APK (Zip) has an "APK Signing Block" at the end,
|
||||
// ! storing <ID/Data> pairs for V2/V3/V4 sequentially.
|
||||
// ! Only need to locate and check for corresponding ID to determine signature data existence.
|
||||
// ! zh-CN:
|
||||
// ! APK (Zip) 末尾有一段 "APK Signing Block", 依次存放 V2/V3/V4 的 <ID/数据> 对.
|
||||
// ! 只需定位并查看其中是否存在对应 ID, 即可判断是否存在签名数据.
|
||||
ApkSignatureDetector.detectSchemes(apkFile)
|
||||
}.getOrNull() ?: getApkSignatureInfoLegacy(apkFile)
|
||||
|
||||
private fun getApkSignatureInfoLegacy(apkFile: File): String? = runCatching {
|
||||
// @Hint by JetBrains AI Assistant on May 21, 2025.
|
||||
// ! `ApkVerifier.verify()` parses ZIP structure to find V2/V3/V4 Signing Block,
|
||||
// ! calculates hash values (SHA-256/512) for each signature scheme segment,
|
||||
// ! requiring re-traversal of files for each signature.
|
||||
// ! zh-CN:
|
||||
// ! `ApkVerifier.verify()` 解析 ZIP 结构找到 V2/V3/V4 Signing Block,
|
||||
// ! 对每一种签名方案逐段计算哈希值 (SHA-256/512), 每种签名都需要重新遍历文件.
|
||||
ApkVerifier.Builder(apkFile).build().verify().run {
|
||||
listOfNotNull(
|
||||
"V1".takeIf { isVerifiedUsingV1Scheme || ApkSignatureDetector.hasV1Signature(apkFile) },
|
||||
"V2".takeIf { isVerifiedUsingV2Scheme },
|
||||
"V3".takeIf { isVerifiedUsingV3Scheme },
|
||||
"V4".takeIf { isVerifiedUsingV4Scheme },
|
||||
).takeUnless { it.isEmpty() }?.joinToString(" + ")
|
||||
}
|
||||
}.getOrNull()
|
||||
|
||||
private data class ApkInfo(
|
||||
|
||||
@@ -48,7 +48,7 @@ object ApkSignatureDetector {
|
||||
ApkSigningBlockUtils.findApkSignatureSchemeBlock(buf, id, null)
|
||||
}.isSuccess
|
||||
|
||||
private fun hasV1Signature(apkFile: File): Boolean {
|
||||
fun hasV1Signature(apkFile: File): Boolean {
|
||||
JarFile(apkFile).use { jar ->
|
||||
var hasManifest = false
|
||||
var hasSF = false
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
package org.autojs.autojs.ui.main.scripts
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View.MeasureSpec.UNSPECIFIED
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.autojs.autojs.extension.MaterialDialogExtensions.makeTextCopyable
|
||||
import org.autojs.autojs.extension.MaterialDialogExtensions.setCopyableTextIfAbsent
|
||||
import org.autojs.autojs.external.fileprovider.AppFileProvider
|
||||
import org.autojs.autojs.pio.PFiles
|
||||
import org.autojs.autojs.runtime.api.Mime
|
||||
import org.autojs.autojs.util.IntentUtils
|
||||
import org.autojs.autojs.util.IntentUtils.SnackExceptionHolder
|
||||
import org.autojs.autojs.util.StringUtils
|
||||
import org.autojs.autojs.util.StringUtils.dropBom
|
||||
import org.autojs.autojs6.R
|
||||
import org.autojs.autojs6.databinding.EditableFileInfoDialogListItemBinding
|
||||
import java.io.File
|
||||
import java.nio.charset.Charset
|
||||
import java.nio.file.Files
|
||||
|
||||
object EditableFileInfoDialogManager {
|
||||
|
||||
@JvmStatic
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun showEditableFileInfoDialog(context: Context, file: File?, fileContentGetter: (() -> String)? = null) {
|
||||
if (file == null || !file.canRead()) {
|
||||
MaterialDialog.Builder(context)
|
||||
.title(R.string.text_failed)
|
||||
.content(R.string.file_not_exist_or_readable)
|
||||
.show()
|
||||
return
|
||||
}
|
||||
val binding = EditableFileInfoDialogListItemBinding.inflate(LayoutInflater.from(context))
|
||||
|
||||
val textUnknown = context.getString(R.string.text_unknown)
|
||||
|
||||
// Create an independent Scope for the Dialog, bind its lifecycle with the Dialog.
|
||||
// zh-CN: 针对 Dialog 独立创建一个 Scope, 生命周期与 Dialog 绑定.
|
||||
val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
||||
|
||||
val dialog = MaterialDialog.Builder(context)
|
||||
.title(file.name)
|
||||
.customView(binding.root, false)
|
||||
.iconRes(R.drawable.ic_edit_smaller)
|
||||
.limitIconToDefaultSize()
|
||||
.positiveText(R.string.dialog_button_dismiss)
|
||||
.positiveColorRes(R.color.dialog_button_default)
|
||||
.show()
|
||||
.apply {
|
||||
makeTextCopyable { titleView }
|
||||
setOnDismissListener { scope.cancel() }
|
||||
iconView?.setOnClickListener {
|
||||
IntentUtils.viewFile(
|
||||
context = context,
|
||||
path = file.path,
|
||||
mimeType = Mime.TEXT_PLAIN,
|
||||
fileProviderAuthority = AppFileProvider.AUTHORITY,
|
||||
exceptionHolder = SnackExceptionHolder(view),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
scope.launch {
|
||||
dialog.setCopyableTextIfAbsent(binding.filePathValue, file.absolutePath)
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
val bytes: ByteArray? = withContext(Dispatchers.IO) {
|
||||
runCatching {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
Files.readAllBytes(file.toPath())
|
||||
} else {
|
||||
file.readBytes()
|
||||
}
|
||||
}.getOrNull()
|
||||
}
|
||||
when (bytes) {
|
||||
null -> dialog.apply {
|
||||
setCopyableTextIfAbsent(binding.byteCountValue, textUnknown)
|
||||
setCopyableTextIfAbsent(binding.fileCharsetValue, textUnknown)
|
||||
setCopyableTextIfAbsent(binding.lineCountValue, textUnknown)
|
||||
setCopyableTextIfAbsent(binding.charCountValue, textUnknown)
|
||||
setCopyableTextIfAbsent(binding.lineBreakValue, textUnknown)
|
||||
setCopyableTextIfAbsent(binding.fileSizeValue, scope) { PFiles.getHumanReadableSize(file.length()) }
|
||||
}
|
||||
else -> dialog.apply {
|
||||
val charsetMatch = StringUtils.detectCharset(bytes)
|
||||
val charset = charsetMatch.charsetOrDefault()
|
||||
val text = withContext(Dispatchers.IO) {
|
||||
fileContentGetter?.invoke() ?: dropBom(bytes, charset).decodeToString()
|
||||
}
|
||||
setCopyableTextIfAbsent(
|
||||
binding.fileCharsetValue,
|
||||
charsetMatch.nameOrDefault(textUnknown),
|
||||
charsetMatch.confidence?.takeUnless { it == 100 }?.let {
|
||||
" [ ${context.getString(R.string.text_confidence_level)}: $it ]"
|
||||
},
|
||||
)
|
||||
setCopyableTextIfAbsent(binding.lineBreakValue, scope) {
|
||||
val hasLineBreaks = text.indexOf('\n') >= 0 || text.indexOf('\r') >= 0
|
||||
if (hasLineBreaks) detectLineBreak(text) else textUnknown
|
||||
}
|
||||
setCopyableTextIfAbsent(binding.fileSizeValue, getReadableSizeString(context, charset, bytes, text))
|
||||
setCopyableTextIfAbsent(binding.byteCountValue, getByteCountString(context, charset, bytes, text))
|
||||
setCopyableTextIfAbsent(binding.charCountValue, scope) { "${text.codePointCount(0, text.length)}" }
|
||||
setCopyableTextIfAbsent(binding.lineCountValue, scope) { "${text.lineSequence().count()}" }
|
||||
}
|
||||
}
|
||||
updateGuidelines(binding)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateGuidelines(binding: EditableFileInfoDialogListItemBinding) {
|
||||
val bindings = listOf(
|
||||
binding.filePathLabel to binding.filePathGuideline,
|
||||
binding.fileSizeLabel to binding.fileSizeGuideline,
|
||||
binding.fileCharsetLabel to binding.fileCharsetGuideline,
|
||||
binding.lineBreakLabel to binding.lineBreakGuideline,
|
||||
binding.byteCountLabel to binding.byteCountGuideline,
|
||||
binding.charCountLabel to binding.charCountGuideline,
|
||||
binding.lineCountLabel to binding.lineCountGuideline,
|
||||
)
|
||||
|
||||
@Suppress("DuplicatedCode")
|
||||
val maxWidth = bindings.maxOfOrNull { it.first.apply { measure(UNSPECIFIED, UNSPECIFIED) }.measuredWidth } ?: return
|
||||
|
||||
bindings.forEach { (_, guideline) ->
|
||||
guideline.layoutParams = (guideline.layoutParams as ConstraintLayout.LayoutParams).also {
|
||||
it.guideBegin = maxWidth
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun detectLineBreak(text: String): String {
|
||||
var lf = 0 // \n
|
||||
var crlf = 0 // \r\n
|
||||
var cr = 0 // \r
|
||||
|
||||
var i = 0
|
||||
while (i < text.length) {
|
||||
val c = text[i]
|
||||
if (c == '\r') {
|
||||
if (i + 1 < text.length && text[i + 1] == '\n') {
|
||||
crlf++; i++ // 跳过 \n
|
||||
} else cr++
|
||||
} else if (c == '\n') lf++
|
||||
i++
|
||||
}
|
||||
return when {
|
||||
crlf > 0 && lf == 0 && cr == 0 -> "Windows (CRLF)"
|
||||
lf > 0 && crlf == 0 && cr == 0 -> "Unix (LF)"
|
||||
cr > 0 && crlf == 0 && lf == 0 -> "Mac (CR)"
|
||||
else -> "Mixed"
|
||||
}
|
||||
}
|
||||
|
||||
private fun getReadableSizeString(context: Context, charset: Charset, bytes: ByteArray, text: String): Pair<String, String?> {
|
||||
val (size, suffix) = getByteCount(context, charset, bytes, text)
|
||||
return PFiles.getHumanReadableSize(size) to suffix
|
||||
}
|
||||
|
||||
private fun getByteCountString(context: Context, charset: Charset, bytes: ByteArray, text: String): Pair<String, String?> {
|
||||
val (size, suffix) = getByteCount(context, charset, bytes, text)
|
||||
return "$size" to suffix
|
||||
}
|
||||
|
||||
private fun getByteCount(context: Context, charset: Charset, bytes: ByteArray, text: String): Pair<Long, String?> {
|
||||
return when (text) {
|
||||
String(dropBom(bytes, charset), charset) -> {
|
||||
bytes.size.toLong() to null
|
||||
}
|
||||
else -> text.toByteArray(charset).size.toLong() to " [ ${context.getString(R.string.text_estimated)} ]"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -53,7 +53,10 @@ object MediaInfoDialogManager {
|
||||
.neutralText(R.string.ellipsis_six)
|
||||
.neutralColorRes(R.color.dialog_button_unavailable)
|
||||
.show()
|
||||
.apply { setOnDismissListener { scope.cancel() } }
|
||||
.apply {
|
||||
makeTextCopyable { titleView }
|
||||
setOnDismissListener { scope.cancel() }
|
||||
}
|
||||
|
||||
scope.launch {
|
||||
val mediaInfo = MediaInfo()
|
||||
@@ -106,12 +109,9 @@ object MediaInfoDialogManager {
|
||||
}
|
||||
}
|
||||
|
||||
withContext(Dispatchers.Main) {
|
||||
restoreEssentialViews(binding, context)
|
||||
updateGuidelines(binding)
|
||||
updateSplitLineVisibility(binding)
|
||||
dialog.makeTextCopyable { it.titleView }
|
||||
}
|
||||
restoreEssentialViews(binding, context)
|
||||
updateGuidelines(binding)
|
||||
updateSplitLineVisibility(binding)
|
||||
|
||||
when (val containerFormat = containerFormatDeferred.await()) {
|
||||
MEDIA_INFO_ERROR_OPENING_FILE -> {
|
||||
|
||||
@@ -420,7 +420,7 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa
|
||||
"- " + getString(R.string.text_download_and_install_autojs6_including_all_abis) + " [" + getString(R.string.text_recommended) + "]\n\n" +
|
||||
getString(R.string.text_download_link_for_autojs6) + ":\n" +
|
||||
getString(R.string.uri_autojs6_download_link));
|
||||
builder.positiveText(R.string.text_ok);
|
||||
builder.positiveText(R.string.dialog_button_dismiss);
|
||||
builder.positiveColorRes(R.color.dialog_button_hint);
|
||||
MaterialDialogExtensions.widgetThemeColor(builder);
|
||||
MaterialDialog dialog = builder.show();
|
||||
|
||||
@@ -90,7 +90,7 @@ public class ShortcutCreateActivity extends AppCompatActivity {
|
||||
.title(R.string.text_send_shortcut)
|
||||
.negativeText(R.string.dialog_button_cancel)
|
||||
.negativeColorRes(R.color.dialog_button_default)
|
||||
.positiveText(R.string.text_ok)
|
||||
.positiveText(R.string.dialog_button_confirm)
|
||||
.positiveColorRes(R.color.dialog_button_attraction)
|
||||
.onPositive((dialog, which) -> {
|
||||
createShortcut();
|
||||
|
||||
@@ -2,11 +2,15 @@ package org.autojs.autojs.util
|
||||
|
||||
import android.content.res.Configuration
|
||||
import android.text.TextUtils
|
||||
import com.ibm.icu.text.CharsetDetector
|
||||
import com.ibm.icu.text.CharsetMatch
|
||||
import org.autojs.autojs.annotation.LocaleNonRelated
|
||||
import org.autojs.autojs.app.GlobalAppContext
|
||||
import org.autojs.autojs.core.pref.Language
|
||||
import org.autojs.autojs.extension.NumberExtensions.roundToString
|
||||
import org.opencv.core.Point
|
||||
import java.nio.charset.Charset
|
||||
import java.nio.charset.StandardCharsets
|
||||
import java.util.Locale
|
||||
import kotlin.math.min
|
||||
import kotlin.math.pow
|
||||
@@ -21,6 +25,14 @@ object StringUtils {
|
||||
|
||||
private val globalAppContext by lazy { GlobalAppContext.get() }
|
||||
|
||||
private val localePref = mapOf(
|
||||
Language.ZH_HANS.languageTag to listOf("GB18030", "GBK", "Big5"),
|
||||
Language.ZH_HANT_HK.languageTag to listOf("Big5", "GB18030"),
|
||||
Language.ZH_HANT_TW.languageTag to listOf("Big5", "GB18030"),
|
||||
Language.JA.languageTag to listOf("Shift_JIS", "EUC-JP", "ISO-2022-JP"),
|
||||
Language.KO.languageTag to listOf("EUC-KR")
|
||||
)
|
||||
|
||||
@JvmStatic
|
||||
fun str(@LocaleNonRelated resId: Int, vararg args: Any): String = globalAppContext.getString(resId, *args)
|
||||
|
||||
@@ -230,4 +242,66 @@ object StringUtils {
|
||||
return "{${x.roundToString(scale)}, ${y.roundToString(scale)}}"
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun detectCharset(bytes: ByteArray): CharsetMatchWrapper {
|
||||
val matches = kotlin.runCatching {
|
||||
CharsetDetector().apply { setText(bytes) }.detectAll()
|
||||
}.getOrNull() ?: return CharsetMatchWrapper(null)
|
||||
|
||||
matches.firstOrNull {
|
||||
it.name.startsWith("UTF-", true) && it.confidence >= 30
|
||||
}?.let {
|
||||
return CharsetMatchWrapper(it)
|
||||
}
|
||||
|
||||
val topScore = matches.maxOfOrNull { it.confidence } ?: -1
|
||||
val candidates = matches.filter { it.confidence == topScore }
|
||||
val localeTag = Language.getPrefLanguage().getLocalCompatibleLanguageTag()
|
||||
val prefList = localePref[localeTag] ?: emptyList()
|
||||
val best = candidates.minByOrNull {
|
||||
prefList.indexOf(it.name).takeIf { i -> i >= 0 } ?: Int.MAX_VALUE
|
||||
} ?: candidates.first()
|
||||
|
||||
return CharsetMatchWrapper(best)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun hasBom(bytes: ByteArray, charset: Charset): Boolean {
|
||||
val bom = bomBytes(charset)
|
||||
return bom.isNotEmpty() && bytes.take(bom.size).toByteArray().contentEquals(bom)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun bomBytes(charset: Charset): ByteArray = when (charset) {
|
||||
StandardCharsets.UTF_8 -> byteArrayOf(0xEF.toByte(), 0xBB.toByte(), 0xBF.toByte())
|
||||
StandardCharsets.UTF_16LE -> byteArrayOf(0xFF.toByte(), 0xFE.toByte())
|
||||
StandardCharsets.UTF_16BE -> byteArrayOf(0xFE.toByte(), 0xFF.toByte())
|
||||
else -> ByteArray(0)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun dropBom(bytes: ByteArray, charset: Charset): ByteArray {
|
||||
val bom = bomBytes(charset)
|
||||
if (bom.isEmpty() || bytes.size < bom.size || !bytes.take(bom.size).toByteArray().contentEquals(bom)) {
|
||||
return bytes
|
||||
}
|
||||
return bytes.copyOfRange(bom.size, bytes.size)
|
||||
}
|
||||
|
||||
class CharsetMatchWrapper(private val charsetMatch: CharsetMatch?) {
|
||||
|
||||
val name: String? by lazy { charsetMatch?.name }
|
||||
val confidence: Int? by lazy { charsetMatch?.confidence }
|
||||
|
||||
fun charsetOrNull(): Charset? = runCatching {
|
||||
name?.let { Charset.forName(it) }
|
||||
}.getOrNull()
|
||||
|
||||
@JvmOverloads
|
||||
fun charsetOrDefault(defaultValue: Charset = StandardCharsets.UTF_8): Charset = charsetOrNull() ?: defaultValue
|
||||
|
||||
fun nameOrDefault(defaultValue: String): String = name ?: defaultValue
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
BIN
app/src/main/res/drawable-night/ic_edit_smaller.png
Normal file
BIN
app/src/main/res/drawable-night/ic_edit_smaller.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
app/src/main/res/drawable/ic_edit_smaller.png
Normal file
BIN
app/src/main/res/drawable/ic_edit_smaller.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
517
app/src/main/res/layout/editable_file_info_dialog_list_item.xml
Normal file
517
app/src/main/res/layout/editable_file_info_dialog_list_item.xml
Normal file
@@ -0,0 +1,517 @@
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:focusable="true"
|
||||
android:clickable="true"
|
||||
android:gravity="center_vertical|start"
|
||||
android:minHeight="@dimen/ref_md_listitem_height"
|
||||
android:paddingBottom="@dimen/ref_md_listitem_vertical_margin"
|
||||
android:paddingTop="@dimen/ref_md_listitem_vertical_margin">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/file_path_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toTopOf="@id/file_charset_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/file_path_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_path_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:text="@string/editable_file_info_file_path_label"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_path_guideline"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_path_colon"
|
||||
android:visibility="visible"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:gravity="center_vertical|start"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_path_value"
|
||||
app:layout_constraintStart_toEndOf="@id/file_path_label"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_path_value"
|
||||
android:visibility="visible"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:maxLines="10"
|
||||
android:paddingTop="0dp"
|
||||
android:paddingBottom="0dp"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/file_path_colon"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/file_charset_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toTopOf="@id/line_break_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/file_path_parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/file_charset_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_charset_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:text="@string/editable_file_info_file_charset_label"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_charset_guideline"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_charset_colon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:gravity="center_vertical|start"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_charset_value"
|
||||
app:layout_constraintStart_toEndOf="@id/file_charset_label"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_charset_value"
|
||||
android:visibility="visible"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:maxLines="2"
|
||||
android:paddingTop="0dp"
|
||||
android:paddingBottom="0dp"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:textAlignment="viewStart"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/file_charset_colon"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/line_break_parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/file_charset_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/file_size_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/line_break_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/line_break_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/editable_file_info_line_break_label"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/line_break_guideline" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/line_break_colon"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintStart_toEndOf="@id/line_break_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/line_break_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/line_break_value"
|
||||
android:visibility="visible"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/line_break_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/file_size_parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/line_break_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/split_line"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/file_size_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_size_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/editable_file_info_file_size_label"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_size_guideline" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/file_size_colon"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/file_size_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/file_size_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_size_value"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/file_size_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/split_line"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="@color/day_night_alpha_20"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="8sp"
|
||||
android:layout_marginBottom="3sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/file_size_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/byte_count_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/byte_count_parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/split_line"
|
||||
app:layout_constraintBottom_toTopOf="@id/line_break_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/byte_count_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/byte_count_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/editable_file_info_byte_count_label"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/byte_count_guideline" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/byte_count_colon"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/byte_count_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/byte_count_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/byte_count_value"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/byte_count_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/char_count_parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/byte_count_parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/line_count_parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/char_count_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/char_count_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/editable_file_info_char_count_label"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/char_count_guideline" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/char_count_colon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/char_count_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/char_count_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/char_count_value"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/char_count_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/line_count_parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/ref_md_dialog_frame_margin"
|
||||
android:layout_marginStart="@dimen/ref_md_listitem_margin_left"
|
||||
android:layout_marginTop="4sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/char_count_parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/line_count_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintGuide_begin="100dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/line_count_label"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:text="@string/editable_file_info_line_count_label"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/line_count_guideline" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/line_count_colon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:text="@string/symbol_colon"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/line_count_label"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/line_count_value" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/line_count_value"
|
||||
android:text="@string/ellipsis_six"
|
||||
tools:text="@string/text_unknown"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical|start"
|
||||
android:textAlignment="viewStart"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingTop="0dp"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:textSize="@dimen/ref_md_listitem_textsize"
|
||||
app:layout_constraintStart_toEndOf="@id/line_count_colon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -141,8 +141,8 @@
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_info"
|
||||
android:title="@string/text_info"
|
||||
android:id="@+id/action_file_details"
|
||||
android:title="@string/text_file_details"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
|
||||
@@ -121,6 +121,13 @@
|
||||
<string name="dialog_title_theme_color_details">تفاصيل لون الثيم</string>
|
||||
<string name="edit_and_run_handle_intent_error">لا يمكن معالجة الملف</string>
|
||||
<string name="edit_exit_without_save_warn">لم يتم حفظ المحتوى ، هل أنت متأكد من الخروج؟</string>
|
||||
<string name="editable_file_info_byte_count_label">بايت</string>
|
||||
<string name="editable_file_info_char_count_label">حروف</string>
|
||||
<string name="editable_file_info_file_charset_label">ترميز</string>
|
||||
<string name="editable_file_info_file_path_label">مسار</string>
|
||||
<string name="editable_file_info_file_size_label">حجم</string>
|
||||
<string name="editable_file_info_line_break_label">سطر</string>
|
||||
<string name="editable_file_info_line_count_label">أسطر</string>
|
||||
<string name="entry_app_language_auto">اتبع النظام</string>
|
||||
<string name="entry_documentation_source_local">مستندات محلية</string>
|
||||
<string name="entry_documentation_source_online">مستندات عبر الإنترنت</string>
|
||||
@@ -223,6 +230,12 @@
|
||||
<string name="error_no_accessibility_permission">يتم تعطيل خدمة إمكانية الوصول وتوقف البرنامج النصي</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">لم يتم تنشيط خدمة إمكانية الوصول</string>
|
||||
<string name="error_no_accessibility_service">لا توجد خدمة إمكانية الوصول</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">لا توجد تطبيقات متاحة لاستعراض هذا الرابط</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">لا توجد تطبيقات متاحة لتحرير هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">لا توجد تطبيقات متاحة لتثبيت هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">لا توجد تطبيقات متاحة لتشغيل هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">لا توجد تطبيقات متاحة لإرسال هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">لا توجد تطبيقات متاحة لعرض هذا الملف</string>
|
||||
<string name="error_no_display_over_other_apps_permission">لا يوجد إذن \"عرض عبر التطبيقات الأخرى\"</string>
|
||||
<string name="error_no_permission_to_access_shizuku">لا يوجد إذن للوصول إلى Shizuku</string>
|
||||
<string name="error_no_post_notifications_permission">لا يوجد إذن \"نشر الإخطارات\"</string>
|
||||
@@ -265,6 +278,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">نوع نتيجة غير معروف {name: %s ، params: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">محدد غير معروف {الاسم: %s ، اكتب: %s}</string>
|
||||
<string name="error_unknown_type">نوع غير معروف: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">لا يمكن ضغط تنسيق WebP-Lossless باستخدام معامل الجودة؛ استخدم JPEG/PNG/WebP-Lossy بدلاً من ذلك</string>
|
||||
<string name="file_not_exist_or_readable">الملف غير موجود أو قابلاً للقراءة: %s</string>
|
||||
<string name="foreground_notification_channel_name">خدمة مقدمة AutoJs6</string>
|
||||
<string name="foreground_notification_text">انقر لإطلاق AutoJs6</string>
|
||||
@@ -470,6 +484,7 @@
|
||||
<string name="text_command_already_copied_to_clip">تم نسخ الأمر إلى الحافظة</string>
|
||||
<string name="text_comment">تعليق</string>
|
||||
<string name="text_compatibility">التوافق</string>
|
||||
<string name="text_confidence_level">ثقة</string>
|
||||
<string name="text_config">تكوين</string>
|
||||
<string name="text_confirm_to_clear_all_histories">هل أنت متأكد من مسح جميع السجلات؟</string>
|
||||
<string name="text_confirm_to_clear_all_items">هل أنت متأكد من مسح جميع العناصر؟</string>
|
||||
@@ -560,6 +575,7 @@
|
||||
<string name="text_error">خطأ</string>
|
||||
<string name="text_error_copy_file" formatted="true">فشل نسخ الملف: %s</string>
|
||||
<string name="text_error_report">تقرير الشوائب</string>
|
||||
<string name="text_estimated">تقديري</string>
|
||||
<string name="text_execute">نفذ - اعدم</string>
|
||||
<string name="text_execute_code">تنفيذ الرمز</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] انتهى في %s.\n</string>
|
||||
@@ -594,6 +610,7 @@
|
||||
<string name="text_failed_to_send_log_entries">فشل في إرسال إدخالات السجل</string>
|
||||
<string name="text_failed_to_write_file">فشل في كتابة الملف</string>
|
||||
<string name="text_file">ملف</string>
|
||||
<string name="text_file_details">تفاصيل الملف</string>
|
||||
<string name="text_file_exists">ملف موجود بالفعل</string>
|
||||
<string name="text_file_explorer">مستكشف الملفات</string>
|
||||
<string name="text_file_extensions_title">امتدادات الملف</string>
|
||||
@@ -632,6 +649,8 @@
|
||||
<string name="text_hidden_files_title">الملفات والمجلدات المخفية</string>
|
||||
<string name="text_hide">إخفاء</string>
|
||||
<string name="text_hide_button">زر الإخفاء</string>
|
||||
<string name="text_hide_node">إخفاء هذه العقدة</string>
|
||||
<string name="text_hide_same_frame_nodes">إخفاء العقدة ذات الإطار المماثل</string>
|
||||
<string name="text_histories">التاريخ</string>
|
||||
<string name="text_icon">أيقونة</string>
|
||||
<string name="text_ignore_battery_optimizations">تجاهل تحسينات البطارية</string>
|
||||
@@ -1039,14 +1058,5 @@
|
||||
<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_hide_node">إخفاء هذه العقدة</string>
|
||||
<string name="text_hide_same_frame_nodes">إخفاء العقدة ذات الإطار المماثل</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">لا توجد تطبيقات متاحة لتحرير هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">لا توجد تطبيقات متاحة لاستعراض هذا الرابط</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">لا توجد تطبيقات متاحة لتثبيت هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">لا توجد تطبيقات متاحة لعرض هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">لا توجد تطبيقات متاحة لإرسال هذا الملف</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">لا توجد تطبيقات متاحة لتشغيل هذا الملف</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">لا يمكن ضغط تنسيق WebP-Lossless باستخدام معامل الجودة؛ استخدم JPEG/PNG/WebP-Lossy بدلاً من ذلك</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -116,6 +116,13 @@
|
||||
<string name="dialog_title_theme_color_details">Theme color details</string>
|
||||
<string name="edit_and_run_handle_intent_error">Cannot process file</string>
|
||||
<string name="edit_exit_without_save_warn">The content has not been saved, are you sure to exit?</string>
|
||||
<string name="editable_file_info_byte_count_label">Bytes</string>
|
||||
<string name="editable_file_info_char_count_label">Chars</string>
|
||||
<string name="editable_file_info_file_charset_label">Charset</string>
|
||||
<string name="editable_file_info_file_path_label">Path</string>
|
||||
<string name="editable_file_info_file_size_label">Size</string>
|
||||
<string name="editable_file_info_line_break_label">EOL</string>
|
||||
<string name="editable_file_info_line_count_label">Lines</string>
|
||||
<string name="entry_app_language_auto">Follow system</string>
|
||||
<string name="entry_documentation_source_local">Local docs</string>
|
||||
<string name="entry_documentation_source_online">Online docs</string>
|
||||
@@ -218,6 +225,12 @@
|
||||
<string name="error_no_accessibility_permission">Accessibility service is disabled and the script has stopped</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">Accessibility service is not activated</string>
|
||||
<string name="error_no_accessibility_service">No accessibility service</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">No applications available for browsing this link</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">No applications available for editing this file</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">No applications available for installing this file</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">No applications available for playing this file</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">No applications available for sending this file</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">No applications available for viewing this file</string>
|
||||
<string name="error_no_display_over_other_apps_permission">No \"display over other apps\" permission</string>
|
||||
<string name="error_no_permission_to_access_shizuku">No permission to access Shizuku</string>
|
||||
<string name="error_no_post_notifications_permission">No \"post notifications\" permission</string>
|
||||
@@ -260,6 +273,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">Unknown result type {name: %s, params: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">Unknown selector {name: %s, type: %s}</string>
|
||||
<string name="error_unknown_type">Unknown type: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Format WebP-Lossless cannot be compressed with a quality parameter, use JPEG/PNG/WebP-Lossy instead</string>
|
||||
<string name="file_not_exist_or_readable">File does not exist or readable: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 foreground service</string>
|
||||
<string name="foreground_notification_text">Click to launch AutoJs6</string>
|
||||
@@ -465,6 +479,7 @@
|
||||
<string name="text_command_already_copied_to_clip">Command copied to clipboard</string>
|
||||
<string name="text_comment">Comment</string>
|
||||
<string name="text_compatibility">Compatibility</string>
|
||||
<string name="text_confidence_level">Confidence</string>
|
||||
<string name="text_config">Config</string>
|
||||
<string name="text_confirm_to_clear_all_histories">Are you sure to clear all histories?</string>
|
||||
<string name="text_confirm_to_clear_all_items">Are you sure to clear all items?</string>
|
||||
@@ -555,6 +570,7 @@
|
||||
<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>
|
||||
<string name="text_estimated">Estimated</string>
|
||||
<string name="text_execute">Execute</string>
|
||||
<string name="text_execute_code">Execute code</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] finished in %s seconds.\n</string>
|
||||
@@ -589,6 +605,7 @@
|
||||
<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>
|
||||
<string name="text_file">File</string>
|
||||
<string name="text_file_details">File details</string>
|
||||
<string name="text_file_exists">File already exists</string>
|
||||
<string name="text_file_explorer">File explorer</string>
|
||||
<string name="text_file_extensions_title">File extensions</string>
|
||||
@@ -627,6 +644,8 @@
|
||||
<string name="text_hidden_files_title">Hidden files and folders</string>
|
||||
<string name="text_hide">Hide</string>
|
||||
<string name="text_hide_button">Hide button</string>
|
||||
<string name="text_hide_node">Hide this node</string>
|
||||
<string name="text_hide_same_frame_nodes">Hide same frame nodes</string>
|
||||
<string name="text_histories">Histories</string>
|
||||
<string name="text_icon">Icon</string>
|
||||
<string name="text_ignore_battery_optimizations">Ignore battery optimizations</string>
|
||||
@@ -1034,14 +1053,5 @@
|
||||
<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_hide_node">Hide this node</string>
|
||||
<string name="text_hide_same_frame_nodes">Hide same frame nodes</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">No applications available for editing this file</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">No applications available for browsing this link</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">No applications available for installing this file</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">No applications available for viewing this file</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">No applications available for sending this file</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">No applications available for playing this file</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Format WebP-Lossless cannot be compressed with a quality parameter, use JPEG/PNG/WebP-Lossy instead</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -119,6 +119,13 @@
|
||||
<string name="dialog_title_theme_color_details">Detalles del color del tema</string>
|
||||
<string name="edit_and_run_handle_intent_error">No se puede procesar el archivo</string>
|
||||
<string name="edit_exit_without_save_warn">El contenido no se ha guardado, ¿está seguro de salir?</string>
|
||||
<string name="editable_file_info_byte_count_label">Bytes</string>
|
||||
<string name="editable_file_info_char_count_label">Caracteres</string>
|
||||
<string name="editable_file_info_file_charset_label">Charset</string>
|
||||
<string name="editable_file_info_file_path_label">Ruta</string>
|
||||
<string name="editable_file_info_file_size_label">Tamaño</string>
|
||||
<string name="editable_file_info_line_break_label">Salto</string>
|
||||
<string name="editable_file_info_line_count_label">Líneas</string>
|
||||
<string name="entry_app_language_auto">Siga el sistema</string>
|
||||
<string name="entry_documentation_source_local">Documentos locales</string>
|
||||
<string name="entry_documentation_source_online">Documentos en línea</string>
|
||||
@@ -221,6 +228,12 @@
|
||||
<string name="error_no_accessibility_permission">El servicio de accesibilidad está desactivado y el script se ha detenido</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">El servicio de accesibilidad no está activado</string>
|
||||
<string name="error_no_accessibility_service">No hay servicio de accesibilidad</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">No hay aplicaciones disponibles para abrir este enlace</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">No hay aplicaciones disponibles para editar este archivo</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">No hay aplicaciones disponibles para instalar este archivo</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">No hay aplicaciones disponibles para reproducir este archivo</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">No hay aplicaciones disponibles para enviar este archivo</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">No hay aplicaciones disponibles para ver este archivo</string>
|
||||
<string name="error_no_display_over_other_apps_permission">No hay permiso de \"mostrar sobre otras aplicaciones\".</string>
|
||||
<string name="error_no_permission_to_access_shizuku">No hay permiso para acceder a Shizuku</string>
|
||||
<string name="error_no_post_notifications_permission">Sin permiso para \"enviar notificaciones\"</string>
|
||||
@@ -263,6 +276,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">Tipo de resultado desconocido {nombre: %s, parámetro: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">Selector desconocido {nombre: %s, tipo: %s}</string>
|
||||
<string name="error_unknown_type">Tipo desconocido: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">El formato WebP-Lossless no se puede comprimir con un parámetro de calidad; usa JPEG/PNG/WebP-Lossy en su lugar</string>
|
||||
<string name="file_not_exist_or_readable">El archivo no existe o no se puede leer: %s</string>
|
||||
<string name="foreground_notification_channel_name">Servicio de primer plano de AutoJs6</string>
|
||||
<string name="foreground_notification_text">Haga clic para iniciar AutoJs6</string>
|
||||
@@ -468,6 +482,7 @@
|
||||
<string name="text_command_already_copied_to_clip">Comando copiado en el portapapeles</string>
|
||||
<string name="text_comment">Comente</string>
|
||||
<string name="text_compatibility">Compatibilidad</string>
|
||||
<string name="text_confidence_level">Confianza</string>
|
||||
<string name="text_config">Configuración</string>
|
||||
<string name="text_confirm_to_clear_all_histories">¿Está seguro de borrar todos los historiales?</string>
|
||||
<string name="text_confirm_to_clear_all_items">¿Seguro que desea borrar todos los elementos?</string>
|
||||
@@ -558,6 +573,7 @@
|
||||
<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>
|
||||
<string name="text_estimated">Estimado</string>
|
||||
<string name="text_execute">Ejecutar</string>
|
||||
<string name="text_execute_code">Ejecutar código</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] terminó en %s segundos.\n</string>
|
||||
@@ -592,6 +608,7 @@
|
||||
<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>
|
||||
<string name="text_file">Archivo</string>
|
||||
<string name="text_file_details">Detalles del archivo</string>
|
||||
<string name="text_file_exists">El archivo ya existe</string>
|
||||
<string name="text_file_explorer">Explorador de archivos</string>
|
||||
<string name="text_file_extensions_title">Extensiones de archivo</string>
|
||||
@@ -630,6 +647,8 @@
|
||||
<string name="text_hidden_files_title">Archivos y carpetas ocultos</string>
|
||||
<string name="text_hide">Ocultar</string>
|
||||
<string name="text_hide_button">Botón de ocultar</string>
|
||||
<string name="text_hide_node">Ocultar este nodo</string>
|
||||
<string name="text_hide_same_frame_nodes">Ocultar nodo del mismo marco</string>
|
||||
<string name="text_histories">Historiales</string>
|
||||
<string name="text_icon">Icono</string>
|
||||
<string name="text_ignore_battery_optimizations">Ignorar las optimizaciones de la batería</string>
|
||||
@@ -1037,14 +1056,5 @@
|
||||
<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_hide_node">Ocultar este nodo</string>
|
||||
<string name="text_hide_same_frame_nodes">Ocultar nodo del mismo marco</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">No hay aplicaciones disponibles para editar este archivo</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">No hay aplicaciones disponibles para abrir este enlace</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">No hay aplicaciones disponibles para instalar este archivo</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">No hay aplicaciones disponibles para ver este archivo</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">No hay aplicaciones disponibles para enviar este archivo</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">No hay aplicaciones disponibles para reproducir este archivo</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">El formato WebP-Lossless no se puede comprimir con un parámetro de calidad; usa JPEG/PNG/WebP-Lossy en su lugar</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -119,6 +119,13 @@
|
||||
<string name="dialog_title_theme_color_details">Détails de la couleur du thème</string>
|
||||
<string name="edit_and_run_handle_intent_error">Cannot process file</string>
|
||||
<string name="edit_exit_without_save_warn">Le contenu n\'a pas été enregistré, êtes-vous sûr de vouloir quitter ?</string>
|
||||
<string name="editable_file_info_byte_count_label">Octets</string>
|
||||
<string name="editable_file_info_char_count_label">Caractères</string>
|
||||
<string name="editable_file_info_file_charset_label">Encodage</string>
|
||||
<string name="editable_file_info_file_path_label">Chemin</string>
|
||||
<string name="editable_file_info_file_size_label">Taille</string>
|
||||
<string name="editable_file_info_line_break_label">Saut</string>
|
||||
<string name="editable_file_info_line_count_label">Lignes</string>
|
||||
<string name="entry_app_language_auto">Suivre le système</string>
|
||||
<string name="entry_documentation_source_local">Documents locaux</string>
|
||||
<string name="entry_documentation_source_online">Documents en ligne</string>
|
||||
@@ -221,6 +228,12 @@
|
||||
<string name="error_no_accessibility_permission">Le service d\'accessibilité est désactivé et le script s\'est arrêté</string>.
|
||||
<string name="error_no_accessibility_permission_to_capture">Le service d\'accessibilité n\'est pas activé</string>.
|
||||
<string name="error_no_accessibility_service">No accessibility service</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">Aucune application disponible pour parcourir ce lien</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">Aucune application disponible pour modifier ce fichier</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">Aucune application disponible pour installer ce fichier</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">Aucune application disponible pour lire ce fichier</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">Aucune application disponible pour envoyer ce fichier</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">Aucune application disponible pour afficher ce fichier</string>
|
||||
<string name="error_no_display_over_other_apps_permission">Aucune permission \"display over other apps\"</string>
|
||||
<string name="error_no_permission_to_access_shizuku">Pas de permission pour accéder à Shizuku</string>
|
||||
<string name="error_no_post_notifications_permission">Pas d\'autorisation pour les \"notifications d\'envoi\"</string>
|
||||
@@ -263,6 +276,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">Type de résultat inconnu {nom : %s, params : %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">Sélecteur inconnu {nom : %s, type : %s}</string>
|
||||
<string name="error_unknown_type">Type inconnu : %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Le format WebP-Lossless ne peut pas être compressé avec un paramètre de qualité ; utilisez plutôt JPEG/PNG/WebP-Lossy</string>
|
||||
<string name="file_not_exist_or_readable">Le fichier n\'existe pas ou n\'est pas lisible : %s</string>
|
||||
<string name="foreground_notification_channel_name">Service d\'avant-plan AutoJs6</string>
|
||||
<string name="foreground_notification_text">Cliquez pour lancer AutoJs6</string>
|
||||
@@ -468,6 +482,7 @@
|
||||
<string name="text_command_already_copied_to_clip">Commande copiée dans le presse-papiers</string>
|
||||
<string name="text_comment">Commentaire</string>
|
||||
<string name="text_compatibility">Compatibilité</string>
|
||||
<string name="text_confidence_level">Confiance</string>
|
||||
<string name="text_config">Configuration</string>
|
||||
<string name="text_confirm_to_clear_all_histories">Êtes-vous sûr de vouloir effacer tous les historiques ?</string>
|
||||
<string name="text_confirm_to_clear_all_items">Voulez-vous vraiment effacer tous les éléments ?</string>
|
||||
@@ -558,6 +573,7 @@
|
||||
<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>
|
||||
<string name="text_estimated">Estimé</string>
|
||||
<string name="text_execute">Exécuter</string>
|
||||
<string name="text_execute_code">Exécuter le code</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] finished in %s seconds.\n</string>
|
||||
@@ -592,6 +608,7 @@
|
||||
<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>
|
||||
<string name="text_file">Fichier</string>
|
||||
<string name="text_file_details">Détails du fichier</string>
|
||||
<string name="text_file_exists">Fichier déjà existant</string>
|
||||
<string name="text_file_explorer">Explorateur de fichiers</string>
|
||||
<string name="text_file_extensions_title">Extensions de fichier</string>
|
||||
@@ -630,6 +647,8 @@
|
||||
<string name="text_hidden_files_title">Fichiers et dossiers cachés</string>
|
||||
<string name="text_hide">Cacher</string>
|
||||
<string name="text_hide_button">Bouton de cacher</string>
|
||||
<string name="text_hide_node">Masquer ce nœud</string>
|
||||
<string name="text_hide_same_frame_nodes">Masquer le nœud du même cadre</string>
|
||||
<string name="text_histories">Histoires</string>
|
||||
<string name="text_icon">Icône</string>
|
||||
<string name="text_ignore_battery_optimizations">Ignorer les optimisations de la batterie</string>.
|
||||
@@ -1037,14 +1056,5 @@
|
||||
<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_hide_node">Masquer ce nœud</string>
|
||||
<string name="text_hide_same_frame_nodes">Masquer le nœud du même cadre</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">Aucune application disponible pour modifier ce fichier</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">Aucune application disponible pour parcourir ce lien</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">Aucune application disponible pour installer ce fichier</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">Aucune application disponible pour afficher ce fichier</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">Aucune application disponible pour envoyer ce fichier</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">Aucune application disponible pour lire ce fichier</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Le format WebP-Lossless ne peut pas être compressé avec un paramètre de qualité ; utilisez plutôt JPEG/PNG/WebP-Lossy</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -120,6 +120,13 @@
|
||||
<string name="dialog_title_theme_color_details">テーマカラー詳細</string>
|
||||
<string name="edit_and_run_handle_intent_error">ファイルを処理できません</string>
|
||||
<string name="edit_exit_without_save_warn">内容が保存されていませんので, 本当に終了しますか?</string>
|
||||
<string name="editable_file_info_byte_count_label">バイト数</string>
|
||||
<string name="editable_file_info_char_count_label">文字数</string>
|
||||
<string name="editable_file_info_file_charset_label">文字コード</string>
|
||||
<string name="editable_file_info_file_path_label">パス</string>
|
||||
<string name="editable_file_info_file_size_label">サイズ</string>
|
||||
<string name="editable_file_info_line_break_label">改行</string>
|
||||
<string name="editable_file_info_line_count_label">行数</string>
|
||||
<string name="entry_app_language_auto">システムに従ってください</string>
|
||||
<string name="entry_documentation_source_local">ローカルドキュメント</string>
|
||||
<string name="entry_documentation_source_online">オンラインドキュメント</string>
|
||||
@@ -222,6 +229,12 @@
|
||||
<string name="error_no_accessibility_permission">アクセシビリティサービスが無効で, スクリプトが停止しています</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">アクセシビリティサービスが有効になっていない</string>
|
||||
<string name="error_no_accessibility_service">アクセシビリティ・サービスがありません</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">このリンクを閲覧できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">このファイルを編集できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">このファイルをインストールできるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">このファイルを再生できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">このファイルを送信できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">このファイルを表示できるアプリがありません</string>
|
||||
<string name="error_no_display_over_other_apps_permission">他のアプリの上に表示する」権限がない</string>
|
||||
<string name="error_no_permission_to_access_shizuku">Shizuku にアクセスする権限がありません</string>
|
||||
<string name="error_no_post_notifications_permission">\"投稿通知\" 許可なし</string>
|
||||
@@ -264,6 +277,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">不明な結果タイプ {name: %s, params: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">不明なセレクタ {name: %s, type: %s} です</string>
|
||||
<string name="error_unknown_type">不明なタイプ: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 形式は品質パラメータで圧縮できません, 代わりに JPEG/PNG/WebP-Lossy を使用してください</string>
|
||||
<string name="file_not_exist_or_readable">ファイルが存在しないか, 読み取り可能でない: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 のフォアグラウンド サービス</string>
|
||||
<string name="foreground_notification_text">クリックすると, AutoJs6 が起動します</string>
|
||||
@@ -469,6 +483,7 @@
|
||||
<string name="text_command_already_copied_to_clip">クリップボードにコピーされたコマンド</string>
|
||||
<string name="text_comment">コメント</string>
|
||||
<string name="text_compatibility">互換性</string>
|
||||
<string name="text_confidence_level">信頼度</string>
|
||||
<string name="text_config">設定</string>
|
||||
<string name="text_confirm_to_clear_all_histories">すべての履歴をクリアしてもよろしいですか?</string>
|
||||
<string name="text_confirm_to_clear_all_items">すべての項目を削除しますか?</string>
|
||||
@@ -559,6 +574,7 @@
|
||||
<string name="text_error">エラー</string>
|
||||
<string name="text_error_copy_file" formatted="true">ファイルのコピーに失敗しました. %s</string>
|
||||
<string name="text_error_report">バグレポート</string>
|
||||
<string name="text_estimated">推定</string>
|
||||
<string name="text_execute">実行</string>
|
||||
<string name="text_execute_code">実行コード</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] は %s 秒で終了しました</string>
|
||||
@@ -593,6 +609,7 @@
|
||||
<string name="text_failed_to_send_log_entries">ログ・エントリの送信に失敗しました</string>
|
||||
<string name="text_failed_to_write_file">ファイルの書き込みに失敗しました</string>
|
||||
<string name="text_file">ファイル</string>
|
||||
<string name="text_file_details">ファイルの詳細</string>
|
||||
<string name="text_file_exists">ファイルは既に存在しています</string>
|
||||
<string name="text_file_explorer">ファイルエクスプローラー</string>
|
||||
<string name="text_file_extensions_title">ファイル拡張子</string>
|
||||
@@ -631,6 +648,8 @@
|
||||
<string name="text_hidden_files_title">隠しファイル・隠しフォルダー</string>
|
||||
<string name="text_hide">隠す</string>
|
||||
<string name="text_hide_button">隠しボタン</string>
|
||||
<string name="text_hide_node">このノードを隠す</string>
|
||||
<string name="text_hide_same_frame_nodes">同じフレームのノードを隠す</string>
|
||||
<string name="text_histories">ヒストリー</string>
|
||||
<string name="text_icon">アイコン</string>
|
||||
<string name="text_ignore_battery_optimizations">バッテリーの最適化を無視する</string>
|
||||
@@ -1038,14 +1057,5 @@
|
||||
<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_hide_node">このノードを隠す</string>
|
||||
<string name="text_hide_same_frame_nodes">同じフレームのノードを隠す</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">このファイルを編集できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">このリンクを閲覧できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">このファイルをインストールできるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">このファイルを表示できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">このファイルを送信できるアプリがありません</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">このファイルを再生できるアプリがありません</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 形式は品質パラメータで圧縮できません, 代わりに JPEG/PNG/WebP-Lossy を使用してください</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -121,6 +121,13 @@
|
||||
<string name="dialog_title_theme_color_details">테마 색상 세부정보</string>
|
||||
<string name="edit_and_run_handle_intent_error">파일을 처리 할 수 없습니다</string>
|
||||
<string name="edit_exit_without_save_warn">콘텐츠가 저장되지 않았습니다. 나가시겠습니까?</string>
|
||||
<string name="editable_file_info_byte_count_label">바이트수</string>
|
||||
<string name="editable_file_info_char_count_label">문자수</string>
|
||||
<string name="editable_file_info_file_charset_label">문자셋</string>
|
||||
<string name="editable_file_info_file_path_label">경로</string>
|
||||
<string name="editable_file_info_file_size_label">크기</string>
|
||||
<string name="editable_file_info_line_break_label">줄바꿈</string>
|
||||
<string name="editable_file_info_line_count_label">줄수</string>
|
||||
<string name="entry_app_language_auto">시스템을 따르십시오</string>
|
||||
<string name="entry_documentation_source_local">현지 문서</string>
|
||||
<string name="entry_documentation_source_online">온라인 문서</string>
|
||||
@@ -223,6 +230,12 @@
|
||||
<string name="error_no_accessibility_permission">접근성 서비스가 비활성화되고 스크립트가 중지되었습니다</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">접근성 서비스는 활성화되지 않습니다</string>
|
||||
<string name="error_no_accessibility_service">접근성 서비스가 없습니다</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">이 링크를 탐색할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">이 파일을 편집할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">이 파일을 설치할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">이 파일을 재생할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">이 파일을 전송할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">이 파일을 볼 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_display_over_other_apps_permission">\"다른 앱 위에 표시\"권한이 없습니다</string>
|
||||
<string name="error_no_permission_to_access_shizuku">Shizuku 에 액세스할 수 있는 권한이 없습니다</string>
|
||||
<string name="error_no_post_notifications_permission">\"게시물 알림\" 권한 없음</string>
|
||||
@@ -265,6 +278,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">알 수없는 결과 유형 {이름: %s, 매개 변수: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">알 수없는 선택기 {이름: %s, 유형: %s}</string>
|
||||
<string name="error_unknown_type">알 수없는 유형: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 형식은 품질 파라미터로 압축할 수 없습니다, 대신 JPEG/PNG/WebP-Lossy를 사용하세요</string>
|
||||
<string name="file_not_exist_or_readable">파일이 존재하지 않거나 읽을 수 없습니다: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 전경 서비스</string>
|
||||
<string name="foreground_notification_text">AutoJs6 을 시작하려면 클릭하십시오</string>
|
||||
@@ -470,6 +484,7 @@
|
||||
<string name="text_command_already_copied_to_clip">클립 보드에 복사 된 명령</string>
|
||||
<string name="text_comment">논평</string>
|
||||
<string name="text_compatibility">호환성</string>
|
||||
<string name="text_confidence_level">신뢰도</string>
|
||||
<string name="text_config">구성</string>
|
||||
<string name="text_confirm_to_clear_all_histories">모든 기록을 삭제하시겠습니까?</string>
|
||||
<string name="text_confirm_to_clear_all_items">모든 항목을 삭제하시겠습니까?</string>
|
||||
@@ -560,6 +575,7 @@
|
||||
<string name="text_error">오류</string>
|
||||
<string name="text_error_copy_file" formatted="true">파일을 복사하지 못했습니다: %s</string>
|
||||
<string name="text_error_report">버그 보고서</string>
|
||||
<string name="text_estimated">추정</string>
|
||||
<string name="text_execute">실행하다</string>
|
||||
<string name="text_execute_code">코드를 실행하십시오</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] 는 %s 초 만에 완료되었습니다.\n</string>
|
||||
@@ -594,6 +610,7 @@
|
||||
<string name="text_failed_to_send_log_entries">로그 항목을 보내지 못했습니다</string>
|
||||
<string name="text_failed_to_write_file">파일을 쓰지 못했습니다</string>
|
||||
<string name="text_file">파일</string>
|
||||
<string name="text_file_details">파일 세부정보</string>
|
||||
<string name="text_file_exists">존재하는 파일입니다</string>
|
||||
<string name="text_file_explorer">파일 탐색기</string>
|
||||
<string name="text_file_extensions_title">파일 확장자</string>
|
||||
@@ -632,6 +649,8 @@
|
||||
<string name="text_hidden_files_title">숨겨진 파일과 폴더</string>
|
||||
<string name="text_hide">숨기기</string>
|
||||
<string name="text_hide_button">버튼 숨기기</string>
|
||||
<string name="text_hide_node">이 노드를 숨기기</string>
|
||||
<string name="text_hide_same_frame_nodes">동일 프레임의 노드를 숨기기</string>
|
||||
<string name="text_histories">역사</string>
|
||||
<string name="text_icon">상</string>
|
||||
<string name="text_ignore_battery_optimizations">배터리 최적화를 무시합니다</string>
|
||||
@@ -1039,14 +1058,5 @@
|
||||
<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_hide_node">이 노드를 숨기기</string>
|
||||
<string name="text_hide_same_frame_nodes">동일 프레임의 노드를 숨기기</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">이 파일을 편집할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">이 링크를 탐색할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">이 파일을 설치할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">이 파일을 볼 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">이 파일을 전송할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">이 파일을 재생할 수 있는 앱이 없습니다</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 형식은 품질 파라미터로 압축할 수 없습니다, 대신 JPEG/PNG/WebP-Lossy를 사용하세요</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -119,6 +119,13 @@
|
||||
<string name="dialog_title_theme_color_details">Детали цвета темы</string>
|
||||
<string name="edit_and_run_handle_intent_error">Невозможно обработать файл</string>
|
||||
<string name="edit_exit_without_save_warn">Содержимое не было сохранено, вы уверены в выходе?</string>
|
||||
<string name="editable_file_info_byte_count_label">Байты</string>
|
||||
<string name="editable_file_info_char_count_label">Символы</string>
|
||||
<string name="editable_file_info_file_charset_label">Кодировка</string>
|
||||
<string name="editable_file_info_file_path_label">Путь</string>
|
||||
<string name="editable_file_info_file_size_label">Размер</string>
|
||||
<string name="editable_file_info_line_break_label">Перенос</string>
|
||||
<string name="editable_file_info_line_count_label">Строки</string>
|
||||
<string name="entry_app_language_auto">Следовать за системой</string>
|
||||
<string name="entry_documentation_source_local">Локальные документы</string>
|
||||
<string name="entry_documentation_source_online">Онлайн-документы</string>
|
||||
@@ -221,6 +228,12 @@
|
||||
<string name="error_no_accessibility_permission">Служба доступности отключена, и сценарий остановлен</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">Служба доступности не активирована</string>
|
||||
<string name="error_no_accessibility_service">Нет службы доступности</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">Нет приложений для просмотра этой ссылки</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">Нет приложений для редактирования этого файла</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">Нет приложений для установки этого файла</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">Нет приложений для воспроизведения этого файла</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">Нет приложений для отправки этого файла</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">Нет приложений для просмотра этого файла</string>
|
||||
<string name="error_no_display_over_other_apps_permission">Нет разрешения \"отображать поверх других приложений\"</string>
|
||||
<string name="error_no_permission_to_access_shizuku">Нет разрешения на доступ к Shizuku</string>
|
||||
<string name="error_no_post_notifications_permission">Нет разрешения на \"уведомления о сообщениях\"</string>
|
||||
@@ -263,6 +276,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">Неизвестный тип результата {имя: %s, params: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">Неизвестный селектор {имя: %s, тип: %s}</string>
|
||||
<string name="error_unknown_type">Неизвестный тип: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Формат WebP-Lossless нельзя сжать с параметром качества; используйте вместо этого JPEG/PNG/WebP-Lossy</string>
|
||||
<string name="file_not_exist_or_readable">\"Файл не существует или не доступен для чтения: %s\".</string>
|
||||
<string name="foreground_notification_channel_name">Служба AutoJs6 в фоновом режиме</string>
|
||||
<string name="foreground_notification_text">Нажмите для запуска AutoJs6</string>
|
||||
@@ -468,6 +482,7 @@
|
||||
<string name="text_command_already_copied_to_clip">Команда скопирована в буфер обмена</string>
|
||||
<string name="text_comment">Комментарий</string>
|
||||
<string name="text_compatibility">Совместимость</string>
|
||||
<string name="text_confidence_level">Доверие</string>
|
||||
<string name="text_config">Конфигурация</string>
|
||||
<string name="text_confirm_to_clear_all_histories">Вы уверены, что хотите очистить всю историю?</string>
|
||||
<string name="text_confirm_to_clear_all_items">Вы уверены, что хотите удалить все элементы?</string>
|
||||
@@ -558,6 +573,7 @@
|
||||
<string name="text_error">Ошибка</string>
|
||||
<string name="text_error_copy_file" formatted="true">Не удалось скопировать файл: %s</string>
|
||||
<string name="text_error_report">Отчет об ошибке</string>
|
||||
<string name="text_estimated">Оценка</string>
|
||||
<string name="text_execute">Выполнить</string>
|
||||
<string name="text_execute_code">Код выполнения</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] завершилось через %s секунд.\n</string>
|
||||
@@ -592,6 +608,7 @@
|
||||
<string name="text_failed_to_send_log_entries">Не удалось отправить записи журнала</string>
|
||||
<string name="text_failed_to_write_file">Не удалось записать файл</string>
|
||||
<string name="text_file">Файл</string>
|
||||
<string name="text_file_details">Сведения о файле</string>
|
||||
<string name="text_file_exists">Файл уже существует</string>
|
||||
<string name="text_file_explorer">Проводник файлов</string>
|
||||
<string name="text_file_extensions_title">Расширения файлов</string>
|
||||
@@ -630,6 +647,8 @@
|
||||
<string name="text_hidden_files_title">Скрытые файлы и папки</string>
|
||||
<string name="text_hide">Скрыть</string>
|
||||
<string name="text_hide_button">Кнопка скрытия</string>
|
||||
<string name="text_hide_node">Скрыть этот узел</string>
|
||||
<string name="text_hide_same_frame_nodes">Скрыть узел того же фрейма</string>
|
||||
<string name="text_histories">Истории</string>
|
||||
<string name="text_icon">Значок</string>
|
||||
<string name="text_ignore_battery_optimizations">Игнорировать оптимизацию батареи</string>
|
||||
@@ -1037,14 +1056,5 @@
|
||||
<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_hide_node">Скрыть этот узел</string>
|
||||
<string name="text_hide_same_frame_nodes">Скрыть узел того же фрейма</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">Нет приложений для редактирования этого файла</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">Нет приложений для просмотра этой ссылки</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">Нет приложений для установки этого файла</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">Нет приложений для просмотра этого файла</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">Нет приложений для отправки этого файла</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">Нет приложений для воспроизведения этого файла</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Формат WebP-Lossless нельзя сжать с параметром качества; используйте вместо этого JPEG/PNG/WebP-Lossy</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -117,6 +117,13 @@
|
||||
<string name="dialog_title_theme_color_details">主題色詳情</string>
|
||||
<string name="edit_and_run_handle_intent_error">無法處理文件</string>
|
||||
<string name="edit_exit_without_save_warn">內容尚未保存, 確定要退出嗎</string>
|
||||
<string name="editable_file_info_byte_count_label">字節數</string>
|
||||
<string name="editable_file_info_char_count_label">字符數</string>
|
||||
<string name="editable_file_info_file_charset_label">編碼</string>
|
||||
<string name="editable_file_info_file_path_label">路徑</string>
|
||||
<string name="editable_file_info_file_size_label">大小</string>
|
||||
<string name="editable_file_info_line_break_label">換行</string>
|
||||
<string name="editable_file_info_line_count_label">總行數</string>
|
||||
<string name="entry_app_language_auto">跟隨系統</string>
|
||||
<string name="entry_documentation_source_local">本地文檔</string>
|
||||
<string name="entry_documentation_source_online">在線文檔</string>
|
||||
@@ -219,6 +226,12 @@
|
||||
<string name="error_no_accessibility_permission">無障礙服務未啓用</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">無障礙服務未啓用</string>
|
||||
<string name="error_no_accessibility_service">沒有無障礙服務</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">未找到用於瀏覽該鏈接的應用</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">未找到用於編輯該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">未找到用於安裝該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">未找到用於播放該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">未找到用於發送該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">未找到用於查看該文件的應用</string>
|
||||
<string name="error_no_display_over_other_apps_permission">缺少 \"顯示在其他應用上層\" 權限</string>
|
||||
<string name="error_no_permission_to_access_shizuku">缺少 Shizuku 訪問權限</string>
|
||||
<string name="error_no_post_notifications_permission">缺少 \"發佈通知\" 權限</string>
|
||||
@@ -261,6 +274,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">未知結果類型 {名稱: %s, 參數: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">未知選擇器 {名稱: %s, 類型: %s}</string>
|
||||
<string name="error_unknown_type">未知類型: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 格式無法使用 quality 質量參數進行壓縮, 可改用 JPEG/PNG/WebP-Lossy</string>
|
||||
<string name="file_not_exist_or_readable">文件不存在或不可讀: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 前台服務</string>
|
||||
<string name="foreground_notification_text">點擊返回 AutoJs6 主界面</string>
|
||||
@@ -466,6 +480,7 @@
|
||||
<string name="text_command_already_copied_to_clip">指令已複製到剪貼板</string>
|
||||
<string name="text_comment">註釋</string>
|
||||
<string name="text_compatibility">兼容性</string>
|
||||
<string name="text_confidence_level">置信度</string>
|
||||
<string name="text_config">配置</string>
|
||||
<string name="text_confirm_to_clear_all_histories">是否確定清空歷史記錄</string>
|
||||
<string name="text_confirm_to_clear_all_items">是否確定清空全部記錄</string>
|
||||
@@ -556,6 +571,7 @@
|
||||
<string name="text_error">錯誤</string>
|
||||
<string name="text_error_copy_file">文件複製失敗: %s</string>
|
||||
<string name="text_error_report">錯誤報告</string>
|
||||
<string name="text_estimated">預估</string>
|
||||
<string name="text_execute">執行</string>
|
||||
<string name="text_execute_code">執行代碼</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] 運行結束 (用時 %s 秒)\n</string>
|
||||
@@ -590,6 +606,7 @@
|
||||
<string name="text_failed_to_send_log_entries">日誌條目發送失敗</string>
|
||||
<string name="text_failed_to_write_file">文件寫入失敗</string>
|
||||
<string name="text_file">文件</string>
|
||||
<string name="text_file_details">文件詳情</string>
|
||||
<string name="text_file_exists">文件已存在</string>
|
||||
<string name="text_file_explorer">文件管理器</string>
|
||||
<string name="text_file_extensions_title">文件擴展名</string>
|
||||
@@ -628,6 +645,8 @@
|
||||
<string name="text_hidden_files_title">隱藏文件和文件夾</string>
|
||||
<string name="text_hide">隱藏</string>
|
||||
<string name="text_hide_button">隱藏按鈕</string>
|
||||
<string name="text_hide_node">隱藏此節點</string>
|
||||
<string name="text_hide_same_frame_nodes">隱藏同框節點</string>
|
||||
<string name="text_histories">歷史記錄</string>
|
||||
<string name="text_icon">圖標</string>
|
||||
<string name="text_ignore_battery_optimizations">忽略電池優化</string>
|
||||
@@ -1035,14 +1054,5 @@
|
||||
<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_hide_node">隱藏此節點</string>
|
||||
<string name="text_hide_same_frame_nodes">隱藏同框節點</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">未找到用於編輯該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">未找到用於瀏覽該鏈接的應用</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">未找到用於安裝該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">未找到用於查看該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">未找到用於發送該文件的應用</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">未找到用於播放該文件的應用</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 格式無法使用 quality 質量參數進行壓縮, 可改用 JPEG/PNG/WebP-Lossy</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -117,6 +117,13 @@
|
||||
<string name="dialog_title_theme_color_details">主題色詳情</string>
|
||||
<string name="edit_and_run_handle_intent_error">無法處理檔案</string>
|
||||
<string name="edit_exit_without_save_warn">內容尚未儲存, 確定要退出嗎</string>
|
||||
<string name="editable_file_info_byte_count_label">位元組數</string>
|
||||
<string name="editable_file_info_char_count_label">字元數</string>
|
||||
<string name="editable_file_info_file_charset_label">編碼</string>
|
||||
<string name="editable_file_info_file_path_label">路徑</string>
|
||||
<string name="editable_file_info_file_size_label">大小</string>
|
||||
<string name="editable_file_info_line_break_label">換行</string>
|
||||
<string name="editable_file_info_line_count_label">總行數</string>
|
||||
<string name="entry_app_language_auto">跟隨系統</string>
|
||||
<string name="entry_documentation_source_local">本地文件</string>
|
||||
<string name="entry_documentation_source_online">線上文件</string>
|
||||
@@ -219,6 +226,12 @@
|
||||
<string name="error_no_accessibility_permission">無障礙服務未啟用</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">無障礙服務未啟用</string>
|
||||
<string name="error_no_accessibility_service">沒有無障礙服務</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">未找到用於瀏覽該連結的應用</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">未找到用於編輯該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">未找到用於安裝該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">未找到用於播放該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">未找到用於傳送該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">未找到用於檢視該檔案的應用</string>
|
||||
<string name="error_no_display_over_other_apps_permission">缺少 \"顯示在其他應用上層\" 許可權</string>
|
||||
<string name="error_no_permission_to_access_shizuku">缺少 Shizuku 訪問許可權</string>
|
||||
<string name="error_no_post_notifications_permission">缺少 \"釋出通知\" 許可權</string>
|
||||
@@ -261,6 +274,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">未知結果型別 {名稱: %s, 引數: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">未知選擇器 {名稱: %s, 型別: %s}</string>
|
||||
<string name="error_unknown_type">未知型別: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 格式無法使用 quality 質量引數進行壓縮, 可改用 JPEG/PNG/WebP-Lossy</string>
|
||||
<string name="file_not_exist_or_readable">檔案不存在或不可讀: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 前臺服務</string>
|
||||
<string name="foreground_notification_text">點選返回 AutoJs6 主介面</string>
|
||||
@@ -466,6 +480,7 @@
|
||||
<string name="text_command_already_copied_to_clip">指令已複製到剪貼簿</string>
|
||||
<string name="text_comment">註釋</string>
|
||||
<string name="text_compatibility">相容性</string>
|
||||
<string name="text_confidence_level">置信度</string>
|
||||
<string name="text_config">配置</string>
|
||||
<string name="text_confirm_to_clear_all_histories">是否確定清空歷史記錄</string>
|
||||
<string name="text_confirm_to_clear_all_items">是否確定清空全部記錄</string>
|
||||
@@ -556,6 +571,7 @@
|
||||
<string name="text_error">錯誤</string>
|
||||
<string name="text_error_copy_file">檔案複製失敗: %s</string>
|
||||
<string name="text_error_report">錯誤報告</string>
|
||||
<string name="text_estimated">預估</string>
|
||||
<string name="text_execute">執行</string>
|
||||
<string name="text_execute_code">執行程式碼</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] 執行結束 (用時 %s 秒)\n</string>
|
||||
@@ -590,6 +606,7 @@
|
||||
<string name="text_failed_to_send_log_entries">日誌條目傳送失敗</string>
|
||||
<string name="text_failed_to_write_file">檔案寫入失敗</string>
|
||||
<string name="text_file">檔案</string>
|
||||
<string name="text_file_details">檔案詳情</string>
|
||||
<string name="text_file_exists">檔案已存在</string>
|
||||
<string name="text_file_explorer">檔案管理器</string>
|
||||
<string name="text_file_extensions_title">副檔名</string>
|
||||
@@ -628,6 +645,8 @@
|
||||
<string name="text_hidden_files_title">隱藏檔案和資料夾</string>
|
||||
<string name="text_hide">隱藏</string>
|
||||
<string name="text_hide_button">隱藏按鈕</string>
|
||||
<string name="text_hide_node">隱藏此節點</string>
|
||||
<string name="text_hide_same_frame_nodes">隱藏同框節點</string>
|
||||
<string name="text_histories">歷史記錄</string>
|
||||
<string name="text_icon">圖示</string>
|
||||
<string name="text_ignore_battery_optimizations">忽略電池最佳化</string>
|
||||
@@ -1035,14 +1054,5 @@
|
||||
<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_hide_node">隱藏此節點</string>
|
||||
<string name="text_hide_same_frame_nodes">隱藏同框節點</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">未找到用於編輯該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">未找到用於瀏覽該連結的應用</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">未找到用於安裝該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">未找到用於檢視該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">未找到用於傳送該檔案的應用</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">未找到用於播放該檔案的應用</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 格式無法使用 quality 質量引數進行壓縮, 可改用 JPEG/PNG/WebP-Lossy</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -117,6 +117,13 @@
|
||||
<string name="dialog_title_theme_color_details">主题色详情</string>
|
||||
<string name="edit_and_run_handle_intent_error">无法处理文件</string>
|
||||
<string name="edit_exit_without_save_warn">内容尚未保存, 确定要退出吗</string>
|
||||
<string name="editable_file_info_byte_count_label">字节数</string>
|
||||
<string name="editable_file_info_char_count_label">字符数</string>
|
||||
<string name="editable_file_info_file_charset_label">编码</string>
|
||||
<string name="editable_file_info_file_path_label">路径</string>
|
||||
<string name="editable_file_info_file_size_label">大小</string>
|
||||
<string name="editable_file_info_line_break_label">换行</string>
|
||||
<string name="editable_file_info_line_count_label">总行数</string>
|
||||
<string name="entry_app_language_auto">跟随系统</string>
|
||||
<string name="entry_documentation_source_local">本地文档</string>
|
||||
<string name="entry_documentation_source_online">在线文档</string>
|
||||
@@ -219,6 +226,12 @@
|
||||
<string name="error_no_accessibility_permission">无障碍服务未启用</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">无障碍服务未启用</string>
|
||||
<string name="error_no_accessibility_service">没有无障碍服务</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">未找到用于浏览该链接的应用</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">未找到用于编辑该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">未找到用于安装该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">未找到用于播放该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">未找到用于发送该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">未找到用于查看该文件的应用</string>
|
||||
<string name="error_no_display_over_other_apps_permission">缺少 \"显示在其他应用上层\" 权限</string>
|
||||
<string name="error_no_permission_to_access_shizuku">缺少 Shizuku 访问权限</string>
|
||||
<string name="error_no_post_notifications_permission">缺少 \"发布通知\" 权限</string>
|
||||
@@ -261,6 +274,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">未知结果类型 {名称: %s, 参数: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">未知选择器 {名称: %s, 类型: %s}</string>
|
||||
<string name="error_unknown_type">未知类型: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 格式无法使用 quality 质量参数进行压缩, 可改用 JPEG/PNG/WebP-Lossy</string>
|
||||
<string name="file_not_exist_or_readable">文件不存在或不可读: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 前台服务</string>
|
||||
<string name="foreground_notification_text">点击返回 AutoJs6 主界面</string>
|
||||
@@ -466,6 +480,7 @@
|
||||
<string name="text_command_already_copied_to_clip">指令已复制到剪贴板</string>
|
||||
<string name="text_comment">注释</string>
|
||||
<string name="text_compatibility">兼容性</string>
|
||||
<string name="text_confidence_level">置信度</string>
|
||||
<string name="text_config">配置</string>
|
||||
<string name="text_confirm_to_clear_all_histories">是否确定清空历史记录</string>
|
||||
<string name="text_confirm_to_clear_all_items">是否确定清空全部记录</string>
|
||||
@@ -556,6 +571,7 @@
|
||||
<string name="text_error">错误</string>
|
||||
<string name="text_error_copy_file">文件复制失败: %s</string>
|
||||
<string name="text_error_report">错误报告</string>
|
||||
<string name="text_estimated">预估</string>
|
||||
<string name="text_execute">执行</string>
|
||||
<string name="text_execute_code">执行代码</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] 运行结束 (用时 %s 秒)\n</string>
|
||||
@@ -590,6 +606,7 @@
|
||||
<string name="text_failed_to_send_log_entries">日志条目发送失败</string>
|
||||
<string name="text_failed_to_write_file">文件写入失败</string>
|
||||
<string name="text_file">文件</string>
|
||||
<string name="text_file_details">文件详情</string>
|
||||
<string name="text_file_exists">文件已存在</string>
|
||||
<string name="text_file_explorer">文件管理器</string>
|
||||
<string name="text_file_extensions_title">文件扩展名</string>
|
||||
@@ -628,6 +645,8 @@
|
||||
<string name="text_hidden_files_title">隐藏文件和文件夹</string>
|
||||
<string name="text_hide">隐藏</string>
|
||||
<string name="text_hide_button">隐藏按钮</string>
|
||||
<string name="text_hide_node">隐藏此节点</string>
|
||||
<string name="text_hide_same_frame_nodes">隐藏同框节点</string>
|
||||
<string name="text_histories">历史记录</string>
|
||||
<string name="text_icon">图标</string>
|
||||
<string name="text_ignore_battery_optimizations">忽略电池优化</string>
|
||||
@@ -1035,14 +1054,5 @@
|
||||
<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_hide_node">隐藏此节点</string>
|
||||
<string name="text_hide_same_frame_nodes">隐藏同框节点</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">未找到用于编辑该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">未找到用于浏览该链接的应用</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">未找到用于安装该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">未找到用于查看该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">未找到用于发送该文件的应用</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">未找到用于播放该文件的应用</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">WebP-Lossless 格式无法使用 quality 质量参数进行压缩, 可改用 JPEG/PNG/WebP-Lossy</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -347,6 +347,13 @@
|
||||
<string name="dialog_title_theme_color_details">Theme color details</string>
|
||||
<string name="edit_and_run_handle_intent_error">Cannot process file</string>
|
||||
<string name="edit_exit_without_save_warn">The content has not been saved, are you sure to exit?</string>
|
||||
<string name="editable_file_info_byte_count_label">Bytes</string>
|
||||
<string name="editable_file_info_char_count_label">Chars</string>
|
||||
<string name="editable_file_info_file_charset_label">Charset</string>
|
||||
<string name="editable_file_info_file_path_label">Path</string>
|
||||
<string name="editable_file_info_file_size_label">Size</string>
|
||||
<string name="editable_file_info_line_break_label">EOL</string>
|
||||
<string name="editable_file_info_line_count_label">Lines</string>
|
||||
<string name="entry_app_language_auto">Follow system</string>
|
||||
<string name="entry_documentation_source_local">Local docs</string>
|
||||
<string name="entry_documentation_source_online">Online docs</string>
|
||||
@@ -449,6 +456,12 @@
|
||||
<string name="error_no_accessibility_permission">Accessibility service is disabled and the script has stopped</string>
|
||||
<string name="error_no_accessibility_permission_to_capture">Accessibility service is not activated</string>
|
||||
<string name="error_no_accessibility_service">No accessibility service</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">No applications available for browsing this link</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">No applications available for editing this file</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">No applications available for installing this file</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">No applications available for playing this file</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">No applications available for sending this file</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">No applications available for viewing this file</string>
|
||||
<string name="error_no_display_over_other_apps_permission">No \"display over other apps\" permission</string>
|
||||
<string name="error_no_permission_to_access_shizuku">No permission to access Shizuku</string>
|
||||
<string name="error_no_post_notifications_permission">No \"post notifications\" permission</string>
|
||||
@@ -491,6 +504,7 @@
|
||||
<string name="error_unknown_picker_result_type_with_params" formatted="false">Unknown result type {name: %s, params: %s}</string>
|
||||
<string name="error_unknown_picker_selector_type" formatted="false">Unknown selector {name: %s, type: %s}</string>
|
||||
<string name="error_unknown_type">Unknown type: %s</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Format WebP-Lossless cannot be compressed with a quality parameter, use JPEG/PNG/WebP-Lossy instead</string>
|
||||
<string name="file_not_exist_or_readable">File does not exist or readable: %s</string>
|
||||
<string name="foreground_notification_channel_name">AutoJs6 foreground service</string>
|
||||
<string name="foreground_notification_text">Click to launch AutoJs6</string>
|
||||
@@ -696,6 +710,7 @@
|
||||
<string name="text_command_already_copied_to_clip">Command copied to clipboard</string>
|
||||
<string name="text_comment">Comment</string>
|
||||
<string name="text_compatibility">Compatibility</string>
|
||||
<string name="text_confidence_level">Confidence</string>
|
||||
<string name="text_config">Config</string>
|
||||
<string name="text_confirm_to_clear_all_histories">Are you sure to clear all histories?</string>
|
||||
<string name="text_confirm_to_clear_all_items">Are you sure to clear all items?</string>
|
||||
@@ -786,6 +801,7 @@
|
||||
<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>
|
||||
<string name="text_estimated">Estimated</string>
|
||||
<string name="text_execute">Execute</string>
|
||||
<string name="text_execute_code">Execute code</string>
|
||||
<string name="text_execution_finished" formatted="false">[%s] finished in %s seconds.\n</string>
|
||||
@@ -820,6 +836,7 @@
|
||||
<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>
|
||||
<string name="text_file">File</string>
|
||||
<string name="text_file_details">File details</string>
|
||||
<string name="text_file_exists">File already exists</string>
|
||||
<string name="text_file_explorer">File explorer</string>
|
||||
<string name="text_file_extensions_title">File extensions</string>
|
||||
@@ -858,6 +875,8 @@
|
||||
<string name="text_hidden_files_title">Hidden files and folders</string>
|
||||
<string name="text_hide">Hide</string>
|
||||
<string name="text_hide_button">Hide button</string>
|
||||
<string name="text_hide_node">Hide this node</string>
|
||||
<string name="text_hide_same_frame_nodes">Hide same frame nodes</string>
|
||||
<string name="text_histories">Histories</string>
|
||||
<string name="text_icon">Icon</string>
|
||||
<string name="text_ignore_battery_optimizations">Ignore battery optimizations</string>
|
||||
@@ -1265,14 +1284,5 @@
|
||||
<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_hide_node">Hide this node</string>
|
||||
<string name="text_hide_same_frame_nodes">Hide same frame nodes</string>
|
||||
<string name="error_no_applications_available_for_editing_this_file">No applications available for editing this file</string>
|
||||
<string name="error_no_applications_available_for_browsing_this_link">No applications available for browsing this link</string>
|
||||
<string name="error_no_applications_available_for_installing_this_file">No applications available for installing this file</string>
|
||||
<string name="error_no_applications_available_for_viewing_this_file">No applications available for viewing this file</string>
|
||||
<string name="error_no_applications_available_for_sending_this_file">No applications available for sending this file</string>
|
||||
<string name="error_no_applications_available_for_playing_this_file">No applications available for playing this file</string>
|
||||
<string name="error_webp_lossless_quality_not_supported">Format WebP-Lossless cannot be compressed with a quality parameter, use JPEG/PNG/WebP-Lossy instead</string>
|
||||
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user