hfs 0.53.0 → 0.54.0-alpha3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/admin/assets/index-CcUio6cm.css +1 -0
  2. package/admin/assets/index-DCsMhd8s.js +807 -0
  3. package/admin/assets/{sha512-rpja4qx0.js → sha512-VvQJXb6I.js} +1 -1
  4. package/admin/index.html +4 -2
  5. package/frontend/assets/index-legacy-vQymU_EM.js +60 -0
  6. package/frontend/assets/{sha512-legacy-pz5im6D1.js → sha512-legacy-BD2cMJIT.js} +1 -1
  7. package/frontend/index.html +2 -2
  8. package/package.json +8 -6
  9. package/plugins/antibrute/plugin.js +1 -1
  10. package/plugins/download-counter/plugin.js +0 -15
  11. package/plugins/list-uploader/public/main.js +3 -2
  12. package/src/acme.js +2 -2
  13. package/src/adminApis.js +23 -3
  14. package/src/api.accounts.js +1 -1
  15. package/src/api.auth.js +6 -4
  16. package/src/api.get_file_list.js +18 -9
  17. package/src/api.monitor.js +1 -1
  18. package/src/api.net.js +4 -1
  19. package/src/api.plugins.js +2 -0
  20. package/src/api.vfs.js +6 -4
  21. package/src/apiMiddleware.js +4 -1
  22. package/src/auth.js +7 -7
  23. package/src/basicWeb.js +1 -1
  24. package/src/block.js +13 -1
  25. package/src/commands.js +8 -2
  26. package/src/const.js +13 -10
  27. package/src/cross-const.js +2 -1
  28. package/src/cross.js +25 -8
  29. package/src/debounceAsync.js +3 -5
  30. package/src/dirStream.js +138 -0
  31. package/src/events.js +18 -8
  32. package/src/frontEndApis.js +32 -15
  33. package/src/github.js +21 -3
  34. package/src/langs/embedded.js +4 -1
  35. package/src/langs/hfs-lang-fi.json +5 -3
  36. package/src/langs/hfs-lang-hu.json +27 -19
  37. package/src/langs/hfs-lang-it.json +2 -1
  38. package/src/langs/hfs-lang-th.json +166 -0
  39. package/src/langs/hfs-lang-tr.json +166 -0
  40. package/src/langs/hfs-lang-uk.json +170 -0
  41. package/src/langs/hfs-lang-vi.json +5 -5
  42. package/src/listen.js +12 -4
  43. package/src/log.js +1 -1
  44. package/src/makeQ.js +31 -0
  45. package/src/middlewares.js +11 -8
  46. package/src/misc.js +2 -1
  47. package/src/nat.js +4 -4
  48. package/src/perm.js +1 -1
  49. package/src/persistence.js +2 -1
  50. package/src/plugins.js +22 -3
  51. package/src/serveFile.js +16 -14
  52. package/src/serveGuiAndSharedFiles.js +9 -4
  53. package/src/serveGuiFiles.js +8 -6
  54. package/src/srp.js +2 -2
  55. package/src/update.js +48 -7
  56. package/src/upload.js +33 -18
  57. package/src/util-files.js +7 -29
  58. package/src/vfs.js +23 -11
  59. package/src/watchLoad.js +1 -1
  60. package/src/zip.js +4 -4
  61. package/README.md +0 -232
  62. package/admin/assets/index-Ly9xr1F6.js +0 -811
  63. package/admin/assets/index-gNE0rRfC.css +0 -1
  64. package/frontend/assets/index-legacy-5MEl9EM8.js +0 -60
  65. /package/frontend/assets/{polyfills-legacy-31b7nyOi.js → polyfills-legacy-DMrMt_pQ.js} +0 -0
@@ -0,0 +1,166 @@
1
+ {
2
+ "author": "Soonthorn Srichomkwan",
3
+ "version": 1.0,
4
+ "hfs_version": "0.53.0",
5
+ "translate": {
6
+ "Select": "เลือก",
7
+ "n_files": "{n} ไฟล์",
8
+ "n_folders": "{n} โฟลเดอร์",
9
+ "filter_count": "{n} ผ่าน",
10
+ "select_count": "{n} เลือก",
11
+ "filter_placeholder": "พิมพ์ที่นี่เพื่อกรองรายการด้านล่าง",
12
+ "Select some files": "เลือกบางไฟล์",
13
+ "zip_checkboxes": "ใช้กล่องตัวเลือกเพื่อเลือกไฟล์ม, หลังจากนั้นสามารถ Zip ได้อีกครั้ง",
14
+ "zip_tooltip_selected": "ดาวน์โหลดองค์ประกอบที่เลือกเป็นไฟล์ zip เดียว",
15
+ "zip_tooltip_whole": "ดาวน์โหลดรายการทั้งหมด (ไม่กรอง) เป็นไฟล์ zip เดียว หากคุณเลือกองค์ประกอบบางรายการ จะมีเพียงรายการเหล่านั้นเท่านั้นที่จะถูกดาวน์โหลด.",
16
+ "zip_confirm_search": "ดาวน์โหลดผลลัพธ์ทั้งหมดของการค้นหานี้เป็นไฟล์ ZIP หรือไม่?",
17
+ "zip_confirm_folder": "ดาวน์โหลดโฟลเดอร์ทั้งหมดเป็นไฟล์ ZIP หรือไม่?",
18
+ "select_tooltip": "การเลือกใช้กับ \"Zip\" และ \"Delete\" (เมื่อมีให้ใช้งาน) แต่คุณสามารถกรองรายการได้เช่นกัน",
19
+ "delete_hint": "หากต้องการลบ ให้คลิกเลือกก่อน",
20
+ "delete_confirm": "ต้องการลบ {n} รายการ ใช่หรือไม่?",
21
+ "delete_completed": "การลบ: {n} เสร็จสิ้น",
22
+ "delete_failed": ", {n} ล้มเหลว",
23
+ "delete_select": "เลือกบางอย่างเพื่อลบ",
24
+ "Delete": "ลบ",
25
+ "Options": "ตัวเลือก",
26
+ "Search": "ค้นหา",
27
+ "Zip": "Zip",
28
+ "search_msg": "ค้นหาโฟลเดอร์นี้และโฟลเดอร์ย่อย",
29
+ "Searching": "กำลังค้นหา",
30
+ "Searched": "ค้นหาแล้ว",
31
+ "Clear search": "ล้างการค้นหา",
32
+ "Interrupted": "ถูกขัดจังหวะ",
33
+ "stopped_before": "หยุดก่อนที่จะพบอะไร",
34
+ "empty_list": "ไม่พบอะไร",
35
+ "filter_none": "ไม่มีการตรงกันสำหรับตัวกรองนี้",
36
+ "Admin-panel": "แผงควบคุมผู้ดูแลระบบ",
37
+ "Login": "เข้าสู่ระบบ",
38
+ "Username": "ชื่อผู้ใช้",
39
+ "Password": "รหัสผ่าน",
40
+ "login_untrusted": "การเข้าสู่ระบบถูกยกเลิก: ไม่สามารถเชื่อถือตัวตนของเซิร์ฟเวอร์ได้",
41
+ "login_bad_credentials": "ข้อมูลรับรองความถูกต้องไม่ถูกต้อง",
42
+ "login_bad_cookies": "คุกกี้ไม่ทำงาน - เข้าสู่ระบบล้มเหลว",
43
+ "User panel": "แผงผู้ใช้",
44
+ "Change password": "เปลี่ยนรหัสผ่าน",
45
+ "enter_pass": "ใส่รหัสผ่านใหม่",
46
+ "enter_pass2": "ใส่รหัสผ่านใหม่ซ้ำ",
47
+ "pass2_mismatch": "รหัสผ่านที่สองที่คุณป้อนไม่ตรงกับรหัสผ่านแรก ขั้นตอนถูกยกเลิก",
48
+ "password_changed": "รหัสผ่านเปลี่ยนแล้ว",
49
+ "Logout": "ออกจากระบบ",
50
+ "connection error": "ข้อผิดพลาดในการเชื่อมต่อ",
51
+ "Full timestamp:": "แสดงเวลาเต็ม",
52
+ "Search was interrupted": "การค้นหาถูกขัดจังหวะ",
53
+ "Stop list": "หยุดรายการ",
54
+ "download_starting": "การดาวน์โหลดของคุณควรเริ่มต้นได้แล้ว",
55
+ "wrong_account": "บัญชี {u} ไม่มีสิทธิ์เข้าถึง ลองใช้บัญชีอื่น",
56
+ "no_upload_here": "ไม่มีสิทธิ์อัปโหลดสำหรับโฟลเดอร์ปัจจุบัน",
57
+ "Create folder": "สร้างโฟลเดอร์",
58
+ "Pick files": "เลือกไฟล์",
59
+ "Pick folder": "เลือกโฟลเดอร์",
60
+ "send_files": "Send {n,plural,one{# file} other{# files}}, {size}",
61
+ "Clear": "ล้าง",
62
+ "failed_upload": "ไม่สามารถอัปโหลด {name}",
63
+ "confirm_resume": "ดำเนินการอัปโหลดต่อหรือไม่?",
64
+ "file too large": "ไฟล์ใหญ่เกินไป",
65
+ "Enter folder name": "ใส่ชื่อโฟลเดอร์",
66
+ "Successfully created": "สร้างสำเร็จ",
67
+ "enter_folder": "ใส่โฟลเดอร์",
68
+ "folder_exists": "โฟลเดอร์ที่มีชื่อเดียวกันมีอยู่แล้ว",
69
+ "Sort by:": "จัดเรียงโดย: {by}",
70
+ "name": "ชื่อ",
71
+ "extension": "นามสกุล",
72
+ "size": "ขนาด",
73
+ "time": "เวลา",
74
+ "Invert order": "สลับลำดับ",
75
+ "Folders first": "โฟลเดอร์ก่อน",
76
+ "Numeric names": "ชื่อตัวเลข",
77
+ "theme:": "theme:",
78
+ "auto": "อัตโนมัติ",
79
+ "light": "สว่าง",
80
+ "dark": "มืด",
81
+ "parent folder": "โฟลเดอร์หลัก",
82
+ "home": "หน้าแรก",
83
+ "Continue": "ดำเนินการต่อ",
84
+ "Confirm": "ยืนยัน",
85
+ "Don't": "ไม่",
86
+ "Warning": "คำเตือน",
87
+ "Error": "ข้อผิดพลาด",
88
+ "Info": "ข้อมูล",
89
+ "Unauthorized": "ไม่ได้รับอนุญาต",
90
+ "Forbidden": "ห้าม",
91
+ "Not found": "ไม่พบ",
92
+ "Server error": "ข้อผิดพลาดของเซิร์ฟเวอร์",
93
+ "Upload": "อัปโหลด",
94
+ "upload_concluded": "การอัปโหลดเสร็จสิ้น:",
95
+ "upload_finished": "{n} เสร็จสิ้น ({size})",
96
+ "upload_errors": "{n} ล้มเหลว",
97
+ "upload_file_rejected": "บางไฟล์ไม่ได้รับการยอมรับ",
98
+ "File menu": "เมนูไฟล์",
99
+ "Folder menu": "เมนูโฟลเดอร์",
100
+ "Name": "ชื่อ",
101
+ "file_open": "เปิด",
102
+ "Download": "ดาวน์โหลด",
103
+ "Missing permission": "ไม่มีสิทธิ์",
104
+ "Reload": "โหลดใหม่",
105
+ "Get list": "รับรายการ",
106
+ "Skip existing files": "ข้ามไฟล์ที่มีอยู่",
107
+ "Size": "ขนาด",
108
+ "Timestamp": "แสดงเวลา",
109
+ "Show": "แสดง",
110
+ "Loading failed": "การโหลดล้มเหลว",
111
+ "Rename": "เปลี่ยนชื่อ",
112
+ "Tiles mode:": "Tiles mode:",
113
+ "off": "ปิด",
114
+ "Operation successful": "การดำเนินงานประสบความสำเร็จ",
115
+ "Uploader": "โปรแกรมอัปโหลด",
116
+ "Download counter": "ตัวนับการดาวน์โหลด",
117
+ "Switch zoom mode": "สลับโหมดซูม",
118
+ "Full screen": "เต็มหน้า",
119
+ "File Show help": "แสดงความช่วยเหลือไฟล์",
120
+ "showHelpMain": "คุณสามารถใช้คีย์บอร์ดสำหรับบางการกระทำ:",
121
+ "showHelp_←/→": "←/→",
122
+ "showHelp_↑/↓": "↑/↓",
123
+ "showHelp_space": "space",
124
+ "showHelp_←/→_body": "ไปยังไล์ก่อนหน้า/ถัดไป",
125
+ "showHelp_↑/↓_body": "Scroll tall images",
126
+ "Destination": "ปลายทาง",
127
+ "in_queue": "{n} ในคิว",
128
+ "enter_comment": "ความคิดเห็นสำหรับ {name}",
129
+ "Comment": "ความคิดเห็น",
130
+ "upload_dd_hint": "คุณสามารถอัปโหลดไฟล์โดยการลากและวางในรายการไฟล์",
131
+ "Upload not available": "ไม่สามารถอัปโหลดได้",
132
+ "Cut": "ตัด",
133
+ "n_items": "{n,plural, one{# item} other{# items}}",
134
+ "good_bad": "{good} ย้าย, {bad} ล้มเหลว",
135
+ "after_cut": "การเลือกของคุณอยู่ในคลิปบอร์ดแล้ว\nไปยังโฟลเดอร์ปลายทางเพื่อวาง",
136
+ "Cancel clipboard": "ยกเลิกคลิปบอร์ด",
137
+ "to_clipboard_source": "กลับไปยังโฟลเดอร์ต้นทาง",
138
+ "Paste": "วาง",
139
+ "clipboard_list": "รายการในคลิปบอร์ด:",
140
+ "Close": "ปิด",
141
+ "Folder": "โฟลเดอร์",
142
+ "Web page": "เวปเพจ",
143
+ "Link": "ลิงก์",
144
+ "Auto-play": "เล่นอัตโนมัติ",
145
+ "autoplay_seconds": "รอภาพสักครู่",
146
+ "Select all": "เลือกทั้งหมด",
147
+ "go_first": "ไปยังรายการแรก",
148
+ "go_last": "ไปยังรายการสุดท้าย",
149
+ "Shuffle": "สับเปลี่ยน",
150
+ "Repeat": "ทำซ้ำ",
151
+ "showHelpListShortcut": "จากรายการไฟล์ คลิกค้าง {key} เพื่อแสดงอย่างรวดเร็ว",
152
+ "Invalid value": "ค่าที่ไม่ถูกต้อง",
153
+ "upload_skipped": "{n} ข้าม",
154
+ "Overwrite policy": "นโยบายการเขียนทับ",
155
+ "Rename to avoid overwriting": "เปลี่ยนชื่อเพื่อหลีกเลี่ยงการเขียนทับ",
156
+ "Overwrite existing files": "เขียนทับไฟล์ที่มีอยู่",
157
+ "Menu": "เมนู",
158
+ "clipboard": "คลิปบอร์ด ({content})",
159
+ "to_clipboard_source_tooltip": "ไปยังโฟลเดอร์ที่มีเนื้อหาคลิปบอร์ด",
160
+ "more_items": "{n} รายการเพิ่มเติม",
161
+ "Show details": "แสดงรายละเอียด",
162
+ "upload_conflict": "มีอยู่แล้ว",
163
+ "Logged in": "เข้าสู่ระบบ",
164
+ "Logged out": "ออกจากระบบ"
165
+ }
166
+ }
@@ -0,0 +1,166 @@
1
+ {
2
+ "author": "cbr00t",
3
+ "version": 1.0,
4
+ "hfs_version": "0.53.0",
5
+ "translate": {
6
+ "Select": "Seç",
7
+ "n_files": "{n,plural,one{# dosya} other{# dosya}}",
8
+ "n_folders": "{n,plural,one{# klasör} other{# klasör}}",
9
+ "filter_count": "{n,plural, one{# filtrelendi} other{# filtrelendi}}",
10
+ "select_count": "{n,plural, one{# seçildi} other{# seçildi}}",
11
+ "filter_placeholder": "Aşağıdaki listeyi filtrelemek için buraya yazın",
12
+ "Select some files": "Dosyaları Seç",
13
+ "zip_checkboxes": "Doyaları seçmek için onay kutularını kullanın, sonra tekrar ZIP yapın",
14
+ "zip_tooltip_selected": "Seçilen öğeleri tekil ZIP dosyası olarak indir",
15
+ "zip_tooltip_whole": "Tüm listeyi tekil ZIP dosyası olarak indir (filtrelenmemiş). Eğer bazı öğeleri seçerseniz, sadece onlar dahil edilecek.",
16
+ "zip_confirm_search": "Aramadaki TÜM SONUÇLAR, ZIP Arşivi olarak indirilsin mi?",
17
+ "zip_confirm_folder": "TÜM KLASÖR, ZIP Arşivi olarak indirilsin mi?",
18
+ "select_tooltip": "Yapılan seçim \"ZIP\" ve \"Sil\" işlemlerine uygulanır (mümkünse) ancak ayrıca listeye filtre uygulayabilirsiniz",
19
+ "delete_hint": "Silmek için önce SEÇ butonuna tıklayın",
20
+ "delete_confirm": "{n,plural, one{# öğeyi} other{# öğeyi}} Delete?",
21
+ "delete_completed": "{n} öğe SİLİNDİ",
22
+ "delete_failed": ", {n,plural, one{# başarısız} other{# başarısız}}",
23
+ "delete_select": "SİLİNECEK Öğeleri seç",
24
+ "Delete": "SİL",
25
+ "Options": "Ayarlar",
26
+ "Search": "Arama Yap",
27
+ "Zip": "Zip",
28
+ "search_msg": "Bu Klasörde ve Alt Klasörlerde arama yap",
29
+ "Searching": "Aranıyor",
30
+ "Searched": "Arama Bitti",
31
+ "Clear search": "Aramayı temizle",
32
+ "Interrupted": "Yarıda kesildi",
33
+ "stopped_before": "Herhangi birşey bulmadan önce durduruldu",
34
+ "empty_list": "Burada birşey yok",
35
+ "filter_none": "Filtreye uygun eşleşme yok",
36
+ "Admin-panel": "Admin Paneli",
37
+ "Login": "Giriş Yap",
38
+ "Username": "Kullanıcı",
39
+ "Password": "Şifre",
40
+ "login_untrusted": "Oturum Açma iptal: Sunucu kimliğine güvenilmedi",
41
+ "login_bad_credentials": "Hatalı oturum bilgileri",
42
+ "login_bad_cookies": "Çerezler (Cookies) çalışmıyor - Oturum Açma başarısız",
43
+ "User panel": "Kullanıcı Paneli",
44
+ "Change password": "Şifre Değiştir",
45
+ "enter_pass": "Yeni Şifreyi Gir",
46
+ "enter_pass2": "Yeni Şifreyi (TEKRAR) Gir",
47
+ "pass2_mismatch": "İkinci girilen şifre, ilki ile eşleşmedi. Süreç iptal.",
48
+ "password_changed": "Şifre değiştirildi!",
49
+ "Logout": "Oturum Kapat",
50
+ "connection error": "İletişim sorunu",
51
+ "Full timestamp:": "Tam Zaman Damgası:",
52
+ "Search was interrupted": "Arama yarıda kesildi",
53
+ "Stop list": "Listelemeyi Durdur",
54
+ "download_starting": "indirme işlemi şimdi başlayacak",
55
+ "wrong_account": "{u} Kullanıcı Hesabının erişimi yok, başka bir kullanıcı ile deneyiniz",
56
+ "no_upload_here": "Bu klasöre UPLOAD yetkiniz yok",
57
+ "Create folder": "Klasör Oluştur",
58
+ "Pick files": "Dosya(lar)ı Seç",
59
+ "Pick folder": "Klasör Seç",
60
+ "send_files": "{n,plural,one{# file} other{# files}} dosyayı gönder (UPLOAD), {size}",
61
+ "Clear": "Temizle",
62
+ "failed_upload": "{name} UPLOAD edilemedi (veri aktarım sorunu)",
63
+ "confirm_resume": "UPLOAD kaldığı yerden devam etsin mi?",
64
+ "file too large": "dosya çok büyük",
65
+ "Enter folder name": "Klasör ismi girin",
66
+ "Successfully created": "Başarıyla oluşturuldu",
67
+ "enter_folder": "Klasöre Gir",
68
+ "folder_exists": "Aynı isimde başka bir Klasör zaten var",
69
+ "Sort by:": "Sırala: {by}",
70
+ "name": "İsim",
71
+ "extension": "Uzantı",
72
+ "size": "Boyut",
73
+ "time": "Zaman",
74
+ "Invert order": "Ters Sıra",
75
+ "Folders first": "Önce Klasörler",
76
+ "Numeric names": "Sayısal İsimler",
77
+ "theme:": "tema:",
78
+ "auto": "otomatik",
79
+ "light": "aydınlık (light)",
80
+ "dark": "karanlık (dark)",
81
+ "parent folder": "Üst Klasör",
82
+ "home": "Ev (Home)",
83
+ "Continue": "Devam",
84
+ "Confirm": "Onay",
85
+ "Don't": "YAPMA",
86
+ "Warning": "Uyarı",
87
+ "Error": "Hata",
88
+ "Info": "Bilgi",
89
+ "Unauthorized": "Yetki Yok",
90
+ "Forbidden": "Yasak",
91
+ "Not found": "Bulunamadı",
92
+ "Server error": "Sunucu hatası",
93
+ "Upload": "Upload",
94
+ "upload_concluded": "Upload concluded:",
95
+ "upload_finished": "{n} tamamlandı ({size})",
96
+ "upload_errors": "{n} başarısız",
97
+ "upload_file_rejected": "Bazı dosyalar kabul edilmiyor",
98
+ "File menu": "Dosya Menüsü",
99
+ "Folder menu": "Klasör Menüsü",
100
+ "Name": "İsim",
101
+ "file_open": "Aç",
102
+ "Download": "İndir (Download)",
103
+ "Missing permission": "Eksik Yetki",
104
+ "Reload": "Yeniden Yükle",
105
+ "Get list": "Listeyi Al",
106
+ "Skip existing files": "Mevcut Dosyaları Atla",
107
+ "Size": "Boyut",
108
+ "Timestamp": "Zaman Damgası",
109
+ "Show": "Göster",
110
+ "Loading failed": "Yükleme başarısız",
111
+ "Rename": "Yeniden Adlandır",
112
+ "Tiles mode:": "Döşeme (Tiles) modu:",
113
+ "off": "kapalı",
114
+ "Operation successful": "İşlem başarılı",
115
+ "Uploader": "Yükleyici (Uploader)",
116
+ "Download counter": "İndirme sayacı",
117
+ "Switch zoom mode": "Zoom moduna geç",
118
+ "Full screen": "Tam Ekran",
119
+ "File Show help": "Dosya Yardım göster",
120
+ "showHelpMain": "Bazı eylemler için klavyeyi kullanabilirsiniz:",
121
+ "showHelp_←/→": "←/→",
122
+ "showHelp_↑/↓": "↑/↓",
123
+ "showHelp_space": "boşluk",
124
+ "showHelp_←/→_body": "Önceki/Sonraki Dosyaya Git",
125
+ "showHelp_↑/↓_body": "Uzun Resimleri scroll yap",
126
+ "Destination": "Hedef",
127
+ "in_queue": "{n} kuyrukta",
128
+ "enter_comment": "{name} için Açıklama (Comment)",
129
+ "Comment": "Açıklama (Comment)",
130
+ "upload_dd_hint": "Dosyaları buradaki Dosya Listesine Sürükle&Bırak da yapabilirsiniz",
131
+ "Upload not available": "Upload imkanı yok",
132
+ "Cut": "Kes",
133
+ "n_items": "{n,plural, one{# öğe} other{# öğe}}",
134
+ "good_bad": "{good} taşındı, {bad} başarısız",
135
+ "after_cut": "Seçim şuan Panoda (Clipboard). \nHedef Klasöre gidin ve Yapıştır (Paste) yapın.",
136
+ "Cancel clipboard": "Panoyu (Clipboard) Temizle",
137
+ "to_clipboard_source": "Kaynak Klasöre Geri Dön",
138
+ "Paste": "Yapıştır (Paste)",
139
+ "clipboard_list": "Panodaki (Clipboard) öğeler:",
140
+ "Close": "Kapat",
141
+ "Folder": "Klasör",
142
+ "Web page": "Web Sayfası",
143
+ "Link": "Link",
144
+ "Auto-play": "Oto-Oynat",
145
+ "autoplay_seconds": "Resimler için bekle (saniye)",
146
+ "Select all": "Tümünü Seç",
147
+ "go_first": "İlk Öğeye git",
148
+ "go_last": "Son Öğeye git",
149
+ "Shuffle": "Karıştır (Shuffle)",
150
+ "Repeat": "Tekrarlar (Repeat)",
151
+ "showHelpListShortcut": "Dosya Listesinde {key} tuşuna basılı durumda tıklayarak, hızlıca Göster yapabilirsiniz",
152
+ "Invalid value": "Geçersiz değer",
153
+ "upload_skipped": "{n} atlandı",
154
+ "Overwrite policy": "Üzerine Yazma politikası",
155
+ "Rename to avoid overwriting": "Üzerine Yazmadan kaçınmak için Yeniden Adlandır",
156
+ "Overwrite existing files": "Mevcut Dosyaların üzerine yaz",
157
+ "Menu": "Menü",
158
+ "clipboard": "Pano/Clipboard ({content})",
159
+ "to_clipboard_source_tooltip": "Pano içeriklerinin konumlandığı klasöre gidiniz",
160
+ "more_items": "{n} daha fazla öğe",
161
+ "Show details": "Detayları göster",
162
+ "upload_conflict": "zaten var",
163
+ "Logged in": "Oturum Açıldı",
164
+ "Logged out": "Oturum Kapandı"
165
+ }
166
+ }
@@ -0,0 +1,170 @@
1
+ {
2
+ "author": "m.ksy",
3
+ "version": 1.0,
4
+ "hfs_version": "0.53.0",
5
+ "translate": {
6
+ "Select": "Вибір",
7
+ "n_files": "{n,plural, one{# файл} few{# файли} many{# файлів}}",
8
+ "n_folders": "{n,plural, one{# тека} few{# теки} many{# тек}}",
9
+ "filter_count": "{n,plural, one{# елемент} few{# елементи} many{# елементів}}",
10
+ "select_count": "{n,plural, one{Вибрано #} other{Вибрано #}}",
11
+ "filter_placeholder": "Введіть текст для фільтрації списку",
12
+ "Select some files": "Виділіть файли",
13
+ "zip_checkboxes": "Виділіть потрібні файли і знову натисніть zip",
14
+ "zip_tooltip_selected": "Завантажити вибрані елементи у zip-архіві",
15
+ "zip_tooltip_whole": "Вибрати файли для завантаження в zip-архіві. Якщо файли не вибрані, то буде завантажена вся тека",
16
+ "zip_confirm_search": "Завантажити всі результати пошуку в одному zip-архіві",
17
+ "zip_confirm_folder": "Завантажити всю теку як zip-архів?",
18
+ "select_tooltip": "Дозволяє вибрати файли для скачування або видалення, а також використовувати фільтри для швидкого пошуку",
19
+ "delete_hint": "Для видалення файлів спочатку натисніть Вибір",
20
+ "delete_confirm": "Видалити {n,plural, one{# елемент} few{# елементи} many{# елементів}}?",
21
+ "delete_completed": "{n,plural, one{Видалений} other{Видалено}} {n,plural, one{# елемент} few{# елементи} many{# елементів}}",
22
+ "delete_failed": ", {n} неуспішно",
23
+ "delete_select": "Виділіть елементи для видалення",
24
+ "Delete": "Видалити",
25
+ "Options": "Налаштування",
26
+ "Search": "Пошук",
27
+ "Zip": "Zip",
28
+ "search_msg": "Пошук у поточній та вкладених теках",
29
+ "Searching": "Іде пошук",
30
+ "Searched": "Результати пошуку",
31
+ "Clear search": "Скасувати пошук",
32
+ "Interrupted": "Перервано",
33
+ "stopped_before": "Пошук зупинено",
34
+ "empty_list": "Тут нічого немає",
35
+ "filter_none": "Жоден елемент не відповідає фільтру",
36
+ "Admin-panel": "Панель адміністратора",
37
+ "Login": "Вхід",
38
+ "Username": "Ім'я користувача",
39
+ "Password": "Пароль",
40
+ "login_untrusted": "Вхід скасовано: особистість сервера не має довіри",
41
+ "login_bad_credentials": "Неправильне ім'я користувача або пароль",
42
+ "login_bad_cookies": "Не вдалося увійти - відключені cookies",
43
+ "User panel": "Панель користувача",
44
+ "Change password": "Змінити пароль",
45
+ "enter_pass": "Введіть новий пароль",
46
+ "enter_pass2": "Повторіть пароль",
47
+ "pass2_mismatch": "Введені паролі не збігаються",
48
+ "password_changed": "Пароль успішно змінено",
49
+ "Logout": "Вийти",
50
+ "connection error": "Помилка з'єднання",
51
+ "Full timestamp:": "Дата і час: ",
52
+ "Search was interrupted": "Пошук перервано",
53
+ "Stop list": "Зупинити",
54
+ "upload_starting": "Завантаження почалося",
55
+ "wrong_account": "Користувач {u} не має доступу до цієї теки",
56
+ "no_upload_here": "Немає доступу до завантаження файлів в цій теці",
57
+ "Create folder": "Створити теку",
58
+ "Pick files": "Вибрати файли",
59
+ "Pick folder": "Вибрати теку",
60
+ "send_files": "Завантажити {n,plural, one{# файл} few{# файли} many{# файлів}}, {size}",
61
+ "Clear": "Очистити",
62
+ "failed_upload": "Не вдалося завантажити {name}",
63
+ "confirm_resume": "Відновити завантаження?",
64
+ "file too large": "занадто великий файл",
65
+ "Enter folder name": "Введіть назву теки",
66
+ "Successfully created": "Успішно створено",
67
+ "enter_folder": "Перейти до теки",
68
+ "folder_exists": "Тека вже існує",
69
+ "Sort by:": "Сортування за: {by}",
70
+ "name": "назвою",
71
+ "extension": "розширенням",
72
+ "size": "розміром",
73
+ "time": "часом",
74
+ "Invert order": "Інвертувати",
75
+ "Folders first": "Спочатку теки",
76
+ "Numeric names": "Спочатку цифри",
77
+ "theme:": "Тема:",
78
+ "auto": "авто",
79
+ "light": "світла",
80
+ "dark": "темна",
81
+ "parent folder": "Батьківська тека",
82
+ "home": "Коренева тека",
83
+ "Continue": "Продовжити",
84
+ "Confirm": "Підтвердити",
85
+ "Don't": "Ні",
86
+ "Warning": "Увага",
87
+ "Error": "Помилка",
88
+ "Info": "Інформація",
89
+ "Unauthorized": "Вхід не виконано",
90
+ "Forbidden": "Заборонено",
91
+ "Not found": "Не знайдено",
92
+ "Server error": "Помилка сервера",
93
+ "Upload": "Завантажити",
94
+ "upload_concluded": "Завантаження закінчено:",
95
+ "upload_finished": "{n,plural, one{# файл завантажено} few{# файли завантажено} many{# файлів завантажено}} ({size})",
96
+ "upload_errors": "{n,plural, one{# файл} few{# файли} many{# файлів}} неуспішно",
97
+ "upload_file_rejected": "Деякі файли не були прийняті",
98
+ "File menu": "Меню файлу",
99
+ "Folder menu": "Меню теки",
100
+ "Name": "Назва",
101
+ "file_open": "Відкрити",
102
+ "Download": "Завантажити",
103
+ "Missing permission": "Відсутній доступ",
104
+ "Reload": "Оновити",
105
+ "Get list": "Отримати список",
106
+ "Skip existing files": "Пропуск існуючих файлів",
107
+ "Size": "Розмір",
108
+ "Timestamp": "Дата",
109
+ "Show": "Перегляд файлу",
110
+ "Loading failed": "Не вдалося завантажити",
111
+ "Rename": "Перейменувати",
112
+ "Tiles mode:": "Плитки:",
113
+ "off": "вимкнено",
114
+ "Operation successful": "Операція успішна",
115
+ "Uploader": "Завантажувач",
116
+ "Download counter": "Лічильник завантажень",
117
+ "Switch zoom mode": "Переключити збільшення",
118
+ "Full screen": "Повний екран",
119
+ "File Show help": "Допомога",
120
+ "showHelpMain": "Для деяких дій можна використовувати клавіатуру:",
121
+ "showHelp_←/→": "←/→",
122
+ "showHelp_↑/↓": "↑/↓",
123
+ "showHelp_space": "пробіл",
124
+ "showHelp_←/→_body": "попередній/наступний файл",
125
+ "showHelp_↑/↓_body": "прокручування високих зображень",
126
+ "showHelp_space_body": "вибрати файл",
127
+ "showHelp_D_body": "завантажити",
128
+ "showHelp_Z_body": "перемикання збільшення",
129
+ "showHelp_F_body": "повноекранний режим",
130
+ "Destination": "Призначення",
131
+ "in_queue": "{n} у черзі",
132
+ "enter_comment": "Коментар для {name}",
133
+ "Comment": "Коментувати",
134
+ "upload_dd_hint": "Ви можете завантажити файли, перетягнувши їх до списку файлів",
135
+ "Upload not available": "Завантаження недоступне",
136
+ "Cut": "Вирізати",
137
+ "n_items": "{n,plural, one{# елемент} few{# елементи} many{# елементів}}",
138
+ "good_bad": "{good} {good,plural, one{переміщений} other{переміщено}}, {bad} неуспішно",
139
+ "after_cut": "Вибране скопійовано до буфера обміну.\nПерейдіть до теки призначення для вставки.",
140
+ "Cancel clipboard": "Очистити буфер обміну",
141
+ "to_clipboard_source": "У теку",
142
+ "Paste": "Вставити",
143
+ "clipboard_list": "Елементи в буфері обміну:",
144
+ "Close": "Закрити",
145
+ "Folder": "тека",
146
+ "Web page": "Веб адреса",
147
+ "Link": "Посилання",
148
+ "Auto-play": "Автовідтворення",
149
+ "autoplay_seconds": "Скільки секунд чекати між зображеннями",
150
+ "Select all": "Вибрати все",
151
+ "go_first": "До першого елемента",
152
+ "go_last": "До останнього елемента",
153
+ "Shuffle": "Перемішати",
154
+ "Repeat": "Повтор",
155
+ "showHelpListShortcut": "Зі списку файлів натисніть {key} щоб швидко відкрити Перегляд файлу",
156
+ "Invalid value": "Недійсне значення",
157
+ "upload_skipped": "{n,plural, one{# пропущено} other{# пропущено}}",
158
+ "Overwrite policy": "Правило перезапису",
159
+ "Rename to avoid overwriting": "Перейменувати, щоб уникнути перезапису",
160
+ "Overwrite existing files": "Перезаписати існуючі файли",
161
+ "Menu": "Меню",
162
+ "clipboard": "Буфер обміну ({content})",
163
+ "to_clipboard_source_tooltip": "Перейти до теки, де знаходиться вміст з буфера обміну",
164
+ "more_items": "Ще {rest} елементів",
165
+ "Show details": "Показати деталі",
166
+ "upload_conflict": "вже існує",
167
+ "Logged in": "Вхід виконано",
168
+ "Logged out": "Вихід виконано"
169
+ }
170
+ }
@@ -34,7 +34,7 @@
34
34
  "empty_list": "Trống",
35
35
  "filter_none": "Ko có gì để lọc",
36
36
  "Admin-panel": "Admin-panel",
37
- "Login": "Đăng nhập nàh",
37
+ "Login": "Đăng nhập",
38
38
  "Username": "Username",
39
39
  "Password": "Password",
40
40
  "login_untrusted": "Đăng nhập bị hủy bỏ: danh tính máy chủ không tin cậy",
@@ -46,7 +46,7 @@
46
46
  "enter_pass2": "NHẬP LẠI pass mới (giống nha)",
47
47
  "pass2_mismatch": "Mật khẩu ghi lại SAI, tiến trình bị hủy bỏ.",
48
48
  "password_changed": "Đã đổi pass thành công",
49
- "Logout": "Đăng xuất nàh",
49
+ "Logout": "Đăng xuất",
50
50
  "connection error": "Lỗi kết nối",
51
51
  "Full timestamp:": "Dấu thời gian đầy đủ:",
52
52
  "Search was interrupted": "Tìm kiếm bị gián đoạn!",
@@ -76,8 +76,8 @@
76
76
  "Numeric names": "Tên số",
77
77
  "theme:": "Màu:",
78
78
  "auto": "Auto",
79
- "light": "SÁNG NHƯ CỦA ĐẢNG",
80
- "dark": "Dark bủh lmao",
79
+ "light": "Trắng Như Ngọc Trinh",
80
+ "dark": "Đen Như Bao Công",
81
81
  "parent folder": "Trở về thư mục trước",
82
82
  "home": "Trang chủ",
83
83
  "Continue": "Tiếp tục",
@@ -114,7 +114,7 @@
114
114
  "off": "Tắt",
115
115
  "Operation successful": "Thành công",
116
116
  "Uploader": "Người upload",
117
- "Switch zoom mode": "Chuyển qua mode zoom",
117
+ "Switch zoom mode": "Chuyển qua mode Zoom",
118
118
  "Full screen": "Full màn",
119
119
  "File Show help": "File Show help",
120
120
  "showHelpMain": "Có thể dùng bàn phím ntn:",
package/src/listen.js CHANGED
@@ -184,10 +184,17 @@ for (const cfg of httpsNeeds) {
184
184
  exports.httpsPortCfg = (0, config_1.defineConfig)('https_port', const_1.PORT_DISABLED);
185
185
  exports.httpsPortCfg.sub(considerHttps);
186
186
  listenInterface.sub(considerHttps);
187
+ function renderHost(host) {
188
+ return (0, misc_1.xlate)(host, {
189
+ '0.0.0.0': "any IPv4",
190
+ '::': "any IPv6",
191
+ '': "any network",
192
+ });
193
+ }
187
194
  function startServer(srv, { port, host }) {
188
195
  return new Promise(async (resolve) => {
189
196
  if (!srv)
190
- return 0;
197
+ return resolve(0);
191
198
  try {
192
199
  if (port === const_1.PORT_DISABLED || !host && !await testIpV4()) // !host means ipV4+6, and if v4 port alone is busy we won't be notified of the failure, so we'll first test it on its own
193
200
  return resolve(0);
@@ -195,7 +202,7 @@ function startServer(srv, { port, host }) {
195
202
  srv.on('checkContinue', (req, res) => srv.emit('request', req, res));
196
203
  port = await listen(host);
197
204
  if (port)
198
- console.log(srv.name, "serving on", host || "any network", ':', port);
205
+ console.log(srv.name, "serving on", renderHost(host || ''), ':', port);
199
206
  resolve(port);
200
207
  }
201
208
  catch (e) {
@@ -283,7 +290,8 @@ exports.getServerStatus = getServerStatus;
283
290
  const ignore = /^(lo|.*loopback.*|virtualbox.*|.*\(wsl\).*|llw\d|awdl\d|utun\d|anpi\d)$/i; // avoid giving too much information
284
291
  const isLinkLocal = (0, misc_1.makeNetMatcher)('169.254.0.0/16|FE80::/16');
285
292
  async function getIps(external = true) {
286
- const ips = (0, misc_1.onlyTruthy)(Object.entries((0, os_1.networkInterfaces)()).flatMap(([name, nets]) => nets && !ignore.test(name) && nets.map(net => !net.internal && net.address)));
293
+ const only = { '0.0.0.0': 'IPv4', '::': 'IPv6' }[listenInterface.get()] || '';
294
+ const ips = (0, misc_1.onlyTruthy)(Object.entries((0, os_1.networkInterfaces)()).flatMap(([name, nets]) => nets && !ignore.test(name) && nets.map(net => !net.internal && (!only || only === net.family) && net.address)));
287
295
  const e = external && nat_1.defaultBaseUrl.externalIp;
288
296
  if (e && !ips.includes(e))
289
297
  ips.push(e);
@@ -298,7 +306,7 @@ async function getIps(external = true) {
298
306
  exports.getIps = getIps;
299
307
  async function getUrls() {
300
308
  const on = listenInterface.get();
301
- const ips = on ? [on] : await getIps();
309
+ const ips = on === renderHost(on) ? [on] : await getIps();
302
310
  return Object.fromEntries((0, misc_1.onlyTruthy)([httpSrv, httpsSrv].map(srv => {
303
311
  var _a;
304
312
  if (!(srv === null || srv === void 0 ? void 0 : srv.listening))
package/src/log.js CHANGED
@@ -141,7 +141,7 @@ const logMw = async (ctx, next) => {
141
141
  const length = (_c = ctx.state.length) !== null && _c !== void 0 ? _c : ctx.length;
142
142
  const uri = ctx.originalUrl;
143
143
  ctx.logExtra(ctx.state.includesLastByte && ctx.vfsNode && ctx.res.finished && { dl: 1 }
144
- || ctx.state.op === 'upload' && { size: ctx.state.opTotal, ul: ctx.state.uploads });
144
+ || ctx.state.uploadPath && { size: ctx.state.opTotal, ul: ctx.state.uploads });
145
145
  if (conn === null || conn === void 0 ? void 0 : conn.country)
146
146
  ctx.logExtra({ country: conn.country });
147
147
  if (logUA.get())
package/src/makeQ.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeQ = void 0;
4
+ function makeQ(parallelization = 1) {
5
+ const running = new Set();
6
+ const queued = [];
7
+ return {
8
+ add(toAdd) {
9
+ queued.push(toAdd);
10
+ setTimeout(startNextIfPossible); // avoid nesting/stacking of jobs
11
+ },
12
+ isWorking() { return running.size > 0; },
13
+ isFree() { return running.size < parallelization; },
14
+ };
15
+ function startNextIfPossible() {
16
+ while (running.size < parallelization) {
17
+ const job = queued.pop();
18
+ if (!job)
19
+ break; // finished
20
+ const working = job(); // start the job
21
+ if (!working)
22
+ continue; // it was canceled
23
+ running.add(working);
24
+ working.then(() => {
25
+ running.delete(working);
26
+ startNextIfPossible();
27
+ });
28
+ }
29
+ }
30
+ }
31
+ exports.makeQ = makeQ;