diff --git a/assets/l10n/en.json b/assets/l10n/en.json index bf5fc7a..a024a2b 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -72,6 +72,7 @@ "+30분": "+30 min", "- 감지한 언어": "- detected", "-1 은 아무렇게나": "-1 = random", + ".nomedia 를 지웠습니다. 갤러리 · 음악 앱에 다시 보입니다.": ".nomedia removed. Gallery and music apps will show it again.", ".{0} 재생 프로그램 (exe)": ".{0} player (exe)", "/ 로 시작하는 전체 경로로": "use a full path starting with /", "0 = 제한 없음. 모든 방법에 적용: rsync --bwlimit, 현재 방식은 앱이 조절, robocopy 는 /IPG 로 비슷하게. 옵션 칸에 직접 넣어도 됩니다 (그쪽이 우선)": "0 = unlimited. Applies to every method: rsync --bwlimit, the built-in method throttles itself, robocopy approximates with /IPG. You can also put it in the options field (that takes priority)", @@ -704,6 +705,9 @@ "개인 키를 넣었습니다 (원래 파일 경로는 저장하지 않습니다)": "Private key added (the original file path isn't saved)", "개인 키를 읽을 수 없습니다 (OpenSSH · PEM 형식)": "Can't read the private key (OpenSSH or PEM format)", "개인 키의 암호가 맞지 않습니다": "The private key passphrase is incorrect", + "갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)": "Show in gallery and music apps again (remove .nomedia)", + "갤러리 · 음악 앱에서 숨겼습니다 (.nomedia). 파일은 그대로입니다.": "Hidden from gallery and music apps (.nomedia). The files are unchanged.", + "갤러리 · 음악 앱에서 숨기기 (.nomedia)": "Hide from gallery and music apps (.nomedia)", "거꾸로": "Reverse", "거꾸로 된 범위: {0}": "Reversed range: {0}", "거른 것 {0}개도 지워집니다 (--delete-excluded)": "{0} excluded items will also be deleted (--delete-excluded)", @@ -988,6 +992,7 @@ "다시 만들기 대기로": "Back to waiting for remake", "다시 만들기 대기로 (지금 묶음이 끝난 뒤)": "Queue again to rebuild (after the current batch finishes)", "다시 받기": "Download again", + "다시 보이기": "Show again", "다시 비교": "Compare again", "다시 설치": "Reinstall", "다시 세기": "Recount", @@ -1027,6 +1032,7 @@ "다음 {0}개 기다림": "{0} more waiting", "다음 페이지": "Next page", "다음 항목 (→)": "Next item (→)", + "다음부터 묻지 않기": "Don't ask again", "다음부터 묻지 않기 (환경 설정 > 실행 에서 바꿀 수 있음)": "Don't ask again (can be changed in Settings > Run)", "단계": "Steps", "단어 첫 글자만 크게 (Abc)": "Capitalize words (Abc)", @@ -1251,6 +1257,7 @@ "목": "Thu", "목록": "list", "목록 · 영상 옆 · 영상 위에 나오는 광고 영역을 감춥니다": "Hides ad areas in lists · next to · on top of videos", + "목록 맨 아래의 [숨긴 항목 보이기] 나 환경 설정 > 파일 탐색기에서 다시 볼 수 있습니다.": "You can see them again with [Show hidden items] at the bottom of the list, or in Settings > File explorer.", "목록 보기": "View list", "목록 파일은 전체 경로로 적어 주세요: {0}": "Please write the full path of the list file: {0}", "목록 파일의 전체 경로를 적어 주세요": "write the full path of the list file", @@ -1261,6 +1268,7 @@ "목록에서 숨겼습니다 ({0}개). 파일은 그대로이고, 목록 맨 아래의 [숨긴 항목 보이기] 로 다시 볼 수 있습니다.": "Hidden from the list ({0}). The files are unchanged - use [Show hidden items] at the bottom of the list to see them again.", "목록에서 숨겼습니다 ({0}개). 파일은 그대로입니다.": "Hidden from the list ({0}). The files are unchanged.", "목록에서 숨기기": "Hide from list", + "목록에서 숨기기 전에 묻기": "Ask before hiding from the list", "목록에서 숨긴 항목 ({0}개)": "Items hidden from the list ({0})", "목록에서 숨긴 항목 다시 숨기기": "Hide the hidden items again", "목록에서 숨긴 항목 보이기 ({0}개)": "Show items hidden from the list ({0})", @@ -1271,6 +1279,7 @@ "목록의 동영상 {0}개 모두": "All {0} videos in the list", "몽골어": "Mongolian", "무엇을 그릴지 적어 주세요": "Write what to draw", + "무엇이 바뀌는지 (목록에서만 빠지고 파일은 그대로) 확인 창을 띄웁니다": "Shows a dialog explaining what changes (removed from the list only; files stay as they are)", "무엇이 바뀌는지 비교하는 중…": "Comparing what will change…", "무한": "Unlimited", "묶기": "Compress", @@ -1303,6 +1312,7 @@ "바꾸기 ({0}개)": "Rename ({0})", "바꾸는 정도 {0}%": "Change amount {0}%", "바꾸면 바로 저장됩니다": "Saved automatically", + "바꾸지 못했습니다: {0}": "Could not change it: {0}", "바꾼 PDF 를 저장하지 못했습니다 (저장 공간을 확인해 주세요)": "Couldn't save the converted PDF (check storage space)", "바꾼 것이 없습니다 (원본 그대로)": "Nothing changed (original as is)", "바꿀 글": "Replace with", @@ -2087,6 +2097,7 @@ "이 설치본에는 rsync 가 들어 있지 않습니다 (rsync 로 복사할 때 · 오른쪽 [내려받기] 로 받습니다)": "This install has no rsync (downloaded when copying with rsync · or use [Download] on the right)", "이 설치본에는 rsync 가 들어 있지 않습니다. 직접 지정하세요.": "This install has no rsync. Choose one yourself.", "이 앱 (APK) 에는 Tor 가 들어 있지 않습니다.": "This app (APK) does not contain Tor.", + "이 앱의 파일 탐색기 목록에서만 빠집니다. 파일은 지우거나 옮기거나 이름을 바꾸지 않고, 다른 앱 · 갤러리에서는 그대로 보입니다.": "It is removed only from this app's file explorer list. Files are not deleted, moved or renamed, and other apps and the gallery still show them.", "이 언어 지우기": "Remove this language", "이 연결은 서명도 암호화도 되지 않습니다 ({0}). 같은 네트워크의 다른 사람이 파일 내용을 보거나 바꿀 수 있으니, NAS 설정에서 SMB 서명이나 SMB3 암호화를 켜는 것이 좋습니다": "This connection is neither signed nor encrypted ({0}). Others on the same network could read or change the files, so it's best to turn on SMB signing or SMB3 encryption in the NAS settings", "이 연결은 암호화되지 않습니다 ({0}). 같은 네트워크의 다른 사람이 파일 내용을 볼 수 있으니, NAS 설정에서 SMB3 암호화를 켜는 것이 좋습니다": "This connection isn't encrypted ({0}). Others on the same network could see file contents, so it's best to turn on SMB3 encryption in the NAS settings", @@ -2112,12 +2123,14 @@ "이 폴더를 볼 권한이 없습니다": "No permission to view this folder", "이 폴더를 읽을 권한이 없습니다": "No permission to read this folder", "이 폴더에 동영상이 없습니다.": "There are no videos in this folder.", + "이 폴더에 빈 .nomedia 파일을 만듭니다. 갤러리 · 음악 앱이 이 폴더 (안의 폴더 포함) 의 그림 · 동영상 · 음악을 보이지 않게 됩니다.": "Creates an empty .nomedia file in this folder. Gallery and music apps will stop showing the pictures, videos and music in this folder (including subfolders).", "이 폴더에 새 폴더": "New folder in this folder", "이 폴더에 현재 페이지 추가": "Add the current page to this folder", "이 폴더에는 고를 파일이 없습니다": "There are no files to choose in this folder", "이 폴더에는 그림 · 동영상이 없습니다": "No pictures or videos in this folder", "이 폴더에는 그림이 없습니다": "There are no images in this folder", "이 폴더에만: {0}": "This folder only: {0}", + "이 폴더의 .nomedia 파일을 지웁니다. 갤러리 · 음악 앱이 이 폴더의 그림 · 동영상 · 음악을 다시 보이게 됩니다.": "Deletes the .nomedia file in this folder. Gallery and music apps will show the pictures, videos and music in this folder again.", "이 폴더의 동영상 재생": "Play videos in this folder", "이 폴더의 파일": "Files in this folder", "이 프로그램이 관리자 권한으로 실행 중입니다. 권장하지 않습니다.\n\n· 내장 Chrome 엔진은 샌드박스 (웹 페이지를 가두는 보호) 가 꺼져 있어, 웹 페이지가 관리자 권한 프로세스 안에서 돕니다. 페이지의 취약점이 곧 이 PC 의 관리자 권한이 될 수 있습니다.\n· Edge 엔진은 이 영향이 없습니다.\n· 관리자 권한 없이 프로그램을 실행하면 이 설정 없이도 Chrome 엔진을 쓸 수 있습니다.": "This app is running as administrator. This is not recommended.\n\n· The built-in Chrome engine has its sandbox (the protection that confines web pages) turned off, so web pages run inside an administrator process. A flaw in a page could become administrator access to this PC.\n· The Edge engine is not affected.\n· If you run the app without administrator rights, you can use the Chrome engine without this setting.", @@ -2731,6 +2744,7 @@ "폴더 수정": "Edit folder", "폴더 안 파일 크기의 합을 목록에 보입니다. 큰 폴더 · NAS 는 읽는 데 오래 걸릴 수 있습니다. 길게 누르기 [폴더 크기 계산] 은 늘 됩니다": "Shows the total size of the files inside each folder. Large folders or a NAS can take a while to read. Long-press [Calculate folder size] always works", "폴더 안의 것을 맞춥니다 (대상에 같은 이름의 폴더를 새로 만들지 않음).": "Syncs the folder contents (no same-named folder is created in the target).", + "폴더 안의 파일은 바꾸지 않습니다. 갤러리에 반영되기까지 시간이 걸리거나 그 앱을 다시 열어야 할 수 있습니다.": "Files in the folder are not changed. It may take a while to show in the gallery, or you may need to reopen that app.", "폴더 열기": "Open folder", "폴더 이름": "Folder name", "폴더 이름 바꾸기 · 이동": "Rename · move folder", diff --git a/assets/l10n/ja.json b/assets/l10n/ja.json index 32b4107..88e057b 100644 --- a/assets/l10n/ja.json +++ b/assets/l10n/ja.json @@ -72,6 +72,7 @@ "+30분": "+30分", "- 감지한 언어": "- 検出した言語", "-1 은 아무렇게나": "-1 はランダム", + ".nomedia 를 지웠습니다. 갤러리 · 음악 앱에 다시 보입니다.": ".nomedia を削除しました。ギャラリー・音楽アプリに再び表示されます。", ".{0} 재생 프로그램 (exe)": ".{0} 再生プログラム(exe)", "/ 로 시작하는 전체 경로로": "/ で始まるフルパスで", "0 = 제한 없음. 모든 방법에 적용: rsync --bwlimit, 현재 방식은 앱이 조절, robocopy 는 /IPG 로 비슷하게. 옵션 칸에 직접 넣어도 됩니다 (그쪽이 우선)": "0 = 制限なし。すべての方法に適用: rsync は --bwlimit、現在の方式はアプリが調整、robocopy は /IPG で近似。オプション欄に直接入れても構いません (そちらが優先)", @@ -704,6 +705,9 @@ "개인 키를 넣었습니다 (원래 파일 경로는 저장하지 않습니다)": "秘密鍵を登録しました (元のファイルのパスは保存しません)", "개인 키를 읽을 수 없습니다 (OpenSSH · PEM 형식)": "秘密鍵を読み込めません (OpenSSH・PEM 形式)", "개인 키의 암호가 맞지 않습니다": "秘密鍵のパスフレーズが正しくありません", + "갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)": "ギャラリー・音楽アプリに再表示 (.nomedia を削除)", + "갤러리 · 음악 앱에서 숨겼습니다 (.nomedia). 파일은 그대로입니다.": "ギャラリー・音楽アプリから隠しました (.nomedia)。ファイルはそのままです。", + "갤러리 · 음악 앱에서 숨기기 (.nomedia)": "ギャラリー・音楽アプリから隠す (.nomedia)", "거꾸로": "逆順", "거꾸로 된 범위: {0}": "逆順の範囲: {0}", "거른 것 {0}개도 지워집니다 (--delete-excluded)": "除外したもの {0} 件も削除されます (--delete-excluded)", @@ -988,6 +992,7 @@ "다시 만들기 대기로": "作り直し待ちに戻す", "다시 만들기 대기로 (지금 묶음이 끝난 뒤)": "再作成待ちに戻す (今のまとめ作業が終わった後)", "다시 받기": "再ダウンロード", + "다시 보이기": "再表示", "다시 비교": "もう一度比較", "다시 설치": "再インストール", "다시 세기": "再カウント", @@ -1027,6 +1032,7 @@ "다음 {0}개 기다림": "次の {0} 件が待機中", "다음 페이지": "次のページ", "다음 항목 (→)": "次の項目 (→)", + "다음부터 묻지 않기": "次回から確認しない", "다음부터 묻지 않기 (환경 설정 > 실행 에서 바꿀 수 있음)": "次回から確認しない(環境設定 > 実行 で変更できます)", "단계": "ステップ", "단어 첫 글자만 크게 (Abc)": "単語の先頭だけ大文字 (Abc)", @@ -1251,6 +1257,7 @@ "목": "木", "목록": "一覧", "목록 · 영상 옆 · 영상 위에 나오는 광고 영역을 감춥니다": "リスト・動画の横・動画の上に出る広告エリアを隠します", + "목록 맨 아래의 [숨긴 항목 보이기] 나 환경 설정 > 파일 탐색기에서 다시 볼 수 있습니다.": "リスト最下部の [隠した項目を表示] または 設定 > ファイルエクスプローラー で再び表示できます。", "목록 보기": "リストを見る", "목록 파일은 전체 경로로 적어 주세요: {0}": "リストファイルはフルパスで書いてください: {0}", "목록 파일의 전체 경로를 적어 주세요": "リストファイルのフルパスを書いてください", @@ -1261,6 +1268,7 @@ "목록에서 숨겼습니다 ({0}개). 파일은 그대로이고, 목록 맨 아래의 [숨긴 항목 보이기] 로 다시 볼 수 있습니다.": "リストから隠しました ({0} 件)。ファイルはそのままで、リストの一番下の [隠した項目を表示] で再び見られます。", "목록에서 숨겼습니다 ({0}개). 파일은 그대로입니다.": "リストから隠しました ({0} 件)。ファイルはそのままです。", "목록에서 숨기기": "リストから隠す", + "목록에서 숨기기 전에 묻기": "リストから隠す前に確認", "목록에서 숨긴 항목 ({0}개)": "リストから隠した項目 ({0} 件)", "목록에서 숨긴 항목 다시 숨기기": "リストから隠した項目を再び隠す", "목록에서 숨긴 항목 보이기 ({0}개)": "リストから隠した項目を表示 ({0} 件)", @@ -1271,6 +1279,7 @@ "목록의 동영상 {0}개 모두": "リストの動画 {0}個すべて", "몽골어": "モンゴル語", "무엇을 그릴지 적어 주세요": "何を描くか入力してください", + "무엇이 바뀌는지 (목록에서만 빠지고 파일은 그대로) 확인 창을 띄웁니다": "何が変わるか (リストから外れるだけでファイルはそのまま) の確認画面を表示します", "무엇이 바뀌는지 비교하는 중…": "何が変わるか比較中…", "무한": "無制限", "묶기": "まとめる", @@ -1303,6 +1312,7 @@ "바꾸기 ({0}개)": "変更 ({0} 件)", "바꾸는 정도 {0}%": "変える度合い {0}%", "바꾸면 바로 저장됩니다": "変更するとすぐ保存されます", + "바꾸지 못했습니다: {0}": "変更できませんでした: {0}", "바꾼 PDF 를 저장하지 못했습니다 (저장 공간을 확인해 주세요)": "変換した PDF を保存できませんでした (空き容量を確認してください)", "바꾼 것이 없습니다 (원본 그대로)": "変更なし(元のまま)", "바꿀 글": "置き換える文字", @@ -2087,6 +2097,7 @@ "이 설치본에는 rsync 가 들어 있지 않습니다 (rsync 로 복사할 때 · 오른쪽 [내려받기] 로 받습니다)": "このインストールには rsync が含まれていません (rsync でコピーするとき · 右の [ダウンロード] で取得します)", "이 설치본에는 rsync 가 들어 있지 않습니다. 직접 지정하세요.": "このインストールには rsync が含まれていません。直接指定してください。", "이 앱 (APK) 에는 Tor 가 들어 있지 않습니다.": "このアプリ (APK) には Tor が入っていません。", + "이 앱의 파일 탐색기 목록에서만 빠집니다. 파일은 지우거나 옮기거나 이름을 바꾸지 않고, 다른 앱 · 갤러리에서는 그대로 보입니다.": "このアプリのファイルエクスプローラーの一覧から外れるだけです。ファイルは削除・移動・名前変更されず、他のアプリやギャラリーではそのまま表示されます。", "이 언어 지우기": "この言語を削除", "이 연결은 서명도 암호화도 되지 않습니다 ({0}). 같은 네트워크의 다른 사람이 파일 내용을 보거나 바꿀 수 있으니, NAS 설정에서 SMB 서명이나 SMB3 암호화를 켜는 것이 좋습니다": "この接続は署名も暗号化もされません ({0})。同じネットワークの他の人がファイルの内容を見たり変えたりできるため、NAS の設定で SMB 署名か SMB3 暗号化をオンにすることをおすすめします", "이 연결은 암호화되지 않습니다 ({0}). 같은 네트워크의 다른 사람이 파일 내용을 볼 수 있으니, NAS 설정에서 SMB3 암호화를 켜는 것이 좋습니다": "この接続は暗号化されていません ({0})。同じネットワークの他の人がファイルの内容を見られるため、NAS の設定で SMB3 暗号化をオンにすることをお勧めします", @@ -2112,12 +2123,14 @@ "이 폴더를 볼 권한이 없습니다": "このフォルダーを表示する権限がありません", "이 폴더를 읽을 권한이 없습니다": "このフォルダーを読む権限がありません", "이 폴더에 동영상이 없습니다.": "このフォルダーに動画がありません。", + "이 폴더에 빈 .nomedia 파일을 만듭니다. 갤러리 · 음악 앱이 이 폴더 (안의 폴더 포함) 의 그림 · 동영상 · 음악을 보이지 않게 됩니다.": "このフォルダーに空の .nomedia ファイルを作ります。ギャラリー・音楽アプリはこのフォルダー (サブフォルダーを含む) の画像・動画・音楽を表示しなくなります。", "이 폴더에 새 폴더": "このフォルダーに新しいフォルダー", "이 폴더에 현재 페이지 추가": "このフォルダーに現在のページを追加", "이 폴더에는 고를 파일이 없습니다": "このフォルダーには選べるファイルがありません", "이 폴더에는 그림 · 동영상이 없습니다": "このフォルダーには画像・動画がありません", "이 폴더에는 그림이 없습니다": "このフォルダーには画像がありません", "이 폴더에만: {0}": "このフォルダーだけ: {0}", + "이 폴더의 .nomedia 파일을 지웁니다. 갤러리 · 음악 앱이 이 폴더의 그림 · 동영상 · 음악을 다시 보이게 됩니다.": "このフォルダーの .nomedia ファイルを削除します。ギャラリー・音楽アプリはこのフォルダーの画像・動画・音楽を再び表示します。", "이 폴더의 동영상 재생": "このフォルダーの動画を再生", "이 폴더의 파일": "このフォルダーのファイル", "이 프로그램이 관리자 권한으로 실행 중입니다. 권장하지 않습니다.\n\n· 내장 Chrome 엔진은 샌드박스 (웹 페이지를 가두는 보호) 가 꺼져 있어, 웹 페이지가 관리자 권한 프로세스 안에서 돕니다. 페이지의 취약점이 곧 이 PC 의 관리자 권한이 될 수 있습니다.\n· Edge 엔진은 이 영향이 없습니다.\n· 관리자 권한 없이 프로그램을 실행하면 이 설정 없이도 Chrome 엔진을 쓸 수 있습니다.": "このアプリは管理者権限で実行されています。おすすめしません。\n\n· 内蔵 Chrome エンジンはサンドボックス (Web ページを閉じ込める保護) がオフのため、Web ページが管理者権限のプロセス内で動きます。ページの脆弱性がそのままこの PC の管理者権限になるおそれがあります。\n· Edge エンジンにはこの影響がありません。\n· 管理者権限なしでアプリを実行すれば、この設定なしで Chrome エンジンを使えます。", @@ -2731,6 +2744,7 @@ "폴더 수정": "フォルダーを編集", "폴더 안 파일 크기의 합을 목록에 보입니다. 큰 폴더 · NAS 는 읽는 데 오래 걸릴 수 있습니다. 길게 누르기 [폴더 크기 계산] 은 늘 됩니다": "フォルダー内のファイルサイズの合計を一覧に表示します。大きなフォルダー・NAS は読み込みに時間がかかることがあります。長押しの [フォルダーサイズを計算] はいつでも使えます", "폴더 안의 것을 맞춥니다 (대상에 같은 이름의 폴더를 새로 만들지 않음).": "フォルダーの中身を合わせます (対象に同じ名前のフォルダーは作りません)。", + "폴더 안의 파일은 바꾸지 않습니다. 갤러리에 반영되기까지 시간이 걸리거나 그 앱을 다시 열어야 할 수 있습니다.": "フォルダー内のファイルは変更しません。ギャラリーに反映されるまで時間がかかったり、そのアプリを開き直す必要がある場合があります。", "폴더 열기": "フォルダーを開く", "폴더 이름": "フォルダー名", "폴더 이름 바꾸기 · 이동": "フォルダー名の変更・移動", diff --git a/assets/l10n/zh-Hans.json b/assets/l10n/zh-Hans.json index 159cd9d..01be808 100644 --- a/assets/l10n/zh-Hans.json +++ b/assets/l10n/zh-Hans.json @@ -72,6 +72,7 @@ "+30분": "+30分钟", "- 감지한 언어": "- 检测到的语言", "-1 은 아무렇게나": "-1 为随机", + ".nomedia 를 지웠습니다. 갤러리 · 음악 앱에 다시 보입니다.": "已删除 .nomedia。图库和音乐应用将重新显示。", ".{0} 재생 프로그램 (exe)": ".{0} 播放程序(exe)", "/ 로 시작하는 전체 경로로": "请使用以 / 开头的完整路径", "0 = 제한 없음. 모든 방법에 적용: rsync --bwlimit, 현재 방식은 앱이 조절, robocopy 는 /IPG 로 비슷하게. 옵션 칸에 직접 넣어도 됩니다 (그쪽이 우선)": "0 = 不限制。适用于所有方式: rsync 用 --bwlimit,当前方式由应用调节,robocopy 用 /IPG 近似。也可直接写在选项栏中 (优先)", @@ -704,6 +705,9 @@ "개인 키를 넣었습니다 (원래 파일 경로는 저장하지 않습니다)": "已添加私钥 (不保存原文件路径)", "개인 키를 읽을 수 없습니다 (OpenSSH · PEM 형식)": "无法读取私钥 (OpenSSH · PEM 格式)", "개인 키의 암호가 맞지 않습니다": "私钥密码不正确", + "갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)": "在图库和音乐应用中重新显示 (删除 .nomedia)", + "갤러리 · 음악 앱에서 숨겼습니다 (.nomedia). 파일은 그대로입니다.": "已在图库和音乐应用中隐藏 (.nomedia)。文件保持不变。", + "갤러리 · 음악 앱에서 숨기기 (.nomedia)": "在图库和音乐应用中隐藏 (.nomedia)", "거꾸로": "倒序", "거꾸로 된 범위: {0}": "范围顺序颠倒: {0}", "거른 것 {0}개도 지워집니다 (--delete-excluded)": "已排除的 {0} 项也会被删除 (--delete-excluded)", @@ -988,6 +992,7 @@ "다시 만들기 대기로": "改回等待重新制作", "다시 만들기 대기로 (지금 묶음이 끝난 뒤)": "重新排队制作 (当前批次结束后)", "다시 받기": "重新下载", + "다시 보이기": "重新显示", "다시 비교": "重新比较", "다시 설치": "重新安装", "다시 세기": "重新统计", @@ -1027,6 +1032,7 @@ "다음 {0}개 기다림": "另有 {0} 个等待中", "다음 페이지": "下一页", "다음 항목 (→)": "下一项 (→)", + "다음부터 묻지 않기": "以后不再询问", "다음부터 묻지 않기 (환경 설정 > 실행 에서 바꿀 수 있음)": "下次不再询问(可在 设置 > 运行 中更改)", "단계": "步数", "단어 첫 글자만 크게 (Abc)": "单词首字母大写 (Abc)", @@ -1251,6 +1257,7 @@ "목": "四", "목록": "列表", "목록 · 영상 옆 · 영상 위에 나오는 광고 영역을 감춥니다": "隐藏列表 · 视频旁 · 视频上方出现的广告区域", + "목록 맨 아래의 [숨긴 항목 보이기] 나 환경 설정 > 파일 탐색기에서 다시 볼 수 있습니다.": "可通过列表底部的 [显示隐藏项] 或 设置 > 文件管理器 重新查看。", "목록 보기": "查看列表", "목록 파일은 전체 경로로 적어 주세요: {0}": "请填写列表文件的完整路径: {0}", "목록 파일의 전체 경로를 적어 주세요": "请填写列表文件的完整路径", @@ -1261,6 +1268,7 @@ "목록에서 숨겼습니다 ({0}개). 파일은 그대로이고, 목록 맨 아래의 [숨긴 항목 보이기] 로 다시 볼 수 있습니다.": "已从列表中隐藏 ({0} 项)。文件本身未改变,可用列表底部的 [显示已隐藏项] 再次查看。", "목록에서 숨겼습니다 ({0}개). 파일은 그대로입니다.": "已从列表中隐藏 ({0} 项)。文件本身未改变。", "목록에서 숨기기": "从列表中隐藏", + "목록에서 숨기기 전에 묻기": "从列表中隐藏前询问", "목록에서 숨긴 항목 ({0}개)": "从列表中隐藏的项 ({0} 项)", "목록에서 숨긴 항목 다시 숨기기": "再次隐藏已从列表中隐藏的项", "목록에서 숨긴 항목 보이기 ({0}개)": "显示从列表中隐藏的项 ({0} 项)", @@ -1271,6 +1279,7 @@ "목록의 동영상 {0}개 모두": "列表中的全部 {0} 个视频", "몽골어": "蒙古语", "무엇을 그릴지 적어 주세요": "请输入要画的内容", + "무엇이 바뀌는지 (목록에서만 빠지고 파일은 그대로) 확인 창을 띄웁니다": "显示确认窗口,说明会发生什么 (仅从列表中移除,文件不变)", "무엇이 바뀌는지 비교하는 중…": "正在比较将要更改的内容…", "무한": "无限制", "묶기": "压缩", @@ -1303,6 +1312,7 @@ "바꾸기 ({0}개)": "重命名 ({0} 个)", "바꾸는 정도 {0}%": "改变程度 {0}%", "바꾸면 바로 저장됩니다": "更改后立即保存", + "바꾸지 못했습니다: {0}": "无法更改: {0}", "바꾼 PDF 를 저장하지 못했습니다 (저장 공간을 확인해 주세요)": "无法保存转换后的 PDF (请检查存储空间)", "바꾼 것이 없습니다 (원본 그대로)": "未做更改(保持原样)", "바꿀 글": "替换为", @@ -2087,6 +2097,7 @@ "이 설치본에는 rsync 가 들어 있지 않습니다 (rsync 로 복사할 때 · 오른쪽 [내려받기] 로 받습니다)": "此安装中没有 rsync (使用 rsync 复制时 · 或用右侧 [下载] 获取)", "이 설치본에는 rsync 가 들어 있지 않습니다. 직접 지정하세요.": "此安装中没有 rsync。请自行指定。", "이 앱 (APK) 에는 Tor 가 들어 있지 않습니다.": "此应用 (APK) 未包含 Tor。", + "이 앱의 파일 탐색기 목록에서만 빠집니다. 파일은 지우거나 옮기거나 이름을 바꾸지 않고, 다른 앱 · 갤러리에서는 그대로 보입니다.": "仅从本应用的文件管理器列表中移除。文件不会被删除、移动或重命名,其他应用和图库中仍然可见。", "이 언어 지우기": "删除此语言", "이 연결은 서명도 암호화도 되지 않습니다 ({0}). 같은 네트워크의 다른 사람이 파일 내용을 보거나 바꿀 수 있으니, NAS 설정에서 SMB 서명이나 SMB3 암호화를 켜는 것이 좋습니다": "此连接既未签名也未加密 ({0})。同一网络中的其他人可能查看或篡改文件内容,建议在 NAS 设置中开启 SMB 签名或 SMB3 加密", "이 연결은 암호화되지 않습니다 ({0}). 같은 네트워크의 다른 사람이 파일 내용을 볼 수 있으니, NAS 설정에서 SMB3 암호화를 켜는 것이 좋습니다": "此连接未加密 ({0})。同一网络中的其他人可能看到文件内容,建议在 NAS 设置中开启 SMB3 加密", @@ -2112,12 +2123,14 @@ "이 폴더를 볼 권한이 없습니다": "没有查看此文件夹的权限", "이 폴더를 읽을 권한이 없습니다": "没有读取此文件夹的权限", "이 폴더에 동영상이 없습니다.": "此文件夹中没有视频。", + "이 폴더에 빈 .nomedia 파일을 만듭니다. 갤러리 · 음악 앱이 이 폴더 (안의 폴더 포함) 의 그림 · 동영상 · 음악을 보이지 않게 됩니다.": "在此文件夹中创建空的 .nomedia 文件。图库和音乐应用将不再显示此文件夹 (含子文件夹) 中的图片、视频和音乐。", "이 폴더에 새 폴더": "在此文件夹中新建文件夹", "이 폴더에 현재 페이지 추가": "将当前页面添加到此文件夹", "이 폴더에는 고를 파일이 없습니다": "此文件夹中没有可选择的文件", "이 폴더에는 그림 · 동영상이 없습니다": "此文件夹中没有图片或视频", "이 폴더에는 그림이 없습니다": "此文件夹中没有图片", "이 폴더에만: {0}": "仅此文件夹: {0}", + "이 폴더의 .nomedia 파일을 지웁니다. 갤러리 · 음악 앱이 이 폴더의 그림 · 동영상 · 음악을 다시 보이게 됩니다.": "删除此文件夹中的 .nomedia 文件。图库和音乐应用将重新显示此文件夹中的图片、视频和音乐。", "이 폴더의 동영상 재생": "播放此文件夹中的视频", "이 폴더의 파일": "此文件夹中的文件", "이 프로그램이 관리자 권한으로 실행 중입니다. 권장하지 않습니다.\n\n· 내장 Chrome 엔진은 샌드박스 (웹 페이지를 가두는 보호) 가 꺼져 있어, 웹 페이지가 관리자 권한 프로세스 안에서 돕니다. 페이지의 취약점이 곧 이 PC 의 관리자 권한이 될 수 있습니다.\n· Edge 엔진은 이 영향이 없습니다.\n· 관리자 권한 없이 프로그램을 실행하면 이 설정 없이도 Chrome 엔진을 쓸 수 있습니다.": "本应用正以管理员权限运行,不推荐这样做。\n\n· 内置 Chrome 引擎的沙盒(限制网页的保护)已关闭,网页会在管理员权限进程中运行。网页中的漏洞可能直接变成此电脑的管理员权限。\n· Edge 引擎不受此影响。\n· 不以管理员权限运行本应用时,无需此设置即可使用 Chrome 引擎。", @@ -2731,6 +2744,7 @@ "폴더 수정": "编辑文件夹", "폴더 안 파일 크기의 합을 목록에 보입니다. 큰 폴더 · NAS 는 읽는 데 오래 걸릴 수 있습니다. 길게 누르기 [폴더 크기 계산] 은 늘 됩니다": "在列表中显示文件夹内文件大小的总和。大型文件夹或 NAS 可能需要较长时间读取。长按 [计算文件夹大小] 始终可用", "폴더 안의 것을 맞춥니다 (대상에 같은 이름의 폴더를 새로 만들지 않음).": "同步文件夹内的内容 (不会在目标中新建同名文件夹)。", + "폴더 안의 파일은 바꾸지 않습니다. 갤러리에 반영되기까지 시간이 걸리거나 그 앱을 다시 열어야 할 수 있습니다.": "不会更改文件夹中的文件。图库可能需要一段时间才能反映,或需要重新打开该应用。", "폴더 열기": "打开文件夹", "폴더 이름": "文件夹名称", "폴더 이름 바꾸기 · 이동": "重命名 · 移动文件夹", diff --git a/lib/app/settings.dart b/lib/app/settings.dart index 88463fb..1b828e4 100644 --- a/lib/app/settings.dart +++ b/lib/app/settings.dart @@ -490,6 +490,9 @@ class AppSettings { /// 지우기 · 이동 대상에서는 빠지지 않는다. 목록 맨 아래 [숨긴 항목 보이기] 로 다시 본다 List explorerHiddenItems = []; + /// X-plore 맞추기 (관리자 지시 10/20): [목록에서 숨기기] 전에 무엇이 바뀌는지 확인 창 (처음 켬, 창의 [다음부터 묻지 않기] · 환경 설정에서 끔) + bool explorerHideConfirm = true; + // ── 복사 · 이동 (파일 탐색기) · rsync · lsync (Rsync 화면) ── /// 파일 탐색기의 복사 · 이동 방법: 'builtin' 현재 방식 (기본) · 'robocopy' (Windows). 파일만 고를 때 / 폴더가 들어 있을 때. /// rsync 는 Rsync 화면에서 따로 (파일 탐색기에서는 쓰지 않음) @@ -856,6 +859,7 @@ class AppSettings { 'explorerFolderSorts': explorerFolderSorts, 'explorerShowHidden': explorerShowHidden, 'explorerHiddenItems': explorerHiddenItems, + 'explorerHideConfirm': explorerHideConfirm, 'explorerPaths': explorerPaths, 'copyMethodFile': copyMethodFile, 'copyConflict': copyConflict, @@ -1102,6 +1106,7 @@ class AppSettings { } ..explorerShowHidden = j['explorerShowHidden'] as bool? ?? false ..explorerHiddenItems = [for (final x in (j['explorerHiddenItems'] as List?) ?? const []) if (x is String && x.isNotEmpty) x] + ..explorerHideConfirm = j['explorerHideConfirm'] as bool? ?? true ..explorerPaths = [for (final x in (j['explorerPaths'] as List?) ?? const []) '$x'] ..copyMethodFile = _method(j['copyMethodFile']) ..copyConflict = const ['rename', 'overwrite', 'skip'].contains(j['copyConflict']) ? j['copyConflict'] as String : 'ask' diff --git a/lib/ui/explorer_page.dart b/lib/ui/explorer_page.dart index 2d55362..e7dbbb7 100644 --- a/lib/ui/explorer_page.dart +++ b/lib/ui/explorer_page.dart @@ -115,6 +115,10 @@ class ExplorerPage extends StatefulWidget { @visibleForTesting static bool? debugAndroidTrash; + /// 시험: 폴더 .nomedia 넣기 · 지우기 (Android 갤러리 · 음악 앱에서 숨기기) 를 Windows 에서. null 이면 Android 만 + @visibleForTesting + static bool? debugNomedia; + /// 시험: 경로 입력 창이 넣은 경로를 고쳐 쓰고 확인하는 것 (갈 경로, 칸 아래 이유) @visibleForTesting static Future<(String?, String?)> checkPathForTest(String input) => _ExplorerPageState.checkEnteredPath(input); @@ -2040,6 +2044,11 @@ class _ExplorerPageState extends State { targets.every(_appHidden) ? ('appUnhide', Icons.visibility_outlined, many ? trf('{0}개 숨기기 풀기', [targets.length]) : tr('숨기기 풀기')) : ('appHide', Icons.visibility_off_outlined, many ? trf('{0}개 목록에서 숨기기', [targets.length]) : tr('목록에서 숨기기')), + // X-plore 맞추기 (관리자 지시 10/20): 폴더에 .nomedia 를 두면 갤러리 · 음악 앱이 그 안의 그림 · 동영상 · 음악을 보이지 않는다 (Android) + if (e.isDir && !dav && !inArchive && (ExplorerPage.debugNomedia ?? Platform.isAndroid)) + File(p.join(e.path, '.nomedia')).existsSync() + ? ('nomediaOff', Icons.photo_library_outlined, tr('갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)')) + : ('nomediaOn', Icons.hide_image_outlined, tr('갤러리 · 음악 앱에서 숨기기 (.nomedia)')), // 두 창이면 아이콘 줄의 복사 · 이동은 다른 창으로 - 담아 두었다가 원하는 폴더에 붙여넣기는 여기 if (dual) ('clipCopy', Icons.content_copy, tr('복사 (붙여넣기로)')), if (dual) ('clipMove', Icons.content_cut, tr('이동 (붙여넣기로)')), @@ -2138,6 +2147,7 @@ class _ExplorerPageState extends State { pane.changed(); } case 'appHide': + if (c.settings.explorerHideConfirm && !await _confirmAppHide(targets)) return; await c.updateSettings((s) => s.explorerHiddenItems = [ ...s.explorerHiddenItems, for (final x in targets) @@ -2161,6 +2171,8 @@ class _ExplorerPageState extends State { q.changed(); } if (mounted) setState(() {}); + case 'nomediaOn' || 'nomediaOff': + await _nomedia(pane, e.path, on: pick == 'nomediaOn'); case 'props': await showFolderProperties(context, e.path); case 'hash': @@ -4039,6 +4051,83 @@ class _ExplorerPageState extends State { ); } + /// X-plore 맞추기 (관리자 지시 10/20): [목록에서 숨기기] 전에 무엇이 바뀌는지 알림. [다음부터 묻지 않기] 는 환경 설정에서 다시 켬 + Future _confirmAppHide(List targets) async { + var dontAsk = false; + final ok = await showDialog( + context: context, + builder: (ctx) => StatefulBuilder( + builder: (ctx, set) => AlertDialog( + scrollable: true, + title: Text(targets.length > 1 ? trf('{0}개 목록에서 숨기기', [targets.length]) : tr('목록에서 숨기기')), + content: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ + if (targets.length == 1) Text(vBasename(targets.single), style: const TextStyle(fontWeight: FontWeight.bold)), + const SizedBox(height: 6), + Text(tr('이 앱의 파일 탐색기 목록에서만 빠집니다. 파일은 지우거나 옮기거나 이름을 바꾸지 않고, 다른 앱 · 갤러리에서는 그대로 보입니다.')), + const SizedBox(height: 6), + Text(tr('목록 맨 아래의 [숨긴 항목 보이기] 나 환경 설정 > 파일 탐색기에서 다시 볼 수 있습니다.'), + style: const TextStyle(fontSize: 12, color: JjColors.textDim)), + CheckboxListTile( + contentPadding: EdgeInsets.zero, + controlAffinity: ListTileControlAffinity.leading, + value: dontAsk, + onChanged: (v) => set(() => dontAsk = v ?? false), + title: Text(tr('다음부터 묻지 않기')), + ), + ]), + actions: [ + TextButton(onPressed: () => Navigator.pop(ctx, false), child: Text(tr('취소'))), + FilledButton(onPressed: () => Navigator.pop(ctx, true), child: Text(tr('숨기기'))), + ], + ), + ), + ); + if (ok != true) return false; + if (dontAsk) await c.updateSettings((s) => s.explorerHideConfirm = false); + return true; + } + + /// X-plore 맞추기 (관리자 지시 10/20): 폴더에 빈 .nomedia 파일을 넣거나 지운다 (Android 갤러리 · 음악 앱에서 숨기기 · 다시 보이기). + /// 그 폴더의 파일은 그대로 - 무엇이 바뀌는지 먼저 묻는다. 갤러리에 반영되는 때는 그 앱이 다시 읽을 때다 + Future _nomedia(_Pane pane, String dir, {required bool on}) async { + final ok = await showDialog( + context: context, + builder: (ctx) => AlertDialog( + scrollable: true, + title: Text(on ? tr('갤러리 · 음악 앱에서 숨기기 (.nomedia)') : tr('갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)')), + content: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(vBasename(dir), style: const TextStyle(fontWeight: FontWeight.bold)), + const SizedBox(height: 6), + Text(on + ? tr('이 폴더에 빈 .nomedia 파일을 만듭니다. 갤러리 · 음악 앱이 이 폴더 (안의 폴더 포함) 의 그림 · 동영상 · 음악을 보이지 않게 됩니다.') + : tr('이 폴더의 .nomedia 파일을 지웁니다. 갤러리 · 음악 앱이 이 폴더의 그림 · 동영상 · 음악을 다시 보이게 됩니다.')), + const SizedBox(height: 6), + Text(tr('폴더 안의 파일은 바꾸지 않습니다. 갤러리에 반영되기까지 시간이 걸리거나 그 앱을 다시 열어야 할 수 있습니다.'), + style: const TextStyle(fontSize: 12, color: JjColors.textDim)), + ]), + actions: [ + TextButton(onPressed: () => Navigator.pop(ctx, false), child: Text(tr('취소'))), + FilledButton(onPressed: () => Navigator.pop(ctx, true), child: Text(on ? tr('숨기기') : tr('다시 보이기'))), + ], + ), + ); + if (ok != true || !mounted) return; + final f = File(p.join(dir, '.nomedia')); + try { + if (on) { + if (!await f.exists()) await f.writeAsBytes(const []); + } else if (await f.exists()) { + await f.delete(); + } + } catch (err) { + _snack(trf('바꾸지 못했습니다: {0}', [err])); + return; + } + await _refreshAll([dir]); + pane.changed(); + _snack(on ? tr('갤러리 · 음악 앱에서 숨겼습니다 (.nomedia). 파일은 그대로입니다.') : tr('.nomedia 를 지웠습니다. 갤러리 · 음악 앱에 다시 보입니다.')); + } + Future _sortDialog() async { // 84: "폴더마다 기억" 이면 지금 창의 폴더 정렬 final dir = _pane.current; diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index 676b9d5..fb538df 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -904,6 +904,13 @@ class _SettingsPageState extends State { enabled: s.explorerHiddenItems.isNotEmpty, onTap: () => showHiddenItems(context, c), ), + // X-plore 맞추기 (관리자 지시 10/20): 숨기기 전 확인 창 + SwitchListTile( + title: Text(tr('목록에서 숨기기 전에 묻기')), + subtitle: Text(tr('무엇이 바뀌는지 (목록에서만 빠지고 파일은 그대로) 확인 창을 띄웁니다')), + value: s.explorerHideConfirm, + onChanged: (v) => c.updateSettings((x) => x.explorerHideConfirm = v), + ), // X-plore 비교 a: 한 창일 때 복사 · 이동이 갈 곳 SettingTile( title: Text(tr('한 창일 때 복사 · 이동')), diff --git a/test/explorer_test.dart b/test/explorer_test.dart index 1f49172..a5a2f87 100644 --- a/test/explorer_test.dart +++ b/test/explorer_test.dart @@ -1688,6 +1688,10 @@ void main() { await tester.longPress(find.text('doc.txt')); await calm(tester); await act(tester, () => tester.tap(find.text('목록에서 숨기기'))); + await calm(tester); + // X-plore 맞추기 (관리자 지시 10/20): 무엇이 바뀌는지 확인 창 + expect(find.textContaining('파일 탐색기 목록에서만 빠집니다'), findsOneWidget); + await act(tester, () => tester.tap(find.widgetWithText(FilledButton, '숨기기'))); await settle(tester, () => find.text('doc.txt').evaluate().isEmpty); expect(find.text('doc.txt'), findsNothing); expect(File(doc).existsSync(), isTrue, reason: '파일은 바꾸지 않는다'); @@ -1710,6 +1714,81 @@ void main() { expect(find.ancestor(of: find.text('doc.txt'), matching: find.byType(Opacity)), findsNothing); }); + testWidgets('X-plore 숨기기 확인 창: [취소] 면 그대로 · [다음부터 묻지 않기] 를 고르면 다음엔 묻지 않고 바로 숨김 (설정 저장)', (tester) async { + c.settings.explorerLayout = 'split'; + expect(AppSettings().explorerHideConfirm, isTrue, reason: '처음은 묻기'); + File(p.join(left, 'two.txt')).writeAsStringSync('2'); + await open(tester); + await tester.longPress(find.text('doc.txt')); + await calm(tester); + await act(tester, () => tester.tap(find.text('목록에서 숨기기'))); + await calm(tester); + await act(tester, () => tester.tap(find.text('취소'))); + await calm(tester); + expect(c.settings.explorerHiddenItems, isEmpty, reason: '취소하면 숨기지 않는다'); + expect(find.text('doc.txt'), findsOneWidget); + // 다음부터 묻지 않기 + 숨기기 + await tester.longPress(find.text('doc.txt')); + await calm(tester); + await act(tester, () => tester.tap(find.text('목록에서 숨기기'))); + await calm(tester); + await act(tester, () => tester.tap(find.text('다음부터 묻지 않기'))); + await act(tester, () => tester.tap(find.widgetWithText(FilledButton, '숨기기'))); + await settle(tester, () => find.text('doc.txt').evaluate().isEmpty); + expect(c.settings.explorerHideConfirm, isFalse); + expect(AppSettings.fromJson(c.settings.toJson()).explorerHideConfirm, isFalse); + expect(AppSettings.fromJson({}).explorerHideConfirm, isTrue, reason: '예전 설정 (값 없음) 은 묻기'); + // 이제는 창 없이 바로 + await tester.longPress(find.text('two.txt')); + await calm(tester); + await act(tester, () => tester.tap(find.text('목록에서 숨기기'))); + await settle(tester, () => find.text('two.txt').evaluate().isEmpty); + expect(find.textContaining('파일 탐색기 목록에서만 빠집니다'), findsNothing); + expect(c.settings.explorerHiddenItems, [p.join(left, 'doc.txt'), p.join(left, 'two.txt')]); + }); + + testWidgets('X-plore 맞추기: 폴더 길게 누르기 [갤러리 · 음악 앱에서 숨기기 (.nomedia)] - 확인 창 뒤 빈 .nomedia, 다시 누르면 지우기 · 안의 파일은 그대로', (tester) async { + ExplorerPage.debugNomedia = true; + addTearDown(() => ExplorerPage.debugNomedia = null); + final mark = File(p.join(left, 'sub', '.nomedia')); + await open(tester); + expect(find.text('갤러리 · 음악 앱에서 숨기기 (.nomedia)'), findsNothing); + await tester.longPress(find.text('sub')); + await calm(tester); + await act(tester, () => tester.tap(find.text('갤러리 · 음악 앱에서 숨기기 (.nomedia)'))); + await calm(tester); + expect(find.textContaining('빈 .nomedia 파일을 만듭니다'), findsOneWidget); + // 취소하면 아무것도 안 바뀜 + await act(tester, () => tester.tap(find.text('취소'))); + await calm(tester); + expect(mark.existsSync(), isFalse); + await tester.longPress(find.text('sub')); + await calm(tester); + await act(tester, () => tester.tap(find.text('갤러리 · 음악 앱에서 숨기기 (.nomedia)'))); + await calm(tester); + await act(tester, () => tester.tap(find.widgetWithText(FilledButton, '숨기기'))); + await settle(tester, () => mark.existsSync()); + expect(mark.lengthSync(), 0); + expect(File(p.join(left, 'sub', 'inner.txt')).readAsStringSync(), 'inner', reason: '안의 파일은 그대로'); + // 이제 메뉴는 [다시 보이기] + await idle(tester); + await tester.longPress(find.text('sub')); + await calm(tester); + expect(find.text('갤러리 · 음악 앱에서 숨기기 (.nomedia)'), findsNothing); + await act(tester, () => tester.tap(find.text('갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)'))); + await calm(tester); + expect(find.textContaining('.nomedia 파일을 지웁니다'), findsOneWidget); + await act(tester, () => tester.tap(find.widgetWithText(FilledButton, '다시 보이기'))); + await settle(tester, () => !mark.existsSync()); + expect(File(p.join(left, 'sub', 'inner.txt')).existsSync(), isTrue); + // 파일에는 없음 + await idle(tester); + await tester.longPress(find.text('doc.txt')); + await calm(tester); + expect(find.text('갤러리 · 음악 앱에서 숨기기 (.nomedia)'), findsNothing); + expect(find.text('갤러리 · 음악 앱에 다시 보이기 (.nomedia 지우기)'), findsNothing); + }); + testWidgets('X-plore 숨기기: 숨긴 것이 든 폴더를 지울 때 확인 창에 알림 (숨긴 것도 함께 지워진다)', (tester) async { c.settings.explorerHiddenItems = [p.join(left, 'sub', 'inner.txt')]; await open(tester);