Skip to content

Commit a7ac446

Browse files
committed
优化翻译
1 parent 17d9ed9 commit a7ac446

4 files changed

Lines changed: 64 additions & 24 deletions

File tree

assets/translations/en.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,5 +562,12 @@
562562
"mute": "Mute",
563563
"copy_danmaku": "Copy Danmaku",
564564
"no_storage": "No storage permission, unable to save recorded file",
565-
"system_message": "System Message"
565+
"system_message": "System Message",
566+
"path_or_permission_error": "Recording failed: The save path does not exist, contains invalid characters, or the app lacks storage permissions. Please update the download directory in settings.",
567+
"param_error": "Parameter error. Please contact the developer for assistance.",
568+
"url_expired_404": "Recording failed: The current live stream URL has expired (404 Not Found).",
569+
"url_forbidden_403": "Recording failed: Access to the live stream was denied (403 Forbidden). The anti-leech token may have expired.",
570+
"timeout": "Recording failed: Connection to the live server timed out. Please check your network or proxy settings.",
571+
"invalid_stream_format": "Recording failed: The input stream URL format is invalid and cannot be opened.",
572+
"unknown_error": "Recording error: An unknown exception occurred, raw log: \"{error_log}\""
566573
}

assets/translations/zh.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,5 +562,12 @@
562562
"mute": "静音",
563563
"copy_danmaku": "复制弹幕",
564564
"no_storage": "没有获得存储权限,无法保存录制文件",
565-
"system_message": "系统消息"
565+
"system_message": "系统消息",
566+
"path_or_permission_error": "录制失败:保存路径不存在、包含非法字符,或软件没有存储权限。请前往设置修改下载目录。",
567+
"param_error": "参数错误,请联系开发者解决",
568+
"url_expired_404": "录制失败:当前直播源地址已失效 (404 Not Found)。",
569+
"url_forbidden_403": "录制失败:直播源拒绝访问 (403 Forbidden),防盗链可能已过期。",
570+
"timeout": "录制失败:连接直播间服务器超时,请检查网络或代理设置。",
571+
"invalid_stream_format": "录制失败:输入的直播流地址格式有误,无法打开。",
572+
"unknown_error": "录制错误:发生未知异常,底层日志:\"{error_log}\""
566573
}

lib/recorder/pages/recorder/recorder_controller.dart

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,31 @@ class RecorderController extends GetxService {
114114
break;
115115

116116
case FFmpegEventType.error:
117-
final String errorMessage = event.data['message'] ?? '录制遇到未知错误';
117+
// 1. 获取并弹出国际化后的错误提示
118+
final String errorMessage = event.data['message'] ?? i18n('unknown_error', args: {'error_log': ''});
118119
final int errorCode = event.data['code'] ?? 0;
119120
ToastUtil.show(errorMessage);
121+
120122
bool canRetry = true;
123+
121124
final bool isInitializationCrash = errorCode >= -5 && errorCode < 0;
122-
if (isInitializationCrash ||
123-
errorMessage.contains('路径不存在') ||
124-
errorMessage.contains('参数错误') ||
125-
errorMessage.contains('格式有误') ||
126-
errorMessage.contains('已失效') ||
127-
errorMessage.contains('拒绝访问')) {
128-
canRetry = false; // Kill the retry loop immediately!
125+
126+
final bool isPathOrPermissionError = errorCode == -2;
127+
128+
final String rawLogs = event.data['raw_logs'] ?? '';
129+
final bool isFatalNetworkOrParam =
130+
rawLogs.contains('404') ||
131+
rawLogs.contains('403') ||
132+
rawLogs.contains('invalid argument') ||
133+
rawLogs.contains('no such file') ||
134+
rawLogs.contains('permission denied') ||
135+
rawLogs.contains('unable to open');
136+
137+
if (isInitializationCrash || isPathOrPermissionError || isFatalNetworkOrParam) {
138+
canRetry = false;
129139
log('【Safety Intercept】Fatal error detected (Code: $errorCode). Terminating retry loop.');
130140
}
141+
131142
_onFail(task, shouldRetry: canRetry);
132143
break;
133144

lib/recorder/services/ffmpeg_service.dart

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async';
22
import 'dart:developer';
33
import 'package:flutter/services.dart';
4+
import 'package:pure_live/plugins/locale_helper.dart';
45
import 'package:pure_live/recorder/ffmpeg/ffmpeg_event.dart';
56
import 'package:pure_live/recorder/ffmpeg/ffmpeg_types.dart';
67
import 'package:ffmpeg_kit_extended_flutter/ffmpeg_kit_extended_flutter.dart';
@@ -79,21 +80,35 @@ class FFmpegService {
7980
final String logs = completedSession.getLogs() ?? '';
8081
log('FFmpeg 原始错误日志:\n$logs');
8182
final lowerLogs = logs.toLowerCase();
82-
// 根据纯文本中的关键字,为用户转换出看得懂的大白话提示
83+
errorData["raw_logs"] = lowerLogs;
84+
// 1. 路径与权限错误
8385
if (code == -2 || lowerLogs.contains('no such file') || lowerLogs.contains('permission denied')) {
84-
userFriendlyMessage = '录制失败:保存路径不存在、包含非法字符,或软件没有存储权限。请前往设置修改下载目录。';
85-
} else if (lowerLogs.contains('server returned 404') || lowerLogs.contains('invalid argument')) {
86-
userFriendlyMessage = '参数错误,请联系开发者解决';
87-
} else if (lowerLogs.contains('server returned 404') || lowerLogs.contains('http error 404')) {
88-
userFriendlyMessage = '录制失败:当前直播源地址已失效 (404 Not Found)。';
89-
} else if (lowerLogs.contains('server returned 403') || lowerLogs.contains('http error 403')) {
90-
userFriendlyMessage = '录制失败:直播源拒绝访问 (403 Forbidden),防盗链可能已过期。';
91-
} else if (lowerLogs.contains('connection timed out') || lowerLogs.contains('timed out')) {
92-
userFriendlyMessage = '录制失败:连接直播间服务器超时,请检查网络或代理设置。';
93-
} else if (lowerLogs.contains('invalid argument') || lowerLogs.contains('unable to open')) {
94-
userFriendlyMessage = '录制失败:输入的直播流地址格式有误,无法打开。';
95-
} else if (logs.trim().isNotEmpty) {
96-
userFriendlyMessage = '录制错误: ${logs.trim().split('\n').last}';
86+
userFriendlyMessage = i18n('path_or_permission_error');
87+
}
88+
// 2. 拦截 404 错误(原逻辑在此处有重复条件,现已优化合并)
89+
else if (lowerLogs.contains('server returned 404') || lowerLogs.contains('http error 404')) {
90+
userFriendlyMessage = i18n('url_expired_404');
91+
}
92+
// 3. 拦截 403 错误
93+
else if (lowerLogs.contains('server returned 403') || lowerLogs.contains('http error 403')) {
94+
userFriendlyMessage = i18n('url_forbidden_403');
95+
}
96+
// 4. 拦截连接超时
97+
else if (lowerLogs.contains('connection timed out') || lowerLogs.contains('timed out')) {
98+
userFriendlyMessage = i18n('timeout');
99+
}
100+
// 5. 拦截参数错误
101+
else if (lowerLogs.contains('invalid argument')) {
102+
userFriendlyMessage = i18n('param_error');
103+
}
104+
// 6. 拦截流地址格式无法打开
105+
else if (lowerLogs.contains('unable to open')) {
106+
userFriendlyMessage = i18n('invalid_stream_format');
107+
}
108+
// 7. 兜底未知错误:提取最后一行并使用具名参数传给国际化
109+
else if (logs.trim().isNotEmpty) {
110+
final lastLogLine = logs.trim().split('\n').last;
111+
userFriendlyMessage = i18n('unknown_error', args: {'error_log': lastLogLine});
97112
}
98113
} catch (e) {
99114
log('解析 FFmpeg 日志时发生异常: $e');

0 commit comments

Comments
 (0)