FIX: conflicts

This commit is contained in:
j2969719 2024-11-05 09:38:21 +03:00
commit fc099f4704
106 changed files with 4671 additions and 3426 deletions

7
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,7 @@
---
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"

View file

@ -11,7 +11,7 @@ concurrency:
jobs:
build-mac:
runs-on: macos-12
runs-on: macos-13
steps:
- name: Install Free Pascal
uses: alexx2000/setup-fpc@master
@ -19,7 +19,7 @@ jobs:
lazarus-version: "stable"
- name: Get Lazarus source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: 'fpc/Lazarus'
@ -33,7 +33,7 @@ jobs:
sudo sed -i -e "s|_PPCARCH_|fpc|g; s|/Developer/lazarus|/usr/local/share/lazarus|g" /etc/lazarus/environmentoptions.xml
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0

View file

@ -17,7 +17,7 @@ concurrency:
jobs:
build-mac:
runs-on: macos-12
runs-on: macos-13
steps:
- name: Install Free Pascal
uses: alexx2000/setup-fpc@master
@ -25,7 +25,7 @@ jobs:
lazarus-version: "stable"
- name: Get Lazarus source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
repository: 'fpc/Lazarus'
@ -39,7 +39,7 @@ jobs:
sudo sed -i -e "s|_PPCARCH_|fpc|g; s|/Developer/lazarus|/usr/local/share/lazarus|g" /etc/lazarus/environmentoptions.xml
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
@ -62,7 +62,7 @@ jobs:
lazarus-version: "stable"
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0

View file

@ -43,6 +43,9 @@ function FileTimeToDateTimeEx(FileTime : DCBasicTypes.TFileTimeEx) : TDateTime;
function DateTimeToFileTime(DateTime : TDateTime) : DCBasicTypes.TFileTime;
function DateTimeToFileTimeEx(DateTime : TDateTime) : DCBasicTypes.TFileTimeEx;
function FileTimeToWinFileTime(FileTime : DCBasicTypes.TFileTime) : TWinFileTime;
function WinFileTimeToFileTimeEx(FileTime: TWinFileTime) : DCBasicTypes.TFileTimeEx;
{en
Converts system specific UTC time to local time.
}
@ -100,6 +103,7 @@ function UnixFileTimeToDateTimeEx(UnixTime: DCBasicTypes.TFileTimeEx) : TDateTim
{$ENDIF}
function DateTimeToUnixFileTime(DateTime: TDateTime) : TUnixFileTime;
function DateTimeToUnixFileTimeEx(DateTime: TDateTime) : DCBasicTypes.TFileTimeEx;
function UnixFileTimeToFileTime(UnixTime: TUnixFileTime): DCBasicTypes.TFileTime;
function UnixFileTimeToDosTime(UnixTime: TUnixFileTime): TDosFileTime;
function UnixFileTimeToWinTime(UnixTime: TUnixFileTime): TWinFileTime;
function WinFileTimeToUnixTime(WinTime: TWinFileTime) : TUnixFileTime;
@ -279,6 +283,29 @@ begin
end;
{$ENDIF}
function FileTimeToWinFileTime(FileTime: DCBasicTypes.TFileTime): TWinFileTime;
{$IF DEFINED(MSWINDOWS)}
begin
Result:= TWinFileTime(FileTime)
end;
{$ELSEIF DEFINED(UNIX)}
begin
Result:= UnixFileTimeToWinTime(TUnixFileTime(FileTime));
end;
{$ENDIF}
function WinFileTimeToFileTimeEx(FileTime: TWinFileTime): DCBasicTypes.TFileTimeEx;
{$IF DEFINED(MSWINDOWS)}
begin
Result := TFileTimeEx(FileTime);
end;
{$ELSEIF DEFINED(UNIX)}
begin
Result.Sec:= Int64((FileTime - UnixWinEpoch) div 10000000);
Result.NanoSec:= Int64((FileTime - UnixWinEpoch) mod 10000000) * 100;
end;
{$ENDIF}
function FileTimeToLocalFileTime(const FileTime: DCBasicTypes.TFileTime;
out LocalFileTime: DCBasicTypes.TFileTime): LongBool;
{$IFDEF MSWINDOWS}
@ -596,6 +623,15 @@ begin
end;
{$ENDIF}
function UnixFileTimeToFileTime(UnixTime: TUnixFileTime): DCBasicTypes.TFileTime; inline;
begin
{$IF DEFINED(MSWINDOWS)}
Result:= UnixFileTimeToWinTime(UnixTime);
{$ELSE}
Result:= UnixTime;
{$ENDIF}
end;
function UnixFileTimeToDosTime(UnixTime: TUnixFileTime): TDosFileTime;
begin
Result := DateTimeToDosFileTime(UnixFileTimeToDateTime(UnixTime));

View file

@ -101,6 +101,7 @@ const
function WinToUnixFileAttr(Attr: TFileAttrs): TFileAttrs;
function UnixToWinFileAttr(Attr: TFileAttrs): TFileAttrs;
function UnixToWcxFileAttr(Attr: TFileAttrs): TFileAttrs;
function WinToWcxFileAttr(Attr: TFileAttrs): TFileAttrs;
function UnixToWinFileAttr(const FileName: String; Attr: TFileAttrs): TFileAttrs;
function SingleStrToFileAttr(sAttr: String): TFileAttrs;
@ -229,6 +230,17 @@ begin
{$ENDIF}
end;
function WinToWcxFileAttr(Attr: TFileAttrs): TFileAttrs;
begin
{$IF DEFINED(UNIX)}
Result := WinToUnixFileAttr(Attr);
{$ELSEIF DEFINED(MSWINDOWS)}
Result := Attr;
{$ELSE}
Result := 0;
{$ENDIF}
end;
function UnixToWinFileAttr(const FileName: String; Attr: TFileAttrs): TFileAttrs;
begin
Result := UnixToWinFileAttr(Attr);

View file

@ -250,6 +250,7 @@ function _CreateSymLink_Old(aTargetFileName, aSymlinkFileName: UnicodeString): B
var
hDevice: THandle;
lpInBuffer: PReparseDataBuffer;
dwLastError,
nInBufferSize,
dwPathBufferSize: DWORD;
wsNativeFileName: UnicodeString;
@ -261,7 +262,11 @@ begin
hDevice:= CreateFileW(PWideChar(aSymlinkFileName),
GENERIC_WRITE, 0, nil, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OPEN_REPARSE_POINT, 0);
if hDevice = INVALID_HANDLE_VALUE then Exit(False);
if hDevice = INVALID_HANDLE_VALUE then
begin
dwLastError:= GetLastError;
Exit(False);
end;
if Pos(wsLongFileNamePrefix, aTargetFileName) <> 1 then
wsNativeFileName:= wsNativeFileNamePrefix + aTargetFileName
else begin
@ -288,11 +293,15 @@ begin
0, // nOutBufferSize
lpBytesReturned, // lpBytesReturned
nil); // OVERLAPPED structure
if not Result then dwLastError:= GetLastError;
FreeMem(lpInBuffer);
CloseHandle(hDevice);
finally
if not Result then RemoveDirectoryW(PWideChar(aSymlinkFileName));
if not Result then
begin
RemoveDirectoryW(PWideChar(aSymlinkFileName));
SetLastError(dwLastError);
end;
end;
end;

View file

@ -65,6 +65,7 @@ copy windows\license.rtf %BUILD_PACK_DIR%\
copy ..\src\doublecmd.ico %BUILD_PACK_DIR%\
rem Copy libraries
copy windows\lib\%CPU_TARGET%\*.sfx %BUILD_DC_TMP_DIR%\
copy windows\lib\%CPU_TARGET%\*.dll %BUILD_DC_TMP_DIR%\
copy windows\lib\%CPU_TARGET%\winpty-agent.exe %BUILD_DC_TMP_DIR%\

View file

@ -95,6 +95,7 @@ Source: "doublecmd\pixmaps\*"; DestDir: "{app}\pixmaps"; Flags: ignoreversion re
Source: "doublecmd\plugins\*"; DestDir: "{app}\plugins"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "doublecmd\highlighters\*"; DestDir: "{app}\highlighters"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
Source: "doublecmd\*.sfx"; DestDir: "{app}"; Flags: skipifsourcedoesntexist
Source: "doublecmd\*.dll"; DestDir: "{app}"; Flags: skipifsourcedoesntexist
[Icons]

View file

@ -42,6 +42,7 @@ copy doublecmd.help %DC_INSTALL_DIR%\
copy doublecmd.zdli %DC_INSTALL_DIR%\
copy pinyin.tbl %DC_INSTALL_DIR%\
rem Copy libraries
copy *.sfx %DC_INSTALL_DIR%\
copy *.dll %DC_INSTALL_DIR%\
copy winpty-agent.exe %DC_INSTALL_DIR%\
rem Copy manifest

View file

@ -338,6 +338,10 @@ msgstr "Адкрыць файл кантрольнай сумы пасля за
msgid "C&reate separate checksum file for each file"
msgstr "С&твараць асобны файл кантрольнай сумы для кожнага файла"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3152,7 +3156,7 @@ msgid "C&onfiguration"
msgstr "&Канфігурацыя"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Улюбёнае"
#: tfrmmain.mnufiles.caption
@ -3170,7 +3174,7 @@ msgstr "&Пазначэнне"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "Сетка"
#: tfrmmain.mnushow.caption
@ -10829,6 +10833,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10949,6 +10957,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -342,6 +342,10 @@ msgstr ""
msgid "C&reate separate checksum file for each file"
msgstr "Съз&даване на отделни проверочни сборове за всички файлове"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3248,7 +3252,7 @@ msgid "C&onfiguration"
msgstr "&Настройка"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Предпочитани"
#: tfrmmain.mnufiles.caption
@ -3266,7 +3270,7 @@ msgstr "&Избор"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Мрежа"
#: tfrmmain.mnushow.caption
@ -11306,6 +11310,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11426,6 +11434,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -377,6 +377,10 @@ msgstr ""
msgid "C&reate separate checksum file for each file"
msgstr "Crea un fitxer por cada comprobació"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3460,7 +3464,7 @@ msgid "C&onfiguration"
msgstr "C&onfiguració"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr ""
#: tfrmmain.mnufiles.caption
@ -3480,7 +3484,7 @@ msgstr "&Selecció"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Xarxa"
#: tfrmmain.mnushow.caption
@ -11795,6 +11799,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11914,6 +11922,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -335,6 +335,10 @@ msgstr "Otevřít soubor po vytvoření kontrolního součtu"
msgid "C&reate separate checksum file for each file"
msgstr "V&ytvořit samostatný kontrolní součet pro každý soubor"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3162,7 +3166,7 @@ msgid "C&onfiguration"
msgstr "N&astavení"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Oblíbené"
#: tfrmmain.mnufiles.caption
@ -3180,7 +3184,7 @@ msgstr "&Výběr"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Síť"
#: tfrmmain.mnushow.caption
@ -10850,6 +10854,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10970,6 +10978,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -352,6 +352,10 @@ msgstr "&Åbn kontrolsumfil efter opgaven er færdig"
msgid "C&reate separate checksum file for each file"
msgstr "Dan en &separat kontrolsumfil for hver fil"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3370,7 +3374,7 @@ msgstr "&Opsætning"
# In the menu bar
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Favo&ritter"
#: tfrmmain.mnufiles.caption
@ -3390,7 +3394,7 @@ msgstr "&Marker"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "&Netværk"
# Vis
@ -11904,6 +11908,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -12024,6 +12032,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: Double Commander 1.1.0 alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-11-15 11:15+0300\n"
"PO-Revision-Date: 2024-10-11 16:17+0200\n"
"PO-Revision-Date: 2024-11-01 18:01+0100\n"
"Last-Translator: ㋡ <braass@mail.de>\n"
"Language-Team: Deutsch <braass@mail.de>\n"
"Language: de\n"
@ -334,6 +334,10 @@ msgstr "Prüfsummen-Datei öffnen, nachdem der Job beendet ist"
msgid "C&reate separate checksum file for each file"
msgstr "Einzelne Prüfsumme fü&r jede Datei erstellen"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr "Einzelne Prüfsumme für jedes &Verzeichnis erstellen"
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "Dateiformat"
@ -3146,7 +3150,7 @@ msgid "C&onfiguration"
msgstr "K&onfigurieren"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "☆-&Tabs"
#: tfrmmain.mnufiles.caption
@ -3164,7 +3168,7 @@ msgstr "&Markieren"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "&Netzwerk"
#: tfrmmain.mnushow.caption
@ -10811,6 +10815,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr "Finder-Tags bearbeiten ..."
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr "Gewähren Sie »Volle Festplattenzugriffsrechte« zur Unterstützung von Finder-Tags ..."
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10926,6 +10934,10 @@ msgstr "Dateiliste aktualisieren"
msgid "Refresh"
msgstr "Aktualisieren"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr "Suche nach kombinierten Tags ..."
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr "Dateien suchen ..."

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: Double Commander 1.1.0 alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-11-15 11:15+0300\n"
"PO-Revision-Date: 2024-01-02 22:43+0200\n"
"PO-Revision-Date: 2024-10-18 20:59+0300\n"
"Last-Translator: Anastasios Kazakis <anastasios.kazakis@tutanota.com>\n"
"Language-Team: Anastasios Kazakis <anastasios.kazakis@tutanota.com>\n"
"Language: el_GR\n"
@ -12,7 +12,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Native-Language: ελληνικά\n"
"X-Generator: Poedit 3.4.1\n"
"X-Generator: Poedit 3.4.2\n"
"X-Language: el_GR\n"
"X-Source-Language: el\n"
"X-Poedit-SourceCharset: ISO-8859-7\n"
@ -346,6 +346,10 @@ msgstr "Άνοιγμα αρχείου αθροίσματος ελέγχου με
msgid "C&reate separate checksum file for each file"
msgstr "Δημιουργία ξεχωριστού αρχείου αθροίσματος ελέγχου για κάθε αρχείο"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "Μορφή Αρχείου"
@ -2845,11 +2849,11 @@ msgstr "Εμφάνιση Κρυφών Αρχείων/Αρχείων Συστήμ
#: tfrmmain.actshowtabslist.caption
msgid "Show Tabs List"
msgstr ""
msgstr "Εμφάνιση Λίστας Καρτελών"
#: tfrmmain.actshowtabslist.hint
msgid "Show list of all open tabs"
msgstr ""
msgstr "Εμφάνιση λίστας όλων των ανοικτών καρτελών"
#: tfrmmain.actsortbyattr.caption
msgid "Sort by &Attributes"
@ -2915,7 +2919,7 @@ msgstr "Προβολή Μικρογραφιών"
#: tfrmmain.acttogglefullscreenconsole.caption
msgid "Toggle fullscreen mode console"
msgstr "Εναλλαγή σε τερματικό πλήρους οθόνης"
msgstr "Εναλλαγή σε λειτουργία τερματικού πλήρους οθόνης"
#: tfrmmain.acttransferleft.caption
msgid "Transfer dir under cursor to left window"
@ -3207,7 +3211,7 @@ msgid "C&onfiguration"
msgstr "Διαμόρφωση"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Αγαπημένα"
#: tfrmmain.mnufiles.caption
@ -3225,7 +3229,7 @@ msgstr "Επιλογή"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Δίκτυο"
#: tfrmmain.mnushow.caption
@ -4007,7 +4011,7 @@ msgstr "Χρήση ονόματος αρχείου χωρίς επέκταση
#: tfrmoptionsarchivers.chkhide.caption
msgid "Show as normal files"
msgstr ""
msgstr "Εμφάνιση σαν κανονικά αρχεία"
#: tfrmoptionsarchivers.ckbarchiverunixfileattributes.caption
msgid "Uni&x file attributes"
@ -7093,7 +7097,7 @@ msgstr "Επιλογή"
#: tfrmoptionsmouse.lblmousemode.caption
msgid "&Mode:"
msgstr "Λειτουργία:"
msgstr "Τρόπος Λειτουργίας:"
#: tfrmoptionsmouse.rbdoubleclick.caption
msgid "Double click"
@ -11030,17 +11034,21 @@ msgstr "Εισάγετε νέα προσαρμοσμένα χρώματα στη
#: ulng.rsmenumacosaddfindertag
#, object-pascal-format
msgid "Add \"%s\""
msgstr ""
msgstr "Προσθήκη \"%s\""
#: ulng.rsmenumacoseditfindertags
msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr "Επεξεργασία Ετικετών Εφαρμογής Εύρεσης..."
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
msgstr ""
msgstr "Αφαίρεση \"%s\""
#: ulng.rsmenumacosshare
msgid "Share..."
@ -11049,41 +11057,37 @@ msgstr "Διαμοιρασμός..."
#: ulng.rsmfstbiairdroptips
msgctxt "ulng.rsmfstbiairdroptips"
msgid "AirDrop"
msgstr ""
msgstr "AirDrop"
#: ulng.rsmfstbiairdroptitle
msgctxt "ulng.rsmfstbiairdroptitle"
msgid "AirDrop"
msgstr ""
msgstr "AirDrop"
#: ulng.rsmfstbicommandmenudirectoryhotlist
#, fuzzy
msgctxt "ulng.rsmfstbicommandmenudirectoryhotlist"
msgid "Directory Hotlist"
msgstr "Κατάλογος Hotlist"
#: ulng.rsmfstbicommandmenufavoritetabs
#, fuzzy
msgctxt "ulng.rsmfstbicommandmenufavoritetabs"
msgid "Favorite Tabs"
msgstr "Αγαπημένες Καρτέλες"
#: ulng.rsmfstbicommandmenuquicklook
msgid "macOS QuickLook"
msgstr ""
msgstr "macOS QuickLook"
#: ulng.rsmfstbicommandtitle
#, fuzzy
msgctxt "ulng.rsmfstbicommandtitle"
msgid "Command"
msgstr "Εντολή"
#: ulng.rsmfstbicomparetips
msgid "Compare by Contents..."
msgstr ""
msgstr "Σύγκριση ανά Περιεχόμενο..."
#: ulng.rsmfstbicomparetitle
#, fuzzy
msgctxt "ulng.rsmfstbicomparetitle"
msgid "Compare"
msgstr "Σύγκριση"
@ -11091,147 +11095,148 @@ msgstr "Σύγκριση"
#: ulng.rsmfstbieditfindertagtips
msgctxt "ulng.rsmfstbieditfindertagtips"
msgid "Edit Finder Tags..."
msgstr ""
msgstr "Επεξεργασία Ετικετών Εφαρμογής Εύρεσης..."
#: ulng.rsmfstbieditfindertagtitle
msgid "EditTag"
msgstr ""
msgstr "ΕπεξεργασίαΕτικέτας"
#: ulng.rsmfstbiedittips
msgid "Edit..."
msgstr ""
msgstr "Επεξεργασία..."
#: ulng.rsmfstbiedittitle
#, fuzzy
msgctxt "ulng.rsmfstbiedittitle"
msgid "Edit"
msgstr "Επεξεργασία"
#: ulng.rsmfstbifinderrevealtips
msgid "Reveal in Finder"
msgstr ""
msgstr "Αποκάλυψη στην Εφαρμογή Αναζήτησης"
#: ulng.rsmfstbifinderrevealtitle
msgid "Finder"
msgstr ""
msgstr "Εφαρμογής Εύρεσης"
#: ulng.rsmfstbigotips
msgctxt "ulng.rsmfstbigotips"
msgid "Go"
msgstr ""
msgstr "Μετάβαση"
#: ulng.rsmfstbigotitle
msgctxt "ulng.rsmfstbigotitle"
msgid "Go"
msgstr ""
msgstr "Μετάβαση"
#: ulng.rsmfstbihorzsplittips
msgid "Toggle Horizontal Split Mode"
msgstr ""
msgstr "Εναλλαγή σε Λειτουργία Οριζοντίου Διαχωρισμού"
#: ulng.rsmfstbihorzsplittitle
msgid "HorzSplit"
msgstr ""
msgstr "HorzSplit"
#: ulng.rsmfstbiprivilegetips
msgid "As a file manager, Double Command requires full disk access permissions. Clicking this button will pop up the macOS system settings page. Please add \"Double Commander.app\" to the \"Full Disk Access\" list to complete the authorization."
msgstr ""
msgstr "Σαν διαχειριστής αρχείων, ο Double Commander απαιτεί πλήρεις άδειες δίσκου. Πατώντας αυτό το πλήκτρο θα εμφανιστεί σαν αναδυόμενο η καρτέλα ρυθμίσεων του συστήματος macOS. Παρακαλώ προσθέστε \"Double Commander.app\" στην λίστα \"Full Disk Access\" για ολοκλήρωση της αδειοδότησης."
#: ulng.rsmfstbiprivilegetitle
msgid "Privilege"
msgstr ""
msgstr "Προνόμιο"
#: ulng.rsmfstbiquicklooktips
msgid "macOS Quick Look Panel"
msgstr ""
msgstr "Καρτέλα macOS Quick Look"
#: ulng.rsmfstbiquicklooktitle
msgid "QuickLook"
msgstr ""
msgstr "QuickLook"
#: ulng.rsmfstbirefreshtips
msgid "Refresh File List"
msgstr ""
msgstr "Ανανέωση Λίστας Αρχείων"
#: ulng.rsmfstbirefreshtitle
msgid "Refresh"
msgstr "Ανανέωση"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""
msgstr "Αναζήτηση Αρχείων..."
#: ulng.rsmfstbisearchtitle
#, fuzzy
msgctxt "ulng.rsmfstbisearchtitle"
msgid "Search"
msgstr "Αναζήτηση"
#: ulng.rsmfstbisharetitle
msgid "Share"
msgstr ""
msgstr "Διαμοιρασμός"
#: ulng.rsmfstbishowbrieftitle
msgid "as Brief"
msgstr ""
msgstr "Σύντομη Περιγραφή"
#: ulng.rsmfstbishowfulltitle
msgid "as Full"
msgstr ""
msgstr "Πλήρης Περιγραφή"
#: ulng.rsmfstbishowinfotips
msgid "Show Info in Finder"
msgstr ""
msgstr "Εμφάνιση Πληροφοριών στην Εφαρμογή Αναζήτησης"
#: ulng.rsmfstbishowinfotitle
msgid "ShowInfo"
msgstr ""
msgstr "ΕμφάνισηΠληροφοριών"
#: ulng.rsmfstbishowmodetips
msgid "Show as Brief, Full or Thumbnails"
msgstr ""
msgstr "Εμφάνιση Σύντομης, Πλήρους Περιγραφής ή σε Μικρογραφίες"
#: ulng.rsmfstbishowmodetitle
msgid "ShowMode"
msgstr ""
msgstr "ΕμφάνισηΤρόπουΛειτουργίας"
#: ulng.rsmfstbishowthumbnailstitle
msgid "as Thumbnails"
msgstr ""
msgstr "σαν Μικρογραφίες"
#: ulng.rsmfstbiswappanelstips
msgid "Swap Panels"
msgstr ""
msgstr "Ανταλλαγή Καρτελών"
#: ulng.rsmfstbiswappanelstitle
msgid "SwapPanels"
msgstr ""
msgstr "ΑνταλλαγήΚαρτελών"
#: ulng.rsmfstbisynctips
msgid "Synchronize Dirs..."
msgstr ""
msgstr "Συγχρονισμός Καταλόγων..."
#: ulng.rsmfstbisynctitle
msgid "Sync"
msgstr ""
msgstr "Συγχρονισμός"
#: ulng.rsmfstbiterminaltips
msgid "Open in Terminal"
msgstr ""
msgstr "Άνοιγμα σε Τερματικό"
#: ulng.rsmfstbiterminaltitle
#, fuzzy
msgctxt "ulng.rsmfstbiterminaltitle"
msgid "Terminal"
msgstr "Τερματικό"
#: ulng.rsmfstbitreeviewtips
msgid "Show Tree View Panel"
msgstr ""
msgstr "Εμφάνιση Καρτέλας Προβολής Δέντρου"
#: ulng.rsmfstbitreeviewtitle
msgid "TreeView"
msgstr ""
msgstr "ΠροβολήΔέντρου"
#: ulng.rsmnuactions
msgctxt "ulng.rsmnuactions"
@ -11278,7 +11283,7 @@ msgstr "Νέο"
#: ulng.rsmnunewwindow
msgid "New Window"
msgstr ""
msgstr "Νέο Παράθυρο"
#: ulng.rsmnunomedia
msgid "No media available"
@ -13112,7 +13117,7 @@ msgstr "Για να αλλάξετε τη τρέχουσα διαμόρφωση
#: ulng.rsoptarchiveradditonalcmd
msgid "Mode dependent, additional command"
msgstr "Εξαρτώμενο από την κατάσταση, επιπρόσθετη εντολή"
msgstr "Εξαρτώμενη από τον τρόπο λειτουργίας κατάσταση, επιπρόσθετη εντολή"
#: ulng.rsoptarchiveraddonlynotempty
msgid "Add if it is non-empty"

View file

@ -334,6 +334,10 @@ msgstr "Abrir la suma de verificación tras completar el trabajo"
msgid "C&reate separate checksum file for each file"
msgstr "C&rear suma de verificación por cada archivo"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3176,7 +3180,7 @@ msgid "C&onfiguration"
msgstr "C&onfiguración"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Pestañas favoritas"
#: tfrmmain.mnufiles.caption
@ -3194,7 +3198,7 @@ msgstr "&Seleccionar"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "Red"
#: tfrmmain.mnushow.caption
@ -10943,6 +10947,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11063,6 +11071,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -384,6 +384,10 @@ msgstr "Ouvre le fichier de signature à la fin de la tâche"
msgid "C&reate separate checksum file for each file"
msgstr "Créer une signature séparée pour chaque fichier"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "Format de fichier"
@ -3268,7 +3272,7 @@ msgid "C&onfiguration"
msgstr "Confi&guration"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Onglets favoris"
#: tfrmmain.mnufiles.caption
@ -3286,7 +3290,7 @@ msgstr "&Sélection"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Réseau"
#: tfrmmain.mnushow.caption
@ -11151,6 +11155,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11271,6 +11279,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -373,6 +373,10 @@ msgstr "Otvorite datoteku provjere nakon završetka zadatka"
msgid "C&reate separate checksum file for each file"
msgstr "&Učini posebnu datoteku zbirne provjere za svaku datoteku"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3400,8 +3404,7 @@ msgid "C&onfiguration"
msgstr "&Postavke"
#: tfrmmain.mnufavoritetabs.caption
msgctxt "TFRMMAIN.MNUCONTEXTLINE2.CAPTION"
msgid "Favorites"
msgid "F&avorites"
msgstr "Omiljeno"
#: tfrmmain.mnufiles.caption
@ -3420,7 +3423,7 @@ msgstr "Oznaka&"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Mreža"
#: tfrmmain.mnushow.caption
@ -11512,6 +11515,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11632,6 +11639,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -333,6 +333,10 @@ msgstr "Az ellenőrzőösszeg-fájl megnyitása amikor kész"
msgid "C&reate separate checksum file for each file"
msgstr "&Külön MD5/SHA1 készítése fájlonként"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "Fájl &formátum"
@ -3146,7 +3150,7 @@ msgid "C&onfiguration"
msgstr "&Beállítások"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "&Kedvencek"
#: tfrmmain.mnufiles.caption
@ -3164,7 +3168,7 @@ msgstr "&Megjelölés"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "Hálózat"
#: tfrmmain.mnushow.caption
@ -10811,6 +10815,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10931,6 +10939,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -341,6 +341,10 @@ msgstr "作業完了後にチェックサムファイルを開く"
msgid "C&reate separate checksum file for each file"
msgstr "ファイルごとに個別のチェックサム ファイルを作成(&r)"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3216,7 +3220,7 @@ msgid "C&onfiguration"
msgstr "構成設定(&o)"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "お気に入り"
#: tfrmmain.mnufiles.caption
@ -3234,7 +3238,7 @@ msgstr "マーク(&M)"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "ネットワーク(&N)"
#: tfrmmain.mnushow.caption
@ -11068,6 +11072,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11188,6 +11196,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: Double Commander 1.1.0 alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-11-15 11:15+0300\n"
"PO-Revision-Date: 2024-10-08 05:02+0900\n"
"PO-Revision-Date: 2024-10-16 04:48+0900\n"
"Last-Translator: VenusGirl: venusgirl@outlook.com/\n"
"Language-Team: 비너스걸: https://venusgirls.tistory.com/\n"
"Language: ko\n"
@ -333,6 +333,10 @@ msgstr "작업 완료 후 체크섬 파일 열기"
msgid "C&reate separate checksum file for each file"
msgstr "각 파일에 대해 별도의 체크섬 파일 생성(&R)"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "파일 형식(&F)"
@ -3145,7 +3149,7 @@ msgid "C&onfiguration"
msgstr "구성(&O)"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "즐겨찾기"
#: tfrmmain.mnufiles.caption
@ -3163,7 +3167,7 @@ msgstr "선택(&M)"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "네트워크"
#: tfrmmain.mnushow.caption
@ -10804,17 +10808,21 @@ msgstr "새 사용자 지정 열 이름 입력"
#: ulng.rsmenumacosaddfindertag
#, object-pascal-format
msgid "Add \"%s\""
msgstr ""
msgstr "\"%s\" 추가"
#: ulng.rsmenumacoseditfindertags
msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr "파인더 태그 편집..."
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
msgstr ""
msgstr "\"%s\" 제거"
#: ulng.rsmenumacosshare
msgid "Share..."
@ -10865,11 +10873,11 @@ msgstr "비교"
#: ulng.rsmfstbieditfindertagtips
msgctxt "ulng.rsmfstbieditfindertagtips"
msgid "Edit Finder Tags..."
msgstr ""
msgstr "파인더 태그 편집..."
#: ulng.rsmfstbieditfindertagtitle
msgid "EditTag"
msgstr ""
msgstr "태그 편집"
#: ulng.rsmfstbiedittips
msgid "Edit..."
@ -10931,6 +10939,10 @@ msgstr "파일 목록 새로 고침"
msgid "Refresh"
msgstr "새로 고침"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr "파일 검색..."
@ -14242,5 +14254,5 @@ msgstr "교체가 이루어지지 않았습니다."
#: umaincommands.rsfavoritetabs_setupnotexist
#, object-pascal-format
msgid "No setup named \"%s\""
msgstr "\"%s\"라는 설정이 없습니다"
msgstr "\"%s\"라는 이름의 설정 없음"

View file

@ -344,6 +344,10 @@ msgstr "Åpn kontrollsumfil etter at jobb er utført"
msgid "C&reate separate checksum file for each file"
msgstr "&Opprett separat kontrollsumfil for hver fil"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3234,7 +3238,7 @@ msgid "C&onfiguration"
msgstr "&Oppsett"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Favo&ritter"
#: tfrmmain.mnufiles.caption
@ -3252,7 +3256,7 @@ msgstr "&Markér"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Nettverk"
#: tfrmmain.mnushow.caption
@ -11335,6 +11339,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11455,6 +11463,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -333,6 +333,10 @@ msgstr "Open checksum-bestand nadat de taak voltooid is"
msgid "C&reate separate checksum file for each file"
msgstr "Maak aparte checksum aan voor elk bestand"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3159,7 +3163,7 @@ msgid "C&onfiguration"
msgstr "&Instellingen"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Favorieten"
#: tfrmmain.mnufiles.caption
@ -3177,7 +3181,7 @@ msgstr "&Markeren"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "Netwerk"
#: tfrmmain.mnushow.caption
@ -10847,6 +10851,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10967,6 +10975,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -344,6 +344,10 @@ msgstr "Opn kontrollsumfil etter at jobb er utført"
msgid "C&reate separate checksum file for each file"
msgstr "&Opprett separat kontrollsumfil for kvar fil"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3234,7 +3238,7 @@ msgid "C&onfiguration"
msgstr "&Oppsett"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "&Favorittar"
#: tfrmmain.mnufiles.caption
@ -3252,7 +3256,7 @@ msgstr "&Markér"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "&Nettverk"
#: tfrmmain.mnushow.caption
@ -11335,6 +11339,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11455,6 +11463,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -332,6 +332,10 @@ msgstr "Otwórz plik sumy kontrolnej po zakończeniu pracy"
msgid "C&reate separate checksum file for each file"
msgstr "Dla każdego pliku utwó&rz oddzielny plik sumy kontrolnej"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "&Format pliku"
@ -3137,7 +3141,7 @@ msgid "C&onfiguration"
msgstr "&Konfiguracja"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "&Ulubione"
#: tfrmmain.mnufiles.caption
@ -3155,7 +3159,7 @@ msgstr "Zaz&nacz"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "&Sieć"
#: tfrmmain.mnushow.caption
@ -10776,6 +10780,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10896,6 +10904,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -331,6 +331,10 @@ msgstr ""
msgid "C&reate separate checksum file for each file"
msgstr ""
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3143,7 +3147,7 @@ msgid "C&onfiguration"
msgstr ""
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr ""
#: tfrmmain.mnufiles.caption
@ -3161,7 +3165,7 @@ msgstr ""
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr ""
#: tfrmmain.mnushow.caption
@ -10794,6 +10798,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10909,6 +10917,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -344,6 +344,10 @@ msgstr "Abrir ficheiro checksum após terminar a tarefa"
msgid "C&reate separate checksum file for each file"
msgstr "C&riar ficheiro checksum separado para cada ficheiro"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3234,7 +3238,7 @@ msgid "C&onfiguration"
msgstr "C&onfiguração"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Favoritos"
#: tfrmmain.mnufiles.caption
@ -3252,7 +3256,7 @@ msgstr "&Marcar"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Rede"
#: tfrmmain.mnushow.caption
@ -11097,6 +11101,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11217,6 +11225,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -343,6 +343,10 @@ msgstr "Abrir arq checksum após trabalho concluído."
msgid "C&reate separate checksum file for each file"
msgstr "C&riar arquivo checksum separado para cada arquivo."
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3265,7 +3269,7 @@ msgid "C&onfiguration"
msgstr "C&onfiguração"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Favoritos"
#: tfrmmain.mnufiles.caption
@ -3283,7 +3287,7 @@ msgstr "&Marcar"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Rede"
#: tfrmmain.mnushow.caption
@ -11264,6 +11268,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11384,6 +11392,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -344,6 +344,10 @@ msgstr "Deschide fișierul sumă de control după ce se termină activitatea"
msgid "C&reate separate checksum file for each file"
msgstr "C&reează sume de control separate pentru fiecare fișier"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3229,7 +3233,7 @@ msgid "C&onfiguration"
msgstr "C&onfigurare"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr ""
#: tfrmmain.mnufiles.caption
@ -3247,7 +3251,7 @@ msgstr "&Marchează"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Rețea"
#: tfrmmain.mnushow.caption
@ -11134,6 +11138,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11253,6 +11261,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Double Commander 1.1.0 alpha\n"
"POT-Creation-Date: 2023-12-31 21:15+0300\n"
"PO-Revision-Date: 2024-01-05 00:03+0300\n"
"POT-Creation-Date: 2024-10-11 21:15+0300\n"
"PO-Revision-Date: 2024-10-14 00:03+0300\n"
"Last-Translator: Alexander Koblov <alexx2000@mail.ru>\n"
"Language-Team: \n"
"Language: ru\n"
@ -339,6 +339,10 @@ msgstr "Открыть файл контрольной суммы после р
msgid "C&reate separate checksum file for each file"
msgstr "Д&ля каждого файла создать отдельный файл контрольной суммы"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr "Для каждого &каталога создать отдельный файл контрольной суммы"
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "&Формат файла"
@ -3199,7 +3203,7 @@ msgid "C&onfiguration"
msgstr "&Настройки"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Избранное"
#: tfrmmain.mnufiles.caption
@ -3217,7 +3221,7 @@ msgstr "&Выделение"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Сеть"
#: tfrmmain.mnushow.caption
@ -3999,7 +4003,7 @@ msgstr "Использовать имя архива без расширения
#: tfrmoptionsarchivers.chkhide.caption
msgid "Show as normal files"
msgstr ""
msgstr "Показывать как нормальные файлы"
#: tfrmoptionsarchivers.ckbarchiverunixfileattributes.caption
msgid "Uni&x file attributes"
@ -10302,27 +10306,27 @@ msgstr "Тб"
#: ulng.rsdefaultsuffixdroppedtext
msgid "_DroppedText"
msgstr ""
msgstr "_DroppedText"
#: ulng.rsdefaultsuffixdroppedtexthtmlfilename
msgid "_DroppedHTMLtext"
msgstr ""
msgstr "_DroppedText"
#: ulng.rsdefaultsuffixdroppedtextrichtextfilename
msgid "_DroppedRichtext"
msgstr ""
msgstr "_DroppedText"
#: ulng.rsdefaultsuffixdroppedtextsimplefilename
msgid "_DroppedSimpleText"
msgstr ""
msgstr "_DroppedText"
#: ulng.rsdefaultsuffixdroppedtextunicodeutf16filename
msgid "_DroppedUnicodeUTF16text"
msgstr "_DroppedUTF16text"
msgstr "_DroppedTextUTF16"
#: ulng.rsdefaultsuffixdroppedtextunicodeutf8filename
msgid "_DroppedUnicodeUTF8text"
msgstr "_DroppedUTF8text"
msgstr "_DroppedTextUTF8"
#: ulng.rsdiffadds
msgid " Adds: "
@ -11005,7 +11009,7 @@ msgstr "По имени команды;По горячим клавишам (г
#: ulng.rsimporttoolbarproblem
msgid "Cannot find reference to default bar file"
msgstr "Не удалось найти ссылку на файл панели инструментов по умолчанию"
msgstr "Не удалось найти файл панели инструментов по умолчанию"
#: ulng.rslegacydisplaysizesinglelettergiga
msgid "G"
@ -11063,17 +11067,21 @@ msgstr "Введите имя нового набора колонок"
#: ulng.rsmenumacosaddfindertag
#, object-pascal-format
msgid "Add \"%s\""
msgstr ""
msgstr "Добавить \"%s\""
#: ulng.rsmenumacoseditfindertags
msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr "Изменить теги Finder..."
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
msgstr ""
msgstr "Удалить \"%s\""
#: ulng.rsmenumacosshare
msgid "Share..."
@ -11090,33 +11098,29 @@ msgid "AirDrop"
msgstr ""
#: ulng.rsmfstbicommandmenudirectoryhotlist
#, fuzzy
msgctxt "ulng.rsmfstbicommandmenudirectoryhotlist"
msgid "Directory Hotlist"
msgstr "Избранные каталоги"
#: ulng.rsmfstbicommandmenufavoritetabs
#, fuzzy
msgctxt "ulng.rsmfstbicommandmenufavoritetabs"
msgid "Favorite Tabs"
msgstr "Избранные вкладки"
#: ulng.rsmfstbicommandmenuquicklook
msgid "macOS QuickLook"
msgstr ""
msgstr "Быстрый просмотр macOS"
#: ulng.rsmfstbicommandtitle
#, fuzzy
msgctxt "ulng.rsmfstbicommandtitle"
msgid "Command"
msgstr "Команда"
#: ulng.rsmfstbicomparetips
msgid "Compare by Contents..."
msgstr ""
msgstr "Сравнить по содержимому..."
#: ulng.rsmfstbicomparetitle
#, fuzzy
msgctxt "ulng.rsmfstbicomparetitle"
msgid "Compare"
msgstr "Сравнить"
@ -11124,25 +11128,24 @@ msgstr "Сравнить"
#: ulng.rsmfstbieditfindertagtips
msgctxt "ulng.rsmfstbieditfindertagtips"
msgid "Edit Finder Tags..."
msgstr ""
msgstr "Изменить теги Finder..."
#: ulng.rsmfstbieditfindertagtitle
msgid "EditTag"
msgstr ""
msgstr "Изменить тег"
#: ulng.rsmfstbiedittips
msgid "Edit..."
msgstr ""
msgstr "Правка..."
#: ulng.rsmfstbiedittitle
#, fuzzy
msgctxt "ulng.rsmfstbiedittitle"
msgid "Edit"
msgstr "Правка"
#: ulng.rsmfstbifinderrevealtips
msgid "Reveal in Finder"
msgstr ""
msgstr "Открыть в Finder"
#: ulng.rsmfstbifinderrevealtitle
msgid "Finder"
@ -11151,120 +11154,122 @@ msgstr ""
#: ulng.rsmfstbigotips
msgctxt "ulng.rsmfstbigotips"
msgid "Go"
msgstr ""
msgstr "Перейти в"
#: ulng.rsmfstbigotitle
msgctxt "ulng.rsmfstbigotitle"
msgid "Go"
msgstr ""
msgstr "Перейти в"
#: ulng.rsmfstbihorzsplittips
msgid "Toggle Horizontal Split Mode"
msgstr ""
msgstr "Переключить режим расположения панелей (вертикально/горизонтально)"
#: ulng.rsmfstbihorzsplittitle
msgid "HorzSplit"
msgstr ""
msgstr "Горизонтальное разделение"
#: ulng.rsmfstbiprivilegetips
msgid "As a file manager, Double Command requires full disk access permissions. Clicking this button will pop up the macOS system settings page. Please add \"Double Commander.app\" to the \"Full Disk Access\" list to complete the authorization."
msgstr ""
msgstr "Как файловый менеджер, Double Commander требует разрешения на полный доступ к диску. Нажатие этой кнопки откроет страницу системных настроек macOS. Пожалуйста, добавьте \"Double Commande.app\" в список \"Полный доступ к диску\", чтобы завершить авторизацию."
#: ulng.rsmfstbiprivilegetitle
msgid "Privilege"
msgstr ""
msgstr "Привилегия"
#: ulng.rsmfstbiquicklooktips
msgid "macOS Quick Look Panel"
msgstr ""
msgstr "Панель быстрого просмотра macOS"
#: ulng.rsmfstbiquicklooktitle
msgid "QuickLook"
msgstr ""
msgstr "Быстрый просмотр"
#: ulng.rsmfstbirefreshtips
msgid "Refresh File List"
msgstr ""
msgstr "Обновить список файлов"
#: ulng.rsmfstbirefreshtitle
msgid "Refresh"
msgstr "Обновить"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""
msgstr "Поиск файлов..."
#: ulng.rsmfstbisearchtitle
#, fuzzy
msgctxt "ulng.rsmfstbisearchtitle"
msgid "Search"
msgstr "Найти..."
msgstr "Поиск"
#: ulng.rsmfstbisharetitle
msgid "Share"
msgstr ""
msgstr "Поделиться"
#: ulng.rsmfstbishowbrieftitle
msgid "as Brief"
msgstr ""
msgstr "Краткий"
#: ulng.rsmfstbishowfulltitle
msgid "as Full"
msgstr ""
msgstr "Подробный"
#: ulng.rsmfstbishowinfotips
msgid "Show Info in Finder"
msgstr ""
msgstr "Показать информацию о файле в Finder"
#: ulng.rsmfstbishowinfotitle
msgid "ShowInfo"
msgstr ""
msgstr "Показать информацию"
#: ulng.rsmfstbishowmodetips
msgid "Show as Brief, Full or Thumbnails"
msgstr ""
msgstr "Показать в кратком виде, в подробном виде или в виде эскизов"
#: ulng.rsmfstbishowmodetitle
msgid "ShowMode"
msgstr ""
msgstr "Режим отображения"
#: ulng.rsmfstbishowthumbnailstitle
msgid "as Thumbnails"
msgstr ""
msgstr "Эскизы"
#: ulng.rsmfstbiswappanelstips
msgid "Swap Panels"
msgstr ""
msgstr "Поменять файловые панели местами"
#: ulng.rsmfstbiswappanelstitle
msgid "SwapPanels"
msgstr ""
msgstr "Поменять панели местами"
#: ulng.rsmfstbisynctips
msgid "Synchronize Dirs..."
msgstr ""
msgstr "Синхронизировать каталоги..."
#: ulng.rsmfstbisynctitle
msgid "Sync"
msgstr ""
msgstr "Синхронизация"
#: ulng.rsmfstbiterminaltips
msgid "Open in Terminal"
msgstr ""
msgstr "Открыть в терминале"
#: ulng.rsmfstbiterminaltitle
#, fuzzy
msgctxt "ulng.rsmfstbiterminaltitle"
msgid "Terminal"
msgstr "Терминал"
#: ulng.rsmfstbitreeviewtips
msgid "Show Tree View Panel"
msgstr ""
msgstr "Показать панель с деревом каталогов"
#: ulng.rsmfstbitreeviewtitle
msgid "TreeView"
msgstr ""
msgstr "Дерево каталогов"
#: ulng.rsmnuactions
msgctxt "ulng.rsmnuactions"

View file

@ -333,6 +333,10 @@ msgstr "Otvoriť súbor s kontrolným súčtom po dokončení"
msgid "C&reate separate checksum file for each file"
msgstr "Vytvoriť samostatný kontrolný súčet pre každý súbor"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr "Formát súboru"
@ -3145,7 +3149,7 @@ msgid "C&onfiguration"
msgstr "Kon&figurácia"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Obľúbené"
#: tfrmmain.mnufiles.caption
@ -3163,7 +3167,7 @@ msgstr "&Označiť"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "S&ieť"
#: tfrmmain.mnushow.caption
@ -10810,6 +10814,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10927,6 +10935,10 @@ msgstr "Obnoviť zoznam súborov"
msgid "Refresh"
msgstr "Obnoviť"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr "Hľadať súbory..."

View file

@ -340,6 +340,10 @@ msgstr "Po koncu izračunavanja odpri datoteko nadzorne vsote"
msgid "C&reate separate checksum file for each file"
msgstr "Za vsako datoteko &ustvari ločeno datoteko nadzorne vsote"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3153,7 +3157,7 @@ msgid "C&onfiguration"
msgstr "&Nastavitve"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Priljubljeno"
#: tfrmmain.mnufiles.caption
@ -3171,7 +3175,7 @@ msgstr "&Izbor"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "Omrežje"
#: tfrmmain.mnushow.caption
@ -10818,6 +10822,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -10938,6 +10946,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -343,6 +343,10 @@ msgstr "Отвори датотеку збирне провере након з
msgid "C&reate separate checksum file for each file"
msgstr "&Образуј посебну датотеку збирне провере за сваку датотеку"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3206,7 +3210,7 @@ msgid "C&onfiguration"
msgstr "&Поставке"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Омиљено"
#: tfrmmain.mnufiles.caption
@ -3224,7 +3228,7 @@ msgstr "Ознака&"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Мрежа"
#: tfrmmain.mnushow.caption
@ -11049,6 +11053,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11169,6 +11177,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -346,6 +346,10 @@ msgstr ""
msgid "C&reate separate checksum file for each file"
msgstr "&Obrazuj posebnu datoteku zbirne provere za svaku datoteku"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3257,7 +3261,7 @@ msgid "C&onfiguration"
msgstr "&Postavke"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr ""
#: tfrmmain.mnufiles.caption
@ -3275,7 +3279,7 @@ msgstr "Oznaka&"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Mreža"
#: tfrmmain.mnushow.caption
@ -11339,6 +11343,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11458,6 +11466,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -381,6 +381,10 @@ msgstr ""
msgid "C&reate separate checksum file for each file"
msgstr "Her dosya için ayrı bir sağlama toplamı dosyası oluştur"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3382,7 +3386,7 @@ msgid "C&onfiguration"
msgstr "&Yapılandır"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr ""
#: tfrmmain.mnufiles.caption
@ -3400,7 +3404,7 @@ msgstr "&İşaretle"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Ağ"
#: tfrmmain.mnushow.caption
@ -11487,6 +11491,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11605,6 +11613,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -341,6 +341,10 @@ msgstr "Відкрити файл контрольної суми після р
msgid "C&reate separate checksum file for each file"
msgstr "Для кожного файлу ство&рити свій контрольний файл"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr ""
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3225,7 +3229,7 @@ msgid "C&onfiguration"
msgstr "&Налаштування"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "Вибране"
#: tfrmmain.mnufiles.caption
@ -3243,7 +3247,7 @@ msgstr "&Виділення"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "Мережа"
#: tfrmmain.mnushow.caption
@ -11175,6 +11179,10 @@ msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr ""
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr ""
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
msgid "Remove \"%s\""
@ -11295,6 +11303,10 @@ msgstr ""
msgid "Refresh"
msgstr ""
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr ""
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr ""

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: Double Commander 1.1.0 alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-11-15 11:15+0300\n"
"PO-Revision-Date: 2023-04-05 22:00+0800\n"
"PO-Revision-Date: 2024-11-01 21:00+0800\n"
"Last-Translator: iYoung <iyoung@126.com>\n"
"Language-Team: Chinese <iyoung@126.com>\n"
"Language: zh_CN\n"
@ -330,7 +330,11 @@ msgstr "任务完成后打开校验码文件"
#: tfrmchecksumcalc.cbseparatefile.caption
msgid "C&reate separate checksum file for each file"
msgstr "为每个文件分别创建 MD5/SHA1 文件(&R)"
msgstr "为每个文件分别创建校验码文件(&R)"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr "为每个文件夹分别创建校验码文件(&D)"
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
@ -3144,7 +3148,7 @@ msgid "C&onfiguration"
msgstr "配置(&O)"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "收藏夹(&A)"
#: tfrmmain.mnufiles.caption
@ -3162,7 +3166,7 @@ msgstr "标记(&M)"
#: tfrmmain.mnunetwork.caption
msgctxt "tfrmmain.mnunetwork.caption"
msgid "Network"
msgid "&Network"
msgstr "网络(&N)"
#: tfrmmain.mnushow.caption
@ -7359,12 +7363,12 @@ msgstr "新的收藏夹标签保存在菜单中的默认位置:"
#: tfrmoptionsterminal.edrunintermcloseparams.hint
msgctxt "tfrmoptionsterminal.edrunintermcloseparams.hint"
msgid "{command} should normally be present here to reflect the command to be run in terminal"
msgstr "{命令} 通常应该在此出现,以反映在终端中运行的命令"
msgstr "{command} 通常应该在此出现,以反映在终端中运行的命令"
#: tfrmoptionsterminal.edrunintermstayopenparams.hint
msgctxt "tfrmoptionsterminal.edrunintermstayopenparams.hint"
msgid "{command} should normally be present here to reflect the command to be run in terminal"
msgstr "{命令} 通常应该在此出现,以反映在终端中运行的命令"
msgstr "{command} 通常应该在此出现,以反映在终端中运行的命令"
#: tfrmoptionsterminal.gbjustrunterminal.caption
msgid "Command for just running terminal:"
@ -10804,8 +10808,13 @@ msgid "Add \"%s\""
msgstr "添加“%s”"
#: ulng.rsmenumacoseditfindertags
msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr "编辑访达标签..."
msgstr "编辑“访达”标签..."
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr "授予“完全磁盘访问”权限以支持“访达”标签..."
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
@ -10858,7 +10867,7 @@ msgstr "比较"
#: ulng.rsmfstbieditfindertagtips
msgctxt "ulng.rsmfstbieditfindertagtips"
msgid "Edit Finder Tags..."
msgstr "编辑访达标签..."
msgstr "编辑访达标签..."
#: ulng.rsmfstbieditfindertagtitle
msgid "EditTag"
@ -10876,7 +10885,7 @@ msgstr "编辑"
#: ulng.rsmfstbifinderrevealtips
msgctxt "ulng.rsmfstbifinderrevealtips"
msgid "Reveal in Finder"
msgstr "在访达中访问文件"
msgstr "在访达中访问文件"
#: ulng.rsmfstbifinderrevealtitle
msgctxt "ulng.rsmfstbifinderrevealtitle"
@ -10931,6 +10940,10 @@ msgctxt "ulng.rsmfstbirefreshtitle"
msgid "Refresh"
msgstr "刷新"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr "搜索组合标签"
#: ulng.rsmfstbisearchtips
msgctxt "ulng.rsmfstbisearchtips"
msgid "Search Files..."
@ -10959,7 +10972,7 @@ msgstr "以完整详细列表方式显示"
#: ulng.rsmfstbishowinfotips
msgctxt "ulng.rsmfstbishowinfotips"
msgid "Show Info in Finder"
msgstr "在访达中显示文件简介"
msgstr "在访达中显示文件简介"
#: ulng.rsmfstbishowinfotitle
msgctxt "ulng.rsmfstbishowinfotitle"

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: Double Commander 1.1.0 alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-11-15 11:15+0300\n"
"PO-Revision-Date: 2023-04-04 19:07+0800\n"
"PO-Revision-Date: 2024-11-01 21:00+0800\n"
"Last-Translator: Kne luo\n"
"Language-Team: \n"
"Language: zh_TW\n"
@ -339,6 +339,10 @@ msgstr "任務完成後打開校驗碼檔案"
msgid "C&reate separate checksum file for each file"
msgstr "為每個檔案建立單獨的驗證碼檔案 (&R)"
#: tfrmchecksumcalc.cbseparatefolder.caption
msgid "Create separate checksum file for each &directory"
msgstr "為每個資料夾建立單獨的驗證碼檔案 (&D)"
#: tfrmchecksumcalc.lblfileformat.caption
msgid "File &format"
msgstr ""
@ -3192,7 +3196,7 @@ msgid "C&onfiguration"
msgstr "設置 (&O)"
#: tfrmmain.mnufavoritetabs.caption
msgid "Favorites"
msgid "F&avorites"
msgstr "我的最愛"
#: tfrmmain.mnufiles.caption
@ -3210,7 +3214,7 @@ msgstr "標記 (&M)"
#: tfrmmain.mnunetwork.caption
msgctxt "TFRMMAIN.MNUNETWORK.CAPTION"
msgid "Network"
msgid "&Network"
msgstr "網路"
#: tfrmmain.mnushow.caption
@ -5325,10 +5329,8 @@ msgid "When dropping text, generate filename automatically (otherwise will promp
msgstr ""
#: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption
#, fuzzy
#| msgid "Show confirmation dialog after drop"
msgid "&Show confirmation dialog after drop"
msgstr "顯示確認對話盒在拖曳操作後 (&S)"
msgstr "在拖曳操作後顯示確認對話盒 (&S)"
#: tfrmoptionsdragdrop.gbtextdraganddroprelatedoptions.caption
msgid "When drag && dropping text into panels:"
@ -5593,7 +5595,6 @@ msgid "Insert..."
msgstr ""
#: tfrmoptionsfavoritetabs.btnrename.caption
#, fuzzy
msgctxt "tfrmoptionsfavoritetabs.btnrename.caption"
msgid "Rename"
msgstr "重新命名"
@ -5614,7 +5615,6 @@ msgid "Always expand tree"
msgstr ""
#: tfrmoptionsfavoritetabs.cbsavedirhistory.text
#, fuzzy
msgctxt "tfrmoptionsfavoritetabs.cbsavedirhistory.text"
msgid "No"
msgstr "否"
@ -5688,7 +5688,6 @@ msgid "...current level of item(s) selected only"
msgstr ""
#: tfrmoptionsfavoritetabs.micutselection.caption
#, fuzzy
msgctxt "tfrmoptionsfavoritetabs.micutselection.caption"
msgid "Cut"
msgstr "剪下"
@ -5758,13 +5757,11 @@ msgid "Open all branches"
msgstr ""
#: tfrmoptionsfavoritetabs.mipasteselection.caption
#, fuzzy
msgctxt "tfrmoptionsfavoritetabs.mipasteselection.caption"
msgid "Paste"
msgstr "貼上"
#: tfrmoptionsfavoritetabs.mirename.caption
#, fuzzy
msgctxt "tfrmoptionsfavoritetabs.mirename.caption"
msgid "Rename"
msgstr "重新命名"
@ -5955,7 +5952,6 @@ msgid "Command:"
msgstr "指令 (&C):"
#: tfrmoptionsfileassoc.lblexternalparameters.caption
#, fuzzy
msgctxt "tfrmoptionsfileassoc.lblexternalparameters.caption"
msgid "Parameter&s:"
msgstr "參數 (&S):"
@ -6112,7 +6108,6 @@ msgid "Path to be relative to:"
msgstr ""
#: tfrmoptionsfileoperations.bvlconfirmations.caption
#, fuzzy
msgctxt "tfrmoptionsfileoperations.bvlconfirmations.caption"
msgid "Show confirmation window for:"
msgstr "顯示確認視窗在:"
@ -6126,8 +6121,6 @@ msgid "&Delete operation"
msgstr "刪除操作 (&D)"
#: tfrmoptionsfileoperations.cbdeletetotrash.caption
#, fuzzy
#| msgid "Delete to recycle bin (Shift key reverses this setting)"
msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION"
msgid "Dele&te to recycle bin (Shift key reverses this setting)"
msgstr "刪除到資源回收筒 (與 Shift 鍵同按為徹底刪除) (&T)"
@ -6208,7 +6201,6 @@ msgid "Reset to DC default"
msgstr ""
#: tfrmoptionsfilepanelscolors.cballowovercolor.caption
#, fuzzy
msgctxt "tfrmoptionsfilepanelscolors.cballowovercolor.caption"
msgid "Allow Overcolor"
msgstr "允許顏色覆蓋"
@ -6228,7 +6220,6 @@ msgid "U&se Inverted Selection"
msgstr "使用反白選取 (&S)"
#: tfrmoptionsfilepanelscolors.cbusecursorborder.caption
#, fuzzy
msgctxt "tfrmoptionsfilepanelscolors.cbusecursorborder.caption"
msgid "Cursor border"
msgstr "指標外框"
@ -6282,7 +6273,6 @@ msgid "Background:"
msgstr ""
#: tfrmoptionsfilepanelscolors.lblpathactivetext.caption
#, fuzzy
msgctxt "tfrmoptionsfilepanelscolors.lblpathactivetext.caption"
msgid "Text Color:"
msgstr "文字色彩:"
@ -6355,7 +6345,6 @@ msgid "Personalized abbreviations to use:"
msgstr ""
#: tfrmoptionsfilesviews.gbsorting.caption
#, fuzzy
msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION"
msgid "Sorting"
msgstr "排序"
@ -6557,13 +6546,11 @@ msgid "Add &hotkey"
msgstr "新增熱鍵 (&H)"
#: tfrmoptionshotkeys.actcopy.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.actcopy.caption"
msgid "Copy"
msgstr "複製"
#: tfrmoptionshotkeys.actdelete.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.actdelete.caption"
msgid "Delete"
msgstr "刪除"
@ -6591,7 +6578,6 @@ msgid "Previous category"
msgstr ""
#: tfrmoptionshotkeys.actrename.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.actrename.caption"
msgid "Rename"
msgstr "重新命名"
@ -6645,7 +6631,6 @@ msgid "Categories"
msgstr ""
#: tfrmoptionshotkeys.micommands.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.micommands.caption"
msgid "Command"
msgstr "指令"
@ -6655,31 +6640,26 @@ msgid "Sort order"
msgstr ""
#: tfrmoptionshotkeys.stgcommands.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.stgcommands.columns[0].title.caption"
msgid "Command"
msgstr "指令"
#: tfrmoptionshotkeys.stgcommands.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.stgcommands.columns[1].title.caption"
msgid "Hotkeys"
msgstr "熱鍵"
#: tfrmoptionshotkeys.stgcommands.columns[2].title.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.stgcommands.columns[2].title.caption"
msgid "Description"
msgstr "描述"
#: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.stghotkeys.columns[0].title.caption"
msgid "Hotkey"
msgstr "熱鍵"
#: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionshotkeys.stghotkeys.columns[1].title.caption"
msgid "Parameters"
msgstr "參數"
@ -6756,7 +6736,6 @@ msgid "All associated + &EXE/LNK (slow)"
msgstr "所有已關聯的檔案 + 執行檔/捷徑 (較慢) (&E)"
#: tfrmoptionsicons.rbiconsshownone.caption
#, fuzzy
msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION"
msgid "&No icons"
msgstr "不顯示圖示 (&N)"
@ -6859,35 +6838,25 @@ msgid "Show &drive buttons"
msgstr "顯示磁碟按鈕 (&D)"
#: tfrmoptionslayout.cbshowdrivefreespace.caption
#, fuzzy
#| msgid "Show free space label"
msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION"
msgid "Show free s&pace label"
msgstr "顯示可用空間標籤 (&P)"
#: tfrmoptionslayout.cbshowdriveslistbutton.caption
#, fuzzy
#| msgid "Show d&rives list button"
msgid "Show drives list bu&tton"
msgstr "顯示碟磁清單按鈕 (&T)"
#: tfrmoptionslayout.cbshowkeyspanel.caption
#, fuzzy
#| msgid "Show &function key buttons"
msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION"
msgid "Show function &key buttons"
msgstr "顯示功能鍵按鈕 (&K)"
#: tfrmoptionslayout.cbshowmainmenu.caption
#, fuzzy
#| msgid "Show main menu"
msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION"
msgid "Show &main menu"
msgstr "顯示主要選單 (&M)"
#: tfrmoptionslayout.cbshowmaintoolbar.caption
#, fuzzy
#| msgid "Show &button bar"
msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION"
msgid "Show tool&bar"
msgstr "顯示工具列 (&B)"
@ -6902,8 +6871,6 @@ msgid "Show &status bar"
msgstr "顯示狀態列 (&S)"
#: tfrmoptionslayout.cbshowtabheader.caption
#, fuzzy
#| msgid "Show &tabstop header"
msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION"
msgid "S&how tabstop header"
msgstr "顯示欄位名稱 (&H)"
@ -6914,15 +6881,11 @@ msgid "Sho&w folder tabs"
msgstr "顯示資料夾分頁 (&W)"
#: tfrmoptionslayout.cbtermwindow.caption
#, fuzzy
#| msgid "Show terminal window"
msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION"
msgid "Show te&rminal window"
msgstr "顯示終端機視窗 (&R)"
#: tfrmoptionslayout.cbtwodiskpanels.caption
#, fuzzy
#| msgid "Show two drive button bars (fixed width, above file windows)"
msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION"
msgid "Show two drive button bars (fi&xed width, above file windows)"
msgstr "顯示兩個磁碟按鈕列 (&X)"
@ -6951,8 +6914,6 @@ msgid "Include date in log filename"
msgstr ""
#: tfrmoptionslog.cblogarcop.caption
#, fuzzy
#| msgid "Pack/Unpack"
msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION"
msgid "&Pack/Unpack"
msgstr "壓縮/解壓縮 (&P)"
@ -6962,22 +6923,16 @@ msgid "External command line execution"
msgstr ""
#: tfrmoptionslog.cblogcpmvln.caption
#, fuzzy
#| msgid "Copy/Move/Create link/symlink"
msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION"
msgid "Cop&y/Move/Create link/symlink"
msgstr "複製/移動/建立硬式連結/建立符號連結 (&Y)"
#: tfrmoptionslog.cblogdelete.caption
#, fuzzy
#| msgid "Delete"
msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION"
msgid "&Delete"
msgstr "刪除 (&D)"
#: tfrmoptionslog.cblogdirop.caption
#, fuzzy
#| msgid "Create/Delete directories"
msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION"
msgid "Crea&te/Delete directories"
msgstr "建立/刪除資料夾 (&T)"
@ -6988,8 +6943,6 @@ msgid "Log &errors"
msgstr "記錄錯誤 (&E)"
#: tfrmoptionslog.cblogfile.caption
#, fuzzy
#| msgid "&Create a log file:"
msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION"
msgid "C&reate a log file:"
msgstr "建立記錄檔案 (&R):"
@ -6999,8 +6952,6 @@ msgid "Maximum log file count"
msgstr ""
#: tfrmoptionslog.cbloginfo.caption
#, fuzzy
#| msgid "Log information messages"
msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION"
msgid "Log &information messages"
msgstr "記錄資訊 (&I)"
@ -7015,8 +6966,6 @@ msgid "Log &successful operations"
msgstr "記錄操作成功 (&S)"
#: tfrmoptionslog.cblogvfs.caption
#, fuzzy
#| msgid "File system plugins"
msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION"
msgid "&File system plugins"
msgstr "檔案系統插件 (&F)"
@ -7032,8 +6981,6 @@ msgid "Log operations"
msgstr "操作記錄"
#: tfrmoptionslog.gblogfilestatus.caption
#, fuzzy
#| msgid "Operation status:"
msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION"
msgid "Operation status"
msgstr "操作狀態"
@ -7085,15 +7032,11 @@ msgid "Show &splash screen"
msgstr ""
#: tfrmoptionsmisc.chkshowwarningmessages.caption
#, fuzzy
#| msgid "Show warning messages (\"OK\" button only)"
msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption"
msgid "Show &warning messages (\"OK\" button only)"
msgstr "顯示警告訊息 (&W)"
#: tfrmoptionsmisc.chkthumbsave.caption
#, fuzzy
#| msgid "Save thumbnails in cache"
msgctxt "tfrmoptionsmisc.chkthumbsave.caption"
msgid "&Save thumbnails in cache"
msgstr "儲存縮圖快取 (&S)"
@ -7146,8 +7089,6 @@ msgid "&Thumbnail size:"
msgstr "縮圖大小 (&T):"
#: tfrmoptionsmouse.cbselectionbymouse.caption
#, fuzzy
#| msgid "Selection by mouse"
msgctxt "TFRMOPTIONSMOUSE.CBSELECTIONBYMOUSE.CAPTION"
msgid "&Selection by mouse"
msgstr "使用滑鼠選取項目 (&S)"
@ -7175,8 +7116,6 @@ msgid "Selection"
msgstr "選取項目"
#: tfrmoptionsmouse.lblmousemode.caption
#, fuzzy
#| msgid "Mode:"
msgctxt "TFRMOPTIONSMOUSE.LBLMOUSEMODE.CAPTION"
msgid "&Mode:"
msgstr "模式 (&M):"
@ -7186,22 +7125,16 @@ msgid "Double click"
msgstr ""
#: tfrmoptionsmouse.rbscrolllinebyline.caption
#, fuzzy
#| msgid "Line by line"
msgctxt "TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINE.CAPTION"
msgid "&Line by line"
msgstr "一次捲動行數 (&L)"
#: tfrmoptionsmouse.rbscrolllinebylinecursor.caption
#, fuzzy
#| msgid "Line by line with cursor movement"
msgctxt "TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINECURSOR.CAPTION"
msgid "Line by line &with cursor movement"
msgstr "一次捲動一行 + 指標行跟隨移動 (&W)"
#: tfrmoptionsmouse.rbscrollpagebypage.caption
#, fuzzy
#| msgid "Page by page"
msgctxt "TFRMOPTIONSMOUSE.RBSCROLLPAGEBYPAGE.CAPTION"
msgid "&Page by page"
msgstr "一次捲動一頁 (&P)"
@ -7316,25 +7249,21 @@ msgid "Searc&h plugins allow one to use alternative search algorithms or externa
msgstr "搜尋插件可允許使用其他替代搜尋演算法或外部工具搜尋 (像 \"locate\" 等)"
#: tfrmoptionspluginsdsx.stgplugins.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginsdsx.stgplugins.columns[0].title.caption"
msgid "Active"
msgstr "啟動"
#: tfrmoptionspluginsdsx.stgplugins.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginsdsx.stgplugins.columns[1].title.caption"
msgid "Plugin"
msgstr "插件"
#: tfrmoptionspluginsdsx.stgplugins.columns[2].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginsdsx.stgplugins.columns[2].title.caption"
msgid "Registered for"
msgstr "登錄對象"
#: tfrmoptionspluginsdsx.stgplugins.columns[3].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginsdsx.stgplugins.columns[3].title.caption"
msgid "File name"
msgstr "檔案名稱"
@ -7370,25 +7299,21 @@ msgid "Pack&er plugins are used to work with archives"
msgstr "壓縮插件用於支援特定壓縮格式的處理"
#: tfrmoptionspluginswcx.stgplugins.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswcx.stgplugins.columns[0].title.caption"
msgid "Active"
msgstr "啟動"
#: tfrmoptionspluginswcx.stgplugins.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswcx.stgplugins.columns[1].title.caption"
msgid "Plugin"
msgstr "插件"
#: tfrmoptionspluginswcx.stgplugins.columns[2].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswcx.stgplugins.columns[2].title.caption"
msgid "Registered for"
msgstr "登錄對象"
#: tfrmoptionspluginswcx.stgplugins.columns[3].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswcx.stgplugins.columns[3].title.caption"
msgid "File name"
msgstr "檔案名稱"
@ -7399,25 +7324,21 @@ msgid "Content plu&gins allow one to display extended file details like mp3 tags
msgstr "內容插件可允許在檔案清單顯示 MP3 標籤或圖片屬性等延伸的檔案詳細資料, 或是在搜尋和多重命名工具中使用"
#: tfrmoptionspluginswdx.stgplugins.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswdx.stgplugins.columns[0].title.caption"
msgid "Active"
msgstr "啟動"
#: tfrmoptionspluginswdx.stgplugins.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswdx.stgplugins.columns[1].title.caption"
msgid "Plugin"
msgstr "插件"
#: tfrmoptionspluginswdx.stgplugins.columns[2].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswdx.stgplugins.columns[2].title.caption"
msgid "Registered for"
msgstr "登錄對象"
#: tfrmoptionspluginswdx.stgplugins.columns[3].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswdx.stgplugins.columns[3].title.caption"
msgid "File name"
msgstr "檔案名稱"
@ -7428,25 +7349,21 @@ msgid "Fi&le system plugins allow access to disks inaccessible by operating syst
msgstr "檔案系統插件可允許存取一些作業系統上罕見的檔案系統, 或是像 Palm/PocketPC 等外部裝置"
#: tfrmoptionspluginswfx.stgplugins.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswfx.stgplugins.columns[0].title.caption"
msgid "Active"
msgstr "啟動"
#: tfrmoptionspluginswfx.stgplugins.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswfx.stgplugins.columns[1].title.caption"
msgid "Plugin"
msgstr "插件"
#: tfrmoptionspluginswfx.stgplugins.columns[2].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswfx.stgplugins.columns[2].title.caption"
msgid "Registered for"
msgstr "登錄對象"
#: tfrmoptionspluginswfx.stgplugins.columns[3].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswfx.stgplugins.columns[3].title.caption"
msgid "File name"
msgstr "檔案名稱"
@ -7457,25 +7374,21 @@ msgid "Vie&wer plugins allow one to display file formats like images, spreadshee
msgstr "檢視器插件可允許顯示圖片,試算表,資料庫等檔案格式在檢視器"
#: tfrmoptionspluginswlx.stgplugins.columns[0].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswlx.stgplugins.columns[0].title.caption"
msgid "Active"
msgstr "啟動"
#: tfrmoptionspluginswlx.stgplugins.columns[1].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswlx.stgplugins.columns[1].title.caption"
msgid "Plugin"
msgstr "插件"
#: tfrmoptionspluginswlx.stgplugins.columns[2].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswlx.stgplugins.columns[2].title.caption"
msgid "Registered for"
msgstr "登錄對象"
#: tfrmoptionspluginswlx.stgplugins.columns[3].title.caption
#, fuzzy
msgctxt "tfrmoptionspluginswlx.stgplugins.columns[3].title.caption"
msgid "File name"
msgstr "檔案名稱"
@ -7496,8 +7409,6 @@ msgid "Options"
msgstr "選項"
#: tfrmoptionsquicksearchfilter.gbexactnamematch.caption
#, fuzzy
#| msgid "Exact name match:"
msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION"
msgid "Exact name match"
msgstr "精準名稱比對"
@ -7529,8 +7440,6 @@ msgid "Close duplicate tabs when closing application"
msgstr ""
#: tfrmoptionstabs.cbtabsconfirmcloseall.caption
#, fuzzy
#| msgid "&Confirm close all tabs"
msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION"
msgid "Con&firm close all tabs"
msgstr "關閉所有分頁時需確認 (&F)"
@ -7540,11 +7449,9 @@ msgid "Confirm close locked tabs"
msgstr ""
#: tfrmoptionstabs.cbtabslimitoption.caption
#, fuzzy
#| msgid "&Limit tab title length to:"
msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION"
msgid "&Limit tab title length to"
msgstr "限制分頁標題長度為 (&L):"
msgstr "限制分頁標題長度為 (&L)"
#: tfrmoptionstabs.cbtabslockedasterisk.caption
msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION"
@ -7571,8 +7478,6 @@ msgid "Reuse existing tab when possible"
msgstr ""
#: tfrmoptionstabs.cbtabsshowclosebutton.caption
#, fuzzy
#| msgid "Show tab close button"
msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION"
msgid "Show ta&b close button"
msgstr "顯示分頁關閉按鈕 (&B)"
@ -7596,8 +7501,6 @@ msgid "Action to do when double click on a tab:"
msgstr ""
#: tfrmoptionstabs.lbltabsposition.caption
#, fuzzy
#| msgid "Tabs position"
msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION"
msgid "Ta&bs position"
msgstr "分頁位置 (&B):"
@ -7608,7 +7511,6 @@ msgid "None"
msgstr ""
#: tfrmoptionstabsextra.cbdefaultsavedirhistory.text
#, fuzzy
msgctxt "tfrmoptionstabsextra.cbdefaultsavedirhistory.text"
msgid "No"
msgstr "否"
@ -7717,8 +7619,6 @@ msgid "Parameters:"
msgstr "參數:"
#: tfrmoptionstoolbarbase.btnclonebutton.caption
#, fuzzy
#| msgid "&Clone button"
msgctxt "tfrmoptionstoolbarbase.btnclonebutton.caption"
msgid "C&lone button"
msgstr "複製按鈕 (&L)"
@ -7729,15 +7629,11 @@ msgid "&Delete"
msgstr "刪除 (&D)"
#: tfrmoptionstoolbarbase.btnedithotkey.caption
#, fuzzy
#| msgid "Edit hotkey"
msgctxt "tfrmoptionstoolbarbase.btnedithotkey.caption"
msgid "Edit hot&key"
msgstr "編輯熱鍵 (&K)"
#: tfrmoptionstoolbarbase.btninsertbutton.caption
#, fuzzy
#| msgid "&Insert new buttonX"
msgctxt "tfrmoptionstoolbarbase.btninsertbutton.caption"
msgid "&Insert new button"
msgstr "插入新按鈕 (&I)"
@ -7775,8 +7671,6 @@ msgid "Have DC suggest the tooltip based on button type, command and parameters"
msgstr ""
#: tfrmoptionstoolbarbase.cbflatbuttons.caption
#, fuzzy
#| msgid "Flat b&uttons"
msgctxt "tfrmoptionstoolbarbase.cbflatbuttons.caption"
msgid "&Flat buttons"
msgstr "平面按鈕 (&F)"
@ -7799,8 +7693,6 @@ msgid "Appearance"
msgstr "外觀"
#: tfrmoptionstoolbarbase.lblbarsize.caption
#, fuzzy
#| msgid "Ba&r size:"
msgctxt "tfrmoptionstoolbarbase.lblbarsize.caption"
msgid "&Bar size:"
msgstr "工具列大小 (&B):"
@ -7825,15 +7717,11 @@ msgid "Hot key:"
msgstr "熱鍵:"
#: tfrmoptionstoolbarbase.lbliconfile.caption
#, fuzzy
#| msgid "Icon:"
msgctxt "tfrmoptionstoolbarbase.lbliconfile.caption"
msgid "Ico&n:"
msgstr "圖示 (&N):"
#: tfrmoptionstoolbarbase.lbliconsize.caption
#, fuzzy
#| msgid "Ic&on size:"
msgctxt "tfrmoptionstoolbarbase.lbliconsize.caption"
msgid "Icon si&ze:"
msgstr "圖示大小 (&Z):"
@ -7849,8 +7737,6 @@ msgid "&Parameters:"
msgstr "參數 (&P):"
#: tfrmoptionstoolbarbase.lblstartpath.caption
#, fuzzy
#| msgid "Start path:"
msgctxt "tfrmoptionstoolbarbase.lblstartpath.caption"
msgid "Start pat&h:"
msgstr "開始路徑 (&H):"
@ -7860,8 +7746,6 @@ msgid "Style:"
msgstr ""
#: tfrmoptionstoolbarbase.lbltooltip.caption
#, fuzzy
#| msgid "Tooltip:"
msgctxt "tfrmoptionstoolbarbase.lbltooltip.caption"
msgid "&Tooltip:"
msgstr "工具提示 (&T):"
@ -8245,29 +8129,21 @@ msgid "&Keep terminal window open after executing program"
msgstr "在執行程式後保持終端機視窗開啟 (&K)"
#: tfrmoptionstoolbase.cbtoolsruninterminal.caption
#, fuzzy
#| msgid "Execute in terminal"
msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION"
msgid "&Execute in terminal"
msgstr "使用終端機執行 (&E)"
#: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption
#, fuzzy
#| msgid "Use external program"
msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION"
msgid "&Use external program"
msgstr "使用外部程式 (&U)"
#: tfrmoptionstoolbase.lbltoolsparameters.caption
#, fuzzy
#| msgid "Additional parameters"
msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION"
msgid "A&dditional parameters"
msgstr "額外參數 (&D)"
#: tfrmoptionstoolbase.lbltoolspath.caption
#, fuzzy
#| msgid "Path to program to execute"
msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION"
msgid "&Path to program to execute"
msgstr "執行程式路徑 (&P)"
@ -8328,15 +8204,11 @@ msgid "&Show tooltip for files in the file panel"
msgstr "顯示工具提示"
#: tfrmoptionstooltips.lblfieldslist.caption
#, fuzzy
#| msgid "Category hint:"
msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION"
msgid "Category &hint:"
msgstr "類別提示 (&H):"
#: tfrmoptionstooltips.lblfieldsmask.caption
#, fuzzy
#| msgid "Category mask:"
msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION"
msgid "Category &mask:"
msgstr "類別遮罩 (&M):"
@ -8442,7 +8314,6 @@ msgid "With History:"
msgstr ""
#: tfrmoptionstreeviewmenucolor.btfont.caption
#, fuzzy
msgctxt "tfrmoptionstreeviewmenucolor.btfont.caption"
msgid "..."
msgstr "..."
@ -8525,8 +8396,6 @@ msgid "&Number of columns in book viewer"
msgstr "閱讀模式欄位數量 (&N)"
#: tfrmpackdlg.btnconfig.caption
#, fuzzy
#| msgid "&Configure"
msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION"
msgid "Con&figure"
msgstr "設置 (&F)"
@ -11343,7 +11212,11 @@ msgstr "添加“%s”"
#: ulng.rsmenumacoseditfindertags
msgctxt "ulng.rsmenumacoseditfindertags"
msgid "Edit Finder Tags..."
msgstr "編輯訪達標籤..."
msgstr "編輯「訪達」標籤..."
#: ulng.rsmenumacosgrantpermissiontosupportfindertags
msgid "Grant \"Full Disk Access\" permission to support Finder Tags..."
msgstr "授予「完全磁盤訪問」權限以支持「訪達」標籤..."
#: ulng.rsmenumacosremovefindertag
#, object-pascal-format
@ -11395,7 +11268,7 @@ msgstr "比較"
#: ulng.rsmfstbieditfindertagtips
msgctxt "ulng.rsmfstbieditfindertagtips"
msgid "Edit Finder Tags..."
msgstr "編輯訪達標籤..."
msgstr "編輯訪達標籤..."
#: ulng.rsmfstbieditfindertagtitle
msgid "EditTag"
@ -11412,7 +11285,7 @@ msgstr "編輯"
#: ulng.rsmfstbifinderrevealtips
msgid "Reveal in Finder"
msgstr "在訪達中訪問文件"
msgstr "在訪達中訪問文件"
#: ulng.rsmfstbifinderrevealtitle
msgid "Finder"
@ -11460,6 +11333,10 @@ msgstr "刷新檔案清單"
msgid "Refresh"
msgstr "刷新"
#: ulng.rsmfstbisearchcombinedtags
msgid "Search for combined tags..."
msgstr "搜尋組合標籤"
#: ulng.rsmfstbisearchtips
msgid "Search Files..."
msgstr "搜尋檔案"
@ -11483,7 +11360,7 @@ msgstr "以完整詳細清單方式檢視"
#: ulng.rsmfstbishowinfotips
msgid "Show Info in Finder"
msgstr "在訪達中顯示檔案簡介"
msgstr "在訪達中顯示檔案簡介"
#: ulng.rsmfstbishowinfotitle
msgid "ShowInfo"

View file

@ -75,14 +75,12 @@ function FindCompressFormats(const AFileName: TFileName): TJclCompressArchiveCla
function FindDecompressFormats(const AFileName: TFileName): TJclDecompressArchiveClassArray;
function GetNestedArchiveName(const ArchiveName: String; Item: TJclCompressionItem): WideString;
function ExpandEnvironmentStrings(const FileName: UnicodeString): UnicodeString;
function WideExtractFilePath(const FileName: WideString): WideString;
function GetModulePath(out ModulePath: AnsiString): Boolean;
implementation
uses
CTypes, ActiveX, Windows, LazFileUtils, LazUTF8, SevenZipHlp;
CTypes, ActiveX, Windows, LazFileUtils, LazUTF8, DCOSUtils, SevenZipHlp;
type
TArchiveFormats = array of TArchiveFormat;
@ -106,8 +104,6 @@ var
CompressFormatsCache: TArchiveFormatCache;
DecompressFormatsCache: TArchiveFormatCache;
function _wcsnicmp(const s1, s2: pwidechar; count: csize_t): cint; cdecl; external 'msvcrt.dll';
function ReadStringProp(FormatIndex: Cardinal; PropID: TPropID;
out Value: UnicodeString): LongBool;
var
@ -252,7 +248,7 @@ var
begin
if Length(ArchiveFormatsX) = 0 then LoadArchiveFormats(ArchiveFormatsX);
AFile:= FileOpenUTF8(AFileName, fmOpenRead or fmShareDenyNone);
AFile:= mbFileOpen(AFileName, fmOpenRead or fmShareDenyNone);
if AFile = feInvalidHandle then Exit;
try
SetLength(Buffer, BufferSize);
@ -392,6 +388,7 @@ end;
procedure TJclSevenzipUpdateArchiveHelper.RemoveDirectory(const PackedName: WideString);
var
FileName: WideString;
DirectoryName: WideString;
AItem: TJclCompressionItem;
Index, PackedNamesIndex: Integer;
@ -411,10 +408,13 @@ begin
Break;
end;
end;
DirectoryName:= WideLowerCase(PackedName);
// Remove directory content
for Index := ItemCount - 1 downto 0 do
begin
if (_wcsnicmp(PWideChar(PackedName), PWideChar(Items[Index].PackedName), Length(PackedName)) = 0) then
FileName:= WideLowerCase(Items[Index].PackedName);
if Length(FileName) < Length(DirectoryName) then Continue;
if (CompareWord(DirectoryName[1], FileName[1], Length(DirectoryName)) = 0) then
begin
if (FPackedNames <> nil) and FPackedNames.Find(Items[Index].PackedName, PackedNamesIndex) then
FPackedNames.Delete(PackedNamesIndex);
@ -457,15 +457,6 @@ begin
end;
end;
function ExpandEnvironmentStrings(const FileName: UnicodeString): UnicodeString;
var
dwSize: DWORD;
begin
SetLength(Result, MAX_PATH + 1);
dwSize:= ExpandEnvironmentStringsW(PWideChar(FileName), PWideChar(Result), MAX_PATH);
if dwSize > 0 then SetLength(Result, dwSize - 1);
end;
function WideExtractFilePath(const FileName: WideString): WideString;
var
Index: Integer;
@ -477,22 +468,6 @@ begin
Result:= EmptyWideStr;
end;
function GetModulePath(out ModulePath: AnsiString): Boolean;
var
lpBuffer: TMemoryBasicInformation;
ModuleName: array[0..MAX_PATH] of WideChar;
begin
Result:= VirtualQuery(@GetModulePath, @lpBuffer, SizeOf(lpBuffer)) = SizeOf(lpBuffer);
if Result then
begin
Result:= GetModuleFileNameW(THandle(lpBuffer.AllocationBase), ModuleName, MAX_PATH) > 0;
if Result then
begin
ModulePath:= ExtractFilePath(Utf16ToUtf8(WideString(ModuleName)));
end;
end;
end;
initialization
InitCriticalSection(Mutex);

View file

@ -48,8 +48,8 @@ procedure ConfigurePacker(Parent: HWND; DllInstance: THandle); stdcall;
implementation
uses
JwaWinBase, Windows, SysUtils, Classes, JclCompression, SevenZip, SevenZipAdv, fpTimer,
SevenZipDlg, SevenZipLng, SevenZipOpt, LazFileUtils, SyncObjs, LazUTF8, SevenZipCodecs;
Windows, SysUtils, Classes, JclCompression, SevenZip, SevenZipAdv, fpTimer, DCOSUtils,
SevenZipDlg, SevenZipLng, SevenZipOpt, LazFileUtils, SyncObjs, LazUTF8, SevenZipCodecs, DCFileAttributes;
type
@ -145,14 +145,6 @@ begin
end;
end;
function WinToDosTime(const WinTime: TFILETIME; var DosTime: Cardinal): LongBool;
var
lft : Windows.TFILETIME;
begin
Result:= Windows.FileTimeToLocalFileTime(@Windows.FILETIME(WinTime), @lft) and
Windows.FileTimeToDosDateTime(@lft, @LongRec(Dostime).Hi, @LongRec(DosTime).Lo);
end;
function OpenArchiveW(var ArchiveData : tOpenArchiveDataW) : TArcHandle; stdcall;
var
I: Integer;
@ -221,11 +213,11 @@ begin
HeaderData.PackSize:= Int64Rec(Item.PackedSize).Lo;
HeaderData.PackSizeHigh:= Int64Rec(Item.PackedSize).Hi;
if ipAttributes in Item.ValidProperties then
HeaderData.FileAttr:= LongInt(Item.Attributes)
HeaderData.FileAttr:= WinToWcxFileAttr(Item.Attributes)
else begin
HeaderData.FileAttr:= FILE_ATTRIBUTE_ARCHIVE;
HeaderData.FileAttr:= GENERIC_ATTRIBUTE_FILE;
end;
WinToDosTime(Item.LastWriteTime, LongWord(HeaderData.FileTime));
HeaderData.MfileTime:= UInt64(Item.LastWriteTime);
if Item.Encrypted then begin
HeaderData.Flags:= RHDF_ENCRYPTED;
end;
@ -331,7 +323,7 @@ begin
FileNameUTF8 := Utf16ToUtf8(WideString(PackedFile));
// If update existing archive
if (GetFileAttributesW(PackedFile) <> INVALID_FILE_ATTRIBUTES) then
if (mbFileGetAttr(FileNameUTF8) <> faInvalidAttributes) then
AFormats := TJclCompressArchiveClassArray(FindUpdateFormats(FileNameUTF8))
else begin
if not SameText(ExtractFileExt(FileNameUTF8), '.exe') then
@ -504,22 +496,22 @@ begin
ConfigFile:= ExtractFilePath(dps^.DefaultIniName);
ConfigFile:= WinCPToUTF8(ConfigFile) + DefaultIniName;
// Get plugin path
if GetModulePath(ModulePath) then
ModulePath:= ExtractFilePath(mbGetModuleName);
// Use configuration from plugin path
if mbFileExists(ModulePath + DefaultIniName) then
begin
// Use configuration from plugin path
if FileExistsUTF8(ModulePath + DefaultIniName) then
ConfigFile:= ModulePath + DefaultIniName;
ConfigFile:= ModulePath + DefaultIniName;
end;
// Load plugin configuration
LoadConfiguration;
// Try to find library path
if FileExistsUTF8(LibraryPath) then
if mbFileExists(LibraryPath) then
SevenzipLibraryName:= LibraryPath
else if Length(ModulePath) > 0 then
begin
if FileExistsUTF8(ModulePath + TargetCPU + PathDelim + SevenzipDefaultLibraryName) then
if mbFileExists(ModulePath + TargetCPU + PathDelim + SevenzipDefaultLibraryName) then
SevenzipLibraryName:= ModulePath + TargetCPU + PathDelim + SevenzipDefaultLibraryName
else if FileExistsUTF8(ModulePath + SevenzipDefaultLibraryName) then begin
else if mbFileExists(ModulePath + SevenzipDefaultLibraryName) then begin
SevenzipLibraryName:= ModulePath + SevenzipDefaultLibraryName;
end;
end;

View file

@ -27,7 +27,7 @@ unit SevenZipOpt;
interface
uses
Classes, SysUtils, Windows, IniFiles, JclCompression, SevenZip;
Classes, SysUtils, Windows, DCClassesUtf8, JclCompression, SevenZip;
const
cKilo = 1024;
@ -222,7 +222,7 @@ var
implementation
uses
ActiveX, LazUTF8, SevenZipAdv, SevenZipCodecs;
ActiveX, LazUTF8, DCOSUtils, SevenZipAdv, SevenZipCodecs;
function GetNumberOfProcessors: LongWord;
var
@ -450,15 +450,15 @@ end;
procedure LoadConfiguration;
var
Ini: TIniFile;
Ini: TIniFileEx;
Section: AnsiString;
ArchiveFormat: TArchiveFormat;
begin
try
Ini:= TIniFile.Create(ConfigFile);
Ini:= TIniFileEx.Create(ConfigFile);
try
LibraryPath:= Ini.ReadString('Library', TargetCPU, EmptyStr);
LibraryPath:= Utf16ToUtf8(ExpandEnvironmentStrings(UTF8ToUTF16(LibraryPath)));
LibraryPath:= mbExpandEnvironmentStrings(LibraryPath);
for ArchiveFormat:= Low(TArchiveFormat) to High(TArchiveFormat) do
begin
Section:= GUIDToString(PluginConfig[ArchiveFormat].ArchiveCLSID^);
@ -481,12 +481,12 @@ end;
procedure SaveConfiguration;
var
Ini: TIniFile;
Ini: TIniFileEx;
Section: AnsiString;
ArchiveFormat: TArchiveFormat;
begin
try
Ini:= TIniFile.Create(ConfigFile);
Ini:= TIniFileEx.Create(ConfigFile);
try
for ArchiveFormat:= Low(TArchiveFormat) to High(TArchiveFormat) do
begin

View file

@ -84,10 +84,13 @@
</Mode0>
</Modes>
</RunParams>
<RequiredPackages Count="1">
<RequiredPackages Count="2">
<Item1>
<PackageName Value="LazUtils"/>
<PackageName Value="doublecmd_common"/>
</Item1>
<Item2>
<PackageName Value="LazUtils"/>
</Item2>
</RequiredPackages>
<Units Count="6">
<Unit0>

View file

@ -52,20 +52,20 @@ type
implementation
uses
ActiveX, JwaWinError;
ActiveX, JwaWinError, DCClassesUtf8;
{ TSfxSevenzipOutStream }
constructor TSfxSevenzipOutStream.Create(AStream: TStream; const ASfxModule: String);
var
SfxModule: TFileStream;
SfxModule: TFileStreamEX;
begin
inherited Create;
FStream := AStream;
FSfxModule := ASfxModule;
SfxModule:= TFileStream.Create(FSfxModule, fmOpenRead or fmShareDenyNone);
SfxModule:= TFileStreamEx.Create(FSfxModule, fmOpenRead or fmShareDenyNone);
try
FStream.Seek(0, soBeginning);
FSfxLength := FStream.CopyFrom(SfxModule, SfxModule.Size);

View file

@ -2228,7 +2228,7 @@ const
implementation
uses
DCJclResources, DCJclCompression;
DCJclResources, DCJclCompression, DCBasicTypes, DCOSUtils, DCDateTimeUtils, DCClassesUtf8;
const
JclDefaultBufferSize = 131072; // 128k
@ -3572,15 +3572,15 @@ var
GZipStreamDateTime: TDateTime;
begin
Result := False;
if not FileExists(SourceFile) then // can't copy what doesn't exist!
if not mbFileExists(SourceFile) then // can't copy what doesn't exist!
Exit;
GetFileLastWrite(SourceFile, GZipStreamDateTime);
{destination and source streams first and second}
SourceStream := TFileStream.Create(SourceFile, fmOpenRead or fmShareDenyWrite);
SourceStream := TFileStreamEx.Create(SourceFile, fmOpenRead or fmShareDenyWrite);
try
DestStream := TFileStream.Create(DestinationFile, fmCreate); // see SysUtils
DestStream := TFileStreamEx.Create(DestinationFile, fmCreate); // see SysUtils
try
{ create compressionstream third, and copy from source,
through zlib compress layer,
@ -3598,7 +3598,7 @@ begin
finally
SourceStream.Free;
end;
Result := FileExists(DestinationFile);
Result := mbFileExists(DestinationFile);
end;
{ Decompress a .gz file }
@ -3612,13 +3612,13 @@ var
GZipStreamDateTime: TDateTime;
begin
Result := False;
if not FileExists(SourceFile) then // can't copy what doesn't exist!
if not mbFileExists(SourceFile) then // can't copy what doesn't exist!
Exit;
{destination and source streams first and second}
SourceStream := TFileStream.Create(SourceFile, {mode} fmOpenRead or fmShareDenyWrite);
SourceStream := TFileStreamEx.Create(SourceFile, {mode} fmOpenRead or fmShareDenyWrite);
try
DestStream := TFileStream.Create(DestinationFile, {mode} fmCreate); // see SysUtils
DestStream := TFileStreamEx.Create(DestinationFile, {mode} fmCreate); // see SysUtils
try
{ create decompressionstream third, and copy from source,
through zlib decompress layer, out through file stream
@ -3636,7 +3636,7 @@ begin
finally
SourceStream.Free;
end;
Result := FileExists(DestinationFile);
Result := mbFileExists(DestinationFile);
if Result and (GZipStreamDateTime <> 0) then
// preserve datetime when unpacking! (see JclFileUtils)
SetFileLastWrite(DestinationFile, GZipStreamDateTime);
@ -3678,13 +3678,13 @@ var
SourceStream: TFileStream;
begin
Result := False;
if not FileExists(SourceFile) then // can't copy what doesn't exist!
if not mbFileExists(SourceFile) then // can't copy what doesn't exist!
Exit;
{destination and source streams first and second}
SourceStream := TFileStream.Create(SourceFile, fmOpenRead or fmShareDenyWrite);
SourceStream := TFileStreamEx.Create(SourceFile, fmOpenRead or fmShareDenyWrite);
try
DestStream := TFileStream.Create(DestinationFile, fmCreate); // see SysUtils
DestStream := TFileStreamEx.Create(DestinationFile, fmCreate); // see SysUtils
try
{ create compressionstream third, and copy from source,
through zlib compress layer,
@ -3701,7 +3701,7 @@ begin
finally
SourceStream.Free;
end;
Result := FileExists(DestinationFile);
Result := mbFileExists(DestinationFile);
end;
{ Decompress a .bzip2 file }
@ -3714,13 +3714,13 @@ var
SourceStream: TFileStream;
begin
Result := False;
if not FileExists(SourceFile) then // can't copy what doesn't exist!
if not mbFileExists(SourceFile) then // can't copy what doesn't exist!
Exit;
{destination and source streams first and second}
SourceStream := TFileStream.Create(SourceFile, {mode} fmOpenRead or fmShareDenyWrite);
SourceStream := TFileStreamEx.Create(SourceFile, {mode} fmOpenRead or fmShareDenyWrite);
try
DestStream := TFileStream.Create(DestinationFile, {mode} fmCreate); // see SysUtils
DestStream := TFileStreamEx.Create(DestinationFile, {mode} fmCreate); // see SysUtils
try
{ create decompressionstream third, and copy from source,
through zlib decompress layer, out through file stream
@ -3737,7 +3737,7 @@ begin
finally
SourceStream.Free;
end;
Result := FileExists(DestinationFile);
Result := mbFileExists(DestinationFile);
end;
procedure BZip2Stream(SourceStream, DestinationStream: TStream; CompressionLevel: Integer = 5;
@ -3775,25 +3775,25 @@ begin
Result := nil;
case StreamAccess of
saCreate:
Result := TFileStream.Create(FileName, fmCreate);
Result := TFileStreamEx.Create(FileName, fmCreate);
saReadOnly:
if FileExists(FileName) then
Result := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
if mbFileExists(FileName) then
Result := TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyWrite);
saReadOnlyDenyNone:
if FileExists(FileName) then
Result := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
if mbFileExists(FileName) then
Result := TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyNone);
saWriteOnly:
if FileExists(FileName) then
Result := TFileStream.Create(FileName, fmOpenWrite)
if mbFileExists(FileName) then
Result := TFileStreamEx.Create(FileName, fmOpenWrite)
else
if FileName <> '' then
Result := TFileStream.Create(FileName, fmCreate);
Result := TFileStreamEx.Create(FileName, fmCreate);
saReadWrite:
if FileExists(FileName) then
Result := TFileStream.Create(FileName, fmOpenReadWrite)
if mbFileExists(FileName) then
Result := TFileStreamEx.Create(FileName, fmOpenReadWrite)
else
if FileName <> '' then
Result := TFileStream.Create(FileName, fmCreate);
Result := TFileStreamEx.Create(FileName, fmCreate);
end;
end;
@ -3808,7 +3808,7 @@ end;
function TJclCompressionItem.DeleteOutputFile: Boolean;
begin
Result := (FFileName <> '') and FileExists(FFileName) and FileDelete(FFileName);
Result := (FFileName <> '') and mbFileExists(FFileName) and mbDeleteFile(FFileName);
end;
destructor TJclCompressionItem.Destroy;
@ -3836,7 +3836,7 @@ begin
Result := FCRC;
end;
function TJclCompressionItem.GetCreationTime: TFileTime;
function TJclCompressionItem.GetCreationTime: Windows.TFileTime;
begin
CheckGetProperty(ipCreationTime);
Result := FCreationTime;
@ -3891,13 +3891,13 @@ begin
Result := ikFile;
end;
function TJclCompressionItem.GetLastAccessTime: TFileTime;
function TJclCompressionItem.GetLastAccessTime: Windows.TFileTime;
begin
CheckGetProperty(ipLastAccessTime);
Result := FLastAccessTime;
end;
function TJclCompressionItem.GetLastWriteTime: TFileTime;
function TJclCompressionItem.GetLastWriteTime: Windows.TFileTime;
begin
CheckGetProperty(ipLastWriteTime);
Result := FLastWriteTime;
@ -4037,7 +4037,7 @@ begin
Include(FValidProperties, ipCRC);
end;
procedure TJclCompressionItem.SetCreationTime(const Value: TFileTime);
procedure TJclCompressionItem.SetCreationTime(const Value: Windows.TFileTime);
begin
CheckSetProperty(ipCreationTime);
FCreationTime := Value;
@ -4066,7 +4066,7 @@ end;
procedure TJclCompressionItem.SetFileName(const Value: TFileName);
var
AFindData: TWin32FindData;
AFindData: TFileAttributeData;
begin
CheckSetProperty(ipFileName);
FFileName := Value;
@ -4081,20 +4081,19 @@ begin
Exclude(FValidProperties, ipFileName);
end;
if (Value <> '') and (FArchive is TJclCompressionArchive)
and GetFileAttributesEx(PChar(Value), GetFileExInfoStandard, @AFindData) then
if (Value <> '') and (FArchive is TJclCompressionArchive) and mbFileGetAttr(Value, AFindData) then
begin
FileSize := (Int64(AFindData.nFileSizeHigh) shl 32) or AFindData.nFileSizeLow;
Attributes := AFindData.dwFileAttributes;
CreationTime := AFindData.ftCreationTime;
LastAccessTime := AFindData.ftLastAccessTime;
LastWriteTime := AFindData.ftLastWriteTime;
FileSize := AFindData.Size;
Attributes := AFindData.Attr;
CreationTime := Windows.TFileTime(FileTimeToWinFileTime(AFindData.PlatformTime));
LastAccessTime := Windows.TFileTime(FileTimeToWinFileTime(AFindData.LastAccessTime));
LastWriteTime := Windows.TFileTime(FileTimeToWinFileTime(AFindData.LastWriteTime));
// TODO: user name and group (using file handle and GetSecurityInfo)
{$IFDEF MSWINDOWS}
HostOS := LoadResString(@RsCompression7zWindows);
HostOS := WideString(LoadResString(@RsCompression7zWindows));
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
HostOS := LoadResString(@RsCompression7zUnix);
HostOS := WideString(LoadResString(@RsCompression7zUnix));
{$ENDIF UNIX}
end;
end;
@ -4131,7 +4130,7 @@ begin
Include(FValidProperties, ipHostOS);
end;
procedure TJclCompressionItem.SetLastAccessTime(const Value: TFileTime);
procedure TJclCompressionItem.SetLastAccessTime(const Value: Windows.TFileTime);
begin
CheckSetProperty(ipLastAccessTime);
FLastAccessTime := Value;
@ -4139,7 +4138,7 @@ begin
Include(FValidProperties, ipLastAccessTime);
end;
procedure TJclCompressionItem.SetLastWriteTime(const Value: TFileTime);
procedure TJclCompressionItem.SetLastWriteTime(const Value: Windows.TFileTime);
begin
CheckSetProperty(ipLastWriteTime);
FLastWriteTime := Value;
@ -4226,53 +4225,58 @@ begin
end;
function TJclCompressionItem.UpdateFileTimes: Boolean;
const
FILE_WRITE_ATTRIBUTES = $00000100;
var
FileHandle: HFILE;
ACreationTime, ALastAccessTime, ALastWriteTime: PFileTime;
AFileTime: PFileTime;
ACreationTime, ALastAccessTime, ALastWriteTime: TFileTimeEx;
begin
ReleaseStream;
Result := FFileName <> '';
if Result then
begin
FileHandle := CreateFile(PChar(FFileName), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);
try
// creation time should be the oldest
if ipCreationTime in FValidProperties then
ACreationTime := @FCreationTime
else
if ipLastWriteTime in FValidProperties then
ACreationTime := @FLastWriteTime
else
if ipLastAccessTime in FValidProperties then
ACreationTime := @FLastAccessTime
else
ACreationTime := nil;
// last access time may default to now if not set
if ipLastAccessTime in FValidProperties then
ALastAccessTime := @FLastAccessTime
else
ALastAccessTime := nil;
// last write time may, if not set, be the creation time or last access time
if ipLastWriteTime in FValidProperties then
ALastWriteTime := @FLastWriteTime
else
if ipCreationTime in FValidProperties then
ALastWriteTime := @FCreationTime
else
if ipLastAccessTime in FValidProperties then
ALastWriteTime := @FLastAccessTime
else
ALastWriteTime := nil;
Result := (FileHandle <> INVALID_HANDLE_VALUE) and SetFileTime(FileHandle, ACreationTime, ALastAccessTime,
ALastWriteTime);
finally
CloseHandle(FileHandle);
// creation time should be the oldest
if ipCreationTime in FValidProperties then
AFileTime := @FCreationTime
else
if ipLastWriteTime in FValidProperties then
AFileTime := @FLastWriteTime
else
if ipLastAccessTime in FValidProperties then
AFileTime := @FLastAccessTime
else begin
AFileTime := nil;
end;
if Assigned(AFileTime) then
ACreationTime := WinFileTimeToFileTimeEx(TWinFileTime(AFileTime^))
else begin
ACreationTime := TFileTimeExNull;
end;
// last access time may default to now if not set
if ipLastAccessTime in FValidProperties then
ALastAccessTime := WinFileTimeToFileTimeEx(TWinFileTime(FLastAccessTime))
else begin
ALastAccessTime := TFileTimeExNull;
end;
// last write time may, if not set, be the creation time or last access time
if ipLastWriteTime in FValidProperties then
AFileTime := @FLastWriteTime
else
if ipCreationTime in FValidProperties then
AFileTime := @FCreationTime
else
if ipLastAccessTime in FValidProperties then
AFileTime := @FLastAccessTime
else begin
AFileTime := nil;
end;
if Assigned(AFileTime) then
ALastWriteTime := WinFileTimeToFileTimeEx(TWinFileTime(AFileTime^))
else begin
ALastWriteTime := TFileTimeExNull;
end;
Result := mbFileSetTimeEx(FFileName, ALastWriteTime, ACreationTime, ALastAccessTime);
end;
end;
@ -4502,7 +4506,7 @@ begin
Result := nil;
// load archive to test signature
ArchiveStream := TFileStream.Create(AFileName, fmOpenRead and fmShareDenyNone);
ArchiveStream := TFileStreamEx.Create(AFileName, fmOpenRead and fmShareDenyNone);
try
for Index := Low(MatchingFormats) to High(MatchingFormats) do
if SignatureMatches(MatchingFormats[Index], ArchiveStream, Buffer) then
@ -4578,7 +4582,7 @@ begin
Result := nil;
// load archive to test signature
ArchiveStream := TFileStream.Create(AFileName, fmOpenRead and fmShareDenyNone);
ArchiveStream := TFileStreamEx.Create(AFileName, fmOpenRead and fmShareDenyNone);
try
for Index := Low(MatchingFormats) to High(MatchingFormats) do
if SignatureMatches(MatchingFormats[Index], ArchiveStream, Buffer) then
@ -5165,7 +5169,7 @@ function TJclCompressArchive.AddFile(const PackedName: WideString;
AStream: TStream; AOwnsStream: Boolean): Integer;
var
AItem: TJclCompressionItem;
NowFileTime: TFileTime;
NowFileTime: Windows.TFileTime;
begin
CheckNotCompressing;
@ -5175,16 +5179,16 @@ begin
AItem.Stream := AStream;
AItem.OwnsStream := AOwnsStream;
AItem.FileSize := AStream.Size - AStream.Position;
NowFileTime := LocalDateTimeToFileTime(Now);
NowFileTime := Windows.TFileTime(DateTimeToWinFileTime(Now));
AItem.Attributes := faReadOnly and faArchive;
AItem.CreationTime := NowFileTime;
AItem.LastAccessTime := NowFileTime;
AItem.LastWriteTime := NowFileTime;
{$IFDEF MSWINDOWS}
AItem.HostOS := LoadResString(@RsCompression7zWindows);
AItem.HostOS := WideString(LoadResString(@RsCompression7zWindows));
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
AItem.HostOS := LoadResString(@RsCompression7zUnix);
AItem.HostOS := WideString(LoadResString(@RsCompression7zUnix));
{$ENDIF UNIX}
except
AItem.Destroy;
@ -5585,7 +5589,7 @@ begin
if AVolume.OwnsTmpStream then
begin
FreeAndNil(AVolume.FTmpStream);
FileDelete(AVolume.TmpFileName);
mbDeleteFile(AVolume.TmpFileName);
end;
end;
end;
@ -6804,7 +6808,7 @@ begin
if AVolume.OwnsStream then
begin
FreeAndNil(AVolume.FStream);
FileDelete(AVolume.FileName);
mbDeleteFile(AVolume.FileName);
end;
end;
end;

View file

@ -0,0 +1,101 @@
msgid ""
msgstr ""
"Project-Id-Version: Double Commander Plugin 'unrar'\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2024-11-01 18:01+0100\n"
"Last-Translator: ㋡ <braass@mail.de>\n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0.1\n"
#: tdialogbox.caption
msgid "Options"
msgstr "Optionen"
#: tdialogbox.lblpath.caption
msgid "Path to Win&RAR executable"
msgstr "Pfad zur ausführbaren Win&RAR-Datei"
#: tdialogbox.gboptions.caption
msgid "Archiving options"
msgstr "Optionen für die Archivierung"
#: tdialogbox.gboptions.chkrecovery.caption
msgid "Add r&ecovery record"
msgstr "Wiederherstellungs&eintrag hinzufügen"
#: tdialogbox.gboptions.chkencrypt.caption
msgid "Encrypt file &names"
msgstr "Datei&namen verschlüsseln"
#: tdialogbox.gboptions.chksolid.caption
msgid "Create &solid archive"
msgstr "&Solide (progressiv) komprimiertes Archiv erstellen"
#: tdialogbox.lblmethod.caption
msgid "&Compression method"
msgstr "&Komprimierungsmethode"
#: tdialogbox.brncancel.caption
msgid "Cancel"
msgstr "Abbrechen"
#: tdialogbox.btnsave.caption
msgid "OK"
msgstr "OK"
#: tdialogbox.lblargs.caption
msgid "Additional parameters"
msgstr "Zusätzliche Parameter"
#: rarlng.rsdictlargewarning
msgid "Large dictionary warning"
msgstr ""
"\"Großes Wörterbuch\"-Warnung (es fallen extrem viele Ersatzsymbole für "
"Zeichenfolgen an)"
#: rarlng.rsdictnotallowed
#, object-pascal-format
msgid ""
"%u GB dictionary exceeds %u GB limit and needs more than %u GB memory to "
"unpack."
msgstr ""
"%u GB \"Wörterbuch\" übersteigt %u GB Grenze und braucht mehr als %u GB "
"Speicher zum Entpacken."
#: rarlng.rsmsgbuttoncancel
msgid "&Cancel"
msgstr "Abbre&chen"
#: rarlng.rsmsgbuttonextract
msgid "&Extract"
msgstr "&Entpacke einzelne Datei(en)"
#: rarlng.rsmsgpasswordenter
msgid "Please enter the password:"
msgstr "Bitte Passwort eingeben:"
#: rarlng.rsmsgexecutablenotfound
#, object-pascal-format
msgid ""
"Cannot find RAR executable!\n"
"\n"
"%s\n"
"\n"
"Please check the plugin settings."
msgstr ""
"Ausführbares RAR-Programm nicht gefunden!\n"
"\n"
"%s\n"
"\n"
"Bitte überprüfen Sie die Einstellungen des Plugins."
#: rarlng.rsmsglibrarynotfound
#, object-pascal-format
msgid "Cannot load library %s! Please check your installation."
msgstr ""
"Kann Bibliothek %s nicht laden! Bitte überprüfen Sie Ihre Installation."

View file

@ -0,0 +1,77 @@
msgid ""
msgstr ""
"Project-Id-Version: Double Commander Plugin 'zip'\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2024-11-01 18:01+0100\n"
"Last-Translator: ㋡ <braass@mail.de>\n"
"Language-Team: Deutsch <braass@mail.de>\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0.1\n"
#: tdialogbox.caption
msgid "Zip plugin configuration"
msgstr "Zip-Plugin Konfiguration"
#: tdialogbox.lblAbout.caption
msgid "Zip plugin supports PKZIP-compatible, TAR, XZ, GZip, Zstandard and BZip2 data compression and archiving."
msgstr "Zip-Plugin unterstützt PKZIP-kompatible, TAR, XZ, GZip, Zstandard and BZip2 Komprimierung und Archivierung von Daten."
#: tdialogbox.gbCompression.caption
msgid "Compression"
msgstr "Komprimierung"
#: tdialogbox.gbCompression.lblArchiveFormat.caption
msgid "Archive format:"
msgstr "Format des Archivs:"
#: tdialogbox.gbCompression.lblCompressionMethod.caption
msgid "Compression method:"
msgstr "Komprimierungsmethode:"
#: tdialogbox.gbCompression.lblCompressionLevel.caption
msgid "Compression level:"
msgstr "Komprimierungsgrad:"
#: tdialogbox.chkTarAutoHandle.caption
msgid "Open *.tar.xyz archives at one step (slowly with big archives)"
msgstr "*.tar.xyz Archive in einem Schritt öffnen (langsam bei großen Archiven)"
#: tdialogbox.btnCancel.caption
msgid "Cancel"
msgstr "Abbrechen"
#: tdialogbox.btnOK.caption
msgid "OK"
msgstr "OK"
#: ziplng.rscompressionmethodstore
msgid "Store"
msgstr "Speichern"
#: ziplng.rscompressionmethodoptimal
msgid "Optimal (2x slower)"
msgstr "Optimal (2x langsamer)"
#: ziplng.rscompressionlevelfastest
msgid "Fastest"
msgstr "Am schnellsten"
#: ziplng.rscompressionlevelfast
msgid "Fast"
msgstr "Schnell"
#: ziplng.rscompressionlevelnormal
msgid "Normal"
msgstr "Normal"
#: ziplng.rscompressionlevelmaximum
msgid "Maximum"
msgstr "Maximum"
#: ziplng.rscompressionlevelultra
msgid "Ultra"
msgstr "Extrem"

View file

@ -1,16 +1,16 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Project-Id-Version: Double Commander Plugin 'ftp'\n"
"Project-Id-Version: Double Commander Plugin 'ftp'\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: <braass@mail.de>\n"
"PO-Revision-Date: 2024-11-01 18:01+0100\n"
"Last-Translator: <braass@mail.de>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"X-Generator: Poedit 2.3\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0.1\n"
#: tdialogbox.btnadd.caption
msgid "+"
@ -43,7 +43,7 @@ msgstr "FTP"
#: tdialogbox.chkagentssh.caption
msgid "Use SSH-agent authentication"
msgstr ""
msgstr "SSH-Agent-Authentifizierung verwenden"
#: tdialogbox.chkcopyscp.caption
msgid "Copy using SCP protocol (faster)"
@ -129,7 +129,7 @@ msgstr "&Passwort:"
#: tdialogbox.lblproxyuser.caption
msgid "&User name:"
msgstr "Benutzername:"
msgstr "Ben&utzername:"
#: tdialogbox.lblpublickey.caption
msgid "Public key file (*.pub):"
@ -161,5 +161,5 @@ msgstr "Proxy"
#: tfrmfileproperties.caption
msgid "Properties"
msgstr ""
msgstr "Eigenschaften"

View file

@ -574,9 +574,21 @@ begin
end;
procedure TFTPSendEx.OnSocketStatus(Sender: TObject; Reason: THookSocketReason; const Value: String);
var
MsgType: Integer;
begin
if (Reason in [HR_Error]) and (Length(Value) > 0) then
LogProc(PluginNumber, msgtype_importanterror, PWideChar(ServerToClient(Value)));
if (Reason in [HR_ResolvingBegin, HR_ResolvingEnd, HR_Error]) then
begin
if (Length(Value) > 0) then
begin
if Reason = HR_Error then
MsgType:= msgtype_importanterror
else begin
MsgType:= msgtype_details;
end;
LogProc(PluginNumber, MsgType, PWideChar(ServerToClient(Value)));
end;
end;
end;
function TFTPSendEx.ClientToServer(const Value: AnsiString): AnsiString;

View file

@ -446,6 +446,86 @@ function ResolvePort(Port: string; Family, SockProtocol, SockType: integer): Wor
{==============================================================================}
implementation
uses
InitC;
{$if defined(LINUX) or defined(OPENBSD)}
{$define FIRST_ADDR_THEN_CANONNAME}
{$elseif defined(FREEBSD) or defined(NETBSD) or defined(DRAGONFLY) or defined(SOLARIS) or defined(ANDROID) or defined(DARWIN) or defined(HAIKU)}
{$define FIRST_CANONNAME_THEN_ADDR}
{$else}
{$error fatal 'Please consult the netdb.h file for your system to determine the order of ai_addr and ai_canonname'}
{$endif}
{$push}{$packrecords c}
type
PAddrInfo = ^addrinfo;
addrinfo = record
ai_flags: cint; {* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST *}
ai_family: cint; {* PF_xxx *}
ai_socktype: cint; {* SOCK_xxx *}
ai_protocol: cint; {* 0 or IPPROTO_xxx for IPv4 and IPv6 *}
ai_addrlen: TSockLen; {* length of ai_addr *}
{$ifdef FIRST_CANONNAME_THEN_ADDR}
ai_canonname: PAnsiChar; {* canonical name for hostname *}
ai_addr: psockaddr; {* binary address *}
{$endif}
{$ifdef FIRST_ADDR_THEN_CANONNAME}
ai_addr: psockaddr; {* binary address *}
ai_canonname: PAnsiChar; {* canonical name for hostname *}
{$endif}
ai_next: PAddrInfo; {* next structure in linked list *}
end;
TAddrInfo = addrinfo;
PPAddrInfo = ^PAddrInfo;
{$pop}
function getaddrinfo(name, service: PAnsiChar; hints: PAddrInfo; res: PPAddrInfo): cint; cdecl; external clib;
procedure freeaddrinfo(ai: PAddrInfo); cdecl; external clib;
function ResolveName(const HostName: String; Addresses: Pointer; MaxAddresses, Family: Integer): Integer; overload;
var
hints: TAddrInfo;
res, ai: PAddrInfo;
begin
Result:= -1;
if MaxAddresses = 0 then Exit;
res:= nil;
hints:= Default(TAddrInfo);
hints.ai_family:= Family;
hints.ai_socktype:= SOCK_STREAM;
if (getaddrinfo(PAnsiChar(HostName), nil, @hints, @res) <> 0) or (res = nil) then
Exit;
ai:= res;
Result:= 0;
repeat
if ai^.ai_family = Family then
begin
if Family = AF_INET then
begin
Move(PInetSockAddr(ai^.ai_addr)^.sin_addr, Addresses^, SizeOf(TInAddr));
Inc(PInAddr(Addresses));
end
else begin
Move(PInetSockAddr6(ai^.ai_addr)^.sin6_addr, Addresses^, SizeOf(TIn6Addr));
Inc(PIn6Addr(Addresses));
end;
Inc(Result);
end;
ai:= ai^.ai_next;
until (ai = nil) or (Result >= MaxAddresses);
freeaddrinfo(res);
end;
function ResolveName(HostName: String; var Addresses: array of THostAddr): Integer; overload;
begin
Result:= ResolveName(HostName, @Addresses, Length(Addresses), AF_INET);
end;
function ResolveName6(HostName: String; var Addresses: array of THostAddr6): Integer;
begin
Result:= ResolveName(HostName, @Addresses, Length(Addresses), AF_INET6);
end;
function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean;
begin

View file

@ -254,6 +254,7 @@ begin
item.initPath( pchar(filepath) );
end;
view.setPreviewItem( item );
item.release;
end;
function ListLoad( ParentWin:THandle; FileToLoad:pchar; {%H-}ShowFlags:integer):THandle; cdecl;

View file

@ -44,7 +44,7 @@
</Target>
<SearchPaths>
<IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk;..\units"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt;filesources\gio\network"/>
<UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
<SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/>
</SearchPaths>
@ -87,7 +87,7 @@
</Target>
<SearchPaths>
<IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk;..\units"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt;filesources\gio\network"/>
<UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
<SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/>
</SearchPaths>
@ -126,7 +126,7 @@
</Target>
<SearchPaths>
<IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk;..\units"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt;filesources\gio\network"/>
<UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
<SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/>
</SearchPaths>
@ -200,7 +200,7 @@ end;"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk;..\units"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;..\components\DDetours\Source;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;..\components\DDetours\Source;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt;filesources\gio\network"/>
<UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
<SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/>
</SearchPaths>
@ -311,7 +311,7 @@ end;"/>
<PackageName Value="Image32"/>
</Item13>
</RequiredPackages>
<Units Count="276">
<Units Count="277">
<Unit0>
<Filename Value="doublecmd.lpr"/>
<IsPartOfProject Value="True"/>
@ -1347,6 +1347,7 @@ end;"/>
<Unit167>
<Filename Value="filesources\vfs\uvfsfilesource.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uVfsFileSource"/>
</Unit167>
<Unit168>
<Filename Value="filesources\vfs\uvfslistoperation.pas"/>
@ -2010,6 +2011,11 @@ end;"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uDarwinFinderModel"/>
</Unit275>
<Unit276>
<Filename Value="filesources\gio\network\unetworkfilesource.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uNetworkFileSource"/>
</Unit276>
</Units>
</ProjectOptions>
<CompilerOptions>
@ -2020,7 +2026,7 @@ end;"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk;..\units"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt"/>
<OtherUnitFiles Value="platform;platform\$(SrcOS);platform\$(SrcOS)\$(TargetOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet;platform\unix\glib;platform\unix\mime;filesources\gio;rpc;rpc\sys\$(SrcOS);rpc\sys;filesources\recyclebin;filesources\gio\trash;filesources\winnet\wsl;filesources\shellfolder;platform\win\winrt;filesources\gio\network"/>
<UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
<SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/>
</SearchPaths>

View file

@ -12,14 +12,13 @@ inherited frmCheckSumCalc: TfrmCheckSumCalc
Constraints.MinWidth = 400
OnCreate = FormCreate
OnShow = FormShow
Position = poScreenCenter
SessionProperties = 'cbOpenAfterJobIsComplete.Checked;cbSeparateFile.Checked;lbHashAlgorithm.ItemIndex'
Position = poOwnerFormCenter
SessionProperties = 'cbOpenAfterJobIsComplete.Checked;cbSeparateFile.Checked;lbHashAlgorithm.ItemIndex;cbSeparateFolder.Checked'
inherited pnlContent: TPanel
Height = 346
Width = 384
ClientHeight = 346
ClientWidth = 384
ParentColor = True
object lblSaveTo: TLabel[0]
Left = 0
Height = 15
@ -51,10 +50,10 @@ inherited frmCheckSumCalc: TfrmCheckSumCalc
Height = 19
Top = 50
Width = 242
BorderSpacing.Top = 6
BorderSpacing.Top = 4
Caption = 'C&reate separate checksum file for each file'
OnChange = cbSeparateFileChange
TabOrder = 1
OnChange = cbSeparateFileChange
end
object lbHashAlgorithm: TListBox[3]
AnchorSideLeft.Control = edtSaveTo
@ -70,21 +69,21 @@ inherited frmCheckSumCalc: TfrmCheckSumCalc
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
ItemHeight = 0
TabOrder = 6
OnSelectionChange = lbHashAlgorithmSelectionChange
TabOrder = 5
end
object cbOpenAfterJobIsComplete: TCheckBox[4]
AnchorSideLeft.Control = edtSaveTo
AnchorSideTop.Control = cbSeparateFile
AnchorSideTop.Control = cbSeparateFolder
AnchorSideTop.Side = asrBottom
Left = 0
Height = 19
Top = 75
Top = 102
Width = 243
BorderSpacing.Top = 6
BorderSpacing.Top = 4
Caption = 'Open checksum file after job is completed'
TabOrder = 3
OnChange = cbSeparateFileChange
TabOrder = 2
end
object lblFileFormat: TLabel[5]
AnchorSideLeft.Control = cbOpenAfterJobIsComplete
@ -92,7 +91,7 @@ inherited frmCheckSumCalc: TfrmCheckSumCalc
AnchorSideTop.Side = asrCenter
Left = 0
Height = 15
Top = 102
Top = 131
Width = 57
BorderSpacing.Top = 6
Caption = 'File &format'
@ -106,12 +105,12 @@ inherited frmCheckSumCalc: TfrmCheckSumCalc
AnchorSideTop.Side = asrBottom
Left = 69
Height = 19
Top = 100
Top = 129
Width = 69
BorderSpacing.Left = 12
BorderSpacing.Top = 6
Caption = 'Windows'
TabOrder = 3
TabOrder = 4
end
object rbUnix: TRadioButton[7]
AnchorSideLeft.Control = rbWindows
@ -120,18 +119,30 @@ inherited frmCheckSumCalc: TfrmCheckSumCalc
AnchorSideTop.Side = asrCenter
Left = 144
Height = 19
Top = 100
Top = 129
Width = 44
BorderSpacing.Left = 6
Caption = 'Unix'
TabOrder = 4
TabOrder = 5
end
object cbSeparateFolder: TCheckBox[8]
AnchorSideLeft.Control = cbSeparateFile
AnchorSideTop.Control = cbSeparateFile
AnchorSideTop.Side = asrBottom
Left = 0
Height = 21
Top = 77
Width = 300
BorderSpacing.Top = 4
Caption = 'Create separate checksum file for each &directory'
TabOrder = 2
OnChange = cbSeparateFolderChange
end
end
inherited pnlButtons: TPanel
Top = 358
Width = 384
ClientWidth = 384
Color = clDefault
inherited btnCancel: TBitBtn
Left = 202
end

View file

@ -5,5 +5,6 @@
{"hash":20936404,"name":"tfrmchecksumcalc.cbopenafterjobiscomplete.caption","sourcebytes":[79,112,101,110,32,99,104,101,99,107,115,117,109,32,102,105,108,101,32,97,102,116,101,114,32,106,111,98,32,105,115,32,99,111,109,112,108,101,116,101,100],"value":"Open checksum file after job is completed"},
{"hash":136754340,"name":"tfrmchecksumcalc.lblfileformat.caption","sourcebytes":[70,105,108,101,32,38,102,111,114,109,97,116],"value":"File &format"},
{"hash":235189939,"name":"tfrmchecksumcalc.rbwindows.caption","sourcebytes":[87,105,110,100,111,119,115],"value":"Windows"},
{"hash":378120,"name":"tfrmchecksumcalc.rbunix.caption","sourcebytes":[85,110,105,120],"value":"Unix"}
{"hash":378120,"name":"tfrmchecksumcalc.rbunix.caption","sourcebytes":[85,110,105,120],"value":"Unix"},
{"hash":75632937,"name":"tfrmchecksumcalc.cbseparatefolder.caption","sourcebytes":[67,114,101,97,116,101,32,115,101,112,97,114,97,116,101,32,99,104,101,99,107,115,117,109,32,102,105,108,101,32,102,111,114,32,101,97,99,104,32,38,100,105,114,101,99,116,111,114,121],"value":"Create separate checksum file for each &directory"}
]}

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
Calculate checksum dialog
Copyright (C) 2009-2023 Alexander Koblov (alexx2000@mail.ru)
Copyright (C) 2009-2024 Alexander Koblov (alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -36,6 +36,7 @@ type
TfrmCheckSumCalc = class(TfrmButtonForm)
cbSeparateFile: TCheckBox;
cbOpenAfterJobIsComplete: TCheckBox;
cbSeparateFolder: TCheckBox;
edtSaveTo: TEdit;
lblFileFormat: TLabel;
lblSaveTo: TLabel;
@ -43,6 +44,7 @@ type
rbWindows: TRadioButton;
rbUnix: TRadioButton;
procedure cbSeparateFileChange(Sender: TObject);
procedure cbSeparateFolderChange(Sender: TObject);
procedure edtSaveToChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
@ -50,16 +52,18 @@ type
private
FFileName: String;
FAlgorithm: THashAlgorithm;
procedure Change(Sender, Alien: TCheckBox);
public
{ public declarations }
end;
function ShowCalcCheckSum(var sFileName: String; out SeparateFile: Boolean;
function ShowCalcCheckSum(TheOwner: TComponent; var sFileName: String;
out SeparateFile: Boolean; out SeparateFolder: Boolean;
out HashAlgorithm: THashAlgorithm; out OpenFileAfterJobCompleted: Boolean;
out TextLineBreakStyle: TTextLineBreakStyle;
out QueueId: TOperationsManagerQueueIdentifier): Boolean;
function ShowCalcVerifyCheckSum(out Hash: String; out HashAlgorithm: THashAlgorithm;
function ShowCalcVerifyCheckSum(TheOwner: TComponent; out Hash: String; out HashAlgorithm: THashAlgorithm;
out QueueId: TOperationsManagerQueueIdentifier): Boolean;
implementation
@ -69,14 +73,15 @@ implementation
uses
uGlobs, uLng;
function ShowCalcCheckSum(var sFileName: String; out SeparateFile: Boolean; out
function ShowCalcCheckSum(TheOwner: TComponent; var sFileName: String; out
SeparateFile: Boolean; out SeparateFolder: Boolean; out
HashAlgorithm: THashAlgorithm; out OpenFileAfterJobCompleted: Boolean; out
TextLineBreakStyle: TTextLineBreakStyle; out
QueueId: TOperationsManagerQueueIdentifier): Boolean;
const
TextLineBreak: array[Boolean] of TTextLineBreakStyle = (tlbsLF, tlbsCRLF);
begin
with TfrmCheckSumCalc.Create(Application) do
with TfrmCheckSumCalc.Create(TheOwner) do
try
FFileName:= sFileName;
if (DefaultTextLineBreakStyle = tlbsCRLF) then
@ -90,6 +95,7 @@ begin
begin
sFileName:= edtSaveTo.Text;
SeparateFile:= cbSeparateFile.Checked;
SeparateFolder:= cbSeparateFolder.Checked;;
TextLineBreakStyle:= TextLineBreak[rbWindows.Checked];
OpenFileAfterJobCompleted:=(cbOpenAfterJobIsComplete.Checked AND cbOpenAfterJobIsComplete.Enabled);
HashAlgorithm:= FAlgorithm;
@ -100,16 +106,20 @@ begin
end;
end;
function ShowCalcVerifyCheckSum(out Hash: String; out HashAlgorithm: THashAlgorithm;
out QueueId: TOperationsManagerQueueIdentifier): Boolean;
function ShowCalcVerifyCheckSum(TheOwner: TComponent; out Hash: String; out
HashAlgorithm: THashAlgorithm; out QueueId: TOperationsManagerQueueIdentifier): Boolean;
begin
with TfrmCheckSumCalc.Create(Application) do
with TfrmCheckSumCalc.Create(TheOwner) do
try
OnShow:= nil;
rbUnix.Visible:= False;
rbWindows.Visible:= False;
edtSaveTo.Text:= EmptyStr;
SessionProperties:= EmptyStr;
Caption:= rsCheckSumVerifyTitle;
lblFileFormat.Visible:= False;
cbSeparateFile.Visible:= False;
cbSeparateFolder.Visible:= False;
cbOpenAfterJobIsComplete.Visible:= False;
lbHashAlgorithm.OnSelectionChange:= nil;
edtSaveTo.OnChange:= @edtSaveToChange;
@ -132,12 +142,12 @@ end;
procedure TfrmCheckSumCalc.cbSeparateFileChange(Sender: TObject);
begin
if cbSeparateFile.Checked then
edtSaveTo.Text:= ExtractFilePath(edtSaveTo.Text) + '*.' + HashFileExt[FAlgorithm]
else
edtSaveTo.Text:= ExtractFilePath(edtSaveTo.Text) + ExtractFileName(FFileName) + '.' + HashFileExt[FAlgorithm];
Change(cbSeparateFile, cbSeparateFolder);
end;
cbOpenAfterJobIsComplete.Enabled:=not cbSeparateFile.Checked;
procedure TfrmCheckSumCalc.cbSeparateFolderChange(Sender: TObject);
begin
Change(cbSeparateFolder, cbSeparateFile);
end;
procedure TfrmCheckSumCalc.edtSaveToChange(Sender: TObject);
@ -179,5 +189,19 @@ begin
edtSaveTo.Text:= ChangeFileExt(edtSaveTo.Text, '.' + HashFileExt[FAlgorithm]);
end;
procedure TfrmCheckSumCalc.Change(Sender, Alien: TCheckBox);
begin
if Sender.Checked then
begin
Alien.Checked:= False;
edtSaveTo.Text:= ExtractFilePath(edtSaveTo.Text) + '*.' + HashFileExt[FAlgorithm]
end
else begin
edtSaveTo.Text:= ExtractFilePath(edtSaveTo.Text) + ExtractFileName(FFileName) + '.' + HashFileExt[FAlgorithm];
end;
cbOpenAfterJobIsComplete.Enabled:= not (Sender.Checked or Alien.Checked);
end;
end.

View file

@ -20,6 +20,7 @@ type
TFileSystemCalcChecksumOperation = class(TFileSourceCalcChecksumOperation)
private
FSourceFilesTree: TFileTree;
FFullFilesTree: TFiles; // source files including all files/dirs in subdirectories
FStatistics: TFileSourceCalcChecksumOperationStatistics; // local copy of statistics
FCheckSumFile: TStringListEx;
@ -40,7 +41,11 @@ type
function CheckSumCalc(aFile: TFile; out aValue: String): Boolean;
procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType);
procedure SaveHash(const FileName: String);
procedure SaveHashFile(const FileName: String);
procedure AddFile(FileName: String; const Hash: String);
function CalcChecksumProcessFile(aFile: TFile): Boolean;
function ProcessNode(aFileTreeNode: TFileTreeNode; const AFolder: String): Boolean;
function VerifyChecksumProcessFile(aFile: TFile; ExpectedChecksum: String): Boolean;
function FileExists(var AbsoluteTargetFileName: String): TFileSourceOperationOptionFileExists;
@ -106,9 +111,12 @@ begin
FreeAndNil(FFullFilesTree);
FreeAndNil(FCheckSumFile);
FreeAndNil(FChecksumsList);
FreeAndNil(FSourceFilesTree);
end;
procedure TFileSystemCalcChecksumOperation.Initialize;
var
TreeBuilder: TFileSystemTreeBuilder;
begin
// Get initialized statistics; then we change only what is needed.
FStatistics := RetrieveStatistics;
@ -116,10 +124,27 @@ begin
case Mode of
checksum_calc:
begin
FillAndCount(Files, False, False,
FFullFilesTree,
FStatistics.TotalFiles,
FStatistics.TotalBytes); // gets full list of files (recursive)
if SeparateFolder then
begin
TreeBuilder := TFileSystemTreeBuilder.Create(
@AskQuestion,
@CheckOperationState);
try
TreeBuilder.SymLinkOption := fsooslDontFollow;
TreeBuilder.BuildFromFiles(Files);
FSourceFilesTree := TreeBuilder.ReleaseTree;
FStatistics.TotalFiles := TreeBuilder.FilesCount;
FStatistics.TotalBytes := TreeBuilder.FilesSize;
finally
FreeAndNil(TreeBuilder);
end;
end
else begin
FillAndCount(Files, False, False,
FFullFilesTree,
FStatistics.TotalFiles,
FStatistics.TotalBytes); // gets full list of files (recursive)
end;
FCheckSumFile.TextLineBreakStyle:= TextLineBreakStyle;
@ -145,6 +170,12 @@ var
Entry: TChecksumEntry;
TargetFileName: String;
begin
if SeparateFolder then
begin
ProcessNode(FSourceFilesTree, ExcludeTrailingBackslash(Files.Path));
Exit;
end;
if OneFile and (Mode = checksum_calc) then
begin
TargetFileName:= TargetMask;
@ -199,19 +230,9 @@ begin
case Mode of
checksum_calc:
// make result
if OneFile then
try
CurrentFileIndex:= IfThen(Algorithm = HASH_SFV, 2, 0);
if (FCheckSumFile.Count > CurrentFileIndex) then
FCheckSumFile.SaveToFile(TargetFileName);
except
on E: EFCreateError do
AskQuestion(rsMsgErrECreate + ' ' + TargetFileName + ':',
E.Message, [fsourOk], fsourOk, fsourOk);
on E: EWriteError do
AskQuestion(rsMsgErrEWrite + ' ' + TargetFileName + ':',
E.Message, [fsourOk], fsourOk, fsourOk);
begin
// make result
if OneFile then SaveHashFile(TargetFileName);
end;
checksum_verify:
@ -421,8 +442,6 @@ begin
end;
function TFileSystemCalcChecksumOperation.CalcChecksumProcessFile(aFile: TFile): Boolean;
const
TextLineBreak: array[TTextLineBreakStyle] of String = ('/', '\', PathDelim);
var
FileName: String;
sCheckSum: String;
@ -450,30 +469,9 @@ begin
FileName:= ExtractDirLevel(FFullFilesTree.Path, aFile.Path) + aFile.Name;
if (TextLineBreak[TextLineBreakStyle] <> PathDelim) then
begin
FileName:= StringReplace(FileName, PathDelim, TextLineBreak[TextLineBreakStyle], [rfReplaceAll]);
end;
AddFile(FileName, sCheckSum);
if Algorithm = HASH_SFV then
begin
FCheckSumFile.Add(FileName + ' ' + sCheckSum);
end
else begin
FCheckSumFile.Add(sCheckSum + ' *' + FileName);
end;
if not OneFile then
try
FCheckSumFile.SaveToFile(TargetFileName);
except
on E: EFCreateError do
AskQuestion(rsMsgErrECreate + ' ' + TargetFileName + LineEnding,
E.Message, [fsourOk], fsourOk, fsourOk);
on E: EWriteError do
AskQuestion(rsMsgErrEWrite + ' ' + TargetFileName + LineEnding,
E.Message, [fsourOk], fsourOk, fsourOk);
end;
if not OneFile then SaveHash(TargetFileName);
end;
function TFileSystemCalcChecksumOperation.VerifyChecksumProcessFile(
@ -496,6 +494,80 @@ begin
end;
end;
function TFileSystemCalcChecksumOperation.ProcessNode(aFileTreeNode: TFileTreeNode; const AFolder: String): Boolean;
var
aFile: TFile;
bSkip: Boolean;
aFolders: TList;
FileName: String;
sCheckSum: String;
TargetName: String;
OldDoneBytes: Int64;
CurrentFileIndex: Integer;
CurrentSubNode: TFileTreeNode;
begin
Result := True;
aFolders := TList.Create;
FCheckSumFile.Clear;
if Algorithm = HASH_SFV then
begin
FCheckSumFile.Add(SFV_HEADER);
FCheckSumFile.Add(DC_HEADER);
end;
TargetName:= AFolder + PathDelim + MakeFileName(AFolder, 'checksum') + '.' + HashFileExt[Algorithm];
case FileExists(TargetName) of
fsoofeSkip: bSkip:= True;
else bSkip:= False;
end;
for CurrentFileIndex := 0 to aFileTreeNode.SubNodesCount - 1 do
begin
CurrentSubNode := aFileTreeNode.SubNodes[CurrentFileIndex];
aFile := CurrentSubNode.TheFile;
with FStatistics do
begin
CurrentFile := aFile.FullPath;
CurrentFileTotalBytes := aFile.Size;
CurrentFileDoneBytes := 0;
end;
UpdateStatistics(FStatistics);
if aFile.IsDirectory or aFile.IsLinkToDirectory then
begin
aFolders.Add(CurrentSubNode)
end
else begin
OldDoneBytes := FStatistics.DoneBytes;
if (not bSkip) and CheckSumCalc(aFile, sCheckSum) then
begin
FileName:= ExtractDirLevel(AFolder + PathDelim, aFile.Path) + aFile.Name;
AddFile(FileName, sCheckSum);
end;
with FStatistics do
begin
DoneFiles := DoneFiles + 1;
DoneBytes := OldDoneBytes + aFile.Size;
UpdateStatistics(FStatistics);
end;
end;
end;
SaveHashFile(TargetName);
for CurrentFileIndex := 0 to aFolders.Count - 1 do
begin
CurrentSubNode:= TFileTreeNode(aFolders[CurrentFileIndex]);
ProcessNode(CurrentSubNode, CurrentSubNode.TheFile.FullPath);
end;
aFolders.Free;
end;
function TFileSystemCalcChecksumOperation.FileExists(var AbsoluteTargetFileName: String): TFileSourceOperationOptionFileExists;
const
Responses: array[0..5] of TFileSourceOperationUIResponse
@ -663,5 +735,48 @@ begin
end;
end;
procedure TFileSystemCalcChecksumOperation.SaveHash(const FileName: String);
begin
try
FCheckSumFile.SaveToFile(FileName);
except
on E: EFCreateError do
AskQuestion(rsMsgErrECreate + ' ' + FileName + ':',
E.Message, [fsourOk], fsourOk, fsourOk);
on E: EWriteError do
AskQuestion(rsMsgErrEWrite + ' ' + FileName + ':',
E.Message, [fsourOk], fsourOk, fsourOk);
end;
end;
procedure TFileSystemCalcChecksumOperation.SaveHashFile(const FileName: String);
var
Index: Integer;
begin
Index:= IfThen(Algorithm = HASH_SFV, 2, 0);
if (FCheckSumFile.Count > Index) then
begin
SaveHash(FileName);
end;
end;
procedure TFileSystemCalcChecksumOperation.AddFile(FileName: String; const Hash: String);
const
TextLineBreak: array[TTextLineBreakStyle] of String = ('/', '\', PathDelim);
begin
if (TextLineBreak[TextLineBreakStyle] <> PathDelim) then
begin
FileName:= StringReplace(FileName, PathDelim, TextLineBreak[TextLineBreakStyle], [rfReplaceAll]);
end;
if Algorithm = HASH_SFV then
begin
FCheckSumFile.Add(FileName + ' ' + Hash);
end
else begin
FCheckSumFile.Add(Hash + ' *' + FileName);
end;
end;
end.

View file

@ -361,9 +361,9 @@ begin
LinkProperty := TFileLinkProperty.Create;
AFilePath:= Path + pSearchRecord^.Name;
if fpS_ISLNK(pSearchRecord^.Attr) then
begin
AFilePath:= Path + pSearchRecord^.Name;
LinkAttrs := mbFileGetAttrNoLinks(AFilePath);
LinkProperty.LinkTo := ReadSymLink(AFilePath);
LinkProperty.IsValid := LinkAttrs <> faInvalidAttributes;
@ -387,6 +387,9 @@ begin
end;
{$ENDIF}
end;
{$IFDEF DARWIN}
FinderTagProperty := uMyDarwin.getMacOSFinderTagFileProperty(AFilePath);
{$ENDIF}
end;
// Set name after assigning Attributes property, because it is used to get extension.
@ -712,6 +715,12 @@ begin
CommentProperty.Value := FDescr.ReadDescription(sFullPath);
end;
{$IFDEF DARWIN}
if fpMacOSFinderTag in PropertiesToSet then begin
FinderTagProperty := uMyDarwin.getMacOSFinderTagFileProperty(sFullPath);
end;
{$ENDIF}
PropertiesToSet:= PropertiesToSet * fpVariantAll;
for AProp in PropertiesToSet do
begin
@ -854,6 +863,9 @@ begin
{$ENDIF}
fpLastAccessTime,
uFileProperty.fpLink
{$IF DEFINED(DARWIN)}
,fpMacOSFinderTag
{$ENDIF}
];
end;
@ -875,6 +887,9 @@ begin
{$IF DEFINED(MSWINDOWS)}
, fpCompressedSize
{$ENDIF}
{$IF DEFINED(DARWIN)}
,fpMacOSFinderTag
{$ENDIF}
] + fpVariantAll;
{$IF DEFINED(LINUX)}
if HasStatX then Result += [fpCreationTime];

View file

@ -81,6 +81,7 @@ type
FSkipRenameError: Boolean;
FSkipOpenForReadingError: Boolean;
FSkipOpenForWritingError: Boolean;
FSkipCreateSymLinkError: Boolean;
FSkipReadError: Boolean;
FSkipWriteError: Boolean;
FSkipCopyError: Boolean;
@ -1355,7 +1356,20 @@ begin
end
else
begin
ShowError(rsMsgLogError + Format(rsMsgLogSymLink, [AbsoluteTargetFileName]));
if not FSkipCreateSymLinkError then
begin
case AskQuestion(rsSymErrCreate.TrimRight(['.']) + ' ' +
WrapTextSimple(AbsoluteTargetFileName, 64) +
LineEnding + LineEnding + mbSysErrorMessage, '',
[fsourSkip, fsourSkipAll, fsourAbort],
fsourSkip, fsourAbort) of
fsourAbort:
AbortOperation;
fsourSkip: ; // Do nothing
fsourSkipAll:
FSkipCreateSymLinkError := True;
end;
end;
Result := False;
end;
end
@ -1374,6 +1388,16 @@ begin
raise Exception.Create('Invalid TargetExists result');
end;
if Result = True then
begin
LogMessage(Format(rsMsgLogSuccess + rsMsgLogSymLink, [aNode.TheFile.FullPath + ' -> ' + AbsoluteTargetFileName]),
[log_cp_mv_ln], lmtSuccess);
end
else begin
LogMessage(Format(rsMsgLogError + rsMsgLogSymLink, [aNode.TheFile.FullPath + ' -> ' + AbsoluteTargetFileName]),
[log_cp_mv_ln], lmtError);
end;
Inc(FStatistics.DoneFiles);
UpdateStatistics(FStatistics);
end;

View file

@ -0,0 +1,68 @@
unit uNetworkFileSource;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, uFile, uFileSourceOperationTypes, uGioFileSource, uGio2;
type
INetworkFileSource = interface(IGioFileSource)
['{C7128E35-76FC-4635-842D-4091AB4AC520}']
end;
{ TNetworkFileSource }
TNetworkFileSource = class(TGioFileSource, INetworkFileSource)
public
constructor Create; override;
function GetOperationsTypes: TFileSourceOperationTypes; override;
class function GetMainIcon(out Path: String): Boolean; override;
class function IsSupportedPath(const Path: String): Boolean; override;
class function CreateFile(const APath: String; AFolder: PGFile; AFileInfo: PGFileInfo): TFile; override;
end;
implementation
uses
DCStrUtils;
{ TNetworkFileSource }
constructor TNetworkFileSource.Create;
begin
inherited Create;
FCurrentAddress:= 'network://';
end;
function TNetworkFileSource.GetOperationsTypes: TFileSourceOperationTypes;
begin
Result:= [fsoList, fsoExecute];
end;
class function TNetworkFileSource.GetMainIcon(out Path: String): Boolean;
begin
Result:= True;
Path:= 'network-workgroup';
end;
class function TNetworkFileSource.IsSupportedPath(const Path: String): Boolean;
begin
Result:= StrBegins(Path, 'network://');
end;
class function TNetworkFileSource.CreateFile(const APath: String;
AFolder: PGFile; AFileInfo: PGFileInfo): TFile;
var
ADisplayName: String;
begin
Result:= inherited CreateFile(APath, AFolder, AFileInfo);
ADisplayName:= g_file_info_get_display_name(AFileInfo);
if Length(ADisplayName) > 0 then Result.Name:= ADisplayName;
end;
end.

View file

@ -41,7 +41,7 @@ type
function GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; override;
class function CreateFile(const APath: String): TFile; override;
class function CreateFile(const APath: String; AFolder: PGFile; AFileInfo: PGFileInfo): TFile;
class function CreateFile(const APath: String; AFolder: PGFile; AFileInfo: PGFileInfo): TFile; virtual;
procedure Reload(const PathsToReload: TPathsArray); override;
function GetParentDir(sPath : String): String; override;
@ -110,6 +110,7 @@ end;
class function TGioFileSource.CreateFile(const APath: String; AFolder: PGFile;
AFileInfo: PGFileInfo): TFile;
var
Addr: TURI;
AFile: PGFile;
ATarget: Pgchar;
AFileType: TGFileType;
@ -117,10 +118,14 @@ var
begin
Result:= CreateFile(APath);
Result.Name:= g_file_info_get_name(AFileInfo);
Result.Size:= g_file_info_get_size (AFileInfo);
Result.Attributes:= g_file_info_get_attribute_uint32 (AFileInfo, FILE_ATTRIBUTE_UNIX_MODE);
Result.Attributes:= g_file_info_get_attribute_uint32(AFileInfo, FILE_ATTRIBUTE_UNIX_MODE);
Result.ModificationTime:= UnixFileTimeToDateTime(g_file_info_get_attribute_uint64 (AFileInfo, FILE_ATTRIBUTE_TIME_MODIFIED));
Result.LinkProperty := TFileLinkProperty.Create;
if g_file_info_has_attribute(AFileInfo, FILE_ATTRIBUTE_STANDARD_SIZE) then
Result.Size:= g_file_info_get_size(AFileInfo)
else begin
Result.SizeProperty.IsValid:= False;
end;
// Get a file's type (whether it is a regular file, symlink, etc).
AFileType:= g_file_info_get_file_type (AFileInfo);
@ -157,9 +162,23 @@ begin
else if AFileType in [G_FILE_TYPE_SHORTCUT, G_FILE_TYPE_MOUNTABLE] then
begin
Result.Attributes:= Result.Attributes or S_IFLNK or S_IFDIR;
Result.ModificationTimeProperty.IsValid:= g_file_info_has_attribute(AFileInfo, FILE_ATTRIBUTE_TIME_MODIFIED);
ATarget:= g_file_info_get_attribute_string(AFileInfo, FILE_ATTRIBUTE_STANDARD_TARGET_URI);
Result.LinkProperty.IsValid := Length(ATarget) > 0;
Result.LinkProperty.LinkTo := ATarget;
// Remove a standard port from address
Addr:= ParseURI(Result.LinkProperty.LinkTo);
if Addr.Port > 0 then
begin
case Addr.Port of
22: if (Addr.Protocol = 'sftp') then Addr.Port:= 0;
445: if (Addr.Protocol = 'smb') then Addr.Port:= 0;
2049: if (Addr.Protocol = 'nfs') then Addr.Port:= 0;
end;
if Addr.Port = 0 then Result.LinkProperty.LinkTo:= EncodeURI(Addr);
end;
end;
end;
@ -178,7 +197,7 @@ end;
function TGioFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean;
begin
Result:= TRue; //inherited SetCurrentWorkingDirectory(NewDir);
Result:= True;
end;
procedure ask_password_cb (op: PGMountOperation;
@ -527,4 +546,3 @@ begin
end;
end.

View file

@ -45,6 +45,7 @@ var
AInfo: PGFileInfo;
AError: PGError = nil;
AFileEnum: PGFileEnumerator;
AFileSource: TGioFileSource;
begin
FFiles.Clear;
with FGioFileSource do
@ -82,11 +83,12 @@ begin
end;
// List files
try
AFileSource:= TGioFileSource(GetClass);
AInfo:= g_file_enumerator_next_file(AFileEnum, nil, @AError);
while Assigned(AInfo) do
begin
CheckOperationState;
AFile:= TGioFileSource.CreateFile(Path, AFolder, AInfo);
AFile:= AFileSource.CreateFile(Path, AFolder, AInfo);
g_object_unref(AInfo);
FFiles.Add(AFile);
AInfo:= g_file_enumerator_next_file(AFileEnum, nil, @AError);

View file

@ -292,7 +292,7 @@ begin
Result:= False;
ShowError(Format(rsMsgLogError + rsMsgLogPack,
[FileName +
' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]);
' - ' + rsMsgExitStatusCode + ' ' + IntToStr(ExitStatus)]), [log_arc_op]);
end
else
begin

View file

@ -672,7 +672,7 @@ begin
ShowError(Format(rsMsgLogError + rsMsgLogExtract,
[FMultiArchiveFileSource.ArchiveFileName + PathDelim +
SourceName + ' -> ' + TargetName +
' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]);
' - ' + rsMsgExitStatusCode + ' ' + IntToStr(ExitStatus)]), [log_arc_op]);
end // Error
else
begin

View file

@ -199,7 +199,7 @@ begin
begin
ShowError(Format(rsMsgLogError + rsMsgLogDelete,
[FileName +
' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]);
' - ' + rsMsgExitStatusCode + ' ' + IntToStr(ExitStatus)]), [log_arc_op]);
end
else
begin

View file

@ -72,6 +72,7 @@ type
Comment: string;
procedure ClearStore; virtual;
function CheckValues: Boolean; virtual;
function CheckSizeChar(Chr: AnsiChar): Boolean; virtual;
procedure FillRecord(const Value: TArchiveItem); virtual;
function ParseByMask(Value, NextValue, Mask: ansistring): Integer; virtual;
public
@ -227,7 +228,7 @@ begin
begin
while IValue <= Length(Value) do
begin
if not(Value[Ivalue] in ['0'..'9']) then
if CheckSizeChar(Value[Ivalue]) = False then
break;
s := s + Value[Ivalue];
Inc(Ivalue);
@ -304,6 +305,21 @@ begin
end;
end;
function TMultiArchiveDynamicParser.CheckSizeChar(Chr: AnsiChar): Boolean;
var
I: Integer;
begin
Result:= False;
if not (Chr in ['0'..'9']) then
begin
with FMultiArcItem do
if (FSizeStripChars <> EmptyStr) and ContainsOneOf(Chr, FSizeStripChars) then
Result:= True;
end
else
Result:= True;
end;
function TMultiArchiveDynamicParser.CheckValues: Boolean;
var
x, n: integer;
@ -356,7 +372,7 @@ begin
begin
Size := Trim(Size);
for n := 1 to Length(Size) do
if not (Size[n] in ['0'..'9']) then
if CheckSizeChar(Size[n]) = False then
Exit;
end;
if ThreeMonth <> '' then
@ -400,11 +416,11 @@ var
begin
Value.FileName:= FGetFileName(FileName);
Value.FileExt:= FGetFileName(FileExt);
Value.PackSize:= StrToInt64Def(PackSize, -1);
Value.UnpSize:= StrToInt64Def(Size, -1);
Value.PackSize:= StrToInt64Def(CleanSize(PackSize), -1);
Value.UnpSize:= StrToInt64Def(CleanSize(Size), -1);
Value.Year:= YearShortToLong(StrToIntDef(Year, 0));
Value.Month:= StrToIntDef(Month, 1);
Value.Day:= StrToIntDef(Day, 1);
Value.Month:= StrToIntDef(Month, 0);
Value.Day:= StrToIntDef(Day, 0);
Value.Hour:= StrToIntDef(Hours, 0);
Value.Minute:= StrToIntDef(Minutes, 0);
Value.Second:= StrToIntDef(Seconds, 0);
@ -412,7 +428,7 @@ begin
Value.Comment:= Comment;
if ThreeMonth <> '' then begin
Value.Month:= MonthToNumberDef(ThreeMonth, 1);
Value.Month:= MonthToNumberDef(ThreeMonth, 0);
end;
if HoursModif <> '' then begin

View file

@ -126,7 +126,7 @@ implementation
uses
uDebug, uGlobs, DCFileAttributes, DCOSUtils, DCStrUtils, DCDateTimeUtils,
FileUtil, uMasks,
FileUtil, uMasks, uLng,
uMultiArchiveListOperation,
uMultiArchiveCopyInOperation,
uMultiArchiveCopyOutOperation,
@ -318,11 +318,18 @@ begin
end;
ModificationTimeProperty := TFileModificationDateTimeProperty.Create(0);
try
with ArchiveItem do
ModificationTime := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, Second, 0);
except
on EConvertError do ModificationTimeProperty.IsValid:= False;
with ArchiveItem do
begin
if (Month = 0) or (Day = 0) then
ModificationTimeProperty.IsValid:= False
else
begin
try
ModificationTime := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, Second, 0);
except
on EConvertError do ModificationTimeProperty.IsValid:= False;
end;
end;
end;
if AttributesProperty.IsLink and (Length(ArchiveItem.FileLink) > 0) then
@ -599,6 +606,9 @@ begin
FOutputParser.Execute;
FPassword:= FOutputParser.Password;
if FOutputParser.OpenError and (AFileList.Count < 1) then
raise EFileSourceException.Create(rsMsgErrEOpen);
// fix dir items w/o attr
if (mafFixDirAttr in FMultiArcItem.FFlags) then
begin
@ -613,6 +623,7 @@ begin
end;
end;
end;
(* if archiver does not give a list of folders *)
for I := 0 to FAllDirsList.Count - 1 do
begin

View file

@ -41,6 +41,7 @@ type
procedure Prepare; virtual; abstract;
procedure ParseLines; virtual; abstract;
procedure AddLine(const Str: String); virtual; abstract;
function CleanSize(Str: String): String;
property OnGetArchiveItem: TOnGetArchiveItem write FOnGetArchiveItem;
end;
@ -247,6 +248,20 @@ begin
end;
function TMultiArchiveParser.CleanSize(Str: String): String;
var
I: Integer;
Size: String;
begin
Size:= Trim(Str);
if FMultiArcItem.FSizeStripChars <> EmptyStr then
begin
for I:= 1 to Length(FMultiArcItem.FSizeStripChars) do
Size:= Size.Replace(FMultiArcItem.FSizeStripChars[I], '');
end;
Result:= Size;
end;
procedure TMultiArchiveStaticParser.AddLine(const Str: String);
begin
// if next item
@ -262,9 +277,9 @@ begin
if FNamePos.Index = FFormatIndex then
FArchiveItem.FileName := FGetFileName(Trim(GetKeyValue(str, FNamePos)));
if FUnpSizePos.Index = FFormatIndex then
FArchiveItem.UnpSize := StrToInt64Def(Trim(GetKeyValue(str, FUnpSizePos)), -1);
FArchiveItem.UnpSize := StrToInt64Def(CleanSize(GetKeyValue(str, FUnpSizePos)), -1);
if FPackSizePos.Index = FFormatIndex then
FArchiveItem.PackSize := StrToInt64Def(Trim(GetKeyValue(str, FPackSizePos)), -1);
FArchiveItem.PackSize := StrToInt64Def(CleanSize(GetKeyValue(str, FPackSizePos)), -1);
if FYearPos.Index = FFormatIndex then
FArchiveItem.Year := YearShortToLong(StrToIntDef(Trim(GetKeyValue(str, FYearPos)), 0));
if FMonthPos.Index = FFormatIndex then

View file

@ -17,6 +17,8 @@ type
FExProcess: TExProcess;
FMultiArcItem: TMultiArcItem;
FParser: TMultiArchiveParser;
FErrorLevel: LongInt;
FOpenError: Boolean;
FConvertEncoding: function (const Source: String): RawByteString;
private
FArchiveName: String;
@ -35,6 +37,7 @@ type
procedure Prepare;
procedure Execute;
property OpenError: Boolean read FOpenError;
property Password: String read FPassword write FPassword;
property OnGetArchiveItem: TOnGetArchiveItem write SetOnGetArchiveItem;
end;
@ -68,6 +71,7 @@ var
Index: Integer;
begin
Result:= FMultiArcItem.FList;
FErrorLevel:= ExtractErrorLevel(Result);
Index:= Pos('%O', Result);
FConvertEncoding:= @DCOSUtils.ConsoleToUTF8;
if (Index > 0) and (Index + 2 <= Length(Result)) then
@ -87,6 +91,7 @@ end;
procedure TOutputParser.OnProcessExit;
begin
FOpenError:= (FExProcess.ExitStatus > FErrorLevel);
FParser.ParseLines;
end;
@ -190,6 +195,7 @@ begin
sCommandLine:= FormatArchiverCommand(FMultiArcItem.FArchiver,
sCommandLine, FArchiveName,
nil, '', '','', FPassword);
if FMultiArcItem.FDebug then
DCDebug(sCommandLine);

View file

@ -42,6 +42,7 @@ type
function Equals(aFileSource: IFileSource): Boolean;
function IsInterface(InterfaceGuid: TGuid): Boolean;
function IsClass(ClassType: TClass): Boolean;
function GetClass: TFileSource;
function GetURI: TURI;
function GetClassName: String;
function GetRefCount: Integer;
@ -214,6 +215,7 @@ type
function Equals(aFileSource: IFileSource): Boolean; overload;
function IsInterface(InterfaceGuid: TGuid): Boolean;
function IsClass(aClassType: TClass): Boolean;
function GetClass: TFileSource;
function GetClassName: String; // For debugging purposes.
function GetRefCount: Integer; // For debugging purposes.
@ -486,6 +488,11 @@ begin
Result := Self is aClassType;
end;
function TFileSource.GetClass: TFileSource;
begin
Result := Self
end;
function TFileSource.GetClassName: String;
begin
Result := ClassName;

View file

@ -54,7 +54,7 @@ type
FTargetPath: String;
FTargetMask: String;
FAlgorithm: THashAlgorithm;
FOneFile: Boolean;
FOneFile, FSeparateFolder: Boolean;
FOpenFileAfterOperationCompleted: Boolean;
protected
@ -86,6 +86,7 @@ type
property Mode: TCalcCheckSumOperationMode read FMode write FMode;
property Algorithm: THashAlgorithm read FAlgorithm write FAlgorithm;
property OneFile: Boolean read FOneFile write FOneFile;
property SeparateFolder: Boolean read FSeparateFolder write FSeparateFolder;
property TextLineBreakStyle: TTextLineBreakStyle read FTextLineBreakStyle write FTextLineBreakStyle;
property OpenFileAfterOperationCompleted: Boolean read FOpenFileAfterOperationCompleted write FOpenFileAfterOperationCompleted;
property Result: TVerifyChecksumResult read FResult;

View file

@ -52,7 +52,8 @@ begin
FFileSource := AFileSource as IWcxArchiveFileSource;
inherited Create(AOwner, AFileSource);
pnlCheckboxes.Visible := True;
btnConfig.Visible := True;
cbEncrypt.Enabled:= ((FFileSource.PluginCapabilities and PK_CAPS_ENCRYPT) <> 0);
btnConfig.Visible := ((FFileSource.PluginCapabilities and PK_CAPS_OPTIONS) <> 0);
end;
{ TWcxArchiveCopyOperationOptionsUI }

View file

@ -491,7 +491,11 @@ begin
Result := [fsoList, fsoCopyOut, fsoTestArchive, fsoExecute, fsoCalcStatistics]; // by default
with FWcxModule do
begin
if (((FPluginCapabilities and PK_CAPS_NEW) <> 0) or ((FPluginCapabilities and PK_CAPS_MODIFY) <> 0)) and
if (((FPluginCapabilities and PK_CAPS_MODIFY) = 0) and mbFileExists(ArchiveFileName)) then
begin
// not supported
end
else if (((FPluginCapabilities and PK_CAPS_NEW) <> 0) or ((FPluginCapabilities and PK_CAPS_MODIFY) <> 0)) and
(Assigned(PackFiles) or Assigned(PackFilesW)) then
Result:= Result + [fsoCopyIn];
if ((FPluginCapabilities and PK_CAPS_DELETE) <> 0) and

View file

@ -6,8 +6,9 @@ interface
uses
Classes, SysUtils, Controls, LMessages, Grids, Graphics,
uDisplayFile, DCXmlConfig, uTypes, uFileViewWithGrid, uFile,
uFileSource, uFileProperty;
uDisplayFile, DCXmlConfig, uTypes,
uFileView, uFileViewWithMainCtrl, uFileViewWithGrid,
uFile, uFileSource, uFileProperty;
type
@ -18,6 +19,7 @@ type
TBriefDrawGrid = class(TFileViewGrid)
protected
FBriefView: TBriefFileView;
FOnDrawCell: TFileViewOnDrawCell;
protected
procedure UpdateView; override;
procedure CalculateColRowCount; override;
@ -34,11 +36,16 @@ type
function CellToIndex(ACol, ARow: Integer): Integer; override;
procedure IndexToCell(Index: Integer; out ACol, ARow: Integer); override;
procedure DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); override;
property OnDrawCell: TFileViewOnDrawCell read FOnDrawCell write FOnDrawCell;
end;
{ TBriefFileView }
TBriefFileView = class (TFileViewWithGrid)
protected
function GetOnDrawCell: TFileViewOnDrawCell;
procedure SetOnDrawCell( OnDrawCell: TFileViewOnDrawCell );
protected
procedure CreateDefault(AOwner: TWinControl); override;
function GetFileViewGridClass: TFileViewGridClass; override;
@ -51,7 +58,9 @@ type
procedure DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes = []); override;
public
function Clone(NewParent: TWinControl): TBriefFileView; override;
procedure CloneTo(FileView: TFileView); override;
procedure SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode; ASaveHistory:boolean); override;
property OnDrawCell: TFileViewOnDrawCell read GetOnDrawCell write SetOnDrawCell;
end;
implementation
@ -420,6 +429,7 @@ var
iTextTop: Integer;
AFile: TDisplayFile;
FileSourceDirectAccess: Boolean;
onDrawCellFocused: Boolean;
//------------------------------------------------------
//begin subprocedures
@ -507,6 +517,11 @@ begin
iTextTop := aRect.Top + (RowHeights[aRow] - Canvas.TextHeight('Wg')) div 2;
DrawIconCell;
if Assigned(OnDrawCell) and not(CsDesigning in ComponentState) then begin
onDrawCellFocused:= (gdSelected in aState) and FFileView.Active;
OnDrawCell(FBriefView,aCol,aRow,aRect,onDrawCellFocused,AFile);
end;
end
else
begin
@ -521,6 +536,16 @@ end;
{ TBriefFileView }
function TBriefFileView.GetOnDrawCell: TFileViewOnDrawCell;
begin
Result:= TBriefDrawGrid(dgPanel).OnDrawCell;
end;
procedure TBriefFileView.SetOnDrawCell(OnDrawCell: TFileViewOnDrawCell);
begin
TBriefDrawGrid(dgPanel).OnDrawCell:= OnDrawCell;
end;
procedure TBriefFileView.CreateDefault(AOwner: TWinControl);
begin
inherited CreateDefault(AOwner);
@ -630,6 +655,13 @@ begin
Result := TBriefFileView.Create(NewParent, Self);
end;
procedure TBriefFileView.CloneTo(FileView: TFileView);
begin
inherited CloneTo(FileView);
if FileView is TBriefFileView then
TBriefFileView(FileView).OnDrawCell:= self.OnDrawCell;
end;
procedure TBriefFileView.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode; ASaveHistory:boolean);
begin
inherited SaveConfiguration(AConfig, ANode, ASaveHistory);

View file

@ -35,6 +35,8 @@ type
FLastMouseScrollTime: QWord;
ColumnsView: TColumnsFileView;
FOnDrawCell: TFileViewOnDrawCell;
function GetGridHorzLine: Boolean;
function GetGridVertLine: Boolean;
procedure SetGridHorzLine(const AValue: Boolean);
@ -85,6 +87,7 @@ type
property GridVertLine: Boolean read GetGridVertLine write SetGridVertLine;
property GridHorzLine: Boolean read GetGridHorzLine write SetGridHorzLine;
property OnDrawCell: TFileViewOnDrawCell read FOnDrawCell write FOnDrawCell;
end;
TColumnResized = procedure (Sender: TObject; ColumnIndex: Integer; ColumnNewsize: integer) of object;
@ -103,6 +106,9 @@ type
dgPanel: TDrawGridEx;
FOnColumnResized: TColumnResized;
function GetOnDrawCell: TFileViewOnDrawCell;
procedure SetOnDrawCell( OnDrawCell: TFileViewOnDrawCell );
function GetColumnsClass: TPanelColumnsClass;
procedure SetRowCount(Count: Integer);
@ -206,10 +212,10 @@ type
procedure SetGridFunctionDim(ExternalDimFunction:TFunctionDime);
property OnColumnResized: TColumnResized read FOnColumnResized write FOnColumnResized;
property OnDrawCell: TFileViewOnDrawCell read GetOnDrawCell write SetOnDrawCell;
published
procedure cm_SaveFileDetailsToFile(const Params: array of string);
procedure cm_CopyFileDetailsToClip(const Params: array of string);
end;
implementation
@ -614,6 +620,9 @@ begin
fpAttributes, // For distinguishing directories
fpLink, // For distinguishing directories (link to dir) and link icons
fpModificationTime // For selecting/coloring files (by SearchTemplate)
{$IFDEF DARWIN}
,fpMacOSFinderTag // macOS finder tag
{$ENDIF}
];
ColumnsClass := GetColumnsClass;
@ -956,6 +965,7 @@ begin
with TColumnsFileView(FileView) do
begin
FColumnsSortDirections := Self.FColumnsSortDirections;
OnDrawCell := Self.OnDrawCell;
ActiveColm := Self.ActiveColm;
ActiveColmSlave := nil;
@ -1114,6 +1124,16 @@ begin
Dec(Result.Last, dgPanel.FixedRows);
end;
function TColumnsFileView.GetOnDrawCell: TFileViewOnDrawCell;
begin
Result:= dgPanel.OnDrawCell;
end;
procedure TColumnsFileView.SetOnDrawCell(OnDrawCell: TFileViewOnDrawCell);
begin
dgPanel.OnDrawCell:= OnDrawCell;
end;
function TColumnsFileView.GetColumnsClass: TPanelColumnsClass;
begin
if isSlave then
@ -1519,6 +1539,7 @@ var
AFile: TDisplayFile;
FileSourceDirectAccess: Boolean;
ColumnsSet: TPanelColumnsClass;
onDrawCellFocused: Boolean;
//------------------------------------------------------
// begin subprocedures
@ -1974,6 +1995,11 @@ begin
DrawOtherCell;
end;
if Assigned(OnDrawCell) and not(CsDesigning in ComponentState) then begin
onDrawCellFocused:= (gdSelected in aState) and ColumnsView.Active;
OnDrawCell(Self.ColumnsView,aCol,aRow,aRect,onDrawCellFocused,AFile);
end;
DrawCellGrid(aCol,aRow,aRect,aState);
DrawLines;

View file

@ -358,7 +358,6 @@ type
function GetVariantFileProperties: TDynamicStringArray; virtual;
property Active: Boolean read FActive write SetActive;
property FilePropertiesNeeded: TFilePropertiesTypes read FFilePropertiesNeeded write FFilePropertiesNeeded;
property History: TFileViewHistory read FHistory;
property LastActiveFile: String read FLastActiveFile write FLastActiveFile;
@ -368,6 +367,7 @@ type
public
property DisplayFiles: TDisplayFiles read FFiles;
property Active: Boolean read FActive write SetActive;
public
constructor Create(AOwner: TWinControl;

View file

@ -618,6 +618,9 @@ begin
fpAttributes, // For distinguishing directories
fpLink, // For distinguishing directories (link to dir) and link icons
fpModificationTime // For selecting/coloring files (by SearchTemplate)
{$IFDEF DARWIN}
,fpMacOSFinderTag // macOS finder tag
{$ENDIF}
];
end;

View file

@ -30,7 +30,7 @@ interface
uses
Classes, SysUtils, Controls, ExtCtrls, StdCtrls, LCLType, LMessages, EditBtn,
Graphics, LCLVersion,
uFile,
uFile, uDisplayFile,
uFileViewWorker,
uOrderedFileView,
uFileView,
@ -40,6 +40,9 @@ uses
type
TFileViewOnDrawCell = procedure(Sender: TFileView; aCol, aRow: Integer;
aRect: TRect; focused: Boolean; aFile: TDisplayFile) of object;
TRenameFileActionType=(rfatName,rfatExt,rfatFull,rfatToSeparators,rfatNextSeparated);
TRenameFileEditInfo=record
@ -237,7 +240,7 @@ uses
{$ENDIF}
LCLIntf, LCLProc, LazUTF8, Forms, Dialogs, Buttons, DCOSUtils, DCStrUtils,
fMain, uShowMsg, uLng, uFileProperty, uFileSource, uFileSourceOperationTypes,
uGlobs, uInfoToolTip, uDisplayFile, uFileSystemFileSource, uFileSourceUtil,
uGlobs, uInfoToolTip, uFileSystemFileSource, uFileSourceUtil,
uArchiveFileSourceUtil, uFormCommands, uKeyboard, uFileSourceSetFilePropertyOperation,
uFileSystemWatcher;

View file

@ -1230,7 +1230,7 @@ object frmMain: TfrmMain
end
end
object mnuNetwork: TMenuItem
Caption = 'Network'
Caption = '&Network'
object miNetworkConnect: TMenuItem
Action = actNetworkConnect
end
@ -1342,7 +1342,7 @@ object frmMain: TfrmMain
end
end
object mnuFavoriteTabs: TMenuItem
Caption = 'Favorites'
Caption = 'F&avorites'
object mnuCreateNewFavoriteTabs: TMenuItem
Action = actSaveFavoriteTabs
end

View file

@ -25,10 +25,10 @@
{"hash":44892867,"name":"tfrmmain.mnufiles.caption","sourcebytes":[38,70,105,108,101,115],"value":"&Files"},
{"hash":2832523,"name":"tfrmmain.mnumark.caption","sourcebytes":[38,77,97,114,107],"value":"&Mark"},
{"hash":105082387,"name":"tfrmmain.mnucmd.caption","sourcebytes":[38,67,111,109,109,97,110,100,115],"value":"&Commands"},
{"hash":80471771,"name":"tfrmmain.mnunetwork.caption","sourcebytes":[78,101,116,119,111,114,107],"value":"Network"},
{"hash":80471099,"name":"tfrmmain.mnunetwork.caption","sourcebytes":[38,78,101,116,119,111,114,107],"value":"&Network"},
{"hash":2860947,"name":"tfrmmain.mnutabs.caption","sourcebytes":[38,84,97,98,115],"value":"&Tabs"},
{"hash":64866531,"name":"tfrmmain.mnutaboptions.caption","sourcebytes":[84,97,98,32,38,79,112,116,105,111,110,115],"value":"Tab &Options"},
{"hash":225003075,"name":"tfrmmain.mnufavoritetabs.caption","sourcebytes":[70,97,118,111,114,105,116,101,115],"value":"Favorites"},
{"hash":225281603,"name":"tfrmmain.mnufavoritetabs.caption","sourcebytes":[70,38,97,118,111,114,105,116,101,115],"value":"F&avorites"},
{"hash":2858855,"name":"tfrmmain.mnushow.caption","sourcebytes":[38,83,104,111,119],"value":"&Show"},
{"hash":32269806,"name":"tfrmmain.mnuconfig.caption","sourcebytes":[67,38,111,110,102,105,103,117,114,97,116,105,111,110],"value":"C&onfiguration"},
{"hash":2812976,"name":"tfrmmain.mnuhelp.caption","sourcebytes":[38,72,101,108,112],"value":"&Help"},

View file

@ -5108,11 +5108,17 @@ begin
if gDelayLoadingTabs then
FileViewFlags := [fvfDelayLoadingFiles];
if sType = 'columns' then
Result := TColumnsFileView.Create(Page, AConfig, ANode, FileViewFlags)
else if sType = 'brief' then
Result := TBriefFileView.Create(Page, AConfig, ANode, FileViewFlags)
else if sType = 'thumbnails' then
if sType = 'columns' then begin
Result := TColumnsFileView.Create(Page, AConfig, ANode, FileViewFlags);
{$IFDEF DARWIN}
TColumnsFileView(Result).OnDrawCell:= @DarwinFileViewDrawHelper.OnDrawCell;
{$ENDIF}
end else if sType = 'brief' then begin
Result := TBriefFileView.Create(Page, AConfig, ANode, FileViewFlags);
{$IFDEF DARWIN}
TBriefFileView(Result).OnDrawCell:= @DarwinFileViewDrawHelper.OnDrawCell;
{$ENDIF}
end else if sType = 'thumbnails' then
Result := TThumbFileView.Create(Page, AConfig, ANode, FileViewFlags)
else begin
DCDebug(rsMsgLogError + 'Invalid file view type "%s"', [sType]);

View file

@ -348,6 +348,32 @@ procedure TfrmPackDlg.SwitchOptions(ArcTypeChange: Boolean); // Ugly but working
var
I: LongInt;
sCmd: String;
procedure SwitchTarOptions(SingleFileMode: Boolean);
begin
if SingleFileMode then
begin
// If file list contain directory then
// put to the tar archive first is needed
if FHasFolder then
begin
cbPutInTarFirst.Checked:= True;
EnableControl(cbPutInTarFirst, False);
end
else
begin
cbCreateSeparateArchives.Checked:= (FCount = 1);
cbPutInTarFirst.Checked:= (FCount > 1);
EnableControl(cbPutInTarFirst, True);
end;
end
else
begin
sCmd:= LowerCase(FArchiveType);
cbPutInTarFirst.Checked:= False;
EnableControl(cbPutInTarFirst, not ((sCmd = 'tar') or StrBegins(sCmd, 'tar.')));
cbCreateSeparateArchives.Checked:= False;
end;
end;
begin
cbPutInTarFirst.OnChange:= nil;
@ -367,25 +393,7 @@ begin
// If plugin supports packing with password
EnableControl(cbEncrypt, ((gWCXPlugins.Flags[I] and PK_CAPS_ENCRYPT) <> 0));
// If archive can not contain multiple files
if ((gWCXPlugins.Flags[I] and PK_CAPS_MULTIPLE) = 0) then
begin
// If file list contain directory then
// put to the tar archive first is needed
if not FHasFolder then
cbCreateSeparateArchives.Checked:= (FCount > 1)
else
begin
cbPutInTarFirst.Checked:= True;
EnableControl(cbPutInTarFirst, False);
end;
end
else
begin
sCmd:= LowerCase(FArchiveType);
cbPutInTarFirst.Checked:= False;
EnableControl(cbPutInTarFirst, not ((sCmd = 'tar') or StrBegins(sCmd, 'tar.')));
cbCreateSeparateArchives.Checked:= False;
end;
SwitchTarOptions((gWCXPlugins.Flags[I] and PK_CAPS_MULTIPLE) = 0);
FPlugin:= True;
// Options that supported by plugins
EnableControl(cbStoreDir, True);
@ -420,24 +428,7 @@ begin
EnableControl(cbEncrypt, (Pos('%W', sCmd) <> 0));
// If archive can not contain multiple files
if (mafFileNameList in FFlags) then
begin
// If file list contain directory then
// put to the tar archive first is needed
if not FHasFolder then
cbCreateSeparateArchives.Checked:= (FCount > 1)
else
begin
cbPutInTarFirst.Checked:= True;
EnableControl(cbPutInTarFirst, False);
end;
end
else begin
sCmd:= LowerCase(FArchiveType);
cbPutInTarFirst.Checked:= False;
EnableControl(cbPutInTarFirst, not ((sCmd = 'tar') or StrBegins(sCmd, 'tar.')));
cbCreateSeparateArchives.Checked:= False;
end;
SwitchTarOptions(mafFileNameList in FFlags);
FPlugin:= False;
// Options that don't supported by addons
cbStoreDir.Checked:= True;

View file

@ -1374,6 +1374,7 @@ inherited frmOptionsArchivers: TfrmOptionsArchivers
end
object miArchiverDiscardModification: TMenuItem
Caption = 'Discard modifications'
Enabled = False
OnClick = miArchiverDiscardModificationClick
end
object miSeparator1: TMenuItem

View file

@ -680,6 +680,7 @@ begin
if MultiArcListTemp <> nil then
MultiArcListTemp.Free;
MultiArcListTemp := gMultiArcList.Clone;
FillListBoxWithArchiverList;
lbxArchiverSelectionChange(lbxArchiver, False);
end;

View file

@ -117,7 +117,6 @@ inherited frmOptionsToolTips: TfrmOptionsToolTips
Width = 54
AutoSize = True
BorderSpacing.Left = 3
Cancel = True
Caption = 'Cop&y'
OnClick = btnCopyToolTipsFileTypeClick
TabOrder = 2

View file

@ -747,6 +747,11 @@ begin
dwFileAttributes := mbFileGetAttr(aFileName);
if FPS_ISLNK(dwFileAttributes) then
begin
dwFileAttributes := mbFileGetAttrNoLinks(aFileName);
end;
if dwFileAttributes = faInvalidAttributes then
begin
ActivatePanel(pnlFolder);
@ -2872,6 +2877,10 @@ begin
if sEncoding = EncodingUTF8 then
Buffer := FSynEditOriginalText
else begin
if (sEncoding = EncodingUTF16LE) or (sEncoding = EncodingUTF16BE) then
begin
FSynEditOriginalText := Copy(FSynEditOriginalText, 3, MaxInt); // Skip BOM
end;
Buffer := ConvertEncoding(FSynEditOriginalText, sEncoding, EncodingUTF8);
end;

View file

@ -964,7 +964,7 @@ begin
end;
end else if TDarwinFSWatchEventCategory.ecCreated in event.categories then
FCurrentEventData.EventType := fswFileCreated
else if TDarwinFSWatchEventCategory.ecCoreAttribChanged in event.categories then
else if TDarwinFSWatchEventCategory.ecAttribChanged in event.categories then
FCurrentEventData.EventType := fswFileChanged
else
exit;

View file

@ -8,8 +8,9 @@ interface
uses
Classes, SysUtils,
LCLType, Forms, Menus,
fMain, uMyDarwin, uDCUtils, uLng,
fMain, uDCUtils, uLng,
uFileView, uBriefFileView, uColumnsFileView, uThumbFileView,
uMyDarwin, uDarwinFinder, uDarwinFinderModel, uSearchResultUtil,
CocoaAll, CocoaConfig, CocoaToolBar, Cocoa_Extra;
procedure initCocoaModernFormConfig;
@ -110,13 +111,12 @@ const
COMMON_FOLDERS: TStringArray = (
'~/Documents',
'~/Desktop',
'~/Downloads',
'~',
'~/Pictures',
'~/Movies',
'~/Music',
'/Applications/Utilities',
'~/Downloads',
'~/Library',
'/Applications',
@ -134,6 +134,11 @@ type
procedure showQuickLookPanel( Sender: TObject );
procedure showEditTagPanel( Sender: TObject );
procedure goToFolder( Sender: TObject );
procedure showFinderTagSelectorPanel( Sender: TObject );
procedure onFinderTagSelectorPanelClose( const cancel: Boolean; const tagNames: NSArray );
procedure searchOneFinderTagAction( Sender: TObject );
procedure onSearchFinderTagComplete( const searchName: String; const files: TStringArray );
end;
var
@ -168,6 +173,39 @@ begin
frmMain.Commands.cm_ChangeDir( [path] );
end;
procedure TToolBarMenuHandler.showFinderTagSelectorPanel(Sender: TObject);
begin
uDarwinFinderUtil.popoverTagsSelector(
rsMFSTBISearchCombinedTags,
@self.onFinderTagSelectorPanelClose,
NSView(frmMain.Handle) , NSMaxYEdge );
end;
procedure TToolBarMenuHandler.onFinderTagSelectorPanelClose(const cancel: Boolean;
const tagNames: NSArray);
begin
if cancel then
Exit;
if tagNames.count = 0 then
Exit;
uDarwinFinderModelUtil.searchFilesForTagNames( tagNames, @self.onSearchFinderTagComplete );
end;
procedure TToolBarMenuHandler.searchOneFinderTagAction( Sender: TObject );
var
menuItem: TMenuItem absolute Sender;
tagName: NSString;
begin
tagName:= StringToNSString( menuItem.Caption );
uDarwinFinderModelUtil.searchFilesForTagName( tagName, @self.onSearchFinderTagComplete );
end;
procedure TToolBarMenuHandler.onSearchFinderTagComplete(
const searchName: String; const files: TStringArray);
begin
TSearchResultUtil.addResultPage( searchName, files );
end;
function getMacOSDisplayNameFromPath(const path: String): String;
var
cocoaPath: NSString;
@ -178,50 +216,60 @@ begin
Result:= displayName.UTF8String;
end;
function onGetFolderMenu: TMenuItem;
procedure onGetFolderMenu( const menu: TMenu );
var
menu: TMenuItem;
items: TMenuItem;
tag: PtrInt = 0;
function newItem( caption: String ): TMenuItem;
procedure newItem( imageName: String );
var
folderName: String;
lclItem: TMenuItem;
cocoaItem: NSMenuItem;
cocoaImage: NSImage;
begin
folderName:= getMacOSDisplayNameFromPath( COMMON_FOLDERS[tag] );
Result:= TMenuItem.Create( menu );
Result.Caption:= caption + ' ' + folderName;
Result.onClick:= @toolBarMenuHandler.goToFolder;
Result.Tag:= tag;
lclItem:= TMenuItem.Create( menu );
lclItem.Caption:= folderName;
lclItem.onClick:= @toolBarMenuHandler.goToFolder;
lclItem.Tag:= tag;
items.Add( lclItem );
cocoaImage:= NSImage.imageWithSystemSymbolName_accessibilityDescription(
NSSTR(imageName), nil );
cocoaItem:= NSMenuItem( lclItem.Handle );
cocoaItem.setImage( cocoaImage );
inc( tag );
end;
begin
menu:= TMenuItem.Create( frmMain );
menu.Add( newItem('􀈕') );
menu.Add( newItem('􀣰') );
menu.Add( newItem('􀎞') );
menu.Add( newItem('􀏅') );
menu.Add( newItem('􀎶') );
menu.Add( newItem('􀫀') );
menu.Add( newItem('􀤋') );
menu.AddSeparator;
menu.Add( newItem(' 􀁸') );
menu.Add( newItem(' 􀀚') );
menu.Add( newItem(' 􀀄') );
menu.AddSeparator;
menu.Add( newItem(' 􀈑') );
Result:= menu;
items:= menu.Items;
newItem('doc');
newItem('menubar.dock.rectangle');
newItem('arrow.down.circle');
newItem('house');
newItem('photo');
newItem('film');
newItem('music.quarternote.3');
newItem('wrench.and.screwdriver.fill');
newItem('l.circle');
newItem('a.circle');
items.AddSeparator;
newItem('trash');
end;
function onGetCommandMenu: TMenuItem;
var
menu: TMenuItem;
function copyMenuItem( owner: TComponent; source: TMenuItem ): TMenuItem;
begin
Result:= TMenuItem.Create( owner );
Result.Caption:= source.Caption;
Result.Action:= source.Action;
end;
procedure onGetCommandMenu( const menu: TMenu );
function toItem( source: TMenuItem ): TMenuItem;
begin
Result:= TMenuItem.Create( menu );
Result.Caption:= source.Caption;
Result.Action:= source.Action;
Result:= copyMenuItem( menu, source );
end;
function createShowHotlistMenuItem: TMenuItem;
@ -253,40 +301,88 @@ var
Result.OnClick:= @toolBarMenuHandler.showEditTagPanel;
end;
begin
menu:= TMenuItem.Create( frmMain );
menu.Add( toItem(frmMain.miMultiRename) );
menu.Add( toItem(frmMain.mnuFilesCmpCnt) );
menu.Add( toItem(frmMain.mnuCmdSyncDirs) );
menu.AddSeparator;
menu.Add( toItem(frmMain.mnuCmdSearch) );
menu.Add( toItem(frmMain.mnuCmdAddNewSearch) );
menu.Add( toItem(frmMain.mnuCmdViewSearches) );
menu.AddSeparator;
menu.Add( createShowHotlistMenuItem );
menu.Add( toItem(frmMain.mnuCmdConfigDirHotlist) );
menu.AddSeparator;
menu.Add( createShowFavoriteMenuItem );
menu.Add( toItem(frmMain.mnuConfigFavoriteTabs) );
menu.AddSeparator;
menu.Add( createQuickLookMenuItem );
menu.Add( toItem(frmMain.mnuQuickView) );
menu.Add( toItem(frmMain.mnuFilesShwSysFiles) );
menu.Add( toItem(frmMain.mnuShowOperations) );
menu.AddSeparator;
menu.Add( toItem(frmMain.miEditComment) );
menu.Add( createTagMenuItem );
menu.AddSeparator;
menu.Add( toItem(frmMain.mnuFilesSymLink) );
menu.Add( toItem(frmMain.mnuFilesHardLink) );
menu.AddSeparator;
menu.Add( toItem(frmMain.mnuSetFileProperties) );
menu.Add( toItem(frmMain.mnuFilesProperties) );
menu.AddSeparator;
menu.Add( toItem(frmMain.mnuCheckSumCalc) );
menu.Add( toItem(frmMain.mnuCheckSumVerify) );
var
items: TMenuItem;
Result:= menu;
begin
items:= menu.Items;
items.Add( toItem(frmMain.miMultiRename) );
items.Add( toItem(frmMain.mnuFilesCmpCnt) );
items.Add( toItem(frmMain.mnuCmdSyncDirs) );
items.AddSeparator;
items.Add( toItem(frmMain.mnuCmdSearch) );
items.Add( toItem(frmMain.mnuCmdAddNewSearch) );
items.Add( toItem(frmMain.mnuCmdViewSearches) );
items.AddSeparator;
items.Add( createShowHotlistMenuItem );
items.Add( toItem(frmMain.mnuCmdConfigDirHotlist) );
items.AddSeparator;
items.Add( createShowFavoriteMenuItem );
items.Add( toItem(frmMain.mnuConfigFavoriteTabs) );
items.AddSeparator;
items.Add( createQuickLookMenuItem );
items.Add( toItem(frmMain.mnuQuickView) );
items.Add( toItem(frmMain.mnuFilesShwSysFiles) );
items.Add( toItem(frmMain.mnuShowOperations) );
items.AddSeparator;
items.Add( toItem(frmMain.miEditComment) );
items.Add( createTagMenuItem );
items.AddSeparator;
items.Add( toItem(frmMain.mnuFilesSymLink) );
items.Add( toItem(frmMain.mnuFilesHardLink) );
items.AddSeparator;
items.Add( toItem(frmMain.mnuSetFileProperties) );
items.Add( toItem(frmMain.mnuFilesProperties) );
items.AddSeparator;
items.Add( toItem(frmMain.mnuCheckSumCalc) );
items.Add( toItem(frmMain.mnuCheckSumVerify) );
end;
procedure onGetSearchMenu( const menu: TMenu );
var
items: TMenuItem;
procedure createSidebarTagMenuItem;
var
tagNames: NSArray;
tagName: NSString;
menuItem: TMenuItem;
begin
tagNames:= uDarwinFinderModelUtil.getSidebarTagNames;
for tagName in tagNames do begin
menuItem:= TMenuItem.Create( menu );
menuItem.Caption:= tagName.UTF8String;
menuItem.OnClick:= @toolBarMenuHandler.searchOneFinderTagAction;
items.Add( menuItem );
end;
uDarwinFinderUtil.attachSearchForTagsMenu( menu );
end;
procedure createCombinedTagMenuItem;
var
menuItem: TMenuItem;
begin
menuItem:= TMenuItem.Create( menu );
menuItem.Caption:= rsMFSTBISearchCombinedTags;
menuItem.OnClick:= @toolBarMenuHandler.showFinderTagSelectorPanel;
items.Add( menuItem );
end;
procedure createSearchFileMenuItem;
var
menuItem: TMenuItem;
begin
menuItem:= copyMenuItem( menu, frmMain.mnuCmdSearch );
items.Add( menuItem );
end;
begin
items:= menu.Items;
createSidebarTagMenuItem;
items.AddSeparator;
createCombinedTagMenuItem;
items.AddSeparator;
createSearchFileMenuItem;
end;
procedure terminalAction( const Sender: id );
@ -305,13 +401,8 @@ begin
end;
procedure privilegeAction( const Sender: id );
const
Privacy_AllFiles = 'x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles';
var
url: NSURL;
begin
url:= NSURL.URLWithString( NSSTR(Privacy_AllFiles) );
NSWorkspace.sharedWorkspace.openURL( url );
openSystemSecurityPreferences_PrivacyAllFiles;
end;
const
@ -499,15 +590,18 @@ const
onAction: @terminalAction;
);
searchFilesItemConfig: TCocoaConfigToolBarItem = (
identifier: 'MainForm.SearchFiles';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: False;
searchItemConfig: TCocoaConfigToolBarItemMenu = (
identifier: 'MainForm.Search';
iconName: 'magnifyingglass';
title: rsMFSTBISearchTitle;
tips: rsMFSTBISearchTips;
bordered: True;
onAction: @searchFilesAction;
onAction: nil;
showsIndicator: False;
dynamic: True;
menu: nil;
onGetMenu: @onGetSearchMenu;
);
privilegeItemConfig: TCocoaConfigToolBarItem = (
@ -605,7 +699,7 @@ const
'NSToolbarFlexibleSpaceItem',
'MainForm.Command',
'NSToolbarFlexibleSpaceItem',
'MainForm.SearchFiles',
'MainForm.Search',
'MainForm.Terminal',
'MainForm.Privilege'
);
@ -624,7 +718,7 @@ const
'MainForm.FinderInfo',
'MainForm.Command',
'MainForm.SearchFiles',
'MainForm.Search',
'MainForm.Terminal',
'MainForm.Privilege',
@ -660,7 +754,7 @@ begin
TCocoaToolBarUtils.toClass(finderRevealItemConfig),
TCocoaToolBarUtils.toClass(finderInfoItemConfig),
TCocoaToolBarUtils.toClass(terminalItemConfig),
TCocoaToolBarUtils.toClass(searchFilesItemConfig),
TCocoaToolBarUtils.toClass(searchItemConfig),
TCocoaToolBarUtils.toClass(privilegeItemConfig),
TCocoaToolBarUtils.toClass(refreshItemConfig),

View file

@ -11,13 +11,12 @@ uses
uDarwinFinderModel,
MacOSAll, CocoaAll, CocoaConst, CocoaTextEdits, CocoaUtils, Cocoa_Extra;
const
FINDER_FAVORITE_TAGS_MENU_ITEM_CAPTION = #$EF#$BF#$BC'FinderFavoriteTags';
const
FINDER_FAVORITE_TAGS_MENU_ITEM_SIZE = 20.0;
FINDER_FAVORITE_TAGS_MENU_ITEM_SPACING = 4.0;
FINDER_TAGS_MENU_ROUND_SIZE = 12;
const
TAG_POPOVER_WIDTH = 228.0;
TAG_POPOVER_HEIGHT = 303.0;
@ -32,17 +31,30 @@ const
TAG_TOKEN_LINE_SPACING = 1.0;
type
TFinderTagMenuRoundImages = Array of NSImage;
TFinderEditorCloseHandler = procedure ( const cancel: Boolean; const tagNames: NSArray ) of object;
{ uDarwinFinderUtil }
uDarwinFinderUtil = class
strict private class var
_menuTagRoundImages: TFinderTagMenuRoundImages;
public
class procedure popoverFileTags(
const path: String; const positioningView: NSView; const edge: NSRectEdge );
class procedure attachFinderTagsMenu(
const path: String; const lclMenu: TPopupMenu );
class procedure popoverFileTagsEditor(
const path: String; onClose: TFinderEditorCloseHandler;
const positioningView: NSView; const edge: NSRectEdge );
class procedure popoverTagsSelector(
const title: String; onClose: TFinderEditorCloseHandler;
const positioningView: NSView; const edge: NSRectEdge );
class function attachFinderTagsMenu( const path: String;
const lclMenu: TPopupMenu; const menuIndex: Integer ): Boolean;
class procedure attachSearchForTagsMenu( const lclMenu: TMenu );
private
class procedure drawTagName( const tagName: NSString;
const fontSize: CGFloat; const color: NSColor; const rect: NSRect );
class procedure initMenuRoundNSImages;
end;
implementation
@ -120,21 +132,24 @@ type
TCocoaTokenFieldDelegateProtocol,
NSTableViewDataSourceProtocol )
private
_url: NSUrl;
_popover: NSPopover;
_pathLabel: NSTextField;
_titleLabel: NSTextField;
_tagsTokenField: TCocoaTokenField;
_filterListView: NSTableView;
_filterTagNames: NSMutableArray;
_cancel: Boolean;
_onClose: TFinderEditorCloseHandler;
public
class function editorWithPath( const path: NSString): id; message 'doublecmd_editorWithPath:';
function initWithPath( const path: NSString): id; message 'doublecmd_initWithPath:';
class function editorWithPath( const path: NSString ): id; message 'doublecmd_editorWithPath:';
class function selectorWithTitle( const titleString: NSString ): id; message 'doublecmd_editorWithTitle:';
function init: id; override;
procedure dealloc; override;
procedure showPopover( const sender: NSView ; const edge: NSRectEdge );
message 'doublecmd_showPopover:sender:';
public
procedure loadView; override;
procedure setTitle(newValue: NSString); override;
procedure setTagNames( tagNames: NSArray ); message 'doublecmd_setTagNames:';
public
function numberOfRowsInTableView (tableView: NSTableView): NSInteger;
function tableView_objectValueForTableColumn_row (
@ -590,18 +605,32 @@ end;
class function TFinderTagsEditorPanel.editorWithPath( const path: NSString ): id;
var
panel: TFinderTagsEditorPanel;
url: NSURL;
begin
panel:= TFinderTagsEditorPanel.alloc.initWithPath( path );
url:= NSURL.fileURLWithPath( path );
// release in popoverDidClose()
panel:= TFinderTagsEditorPanel.new;
panel.loadView;
panel.setTitle( url.lastPathComponent );
panel.setTagNames( uDarwinFinderModelUtil.getTagNamesOfFile(url) );
Result:= panel;
end;
function TFinderTagsEditorPanel.initWithPath( const path: NSString ): id;
class function TFinderTagsEditorPanel.selectorWithTitle( const titleString: NSString ): id;
var
panel: TFinderTagsEditorPanel;
begin
// release in popoverDidClose()
panel:= TFinderTagsEditorPanel.new;
panel.loadView;
panel.setTitle( titleString );
Result:= panel;
end;
function TFinderTagsEditorPanel.init: id;
begin
Inherited init;
_url:= NSURL.fileURLWithPath( path );
_url.retain;
_filterTagNames:= NSMutableArray.new;
Result:= self;
@ -610,8 +639,8 @@ end;
procedure TFinderTagsEditorPanel.dealloc;
begin
_titleLabel.release;
_tagsTokenField.release;
_url.release;
_filterTagNames.release;
_popover.release;
Inherited;
@ -619,6 +648,8 @@ end;
procedure TFinderTagsEditorPanel.popoverDidClose(notification: NSNotification);
begin
_popover.setDelegate( nil );
_popover.setContentViewController( nil );
self.release;
end;
@ -626,7 +657,6 @@ procedure TFinderTagsEditorPanel.showPopover( const sender: NSView; const edge:
begin
self.view.setFrameSize( NSMakeSize(TAG_POPOVER_WIDTH, TAG_POPOVER_HEIGHT) );
_tagsTokenField.setObjectValue( uDarwinFinderModelUtil.getTagNamesOfFile(_url) );
_tagsTokenField.setFrameSize( NSMakeSize(TAG_POPOVER_WIDTH-TAG_POPOVER_PADDING*2,0) );
_popover.showRelativeToRect_ofView_preferredEdge(
@ -645,16 +675,15 @@ var
begin
contentView:= NSView.new;
_pathLabel:= NSTextField.new;
_pathLabel.setHidden( False );
_pathLabel.setStringValue( _url.lastPathComponent );
_pathLabel.setAlignment( NSTextAlignmentCenter );
_pathLabel.setLineBreakMode( NSLineBreakByTruncatingMiddle );
_pathLabel.setEditable( False );
_pathLabel.setBordered( False );
_pathLabel.setBackgroundColor( NSColor.clearColor );
_pathLabel.setFocusRingType( NSFocusRingTypeNone );
contentView.addSubview( _pathLabel );
_titleLabel:= NSTextField.new;
_titleLabel.setHidden( False );
_titleLabel.setAlignment( NSTextAlignmentCenter );
_titleLabel.setLineBreakMode( NSLineBreakByTruncatingMiddle );
_titleLabel.setEditable( False );
_titleLabel.setBordered( False );
_titleLabel.setBackgroundColor( NSColor.clearColor );
_titleLabel.setFocusRingType( NSFocusRingTypeNone );
contentView.addSubview( _titleLabel );
NSTokenField.setCellClass( TCocoaTokenFieldCell );
_tagsTokenField:= TCocoaTokenField.new;
@ -688,6 +717,16 @@ begin
contentView.release;
end;
procedure TFinderTagsEditorPanel.setTitle(newValue: NSString);
begin
_titleLabel.setStringValue( newValue );
end;
procedure TFinderTagsEditorPanel.setTagNames(tagNames: NSArray);
begin
_tagsTokenField.setObjectValue( tagNames );
end;
function TFinderTagsEditorPanel.numberOfRowsInTableView(tableView: NSTableView
): NSInteger;
begin
@ -748,7 +787,7 @@ begin
pathLabelFrame.size.height:= TAG_LABEL_FONT_SIZE + 3;
pathLabelFrame.origin.x:= TAG_POPOVER_PADDING;
pathLabelFrame.origin.y:= popoverHeight - ( pathLabelFrame.size.height + TAG_POPOVER_PADDING );
_pathLabel.setFrame( pathLabelFrame );
_titleLabel.setFrame( pathLabelFrame );
tagsTokenFieldFrame.size:= _tagsTokenField.intrinsicContentSize;
if tagsTokenFieldFrame.size.height > 190 then
@ -812,34 +851,53 @@ end;
procedure TFinderTagsEditorPanel.popoverWillClose(notification: NSNotification);
var
tagNameArray: NSArray;
tagNames: NSArray;
begin
if _cancel then
if _onClose = nil then
Exit;
tagNameArray:= _tagsTokenField.objectValue;
uDarwinFinderModelUtil.setTagNamesOfFile( _url, tagNameArray );
tagNames:= nil;
if NOT _cancel then
tagNames:= _tagsTokenField.objectValue;
_onClose( _cancel, tagNames );
end;
{ uDarwinFinderUtil }
class procedure uDarwinFinderUtil.popoverFileTags(
const path: String; const positioningView: NSView ; const edge: NSRectEdge );
class procedure uDarwinFinderUtil.popoverFileTagsEditor(
const path: String; onClose: TFinderEditorCloseHandler;
const positioningView: NSView ; const edge: NSRectEdge );
var
panel: TFinderTagsEditorPanel;
begin
panel:= TFinderTagsEditorPanel.editorWithPath( StrToNSString(path) );
panel._onClose:= onClose;
panel.showPopover( positioningView, edge );
end;
class procedure uDarwinFinderUtil.attachFinderTagsMenu( const path: String;
const lclMenu: TPopupMenu );
class procedure uDarwinFinderUtil.popoverTagsSelector(
const title: String; onClose: TFinderEditorCloseHandler;
const positioningView: NSView; const edge: NSRectEdge);
var
panel: TFinderTagsEditorPanel;
begin
panel:= TFinderTagsEditorPanel.selectorWithTitle( StrToNSString(title) );
panel._onClose:= onClose;
panel.showPopover( positioningView, edge );
end;
class function uDarwinFinderUtil.attachFinderTagsMenu( const path: String;
const lclMenu: TPopupMenu; const menuIndex: Integer ): Boolean;
var
menuIndex: Integer;
menuView: TFinderFavoriteTagsMenuView;
cocoaItem: NSMenuItem;
favoriteTags: NSArray;
begin
menuIndex:= lclMenu.Items.IndexOfCaption( FINDER_FAVORITE_TAGS_MENU_ITEM_CAPTION );
if menuIndex < 0 then
Result:= False;
favoriteTags:= uDarwinFinderModelUtil.favoriteTags;
if favoriteTags = nil then
Exit;
menuView:= TFinderFavoriteTagsMenuView.alloc.initWithFrame(
@ -848,12 +906,36 @@ begin
FINDER_FAVORITE_TAGS_MENU_ITEM_SIZE + FINDER_FAVORITE_TAGS_MENU_ITEM_SPACING*2 ) );
menuView.setLclMenu( lclMenu, lclMenu.Items[menuIndex+1] );
menuView.setPath( StrToNSString(path) );
menuView.setFavoriteTags( uDarwinFinderModelUtil.favoriteTags );
menuView.setFavoriteTags( favoriteTags );
cocoaItem:= NSMenuItem( lclMenu.Items[menuIndex].Handle );
cocoaItem.setView( menuView );
menuView.release;
Result:= True;
end;
class procedure uDarwinFinderUtil.attachSearchForTagsMenu(const lclMenu: TMenu);
procedure setColorImage( const lclMenuItem: TMenuItem );
var
cocoaItem: NSMenuItem;
tag: TFinderTag;
begin
cocoaItem:= NSMenuItem( lclMenuItem.Handle );
tag:= TFinderTags.getTagOfName( cocoaItem.title );
if tag = nil then
Exit;
cocoaItem.setImage( _menuTagRoundImages[tag.colorIndex] );
end;
var
i: Integer;
count: Integer;
begin
count:= lclMenu.Items.Count;
for i:=0 to count-1 do begin
setColorImage( lclMenu.Items[i] );
end;
end;
class procedure uDarwinFinderUtil.drawTagName( const tagName: NSString;
@ -879,6 +961,58 @@ begin
attributes.release;
end;
class procedure uDarwinFinderUtil.initMenuRoundNSImages;
var
imageSize: NSSize;
colors: TFinderTagNSColors;
count: Integer;
i: Integer;
procedure drawImageContent( const color: NSColor );
var
rect: NSRect;
path: NSBezierPath;
begin
color.set_;
rect.origin:= NSZeroPoint;
rect.size:= imageSize;
path:= NSBezierPath.bezierPathWithOvalInRect( rect );
path.fill;
end;
function createOneColorImage( const color: NSColor ): NSImage;
var
image: NSImage;
imageRep: NSBitmapImageRep;
context: NSGraphicsContext;
begin
imageRep:= NSBitmapImageRep.alloc.initWithBitmapDataPlanes_pixelsWide_pixelsHigh__colorSpaceName_bytesPerRow_bitsPerPixel(
nil,
FINDER_TAGS_MENU_ROUND_SIZE, FINDER_TAGS_MENU_ROUND_SIZE,
8, 4,
True, False,
NSCalibratedRGBColorSpace,
0, 0 );
context:= NSGraphicsContext.graphicsContextWithBitmapImageRep( imageRep );
NSGraphicsContext.classSaveGraphicsState;
NSGraphicsContext.setCurrentContext( context );
drawImageContent( color );
image:= NSImage.alloc.initWithSize( imageSize );
image.addRepresentation( imageRep );
Result:= image;
NSGraphicsContext.classRestoreGraphicsState;
end;
begin
imageSize:= NSMakeSize( FINDER_TAGS_MENU_ROUND_SIZE, FINDER_TAGS_MENU_ROUND_SIZE );
colors:= uDarwinFinderModelUtil.rectFinderTagNSColors;
count:= Length( colors );
SetLength( _menuTagRoundImages, count );
for i:= 0 to count-1 do begin
_menuTagRoundImages[i]:= createOneColorImage( colors[i] );
end;
end;
{ TFinderFavoriteTagMenuItemControl }
procedure TFinderFavoriteTagMenuItem.setFinderTag(
@ -1102,5 +1236,8 @@ begin
_url.release;
end;
initialization
uDarwinFinderUtil.initMenuRoundNSImages;
end.

View file

@ -9,7 +9,7 @@ uses
Classes, SysUtils, LCLType,
sqldb, SQLite3Conn,
uDebug,
CocoaAll, CocoaConst, Cocoa_Extra;
MacOSAll, CocoaAll, CocoaConst, Cocoa_Extra;
type
@ -19,14 +19,17 @@ type
private
_name: NSString;
_colorIndex: NSInteger;
_isShowingInSidebar: Boolean;
_isUserDefined: Boolean;
public
class function tagWithParams( const name: NSString; const colorIndex: Integer;
const isUserDefined: Boolean ): TFinderTag; message 'tagWithParams:name:colorIndex:';
const isShowingInSidebar: Boolean; const isUserDefined: Boolean ): TFinderTag;
message 'tagWithParams:name:colorIndex:isShowingInSidebar:';
procedure dealloc; override;
function name: NSString; message 'tag_name';
function colorIndex: NSInteger; message 'tag_colorIndex';
function isShowingInSidebar: Boolean; message 'tag_isShowingInSidebar';
function isUserDefined: Boolean; message 'tag_isUserDefined';
function color: NSColor; message 'tag_color';
end;
@ -46,6 +49,8 @@ type
TFinderTagNSColors = Array of NSColor;
TMacOSSearchResultHandler = procedure ( const searchName: String; const files: TStringArray ) of object;
{ uDarwinFinderModelUtil }
uDarwinFinderModelUtil = class
@ -60,13 +65,18 @@ type
class function getTagsData_macOS11: NSDictionary;
class function doGetAllTags( const tagDictionary: NSDictionary ): NSDictionary;
class function getTagsDataFromDatabase: TBytes;
class function getFavoriteTagNames: NSArray;
class procedure initFinderTagNSColors;
public
class function getFavoriteTagNames: NSArray;
class function getSidebarTagNames: NSArray;
public
class function getTagNamesOfFile( const url: NSURL ): NSArray;
class procedure setTagNamesOfFile( const url: NSURL; const tagNames: NSArray );
class procedure addTagForFile( const url: NSURL; const tagName: NSString );
class procedure removeTagForFile( const url: NSURL; const tagName: NSString );
public
class procedure searchFilesForTagName( const tagName: NSString; const handler: TMacOSSearchResultHandler );
class procedure searchFilesForTagNames( const tagNames: NSArray; const handler: TMacOSSearchResultHandler );
public
class property rectFinderTagNSColors: TFinderTagNSColors read _rectFinderTagNSColors;
class property dotFinderTagNSColors: TFinderTagNSColors read _dotFinderTagNSColors;
@ -76,19 +86,21 @@ type
implementation
const
NEW_FINDER_TAGS_DATABASE_PATH = '/Library/SyncedPreferences/com.apple.kvs/com.apple.KeyValueService-Production.sqlite';
OLD_FINDER_TAGS_FILE_PATH = '/Library/SyncedPreferences/com.apple.finder.plist';
FAVORITE_FINDER_TAGS_FILE_PATH = '/Library/Preferences/com.apple.finder.plist';
FINDER_TAGS_DATABASE_PATH_14plus = '/Library/Daemon Containers/F6F9E4C1-EF5D-4BF3-BEAD-0D777574F0A0/Data/com.apple.kvs/com.apple.KeyValueService-Production.sqlite';
FINDER_TAGS_DATABASE_PATH_12to13 = '/Library/SyncedPreferences/com.apple.kvs/com.apple.KeyValueService-Production.sqlite';
FINDER_TAGS_FILE_PATH_11minus = '/Library/SyncedPreferences/com.apple.finder.plist';
FAVORITE_FINDER_TAGS_FILE_PATH = '/Library/Preferences/com.apple.finder.plist';
{ TFinderTag }
class function TFinderTag.tagWithParams( const name: NSString; const colorIndex: Integer;
const isUserDefined: Boolean): TFinderTag;
const isShowingInSidebar: Boolean; const isUserDefined: Boolean ): TFinderTag;
begin
Result:= TFinderTag.new;
Result._name:= name.retain;
if (colorIndex>=0) and (colorIndex<length(uDarwinFinderModelUtil.rectFinderTagNSColors)) then
Result._colorIndex:= colorIndex;
Result._isShowingInSidebar:= isShowingInSidebar;
Result._isUserDefined:= isUserDefined;
Result.autorelease;
end;
@ -109,6 +121,11 @@ begin
Result:= _colorIndex;
end;
function TFinderTag.isShowingInSidebar: Boolean;
begin
Result:= _isShowingInSidebar;
end;
function TFinderTag.isUserDefined: Boolean;
begin
Result:= _isUserDefined;
@ -149,6 +166,63 @@ begin
Result:= _tags.objectForKey( tagName );
end;
{ TMacOSQueryHandler }
type
TMacOSQueryHandler = objcclass( NSObject )
private
_queryName: NSString;
_query: NSMetadataQuery;
_handler: TMacOSSearchResultHandler;
procedure initalGatherComplete( sender: id ); message 'initalGatherComplete:';
public
function initWithName( name: NSString ): id; message 'doublecmd_initWithName:';
procedure dealloc; override;
end;
procedure TMacOSQueryHandler.initalGatherComplete(sender: id);
var
item: NSMetadataItem;
path: NSString;
files: TStringArray;
i: Integer;
count: Integer;
begin
_query.stopQuery;
NSNotificationCenter.defaultCenter.removeObserver_name_object(
self,
NSMetadataQueryDidFinishGatheringNotification,
_query );
files:= nil;
count:= _query.resultCount;
if count > 0 then begin
SetLength( files, count );
for i:=0 to count-1 do begin
item:= NSMetadataItem( _query.results.objectAtIndex(i) );
path:= item.valueForAttribute( NSString(kMDItemPath) );
files[i]:= path.UTF8String;
end;
end;
_handler( _queryName.UTF8String, files );
self.release;
end;
function TMacOSQueryHandler.initWithName(name: NSString): id;
begin
_queryName:= name;
_queryName.retain;
Result:= self;
end;
procedure TMacOSQueryHandler.dealloc;
begin
_queryName.release;
_query.release;
end;
{ uDarwinFinderModelUtil }
class function uDarwinFinderModelUtil.getTagNamesOfFile(const url: NSURL
@ -156,7 +230,6 @@ class function uDarwinFinderModelUtil.getTagNamesOfFile(const url: NSURL
var
ret: Boolean;
tagNames: NSArray;
tagColor: NSColor;
begin
Result:= nil;
ret:= url.getResourceValue_forKey_error( @tagNames, NSURLTagNamesKey, nil );
@ -194,6 +267,72 @@ begin
uDarwinFinderModelUtil.setTagNamesOfFile( url, newTagNames );
end;
class procedure uDarwinFinderModelUtil.searchFilesForTagNames(
const tagNames: NSArray; const handler: TMacOSSearchResultHandler);
function toString: NSString;
var
tagName: NSString;
name: NSMutableString;
begin
name:= NSMutableString.new;
for tagName in tagNames do begin
name.appendString( tagName );
name.appendString( NSSTR('|') );
end;
Result:= name.substringToIndex( name.length-1 );
name.release;
end;
function formatString: NSString;
var
format: NSMutableString;
count: Integer;
i: Integer;
begin
format:= NSMutableString.new;
count:= tagNames.count;
for i:=1 to count do begin
format.appendString( NSSTR('(kMDItemUserTags == %@) && ') );
end;
Result:= format.substringToIndex( format.length-4 );
format.release;
end;
var
queryHandler: TMacOSQueryHandler;
query: NSMetadataQuery;
predicate: NSPredicate;
begin
if tagNames.count = 0 then
Exit;
// release in initalGatherComplete()
query:= NSMetadataQuery.new;
// release in initalGatherComplete()
queryHandler:= TMacOSQueryHandler.alloc.initWithName( toString() );
queryHandler._query:= query;
queryHandler._handler:= handler;
NSNotificationCenter.defaultCenter.addObserver_selector_name_object(
queryHandler,
objcselector('initalGatherComplete:'),
NSMetadataQueryDidFinishGatheringNotification,
query );
predicate:= NSPredicate.predicateWithFormat_argumentArray( formatString(), tagNames );
query.setPredicate( predicate );
query.startQuery;
end;
class procedure uDarwinFinderModelUtil.searchFilesForTagName(
const tagName: NSString; const handler: TMacOSSearchResultHandler);
var
tagNames: NSArray;
begin
tagNames:= NSArray.arrayWithObject( tagName );
uDarwinFinderModelUtil.searchFilesForTagNames( tagNames, handler );
end;
class function uDarwinFinderModelUtil.getAllTags: NSDictionary;
var
tagDictionary: NSDictionary;
@ -236,6 +375,20 @@ begin
Result:= plistProperties.valueForKeyPath( NSSTR('FavoriteTagNames') );
end;
class function uDarwinFinderModelUtil.getSidebarTagNames: NSArray;
var
tagNames: NSMutableArray;
tag: TFinderTag;
begin
TFinderTags.update;
tagNames:= NSMutableArray.arrayWithCapacity( 16 );
for tag in TFinderTags.tags.allValues do begin
if tag.isShowingInSidebar then
tagNames.addObject( tag.name );
end;
Result:= tagNames;
end;
class function uDarwinFinderModelUtil.getFavoriteTags: NSArray;
var
tagNames: NSArray;
@ -249,6 +402,8 @@ begin
if tagName.length = 0 then
continue;
tag:= TFinderTags.getTagOfName( tagName );
if tag = nil then
continue;
tags.addObject( tag );
end;
@ -285,7 +440,7 @@ var
plistProperties: id;
begin
Result:= nil;
path:= NSHomeDirectory.stringByAppendingString( NSSTR(OLD_FINDER_TAGS_FILE_PATH) );
path:= NSHomeDirectory.stringByAppendingString( NSSTR(FINDER_TAGS_FILE_PATH_11minus) );
plistData:= NSData.dataWithContentsOfFile( path );
if plistData = nil then
@ -311,7 +466,11 @@ begin
connection:= TSQLite3Connection.Create( nil );
transaction:= TSQLTransaction.Create( connection );
connection.Transaction:= transaction;
databasePath:= NSHomeDirectory.UTF8String + NEW_FINDER_TAGS_DATABASE_PATH;
if NSAppKitVersionNumber >= NSAppKitVersionNumber14_0 then
databasePath:= FINDER_TAGS_DATABASE_PATH_14plus
else
databasePath:= FINDER_TAGS_DATABASE_PATH_12to13;
databasePath:= NSHomeDirectory.UTF8String + databasePath;
connection.DatabaseName:= databasePath;
query:= TSQLQuery.Create( nil );
@ -339,7 +498,9 @@ var
plistTagItem: NSDictionary;
plistTagName: NSString;
plistTagColorNumber: NSNumber;
plistShowingInSidebar: NSNumber;
plistTagUserDefined: NSNumber;
showingInSidebar: Boolean;
allFinderTagDict: NSMutableDictionary;
tag: TFinderTag;
@ -356,11 +517,19 @@ begin
for plistTagItem in plistTagArray do begin
plistTagName:= plistTagItem.valueForKey( NSSTR('n') );
plistTagColorNumber:= plistTagItem.valueForKey( NSSTR('l') );
plistShowingInSidebar:= plistTagItem.valueForKey( NSSTR('v') );
plistTagUserDefined:= plistTagItem.valueForKey( NSSTR('p') );
showingInSidebar:= True;
if plistShowingInSidebar <> nil then
showingInSidebar:= plistShowingInSidebar.boolValue;
tag:= TFinderTag.tagWithParams(
plistTagName,
plistTagColorNumber.integerValue,
showingInSidebar,
plistTagUserDefined.boolValue );
allFinderTagDict.setValue_forKey( tag, plistTagName );
end;

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
This unit contains specific DARWIN functions.
Copyright (C) 2016-2023 Alexander Koblov (alexx2000@mail.ru)
Copyright (C) 2016-2024 Alexander Koblov (alexx2000@mail.ru)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -28,17 +28,22 @@
unit uMyDarwin;
{$mode delphi}
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$linkframework DiskArbitration}
interface
uses
Classes, SysUtils, UnixType,
InterfaceBase, Menus, Controls, Forms,
uFileProperty, uFileSourceProperty, uDisplayFile, uFileView, uColumnsFileView,
uLng,
Cocoa_Extra, MacOSAll, CocoaAll, QuickLookUI,
CocoaUtils, CocoaInt, CocoaPrivate, CocoaConst, CocoaMenus,
InterfaceBase, Menus, Controls, Forms,
uDarwinFSWatch, uDarwinFinder;
uDarwinFSWatch, uDarwinFinder, uDarwinFinderModel;
const
FINDER_FAVORITE_TAGS_MENU_ITEM_CAPTION = #$EF#$BF#$BC'FinderFavoriteTags';
// Darwin Util Function
function StringToNSString(const S: String): NSString;
@ -64,6 +69,8 @@ function MountNetworkDrive(const serverAddress: String): Boolean;
function GetVolumeName(const Device: String): String;
procedure openSystemSecurityPreferences_PrivacyAllFiles;
function unmountAndEject(const path: String): Boolean;
procedure openNewInstance();
@ -142,15 +149,22 @@ public
procedure openWithNewTab( pboard:NSPasteboard; userData:NSString; error:NSStringPtr ); message 'openWithNewTab:userData:error:';
end;
type TMacosServiceMenuHelper = class
private
oldMenuPopupHandler: TNotifyEvent;
serviceSubMenuCaption: String;
tagFilePath: String;
procedure attachServicesMenu( Sender:TObject);
public
procedure PopUp( const menu: TPopupMenu; const caption: String; const path: String );
end;
type
{ TMacosServiceMenuHelper }
TMacosServiceMenuHelper = class
private
oldMenuPopupHandler: TNotifyEvent;
serviceSubMenuCaption: String;
tagFilePath: String;
procedure attachSystemMenu( Sender: TObject );
procedure attachServicesMenu( Sender: TObject );
procedure attachFinderTagsMenu( Sender: TObject );
procedure privilegeAction( Sender: TObject );
public
procedure PopUp( const menu: TPopupMenu; const caption: String; const path: String );
end;
procedure InitNSServiceProvider(
serveCallback: TNSServiceProviderCallBack;
@ -160,7 +174,8 @@ procedure InitNSServiceProvider(
procedure performMacOSService( serviceName: String );
procedure showQuickLookPanel;
procedure showEditFinderTagsPanel( const Sender: id; control: TWinControl );
procedure showEditFinderTagsPanel( const Sender: id; const control: TWinControl );
function getMacOSFinderTagFileProperty( const path: String ): TFileFinderTagProperty;
// MacOS Sharing
procedure showMacOSSharingServiceMenu;
@ -177,6 +192,20 @@ var
MacosServiceMenuHelper: TMacosServiceMenuHelper;
NSThemeChangedHandler: TNSThemeChangedHandler;
type
{ TDarwinFileViewDrawHelper }
TDarwinFileViewDrawHelper = class
procedure onDrawCell(Sender: TFileView; aCol, aRow: Integer;
aRect: TRect; focused: Boolean; aFile: TDisplayFile);
procedure drawTagsAsDecoration(
const colors: TFileFinderTagPrimaryColors; const drawRect: TRect; const focused: Boolean );
end;
var
DarwinFileViewDrawHelper: TDarwinFileViewDrawHelper;
implementation
uses
@ -256,14 +285,18 @@ begin
NSAppearance.setCurrentAppearance( appearance );
end;
procedure TMacosServiceMenuHelper.attachSystemMenu(Sender: TObject);
begin
self.attachServicesMenu( Sender );
self.attachFinderTagsMenu( Sender );
end;
procedure TMacosServiceMenuHelper.attachServicesMenu( Sender: TObject );
var
menu: TPopupMenu;
menu: TPopupMenu Absolute Sender;
servicesItem: TMenuItem;
subMenu: TCocoaMenu;
begin
menu:= TPopupMenu(Sender);
// call the previous OnMenuPopupHandler and restore it
if Assigned(oldMenuPopupHandler) then oldMenuPopupHandler( Sender );
OnMenuPopupHandler:= oldMenuPopupHandler;
@ -277,8 +310,31 @@ begin
TCocoaMenuItem(servicesItem.Handle).setSubmenu( subMenu );
NSApp.setServicesMenu( NSMenu(servicesItem.Handle) );
end;
end;
uDarwinFinderUtil.attachFinderTagsMenu( self.tagFilePath, menu );
procedure TMacosServiceMenuHelper.attachFinderTagsMenu( Sender: TObject );
var
menu: TPopupMenu Absolute Sender;
menuItem: TMenuItem;
menuIndex: Integer;
success: Boolean;
begin
menuIndex:= menu.Items.IndexOfCaption( FINDER_FAVORITE_TAGS_MENU_ITEM_CAPTION );
if menuIndex < 0 then
Exit;
success:= uDarwinFinderUtil.attachFinderTagsMenu( self.tagFilePath, menu, menuIndex );
if success then
Exit;
menuItem:= menu.Items[menuIndex];
menuItem.Caption:= rsMenuMacOSGrantPermissionToSupportFinderTags;
menuItem.OnClick:= self.privilegeAction;
end;
procedure TMacosServiceMenuHelper.privilegeAction(Sender: TObject);
begin
openSystemSecurityPreferences_PrivacyAllFiles;
end;
procedure TMacosServiceMenuHelper.PopUp( const menu: TPopupMenu;
@ -287,12 +343,61 @@ begin
// because the menu item handle will be destroyed in TPopupMenu.PopUp()
// we can only call NSApplication.setServicesMenu() in OnMenuPopupHandler()
oldMenuPopupHandler:= OnMenuPopupHandler;
OnMenuPopupHandler:= attachServicesMenu;
OnMenuPopupHandler:= attachSystemMenu;
serviceSubMenuCaption:= caption;
tagFilePath:= path;
menu.PopUp();
end;
{ TDarwinFileViewDrawHelper }
procedure TDarwinFileViewDrawHelper.onDrawCell(Sender: TFileView; aCol, aRow: Integer;
aRect: TRect; focused: Boolean; aFile: TDisplayFile);
var
tagProperty: TFileFinderTagProperty;
begin
if (Sender is TColumnsFileView) and (aCol<>0) then
Exit;
tagProperty:= aFile.FSFile.FinderTagProperty;
if tagProperty = nil then
Exit;
drawTagsAsDecoration( tagProperty.Colors, aRect, focused );
end;
procedure TDarwinFileViewDrawHelper.drawTagsAsDecoration(
const colors: TFileFinderTagPrimaryColors; const drawRect: TRect;
const focused: Boolean);
var
i: Integer;
colorIndex: Integer;
color: NSColor;
tagRect: NSRect;
path: NSBezierPath;
begin
tagRect.size.width:= 11;
tagRect.size.height:= 11;
tagRect.origin.x:= drawRect.Right - 17;
tagRect.origin.y:= drawRect.Top + (drawRect.Height-tagRect.size.height)/2;
for i:=0 to 2 do begin
colorIndex:= colors.indexes[i];
if colorIndex < 0 then
break;
color:= uDarwinFinderModelUtil.rectFinderTagNSColors[colorIndex];
color.set_;
path:= NSBezierPath.bezierPathWithOvalInRect( tagRect );
path.fill;
if focused then
NSColor.alternateSelectedControlTextColor.set_
else
NSColor.textBackgroundColor.set_;
path.stroke;
tagRect.origin.x:= tagRect.origin.x - 5;
end;
end;
procedure InitNSServiceProvider(
serveCallback: TNSServiceProviderCallBack;
@ -612,6 +717,16 @@ begin
end;
end;
procedure openSystemSecurityPreferences_PrivacyAllFiles;
const
Privacy_AllFiles = 'x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles';
var
url: NSURL;
begin
url:= NSURL.URLWithString( NSSTR(Privacy_AllFiles) );
NSWorkspace.sharedWorkspace.openURL( url );
end;
function unmountAndEject(const path: String): Boolean;
begin
Result:= NSWorkspace.sharedWorkspace.unmountAndEjectDeviceAtPath( StringToNSString(path) );
@ -664,6 +779,7 @@ begin
end;
HasMountURL:= Assigned(NetFSMountURLSync) or Assigned(FSMountServerVolumeSync);
MacosServiceMenuHelper:= TMacosServiceMenuHelper.Create;
DarwinFileViewDrawHelper:= TDarwinFileViewDrawHelper.Create;
end;
procedure Finalize;
@ -730,11 +846,40 @@ begin
mate.release;
end;
procedure showEditFinderTagsPanel( const Sender: id; control: TWinControl );
type
{ TFinderTagsEditorPanelHandler }
TFinderTagsEditorPanelHandler = class
private
_path: String;
public
constructor Create( const path: String );
procedure onClose( const cancel: Boolean; const tagNames: NSArray );
end;
constructor TFinderTagsEditorPanelHandler.Create( const path: String );
begin
_path:= path;
end;
procedure TFinderTagsEditorPanelHandler.onClose( const cancel: Boolean; const tagNames: NSArray );
var
url: NSURL;
begin
if cancel then
Exit;
url:= NSURL.fileURLWithPath( StrToNSString(_path) );
uDarwinFinderModelUtil.setTagNamesOfFile( url, tagNames );
end;
procedure showEditFinderTagsPanel( const Sender: id; const control: TWinControl );
var
tagItem: NSToolBarItem absolute Sender;
filenames: TStringArray;
view: NSView;
handler: TFinderTagsEditorPanelHandler;
begin
filenames:= TDCCocoaApplication(NSApp).serviceMenuGetFilenames;
if length(filenames) = 0 then
@ -746,7 +891,48 @@ begin
if (view=nil) or (view.window=nil) then
view:= NSView( control.Handle );
uDarwinFinderUtil.popoverFileTags( filenames[0], view , NSMaxYEdge );
handler:= TFinderTagsEditorPanelHandler.Create( filenames[0] );
uDarwinFinderUtil.popoverFileTagsEditor( filenames[0], handler.onClose, view , NSMaxYEdge );
end;
function getMacOSFinderTagFileProperty( const path: String ): TFileFinderTagProperty;
var
url: NSURL;
tagNames: NSArray;
tagName: NSString;
function toPrimaryColors: TFileFinderTagPrimaryColors;
var
tag: TFinderTag;
iSource: NSUInteger;
iDest: Integer;
colorIndex: Integer;
begin
iSource:= 0;
if tagNames.count > 3 then
iSource:= tagNames.count - 3;
for iDest:=0 to 2 do begin
colorIndex:= -1;
if iSource < tagNames.count then begin
tagName:= NSString( tagNames.objectAtIndex(iSource) );
tag:= TFinderTags.getTagOfName( tagName );
colorIndex:= tag.colorIndex;
end;
Result.indexes[iDest]:= colorIndex;
inc( iSource );
end;
end;
begin
Result:= nil;
url:= NSURL.fileURLWithPath( StrToNSString(path) );
tagNames:= uDarwinFinderModelUtil.getTagNamesOfFile( url );
if tagNames = nil then
Exit;
Result:= TFileFinderTagProperty.Create;
Result.Colors:= toPrimaryColors;
end;
initialization

View file

@ -0,0 +1,78 @@
unit uSearchResultUtil;
{$mode ObjFPC}{$H+}
interface
uses
SysUtils, Classes,
uSearchResultFileSource, uFile, uFileSystemFileSource, uFileSource,
fMain, uFileViewNotebook, ulng;
type
TSearchResultUtil = class
class procedure addResultPage( const searchName: String; const files: TStringArray);
end;
implementation
type
{ TFinderTagSearchResultFileSource }
TFinderTagSearchResultFileSource = class( TSearchResultFileSource )
private
_tagName: String;
public
constructor Create( tagName: String );
function GetRootDir(sPath: String): String; override;
end;
{ TFinderTagSearchResultFileSource }
constructor TFinderTagSearchResultFileSource.Create(tagName: String);
begin
Inherited Create;
_tagName:= tagName;
end;
function TFinderTagSearchResultFileSource.GetRootDir(sPath: String): String;
begin
Result:= PathDelim + PathDelim + PathDelim + rsSearchResult + ': ' + _tagName + PathDelim;
end;
class procedure TSearchResultUtil.addResultPage( const searchName: String; const files: TStringArray);
var
i: integer;
count: Integer;
sFileName: string;
SearchResultFS: ISearchResultFileSource;
FileList: TFileTree;
aFile: TFile;
Notebook: TFileViewNotebook;
NewPage: TFileViewPage;
begin
count:= Length(files);
FileList := TFileTree.Create;
for i:=0 to count-1 do begin
sFileName := files[i];
aFile := TFileSystemFileSource.CreateFileFromFile(sFileName);
FileList.AddSubNode(aFile);
end;
// Add new tab for search results.
Notebook := frmMain.ActiveNotebook;
NewPage := Notebook.NewPage(Notebook.ActiveView);
// Create search result file source.
// Currently only searching FileSystem is supported.
SearchResultFS := TFinderTagSearchResultFileSource.Create( searchName );
SearchResultFS.AddList(FileList, Notebook.ActiveView.FileSource);
NewPage.FileView.AddFileSource(SearchResultFS, SearchResultFS.GetRootDir);
NewPage.FileView.FlatView := True;
NewPage.MakeActive;
end;
end.

View file

@ -78,7 +78,7 @@ uses
uOSUtils, uFileProcs, uShellExecute, uLng, uPixMapManager, uMyUnix, uOSForms,
fMain, fFileProperties, DCOSUtils, DCStrUtils, uExts, uArchiveFileSourceUtil, uSysFolders
{$IF DEFINED(DARWIN)}
, LCLStrConsts, MacOSAll, CocoaAll, uMyDarwin, uDarwinFinder
, LCLStrConsts, MacOSAll, CocoaAll, uMyDarwin
{$ELSEIF NOT DEFINED(HAIKU)}
, uKeyFile, uMimeActions
{$IF DEFINED(LINUX)}

View file

@ -154,7 +154,7 @@ uses
, uDCReadRSVG, uMagickWand, uGio, uGioFileSource, uVfsModule, uVideoThumb
, uDCReadWebP, uFolderThumb, uAudioThumb, uDefaultTerminal, uDCReadHEIF
, uTrashFileSource, uFileManager, uFileSystemFileSource, fOpenWith
, uFileSourceUtil
, uFileSourceUtil, uNetworkFileSource
{$ENDIF}
{$IF DEFINED(LINUX)}
, uFlatpak
@ -692,6 +692,8 @@ begin
begin
if TGioFileSource.IsSupportedPath('trash://') then
RegisterVirtualFileSource(rsVfsRecycleBin, TTrashFileSource, True);
if TGioFileSource.IsSupportedPath('network://') then
RegisterVirtualFileSource(rsVfsNetwork, TNetworkFileSource, True);
RegisterVirtualFileSource('GVfs', TGioFileSource, False);
end;
{$ENDIF}

View file

@ -688,6 +688,8 @@ begin
aFile := FFiles[0];
if FBackground then // Add "Background" context menu specific items
begin
SetMenuDefaultItem(FShellMenu, UINT(-1), 0);
InnerExtActionList := TExtActionList.Create;
// Add commands to root of context menu

View file

@ -155,7 +155,9 @@ begin
P := PByte(@AData);
Len := ALength;
repeat
C := FConnection.Write(P^,len);
repeat
C := FConnection.Write(P^,len);
until (C <> -1) or (FConnection.LastError <> ESysEAGAIN);
if (C < 0) then
raise EInOutError.Create(SysErrorMessage(FConnection.LastError));
if (C > 0) then
@ -175,7 +177,9 @@ begin
Len := ALength;
P:= PByte(@AData);
repeat
C:= FConnection.Read(P^, Len);
repeat
C:= FConnection.Read(P^, Len);
until (C <> -1) or (FConnection.LastError <> ESysEAGAIN);
if (C <= 0) then
raise EInOutError.Create(SysErrorMessage(FConnection.LastError));
if (C > 0) then

View file

@ -135,14 +135,14 @@ function SendMessage(__fd: cInt; __message: pmsghdr; __flags: cInt): ssize_t;
begin
repeat
Result:= sendmsg(__fd, __message, __flags);
until (Result <> -1) or (fpgetCerrno <> ESysEINTR);
until not ((Result = -1) and ((Cerrno = ESysEINTR) or (Cerrno = ESysEAGAIN)));
end;
function RecvMessage(__fd: cInt; __message: pmsghdr; __flags: cInt): ssize_t;
begin
repeat
Result:= recvmsg(__fd, __message, __flags);
until (Result <> -1) or (fpgetCerrno <> ESysEINTR);
until not ((Result = -1) and ((Cerrno = ESysEINTR) or (Cerrno = ESysEAGAIN)));
end;
procedure SetSocketClientProcessId(fd: cint);
@ -339,9 +339,12 @@ begin
DCDebug('VerifyChild');
ProcessId:= GetSocketClientProcessId(Handle);
DCDebug(['Credentials from socket: pid=', ProcessId]);
{$IF DEFINED(DARWIN)}
Result:= (GetProcessFileName(ProcessId) = GetProcessFileName(GetProcessId));
{$ELSE}
Result:= CheckParent(ProcessId, GetProcessId);{ and
(GetProcessFileName(ProcessId) = GetProcessFileName(GetProcessId));}
{$ENDIF}
DCDebug(['VerifyChild: ', Result]);
end;
@ -352,8 +355,13 @@ begin
DCDebug('VerifyParent');
ProcessId:= GetSocketClientProcessId(Handle);
DCDebug(['Credentials from socket: pid=', ProcessId]);
{$IF DEFINED(DARWIN)}
Result:= (StrToInt(ParamStr(2)) = ProcessId) and
(GetProcessFileName(ProcessId) = GetProcessFileName(GetProcessId));
{$ELSE}
Result:= CheckParent(FpGetppid, ProcessId) and
(GetProcessFileName(ProcessId) = GetProcessFileName(GetProcessId));
{$ENDIF}
DCDebug(['VerifyParent: ', Result]);
end;

View file

@ -111,7 +111,10 @@ function GetProcessFileName(ProcessId: pid_t): String;
begin
SetLength(Result, MAX_PATH + 1);
if proc_pidinfo(ProcessId, PROC_PIDPATHINFO, 0, Pointer(Result), MAX_PATH) < 0 then
SetLength(Result, 0);
SetLength(Result, 0)
else begin
Result:= PAnsiChar(Result);
end;
end;
{$ELSEIF DEFINED(FREEBSD)}

View file

@ -317,8 +317,10 @@ end;
{$ENDIF}
initialization
{$IF DEFINED(DARWIN) OR DEFINED(HAIKU)}
{$IF DEFINED(HAIKU)}
FAdministratorPrivileges:= True;
{$ELSEIF DEFINED(DARWIN)}
FAdministratorPrivileges:= (fpGetUID = 0);
{$ELSEIF DEFINED(UNIX)}
{$IFDEF LINUX}
if FindExecutable('pkexec', SuperExe) then

View file

@ -89,6 +89,10 @@ type
procedure SetTypeProperty(NewValue: TFileTypeProperty);
function GetCommentProperty: TFileCommentProperty;
procedure SetCommentProperty(NewValue: TFileCommentProperty);
{$IFDEF DARWIN}
function GetFinderTagProperty: TFileFinderTagProperty;
procedure SetFinderTagProperty(NewValue: TFileFinderTagProperty);
{$ENDIF}
public
constructor Create(const APath: String);
constructor CreateForCloning;
@ -162,6 +166,9 @@ type
property OwnerProperty: TFileOwnerProperty read GetOwnerProperty write SetOwnerProperty;
property TypeProperty: TFileTypeProperty read GetTypeProperty write SetTypeProperty;
property CommentProperty: TFileCommentProperty read GetCommentProperty write SetCommentProperty;
{$IFDEF DARWIN}
property FinderTagProperty: TFileFinderTagProperty read GetFinderTagProperty write SetFinderTagProperty;
{$ENDIF}
{ Accessors to each property's value. }
@ -346,6 +353,7 @@ begin
begin
if Assigned(Self.FProperties[PropertyType]) then
begin
AFile.FProperties[PropertyType].Free;
AFile.FProperties[PropertyType] := Self.FProperties[PropertyType].Clone;
end;
end;
@ -355,6 +363,7 @@ begin
begin
if Assigned(Self.FVariantProperties[AIndex]) then
begin
AFile.FVariantProperties[AIndex].Free;
AFile.FVariantProperties[AIndex] := Self.FVariantProperties[AIndex].Clone;
end;
end;
@ -488,11 +497,17 @@ var
AIndex: Integer;
begin
if PropType < fpInvalid then
begin
FProperties[PropType].Free;
FProperties[PropType] := NewValue
end
else begin
AIndex := Ord(PropType) - Ord(fpVariant);
if AIndex > High(FVariantProperties) then
SetLength(FVariantProperties, AIndex + 4);
SetLength(FVariantProperties, AIndex + 4)
else begin
FVariantProperties[AIndex].Free;
end;
FVariantProperties[AIndex]:= NewValue;
end;
if Assigned(NewValue) then
@ -626,11 +641,7 @@ end;
procedure TFile.SetNameProperty(NewValue: TFileNameProperty);
begin
FProperties[fpName] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpName)
else
Exclude(FSupportedProperties, fpName);
Properties[fpName] := NewValue;
end;
function TFile.GetAttributesProperty: TFileAttributesProperty;
@ -640,14 +651,11 @@ end;
procedure TFile.SetAttributesProperty(NewValue: TFileAttributesProperty);
begin
FProperties[fpAttributes] := NewValue;
Properties[fpAttributes] := NewValue;
if Assigned(NewValue) then
begin
Include(FSupportedProperties, fpAttributes);
UpdateNameAndExtension(Name);
end
else
Exclude(FSupportedProperties, fpAttributes);
end;
end;
function TFile.GetSizeProperty: TFileSizeProperty;
@ -657,11 +665,7 @@ end;
procedure TFile.SetSizeProperty(NewValue: TFileSizeProperty);
begin
FProperties[fpSize] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpSize)
else
Exclude(FSupportedProperties, fpSize);
Properties[fpSize] := NewValue;
end;
function TFile.GetCompressedSizeProperty: TFileCompressedSizeProperty;
@ -671,11 +675,7 @@ end;
procedure TFile.SetCompressedSizeProperty(NewValue: TFileCompressedSizeProperty);
begin
FProperties[fpCompressedSize] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpCompressedSize)
else
Exclude(FSupportedProperties, fpCompressedSize);
Properties[fpCompressedSize] := NewValue;
end;
function TFile.GetModificationTimeProperty: TFileModificationDateTimeProperty;
@ -685,11 +685,7 @@ end;
procedure TFile.SetModificationTimeProperty(NewValue: TFileModificationDateTimeProperty);
begin
FProperties[fpModificationTime] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpModificationTime)
else
Exclude(FSupportedProperties, fpModificationTime);
Properties[fpModificationTime] := NewValue;
end;
function TFile.GetCreationTimeProperty: TFileCreationDateTimeProperty;
@ -699,11 +695,7 @@ end;
procedure TFile.SetCreationTimeProperty(NewValue: TFileCreationDateTimeProperty);
begin
FProperties[fpCreationTime] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpCreationTime)
else
Exclude(FSupportedProperties, fpCreationTime);
Properties[fpCreationTime] := NewValue;
end;
function TFile.GetLastAccessTimeProperty: TFileLastAccessDateTimeProperty;
@ -713,11 +705,7 @@ end;
procedure TFile.SetLastAccessTimeProperty(NewValue: TFileLastAccessDateTimeProperty);
begin
FProperties[fpLastAccessTime] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpLastAccessTime)
else
Exclude(FSupportedProperties, fpLastAccessTime);
Properties[fpLastAccessTime] := NewValue;
end;
function TFile.GetChangeTime: TDateTime;
@ -737,11 +725,7 @@ end;
procedure TFile.SetChangeTimeProperty(AValue: TFileChangeDateTimeProperty);
begin
FProperties[fpChangeTime] := AValue;
if Assigned(AValue) then
Include(FSupportedProperties, fpChangeTime)
else
Exclude(FSupportedProperties, fpChangeTime);
Properties[fpChangeTime] := AValue;
end;
function TFile.GetLinkProperty: TFileLinkProperty;
@ -751,11 +735,7 @@ end;
procedure TFile.SetLinkProperty(NewValue: TFileLinkProperty);
begin
FProperties[fpLink] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpLink)
else
Exclude(FSupportedProperties, fpLink);
Properties[fpLink] := NewValue;
end;
function TFile.GetOwnerProperty: TFileOwnerProperty;
@ -765,11 +745,7 @@ end;
procedure TFile.SetOwnerProperty(NewValue: TFileOwnerProperty);
begin
FProperties[fpOwner] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpOwner)
else
Exclude(FSupportedProperties, fpOwner);
Properties[fpOwner] := NewValue;
end;
function TFile.GetTypeProperty: TFileTypeProperty;
@ -779,11 +755,7 @@ end;
procedure TFile.SetTypeProperty(NewValue: TFileTypeProperty);
begin
FProperties[fpType] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpType)
else
Exclude(FSupportedProperties, fpType);
Properties[fpType] := NewValue;
end;
function TFile.GetCommentProperty: TFileCommentProperty;
@ -793,13 +765,21 @@ end;
procedure TFile.SetCommentProperty(NewValue: TFileCommentProperty);
begin
FProperties[fpComment] := NewValue;
if Assigned(NewValue) then
Include(FSupportedProperties, fpComment)
else
Exclude(FSupportedProperties, fpComment);
Properties[fpComment] := NewValue;
end;
{$IFDEF DARWIN}
function TFile.GetFinderTagProperty: TFileFinderTagProperty;
begin
Result := TFileFinderTagProperty(FProperties[fpMacOSFinderTag]);
end;
procedure TFile.SetFinderTagProperty(NewValue: TFileFinderTagProperty);
begin
Properties[fpMacOSFinderTag] := NewValue;
end;
{$ENDIF}
function TFile.IsNameValid: Boolean;
begin
if Name <> '..' then

Some files were not shown because too many files have changed in this diff Show more