diff --git a/assets/l10n/en.json b/assets/l10n/en.json index 1f697b2..3bea859 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -9,6 +9,7 @@ " (바뀐 날 같음)": " (same modified time)", " (보낼 것이 더 새것)": " (the one being sent is newer)", " (보통)": " (normal)", + " (보통과 같음)": " (same as Normal)", " (사용 불가)": " (unavailable)", " (있는 것이 더 새것)": " (the existing one is newer)", " (자막 {0}개 함께)": " ({0} subtitles moved too)", @@ -1458,6 +1459,7 @@ "이 기기에서는 AI 번역을 쓸 수 없습니다.": "AI translation is not available on this device.", "이 기기에서는 AI 엔진을 찾지 못했습니다. 앱을 다시 설치해 보세요": "The AI engine was not found on this device. Try reinstalling the app", "이 기기에서는 쓸 수 없는 컴포넌트입니다": "This component is not available on this device", + "이 기기에서는 적게 · 보통 · 많이 가 모두 같습니다: {0} (메모리가 작아 가장 작은 타일)": "On this device Low · Normal · High are all the same: {0} (smallest tile because memory is small)", "이 기기용 파일 없음": "No file for this device", "이 기기의 CPU 가 이 AI 엔진을 지원하지 않습니다": "This device's CPU does not support this AI engine", "이 기기의 안전 저장소를 쓸 수 없어 비밀번호를 저장하지 못했습니다": "Couldn't save the password because this device's secure storage is unavailable", diff --git a/assets/l10n/ja.json b/assets/l10n/ja.json index 8fccf17..22b6828 100644 --- a/assets/l10n/ja.json +++ b/assets/l10n/ja.json @@ -9,6 +9,7 @@ " (바뀐 날 같음)": " (更新日時が同じ)", " (보낼 것이 더 새것)": " (送る方が新しい)", " (보통)": "(標準)", + " (보통과 같음)": " (普通と同じ)", " (사용 불가)": "(使用不可)", " (있는 것이 더 새것)": " (既存の方が新しい)", " (자막 {0}개 함께)": "(字幕 {0}個も一緒に)", @@ -1458,6 +1459,7 @@ "이 기기에서는 AI 번역을 쓸 수 없습니다.": "この端末では AI 翻訳を使えません。", "이 기기에서는 AI 엔진을 찾지 못했습니다. 앱을 다시 설치해 보세요": "この端末で AI エンジンが見つかりませんでした。アプリを再インストールしてください", "이 기기에서는 쓸 수 없는 컴포넌트입니다": "この端末では使えないコンポーネントです", + "이 기기에서는 적게 · 보통 · 많이 가 모두 같습니다: {0} (메모리가 작아 가장 작은 타일)": "この機器では少なめ · 普通 · 多めはすべて同じです: {0} (メモリが少ないため最小のタイル)", "이 기기용 파일 없음": "このデバイス用のファイルなし", "이 기기의 CPU 가 이 AI 엔진을 지원하지 않습니다": "この端末の CPU はこの AI エンジンに対応していません", "이 기기의 안전 저장소를 쓸 수 없어 비밀번호를 저장하지 못했습니다": "この端末の安全な保存領域を使えないため、パスワードを保存できませんでした", diff --git a/assets/l10n/zh-Hans.json b/assets/l10n/zh-Hans.json index 57960e7..1f464b8 100644 --- a/assets/l10n/zh-Hans.json +++ b/assets/l10n/zh-Hans.json @@ -9,6 +9,7 @@ " (바뀐 날 같음)": "(修改时间相同)", " (보낼 것이 더 새것)": "(要发送的较新)", " (보통)": "(标准)", + " (보통과 같음)": "(与普通相同)", " (사용 불가)": "(不可用)", " (있는 것이 더 새것)": "(已有的较新)", " (자막 {0}개 함께)": "(字幕 {0} 个一并移动)", @@ -1458,6 +1459,7 @@ "이 기기에서는 AI 번역을 쓸 수 없습니다.": "此设备无法使用 AI 翻译。", "이 기기에서는 AI 엔진을 찾지 못했습니다. 앱을 다시 설치해 보세요": "在此设备上找不到 AI 引擎。请尝试重新安装应用", "이 기기에서는 쓸 수 없는 컴포넌트입니다": "此组件在本设备上不可用", + "이 기기에서는 적게 · 보통 · 많이 가 모두 같습니다: {0} (메모리가 작아 가장 작은 타일)": "在此设备上,少 · 普通 · 多 都相同:{0}(内存较小,使用最小的分块)", "이 기기용 파일 없음": "没有此设备的文件", "이 기기의 CPU 가 이 AI 엔진을 지원하지 않습니다": "此设备的 CPU 不支持该 AI 引擎", "이 기기의 안전 저장소를 쓸 수 없어 비밀번호를 저장하지 못했습니다": "本设备的安全存储不可用,无法保存密码", diff --git a/lib/app/ai_upscale.dart b/lib/app/ai_upscale.dart index 5a229e3..0baaf9b 100644 --- a/lib/app/ai_upscale.dart +++ b/lib/app/ai_upscale.dart @@ -92,6 +92,26 @@ int androidUpscaleTile({int? memTotalMb, int? longSide, double share = 0.30}) { return 192; } +/// 176 · 192: 환경 설정 "해상도 올리기 메모리" 의 설명 줄 - 이 기기에서 적게 · 보통 · 많이 가 고르는 타일 · 메모리. +/// 메모리가 작은 기기 (P11 4GB 등) 는 셋 다 가장 작은 타일이라 같은 값이 세 번 보였다 - 같으면 그렇다고 알린다 +List upscaleMemoryLines(int? memTotalMb) { + int tile(String id) => androidUpscaleTile(memTotalMb: memTotalMb, share: upscaleMemoryShare(id)); + String text(int t) => trf('타일 {0} · 약 {1}GB', [t, (upscaleTileMemoryMb(t) / 1024).toStringAsFixed(1)]); + final low = tile('low'), normal = tile('normal'), high = tile('high'); + final same = tr(' (보통과 같음)'); + return [ + if (memTotalMb != null) trf('이 기기 메모리 {0}GB 기준:', [(memTotalMb / 1024).toStringAsFixed(0)]), + if (low == normal && normal == high) + trf('이 기기에서는 적게 · 보통 · 많이 가 모두 같습니다: {0} (메모리가 작아 가장 작은 타일)', [text(normal)]) + else ...[ + trf('적게 (느림): {0}', [text(low)]) + (low == normal ? same : ''), + trf('보통: {0}', [text(normal)]), + trf('많이 (빠름): {0} - 다른 앱이 많이 켜져 있으면 Android 가 이 앱을 끌 수 있습니다', [text(high)]) + (high == normal ? same : ''), + ], + tr('타일이 작을수록 느립니다 (예: 16GB 폰에서 1024×768 을 2배로 - 512 약 4분 · 320 약 9분 30초).'), + ]; +} + /// 타일 크기 → 엔진이 쓸 메모리 어림 (MB, S10 실측 512 → 6.6GB 에서 넓이 비례) int upscaleTileMemoryMb(int tile) => (6600 * (tile / 512) * (tile / 512)).round(); diff --git a/lib/ui/ai_settings.dart b/lib/ui/ai_settings.dart index 695ac0a..ff653e1 100644 --- a/lib/ui/ai_settings.dart +++ b/lib/ui/ai_settings.dart @@ -15,7 +15,7 @@ import 'folder_picker.dart'; import 'license_texts.dart' show showLicenseDocument; import 'setting_tile.dart'; import 'theme.dart'; -import '../app/ai_upscale.dart' show androidUpscaleTile, upscaleMemoryShare, upscaleTileMemoryMb, deviceMemTotalMb; +import '../app/ai_upscale.dart' show deviceMemTotalMb, upscaleMemoryLines; /// 기기 안에서 그리는 데 아직 받지 않은 파일 (Windows 는 실행 파일까지, TAESD 포함) - AI 그림 화면 · 받기 화면이 같은 값을 보인다 (139) List aiMissingFiles(AiStore store) => [ @@ -75,21 +75,10 @@ class _AiSettingsState extends State { /// 176: 해상도 올리기 메모리 (적게 · 보통 · 많이) - 이 기기에서의 타일 · 예상 메모리 Widget _upMemoryTile() { final mem = deviceMemTotalMb(); - String level(String id) { - final t = androidUpscaleTile(memTotalMb: mem, share: upscaleMemoryShare(id)); - return trf('타일 {0} · 약 {1}GB', [t, (upscaleTileMemoryMb(t) / 1024).toStringAsFixed(1)]); - } - return SettingTile( leading: const Icon(Icons.memory), title: Text(tr('해상도 올리기 메모리')), - subtitle: Text([ - if (mem != null) trf('이 기기 메모리 {0}GB 기준:', [(mem / 1024).toStringAsFixed(0)]), - trf('적게 (느림): {0}', [level('low')]), - trf('보통: {0}', [level('normal')]), - trf('많이 (빠름): {0} - 다른 앱이 많이 켜져 있으면 Android 가 이 앱을 끌 수 있습니다', [level('high')]), - tr('타일이 작을수록 느립니다 (예: 16GB 폰에서 1024×768 을 2배로 - 512 약 4분 · 320 약 9분 30초).'), - ].join('\n')), + subtitle: Text(upscaleMemoryLines(mem).join('\n')), isThreeLine: true, trailing: DropdownButton( value: c.settings.aiUpMemory, diff --git a/test/upscale_job_test.dart b/test/upscale_job_test.dart index 08c0948..36b3818 100644 --- a/test/upscale_job_test.dart +++ b/test/upscale_job_test.dart @@ -58,6 +58,14 @@ void main() { expect(androidUpscaleTile(memTotalMb: 40000, share: 0.20), 512); expect(androidUpscaleTile(memTotalMb: 6000, share: 0.20), 192); expect(androidUpscaleTile(longSide: 1024), 256); + // 192: 메모리가 작은 기기 (P11 4GB, MemTotal 약 3.5GB) 는 셋 다 가장 작은 타일 - 같은 값을 세 번 보이지 않고 같다고 알린다 + final small = upscaleMemoryLines(3500); + expect(small.where((l) => l.contains('모두 같습니다')), hasLength(1)); + expect(small.where((l) => l.startsWith('적게') || l.startsWith('많이')), isEmpty); + // 16GB 는 셋이 다르다 + expect(upscaleMemoryLines(15000).where((l) => l.contains('같')), isEmpty); + // 일부만 같으면 그 줄에 (보통과 같음) + expect(upscaleMemoryLines(5000).where((l) => l.contains('(보통과 같음)')), isNotEmpty); expect(androidUpscaleTile(longSide: 800), 512); });