48 보충: 탐색기를 처음 열면 고른 항목 없음 · 같은 이름 처리 기본값을 환경 설정으로

- 처음 열 때 지금 폴더를 고르지 않는다 (열자마자 폴더 통째가 복사 · 이동 대상이 되지 않게). 바로 [복사] 하면 "복사할 항목을 고르세요"
- 환경 설정 > 파일 탐색기 > 같은 이름이 있을 때: 묻기 (처음 값) · 늘 이름 바꾸기 · 늘 덮어쓰기 · 늘 건너뛰기.
  늘 … 이면 확인 창에 고르는 칸 없이 "환경 설정대로 …" 한 줄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
묶음3
RyuJongJin 2026-10-09 18:50:39 +09:00
parent 7d76af382d
commit f01fe96151
7 changed files with 97 additions and 7 deletions

View File

@ -381,6 +381,7 @@
"같은 시리즈 (번호만 다른 파일)": "Same series (files that differ only by number)", "같은 시리즈 (번호만 다른 파일)": "Same series (files that differ only by number)",
"같은 이름이 이미 있습니다: {0}": "Already exists with the same name: {0}", "같은 이름이 이미 있습니다: {0}": "Already exists with the same name: {0}",
"같은 이름이 있는지 확인하는 중 …": "Checking for items with the same name …", "같은 이름이 있는지 확인하는 중 …": "Checking for items with the same name …",
"같은 이름이 있을 때": "When a file with the same name exists",
"같은 이름이라 건너뜀: {0}": "Skipped (same name): {0}", "같은 이름이라 건너뜀: {0}": "Skipped (same name): {0}",
"같은 조건으로 다시 (시드 그대로)": "Again with the same settings (same seed)", "같은 조건으로 다시 (시드 그대로)": "Again with the same settings (same seed)",
"같은 폴더의 모든 동영상": "All videos in the same folder", "같은 폴더의 모든 동영상": "All videos in the same folder",
@ -392,6 +393,7 @@
"거꾸로": "Reverse", "거꾸로": "Reverse",
"건너뛰기": "Skip", "건너뛰기": "Skip",
"건너뜀 (출력 폴더의 파일): {0}": "Skipped (file in the output folder): {0}", "건너뜀 (출력 폴더의 파일): {0}": "Skipped (file in the output folder): {0}",
"건너뜁니다": "skips it",
"검색": "Search", "검색": "Search",
"검색 지우기": "Clear search", "검색 지우기": "Clear search",
"검정": "Black", "검정": "Black",
@ -540,7 +542,10 @@
"누르고 있으면 조정 전": "Hold to see before", "누르고 있으면 조정 전": "Hold to see before",
"누르기": "Tap", "누르기": "Tap",
"누르면 일정 바꾸기": "Tap to change the schedule", "누르면 일정 바꾸기": "Tap to change the schedule",
"늘 건너뛰기": "Always skip",
"늘 덮어쓰기": "Always overwrite",
"늘 받아서 열기": "Always download and open", "늘 받아서 열기": "Always download and open",
"늘 이름 바꾸기": "Always keep both (rename)",
"늘 주소로 열기": "Always open by address", "늘 주소로 열기": "Always open by address",
"다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "As soon as they finish, put them in the Make MKV video list and remove them from the download list (same as the checkbox on the download screen)", "다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "As soon as they finish, put them in the Make MKV video list and remove them from the download list (same as the checkbox on the download screen)",
"다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "When finished, automatically add to the Make MKV video list and remove from this download list (the downloaded file stays)", "다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "When finished, automatically add to the Make MKV video list and remove from this download list (the downloaded file stays)",
@ -631,6 +636,7 @@
"더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "When JJ_MKVMaker is chosen by double-click · default app (the right-click menu stays)", "더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "When JJ_MKVMaker is chosen by double-click · default app (the right-click menu stays)",
"더한 언어 (AI 자동 번역)": "Added language (AI auto-translated)", "더한 언어 (AI 자동 번역)": "Added language (AI auto-translated)",
"덮어쓰기 (원래 파일은 없어집니다)": "Overwrite (the existing file is replaced)", "덮어쓰기 (원래 파일은 없어집니다)": "Overwrite (the existing file is replaced)",
"덮어씁니다": "overwrites it",
"덴마크어": "Danish", "덴마크어": "Danish",
"독일어": "German", "독일어": "German",
"돌아가기": "Go back", "돌아가기": "Go back",
@ -775,6 +781,7 @@
"무한": "Unlimited", "무한": "Unlimited",
"문서 미리보기": "Document preview", "문서 미리보기": "Document preview",
"문자셋 경고": "Charset warning", "문자셋 경고": "Charset warning",
"묻기": "Ask",
"물어보지 않기": "Never ask", "물어보지 않기": "Never ask",
"미리 볼 수 없습니다: {0}": "Cannot preview: {0}", "미리 볼 수 없습니다: {0}": "Cannot preview: {0}",
"미리보기: 목록에서 동영상을 고르세요": "Preview: choose a video in the list", "미리보기: 목록에서 동영상을 고르세요": "Preview: choose a video in the list",
@ -872,6 +879,7 @@
"복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "{0} copy/move tasks have not finished. Exiting stops them, and the file being copied is removed so no incomplete file is left.", "복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "{0} copy/move tasks have not finished. Exiting stops them, and the file being copied is removed so no incomplete file is left.",
"복사 · 이동 중입니다": "Copying · moving in progress", "복사 · 이동 중입니다": "Copying · moving in progress",
"복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "Copy · move works with two panes (Pane layout > Two panes).", "복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "Copy · move works with two panes (Pane layout > Two panes).",
"복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)": "If the destination folder already has the same name (built-in method · WebDAV)",
"복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "Choose items to copy · move (tap, or mark with the circle on the right).", "복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "Choose items to copy · move (tap, or mark with the circle on the right).",
"복사 끝 ({0}): {1}개 → {2}": "Copy done ({0}): {1} → {2}", "복사 끝 ({0}): {1}개 → {2}": "Copy done ({0}): {1} → {2}",
"복사 모니터링": "Copy monitor", "복사 모니터링": "Copy monitor",
@ -1342,6 +1350,7 @@
"이름 변경": "Rename", "이름 변경": "Rename",
"이름을 바꿀 수 없습니다: {0}": "Cannot rename: {0}", "이름을 바꿀 수 없습니다: {0}": "Cannot rename: {0}",
"이름을 바꿀 항목 하나를 고르세요.": "Choose one item to rename.", "이름을 바꿀 항목 하나를 고르세요.": "Choose one item to rename.",
"이름을 바꿉니다": "renames it",
"이미 그리는 중입니다": "Already drawing", "이미 그리는 중입니다": "Already drawing",
"이미 동영상 목록에 있습니다 ({0}개).": "Already in the video list ({0}).", "이미 동영상 목록에 있습니다 ({0}개).": "Already in the video list ({0}).",
"이미 목록에 있는 동영상입니다 ({0}개).": "These videos are already in the list ({0}).", "이미 목록에 있는 동영상입니다 ({0}개).": "These videos are already in the list ({0}).",
@ -1850,6 +1859,7 @@
"확장자별 재생 프로그램": "Player per file extension", "확장자별 재생 프로그램": "Player per file extension",
"환경 설정": "Settings", "환경 설정": "Settings",
"환경 설정 열기": "Open settings", "환경 설정 열기": "Open settings",
"환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)": "As set in Settings, it {0} (Settings > File explorer > When a file with the same name exists)",
"환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "Enter the master password to open settings. It won't be asked again until the app is closed.", "환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "Enter the master password to open settings. It won't be asked again until the app is closed.",
"회전": "Rotation", "회전": "Rotation",
"회전 없음": "No rotation", "회전 없음": "No rotation",

View File

@ -381,6 +381,7 @@
"같은 시리즈 (번호만 다른 파일)": "同じシリーズ(番号だけ違うファイル)", "같은 시리즈 (번호만 다른 파일)": "同じシリーズ(番号だけ違うファイル)",
"같은 이름이 이미 있습니다: {0}": "同じ名前が既にあります: {0}", "같은 이름이 이미 있습니다: {0}": "同じ名前が既にあります: {0}",
"같은 이름이 있는지 확인하는 중 …": "同じ名前があるか確認中 …", "같은 이름이 있는지 확인하는 중 …": "同じ名前があるか確認中 …",
"같은 이름이 있을 때": "同じ名前があるとき",
"같은 이름이라 건너뜀: {0}": "同じ名前のためスキップ: {0}", "같은 이름이라 건너뜀: {0}": "同じ名前のためスキップ: {0}",
"같은 조건으로 다시 (시드 그대로)": "同じ条件でもう一度 (シードはそのまま)", "같은 조건으로 다시 (시드 그대로)": "同じ条件でもう一度 (シードはそのまま)",
"같은 폴더의 모든 동영상": "同じフォルダーのすべての動画", "같은 폴더의 모든 동영상": "同じフォルダーのすべての動画",
@ -392,6 +393,7 @@
"거꾸로": "逆順", "거꾸로": "逆順",
"건너뛰기": "スキップ", "건너뛰기": "スキップ",
"건너뜀 (출력 폴더의 파일): {0}": "スキップ(出力フォルダーのファイル): {0}", "건너뜀 (출력 폴더의 파일): {0}": "スキップ(出力フォルダーのファイル): {0}",
"건너뜁니다": "スキップします",
"검색": "検索", "검색": "検索",
"검색 지우기": "検索をクリア", "검색 지우기": "検索をクリア",
"검정": "黒", "검정": "黒",
@ -540,7 +542,10 @@
"누르고 있으면 조정 전": "押している間は調整前", "누르고 있으면 조정 전": "押している間は調整前",
"누르기": "タップ", "누르기": "タップ",
"누르면 일정 바꾸기": "タップで予定を変更", "누르면 일정 바꾸기": "タップで予定を変更",
"늘 건너뛰기": "常にスキップ",
"늘 덮어쓰기": "常に上書き",
"늘 받아서 열기": "常にダウンロードして開く", "늘 받아서 열기": "常にダウンロードして開く",
"늘 이름 바꾸기": "常に名前を変える",
"늘 주소로 열기": "常にアドレスで開く", "늘 주소로 열기": "常にアドレスで開く",
"다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "ダウンロードが終わり次第 MKV 作成の動画リストに入れ、ダウンロードリストからは外します(ダウンロード画面のチェックボックスと同じ)", "다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "ダウンロードが終わり次第 MKV 作成の動画リストに入れ、ダウンロードリストからは外します(ダウンロード画面のチェックボックスと同じ)",
"다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "ダウンロードが終わると MKV 作成の動画リストに自動で入れ、このダウンロードリストからは外します(ダウンロードしたファイルはそのまま)", "다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "ダウンロードが終わると MKV 作成の動画リストに自動で入れ、このダウンロードリストからは外します(ダウンロードしたファイルはそのまま)",
@ -631,6 +636,7 @@
"더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "ダブルクリック・既定のアプリで JJ_MKVMaker を選んだとき(右クリックメニューはそのまま)", "더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "ダブルクリック・既定のアプリで JJ_MKVMaker を選んだとき(右クリックメニューはそのまま)",
"더한 언어 (AI 자동 번역)": "追加した言語(AI 自動翻訳)", "더한 언어 (AI 자동 번역)": "追加した言語(AI 自動翻訳)",
"덮어쓰기 (원래 파일은 없어집니다)": "上書き (元のファイルは消えます)", "덮어쓰기 (원래 파일은 없어집니다)": "上書き (元のファイルは消えます)",
"덮어씁니다": "上書きします",
"덴마크어": "デンマーク語", "덴마크어": "デンマーク語",
"독일어": "ドイツ語", "독일어": "ドイツ語",
"돌아가기": "戻る", "돌아가기": "戻る",
@ -775,6 +781,7 @@
"무한": "無制限", "무한": "無制限",
"문서 미리보기": "文書プレビュー", "문서 미리보기": "文書プレビュー",
"문자셋 경고": "文字コードの警告", "문자셋 경고": "文字コードの警告",
"묻기": "確認する",
"물어보지 않기": "尋ねない", "물어보지 않기": "尋ねない",
"미리 볼 수 없습니다: {0}": "プレビューできません: {0}", "미리 볼 수 없습니다: {0}": "プレビューできません: {0}",
"미리보기: 목록에서 동영상을 고르세요": "プレビュー: リストで動画を選んでください", "미리보기: 목록에서 동영상을 고르세요": "プレビュー: リストで動画を選んでください",
@ -872,6 +879,7 @@
"복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "コピー・移動 {0} 件がまだ終わっていません。終了すると止まり、コピー中のファイルは未完成のまま残らないよう削除します。", "복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "コピー・移動 {0} 件がまだ終わっていません。終了すると止まり、コピー中のファイルは未完成のまま残らないよう削除します。",
"복사 · 이동 중입니다": "コピー・移動中です", "복사 · 이동 중입니다": "コピー・移動中です",
"복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "コピー · 移動は 2 ペインで使います (ペインの配置 > 2 ペイン)。", "복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "コピー · 移動は 2 ペインで使います (ペインの配置 > 2 ペイン)。",
"복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)": "コピー・移動先のフォルダーに同じ名前がある場合 (現在の方式・WebDAV)",
"복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "コピー · 移動する項目を選んでください (タップ、または右の丸でマーク)。", "복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "コピー · 移動する項目を選んでください (タップ、または右の丸でマーク)。",
"복사 끝 ({0}): {1}개 → {2}": "コピー完了 ({0}): {1} 件 → {2}", "복사 끝 ({0}): {1}개 → {2}": "コピー完了 ({0}): {1} 件 → {2}",
"복사 모니터링": "コピーのモニタリング", "복사 모니터링": "コピーのモニタリング",
@ -1342,6 +1350,7 @@
"이름 변경": "名前の変更", "이름 변경": "名前の変更",
"이름을 바꿀 수 없습니다: {0}": "名前を変更できません: {0}", "이름을 바꿀 수 없습니다: {0}": "名前を変更できません: {0}",
"이름을 바꿀 항목 하나를 고르세요.": "名前を変更する項目を 1 つ選んでください。", "이름을 바꿀 항목 하나를 고르세요.": "名前を変更する項目を 1 つ選んでください。",
"이름을 바꿉니다": "名前を変えます",
"이미 그리는 중입니다": "すでに描画中です", "이미 그리는 중입니다": "すでに描画中です",
"이미 동영상 목록에 있습니다 ({0}개).": "既に動画リストにあります({0}個)。", "이미 동영상 목록에 있습니다 ({0}개).": "既に動画リストにあります({0}個)。",
"이미 목록에 있는 동영상입니다 ({0}개).": "既にリストにある動画です({0}個)。", "이미 목록에 있는 동영상입니다 ({0}개).": "既にリストにある動画です({0}個)。",
@ -1850,6 +1859,7 @@
"확장자별 재생 프로그램": "拡張子ごとの再生プログラム", "확장자별 재생 프로그램": "拡張子ごとの再生プログラム",
"환경 설정": "環境設定", "환경 설정": "環境設定",
"환경 설정 열기": "環境設定を開く", "환경 설정 열기": "環境設定を開く",
"환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)": "設定どおり{0} (環境設定 > ファイルエクスプローラー > 同じ名前があるとき)",
"환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "環境設定を開くにはマスターパスワードを入力してください。アプリを終了するまで再度尋ねません。", "환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "環境設定を開くにはマスターパスワードを入力してください。アプリを終了するまで再度尋ねません。",
"회전": "回転", "회전": "回転",
"회전 없음": "回転なし", "회전 없음": "回転なし",

View File

@ -381,6 +381,7 @@
"같은 시리즈 (번호만 다른 파일)": "同一系列(仅编号不同的文件)", "같은 시리즈 (번호만 다른 파일)": "同一系列(仅编号不同的文件)",
"같은 이름이 이미 있습니다: {0}": "已存在同名项目: {0}", "같은 이름이 이미 있습니다: {0}": "已存在同名项目: {0}",
"같은 이름이 있는지 확인하는 중 …": "正在检查是否有同名项目 …", "같은 이름이 있는지 확인하는 중 …": "正在检查是否有同名项目 …",
"같은 이름이 있을 때": "存在同名项目时",
"같은 이름이라 건너뜀: {0}": "因同名已跳过: {0}", "같은 이름이라 건너뜀: {0}": "因同名已跳过: {0}",
"같은 조건으로 다시 (시드 그대로)": "以相同条件再来一次 (种子不变)", "같은 조건으로 다시 (시드 그대로)": "以相同条件再来一次 (种子不变)",
"같은 폴더의 모든 동영상": "同一文件夹中的所有视频", "같은 폴더의 모든 동영상": "同一文件夹中的所有视频",
@ -392,6 +393,7 @@
"거꾸로": "倒序", "거꾸로": "倒序",
"건너뛰기": "跳过", "건너뛰기": "跳过",
"건너뜀 (출력 폴더의 파일): {0}": "已跳过(输出文件夹中的文件): {0}", "건너뜀 (출력 폴더의 파일): {0}": "已跳过(输出文件夹中的文件): {0}",
"건너뜁니다": "跳过",
"검색": "搜索", "검색": "搜索",
"검색 지우기": "清除搜索", "검색 지우기": "清除搜索",
"검정": "黑色", "검정": "黑色",
@ -540,7 +542,10 @@
"누르고 있으면 조정 전": "按住查看调整前", "누르고 있으면 조정 전": "按住查看调整前",
"누르기": "点按", "누르기": "点按",
"누르면 일정 바꾸기": "点按以更改计划", "누르면 일정 바꾸기": "点按以更改计划",
"늘 건너뛰기": "总是跳过",
"늘 덮어쓰기": "总是覆盖",
"늘 받아서 열기": "始终下载后打开", "늘 받아서 열기": "始终下载后打开",
"늘 이름 바꾸기": "总是重命名",
"늘 주소로 열기": "始终按地址打开", "늘 주소로 열기": "始终按地址打开",
"다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "下载完成后立即放入制作 MKV 的视频列表,并从下载列表移除(与下载界面的复选框相同)", "다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "下载完成后立即放入制作 MKV 的视频列表,并从下载列表移除(与下载界面的复选框相同)",
"다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "下载完成后自动加入制作 MKV 的视频列表,并从此下载列表移除(已下载的文件保留)", "다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "下载完成后自动加入制作 MKV 的视频列表,并从此下载列表移除(已下载的文件保留)",
@ -631,6 +636,7 @@
"더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "双击 · 默认打开方式选择 JJ_MKVMaker 时(右键菜单不变)", "더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "双击 · 默认打开方式选择 JJ_MKVMaker 时(右键菜单不变)",
"더한 언어 (AI 자동 번역)": "已添加的语言(AI 自动翻译)", "더한 언어 (AI 자동 번역)": "已添加的语言(AI 自动翻译)",
"덮어쓰기 (원래 파일은 없어집니다)": "覆盖 (原文件将被替换)", "덮어쓰기 (원래 파일은 없어집니다)": "覆盖 (原文件将被替换)",
"덮어씁니다": "覆盖",
"덴마크어": "丹麦语", "덴마크어": "丹麦语",
"독일어": "德语", "독일어": "德语",
"돌아가기": "返回", "돌아가기": "返回",
@ -775,6 +781,7 @@
"무한": "无限制", "무한": "无限制",
"문서 미리보기": "文档预览", "문서 미리보기": "文档预览",
"문자셋 경고": "字符集警告", "문자셋 경고": "字符集警告",
"묻기": "询问",
"물어보지 않기": "不询问", "물어보지 않기": "不询问",
"미리 볼 수 없습니다: {0}": "无法预览: {0}", "미리 볼 수 없습니다: {0}": "无法预览: {0}",
"미리보기: 목록에서 동영상을 고르세요": "预览: 请在列表中选择视频", "미리보기: 목록에서 동영상을 고르세요": "预览: 请在列表中选择视频",
@ -872,6 +879,7 @@
"복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "{0} 个复制 · 移动尚未完成。退出会停止它们,并删除正在复制的文件,以免留下不完整的文件。", "복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "{0} 个复制 · 移动尚未完成。退出会停止它们,并删除正在复制的文件,以免留下不完整的文件。",
"복사 · 이동 중입니다": "正在复制 · 移动", "복사 · 이동 중입니다": "正在复制 · 移动",
"복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "复制 · 移动需在双窗格中使用 (窗格布局 > 双窗格)。", "복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "复制 · 移动需在双窗格中使用 (窗格布局 > 双窗格)。",
"복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)": "目标文件夹中已有同名项目时 (当前方式 · WebDAV)",
"복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "请选择要复制 · 移动的项目 (点按,或用右侧圆圈标记)。", "복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "请选择要复制 · 移动的项目 (点按,或用右侧圆圈标记)。",
"복사 끝 ({0}): {1}개 → {2}": "复制完成 ({0}): {1} 个 → {2}", "복사 끝 ({0}): {1}개 → {2}": "复制完成 ({0}): {1} 个 → {2}",
"복사 모니터링": "复制监控", "복사 모니터링": "复制监控",
@ -1342,6 +1350,7 @@
"이름 변경": "重命名", "이름 변경": "重命名",
"이름을 바꿀 수 없습니다: {0}": "无法重命名: {0}", "이름을 바꿀 수 없습니다: {0}": "无法重命名: {0}",
"이름을 바꿀 항목 하나를 고르세요.": "请选择一个要重命名的项目。", "이름을 바꿀 항목 하나를 고르세요.": "请选择一个要重命名的项目。",
"이름을 바꿉니다": "重命名",
"이미 그리는 중입니다": "已在绘制中", "이미 그리는 중입니다": "已在绘制中",
"이미 동영상 목록에 있습니다 ({0}개).": "已在视频列表中({0} 个)。", "이미 동영상 목록에 있습니다 ({0}개).": "已在视频列表中({0} 个)。",
"이미 목록에 있는 동영상입니다 ({0}개).": "这些视频已在列表中({0} 个)。", "이미 목록에 있는 동영상입니다 ({0}개).": "这些视频已在列表中({0} 个)。",
@ -1850,6 +1859,7 @@
"확장자별 재생 프로그램": "按扩展名设置播放程序", "확장자별 재생 프로그램": "按扩展名设置播放程序",
"환경 설정": "设置", "환경 설정": "设置",
"환경 설정 열기": "打开设置", "환경 설정 열기": "打开设置",
"환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)": "按设置{0} (设置 > 文件资源管理器 > 存在同名项目时)",
"환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "要打开设置,请输入主密码。在关闭应用前不会再次询问。", "환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "要打开设置,请输入主密码。在关闭应用前不会再次询问。",
"회전": "旋转", "회전": "旋转",
"회전 없음": "不旋转", "회전 없음": "不旋转",

View File

@ -345,6 +345,9 @@ class AppSettings {
/// 파일 탐색기의 복사 · 이동 방법: 'builtin' 현재 방식 (기본) · 'robocopy' (Windows). 파일만 고를 때 / 폴더가 들어 있을 때. /// 파일 탐색기의 복사 · 이동 방법: 'builtin' 현재 방식 (기본) · 'robocopy' (Windows). 파일만 고를 때 / 폴더가 들어 있을 때.
/// rsync 는 Rsync 화면에서 따로 (파일 탐색기에서는 쓰지 않음) /// rsync 는 Rsync 화면에서 따로 (파일 탐색기에서는 쓰지 않음)
String copyMethodFile = 'builtin'; String copyMethodFile = 'builtin';
/// 48: 복사 · 이동할 때 받는 폴더에 같은 이름이 있으면 'ask' (확인 창에서 고름, 처음 값) · 'rename' · 'overwrite' · 'skip'
String copyConflict = 'ask';
String copyMethodFolder = 'builtin'; String copyMethodFolder = 'builtin';
String rsyncOptions = '-avPog'; String rsyncOptions = '-avPog';
String robocopyOptions = '/E /COPY:DAT /DCOPY:T /R:2 /W:2'; String robocopyOptions = '/E /COPY:DAT /DCOPY:T /R:2 /W:2';
@ -628,6 +631,7 @@ class AppSettings {
'explorerShowHidden': explorerShowHidden, 'explorerShowHidden': explorerShowHidden,
'explorerPaths': explorerPaths, 'explorerPaths': explorerPaths,
'copyMethodFile': copyMethodFile, 'copyMethodFile': copyMethodFile,
'copyConflict': copyConflict,
'copyMethodFolder': copyMethodFolder, 'copyMethodFolder': copyMethodFolder,
'rsyncPaths': rsyncPaths, 'rsyncPaths': rsyncPaths,
'components': components, 'components': components,
@ -809,6 +813,7 @@ class AppSettings {
..explorerShowHidden = j['explorerShowHidden'] as bool? ?? false ..explorerShowHidden = j['explorerShowHidden'] as bool? ?? false
..explorerPaths = [for (final x in (j['explorerPaths'] as List?) ?? const []) '$x'] ..explorerPaths = [for (final x in (j['explorerPaths'] as List?) ?? const []) '$x']
..copyMethodFile = _method(j['copyMethodFile']) ..copyMethodFile = _method(j['copyMethodFile'])
..copyConflict = const ['rename', 'overwrite', 'skip'].contains(j['copyConflict']) ? j['copyConflict'] as String : 'ask'
..copyMethodFolder = _method(j['copyMethodFolder']) ..copyMethodFolder = _method(j['copyMethodFolder'])
..rsyncPaths = [for (final x in (j['rsyncPaths'] as List?) ?? const []) '$x'] ..rsyncPaths = [for (final x in (j['rsyncPaths'] as List?) ?? const []) '$x']
..components = j['components'] is List ..components = j['components'] is List

View File

@ -121,6 +121,21 @@ class _CopySyncSettingsState extends State<CopySyncSettings> {
_options(tr('robocopy 옵션'), tr('예: /E /COPY:DAT /DCOPY:T /R:2 /W:2. 이동은 /MOVE 를 자동으로 붙임'), s.robocopyOptions, _options(tr('robocopy 옵션'), tr('예: /E /COPY:DAT /DCOPY:T /R:2 /W:2. 이동은 /MOVE 를 자동으로 붙임'), s.robocopyOptions,
defaultRobocopyOptions, (x, v) => x.robocopyOptions = v), defaultRobocopyOptions, (x, v) => x.robocopyOptions = v),
], ],
// 48: 같은 이름이 있을 때 (앱이 직접 복사 · 이동할 때, robocopy · rsync 는 그 프로그램의 규칙)
SettingTile(
title: Text(tr('같은 이름이 있을 때')),
subtitle: Text(tr('복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)')),
trailing: DropdownButton<String>(
value: const ['ask', 'rename', 'overwrite', 'skip'].contains(s.copyConflict) ? s.copyConflict : 'ask',
items: [
DropdownMenuItem(value: 'ask', child: Text(tr('묻기'))),
DropdownMenuItem(value: 'rename', child: Text(tr('늘 이름 바꾸기'))),
DropdownMenuItem(value: 'overwrite', child: Text(tr('늘 덮어쓰기'))),
DropdownMenuItem(value: 'skip', child: Text(tr('늘 건너뛰기'))),
],
onChanged: (v) => c.updateSettings((x) => x.copyConflict = v ?? 'ask'),
),
),
SettingTile( SettingTile(
title: Text(tr('속도 제한 (KB/s)')), title: Text(tr('속도 제한 (KB/s)')),
subtitle: Text(tr('0 = 제한 없음. 모든 방법에 적용: rsync --bwlimit, 현재 방식은 앱이 조절, robocopy 는 /IPG 로 비슷하게. ' subtitle: Text(tr('0 = 제한 없음. 모든 방법에 적용: rsync --bwlimit, 현재 방식은 앱이 조절, robocopy 는 /IPG 로 비슷하게. '

View File

@ -280,7 +280,8 @@ class _ExplorerPageState extends State<ExplorerPage> {
_panes[i] _panes[i]
..root = _volumeOf(wants[i]) ..root = _volumeOf(wants[i])
..current = wants[i] ..current = wants[i]
..focused = wants[i]; // 48 보충 (관리자): 처음 열면 아무것도 고르지 않은 상태 - 열자마자 폴더 통째가 복사 · 이동 대상이 되지 않게
..focused = null;
} }
if (!mounted) return; if (!mounted) return;
setState(() => _ready = true); setState(() => _ready = true);
@ -293,7 +294,7 @@ class _ExplorerPageState extends State<ExplorerPage> {
} }
for (var i = 0; i < 2; i++) { for (var i = 0; i < 2; i++) {
final pane = _panes[i]; final pane = _panes[i];
unawaited(_goTo(pane, wants[i], remember: false).then((_) => _reveal(pane, pane.current))); unawaited(_goTo(pane, wants[i], remember: false, focus: false).then((_) => _reveal(pane, pane.current)));
} }
} }
@ -586,7 +587,7 @@ class _ExplorerPageState extends State<ExplorerPage> {
/// 그 폴더로: 저장 장치부터 그 폴더까지 펼치고 지금 폴더로 정한다 /// 그 폴더로: 저장 장치부터 그 폴더까지 펼치고 지금 폴더로 정한다
/// [fresh]: 경로 입력 · 찾기 · 내역으로 갈 때 - 그 폴더를 새로 읽는다 (앱 밖에서 바뀐 것까지 보이게, 122) /// [fresh]: 경로 입력 · 찾기 · 내역으로 갈 때 - 그 폴더를 새로 읽는다 (앱 밖에서 바뀐 것까지 보이게, 122)
Future<void> _goTo(_Pane pane, String dir, {bool remember = true, bool fresh = false}) async { Future<void> _goTo(_Pane pane, String dir, {bool remember = true, bool fresh = false, bool focus = true}) async {
// 124 · 128: 사용자가 WebDAV 로 간 것이면 마스터 창을 한 번 취소했어도 다시 묻는다 (켤 때 되살리는 것은 [remember] 없음) // 124 · 128: 사용자가 WebDAV 로 간 것이면 마스터 창을 한 번 취소했어도 다시 묻는다 (켤 때 되살리는 것은 [remember] 없음)
if (remember && isDav(dir)) await SecretGate.pass(force: true); if (remember && isDav(dir)) await SecretGate.pass(force: true);
if (!mounted) return; if (!mounted) return;
@ -607,9 +608,8 @@ class _ExplorerPageState extends State<ExplorerPage> {
await _load(pane, x, force: true); await _load(pane, x, force: true);
} }
} }
pane pane.current = dir;
..current = dir if (focus) pane.focused = dir;
..focused = dir;
pane.changed(); pane.changed();
if (pane.listScroll.hasClients) pane.listScroll.jumpTo(0); if (pane.listScroll.hasClients) pane.listScroll.jumpTo(0);
_reveal(pane, dir); _reveal(pane, dir);
@ -1494,7 +1494,14 @@ class _ExplorerPageState extends State<ExplorerPage> {
// 확인 창은 바로 띄우고, 같은 이름은 창 안에서 뒤에서 찾는다 (느린 네트워크 · WebDAV 폴더라도 창이 늦게 뜨지 않게). // 확인 창은 바로 띄우고, 같은 이름은 창 안에서 뒤에서 찾는다 (느린 네트워크 · WebDAV 폴더라도 창이 늦게 뜨지 않게).
// 다 찾기 전에 누르면 이름 바꾸기 (원래 파일을 건드리지 않는 쪽) // 다 찾기 전에 누르면 이름 바꾸기 (원래 파일을 건드리지 않는 쪽)
final clashesFuture = builtin ? _findClashes(sources, dest) : Future.value(const <String>[]); final clashesFuture = builtin ? _findClashes(sources, dest) : Future.value(const <String>[]);
var conflict = NameConflict.rename; // 48: 환경 설정 "같은 이름이 있을 때" 가 늘 하는 것이면 묻지 않고 그대로 (확인 창에 알림만)
final always = switch (c.settings.copyConflict) {
'rename' => NameConflict.rename,
'overwrite' => NameConflict.overwrite,
'skip' => NameConflict.skip,
_ => null,
};
var conflict = always ?? NameConflict.rename;
final go = await showDialog<bool>( final go = await showDialog<bool>(
context: context, context: context,
builder: (ctx) => StatefulBuilder( builder: (ctx) => StatefulBuilder(
@ -1522,6 +1529,17 @@ class _ExplorerPageState extends State<ExplorerPage> {
const SizedBox(height: 12), const SizedBox(height: 12),
Text(trf('같은 이름이 이미 있습니다: {0}', [_namesOf(clashes)]), Text(trf('같은 이름이 이미 있습니다: {0}', [_namesOf(clashes)]),
style: const TextStyle(color: Colors.orangeAccent)), style: const TextStyle(color: Colors.orangeAccent)),
if (always != null)
Text(
trf('환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)', [
switch (always) {
NameConflict.rename => tr('이름을 바꿉니다'),
NameConflict.overwrite => tr('덮어씁니다'),
NameConflict.skip => tr('건너뜁니다'),
}
]),
style: const TextStyle(fontSize: 12))
else
RadioGroup<NameConflict>( RadioGroup<NameConflict>(
groupValue: conflict, groupValue: conflict,
onChanged: (x) => setInner(() => conflict = x ?? conflict), onChanged: (x) => setInner(() => conflict = x ?? conflict),

View File

@ -83,6 +83,28 @@ void main() {
expect(File(p.join(right, 'doc (2).txt')).existsSync(), isFalse); expect(File(p.join(right, 'doc (2).txt')).existsSync(), isFalse);
}); });
testWidgets('48 보충: 환경 설정이 "늘 덮어쓰기" 면 묻지 않고 (확인 창에 알림만) 덮어쓴다', (tester) async {
c.settings.copyConflict = 'overwrite';
await startCopy(tester);
expect(find.text('덮어쓰기 (원래 파일은 없어집니다)'), findsNothing, reason: '고르는 칸 없음');
expect(find.textContaining('환경 설정대로 덮어씁니다'), findsOneWidget);
await confirm(tester);
expect(File(p.join(right, 'doc.txt')).readAsStringSync(), 'new');
});
testWidgets('48 보충: 처음 열면 아무것도 고르지 않은 상태 - 바로 [복사] 를 누르면 "복사할 항목을 고르세요" (폴더 통째로 복사하지 않음)', (tester) async {
tester.view.physicalSize = const Size(1600, 900);
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.reset);
await tester.runAsync(() => tester.pumpWidget(MaterialApp(home: ExplorerPage(c: c))));
await settle(tester, () => find.text('doc.txt').evaluate().length >= 2);
await tester.runAsync(() => tester.tap(find.text('복사').first));
await tester.pump();
expect(find.widgetWithText(FilledButton, '복사'), findsNothing, reason: '확인 창이 뜨지 않음');
expect(find.textContaining('복사할 항목을 고르세요'), findsOneWidget);
expect(Directory(p.join(right, 'left')).existsSync(), isFalse);
});
testWidgets('48: 건너뛰기를 고르면 그대로 두고 건너뛴 것을 알린다', (tester) async { testWidgets('48: 건너뛰기를 고르면 그대로 두고 건너뛴 것을 알린다', (tester) async {
await startCopy(tester); await startCopy(tester);
await tester.tap(find.text('건너뛰기')); await tester.tap(find.text('건너뛰기'));