From ecb1cf93b7757c986b35fb5add8d2912e94ef514 Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Sat, 10 Oct 2026 03:53:20 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=AC=EB=9F=AC=20=EC=9E=A5=20AI=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=9D=98=20=EC=A7=84=ED=96=89=20=EC=A4=84:=20"10?= =?UTF-8?q?=EC=9E=A5=20=EC=A4=91=203=EC=9E=A5=EC=A7=B8=20=C2=B7=20?= =?UTF-8?q?=EB=82=A8=EC=9D=80=20=EC=95=BD=20=E2=80=A6"=20(161)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 폴더 · ZIP 전체 해상도 올리기와 AI 그림 여러 장. Android 진행 알림 · 작업 현황 · AI 그림 화면에 같은 줄. 제목에 붙이던 "3/10" · "남은 n장" 대신 AiJobs.total 로 센다. ai_upscale_test. Co-Authored-By: Claude Opus 5.5 --- assets/l10n/en.json | 1 + assets/l10n/ja.json | 1 + assets/l10n/zh-Hans.json | 1 + lib/app/ai_local.dart | 11 +++++++++-- test/ai_upscale_test.dart | 4 ++++ 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/assets/l10n/en.json b/assets/l10n/en.json index a4d0833..a33a7b2 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -379,6 +379,7 @@ "{0}장 모두 해상도 올리기": "Upscale all {0} pages", "{0}장 저장: {1}": "{0} saved: {1}", "{0}장 중 {1}장에서 멈췄습니다": "Stopped after {1} of {0}", + "{0}장 중 {1}장째": "{1} of {0}", "{0}장은 실패했습니다": "{0} failed", "{0}장을 올려 저장했습니다{1}": "Upscaled and saved {0}{1}", "{0}줄": "{0} lines", diff --git a/assets/l10n/ja.json b/assets/l10n/ja.json index e929323..d62f3ef 100644 --- a/assets/l10n/ja.json +++ b/assets/l10n/ja.json @@ -379,6 +379,7 @@ "{0}장 모두 해상도 올리기": "{0} ページすべてを高解像度化", "{0}장 저장: {1}": "{0} 枚保存: {1}", "{0}장 중 {1}장에서 멈췄습니다": "{0} 枚中 {1} 枚で停止しました", + "{0}장 중 {1}장째": "{0} 枚中 {1} 枚目", "{0}장은 실패했습니다": "{0} ページは失敗しました", "{0}장을 올려 저장했습니다{1}": "{0} ページを高解像度化して保存しました{1}", "{0}줄": "{0}行", diff --git a/assets/l10n/zh-Hans.json b/assets/l10n/zh-Hans.json index a24a62f..bd1d11d 100644 --- a/assets/l10n/zh-Hans.json +++ b/assets/l10n/zh-Hans.json @@ -379,6 +379,7 @@ "{0}장 모두 해상도 올리기": "提高全部 {0} 页的分辨率", "{0}장 저장: {1}": "已保存 {0} 张: {1}", "{0}장 중 {1}장에서 멈췄습니다": "共 {0} 张,在第 {1} 张后停止", + "{0}장 중 {1}장째": "第 {1} 张,共 {0} 张", "{0}장은 실패했습니다": "{0} 页失败", "{0}장을 올려 저장했습니다{1}": "已提高并保存 {0} 页{1}", "{0}줄": "{0} 行", diff --git a/lib/app/ai_local.dart b/lib/app/ai_local.dart index 7fc2578..77f433e 100644 --- a/lib/app/ai_local.dart +++ b/lib/app/ai_local.dart @@ -567,6 +567,7 @@ class AiJobs extends ChangeNotifier { void start(String t, ImageAiEngine engine, int count) { title = t; _engine = engine; + total = count; remaining = count; progress = 0; eta = null; @@ -590,6 +591,7 @@ class AiJobs extends ChangeNotifier { inUse = const {}; title = null; progress = null; + total = 0; remaining = 0; eta = null; _engine = null; @@ -611,6 +613,7 @@ class AiJobs extends ChangeNotifier { lastDoneDir = null; var stop = false; this.title = title; + total = count; remaining = count; progress = 0; eta = null; @@ -630,7 +633,6 @@ class AiJobs extends ChangeNotifier { progress: overall, remaining: count - i, eta: overall > 0.02 ? spent * ((1 - overall) / overall) : null, - title: '$title ${i + 1}/$count', ); }); done++; @@ -682,9 +684,14 @@ class AiJobs extends ChangeNotifier { final t = title; if (t == null) return null; final left = eta == null ? '' : ' · ${trf('남은 약 {0}', [_dur(eta!)])}'; - return '$t${remaining > 1 ? ' · ${trf('남은 {0}장', [remaining])}' : ''}$left'; + // 161: 여러 장이면 "10장 중 3장째" (알림 · 작업 현황 · 그림 화면) + final at = total > 1 ? ' · ${trf('{0}장 중 {1}장째', [total, (total - remaining + 1).clamp(1, total)])}' : ''; + return '$t$at$left'; } + /// 161: 이번 작업의 장 수 (남은 장 [remaining] 과 함께 "n장 중 m장째") + int total = 0; + static String durationText(Duration d) => _dur(d); static String _dur(Duration d) => d.inMinutes >= 1 ? trf('{0}분', [d.inMinutes + (d.inSeconds % 60 >= 30 ? 1 : 0)]) : trf('{0}초', [d.inSeconds]); diff --git a/test/ai_upscale_test.dart b/test/ai_upscale_test.dart index 107d5d4..451d5cd 100644 --- a/test/ai_upscale_test.dart +++ b/test/ai_upscale_test.dart @@ -56,14 +56,18 @@ void main() { test('121: 여러 장 작업 - 진행 · 남은 장 · 취소하면 지금 장에서 멈춤', () async { final jobs = AiJobs.instance; final seen = []; + final lines = []; var cancelled = 0; final done = await jobs.runTask('올리기', 5, (i, progress) async { progress(0.5); seen.add(jobs.remaining); + lines.add(jobs.statusLine); if (i == 2) jobs.cancel(); }, onCancel: () => cancelled++); expect(done, 3); expect(seen, [5, 4, 3]); + // 161: 알림 · 작업 현황에 "5장 중 m장째" + expect(lines.map((l) => l!.split(' · ').take(2).join(' · ')), ['올리기 · 5장 중 1장째', '올리기 · 5장 중 2장째', '올리기 · 5장 중 3장째']); expect(cancelled, 1); expect(jobs.busy, isFalse); });