6.6.3 - Alpha - 版本历史功能采用本地缓存优先, 联网补充更新的策略, 且支持类型筛选及流程日志显示

This commit is contained in:
SuperMonster003
2025-05-03 18:26:06 +08:00
parent 858cac5632
commit 5c3b80f96b
39 changed files with 1008 additions and 183 deletions

View File

@@ -1,6 +1,7 @@
package org.autojs.autojs.theme;
import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
@@ -13,6 +14,7 @@ import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.CheckBox;
import android.widget.Switch;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.graphics.drawable.DrawableCompat;
@@ -71,6 +73,16 @@ public class ThemeColorHelper {
setTrackDrawableTintList(switchCompat.getTrackDrawable(), adjustedTrackColor, true);
}
public static void setColorPrimary(CheckBox checkBox, int color, boolean contrastMatters) {
int checkedColor = contrastMatters
? ColorUtils.adjustColorForContrast(checkBox.getContext().getColor(R.color.window_background), color, 3.6)
: color;
int uncheckedColor = contrastMatters
? ColorUtils.adjustColorForContrast(checkBox.getContext().getColor(R.color.window_background), color, 2.3)
: color;
DrawableCompat.setTintList(DrawableCompat.wrap(checkBox.getButtonDrawable()), new ColorStateList(SWITCH_STATES, new int[]{checkedColor, uncheckedColor}));
}
public static void setColorPrimary(Switch sw, int color) {
setColorPrimary(sw, color, false);
}
@@ -96,7 +108,6 @@ public class ThemeColorHelper {
unselectedColor,
};
DrawableCompat.setTintList(DrawableCompat.wrap(drawable), new ColorStateList(SWITCH_STATES, thumbColors));
}
private static void setTrackDrawableTintList(Drawable drawable, int color, boolean isCompat) {
@@ -111,6 +122,17 @@ public class ThemeColorHelper {
private static int makeAlpha(int alpha, int color) {
return (color & 0xffffff) | (alpha << 24);
}
public static ColorStateList getThemeColorStateList(Context context) {
return getColorPrimaryStateList(context, ThemeColorManager.getColorPrimary());
}
public static ColorStateList getColorPrimaryStateList(Context context, int color) {
int background = context.getColor(R.color.window_background);
int checkedColor = ColorUtils.adjustColorForContrast(background, color, 3.6);
int uncheckedColor = ColorUtils.adjustColorForContrast(background, color, 2.3);
return new ColorStateList(SWITCH_STATES, new int[]{checkedColor, uncheckedColor});
}
public static void setStatusBarColor(Activity activity, int color) {
Window window = activity.getWindow();

View File

@@ -31,7 +31,7 @@ class ColorLibraryViewHolder(itemViewBinding: MtColorLibrariesRecyclerViewItemBi
}
else -> {
val size = library.colors.size
resources.getQuantityString(R.plurals.text_items_total_sum, size, size)
resources.getQuantityString(R.plurals.text_items_total_sum_with_colon, size, size)
}
}

View File

@@ -22,6 +22,7 @@ import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivityAboutBinding
import org.autojs.autojs6.databinding.ActivityAboutFunctionButtonsBinding
import androidx.core.net.toUri
/**
* Created by Stardust on Feb 2, 2017.
@@ -176,13 +177,13 @@ open class AboutActivity : BaseActivity() {
.positiveText(R.string.dialog_button_continue)
.onNegative { d, _ -> d.dismiss() }
.onPositive { _, _ -> launchGithubIssuesPage() }
.cancelable(false)
.positiveColorRes(R.color.dialog_button_attraction)
.show() ?: launchGithubIssuesPage()
}
private fun launchGithubIssuesPage() {
Intent(Intent.ACTION_VIEW)
.setData(Uri.parse(getString(R.string.url_github_autojs6_issues)))
.setData(getString(R.string.url_github_autojs6_issues).toUri())
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.let { startActivity(it) }
}

View File

@@ -1,24 +1,40 @@
@file:Suppress("EnumValuesSoftDeprecate")
package org.autojs.autojs.ui.settings
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.util.Linkify
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.ScrollView
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.MaterialDialog
import io.noties.markwon.Markwon
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.autojs.autojs.core.pref.Language
import org.autojs.autojs.core.pref.Language.Companion.getPrefLanguageOrNull
import org.autojs.autojs.theme.ThemeColorHelper
import org.autojs.autojs.theme.widget.ThemeColorToolbar
import org.autojs.autojs.ui.BaseActivity
import org.autojs.autojs.ui.settings.VersionHistoryRepository.Companion.Category
import org.autojs.autojs.ui.settings.VersionHistoryRepository.Companion.DEFAULT_FILTER
import org.autojs.autojs.ui.settings.VersionHistoryRepository.Companion.DEFAULT_VERSION_NAME
import org.autojs.autojs.util.ProcessLogger
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance
import org.autojs.autojs.util.ViewUtils.setNavigationIconColorByThemeColorLuminance
@@ -34,6 +50,9 @@ class DisplayVersionHistoriesActivity : BaseActivity() {
private lateinit var mAdapter: VersionHistoryAdapter
private lateinit var mToolbar: ThemeColorToolbar
private var mAllDataHandled = false
private val mSelectedCategories = MutableStateFlow<Set<Category>>(DEFAULT_FILTER)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -63,14 +82,48 @@ class DisplayVersionHistoriesActivity : BaseActivity() {
val urlSuffix = "app/src/main/assets-app/doc/CHANGELOG-$languageTag.md"
val urlRaw = "https://raw.githubusercontent.com/SuperMonster003/AutoJs6/master/$urlSuffix"
val urlBlob = "https://github.com/SuperMonster003/AutoJs6/blob/master/$urlSuffix"
val localItems = withContext(Dispatchers.IO) {
VersionHistoryRepository.readBestLocalSample(
context = this@DisplayVersionHistoriesActivity,
languageTag = languageTag,
)
}
if (localItems.isNotEmpty()) {
ProcessLogger.i("${getString(R.string.logger_ver_history_load_local_data)} (${resources.getQuantityString(R.plurals.text_items_total_sum, localItems.size, localItems.size).lowercase(Language.getPrefLanguage().locale)})")
hideLoadingTextContainerIfNeeded()
mAdapter.submit(localItems.toMutableList())
} else {
ProcessLogger.i(getString(R.string.logger_ver_history_local_data_empty))
}
val localItemLatestVersion = localItems.firstOrNull()?.version ?: DEFAULT_VERSION_NAME
var onlineItemLatestVersion: String? = null
var shouldContinueCollect = true
repo.loadVersionHistoriesFlow(
activity = this@DisplayVersionHistoriesActivity,
context = this@DisplayVersionHistoriesActivity,
languageTag = languageTag,
urlRaw = urlRaw,
urlBlob = urlBlob
).collectLatest { item ->
mAdapter.add(item)
).collectLatest { onlineItem ->
hideLoadingTextContainerIfNeeded()
if (!shouldContinueCollect) {
return@collectLatest
}
if (onlineItemLatestVersion == null) {
onlineItemLatestVersion = onlineItem.version
if (VersionHistoryRepository.compareVersion(localItemLatestVersion, onlineItemLatestVersion) > 0) {
shouldContinueCollect = false
ProcessLogger.i(getString(R.string.logger_ver_history_local_data_newer_stop_online))
return@collectLatest
}
}
mAdapter.addOrUpdate(onlineItem)
}
ProcessLogger.i(getString(R.string.logger_ver_history_data_loaded))
mAllDataHandled = true
}
setToolbarAsBack(R.string.text_version_histories)
@@ -83,6 +136,11 @@ class DisplayVersionHistoriesActivity : BaseActivity() {
}
}
override fun onDestroy() {
super.onDestroy()
ProcessLogger.clear()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_display_version_histories, menu)
setUpToolbarColors()
@@ -93,10 +151,95 @@ class DisplayVersionHistoriesActivity : BaseActivity() {
when (item.itemId) {
R.id.action_expand_all -> mAdapter.expandAll()
R.id.action_collapse_all -> mAdapter.collapseAll()
R.id.action_filter_category -> showCategoryFilterDialog()
R.id.action_show_logs -> showProcessLogs()
}
return super.onOptionsItemSelected(item)
}
private fun showCategoryFilterDialog() {
if (!mAllDataHandled) {
val dialog = MaterialDialog.Builder(this)
.title(R.string.text_please_wait)
.content(R.string.text_waiting_for_all_data_processing_to_complete)
.positiveText(R.string.dialog_button_cancel)
.positiveColorRes(R.color.dialog_button_default)
.show()
lifecycleScope.launch {
while (!mAllDataHandled && dialog.isShowing) {
delay(100)
}
dialog.dismiss()
if (mAllDataHandled && !isFinishing) {
showCategoryFilterDialog()
}
}
return
}
val categories = Category.values()
val totalItems = categories.map { getString(it.labelRes) }
val checkedItemsIndices = categories.indices.filter { categories[it] in mSelectedCategories.value }.toTypedArray()
MaterialDialog.Builder(this)
.title(R.string.text_category_filter)
.positiveText(R.string.dialog_button_confirm)
.positiveColorRes(R.color.dialog_button_attraction)
.onPositive { dialog, _ -> dialog.dismiss() }
.negativeText(R.string.dialog_button_cancel)
.neutralColorRes(R.color.dialog_button_default)
.onNegative { dialog, _ -> dialog.dismiss() }
.neutralText(R.string.dialog_button_use_default)
.neutralColorRes(R.color.dialog_button_hint)
.choiceWidgetColor(ThemeColorHelper.getThemeColorStateList(this))
.onNeutral { dialog, _ ->
dialog.setSelectedIndices(categories.indices.filter { categories[it] in DEFAULT_FILTER }.toTypedArray())
}
.autoDismiss(false)
.items(totalItems)
.itemsCallbackMultiChoice(checkedItemsIndices) { dialog, which, text ->
lifecycleScope.launch {
mSelectedCategories.value = which.map { categories[it] }.toSet()
repeatOnLifecycle(Lifecycle.State.STARTED) {
mSelectedCategories.collect { newFilter ->
mAdapter.updateFilter(newFilter)
}
}
}
true
}
.show()
}
private fun showProcessLogs() {
val dialog = MaterialDialog.Builder(this)
.title(R.string.text_process_log)
.content(ProcessLogger.dump())
.positiveText(R.string.dialog_button_dismiss)
.show()
val tv = dialog.contentView?.apply {
autoLinkMask = Linkify.WEB_URLS
text = text
} ?: return
val job = lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
ProcessLogger.flow.collect { newLine ->
if (!dialog.isShowing) {
this@repeatOnLifecycle.cancel()
return@collect
}
tv.append(newLine)
(tv.parent as? ScrollView)?.post {
(tv.parent as ScrollView).fullScroll(View.FOCUS_DOWN)
}
}
}
}
dialog.setOnDismissListener { job.cancel() }
}
private fun setUpToolbarColors() {
mToolbar.setMenuIconsColorByThemeColorLuminance(this)
mToolbar.setNavigationIconColorByThemeColorLuminance(this)

View File

@@ -26,7 +26,7 @@ class ManageIgnoredUpdatesPreference : MaterialPreference, SharedPreferences.OnS
Pref.registerOnSharedPreferenceChangeListener(this)
summaryProvider = SummaryProvider<ManageIgnoredUpdatesPreference> {
Pref.getLinkedHashSet(R.string.key_ignored_updates).let {
prefContext.resources.getQuantityString(R.plurals.text_items_total_sum, it.size, it.size)
prefContext.resources.getQuantityString(R.plurals.text_items_total_sum_with_colon, it.size, it.size)
}
}
}

View File

@@ -2,75 +2,138 @@ package org.autojs.autojs.ui.settings
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import io.noties.markwon.Markwon
import org.autojs.autojs.ui.settings.VersionHistoryAdapter.VersionHistoryViewHolder
import org.autojs.autojs.ui.settings.VersionHistoryRepository.Companion.Category
import org.autojs.autojs.ui.settings.VersionHistoryRepository.Companion.DEFAULT_FILTER
import org.autojs.autojs.ui.settings.VersionHistoryRepository.Companion.compareVersion
import org.autojs.autojs.util.ProcessLogger
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ItemVersionHistoryBinding
@SuppressLint("NotifyDataSetChanged")
class VersionHistoryAdapter(private val context: Context, private val markwon: Markwon) : RecyclerView.Adapter<VersionHistoryViewHolder>() {
private val data = mutableListOf<VersionHistoryItem>()
private val mData = mutableListOf<VersionHistoryItem>()
private var mLayoutManager: RecyclerView.LayoutManager? = null
private val mCategoryFilter: MutableSet<Category> = DEFAULT_FILTER.clone()
@SuppressLint("NotifyDataSetChanged")
fun submit(list: List<VersionHistoryItem>) {
data.clear()
data += list
fun submit(list: MutableList<VersionHistoryItem>) {
mData.clear()
mData += list
notifyDataSetChanged()
}
fun add(item: VersionHistoryItem) {
data += item
notifyItemInserted(data.lastIndex)
mData += item
notifyItemInserted(mData.lastIndex)
}
fun addAll(list: List<VersionHistoryItem>) {
val start = data.size
data += list
val start = mData.size
mData += list
notifyItemRangeInserted(start, list.size)
}
fun updateFilter(filter: Set<Category>) {
mCategoryFilter.clear()
mCategoryFilter.addAll(filter)
notifyDataSetChanged()
}
fun addOrUpdate(item: VersionHistoryItem) {
when (val idx = mData.indexOfFirst { compareVersion(it.version, item.version) == 0 }) {
-1 -> {
ProcessLogger.i("${item.version}: ${context.getString(R.string.logger_ver_history_insert_new_entries)}")
val insertPos = mData.indexOfFirst { compareVersion(it.version, item.version) < 0 }
val realPos = if (insertPos == -1) mData.size else insertPos
mData.add(realPos, item)
notifyItemInserted(realPos)
mLayoutManager?.scrollToPosition(0)
}
else -> {
fun sameDate(local: VersionHistoryItem) = local.date == item.date
fun sameLines(local: VersionHistoryItem) = local.lines.joinToString(",") { it.trim() } == item.lines.joinToString(",") { it.trim() }
val local = mData[idx]
if (sameDate(local) && sameLines(local)) {
ProcessLogger.i("${item.version}: ${context.getString(R.string.logger_ver_history_no_processing_needed)}")
} else {
if (!sameDate(local)) {
ProcessLogger.i("${item.version}: ${context.getString(R.string.logger_ver_history_overwrite_date)}")
Log.d(TAG, "item date: ${item.date}")
Log.d(TAG, "local data: ${local.date}")
}
if (!sameLines(local)) {
ProcessLogger.i("${item.version}: ${context.getString(R.string.logger_ver_history_overwrite_update_record)}")
Log.d(TAG, "item lines: ${item.lines.joinToString(",")}")
Log.d(TAG, "local lines: ${local.lines.joinToString(",")}")
}
mData[idx] = item
notifyItemChanged(idx)
}
}
}
}
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
mLayoutManager = recyclerView.layoutManager
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VersionHistoryViewHolder {
val binding = ItemVersionHistoryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return VersionHistoryViewHolder(binding)
return VersionHistoryViewHolder(parent.context, binding)
}
override fun getItemCount() = data.size
override fun getItemCount() = mData.size
override fun onBindViewHolder(holder: VersionHistoryViewHolder, position: Int) {
holder.bind(context, data[position], animate = false)
holder.bind(mData[position], animate = false)
}
override fun onBindViewHolder(holder: VersionHistoryViewHolder, position: Int, payloads: MutableList<Any>) {
val animate = payloads.contains(PAYLOAD_EXPAND_STATE_CHANGED)
holder.bind(context, data[position], animate)
holder.bind(mData[position], animate)
}
fun expandAll() {
data.forEach { it.expanded = true }
mData.forEach { it.expanded = true }
notifyItemRangeChanged(0, itemCount, PAYLOAD_EXPAND_STATE_CHANGED)
}
fun collapseAll() {
data.forEach { it.expanded = false }
mData.forEach { it.expanded = false }
notifyItemRangeChanged(0, itemCount, PAYLOAD_EXPAND_STATE_CHANGED)
}
inner class VersionHistoryViewHolder(binding: ItemVersionHistoryBinding) : RecyclerView.ViewHolder(binding.root) {
inner class VersionHistoryViewHolder(context: Context, binding: ItemVersionHistoryBinding) : RecyclerView.ViewHolder(binding.root) {
private val chevron = binding.chevron
private val tvTitle = binding.tvTitle
private val tvDate = binding.tvDate
private val tvBody = binding.tvBody
private val tvLines = binding.tvLines
private val tvFeature = binding.tvFeatureCount
private val tvFix = binding.tvFixCount
private val tvImprovement = binding.tvImprovementCount
private val tvFeatureCount = binding.tvFeatureCount
private val tvFixCount = binding.tvFixCount
private val tvImprovementCount = binding.tvImprovementCount
fun bind(context: Context, item: VersionHistoryItem, animate: Boolean) {
private val tvFeatureCountContainer = binding.tvFeatureCountContainer
private val tvFixCountContainer = binding.tvFixCountContainer
private val tvImprovementCountContainer = binding.tvImprovementCountContainer
private val changelogLabelHint = "`${context.getString(R.string.changelog_label_hint)}`"
private val changelogLabelFeature = "`${context.getString(R.string.changelog_label_feature)}`"
private val changelogLabelFix = "`${context.getString(R.string.changelog_label_fix)}`"
private val changelogLabelImprovement = "`${context.getString(R.string.changelog_label_improvement)}`"
private val changelogLabelDependency = "`${context.getString(R.string.changelog_label_dependency)}`"
fun bind(item: VersionHistoryItem, animate: Boolean) {
val rotationAngle = if (item.expanded) 180f else 0f
chevron.animate().cancel()
when (animate) {
@@ -78,33 +141,64 @@ class VersionHistoryAdapter(private val context: Context, private val markwon: M
else -> chevron.rotation = rotationAngle
}
item.lines.count { it.contains("`${context.getString(R.string.changelog_label_feature)}`") }.let {
tvFeature.text = "$it"
}
item.lines.count { it.contains("`${context.getString(R.string.changelog_label_fix)}`") }.let {
tvFix.text = "$it"
}
item.lines.count { it.contains("`${context.getString(R.string.changelog_label_improvement)}`") }.let {
tvImprovement.text = "$it"
}
tvTitle.text = item.version
tvDate.text = item.date
tvBody.run {
markwon.setMarkdown(this, item.lines.joinToString("\n"))
tvLines.run {
markwon.setMarkdown(this, applyCategoryFilter(item.lines).joinToString("\n"))
visibility = if (item.expanded) View.VISIBLE else View.GONE
}
when {
mCategoryFilter.contains(Category.FEATURE) -> {
tvFeatureCount.text = item.lines.count { it.contains(changelogLabelFeature) }.toString()
tvFeatureCountContainer.visibility = View.VISIBLE
}
else -> {
tvFeatureCountContainer.visibility = View.GONE
}
}
when {
mCategoryFilter.contains(Category.FIX) -> {
tvFixCount.text = item.lines.count { it.contains(changelogLabelFix) }.toString()
tvFixCountContainer.visibility = View.VISIBLE
}
else -> {
tvFixCountContainer.visibility = View.GONE
}
}
when {
mCategoryFilter.contains(Category.IMPROVEMENT) -> {
tvImprovementCount.text = item.lines.count { it.contains(changelogLabelImprovement) }.toString()
tvImprovementCountContainer.visibility = View.VISIBLE
}
else -> {
tvImprovementCountContainer.visibility = View.GONE
}
}
itemView.setOnClickListener {
item.expanded = !item.expanded
notifyItemChanged(absoluteAdapterPosition, PAYLOAD_EXPAND_STATE_CHANGED)
}
}
private fun applyCategoryFilter(lines: List<String>) = lines.filter {
when {
it.contains(changelogLabelHint) && !mCategoryFilter.contains(Category.HINT) -> false
it.contains(changelogLabelFeature) && !mCategoryFilter.contains(Category.FEATURE) -> false
it.contains(changelogLabelFix) && !mCategoryFilter.contains(Category.FIX) -> false
it.contains(changelogLabelImprovement) && !mCategoryFilter.contains(Category.IMPROVEMENT) -> false
it.contains(changelogLabelDependency) && !mCategoryFilter.contains(Category.DEPENDENCY) -> false
else -> true
}
}
}
companion object {
private val TAG = VersionHistoryAdapter::class.java.simpleName
private const val PAYLOAD_EXPAND_STATE_CHANGED = 1
}

View File

@@ -7,7 +7,7 @@ import org.autojs.autojs.theme.preference.MaterialPreference
/**
* Created by SuperMonster003 on May 1, 2025.
*/
class VersionHistoriesPreference : MaterialPreference {
class VersionHistoryPreference : MaterialPreference {
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)

View File

@@ -1,67 +1,75 @@
package org.autojs.autojs.ui.settings
import android.widget.TextView
import com.afollestad.materialdialogs.MaterialDialog
import android.content.Context
import androidx.annotation.StringRes
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.channelFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.ResponseBody
import okio.BufferedSource
import org.autojs.autojs.util.ProcessLogger
import org.autojs.autojs.util.TextUtils
import org.autojs.autojs6.R
import org.jsoup.Jsoup
import java.io.File
import org.autojs.autojs6.R
import java.util.EnumSet
class VersionHistoryRepository {
private val mOkHttpClient by lazy { OkHttpClient() }
fun loadVersionHistoriesFlow(activity: DisplayVersionHistoriesActivity, urlRaw: String, urlBlob: String): Flow<VersionHistoryItem> = channelFlow {
var tRaw: Throwable? = null
var tBlob: Throwable? = null
val loadingTextView: TextView? = activity.findViewById(R.id.loading_text)
val loadingSecondTextView: TextView? = activity.findViewById(R.id.loading_second_text)
fun loadVersionHistoriesFlow(
context: Context,
languageTag: String,
urlRaw: String,
urlBlob: String,
): Flow<VersionHistoryItem> = channelFlow {
runCatching {
loadingTextView?.visibility = TextView.VISIBLE
return@channelFlow fetchStreamFlow(urlRaw).collect { send(it) }
ProcessLogger.i(context.getString(R.string.logger_ver_history_start_raw_thread))
ProcessLogger.i("URL: $urlRaw")
val markdown = fetchStreamString(urlRaw)
ProcessLogger.i(context.getString(R.string.logger_ver_history_raw_thread_success))
writeCacheMarkdown(context, languageTag, markdown)
return@channelFlow parseMarkdownFlow(markdown).collect { send(it) }
}.onFailure { eRaw ->
tRaw = eRaw.apply { printStackTrace() }
}
runCatching {
loadingSecondTextView?.visibility = TextView.VISIBLE
return@channelFlow fetchStreamString(urlBlob).let { html ->
parseHtmlFlow(html).collect { send(it) }
eRaw.apply {
printStackTrace()
ProcessLogger.i("${context.getString(R.string.logger_ver_history_raw_thread_failure)}: $message")
}
}.onFailure { eBlob ->
tBlob = eBlob.apply { printStackTrace() }
}
runCatching {
ProcessLogger.i(context.getString(R.string.logger_ver_history_start_blob_thread))
loadingTextView?.visibility = TextView.GONE
loadingSecondTextView?.visibility = TextView.GONE
var niceUrlBlob = urlBlob
val hasQuery = urlBlob.contains('?')
val queryPrefix = if (hasQuery) "&" else "?"
showErrorDialog(activity, tRaw, tBlob)
}
private fun parseHtmlFlow(html: String) = channelFlow {
val doc = Jsoup.parse(html)
doc.select("div.markdown-heading:has(> h1.heading-element:first-child)").forEach { h1Container ->
val h1 = h1Container.selectFirst("> h1.heading-element:first-child") ?: return@forEach
val version = h1.text()
val date = h1Container.nextElementSibling()?.selectFirst("> h6.heading-element:first-child")?.text() ?: ""
val ul = h1Container.nextElementSibling()?.nextElementSibling()
if (ul != null && ul.tagName() == "ul") {
val lines = ul.select("> li").map { li ->
TextUtils.htmlToMarkdown(li.outerHtml()).trim()
if (!urlBlob.contains("plain=")) {
niceUrlBlob += "${queryPrefix}plain=1"
if (!urlBlob.contains("raw=")) {
niceUrlBlob += "&raw=true"
}
send(VersionHistoryItem(version, date, lines))
} else if (!urlBlob.contains("raw=")) {
niceUrlBlob += "${queryPrefix}raw=true"
}
ProcessLogger.i("URL: $niceUrlBlob")
// val html = fetchStreamString(niceUrlBlob)
// return@channelFlow parseHtmlFlow(html).collect { send(it) }
val markdown = fetchStreamString(niceUrlBlob)
ProcessLogger.i(context.getString(R.string.logger_ver_history_blob_thread_success))
writeCacheMarkdown(context, languageTag, markdown)
return@channelFlow parseMarkdownFlow(markdown).collect { send(it) }
}.onFailure { eBlob ->
eBlob.apply {
printStackTrace()
ProcessLogger.i("${context.getString(R.string.logger_ver_history_blob_thread_failure)}: $message")
}
}
}
@@ -74,69 +82,148 @@ class VersionHistoryRepository {
}
}
private fun fetchStreamFlow(url: String): Flow<VersionHistoryItem> = channelFlow {
launch(Dispatchers.IO) {
mOkHttpClient.newCall(Request.Builder().url(url).build()).execute().use { response ->
val src: BufferedSource = ensureSuccessfulResponse(response, url).source()
val regexVersion = Regex("""^#\s+v[\d.]+\S*""")
companion object {
var curTitle = ""
var curDate = ""
val bodyLines = mutableListOf<String>()
const val DEFAULT_VERSION_NAME = "0.0.0"
fun flush() {
if (curTitle.isBlank()) return
private val regexValidMarkdownVersion = Regex("""^#\s+v[\d.]+\S*""")
enum class Category(@StringRes val labelRes: Int) {
HINT(R.string.changelog_label_hint),
FEATURE(R.string.changelog_label_feature),
FIX(R.string.changelog_label_fix),
IMPROVEMENT(R.string.changelog_label_improvement),
DEPENDENCY(R.string.changelog_label_dependency);
}
/* 默认显示: 除 HINT 及 DEPENDENCY 以外的全部类别. */
val DEFAULT_FILTER: EnumSet<Category> =
EnumSet.complementOf(EnumSet.of(Category.HINT, Category.DEPENDENCY))
private fun String.toChangelogMarkdownFile(): String {
return "CHANGELOG-$this.md"
}
private fun String.toChangelogMarkdownCacheFile(): String {
return "CHANGELOG-$this.cache.md"
}
suspend fun readBestLocalSample(context: Context, languageTag: String): List<VersionHistoryItem> {
val assetStr = runCatching {
context.assets.open("doc/${languageTag.toChangelogMarkdownFile()}").bufferedReader().use { it.readText() }
}.getOrNull()
val cacheStr = runCatching {
File(context.filesDir, languageTag.toChangelogMarkdownCacheFile()).readText()
}.getOrNull()
assetStr ?: cacheStr ?: return emptyList()
fun String?.parseFirstVersion() = this
?.lineSequence()
?.firstOrNull { regexValidMarkdownVersion.matches(it.trim()) }
?.removePrefix("#")?.trim()
?.removePrefix("v")?.trim()
?: DEFAULT_VERSION_NAME
val assetLatestVer = assetStr.parseFirstVersion()
val cacheLatestVer = cacheStr.parseFirstVersion()
val useCache = compareVersion(cacheLatestVer, assetLatestVer) >= 0
val chosenMarkdown = if (useCache && !cacheStr.isNullOrBlank()) cacheStr else assetStr
ProcessLogger.i("${context.getString(R.string.logger_ver_history_local_asset_latest)}: $assetLatestVer")
ProcessLogger.i("${context.getString(R.string.logger_ver_history_offline_cache_latest)}: $cacheLatestVer")
ProcessLogger.i(
context.getString(R.string.logger_ver_history_initial_content_chosen) + ": ${
when (useCache) {
true -> context.getString(R.string.logger_ver_history_offline_cache_file)
else -> context.getString(R.string.logger_ver_history_local_asset_file)
}
}"
)
return parseMarkdownFlow(chosenMarkdown ?: "").toList()
}
private fun ensureSuccessfulResponse(response: Response, url: String): ResponseBody {
require(response.isSuccessful && response.body != null) {
buildString {
append("URL: $url\nCode: ${response.code}")
val content = response.body?.string()
if (!content.isNullOrBlank() && content.length <= 200) {
append("\nBody: $content")
}
}
}
return response.body!!
}
private fun writeCacheMarkdown(context: Context, languageTag: String, markdown: String) {
File(context.filesDir, languageTag.toChangelogMarkdownCacheFile()).writeText(markdown)
}
private fun parseMarkdownFlow(md: String): Flow<VersionHistoryItem> = channelFlow {
var curTitle = ""
var curDate = ""
val bodyLines = mutableListOf<String>()
fun flush(isClose: Boolean = false) {
if (curTitle.isNotBlank()) {
trySend(VersionHistoryItem(curTitle, curDate, bodyLines.toList()))
bodyLines.clear()
}
if (isClose) close()
}
@Suppress("AssignedValueIsNeverRead")
while (true) {
val line = src.readUtf8Line() ?: break
when {
regexVersion.matches(line.trim()) -> {
flush()
curTitle = line.trim().removePrefix("#").trim()
}
line.trim().startsWith("######") -> {
curDate = line.trim().removePrefix("######").trim()
}
line.trim().startsWith("*") && !line.trim().matches(Regex("\\*+")) -> {
bodyLines += line.trim()
}
@Suppress("AssignedValueIsNeverRead")
md.lineSequence().forEach { line ->
when {
regexValidMarkdownVersion.matches(line.trim()) -> {
flush()
curTitle = line.trim().removePrefix("#").trim()
}
line.trim().startsWith("######") -> {
curDate = line.trim().removePrefix("######").trim()
}
line.trim().startsWith("*") && !line.trim().matches(Regex("\\*+")) -> {
bodyLines += line.trim()
}
}
flush()
}
close()
flush(true)
}
}
private fun ensureSuccessfulResponse(response: Response, url: String): ResponseBody {
require(response.isSuccessful && response.body != null) {
buildString {
append("URL: $url\nCode: ${response.code}")
val content = response.body?.string()
if (!content.isNullOrBlank() && content.length <= 200) {
append("\nBody: $content")
private fun parseHtmlFlow(html: String) = channelFlow {
val doc = Jsoup.parse(html)
doc.select("div.markdown-heading").filter { it.children().first()?.tagName() == "h1" }.forEach { h1Container ->
val h1 = h1Container.getElementsByTag("h1").first() ?: return@forEach
val version = h1.text()
val nextSibling = h1Container.nextElementSibling()
val date = nextSibling?.getElementsByTag("h6")?.first()?.text() ?: ""
val ul = nextSibling?.nextElementSibling()
if (ul?.tagName() == "ul") {
val lines = ul.getElementsByTag("li").map { li ->
TextUtils.htmlToMarkdown(li.outerHtml()).trim()
}
send(VersionHistoryItem(version, date, lines))
}
}
}
return response.body!!
}
private fun showErrorDialog(activity: DisplayVersionHistoriesActivity, tRaw: Throwable?, tBlob: Throwable?) {
val message: String? = buildString {
if (tRaw != null) append("Error message of raw:\n\n${tRaw.message}\n\n")
if (tBlob != null) append("Error message of blob:\n\n${tBlob.message}\n\n")
}.takeIf(String::isNotBlank)?.trim()
fun compareVersion(v1: String, v2: String): Int {
val a1 = v1.trimStart('v').split(".")
val a2 = v2.trimStart('v').split(".")
val max = maxOf(a1.size, a2.size)
for (i in 0 until max) {
val n1 = a1.getOrNull(i)?.toIntOrNull() ?: 0
val n2 = a2.getOrNull(i)?.toIntOrNull() ?: 0
if (n1 != n2) return n1.compareTo(n2)
}
return 0
}
MaterialDialog.Builder(activity)
.title(R.string.error_failed_to_retrieve_version_histories)
.apply { message?.let(::content) }
.positiveText(R.string.dialog_button_dismiss)
.dismissListener { activity.finish() }
.show()
}
}

View File

@@ -0,0 +1,34 @@
package org.autojs.autojs.util
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import java.text.SimpleDateFormat
import java.util.*
object ProcessLogger {
private val sdf
get() = SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
private val buffer = StringBuilder()
/* 用 SharedFlow 推送 "增量行". */
private val _flow = MutableSharedFlow<String>(extraBufferCapacity = 64)
val flow: SharedFlow<String> = _flow.asSharedFlow()
@Synchronized
fun dump(): String = buffer.toString()
@Synchronized
fun clear() = buffer.clear()
@Synchronized
fun i(msg: String) {
val suffix = if (buffer.isNotEmpty()) "\n" else ""
val line = "$suffix${sdf.format(Date())}: $msg"
buffer.append(line)
_flow.tryEmit(line)
}
}

View File

@@ -33,14 +33,6 @@
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/loading_placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="13sp"
android:visibility="invisible" />
<TextView
android:id="@+id/loading_text"
android:layout_width="wrap_content"
@@ -48,19 +40,7 @@
android:layout_gravity="center"
android:layout_marginVertical="10dp"
android:text="@string/text_loading_with_dots"
android:textSize="16sp"
android:visibility="invisible"
tools:visibility="visible" />
<TextView
android:id="@+id/loading_second_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/text_loading_a_fallback_solution_with_dots"
android:textSize="12sp"
android:visibility="invisible"
tools:visibility="visible" />
android:textSize="16sp" />
</LinearLayout>

View File

@@ -77,6 +77,7 @@
android:gravity="end">
<LinearLayout
android:id="@+id/tvFeatureCountContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
@@ -111,6 +112,7 @@
</LinearLayout>
<LinearLayout
android:id="@+id/tvFixCountContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
@@ -145,6 +147,7 @@
</LinearLayout>
<LinearLayout
android:id="@+id/tvImprovementCountContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
@@ -183,7 +186,7 @@
</LinearLayout>
<TextView
android:id="@+id/tvBody"
android:id="@+id/tvLines"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.2"

View File

@@ -49,7 +49,7 @@
android:maxLines="4"
android:textColor="@color/day_night_alpha_60"
android:textSize="12sp"
tools:text="@plurals/text_items_total_sum" />
tools:text="@plurals/text_items_total_sum_with_colon" />
</LinearLayout>

View File

@@ -55,7 +55,7 @@
android:maxLines="1"
android:textColor="@color/day_night_alpha_60"
android:textSize="12sp"
tools:text="@plurals/text_items_total_sum" />
tools:text="@plurals/text_items_total_sum_with_colon" />
<TextView
android:id="@+id/subtitle_split_line"

View File

@@ -15,4 +15,14 @@
android:icon="@drawable/ic_collapse_all"
app:showAsAction="always" />
<item
android:id="@+id/action_filter_category"
android:title="@string/text_category_filter"
app:showAsAction="never" />
<item
android:id="@+id/action_show_logs"
android:title="@string/text_process_log"
app:showAsAction="never" />
</menu>

View File

@@ -1,21 +1,63 @@
<resources>
<!-- المجموع %d عنصر -->
<plurals name="text_items_total_sum">
<item quantity="zero">المجموع: لا شيء</item>
<item quantity="zero">المجموع لا عناصر</item>
<item quantity="one">المجموع عنصر واحد</item>
<item quantity="two">المجموع عنصران</item>
<item quantity="few">المجموع %d عناصر</item>
<item quantity="many">المجموع %d عنصراً</item>
<item quantity="other">المجموع %d عنصر</item>
</plurals>
<!-- المجموع: %d عنصر -->
<plurals name="text_items_total_sum_with_colon">
<item quantity="zero">المجموع: لا عناصر</item>
<item quantity="one">المجموع: عنصر واحد</item>
<item quantity="two">المجموع: عنصران</item>
<item quantity="few">المجموع: %d عناصر</item>
<item quantity="many">المجموع: %d عنصرًا</item>
<item quantity="other">المجموع: %d عناصر</item>
<item quantity="many">المجموع: %d عنصراً</item>
<item quantity="other">المجموع: %d عنصر</item>
</plurals>
<!-- تم إيقاف %d سكربت -->
<plurals name="text_already_stop_n_scripts">
<item quantity="zero">لم يتم إيقاف أي برنامج نصي</item>
<item quantity="one">تم إيقاف %d برنامج نصي</item>
<item quantity="two">تم إيقاف برنامجين نصيين</item>
<item quantity="few">تم إيقاف %d نصوص</item>
<item quantity="many">تم إيقاف %d نصوص</item>
<item quantity="other">تم إيقاف %d نصوص</item>
<item quantity="zero">لم يُوقَف أي سكربت</item>
<item quantity="one">تم إيقاف سكربت واحد</item>
<item quantity="two">تم إيقاف سكربتين</item>
<item quantity="few">تم إيقاف %d سكربتات</item>
<item quantity="many">تم إيقاف %d سكربتاً</item>
<item quantity="other">تم إيقاف %d سكربت</item>
</plurals>
<!-- تقبل الدالة %d مُعاملاً فقط -->
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="zero">لا تقبل الدالة أي مُعامل</item>
<item quantity="one">تقبل الدالة مُعاملاً واحداً فقط</item>
<item quantity="two">تقبل الدالة مُعاملين فقط</item>
<item quantity="few">تقبل الدالة %d مُعاملات فقط</item>
<item quantity="many">تقبل الدالة %d مُعاملاً فقط</item>
<item quantity="other">تقبل الدالة %d مُعامل فقط</item>
</plurals>
<!-- تقبل الدالة ما لا يزيد عن %d مُعاملاً -->
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="zero">لا تقبل الدالة أي مُعامل</item>
<item quantity="one">تقبل الدالة مُعاملاً واحداً كحد أقصى</item>
<item quantity="two">تقبل الدالة مُعاملين كحد أقصى</item>
<item quantity="few">تقبل الدالة %d مُعاملات كحد أقصى</item>
<item quantity="many">تقبل الدالة %d مُعاملاً كحد أقصى</item>
<item quantity="other">تقبل الدالة %d مُعامل كحد أقصى</item>
</plurals>
<!-- تقبل الدالة ما لا يقل عن %d مُعاملاً -->
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="zero">لا تعمل الدالة دون مُعاملات</item>
<item quantity="one">تقبل الدالة مُعاملاً واحداً على الأقل</item>
<item quantity="two">تقبل الدالة مُعاملين على الأقل</item>
<item quantity="few">تقبل الدالة %d مُعاملات على الأقل</item>
<item quantity="many">تقبل الدالة %d مُعاملاً على الأقل</item>
<item quantity="other">تقبل الدالة %d مُعامل على الأقل</item>
</plurals>
</resources>

View File

@@ -279,6 +279,25 @@
<string name="hint_loop_delay">تأخير قبل الحلقة</string>
<string name="hint_loop_times">0 للحلقة اللانهائية</string>
<string name="label_latest_used_time">آخر استخدام: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">فشل خيط \"blob"\</string>
<string name="logger_ver_history_blob_thread_success">نجح خيط \"blob"\ وجرى حفظ التخزين المؤقت دون اتصال</string>
<string name="logger_ver_history_data_loaded">تم تحميل البيانات</string>
<string name="logger_ver_history_initial_content_chosen">تم اختيار المحتوى الابتدائي</string>
<string name="logger_ver_history_insert_new_entries">جارٍ إدراج عناصر جديدة</string>
<string name="logger_ver_history_load_local_data">جارٍ تحميل البيانات المحلية</string>
<string name="logger_ver_history_local_asset_file">ملف الأصول المحلي</string>
<string name="logger_ver_history_local_asset_latest">ملف الأصول المحلي هو أحدث إصدار</string>
<string name="logger_ver_history_local_data_empty">البيانات المحلية فارغة</string>
<string name="logger_ver_history_local_data_newer_stop_online">البيانات المحلية أحدث، إيقاف تحليل البيانات المتصلة</string>
<string name="logger_ver_history_no_processing_needed">لا حاجة للمعالجة</string>
<string name="logger_ver_history_offline_cache_file">ملف التخزين المؤقت دون اتصال</string>
<string name="logger_ver_history_offline_cache_latest">ملف التخزين المؤقت دون اتصال هو أحدث إصدار</string>
<string name="logger_ver_history_overwrite_date">جارٍ استبدال محتوى التاريخ</string>
<string name="logger_ver_history_overwrite_update_record">جارٍ استبدال سجل التحديث</string>
<string name="logger_ver_history_raw_thread_failure">فشل خيط \"raw"\</string>
<string name="logger_ver_history_raw_thread_success">نجح خيط \"raw"\ وجرى حفظ التخزين المؤقت دون اتصال</string>
<string name="logger_ver_history_start_blob_thread">بدء خيط طلب احتياطي \"blob"\</string>
<string name="logger_ver_history_start_raw_thread">بدء خيط طلب \"raw"\</string>
<string name="media_info_album_label">الألبوم</string>
<string name="media_info_aspect_ratio_label">نسبة العرض إلى الارتفاع</string>
<string name="media_info_audio_format_label">الصوت</string>
@@ -422,6 +441,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">مقسم الشاشة</string>
<string name="text_captured_window_info_type_of_system">النظام</string>
<string name="text_captured_window_info_type_unknown">نوع غير معروف</string>
<string name="text_category_filter">فلتر الفئة</string>
<string name="text_change_working_dir">تغيير دليل العمل</string>
<string name="text_changelog_item_dependency">تعديلات على إصدارات بعض التبعيات أو المكتبات المحلية</string>
<string name="text_check_for_updates">تحقق من وجود تحديثات</string>
@@ -818,6 +838,7 @@
<string name="text_please_choose">اختر من فضلك</string>
<string name="text_please_choose_a_script">اختر نصًا</string>
<string name="text_please_input_name">اسم الإدخال</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">الرجاء الانتظار...</string>
<string name="text_pointer_location">موقع المؤشر</string>
<string name="text_pointer_location_toggle_failed_with_hint">فشل تبديل \"موقع المؤشر\".\nالوصول إلى الجذر مطلوب.</string>
<string name="text_post_notifications_permission">نشر الإخطارات</string>
@@ -829,6 +850,7 @@
<string name="text_press_again_to_exit">اضغط مرة أخرى للخروج</string>
<string name="text_press_back_or_vol_down_to_close_window">لإغلاق، اضغط على \"رجوع\" أو \"خفض الصوت\"</string>
<string name="text_preview">معاينة</string>
<string name="text_process_log">سجل العملية</string>
<string name="text_processing">يعالج</string>
<string name="text_project">مشروع</string>
<string name="text_project_location">موقع المشروع</string>
@@ -1006,6 +1028,7 @@
<string name="text_view">عرض</string>
<string name="text_view_docs">عرض المستندات</string>
<string name="text_vsc_ext_version_not_meet_requirement">إصدار امتداد VSCode لا يفي بالمتطلبات</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">بانتظار اكتمال معالجة جميع البيانات...</string>
<string name="text_weekly_task">مهمة أسبوعية</string>
<string name="text_weekly_task_should_check_day_of_week">يجب اختيار يوم واحد على الأقل</string>
<string name="text_working_dir_path">مسار دليل العمل</string>

View File

@@ -1,6 +1,11 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="one">Total %d item</item>
<item quantity="other">Total %d items</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="one">Total: %d item</item>
<item quantity="other">Total: %d items</item>
</plurals>

View File

@@ -274,6 +274,25 @@
<string name="hint_loop_delay">Delay before loop</string>
<string name="hint_loop_times">0 for infinite loop</string>
<string name="label_latest_used_time">Latest used: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" thread request failed</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" thread request successful, writing offline cache</string>
<string name="logger_ver_history_data_loaded">Data loaded</string>
<string name="logger_ver_history_initial_content_chosen">Chosen initial content</string>
<string name="logger_ver_history_insert_new_entries">Inserting new entries</string>
<string name="logger_ver_history_load_local_data">Loading local data</string>
<string name="logger_ver_history_local_asset_file">Local asset file</string>
<string name="logger_ver_history_local_asset_latest">Local asset file is latest version</string>
<string name="logger_ver_history_local_data_empty">Local data is empty</string>
<string name="logger_ver_history_local_data_newer_stop_online">Local data is newer, stop analyzing online data</string>
<string name="logger_ver_history_no_processing_needed">No processing needed</string>
<string name="logger_ver_history_offline_cache_file">Offline cache file</string>
<string name="logger_ver_history_offline_cache_latest">Offline cache file is latest version</string>
<string name="logger_ver_history_overwrite_date">Overwriting date content</string>
<string name="logger_ver_history_overwrite_update_record">Overwriting update record</string>
<string name="logger_ver_history_raw_thread_failure">\"Raw\" thread request failed</string>
<string name="logger_ver_history_raw_thread_success">\"Raw\" thread request successful, writing offline cache</string>
<string name="logger_ver_history_start_blob_thread">Starting \"blob\" fallback request thread</string>
<string name="logger_ver_history_start_raw_thread">Starting \"raw\" request thread</string>
<string name="media_info_album_label">Album</string>
<string name="media_info_aspect_ratio_label">Aspect ratio</string>
<string name="media_info_audio_format_label">Audio</string>
@@ -417,6 +436,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">Split Screen Divider</string>
<string name="text_captured_window_info_type_of_system">System</string>
<string name="text_captured_window_info_type_unknown">Unknown type</string>
<string name="text_category_filter">Category filter</string>
<string name="text_change_working_dir">Change working directory</string>
<string name="text_changelog_item_dependency">Some dependency or local library version adjustments</string>
<string name="text_check_for_updates">Check for updates</string>
@@ -813,6 +833,7 @@
<string name="text_please_choose">Please choose</string>
<string name="text_please_choose_a_script">Choose a script</string>
<string name="text_please_input_name">Input name</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Please wait...</string>
<string name="text_pointer_location">Pointer location</string>
<string name="text_pointer_location_toggle_failed_with_hint">Toggle \"pointer location\" failed.\nRoot access is required.</string>
<string name="text_post_notifications_permission">Post notifications</string>
@@ -824,6 +845,7 @@
<string name="text_press_again_to_exit">Press again to exit</string>
<string name="text_press_back_or_vol_down_to_close_window">To close, press \"Back\" or \"Volume Down\"</string>
<string name="text_preview">Preview</string>
<string name="text_process_log">Process log</string>
<string name="text_processing">Processing</string>
<string name="text_project">Project</string>
<string name="text_project_location">Project location</string>
@@ -1001,6 +1023,7 @@
<string name="text_view">View</string>
<string name="text_view_docs">View documents</string>
<string name="text_vsc_ext_version_not_meet_requirement">The version of the VSCode extension does not meet the requirements</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">Waiting for all data processing to complete...</string>
<string name="text_weekly_task">Weekly task</string>
<string name="text_weekly_task_should_check_day_of_week">At least one day must be selected</string>
<string name="text_working_dir_path">Working directory path</string>

View File

@@ -1,9 +1,15 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="one">Total: %d artículo</item>
<item quantity="many">Total: %d artículos</item>
<item quantity="other">Total: %d artículos</item>
<item quantity="one">Total %d elemento</item>
<item quantity="many">Total %d elementos</item>
<item quantity="other">Total %d elementos</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="one">Total: %d elemento</item>
<item quantity="many">Total: %d elementos</item>
<item quantity="other">Total: %d elementos</item>
</plurals>
<plurals name="text_already_stop_n_scripts">
@@ -12,4 +18,22 @@
<item quantity="other">%d scripts detenidos</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="one">El método solo acepta %d argumento</item>
<item quantity="many">El método solo acepta %d argumentos</item>
<item quantity="other">El método solo acepta %d argumentos</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="one">El método solo acepta como máximo %d argumento</item>
<item quantity="many">El método solo acepta como máximo %d argumentos</item>
<item quantity="other">El método solo acepta como máximo %d argumentos</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="one">El método solo acepta al menos %d argumento</item>
<item quantity="many">El método solo acepta al menos %d argumentos</item>
<item quantity="other">El método solo acepta al menos %d argumentos</item>
</plurals>
</resources>

View File

@@ -277,6 +277,25 @@
<string name="hint_loop_delay">Retraso antes del bucle</string>
<string name="hint_loop_times">0 para bucle infinito</string>
<string name="label_latest_used_time">Último uso: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">Hilo \"blob\" fallido</string>
<string name="logger_ver_history_blob_thread_success">Hilo \"blob\" exitoso, escribiendo caché sin conexión</string>
<string name="logger_ver_history_data_loaded">Datos cargados</string>
<string name="logger_ver_history_initial_content_chosen">Contenido inicial seleccionado</string>
<string name="logger_ver_history_insert_new_entries">Insertando nuevas entradas</string>
<string name="logger_ver_history_load_local_data">Cargando datos locales</string>
<string name="logger_ver_history_local_asset_file">Archivo de recursos local</string>
<string name="logger_ver_history_local_asset_latest">El archivo de recursos local está en la última versión</string>
<string name="logger_ver_history_local_data_empty">Los datos locales están vacíos</string>
<string name="logger_ver_history_local_data_newer_stop_online">Los datos locales son más recientes, se detiene el análisis en línea</string>
<string name="logger_ver_history_no_processing_needed">No se necesita procesamiento</string>
<string name="logger_ver_history_offline_cache_file">Archivo de caché sin conexión</string>
<string name="logger_ver_history_offline_cache_latest">El archivo de caché sin conexión está en la última versión</string>
<string name="logger_ver_history_overwrite_date">Sobrescribiendo contenido de fecha</string>
<string name="logger_ver_history_overwrite_update_record">Sobrescribiendo registro de actualización</string>
<string name="logger_ver_history_raw_thread_failure">Hilo \"raw\" fallido</string>
<string name="logger_ver_history_raw_thread_success">Hilo \"raw\" exitoso, escribiendo caché sin conexión</string>
<string name="logger_ver_history_start_blob_thread">Iniciando hilo de solicitud alterna \"blob\"</string>
<string name="logger_ver_history_start_raw_thread">Iniciando hilo de solicitud \"raw\"</string>
<string name="media_info_album_label">Álbum</string>
<string name="media_info_aspect_ratio_label">Relación de aspecto</string>
<string name="media_info_audio_format_label">Audio</string>
@@ -420,6 +439,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">Divisor de pantalla dividida</string>
<string name="text_captured_window_info_type_of_system">Sistema</string>
<string name="text_captured_window_info_type_unknown">Tipo desconocido</string>
<string name="text_category_filter">Filtro de categoría</string>
<string name="text_change_working_dir">Cambiar el directorio de trabajo</string>
<string name="text_changelog_item_dependency">Ajustes en algunas dependencias o versiones de bibliotecas locales</string>
<string name="text_check_for_updates">Comprobar si hay actualizaciones</string>
@@ -816,6 +836,7 @@
<string name="text_please_choose">Elija</string>
<string name="text_please_choose_a_script">Elija un script</string>
<string name="text_please_input_name">Nombre de entrada</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Por favor, espere...</string>
<string name="text_pointer_location">Ubicación del puntero</string>
<string name="text_pointer_location_toggle_failed_with_hint">Falló la conmutación de la \"ubicación del puntero\".\nSe requiere acceso a la raíz.</string>
<string name="text_post_notifications_permission">Notificaciones postales</string>
@@ -827,6 +848,7 @@
<string name="text_press_again_to_exit">Pulse de nuevo para salir</string>
<string name="text_press_back_or_vol_down_to_close_window">Para cerrar, presiona \"Atrás\" o \"Bajar volumen\"</string>
<string name="text_preview">Vista previa</string>
<string name="text_process_log">Registro de proceso</string>
<string name="text_processing">Procesando</string>
<string name="text_project">Proyecto</string>
<string name="text_project_location">Ubicación del proyecto</string>
@@ -1004,6 +1026,7 @@
<string name="text_view">Ver</string>
<string name="text_view_docs">Ver documentos</string>
<string name="text_vsc_ext_version_not_meet_requirement">La versión de la extensión VSCode no cumple los requisitos</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">Esperando a que se complete el procesamiento de todos los datos...</string>
<string name="text_weekly_task">Tarea semanal</string>
<string name="text_weekly_task_should_check_day_of_week">Debe seleccionarse al menos un día</string>
<string name="text_working_dir_path">Ruta del directorio de trabajo</string>

View File

@@ -1,9 +1,15 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="one">Total: %d article</item>
<item quantity="many">Total: %d articles</item>
<item quantity="other">Total: %d articles</item>
<item quantity="one">Total %d élément</item>
<item quantity="many">Total %d éléments</item>
<item quantity="other">Total %d éléments</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="one">Total : %d élément</item>
<item quantity="many">Total : %d éléments</item>
<item quantity="other">Total : %d éléments</item>
</plurals>
<plurals name="text_already_stop_n_scripts">
@@ -12,4 +18,22 @@
<item quantity="other">%d scripts arrêtés</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="one">La méthode naccepte que %d argument</item>
<item quantity="many">La méthode naccepte que %d arguments</item>
<item quantity="other">La méthode naccepte que %d arguments</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="one">La méthode naccepte pas plus de %d argument</item>
<item quantity="many">La méthode naccepte pas plus de %d arguments</item>
<item quantity="other">La méthode naccepte pas plus de %d arguments</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="one">La méthode naccepte pas moins de %d argument</item>
<item quantity="many">La méthode naccepte pas moins de %d arguments</item>
<item quantity="other">La méthode naccepte pas moins de %d arguments</item>
</plurals>
</resources>

View File

@@ -277,6 +277,25 @@
<string name="hint_loop_delay">Délai avant boucle</string>
<string name="hint_loop_times">0 pour une boucle infinie</string>
<string name="label_latest_used_time">Dernière utilisation : %1$s</string>
<string name="logger_ver_history_blob_thread_failure">Échec du thread \"blob\"</string>
<string name="logger_ver_history_blob_thread_success">Thread \"blob\" réussi, écriture du cache hors ligne</string>
<string name="logger_ver_history_data_loaded">Données chargées</string>
<string name="logger_ver_history_initial_content_chosen">Contenu initial choisi</string>
<string name="logger_ver_history_insert_new_entries">Insertion de nouvelles entrées</string>
<string name="logger_ver_history_load_local_data">Chargement des données locales</string>
<string name="logger_ver_history_local_asset_file">Fichier d\'actifs local</string>
<string name="logger_ver_history_local_asset_latest">Le fichier d\'actifs local est à jour</string>
<string name="logger_ver_history_local_data_empty">Les données locales sont vides</string>
<string name="logger_ver_history_local_data_newer_stop_online">Les données locales sont plus récentes, arrêt de l\'analyse en ligne</string>
<string name="logger_ver_history_no_processing_needed">Aucun traitement nécessaire</string>
<string name="logger_ver_history_offline_cache_file">Fichier de cache hors ligne</string>
<string name="logger_ver_history_offline_cache_latest">Le fichier de cache hors ligne est à jour</string>
<string name="logger_ver_history_overwrite_date">Remplacement du contenu de date</string>
<string name="logger_ver_history_overwrite_update_record">Remplacement de l\'enregistrement de mise à jour</string>
<string name="logger_ver_history_raw_thread_failure">Échec du thread \"raw\"</string>
<string name="logger_ver_history_raw_thread_success">Thread \"raw\" réussi, écriture du cache hors ligne</string>
<string name="logger_ver_history_start_blob_thread">Démarrage du thread de requête de secours \"blob\"</string>
<string name="logger_ver_history_start_raw_thread">Démarrage du thread de requête \"raw\"</string>
<string name="media_info_album_label">Album</string>
<string name="media_info_aspect_ratio_label">Ratio d\'aspect</string>
<string name="media_info_audio_format_label">Audio</string>
@@ -420,6 +439,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">Séparateur d\'écran partagé</string>
<string name="text_captured_window_info_type_of_system">Système</string>
<string name="text_captured_window_info_type_unknown">Type inconnu</string>
<string name="text_category_filter">Filtre de catégorie</string>
<string name="text_change_working_dir">Changer de répertoire de travail</string>
<string name="text_changelog_item_dependency">Certaines dépendances ou versions de bibliothèques locales ont été ajustées</string>
<string name="text_check_for_updates">Vérifier les mises à jour</string>
@@ -816,6 +836,7 @@
<string name="text_please_choose">Veuillez choisir</string>
<string name="text_please_choose_a_script">Choisissez un script</string>
<string name="text_please_input_name">Nom de l\'entrée</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Veuillez patienter...</string>
<string name="text_pointer_location">L\'emplacement du pointeur</string>
<string name="text_pointer_location_toggle_failed_with_hint">Toggle \"pointer location\" failed.\nL\'accès à la racine est nécessaire.</string>
<string name="text_post_notifications_permission">Notifications postales</string>
@@ -827,6 +848,7 @@
<string name="text_press_again_to_exit">Appuyez à nouveau pour quitter</string>
<string name="text_press_back_or_vol_down_to_close_window">Pour fermer, appuyez sur \"Retour\" ou \"Volume bas\"</string>
<string name="text_preview">Préview</string>
<string name="text_process_log">Journal de processus</string>
<string name="text_processing">Traitement</string>
<string name="text_project">Projet</string>
<string name="text_project_location">Localisation du projet</string>
@@ -1004,6 +1026,7 @@
<string name="text_view">Voir</string>
<string name="text_view_docs">Voir les documents</string>
<string name="text_vsc_ext_version_not_meet_requirement">La version de l\'extension VSCode ne répond pas aux exigences</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">En attente de la fin du traitement de toutes les données...</string>
<string name="text_weekly_task">Tâche hebdomadaire</string>
<string name="text_weekly_task_should_check_day_of_week">Au moins un jour doit être sélectionné</string>
<string name="text_working_dir_path">Chemin du répertoire de travail</string>.

View File

@@ -1,11 +1,27 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="other">合計 %d 件</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="other">合計: %d 件</item>
</plurals>
<plurals name="text_already_stop_n_scripts">
<item quantity="other">%d のスクリプト停止している</item>
<item quantity="other">%d のスクリプト停止しました</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="other">メソッドは %d 個の引数のみ受け付けます</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="other">メソッドが受け付ける引数は最大 %d 個までです</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="other">メソッドが受け付ける引数は最小 %d 個からです</item>
</plurals>
</resources>

View File

@@ -278,6 +278,25 @@
<string name="hint_loop_delay">ループ前の遅延時間</string>
<string name="hint_loop_times">無限ループの場合は 0</string>
<string name="label_latest_used_time">最終使用時: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" スレッドが失敗</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" スレッドが成功、オフラインキャッシュを書き込み</string>
<string name="logger_ver_history_data_loaded">データ読み込み完了</string>
<string name="logger_ver_history_initial_content_chosen">初期コンテンツを選択</string>
<string name="logger_ver_history_insert_new_entries">新しい項目を挿入中</string>
<string name="logger_ver_history_load_local_data">ローカルデータを読み込み中</string>
<string name="logger_ver_history_local_asset_file">ローカルアセットファイル</string>
<string name="logger_ver_history_local_asset_latest">ローカルアセットファイルは最新です</string>
<string name="logger_ver_history_local_data_empty">ローカルデータが空です</string>
<string name="logger_ver_history_local_data_newer_stop_online">ローカルデータの方が新しいためオンライン解析を停止</string>
<string name="logger_ver_history_no_processing_needed">処理は不要</string>
<string name="logger_ver_history_offline_cache_file">オフラインキャッシュファイル</string>
<string name="logger_ver_history_offline_cache_latest">オフラインキャッシュファイルは最新です</string>
<string name="logger_ver_history_overwrite_date">日付内容を上書き中</string>
<string name="logger_ver_history_overwrite_update_record">更新履歴を上書き中</string>
<string name="logger_ver_history_raw_thread_failure">\"Raw\" スレッドが失敗</string>
<string name="logger_ver_history_raw_thread_success">\"Raw\" スレッドが成功、オフラインキャッシュを書き込み</string>
<string name="logger_ver_history_start_blob_thread">\"Blob\" 予備リクエストスレッドを開始</string>
<string name="logger_ver_history_start_raw_thread">\"Raw\" リクエストスレッドを開始</string>
<string name="media_info_album_label">アルバム</string>
<string name="media_info_aspect_ratio_label">アスペクト比</string>
<string name="media_info_audio_format_label">オーディオ</string>
@@ -421,6 +440,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">画面区切り</string>
<string name="text_captured_window_info_type_of_system">システム</string>
<string name="text_captured_window_info_type_unknown">不明なタイプ</string>
<string name="text_category_filter">カテゴリフィルター</string>
<string name="text_change_working_dir">作業ディレクトリの変更</string>
<string name="text_changelog_item_dependency">一部の依存関係またはローカルライブラリのバージョン調整</string>
<string name="text_check_for_updates">アップデートの確認</string>
@@ -817,6 +837,7 @@
<string name="text_please_choose">選択してください</string>
<string name="text_please_choose_a_script">スクリプトを選択してください</string>
<string name="text_please_input_name">入力名</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">しばらくお待ちください...</string>
<string name="text_pointer_location">ポインターの位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">トグル「ポインターの位置」に失敗しました.\nroot 権限が必要です</string>
<string name="text_post_notifications_permission">ゆうびんけいほう</string>
@@ -828,6 +849,7 @@
<string name="text_press_again_to_exit">もう一度押すと終了します</string>
<string name="text_press_back_or_vol_down_to_close_window">閉じるには \"戻る\" または \"音量を下げる\" を押してください</string>
<string name="text_preview">プレビュー</string>
<string name="text_process_log">プロセスログ</string>
<string name="text_processing">処理中</string>
<string name="text_project">プロジェクト</string>
<string name="text_project_location">プロジェクトの場所</string>
@@ -1005,6 +1027,7 @@
<string name="text_view">表示</string>
<string name="text_view_docs">ドキュメントを見る</string>
<string name="text_vsc_ext_version_not_meet_requirement">VSCode 拡張機能のバージョンが要件を満たしていない</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">すべてのデータ処理が完了するのを待機しています...</string>
<string name="text_weekly_task">週次タスク</string>
<string name="text_weekly_task_should_check_day_of_week">最低 1 日選択する必要があります</string>
<string name="text_working_dir_path">作業ディレクトリのパス</string>

View File

@@ -1,11 +1,27 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="other">: %d 개 항목</item>
<item quantity="other">총 %d개 항목</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="other">총: %d개 항목</item>
</plurals>
<plurals name="text_already_stop_n_scripts">
<item quantity="other">%d 개의 스크립트가 중지되었습니다</item>
<item quantity="other">%d개의 스크립트가 중지되었습니다</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="other">메서드는 %d개의 인자만 허용합니다</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="other">메서드는 최대 %d개의 인자만 허용합니다</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="other">메서드는 최소 %d개의 인자를 허용합니다</item>
</plurals>
</resources>

View File

@@ -279,6 +279,25 @@
<string name="hint_loop_delay">루프 전 지연</string>
<string name="hint_loop_times">무한 루프의 경우 0</string>
<string name="label_latest_used_time">최종 사용: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" 스레드 요청 실패</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" 스레드 요청 성공, 오프라인 캐시 기록</string>
<string name="logger_ver_history_data_loaded">데이터 로드 완료</string>
<string name="logger_ver_history_initial_content_chosen">초기 콘텐츠 선택됨</string>
<string name="logger_ver_history_insert_new_entries">새 항목 삽입 중</string>
<string name="logger_ver_history_load_local_data">로컬 데이터 불러오는 중</string>
<string name="logger_ver_history_local_asset_file">로컬 에셋 파일</string>
<string name="logger_ver_history_local_asset_latest">로컬 에셋 파일이 최신 버전임</string>
<string name="logger_ver_history_local_data_empty">로컬 데이터가 비어 있음</string>
<string name="logger_ver_history_local_data_newer_stop_online">로컬 데이터가 최신이므로 온라인 분석 중지</string>
<string name="logger_ver_history_no_processing_needed">처리 필요 없음</string>
<string name="logger_ver_history_offline_cache_file">오프라인 캐시 파일</string>
<string name="logger_ver_history_offline_cache_latest">오프라인 캐시 파일이 최신 버전임</string>
<string name="logger_ver_history_overwrite_date">날짜 내용을 덮어쓰는 중</string>
<string name="logger_ver_history_overwrite_update_record">업데이트 기록을 덮어쓰는 중</string>
<string name="logger_ver_history_raw_thread_failure">\"Raw\" 스레드 요청 실패</string>
<string name="logger_ver_history_raw_thread_success">\"Raw\" 스레드 요청 성공, 오프라인 캐시 기록</string>
<string name="logger_ver_history_start_blob_thread">\"Blob\" 대체 요청 스레드 시작</string>
<string name="logger_ver_history_start_raw_thread">\"Raw\" 요청 스레드 시작</string>
<string name="media_info_album_label">앨범</string>
<string name="media_info_aspect_ratio_label">종횡비</string>
<string name="media_info_audio_format_label">오디오</string>
@@ -422,6 +441,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">화면 분할</string>
<string name="text_captured_window_info_type_of_system">시스템</string>
<string name="text_captured_window_info_type_unknown">알 수 없음</string>
<string name="text_category_filter">카테고리 필터</string>
<string name="text_change_working_dir">작업 디렉토리를 변경하십시오</string>
<string name="text_changelog_item_dependency">일부 의존성 또는 로컬 라이브러리 버전 조정</string>
<string name="text_check_for_updates">업데이트 확인</string>
@@ -818,6 +838,7 @@
<string name="text_please_choose">선택하십시오</string>
<string name="text_please_choose_a_script">스크립트를 선택하십시오</string>
<string name="text_please_input_name">입력 이름</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">잠시만 기다려주세요...</string>
<string name="text_pointer_location">포인터 위치</string>
<string name="text_pointer_location_toggle_failed_with_hint">\"포인터 위치\"토글이 실패했습니다.\n루트 액세스가 필요합니다.</string>
<string name="text_post_notifications_permission">게시물 알림</string>
@@ -829,6 +850,7 @@
<string name="text_press_again_to_exit">종료하려면 다시 누릅니다</string>
<string name="text_press_back_or_vol_down_to_close_window">창을 닫으려면 \"뒤로\" 또는 \"볼륨 감소\" 버튼을 누르세요</string>
<string name="text_preview">시사</string>
<string name="text_process_log">프로세스 로그</string>
<string name="text_processing">처리</string>
<string name="text_project">프로젝트</string>
<string name="text_project_location">프로젝트 위치</string>
@@ -1006,6 +1028,7 @@
<string name="text_view">보기</string>
<string name="text_view_docs">문서를 봅니다</string>
<string name="text_vsc_ext_version_not_meet_requirement">VSCode 확장 버전이 요구 사항을 충족하지 않습니다</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">모든 데이터 처리가 완료될 때까지 대기 중입니다...</string>
<string name="text_weekly_task">주간 과제</string>
<string name="text_weekly_task_should_check_day_of_week">최소한 하루를 선택해야합니다</string>
<string name="text_working_dir_path">작업 디렉토리 경로</string>

View File

@@ -1,17 +1,47 @@
<resources>
<!-- Русский имеет категории one / few / many / other -->
<plurals name="text_items_total_sum">
<item quantity="one">Всего: %d элемент</item>
<item quantity="few">Всего: %d элемента</item>
<item quantity="many">Всего: %d элементов</item>
<item quantity="other">Всего: %d элементов</item>
<item quantity="one">Итого %d элемент</item>
<item quantity="few">Итого %d элемента</item>
<item quantity="many">Итого %d элементов</item>
<item quantity="other">Итого %d элемента</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="one">Итого: %d элемент</item>
<item quantity="few">Итого: %d элемента</item>
<item quantity="many">Итого: %d элементов</item>
<item quantity="other">Итого: %d элемента</item>
</plurals>
<plurals name="text_already_stop_n_scripts">
<item quantity="one">%d скрипт остановлен</item>
<item quantity="few">%d скрипта остановлены</item>
<item quantity="many">%d скриптов остановлены</item>
<item quantity="other">%d скриптов остановлены</item>
<item quantity="few">%d скрипта остановлено</item>
<item quantity="many">%d скриптов остановлено</item>
<item quantity="other">%d скрипта остановлено</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="one">Метод принимает только %d аргумент</item>
<item quantity="few">Метод принимает только %d аргумента</item>
<item quantity="many">Метод принимает только %d аргументов</item>
<item quantity="other">Метод принимает только %d аргумента</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="one">Метод принимает не более %d аргумента</item>
<item quantity="few">Метод принимает не более %d аргументов</item>
<item quantity="many">Метод принимает не более %d аргументов</item>
<item quantity="other">Метод принимает не более %d аргумента</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="one">Метод принимает не менее %d аргумента</item>
<item quantity="few">Метод принимает не менее %d аргументов</item>
<item quantity="many">Метод принимает не менее %d аргументов</item>
<item quantity="other">Метод принимает не менее %d аргумента</item>
</plurals>
</resources>

View File

@@ -277,6 +277,25 @@
<string name="hint_loop_delay">Задержка перед циклом</string>
<string name="hint_loop_times">0 для бесконечного цикла</string>
<string name="label_latest_used_time">Последнее использование: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">Поток \"blob\" неудачен</string>
<string name="logger_ver_history_blob_thread_success">Поток \"blob\" успешен, запись офлайн-кеша</string>
<string name="logger_ver_history_data_loaded">Данные загружены</string>
<string name="logger_ver_history_initial_content_chosen">Выбран исходный контент</string>
<string name="logger_ver_history_insert_new_entries">Вставка новых записей</string>
<string name="logger_ver_history_load_local_data">Загрузка локальных данных</string>
<string name="logger_ver_history_local_asset_file">Локальный файл ресурсов</string>
<string name="logger_ver_history_local_asset_latest">Локальный файл ресурсов актуален</string>
<string name="logger_ver_history_local_data_empty">Локальные данные пусты</string>
<string name="logger_ver_history_local_data_newer_stop_online">Локальные данные новее, анализ онлайн-данных остановлен</string>
<string name="logger_ver_history_no_processing_needed">Обработка не требуется</string>
<string name="logger_ver_history_offline_cache_file">Файл офлайн-кеша</string>
<string name="logger_ver_history_offline_cache_latest">Файл офлайн-кеша актуален</string>
<string name="logger_ver_history_overwrite_date">Перезапись содержимого даты</string>
<string name="logger_ver_history_overwrite_update_record">Перезапись записи обновления</string>
<string name="logger_ver_history_raw_thread_failure">Поток \"raw\" неудачен</string>
<string name="logger_ver_history_raw_thread_success">Поток \"raw\" успешен, запись офлайн-кеша</string>
<string name="logger_ver_history_start_blob_thread">Запуск резервного потока \"blob\"</string>
<string name="logger_ver_history_start_raw_thread">Запуск потока запроса \"raw\"</string>
<string name="media_info_album_label">Альбом</string>
<string name="media_info_aspect_ratio_label">Соотношение сторон</string>
<string name="media_info_audio_format_label">Аудио</string>
@@ -420,6 +439,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">Разделитель экрана</string>
<string name="text_captured_window_info_type_of_system">Система</string>
<string name="text_captured_window_info_type_unknown">Неизвестный тип</string>
<string name="text_category_filter">Фильтр категории</string>
<string name="text_change_working_dir">Изменить рабочий каталог</string>
<string name="text_changelog_item_dependency">Изменения версий некоторых зависимостей или локальных библиотек</string>
<string name="text_check_for_updates">Проверка наличия обновлений</string>
@@ -816,6 +836,7 @@
<string name="text_please_choose">Пожалуйста, выберите</string>
<string name="text_please_choose_a_script">Выберите сценарий</string>
<string name="text_please_input_name">Имя ввода</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Пожалуйста, подождите...</string>
<string name="text_pointer_location">Расположение указателя</string>
<string name="text_pointer_location_toggle_failed_with_hint">Переключение \"Расположение указателя\" не удалось.\nТребуется корневой доступ.</string>
<string name="text_post_notifications_permission">почтовые уведомления</string>
@@ -827,6 +848,7 @@
<string name="text_press_again_to_exit">Нажмите еще раз, чтобы выйти</string>
<string name="text_press_back_or_vol_down_to_close_window">Чтобы закрыть, нажмите \"Назад\" или \"Уменьшение громкости\"</string>
<string name="text_preview">Предварительный просмотр</string>
<string name="text_process_log">Журнал процесса</string>
<string name="text_processing">Обработка</string>
<string name="text_project">Проект</string>
<string name="text_project_location">Расположение проекта</string>
@@ -1004,6 +1026,7 @@
<string name="text_view">Просмотр</string>
<string name="text_view_docs">Просмотр документов</string>
<string name="text_vsc_ext_version_not_meet_requirement">Версия расширения VSCode не соответствует требованиям</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">Ожидание завершения обработки всех данных...</string>
<string name="text_weekly_task">Недельное задание</string>
<string name="text_weekly_task_should_check_day_of_week">Должен быть выбран хотя бы один день</string>
<string name="text_working_dir_path">Путь к рабочему каталогу</string>

View File

@@ -1,6 +1,10 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="other">共計 %d 項</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="other">共計: %d 項</item>
</plurals>
@@ -8,4 +12,16 @@
<item quantity="other">已停止運行 %d 個腳本</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="other">方法僅可接受 %d 個參數</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="other">方法僅可接受不多於 %d 個參數</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="other">方法僅可接受不少於 %d 個參數</item>
</plurals>
</resources>

View File

@@ -275,6 +275,25 @@
<string name="hint_loop_delay">開始循環前的延遲</string>
<string name="hint_loop_times">0 表示無限循環</string>
<string name="label_latest_used_time">最近使用: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">線程 "blob" 請求失敗</string>
<string name="logger_ver_history_blob_thread_success">線程 "blob" 請求成功, 寫入離線緩存</string>
<string name="logger_ver_history_data_loaded">數據加載完畢</string>
<string name="logger_ver_history_initial_content_chosen">初始內容選用</string>
<string name="logger_ver_history_insert_new_entries">插入新條目</string>
<string name="logger_ver_history_load_local_data">加載本地數據</string>
<string name="logger_ver_history_local_asset_file">本地資產文件</string>
<string name="logger_ver_history_local_asset_latest">本地資產文件最新版本</string>
<string name="logger_ver_history_local_data_empty">本地數據為空</string>
<string name="logger_ver_history_local_data_newer_stop_online">本地數據較新, 停止繼續分析在線數據</string>
<string name="logger_ver_history_no_processing_needed">無需處理</string>
<string name="logger_ver_history_offline_cache_file">離線緩存文件</string>
<string name="logger_ver_history_offline_cache_latest">離線緩存文件最新版本</string>
<string name="logger_ver_history_overwrite_date">覆寫日期內容</string>
<string name="logger_ver_history_overwrite_update_record">覆寫更新記錄</string>
<string name="logger_ver_history_raw_thread_failure">線程 "raw" 請求失敗</string>
<string name="logger_ver_history_raw_thread_success">線程 "raw" 請求成功, 寫入離線緩存</string>
<string name="logger_ver_history_start_blob_thread">啓動 "blob" 備用請求線程</string>
<string name="logger_ver_history_start_raw_thread">啓動 "raw" 請求線程</string>
<string name="media_info_album_label">專輯</string>
<string name="media_info_aspect_ratio_label">縱橫比</string>
<string name="media_info_audio_format_label">音頻</string>
@@ -418,6 +437,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">分割屏幕分隔線</string>
<string name="text_captured_window_info_type_of_system">系統</string>
<string name="text_captured_window_info_type_unknown">未知類型</string>
<string name="text_category_filter">類別篩選</string>
<string name="text_change_working_dir">更改工作路徑</string>
<string name="text_changelog_item_dependency">部分依賴或本地庫版本調整</string>
<string name="text_check_for_updates">檢查更新</string>
@@ -814,6 +834,7 @@
<string name="text_please_choose">請選擇</string>
<string name="text_please_choose_a_script">請選擇腳本</string>
<string name="text_please_input_name">請輸入名稱</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">請稍候...</string>
<string name="text_pointer_location">指針位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">切換 \"指針位置\" 顯示狀態失敗\n可能缺少 root 權限</string>
<string name="text_post_notifications_permission">發佈通知權限</string>
@@ -825,6 +846,7 @@
<string name="text_press_again_to_exit">再按一次退出應用</string>
<string name="text_press_back_or_vol_down_to_close_window">如需關閉窗口, 可按 \"返回鍵\" 或 \"音量減鍵\"</string>
<string name="text_preview">預覽</string>
<string name="text_process_log">流程日誌</string>
<string name="text_processing">處理中</string>
<string name="text_project">項目</string>
<string name="text_project_location">項目位置</string>
@@ -1002,6 +1024,7 @@
<string name="text_view">查看</string>
<string name="text_view_docs">查看文檔</string>
<string name="text_vsc_ext_version_not_meet_requirement">VSCode 插件版本不符合要求</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">正在等待全部數據處理完畢...</string>
<string name="text_weekly_task">每週任務</string>
<string name="text_weekly_task_should_check_day_of_week">需至少選擇一天</string>
<string name="text_working_dir_path">工作路徑</string>

View File

@@ -1,6 +1,10 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="other">共計 %d 項</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="other">共計: %d 項</item>
</plurals>
@@ -8,4 +12,16 @@
<item quantity="other">已停止執行 %d 個指令碼</item>
</plurals>
<plurals name="error_method_only_accepts_n_arguments">
<item quantity="other">方法僅可接受 %d 個引數</item>
</plurals>
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
<item quantity="other">方法僅可接受不多於 %d 個引數</item>
</plurals>
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
<item quantity="other">方法僅可接受不少於 %d 個引數</item>
</plurals>
</resources>

View File

@@ -275,6 +275,25 @@
<string name="hint_loop_delay">開始迴圈前的延遲</string>
<string name="hint_loop_times">0 表示無限迴圈</string>
<string name="label_latest_used_time">最近使用: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">執行緒 "blob" 請求失敗</string>
<string name="logger_ver_history_blob_thread_success">執行緒 "blob" 請求成功, 寫入離線快取</string>
<string name="logger_ver_history_data_loaded">資料載入完畢</string>
<string name="logger_ver_history_initial_content_chosen">初始內容選用</string>
<string name="logger_ver_history_insert_new_entries">插入新條目</string>
<string name="logger_ver_history_load_local_data">載入本地資料</string>
<string name="logger_ver_history_local_asset_file">本地資產檔案</string>
<string name="logger_ver_history_local_asset_latest">本地資產檔案最新版本</string>
<string name="logger_ver_history_local_data_empty">本地資料為空</string>
<string name="logger_ver_history_local_data_newer_stop_online">本地資料較新, 停止繼續分析線上資料</string>
<string name="logger_ver_history_no_processing_needed">無需處理</string>
<string name="logger_ver_history_offline_cache_file">離線快取檔案</string>
<string name="logger_ver_history_offline_cache_latest">離線快取檔案最新版本</string>
<string name="logger_ver_history_overwrite_date">覆寫日期內容</string>
<string name="logger_ver_history_overwrite_update_record">覆寫更新記錄</string>
<string name="logger_ver_history_raw_thread_failure">執行緒 "raw" 請求失敗</string>
<string name="logger_ver_history_raw_thread_success">執行緒 "raw" 請求成功, 寫入離線快取</string>
<string name="logger_ver_history_start_blob_thread">啟動 "blob" 備用請求執行緒</string>
<string name="logger_ver_history_start_raw_thread">啟動 "raw" 請求執行緒</string>
<string name="media_info_album_label">專輯</string>
<string name="media_info_aspect_ratio_label">縱橫比</string>
<string name="media_info_audio_format_label">音訊</string>
@@ -418,6 +437,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">分割螢幕分隔線</string>
<string name="text_captured_window_info_type_of_system">系統</string>
<string name="text_captured_window_info_type_unknown">未知型別</string>
<string name="text_category_filter">類別篩選</string>
<string name="text_change_working_dir">更改工作路徑</string>
<string name="text_changelog_item_dependency">部分依賴或本地庫版本調整</string>
<string name="text_check_for_updates">檢查更新</string>
@@ -814,6 +834,7 @@
<string name="text_please_choose">請選擇</string>
<string name="text_please_choose_a_script">請選擇指令碼</string>
<string name="text_please_input_name">請輸入名稱</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">請稍候...</string>
<string name="text_pointer_location">指標位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">切換 \"指標位置\" 顯示狀態失敗\n可能缺少 root 許可權</string>
<string name="text_post_notifications_permission">釋出通知許可權</string>
@@ -825,6 +846,7 @@
<string name="text_press_again_to_exit">再按一次退出應用</string>
<string name="text_press_back_or_vol_down_to_close_window">如需關閉視窗, 可按 \"返回鍵\" 或 \"音量減鍵\"</string>
<string name="text_preview">預覽</string>
<string name="text_process_log">流程日誌</string>
<string name="text_processing">處理中</string>
<string name="text_project">專案</string>
<string name="text_project_location">專案位置</string>
@@ -1002,6 +1024,7 @@
<string name="text_view">檢視</string>
<string name="text_view_docs">檢視文件</string>
<string name="text_vsc_ext_version_not_meet_requirement">VSCode 外掛版本不符合要求</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">正在等待全部資料處理完畢...</string>
<string name="text_weekly_task">每週任務</string>
<string name="text_weekly_task_should_check_day_of_week">需至少選擇一天</string>
<string name="text_working_dir_path">工作路徑</string>

View File

@@ -1,6 +1,10 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="other">共计 %d 项</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="other">共计: %d 项</item>
</plurals>

View File

@@ -275,6 +275,25 @@
<string name="hint_loop_delay">开始循环前的延迟</string>
<string name="hint_loop_times">0 表示无限循环</string>
<string name="label_latest_used_time">最近使用: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">线程 \"blob\" 请求失败</string>
<string name="logger_ver_history_blob_thread_success">线程 \"blob\" 请求成功, 写入离线缓存</string>
<string name="logger_ver_history_data_loaded">数据加载完毕</string>
<string name="logger_ver_history_initial_content_chosen">初始内容选用</string>
<string name="logger_ver_history_insert_new_entries">插入新条目</string>
<string name="logger_ver_history_load_local_data">加载本地数据</string>
<string name="logger_ver_history_local_asset_file">本地资产文件</string>
<string name="logger_ver_history_local_asset_latest">本地资产文件最新版本</string>
<string name="logger_ver_history_local_data_empty">本地数据为空</string>
<string name="logger_ver_history_local_data_newer_stop_online">本地数据较新, 停止继续分析在线数据</string>
<string name="logger_ver_history_no_processing_needed">无需处理</string>
<string name="logger_ver_history_offline_cache_file">离线缓存文件</string>
<string name="logger_ver_history_offline_cache_latest">离线缓存文件最新版本</string>
<string name="logger_ver_history_overwrite_date">覆写日期内容</string>
<string name="logger_ver_history_overwrite_update_record">覆写更新记录</string>
<string name="logger_ver_history_raw_thread_failure">线程 \"raw\" 请求失败</string>
<string name="logger_ver_history_raw_thread_success">线程 \"raw\" 请求成功, 写入离线缓存</string>
<string name="logger_ver_history_start_blob_thread">启动 \"blob\" 备用请求线程</string>
<string name="logger_ver_history_start_raw_thread">启动 \"raw\" 请求线程</string>
<string name="media_info_album_label">专辑</string>
<string name="media_info_aspect_ratio_label">纵横比</string>
<string name="media_info_audio_format_label">音频</string>
@@ -418,6 +437,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">分割屏幕分隔线</string>
<string name="text_captured_window_info_type_of_system">系统</string>
<string name="text_captured_window_info_type_unknown">未知类型</string>
<string name="text_category_filter">类别筛选</string>
<string name="text_change_working_dir">更改工作路径</string>
<string name="text_changelog_item_dependency">部分依赖或本地库版本调整</string>
<string name="text_check_for_updates">检查更新</string>
@@ -814,6 +834,7 @@
<string name="text_please_choose">请选择</string>
<string name="text_please_choose_a_script">请选择脚本</string>
<string name="text_please_input_name">请输入名称</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">请稍候...</string>
<string name="text_pointer_location">指针位置</string>
<string name="text_pointer_location_toggle_failed_with_hint">切换 \"指针位置\" 显示状态失败\n可能缺少 root 权限</string>
<string name="text_post_notifications_permission">发布通知权限</string>
@@ -825,6 +846,7 @@
<string name="text_press_again_to_exit">再按一次退出应用</string>
<string name="text_press_back_or_vol_down_to_close_window">如需关闭窗口, 可按 \"返回键\" 或 \"音量减键\"</string>
<string name="text_preview">预览</string>
<string name="text_process_log">流程日志</string>
<string name="text_processing">处理中</string>
<string name="text_project">项目</string>
<string name="text_project_location">项目位置</string>
@@ -1002,6 +1024,7 @@
<string name="text_view">查看</string>
<string name="text_view_docs">查看文档</string>
<string name="text_vsc_ext_version_not_meet_requirement">VSCode 插件版本不符合要求</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">正在等待全部数据处理完毕...</string>
<string name="text_weekly_task">每周任务</string>
<string name="text_weekly_task_should_check_day_of_week">需至少选择一天</string>
<string name="text_working_dir_path">工作路径</string>

View File

@@ -1,6 +1,11 @@
<resources>
<plurals name="text_items_total_sum">
<item quantity="one">Total %d item</item>
<item quantity="other">Total %d items</item>
</plurals>
<plurals name="text_items_total_sum_with_colon">
<item quantity="one">Total: %d item</item>
<item quantity="other">Total: %d items</item>
</plurals>

View File

@@ -504,6 +504,25 @@
<string name="hint_loop_delay">Delay before loop</string>
<string name="hint_loop_times">0 for infinite loop</string>
<string name="label_latest_used_time">Latest used: %1$s</string>
<string name="logger_ver_history_blob_thread_failure">\"Blob\" thread request failed</string>
<string name="logger_ver_history_blob_thread_success">\"Blob\" thread request successful, writing offline cache</string>
<string name="logger_ver_history_data_loaded">Data loaded</string>
<string name="logger_ver_history_initial_content_chosen">Chosen initial content</string>
<string name="logger_ver_history_insert_new_entries">Inserting new entries</string>
<string name="logger_ver_history_load_local_data">Loading local data</string>
<string name="logger_ver_history_local_asset_file">Local asset file</string>
<string name="logger_ver_history_local_asset_latest">Local asset file is latest version</string>
<string name="logger_ver_history_local_data_empty">Local data is empty</string>
<string name="logger_ver_history_local_data_newer_stop_online">Local data is newer, stop analyzing online data</string>
<string name="logger_ver_history_no_processing_needed">No processing needed</string>
<string name="logger_ver_history_offline_cache_file">Offline cache file</string>
<string name="logger_ver_history_offline_cache_latest">Offline cache file is latest version</string>
<string name="logger_ver_history_overwrite_date">Overwriting date content</string>
<string name="logger_ver_history_overwrite_update_record">Overwriting update record</string>
<string name="logger_ver_history_raw_thread_failure">\"Raw\" thread request failed</string>
<string name="logger_ver_history_raw_thread_success">\"Raw\" thread request successful, writing offline cache</string>
<string name="logger_ver_history_start_blob_thread">Starting \"blob\" fallback request thread</string>
<string name="logger_ver_history_start_raw_thread">Starting \"raw\" request thread</string>
<string name="media_info_album_label">Album</string>
<string name="media_info_aspect_ratio_label">Aspect ratio</string>
<string name="media_info_audio_format_label">Audio</string>
@@ -647,6 +666,7 @@
<string name="text_captured_window_info_type_of_split_screen_divider">Split Screen Divider</string>
<string name="text_captured_window_info_type_of_system">System</string>
<string name="text_captured_window_info_type_unknown">Unknown type</string>
<string name="text_category_filter">Category filter</string>
<string name="text_change_working_dir">Change working directory</string>
<string name="text_changelog_item_dependency">Some dependency or local library version adjustments</string>
<string name="text_check_for_updates">Check for updates</string>
@@ -1043,6 +1063,7 @@
<string name="text_please_choose">Please choose</string>
<string name="text_please_choose_a_script">Choose a script</string>
<string name="text_please_input_name">Input name</string>
<string name="text_please_wait" tools:ignore="TypographyEllipsis">Please wait...</string>
<string name="text_pointer_location">Pointer location</string>
<string name="text_pointer_location_toggle_failed_with_hint">Toggle \"pointer location\" failed.\nRoot access is required.</string>
<string name="text_post_notifications_permission">Post notifications</string>
@@ -1054,6 +1075,7 @@
<string name="text_press_again_to_exit">Press again to exit</string>
<string name="text_press_back_or_vol_down_to_close_window">To close, press \"Back\" or \"Volume Down\"</string>
<string name="text_preview">Preview</string>
<string name="text_process_log">Process log</string>
<string name="text_processing">Processing</string>
<string name="text_project">Project</string>
<string name="text_project_location">Project location</string>
@@ -1231,6 +1253,7 @@
<string name="text_view">View</string>
<string name="text_view_docs">View documents</string>
<string name="text_vsc_ext_version_not_meet_requirement">The version of the VSCode extension does not meet the requirements</string>
<string name="text_waiting_for_all_data_processing_to_complete" tools:ignore="TypographyEllipsis">Waiting for all data processing to complete...</string>
<string name="text_weekly_task">Weekly task</string>
<string name="text_weekly_task_should_check_day_of_week">At least one day must be selected</string>
<string name="text_working_dir_path">Working directory path</string>

View File

@@ -221,7 +221,7 @@
app:title="@string/text_manage_ignored_updates"
app:longClickPrompt="@string/description_manage_ignored_updates_preference" />
<org.autojs.autojs.ui.settings.VersionHistoriesPreference
<org.autojs.autojs.ui.settings.VersionHistoryPreference
app:layout="@layout/preference_custom"
app:key="@string/key_version_histories"
app:title="@string/text_version_histories"