diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 03da199e..3ba85c17 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -145,6 +145,8 @@ "代码编辑器保存文件失败时自动存为草稿并支持另存为新文件", "代码编辑器加载大文件时提升一定程度的流畅度", "代码编辑器 \"查找/替换\" 支持状态持久化及实时显示搜索计数信息", + "代码编辑器提示保存时确保保存成功后再退出编辑器以降低保存失败率", + "代码编辑器保存按钮的状态更符合用户主观逻辑", "打包应用页面默认勾选必要权限 (WAKE_LOCK/INTERNET/WRITE_EXTERNAL_STORAGE) _[`issue #397`](http://issues.autojs6.com/397)_", "打包应用设置页面增加前台服务开关 _[`issue #406`](http://issues.autojs6.com/406)_", "脚本项目配置文件保存时增加键名冲突检测机制防止键名歧义", diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt index 5955565d..7ab91aed 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt @@ -13,12 +13,14 @@ import android.text.TextPaint import android.util.Log import android.util.TypedValue import android.view.ActionMode +import android.view.Gravity import android.view.Menu import android.view.MenuItem import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.core.view.get import androidx.core.view.size +import com.afollestad.materialdialogs.DialogAction import com.afollestad.materialdialogs.MaterialDialog import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -32,6 +34,7 @@ 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.error.ErrorDialogActivity import org.autojs.autojs.ui.main.MainActivity import org.autojs.autojs.ui.main.scripts.EditableFileInfoDialogManager import org.autojs.autojs.util.DialogUtils @@ -48,8 +51,8 @@ import java.io.IOException /** * Created by Stardust on Jan 29, 2017. - * Modified by SuperMonster003 as of Jan 21, 2023. - * Modified by JetBrains AI Assistant (GPT-5.2) as of Feb 8, 2026. + * Modified by JetBrains AI Assistant (GPT-5.2) as of Feb 12, 2026. + * Modified by SuperMonster003 as of Feb 12, 2026. */ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyActivity { @@ -290,7 +293,7 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc } override fun finish() { - if (mEditorView.isTextChanged) { + if (mEditorView.saveStickyDirty) { showExitConfirmDialog() } else { finishAndRemoveFromRecents() @@ -305,6 +308,7 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc } } + @SuppressLint("CheckResult") private fun showExitConfirmDialog() { DialogUtils.buildAndShowAdaptive { MaterialDialog.Builder(this) @@ -312,17 +316,60 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc .content(R.string.edit_exit_without_save_warn) .neutralText(R.string.dialog_button_back) .negativeText(R.string.text_exit_directly) + .onNeutral { d, _ -> d.dismiss() } .negativeColorRes(R.color.dialog_button_caution) - .onNegative { _, _ -> + .onNegative { d, _ -> + runCatching { d.dismiss() } finishAndRemoveFromRecents() } .positiveText(R.string.text_save_and_exit) .positiveColorRes(R.color.dialog_button_warn) - .onPositive { _, _ -> - mEditorView.saveFile() - finishAndRemoveFromRecents() + .onPositive { d, _ -> + // Save is async, exit only after success. + // zh-CN: 保存是异步的, 保存成功后再退出. + d.apply { + setCancelable(false) + getActionButton(DialogAction.NEUTRAL).apply { + isEnabled = false + setTextColor(getColor(R.color.dialog_button_unavailable)) + } + getActionButton(DialogAction.NEGATIVE).apply { + isEnabled = false + setTextColor(getColor(R.color.dialog_button_unavailable)) + } + getActionButton(DialogAction.POSITIVE).apply { + isEnabled = false + setTextColor(getColor(R.color.dialog_button_unavailable)) + } + contentView?.postDelayed({ + contentView?.text = getString(R.string.text_saving) + }, 300) + } + + mEditorView + .save() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + runCatching { d.dismiss() } + finishAndRemoveFromRecents() + }, { e: Throwable -> + // Save failed, keep editor open. + // zh-CN: 保存失败, 保持编辑器不退出. + e.printStackTrace() + runCatching { d.dismiss() } + ErrorDialogActivity.showErrorDialog(this@EditActivity, R.string.error_failed_to_save, e.message) + }) } + .autoDismiss(false) .build() + .apply { + contentView?.apply { + setLineSpacing(0f, 1.2f) + setLines(2) + minLines = 2 + gravity = Gravity.CENTER_VERTICAL + } + } } } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt index 3d9786a5..8c537ce0 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt @@ -120,7 +120,7 @@ import java.util.regex.Pattern * Created by Stardust on Sep 28, 2017. * Transformed by SuperMonster003 on May 1, 2023. * Modified by SuperMonster003 as of Feb 3, 2026. - * Modified by JetBrains AI Assistant (GPT-5.2) as of Feb 8, 2026. + * Modified by JetBrains AI Assistant (GPT-5.2) as of Feb 12, 2026. */ @SuppressLint("CheckResult") class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFragment.OnMenuItemClickListener { @@ -135,6 +135,46 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag private var _name: String? = null + // Sticky save dirty flag. + // Behavior: + // - Set to true on ANY text change (including undo/redo). + // - Reset to false only after successful save or when a new baseline text is loaded. + // + // zh-CN: + // 保存按钮的 sticky 脏标记. + // 行为: + // - 任意文本变化 (包括 undo/redo) 都会置为 true. + // - 仅在保存成功或加载新基线文本时重置为 false. + @Volatile + var saveStickyDirty: Boolean = false + + // Whether we have had any direct edits since last save/baseline. + // Direct edits mean changes NOT caused by undo/redo buttons. + // + // zh-CN: + // 自上次保存/建立基线以来是否发生过任何直接编辑. + // 直接编辑指不是由撤销/重做按钮触发的文本变化. + @Volatile + private var mHadDirectEditSinceSave: Boolean = false + + // Guard flag to mark text changes caused by undo/redo button actions. + // This is used to distinguish direct edits from history navigation. + // + // zh-CN: + // 用于标记由撤销/重做按钮动作导致的文本变化的哨兵标记. + // 用于区分直接编辑与历史导航. + @Volatile + private var mUndoRedoButtonInProgress: Boolean = false + + // Whether user has touched/moved caret during large file loading. + // If true, we should NOT force caret to 0 on load completion. + // + // zh-CN: + // 用户是否在大文件加载期间触摸过/移动过光标. + // 若为 true, 则加载完成时不要强制把光标设为 0. + @Volatile + private var mUserMovedCursorDuringLoading: Boolean = false + var name: String get() = _name ?: "[ ${this.context.getString(text_unknown)} ]" set(value) { @@ -232,7 +272,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag // Delay showing loading bar to avoid flicker. // zh-CN: 延迟显示加载提示条, 避免闪烁. - private val mLoadingBarShowDelayMs = 1500L + private val mLoadingBarShowDelayMs = 300L // Once shown, keep it visible for at least this duration. // zh-CN: 一旦显示, 则保证最短展示时间. @@ -333,6 +373,8 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag // Initialize menu state early to avoid "first render" flicker. // zh-CN: 尽早初始化菜单状态, 避免首次渲染闪烁. mEditorLoading = true + saveStickyDirty = false + mHadDirectEditSinceSave = false syncPrimaryMenuState() val name = intent.getStringExtra(EXTRA_NAME) @@ -851,12 +893,14 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag mLargeFileMode = true mEditorLoading = true + mUserMovedCursorDuringLoading = false syncPrimaryMenuState() editText.setLoadingText(true) editor.setRedoUndoEnabled(false) - editText.setLoadingGutterDigits(7) + editText.setLoadingGutterDigits(3) editText.setText("") + editText.setSelection(0) val choreographer = Choreographer.getInstance() @@ -901,8 +945,19 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag endEditorLoadingUi() // Ensure caret/focus after loading is done. - // zh-CN: 加载结束后确保光标/焦点. - post { ensureEditorHasCursorAfterLoadIfNeeded() } + // - Default: caret at 0 for "read from top". + // - If user touched during loading: keep current caret (do not force to 0). + // + // zh-CN: + // 加载结束后确保光标/焦点. + // - 默认: 光标置于 0, 方便从头阅读. + // - 若用户在加载期间触摸过: 保持当前光标, 不强制跳回 0. + post { + if (!mUserMovedCursorDuringLoading) { + runCatching { editText.setSelection(0) } + } + ensureEditorHasCursorAfterLoadIfNeeded() + } mLargeFileFrameCallback = null return @@ -996,6 +1051,12 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag editor.markUndoRedoBaselineAsUnchanged() editor.setRedoUndoEnabled(!mLargeFileMode) + // Reset sticky dirty because we just established a new baseline. + // zh-CN: 因刚刚建立了新的基线, 重置 sticky 脏标记. + saveStickyDirty = false + mHadDirectEditSinceSave = false + syncPrimaryMenuState() + // Refresh highlight for restored text if size allows. // zh-CN: 若大小允许, 则对恢复文本刷新一次高亮. post { editor.refreshHighlightTokensIfAllowed() } @@ -1016,11 +1077,19 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag try { editText.setText(text) editor.markUndoRedoBaselineAsUnchanged() + + // Reset sticky dirty because we just established a new baseline. + // zh-CN: 因刚刚建立了新的基线, 重置 sticky 脏标记. + saveStickyDirty = false + mHadDirectEditSinceSave = false } finally { editor.setRedoUndoEnabled(true) editText.setLoadingText(false) } + mEditorLoading = false + syncPrimaryMenuState() + // Ensure caret/focus after fast load. // zh-CN: 快速加载完成后确保光标/焦点. post { ensureEditorHasCursorAfterLoadIfNeeded() } @@ -1048,7 +1117,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag setMenuItemStatus(R.id.run, true) setMenuItemStatus(R.id.undo, false) setMenuItemStatus(R.id.redo, false) - setMenuItemStatus(R.id.save, editor.isTextChanged) + setMenuItemStatus(R.id.save, saveStickyDirty) } else -> { // Normal mode. @@ -1056,7 +1125,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag setMenuItemStatus(R.id.run, true) setMenuItemStatus(R.id.undo, editor.canUndo()) setMenuItemStatus(R.id.redo, editor.canRedo()) - setMenuItemStatus(R.id.save, editor.isTextChanged) + setMenuItemStatus(R.id.save, saveStickyDirty) } } } @@ -1224,12 +1293,40 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag private fun setUpEditor() { editor.let { editor -> editor.codeEditText.let { editText -> + // Observe user touch in text area to preserve caret position after large-file load. + // zh-CN: 监听用户在文本区域的触摸, 以便大文件加载完成后保留光标位置. + editText.onUserTouchInTextArea = { + if (mEditorLoading && mLargeFileMode) { + mUserMovedCursorDuringLoading = true + } + } + editText.addTextChangedListener(SimpleTextWatcher { _ -> // Skip menu state updates during progressive loading. // zh-CN: 渐进式加载期间跳过菜单状态更新. if (editText.isLoadingText() || mEditorLoading) { return@SimpleTextWatcher } + + // If this change is not caused by undo/redo buttons, treat it as a direct edit. + // Direct edits keep Save sticky until next successful save. + // + // zh-CN: + // 若本次变化并非由撤销/重做按钮触发, 则视为直接编辑. + // 直接编辑会使保存按钮保持 sticky, 直到下一次保存成功. + if (!mUndoRedoButtonInProgress) { + mHadDirectEditSinceSave = true + saveStickyDirty = true + } else { + // Undo/redo navigation: + // Save should reflect (baseline changed) OR (there has been any direct edit since save). + // + // zh-CN: + // undo/redo 历史导航: + // 保存按钮应反映 (相对基线有变化) 或 (自保存以来发生过直接编辑). + saveStickyDirty = editor.isTextChanged || mHadDirectEditSinceSave + } + syncPrimaryMenuState() }) @@ -1268,6 +1365,8 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag // zh-CN: 初始化为 "新建文件" 预期状态: 仅运行可用. mEditorLoading = false mLargeFileMode = false + saveStickyDirty = false + mHadDirectEditSinceSave = false setMenuItemStatus(R.id.run, true) setMenuItemStatus(R.id.undo, false) setMenuItemStatus(R.id.redo, false) @@ -1287,7 +1386,9 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag val imeBarBackgroundColor = it.imeBarBackgroundColor editor.setTheme(it) + mInputMethodEnhanceBar.setBackgroundColor(imeBarBackgroundColor) + mLoadingBarContainer.setBackgroundColor(imeBarBackgroundColor) run { val adjustedImageContrastColor = ColorUtils.adjustColorForContrast(imeBarBackgroundColor, appThemeColor, 3.6) @@ -1390,9 +1491,43 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag return run(true, file, uri?.path) } - private fun undo() = editor.undo() + private fun undo() { + // Mark undo/redo button action so TextWatcher can distinguish it. + // zh-CN: 标记撤销/重做按钮动作, 以便 TextWatcher 区分来源. + mUndoRedoButtonInProgress = true + try { + editor.undo() + } finally { + mUndoRedoButtonInProgress = false + } - private fun redo() = editor.redo() + // Recompute Save state after history navigation. + // zh-CN: 历史导航后重新计算保存按钮状态. + saveStickyDirty = editor.isTextChanged || mHadDirectEditSinceSave + syncPrimaryMenuState() + } + + private fun redo() { + // Mark undo/redo button action so TextWatcher can distinguish it. + // zh-CN: 标记撤销/重做按钮动作, 以便 TextWatcher 区分来源. + mUndoRedoButtonInProgress = true + try { + editor.redo() + } finally { + mUndoRedoButtonInProgress = false + } + + // Recompute Save state after history navigation. + // This makes "edit -> save -> undo -> redo" turn Save off again, + // because we are back to baseline and there was no direct edit since save. + // + // zh-CN: + // 历史导航后重新计算保存按钮状态. + // 这会使 "编辑 -> 保存 -> 撤销 -> 重做" 再次熄灭保存按钮, + // 因为已回到基线, 且保存后没有发生直接编辑. + saveStickyDirty = editor.isTextChanged || mHadDirectEditSinceSave + syncPrimaryMenuState() + } fun save(): Observable = Observable @@ -1414,6 +1549,12 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag .observeOn(AndroidSchedulers.mainThread()) .doOnNext { editor.markTextAsSaved() + + // Reset sticky dirty only on successful save. + // zh-CN: 仅在保存成功后重置 sticky 脏标记. + saveStickyDirty = false + mHadDirectEditSinceSave = false + setMenuItemStatus(R.id.save, false) } @@ -1695,9 +1836,13 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag uri = uri, onRestoreToEditor = { restoredText -> editor.text = restoredText + + // Restoring changes content => mark sticky dirty. + // zh-CN: 恢复版本会改变内容, 因此置 sticky 脏标记. + saveStickyDirty = true }, onRestoredUi = { - setMenuItemStatus(R.id.save, true) + syncPrimaryMenuState() showSnack(this@EditorView, R.string.text_done) }, ) diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.kt b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.kt index f5d8e5e5..086a7c7f 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditText.kt @@ -83,6 +83,15 @@ class CodeEditText : AppCompatEditText { private var mDebuggingLine = -1 private var mCursorChangeCallbacks: CopyOnWriteArrayList? = null + // Callback when user touches the editor text area (not gutter). + // This is used by large-file loader to avoid forcing caret to 0 after user interaction. + // + // zh-CN: + // 当用户触摸编辑器文本区域 (非行号区域) 时的回调. + // 用于大文件加载逻辑: 若用户已交互, 则避免加载完成后强制将光标跳到 0. + @Volatile + var onUserTouchInTextArea: (() -> Unit)? = null + // Read-only state. // zh-CN: 只读状态. private var mReadOnly = false @@ -649,6 +658,12 @@ class CodeEditText : AppCompatEditText { @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { + // Notify outer layer early when user touches inside text area (not gutter). + // zh-CN: 当用户触摸文本区域 (非行号区域) 时尽早通知外层. + if (event.action == MotionEvent.ACTION_DOWN && event.x >= paddingLeft) { + onUserTouchInTextArea?.invoke() + } + // 如果行号区域被按下 if (event.action == MotionEvent.ACTION_DOWN && event.x < paddingLeft) { // 则计算当前行, 如果行号有效, 记录起来 diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/TextViewUndoRedo.java b/app/src/main/java/org/autojs/autojs/ui/edit/editor/TextViewUndoRedo.java index 9f78ae95..ccfb77bd 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/TextViewUndoRedo.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/TextViewUndoRedo.java @@ -4,7 +4,6 @@ package org.autojs.autojs.ui.edit.editor; * THIS CLASS IS PROVIDED TO THE PUBLIC DOMAIN FOR FREE WITHOUT ANY * RESTRICTIONS OR ANY WARRANTY. */ -import java.util.LinkedList; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; @@ -15,10 +14,12 @@ import android.text.TextWatcher; import android.text.style.UnderlineSpan; import android.widget.TextView; +import java.util.LinkedList; + /** * A generic undo/redo implementation for TextViews. - * - * Modified by JetBrains AI Assistant (GPT-5.2) as of Feb 8, 2026. + *

+ * Modified by JetBrains AI Assistant (GPT-5.2) as of Feb 12, 2026. */ public class TextViewUndoRedo { @@ -48,6 +49,10 @@ public class TextViewUndoRedo { private int mInitialHistoryStackSize; + // Baseline position for "unchanged" state. + // zh-CN: "未修改" 状态的基线位置. + private int mInitialHistoryPosition; + private final Handler mHandler = new Handler(); private int mTextChangeId = 0; private final boolean mTextChanging = false; @@ -76,14 +81,14 @@ public class TextViewUndoRedo { /** * Reset undo/redo history without modifying the current text. - * + *

* This is useful after bulk loading text progressively, where the text is already in the TextView * and we only want to treat it as the "baseline" (unchanged) state. - * + *

* zh-CN: - * + *

* 在不修改当前文本的前提下重置 undo/redo 历史. - * + *

* 适用于渐进式批量加载文本后: 文本已经在 TextView 中, 此时只需要把它视为 "基线" (未修改) 状态. */ public final void resetHistoryAsUnchanged() { @@ -110,12 +115,21 @@ public class TextViewUndoRedo { mIsUndoOrRedo = false; } - public boolean isTextChanged(){ - return mInitialHistoryStackSize != mEditHistory.size(); + public boolean isTextChanged() { + // IMPORTANT: + // Use history position rather than history size. + // Undo/redo changes mmPosition while keeping history size the same. + // + // zh-CN: + // 重要: + // 使用 history position 而不是 history size. + // undo/redo 会改变 mmPosition, 但 history size 往往不变. + return mInitialHistoryPosition != mEditHistory.mmPosition; } public void markTextAsUnchanged() { mInitialHistoryStackSize = mEditHistory.size(); + mInitialHistoryPosition = mEditHistory.mmPosition; } // =================================================================== // @@ -141,6 +155,7 @@ public class TextViewUndoRedo { public void clearHistory() { mEditHistory.clear(); mInitialHistoryStackSize = 0; + mInitialHistoryPosition = 0; } /** @@ -339,7 +354,7 @@ public class TextViewUndoRedo { } } - public int size(){ + public int size() { return mmHistory.size(); } @@ -446,7 +461,7 @@ public class TextViewUndoRedo { mTextChangeId++; mEditHistory.add(new EditItem(start, mBeforeChange, mAfterChange)); int textChangeId = mTextChangeId; - //TODO 增加连续输入文字当成一次撤销的功能 + // TODO 增加连续输入文字当成一次撤销的功能 } public void afterTextChanged(Editable s) { @@ -456,6 +471,15 @@ public class TextViewUndoRedo { if (mEditHistory.size() < mInitialHistoryStackSize) { mInitialHistoryStackSize = 0; } + + // Keep baseline position within valid range after trims. + // zh-CN: 在 trim 等场景后, 保持基线 position 落在合法范围内. + if (mInitialHistoryPosition > mEditHistory.mmHistory.size()) { + mInitialHistoryPosition = mEditHistory.mmHistory.size(); + } + if (mInitialHistoryPosition < 0) { + mInitialHistoryPosition = 0; + } } } } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8227cabe..da8856da 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1331,4 +1331,6 @@ النوافذ المنبثقة في الخلفية لم يتم حفظ الاعدادات. هل تريد المتابعة? لم يتم حفظ الاعدادات. هل تريد الخروج? + فشل الحفظ + جارٍ الحفظ... \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 0e99174e..421b4afa 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1326,4 +1326,6 @@ Display pop-up windows while running in the background The settings has not been saved, are you sure to continue the operation? The settings has not been saved, are you sure to exit? + Failed to save + Saving... \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d36c2fae..3f594c0d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1329,4 +1329,6 @@ Ventanas emergentes en segundo plano La configuracion no se ha guardado. ¿Seguro que quieres continuar? La configuracion no se ha guardado. ¿Seguro que quieres salir? + Error al guardar + Guardando... \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index dba43503..7521e825 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1329,4 +1329,6 @@ Fenêtres contextuelles en arrière-plan Les parametres ne sont pas enregistres. Continuer? Les parametres ne sont pas enregistres. Quitter? + Echec de l\'enregistrement + Enregistrement... \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 4499c7f6..240de399 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1330,4 +1330,6 @@ バックグラウンドでのポップアップ表示 設定が保存されていません. 続行しますか? 設定が保存されていません. 終了しますか? + 保存に失敗しました + 保存中... \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 64242560..c7892265 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1331,4 +1331,6 @@ 백그라운드 팝업 설정이 저장되지 않았습니다. 계속할까요? 설정이 저장되지 않았습니다. 종료할까요? + 저장에 실패했습니다 + 저장 중... \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dfcfc728..cc417a9a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1329,4 +1329,6 @@ Всплывающие окна в фоне Настройки не сохранены. Продолжить? Настройки не сохранены. Выйти? + Не удалось сохранить + Сохранение... \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c5c15ab7..44246469 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1325,4 +1325,6 @@ 後台彈出界面 設置尚未保存, 確定要繼續操作嗎 設置尚未保存, 確定要退出嗎 + 保存失敗 + 正在保存... \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 77dc24d7..fbd5aab5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1325,4 +1325,6 @@ 後臺彈出介面 設定尚未儲存, 確定要繼續操作嗎 設定尚未儲存, 確定要退出嗎 + 儲存失敗 + 正在儲存... \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index fb7561c8..71868fb9 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1326,4 +1326,6 @@ 后台弹出界面 设置尚未保存, 确定要继续操作吗 设置尚未保存, 确定要退出吗 + 保存失败 + 正在保存... \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8cd8ea16..e94ae4b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1600,4 +1600,6 @@ Display pop-up windows while running in the background The settings has not been saved, are you sure to continue the operation? The settings has not been saved, are you sure to exit? + Failed to save + Saving... \ No newline at end of file diff --git a/version.properties b/version.properties index 0bd164a9..2be29b15 100644 --- a/version.properties +++ b/version.properties @@ -1,5 +1,5 @@ -#Thu Feb 12 17:13:51 CST 2026 -BUILD_TIME=1770887631678 +#Thu Feb 12 19:57:00 CST 2026 +BUILD_TIME=1770897420318 COMPILE_SDK_VERSION=36 IMAGE_QUANT_CMAKE_VERSION=3.22.1 IMAGE_QUANT_NDK_VERSION=26.1.10909125 @@ -27,6 +27,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 TARGET_SDK_VERSION=36 TARGET_SDK_VERSION_INRT=29 -VERSION_BUILD=3734 +VERSION_BUILD=3735 VERSION_NAME=6.7.0 Alpha19 VSCODE_EXT_REQUIRED_VERSION=1.0.13