Compare commits

...

8 Commits

Author SHA1 Message Date
semantic-release-bot
350ee02e3b chore: Release v5.9.1-dev.2 [skip ci]
## [5.9.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.1...v5.9.1-dev.2) (2025-01-22)

### Bug Fixes

* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([df2d070](df2d070a43))
2025-01-22 08:26:21 +00:00
LisoUseInAIKyrios
df2d070a43 fix(YouTube - Theme): Fix 19.25 - 19.45 patch error 2025-01-22 09:23:31 +01:00
semantic-release-bot
8167aaccc8 chore: Release v5.9.1-dev.1 [skip ci]
## [5.9.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.9.1-dev.1) (2025-01-21)

### Bug Fixes

* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f4989ed](f4989ed0a5))
2025-01-21 20:23:57 +00:00
LisoUseInAIKyrios
f4989ed0a5 fix(YouTube - Theme): Replace custom seekbar gradient colors instead of disabling (#4329) 2025-01-21 21:20:19 +01:00
semantic-release-bot
8f5a0531bc chore: Release v5.9.0 [skip ci]
# [5.9.0](https://github.com/ReVanced/revanced-patches/compare/v5.8.1...v5.9.0) (2025-01-20)

### Bug Fixes

* **YouTube - Spoof video streams:** Resolve playback issues after changing from cellular to wifi ([#4277](https://github.com/ReVanced/revanced-patches/issues/4277)) ([fcad0ab](fcad0ab5bb))
* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([d85bcc3](d85bcc3c16))

### Features

* **YouTube - Hide feed components:** Handle new type of surveys ([#4295](https://github.com/ReVanced/revanced-patches/issues/4295)) ([e5e897d](e5e897de77))
* **YouTube - Playback speed:** Add option to change 2x tap and hold speed ([#4307](https://github.com/ReVanced/revanced-patches/issues/4307)) ([0615990](0615990138))
* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([064b859](064b859d39))
2025-01-20 11:18:05 +00:00
LisoUseInAIKyrios
622554de14 chore: Merge branch dev to main (#4280) 2025-01-20 13:14:47 +02:00
github-actions[bot]
66e330ffe6 chore: Sync translations (#4319) 2025-01-20 12:14:23 +01:00
LisoUseInAIKyrios
2afcd3d63d chore: Change localized string log to warning 2025-01-20 11:52:31 +01:00
10 changed files with 173 additions and 48 deletions

View File

@@ -1,3 +1,32 @@
## [5.9.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.9.1-dev.1...v5.9.1-dev.2) (2025-01-22)
### Bug Fixes
* **YouTube - Theme:** Fix 19.25 - 19.45 patch error ([5b47a5f](https://github.com/ReVanced/revanced-patches/commit/5b47a5f0f6299daaae209341064fd85f16ca18a6))
## [5.9.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.9.0...v5.9.1-dev.1) (2025-01-21)
### Bug Fixes
* **YouTube - Theme:** Replace custom seekbar gradient colors instead of disabling ([#4329](https://github.com/ReVanced/revanced-patches/issues/4329)) ([f03da98](https://github.com/ReVanced/revanced-patches/commit/f03da983051021e0c372557a5354d5d967409564))
# [5.9.0](https://github.com/ReVanced/revanced-patches/compare/v5.8.1...v5.9.0) (2025-01-20)
### Bug Fixes
* **YouTube - Spoof video streams:** Resolve playback issues after changing from cellular to wifi ([#4277](https://github.com/ReVanced/revanced-patches/issues/4277)) ([e93e1c8](https://github.com/ReVanced/revanced-patches/commit/e93e1c8ec3367e941034e9c4e3725ec1db429a60))
* **YouTube - Spoof video streams:** Update client user-agent ([#4304](https://github.com/ReVanced/revanced-patches/issues/4304)) ([7917871](https://github.com/ReVanced/revanced-patches/commit/7917871f510b6b805370ef98a0cf8a4e2df0e900))
### Features
* **YouTube - Hide feed components:** Handle new type of surveys ([#4295](https://github.com/ReVanced/revanced-patches/issues/4295)) ([c770e03](https://github.com/ReVanced/revanced-patches/commit/c770e03f3801367cb531af860fbdfa43dca89af0))
* **YouTube - Playback speed:** Add option to change 2x tap and hold speed ([#4307](https://github.com/ReVanced/revanced-patches/issues/4307)) ([02fb26e](https://github.com/ReVanced/revanced-patches/commit/02fb26e9458fb8635d497e6e78f964055244d738))
* **YouTube - Settings:** Add option to use new Cairo settings menus ([#4305](https://github.com/ReVanced/revanced-patches/issues/4305)) ([7b8a2a2](https://github.com/ReVanced/revanced-patches/commit/7b8a2a2721ab5351f8c0251401aceddf0c5327df))
# [5.9.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.9.0-dev.3...v5.9.0-dev.4) (2025-01-20)

View File

@@ -25,20 +25,25 @@ public final class SeekbarColorPatch {
private static final int ORIGINAL_SEEKBAR_COLOR = 0xFFFF0000;
/**
* Default colors of the gradient seekbar.
* Feed default colors of the gradient seekbar.
*/
private static final int[] ORIGINAL_SEEKBAR_GRADIENT_COLORS = { 0xFFFF0033, 0xFFFF2791 };
private static final int[] FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS = { 0xFFFF0033, 0xFFFF2791 };
/**
* Default positions of the gradient seekbar.
* Feed default positions of the gradient seekbar.
*/
private static final float[] ORIGINAL_SEEKBAR_GRADIENT_POSITIONS = { 0.8f, 1.0f };
private static final float[] FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS = { 0.8f, 1.0f };
/**
* Default YouTube seekbar color brightness.
*/
private static final float ORIGINAL_SEEKBAR_COLOR_BRIGHTNESS;
/**
* Empty seekbar gradient, if hide seekbar in feed is enabled.
*/
private static final int[] HIDDEN_SEEKBAR_GRADIENT_COLORS = { 0x00000000, 0x00000000 };
/**
* If {@link Settings#SEEKBAR_CUSTOM_COLOR} is enabled,
* this is the color value of {@link Settings#SEEKBAR_CUSTOM_COLOR_VALUE}.
@@ -51,6 +56,11 @@ public final class SeekbarColorPatch {
*/
private static final float[] customSeekbarColorHSV = new float[3];
/**
* Custom seekbar color, used for linear gradient replacements.
*/
private static final int[] customSeekbarColorInt = new int[2];
static {
float[] hsv = new float[3];
Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv);
@@ -58,6 +68,8 @@ public final class SeekbarColorPatch {
if (SEEKBAR_CUSTOM_COLOR_ENABLED) {
loadCustomSeekbarColor();
Arrays.fill(customSeekbarColorInt, seekbarColor);
}
}
@@ -76,15 +88,6 @@ public final class SeekbarColorPatch {
return seekbarColor;
}
/**
* Injection point
*/
public static boolean playerSeekbarGradientEnabled(boolean original) {
if (SEEKBAR_CUSTOM_COLOR_ENABLED) return false;
return original;
}
/**
* Injection point
*/
@@ -165,6 +168,36 @@ public final class SeekbarColorPatch {
return colorValue;
}
/**
* Injection point.
*/
public static int[] getLinearGradient(int[] original) {
if (Settings.HIDE_SEEKBAR_THUMBNAIL.get()) {
return HIDDEN_SEEKBAR_GRADIENT_COLORS;
}
return SEEKBAR_CUSTOM_COLOR_ENABLED
? customSeekbarColorInt
: original;
}
private static String colorArrayToHex(int[] colors) {
final int length = colors.length;
StringBuilder builder = new StringBuilder(length * 10);
builder.append("[");
int i = 0;
for (int color : colors) {
builder.append(String.format("#%X", color));
if (++i < length) {
builder.append(", ");
}
}
builder.append("]");
return builder.toString();
}
/**
* Injection point.
*/
@@ -174,15 +207,15 @@ public final class SeekbarColorPatch {
if (SEEKBAR_CUSTOM_COLOR_ENABLED || hideSeekbar) {
// Most litho usage of linear gradients is hooked here,
// so must only change if the values are those for the seekbar.
if (Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
&& Arrays.equals(ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions)) {
if ((Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_COLORS, colors)
&& Arrays.equals(FEED_ORIGINAL_SEEKBAR_GRADIENT_POSITIONS, positions))) {
Arrays.fill(colors, hideSeekbar
? 0x00000000
: seekbarColor);
return;
}
Logger.printDebug(() -> "Ignoring gradient colors: " + Arrays.toString(colors)
Logger.printDebug(() -> "Ignoring gradient colors: " + colorArrayToHex(colors)
+ " positions: " + Arrays.toString(positions));
}
}

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.9.0-dev.4
version = 5.9.1-dev.2

View File

@@ -1365,6 +1365,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat
public static final fun is_19_43_or_greater ()Z
public static final fun is_19_46_or_greater ()Z
public static final fun is_19_47_or_greater ()Z
public static final fun is_19_49_or_greater ()Z
}
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {

View File

@@ -10,8 +10,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.preference.TextPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityFingerprint
@@ -30,7 +29,7 @@ private val swipeControlsResourcePatch = resourcePatch {
execute {
addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch")
if (is_19_25_or_greater) {
if (is_19_43_or_greater) {
PreferenceScreen.SWIPE_CONTROLS.addPreferences(
SwitchPreference("revanced_swipe_change_video")
)
@@ -114,7 +113,7 @@ val swipeControlsPatch = bytecodePatch(
// region patch to enable/disable swipe to change video.
if (is_19_23_or_greater) {
if (is_19_43_or_greater) {
swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride(
SWIPE_CHANGE_VIDEO_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z"

View File

@@ -34,21 +34,55 @@ internal val shortsSeekbarColorFingerprint = fingerprint {
literal { reelTimeBarPlayedColorId }
}
internal const val PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG = 45617850L
internal val playerSeekbarGradientConfigFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Z")
parameters()
literal { PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG }
}
internal val lithoLinearGradientFingerprint = fingerprint {
accessFlags(AccessFlags.STATIC)
returns("Landroid/graphics/LinearGradient;")
parameters("F", "F", "F", "F", "[I", "[F")
}
/**
* 19.49+
*/
internal val playerLinearGradientFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
parameters("I", "I", "I", "I", "Landroid/content/Context;", "I")
returns("Landroid/graphics/LinearGradient;")
opcodes(
Opcode.FILLED_NEW_ARRAY,
Opcode.MOVE_RESULT_OBJECT
)
literal { ytYoutubeMagentaColorId }
}
/**
* 19.46 - 19.47
*/
internal val playerLinearGradientLegacy1946Fingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("I", "I", "I", "I")
returns("V")
opcodes(
Opcode.FILLED_NEW_ARRAY,
Opcode.MOVE_RESULT_OBJECT
)
custom { method, _ ->
method.name == "setBounds" && method.containsLiteralInstruction(ytYoutubeMagentaColorId)
}
}
/**
* 19.25 - 19.45
*/
internal val playerLinearGradientLegacy1925Fingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("Landroid/content/Context;")
opcodes(
Opcode.FILLED_NEW_ARRAY,
Opcode.MOVE_RESULT_OBJECT
)
literal { ytYoutubeMagentaColorId }
}
internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L
internal val launchScreenLayoutTypeFingerprint = fingerprint {

View File

@@ -15,6 +15,7 @@ import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
@@ -39,6 +40,8 @@ internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L
private set
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
private set
internal var ytYoutubeMagentaColorId = -1L
private set
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
@@ -62,6 +65,10 @@ private val seekbarColorResourcePatch = resourcePatch {
"color",
"inline_time_bar_played_not_highlighted_color",
]
ytYoutubeMagentaColorId = resourceMappings[
"color",
"yt_youtube_magenta",
]
// Modify the resume playback drawable and replace the progress bar with a custom drawable.
document("res/drawable/resume_playback_progressbar_drawable.xml").use { document ->
@@ -182,6 +189,7 @@ val seekbarColorPatch = bytecodePatch(
sharedExtensionPatch,
lithoColorHookPatch,
seekbarColorResourcePatch,
versionCheckPatch
)
execute {
@@ -229,16 +237,34 @@ val seekbarColorPatch = bytecodePatch(
// 19.25+ changes
playerSeekbarGradientConfigFingerprint.method.insertFeatureFlagBooleanOverride(
PLAYER_SEEKBAR_GRADIENT_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->playerSeekbarGradientEnabled(Z)Z"
)
lithoLinearGradientFingerprint.method.addInstruction(
0,
"invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->setLinearGradient([I[F)V"
)
val playerFingerprint =
if (is_19_49_or_greater) {
playerLinearGradientFingerprint
} else if (is_19_46_or_greater) {
playerLinearGradientLegacy1946Fingerprint
} else {
playerLinearGradientLegacy1925Fingerprint
}
playerFingerprint.let {
it.method.apply {
val index = it.patternMatch!!.endIndex
val register = getInstruction<OneRegisterInstruction>(index).registerA
addInstructions(
index + 1,
"""
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getLinearGradient([I)[I
move-result-object v$register
"""
)
}
}
// region apply seekbar custom color to splash screen animation.

View File

@@ -41,6 +41,8 @@ var is_19_46_or_greater = false
private set
var is_19_47_or_greater = false
private set
var is_19_49_or_greater = false
private set
val versionCheckPatch = resourcePatch(
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
@@ -74,5 +76,6 @@ val versionCheckPatch = resourcePatch(
is_19_43_or_greater = 244405000 <= playStoreServicesVersion
is_19_46_or_greater = 244705000 <= playStoreServicesVersion
is_19_47_or_greater = 244799000 <= playStoreServicesVersion
is_19_49_or_greater = 245005000 <= playStoreServicesVersion
}
}

View File

@@ -24,31 +24,31 @@ class StringResource(
if (value.startsWith('"') && value.endsWith('"')) {
// Raw strings allow unescaped single quote but not double quote.
if (!value.substring(1, value.length - 1).contains(Regex("(?<!\\\\)[\"]"))) {
return this;
return this
}
} else {
if (value.contains('\n')) {
// Don't throw an exception, otherwise unnoticed mistakes
// in Crowdin can cause patching failures.
// Incorrectly escaped strings still work but do not display as intended.
Logger.getLogger(StringResource.javaClass.name).severe(
Logger.getLogger(StringResource.javaClass.name).warning(
"String $name is not raw but contains encoded new line characters: $value")
}
if (!value.contains(Regex("(?<!\\\\)['\"]"))) {
return this;
return this
}
}
Logger.getLogger(StringResource.javaClass.name).severe(
Logger.getLogger(StringResource.javaClass.name).warning(
"String $name cannot contain unescaped quotes in value: $value")
return this;
return this
}
// if the string is un-formatted, explicitly add the formatted attribute
if (!formatted) setAttribute("formatted", "false")
textContent = value.validateAndroidStringEscaping();
textContent = value.validateAndroidStringEscaping()
}
companion object {

View File

@@ -25,7 +25,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_failed_title">檢查失敗</string>
<string name="revanced_check_environment_dialog_open_official_source_button">開啟官方網站</string>
<string name="revanced_check_environment_dialog_ignore_button">忽略</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;這個應用程式似乎並非由修補。&lt;/h5&gt;&lt;br&gt;這個應用程式可能無法正常運作,&lt;b&gt;可能有害甚至存在危險。&lt;/b&gt;&lt;br&gt;&lt;br&gt;這些檢查表明該應用程式是預先修補的或來自其他來源:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;強烈建議&lt;b&gt;解除安裝此應用程式並自行修補&lt;/b&gt;,以確保使用的是經過驗證且安全的應用程式。&lt;p&gt;&lt;br&gt;如果忽略,此警告僅會顯示兩次。&lt;2&gt;</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;這個應用程式似乎並非由修補。&lt;/h5&gt;&lt;br&gt;這個應用程式可能無法正常運作,&lt;b&gt;可能有害甚至存在危險。&lt;/b&gt;&lt;br&gt;&lt;br&gt;這些檢查表明該應用程式是預先修補的或來自其他來源:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;強烈建議&lt;b&gt;解除安裝此應用程式並自行修補&lt;/b&gt;,以確保使用的是經過驗證且安全的應用程式。&lt;p&gt;&lt;br&gt;如果忽略,此警告僅會顯示兩次。&lt;2&gt;</string>
<string name="revanced_check_environment_not_same_patching_device">在其他裝置上修補</string>
<string name="revanced_check_environment_manager_not_expected_installer">不是由 ReVanced Manager 安裝</string>
<string name="revanced_check_environment_not_near_patch_time">修補時間超過 10 分鐘</string>
@@ -105,7 +105,7 @@ Second \"item\" text"</string>
<!-- Settings about dialog. -->
<string name="revanced_settings_about_links_body">您正在使用 ReVanced 修補版本 &lt;i&gt;%s&lt;/i&gt;</string>
<string name="revanced_settings_about_links_dev_header">注意</string>
<string name="revanced_settings_about_links_dev_body">這個版本為預先發布版,可能會遇到非預期的問題。</string>
<string name="revanced_settings_about_links_dev_body">這個版本為預先發布版,可能會遇到非預期的問題。</string>
<string name="revanced_settings_about_links_header">官方連結</string>
<!-- NOTE: the about strings above are duplicated in the TikTok about screen code,
and changes made here must also be made there. -->
@@ -116,7 +116,7 @@ Second \"item\" text"</string>
<string name="gms_core_dialog_title">需要採取行動</string>
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"MicroG GmsCore 沒有權限在背景執行。
請按照手機的「不要關閉我的應用程式」指南,並將說明套用於的 MicroG 安裝。
請按照手機的「不要關閉我的應用程式」指南,並將說明套用於的 MicroG 安裝。
這項設定是應用程式運作的必要條件。"</string>
<string name="gms_core_dialog_open_website_text">開啟網站</string>
@@ -167,7 +167,7 @@ Second \"item\" text"</string>
<string name="revanced_debug_toast_on_error_summary_off">若發生錯誤,不顯示提示</string>
<string name="revanced_debug_toast_on_error_user_dialog_message">"關閉錯誤訊息提示會隱藏所有 ReVanced 的錯誤通知。
將不會收到任何非預期事件的通知。"</string>
將不會收到任何非預期事件的通知。"</string>
</patch>
<patch id="layout.hide.general.hideLayoutComponentsPatch">
<string name="revanced_disable_like_subscribe_glow_title">停用「喜歡」和「訂閱」按鈕的發光效果</string>
@@ -342,7 +342,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_doodles_summary_off">已顯示位於搜尋欄的 Doodles </string>
<string name="revanced_hide_doodles_user_dialog_message">"YouTube Doodles 每年會顯示幾天。
如果塗鴉目前在所在國家/地區顯示,而且此隱藏設定處於啟用狀態,搜尋列下方顯示的篩選列也會隱藏。"</string>
如果塗鴉目前在所在國家/地區顯示,而且此隱藏設定處於啟用狀態,搜尋列下方顯示的篩選列也會隱藏。"</string>
<string name="revanced_custom_filter_screen_title">自訂篩選器</string>
<string name="revanced_custom_filter_screen_summary">使用自訂篩選器隱藏元件</string>
<string name="revanced_custom_filter_title">啟用自訂篩選器</string>
@@ -942,7 +942,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_settings_ie">匯入/匯出設定</string>
<string name="revanced_sb_settings_copy">複製</string>
<string name="revanced_sb_settings_ie_sum">您的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台</string>
<string name="revanced_sb_settings_ie_sum_warning">的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台。這個檔案包含的個人使用者 ID。請小心使用。</string>
<string name="revanced_sb_settings_ie_sum_warning">的 SponsorBlock JSON 設定可以匯入/匯出到 ReVanced 和其他 SponsorBlock 平台。這個檔案包含的個人使用者 ID。請小心使用。</string>
<string name="revanced_sb_settings_import_successful">已成功匯入設定</string>
<string name="revanced_sb_settings_import_failed">無法匯入:%s</string>
<string name="revanced_sb_settings_export_failed">無法匯出:%s</string>
@@ -1061,7 +1061,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_stats_username_changed">使用者名稱變更成功</string>
<string name="revanced_sb_stats_reputation">你的評價是 &lt;b&gt;%.2f&lt;/b&gt;</string>
<string name="revanced_sb_stats_submissions">你已建立 &lt;b&gt;%s&lt;/b&gt; 個片段</string>
<string name="revanced_sb_stats_submissions_sum">輕觸這裡查看的片段</string>
<string name="revanced_sb_stats_submissions_sum">輕觸這裡查看的片段</string>
<string name="revanced_sb_stats_saved_zero">SponsorBlock 排行榜</string>
<string name="revanced_sb_stats_saved">您已為人們省下了觀看 &lt;b&gt;%s&lt;/b&gt; 個片段的時間</string>
<string name="revanced_sb_stats_saved_sum_zero">輕觸這裡查看全球統計資料和最佳貢獻者</string>