6.6.3 - Alpha - 版本历史功能采用本地缓存优先, 联网补充更新的策略, 且支持类型筛选及流程日志显示
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
34
app/src/main/java/org/autojs/autojs/util/ProcessLogger.kt
Normal file
34
app/src/main/java/org/autojs/autojs/util/ProcessLogger.kt
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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 n’accepte que %d argument</item>
|
||||
<item quantity="many">La méthode n’accepte que %d arguments</item>
|
||||
<item quantity="other">La méthode n’accepte que %d arguments</item>
|
||||
</plurals>
|
||||
|
||||
<plurals name="error_method_only_accepts_no_more_than_n_arguments">
|
||||
<item quantity="one">La méthode n’accepte pas plus de %d argument</item>
|
||||
<item quantity="many">La méthode n’accepte pas plus de %d arguments</item>
|
||||
<item quantity="other">La méthode n’accepte pas plus de %d arguments</item>
|
||||
</plurals>
|
||||
|
||||
<plurals name="error_method_only_accepts_no_less_than_n_arguments">
|
||||
<item quantity="one">La méthode n’accepte pas moins de %d argument</item>
|
||||
<item quantity="many">La méthode n’accepte pas moins de %d arguments</item>
|
||||
<item quantity="other">La méthode n’accepte pas moins de %d arguments</item>
|
||||
</plurals>
|
||||
|
||||
</resources>
|
||||
@@ -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>.
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user