From 76e5b812d745d6588c2950173ea052aeb9ed61ac Mon Sep 17 00:00:00 2001 From: Tony Kuker Date: Sat, 11 Feb 2023 12:34:43 -0600 Subject: [PATCH 01/30] Update version for next development version --- cpp/shared/piscsi_version.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/shared/piscsi_version.cpp b/cpp/shared/piscsi_version.cpp index d6e3c60c..53bd973b 100644 --- a/cpp/shared/piscsi_version.cpp +++ b/cpp/shared/piscsi_version.cpp @@ -14,8 +14,8 @@ // The following should be updated for each release const int piscsi_major_version = 23; // Last two digits of year -const int piscsi_minor_version = 2; // Month -const int piscsi_patch_version = 1; // Patch number - increment for each update +const int piscsi_minor_version = 3; // Month +const int piscsi_patch_version = -1; // Patch number - increment for each update using namespace std; From f2b74046dd68e85e00aca4af56ec8d42cabb3bab Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 13 Feb 2023 13:20:57 -0800 Subject: [PATCH 02/30] Add noscript tag with notice when JavaScript is off (#1091) --- python/web/src/templates/upload.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index c76aecb0..533e9ac9 100644 --- a/python/web/src/templates/upload.html +++ b/python/web/src/templates/upload.html @@ -54,4 +54,6 @@ } + + {% endblock content %} From cfc3390b81a97d86d7b26c98ce69c124d34e50f3 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Tue, 14 Feb 2023 18:48:53 -0800 Subject: [PATCH 03/30] Noscript fallback messages; relocate js into templates (#1097) --- python/web/src/static/themes/modern/style.css | 9 +++++++++ python/web/src/templates/base.html | 14 ------------- python/web/src/templates/index.html | 20 +++++++++++++++++++ python/web/src/templates/upload.html | 8 +++++++- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/python/web/src/static/themes/modern/style.css b/python/web/src/static/themes/modern/style.css index 978d9c6a..f7fb707d 100644 --- a/python/web/src/static/themes/modern/style.css +++ b/python/web/src/static/themes/modern/style.css @@ -53,6 +53,15 @@ input[type="radio"] { margin: 0 0.1rem 0 0.75rem; } +div.noscriptmsg { + background: var(--danger); + border-radius: var(--border-radius); + padding: 0.5rem; + font-size: 0.75rem; + display: inline-block; + color: #fff; +} + /* ------------------------------------------------------------------------------ Tables diff --git a/python/web/src/templates/base.html b/python/web/src/templates/base.html index e3c0f75b..6beb33be 100644 --- a/python/web/src/templates/base.html +++ b/python/web/src/templates/base.html @@ -23,20 +23,6 @@ - - - - diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index 06adc9b5..d6aa285f 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -1,6 +1,18 @@ {% extends "base.html" %} {% block content %} + +
@@ -380,6 +392,14 @@

{{ _("Upload Files (new tab)") }}

+
diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index 533e9ac9..73a205a2 100644 --- a/python/web/src/templates/upload.html +++ b/python/web/src/templates/upload.html @@ -20,6 +20,8 @@ + + - + {% endblock content %} From 983cff735b7be4c6a2436e4f4ff369592b17d4c5 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Fri, 24 Feb 2023 12:58:51 -0800 Subject: [PATCH 04/30] Descriptive comments for each h/fdisk command (#1106) --- python/common/src/piscsi/file_cmds.py | 69 ++++++++++----------------- 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/python/common/src/piscsi/file_cmds.py b/python/common/src/piscsi/file_cmds.py index 346080d7..19959608 100644 --- a/python/common/src/piscsi/file_cmds.py +++ b/python/common/src/piscsi/file_cmds.py @@ -317,56 +317,39 @@ class FileCmds: server_info = self.piscsi.get_server_info() full_file_path = Path(server_info["image_dir"]) / file_name - # Inject hfdisk commands to create Drive with correct partitions - # https://www.codesrc.com/mediawiki/index.php/HFSFromScratch - # i initialize partition map - # continue with default first block - # C Create 1st partition with type specified next) - # continue with default - # 32 32 blocks (required for HFS+) - # Driver_Partition Partition Name - # Apple_Driver Partition Type (available types: Apple_Driver, - # Apple_Driver43, Apple_Free, Apple_HFS...) - # C Create 2nd partition with type specified next - # continue with default first block - # continue with default block size (rest of the disk) - # ${volumeName} Partition name provided by user - # Apple_HFS Partition Type - # w Write partition map to disk - # y Confirm partition table - # p Print partition map + # Inject hfdisk commands to create Mac partition table with HFS partitions if disk_format == "HFS": partitioning_tool = "hfdisk" commands = [ - "i", - "", - "C", - "", - "32", - "Driver_Partition", - "Apple_Driver", - "C", - "", - "", - volume_name, - "Apple_HFS", - "w", - "y", - "p", + "i", # Initialize partition map + "", # Continue with default first block + "C", # Create 1st partition with type specified next) + "", # Continue with default + "32", # 32 block (required for HFS+) + "Driver_Partition", # Partition Name + "Apple_Driver", # Partition Type + "C", # Create 2nd partition with type specified next + "", # Continue with default first block + "", # Continue with default block size (rest of the disk) + volume_name, # Partition name + "Apple_HFS", # Partition Type + "w", # Write partition map to disk + "y", # Confirm partition table + "p", # Print partition map (for the log) ] - # Create a DOS label, primary partition, W95 FAT type + # Inject fdisk commands to create primary FAT partition with MS-DOS label elif disk_format == "FAT": partitioning_tool = "fdisk" commands = [ - "o", - "n", - "p", - "", - "", - "", - "t", - "b", - "w", + "o", # create a new empty DOS partition table + "n", # add a new partition + "p", # primary partition + "", # default partition number + "", # default first sector + "", # default last sector + "t", # change partition type + "b", # choose W95 FAT32 type + "w", # write table to disk and exit ] try: process = Popen( From dd00547f92a7b4d221978d2419b529c25df27263 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Fri, 24 Feb 2023 17:28:58 -0800 Subject: [PATCH 05/30] Formatted image file data structure that breaks down by subdir (#1102) - New utility method for the web app, which sorts image files into dicts where the subdir is the key - In the web ui, display each subdir in a table nested in a details tag. - Allow for picking destination subdir when uploading files - Style the expandable details blocks in the images table - Add a check for ~ paths to the is_safe_path() utility method --- .../web/src/static/themes/classic/style.css | 9 ++++ python/web/src/static/themes/modern/style.css | 12 +++++- python/web/src/templates/index.html | 42 ++++++++++++------- python/web/src/templates/upload.html | 8 ++++ python/web/src/web.py | 22 ++++++---- python/web/src/web_utils.py | 32 +++++++++++++- python/web/tests/api/test_files.py | 1 + 7 files changed, 99 insertions(+), 27 deletions(-) diff --git a/python/web/src/static/themes/classic/style.css b/python/web/src/static/themes/classic/style.css index 1399a6a7..23b4ab88 100644 --- a/python/web/src/static/themes/classic/style.css +++ b/python/web/src/static/themes/classic/style.css @@ -104,6 +104,15 @@ ul.inline_list { list-style: none; } +summary.dirname { + text-decoration: underline; + font-family: monospace; +} + +summary.filename { + text-decoration: underline; +} + .dropzone, .dropzone * { box-sizing: border-box; } diff --git a/python/web/src/static/themes/modern/style.css b/python/web/src/static/themes/modern/style.css index f7fb707d..361f5bed 100644 --- a/python/web/src/static/themes/modern/style.css +++ b/python/web/src/static/themes/modern/style.css @@ -53,7 +53,7 @@ input[type="radio"] { margin: 0 0.1rem 0 0.75rem; } -div.noscriptmsg { +div.notice { background: var(--danger); border-radius: var(--border-radius); padding: 0.5rem; @@ -717,6 +717,16 @@ section#files p { margin-top: 1rem; } +section#files details.subdir summary.dirname { + text-decoration: underline; + font-family: monospace; + margin: 0.5rem 0; +} + +section#files details.contents summary.filename { + text-decoration: underline; +} + @media (max-width: 900px) { section#files table#images tr th:nth-child(2), section#files table#images tr td:nth-child(2) { diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index d6aa285f..ae4e4dc2 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -209,6 +209,19 @@
+{% if not files|length: %} +
+ {{ _("The images directory is currently empty.") }} +
+{% else %} + +
+{% for subdir, group in formatted_image_files.items() %} + +
+ + {{ subdir }} + @@ -216,19 +229,12 @@ - {% if not files|length: %} - - - - {% endif %} - {% for file in files|sort(attribute='name') %} + {% for file in group|sort(attribute='name') %} {% if file["prop"] %} {% elif file["archive_contents"] %}
{{ _("Size") }} {{ _("Actions") }}
- {{ _("The images directory is currently empty.") }} -
-
- +
+ {{ file["name"] }}
    @@ -244,8 +250,8 @@
-
- +
+ {{ file["name"] }}
    @@ -253,8 +259,8 @@ {% if not member["is_properties_file"] %}
  • {% if member["related_properties_file"] %} -
    - +
    +
    @@ -361,6 +367,12 @@ {% endfor %}
+{% if subdir != "/" %} +
+{% endif %} +{% endfor %} +
+{% endif %}

{{ _("%(disk_space)s MiB disk space remaining on the system", disk_space=env["free_disk_space"]) }}

@@ -396,7 +408,7 @@ -
+
{{ _("The file uploading functionality requires JavaScript.") }}
diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index 73a205a2..9a8df9e8 100644 --- a/python/web/src/templates/upload.html +++ b/python/web/src/templates/upload.html @@ -14,6 +14,14 @@ + diff --git a/python/web/src/web.py b/python/web/src/web.py index c0b780a5..f7b09148 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -49,6 +49,7 @@ from web_utils import ( map_device_types_and_names, get_device_name, map_image_file_descriptions, + format_image_list, format_drive_properties, get_properties_by_drive_name, auth_active, @@ -223,12 +224,7 @@ def index(): image_files = file_cmd.list_images() config_files = file_cmd.list_config_files() ip_addr, host = sys_cmd.get_ip_and_host() - - extended_image_files = [] - for image in image_files["files"]: - if image["detected_type"] != "UNDEFINED": - image["detected_type_name"] = device_types[image["detected_type"]]["name"] - extended_image_files.append(image) + formatted_image_files = format_image_list(image_files["files"], device_types) attached_images = [] units = 0 @@ -266,7 +262,8 @@ def index(): bridge_configured=sys_cmd.is_bridge_setup(), devices=formatted_devices, attached_images=attached_images, - files=extended_image_files, + formatted_image_files=formatted_image_files, + files=image_files["files"], config_files=config_files, device_types=device_types, scan_depth=server_info["scan_depth"], @@ -317,10 +314,13 @@ def upload_page(): """ Sets up the data structures and kicks off the rendering of the file uploading page """ + image_files = file_cmd.list_images() + formatted_image_files = format_image_list(image_files["files"]) return response( template="upload.html", page_title=_("PiSCSI File Upload"), + formatted_image_files=formatted_image_files, max_file_size=int(int(MAX_FILE_SIZE) / 1024 / 1024), CFG_DIR=CFG_DIR, FILE_SERVER_DIR=FILE_SERVER_DIR, @@ -990,15 +990,19 @@ def upload_file(): return make_response(auth["msg"], 403) destination = request.form.get("destination") + subdir = request.form.get("subdir") if destination == "disk_images": + safe_path = is_safe_path(Path(subdir)) + if not safe_path["status"]: + return make_response(safe_path["msg"], 403) server_info = piscsi_cmd.get_server_info() - destination_dir = server_info["image_dir"] + destination_dir = Path(server_info["image_dir"]) / subdir elif destination == "shared_files": destination_dir = FILE_SERVER_DIR elif destination == "piscsi_config": destination_dir = CFG_DIR else: - return make_response("Invalid destination", 403) + return make_response("Unknown destination", 403) return upload_with_dropzonejs(destination_dir) diff --git a/python/web/src/web_utils.py b/python/web/src/web_utils.py index c9a42dc4..e007619f 100644 --- a/python/web/src/web_utils.py +++ b/python/web/src/web_utils.py @@ -7,6 +7,7 @@ from grp import getgrall from os import path from pathlib import Path from ua_parser import user_agent_parser +from re import findall from flask import request, make_response from flask_babel import _ @@ -146,6 +147,33 @@ def get_image_description(file_suffix): return file_suffix +def format_image_list(image_files, device_types=None): + """ + Takes a (list) of (dict) image_files and optional (list) device_types + Returns a formatted (dict) with groups of image_files per subdir key + """ + + root_image_files = [] + subdir_image_files = {} + for image in image_files: + if (image["detected_type"] != "UNDEFINED") and device_types: + image["detected_type_name"] = device_types[image["detected_type"]]["name"] + subdir_path = findall("^.*/", image["name"]) + if subdir_path: + subdir = subdir_path[0] + if subdir in subdir_image_files.keys(): + subdir_image_files[f"images/{subdir}"].append(image) + else: + subdir_image_files[f"images/{subdir}"] = [image] + else: + root_image_files.append(image) + + formatted_image_files = dict(sorted(subdir_image_files.items())) + if root_image_files: + formatted_image_files["images/"] = root_image_files + return formatted_image_files + + def format_drive_properties(drive_properties): """ Takes a (dict) with structured drive properties data @@ -256,10 +284,10 @@ def is_safe_path(file_name): Returns True if the path is safe Returns False if the path is either absolute, or tries to traverse the file system """ - if file_name.is_absolute() or ".." in str(file_name): + if file_name.is_absolute() or ".." in str(file_name) or str(file_name)[0] == "~": return { "status": False, - "msg": _("%(file_name)s is not a valid path", file_name=file_name), + "msg": _("No permission to use path '%(file_name)s'", file_name=file_name), } return {"status": True, "msg": ""} diff --git a/python/web/tests/api/test_files.py b/python/web/tests/api/test_files.py index 0bdc3edd..7da66f12 100644 --- a/python/web/tests/api/test_files.py +++ b/python/web/tests/api/test_files.py @@ -254,6 +254,7 @@ def test_upload_file(http_client, delete_file): form_data = { "destination": "disk_images", + "subdir": "", "dzuuid": str(uuid.uuid4()), "dzchunkindex": chunk_number, "dzchunksize": chunk_size, From 1082b6a7b49a232e0e159a44820c9fea1143e6ac Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sun, 26 Feb 2023 14:15:13 -0800 Subject: [PATCH 06/30] Fix bugs in image subdir logic (#1108) --- python/web/src/templates/index.html | 2 -- python/web/src/web_utils.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index ae4e4dc2..8ab45539 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -367,9 +367,7 @@ {% endfor %} -{% if subdir != "/" %} -{% endif %} {% endfor %}
{% endif %} diff --git a/python/web/src/web_utils.py b/python/web/src/web_utils.py index e007619f..3cf71b3e 100644 --- a/python/web/src/web_utils.py +++ b/python/web/src/web_utils.py @@ -161,7 +161,7 @@ def format_image_list(image_files, device_types=None): subdir_path = findall("^.*/", image["name"]) if subdir_path: subdir = subdir_path[0] - if subdir in subdir_image_files.keys(): + if f"images/{subdir}" in subdir_image_files.keys(): subdir_image_files[f"images/{subdir}"].append(image) else: subdir_image_files[f"images/{subdir}"] = [image] From 059a31ba5391516f10ee74dd537b1aa8537227f0 Mon Sep 17 00:00:00 2001 From: Tony Kuker <34318535+akuker@users.noreply.github.com> Date: Sun, 26 Feb 2023 20:29:32 -0600 Subject: [PATCH 07/30] add special option for pi-gen for building piscsi images (#1107) Co-authored-by: Tony Kuker --- easyinstall.sh | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/easyinstall.sh b/easyinstall.sh index 2b70994f..cb0efd17 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -87,6 +87,12 @@ function initialChecks() { fi } +# Only to be used for pi-gen automated install +function cacheSudo() { + echo "Caching sudo password" + echo raspberry | sudo -v -S +} + # checks that the current user has sudoers privileges function sudoCheck() { if [[ $HEADLESS ]]; then @@ -1359,6 +1365,25 @@ function runChoice() { installPackagesStandalone compilePiscsi ;; + 99) + echo "Hidden setup mode for running the pi-gen utility" + echo "This shouldn't be used by normal users" + sudoCache + createImagesDir + createCfgDir + updatePiscsiGit + installPackages + installHfdisk + fetchHardDiskDrivers + compilePiscsi + installPiscsi + enablePiscsiService + preparePythonCommon + cachePipPackages + installPiscsiWebInterface + installWebInterfaceService + echo "Automated install of the PiSCSI Service $(CONNECT_TYPE) complete!" + ;; -h|--help|h|help) showMenu ;; @@ -1372,7 +1397,7 @@ function runChoice() { function readChoice() { choice=-1 - until [ $choice -ge "0" ] && [ $choice -le "16" ]; do + until [ $choice -ge "0" ] && ([ $choice -eq "99" ] || [ $choice -le "16" ]) ; do echo -n "Enter your choice (0-16) or CTRL-C to exit: " read -r choice done From bf97201580349ffb22fbb25048c744af1d2a7ea0 Mon Sep 17 00:00:00 2001 From: nsafran1217 <54966414+nsafran1217@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:52:19 -0500 Subject: [PATCH 08/30] Add support for SCSI-1 CD Drives, .is1 extension (#1109) * Add SCSI-1 option for scsicd with file extension is1 Update tests Update documentation with is1 file extension * Fix tests --- cpp/devices/device_factory.cpp | 4 +++- cpp/devices/scsicd.cpp | 5 +++-- cpp/devices/scsicd.h | 3 ++- cpp/piscsi/piscsi_core.cpp | 3 ++- cpp/test/device_factory_test.cpp | 4 +++- cpp/test/piscsi_response_test.cpp | 2 +- cpp/test/scsicd_test.cpp | 2 ++ doc/piscsi.1 | 1 + doc/piscsi_man_page.txt | 1 + 9 files changed, 18 insertions(+), 7 deletions(-) diff --git a/cpp/devices/device_factory.cpp b/cpp/devices/device_factory.cpp index 92449ac5..321162f7 100644 --- a/cpp/devices/device_factory.cpp +++ b/cpp/devices/device_factory.cpp @@ -59,6 +59,7 @@ DeviceFactory::DeviceFactory() extension_mapping["hdr"] = SCRM; extension_mapping["mos"] = SCMO; extension_mapping["iso"] = SCCD; + extension_mapping["is1"] = SCCD; device_mapping["bridge"] = SCBR; device_mapping["daynaport"] = SCDP; @@ -118,7 +119,8 @@ shared_ptr DeviceFactory::CreateDevice(PbDeviceType type, int lun break; case SCCD: - device = make_shared(lun, sector_sizes.find(SCCD)->second); + device = make_shared(lun, sector_sizes.find(SCCD)->second, + GetExtensionLowerCase(filename) == "is1" ? scsi_level::SCSI_1_CCS : scsi_level::SCSI_2); device->SetProduct("SCSI CD-ROM"); break; diff --git a/cpp/devices/scsicd.cpp b/cpp/devices/scsicd.cpp index a8db610e..bcea0386 100644 --- a/cpp/devices/scsicd.cpp +++ b/cpp/devices/scsicd.cpp @@ -21,7 +21,8 @@ using namespace scsi_defs; using namespace scsi_command_util; -SCSICD::SCSICD(int lun, const unordered_set& sector_sizes) : Disk(SCCD, lun) +SCSICD::SCSICD(int lun, const unordered_set& sector_sizes, scsi_defs::scsi_level level) + : Disk(SCCD, lun), scsi_level(level) { SetSectorSizes(sector_sizes); @@ -164,7 +165,7 @@ void SCSICD::ReadToc() vector SCSICD::InquiryInternal() const { - return HandleInquiry(device_type::CD_ROM, scsi_level::SCSI_2, true); + return HandleInquiry(device_type::CD_ROM, scsi_level, true); } void SCSICD::SetUpModePages(map>& pages, int page, bool changeable) const diff --git a/cpp/devices/scsicd.h b/cpp/devices/scsicd.h index 1263a14e..e30ab743 100644 --- a/cpp/devices/scsicd.h +++ b/cpp/devices/scsicd.h @@ -22,7 +22,7 @@ class SCSICD : public Disk, private ScsiMmcCommands { public: - SCSICD(int, const unordered_set&); + SCSICD(int, const unordered_set&, scsi_defs::scsi_level = scsi_level::SCSI_2); ~SCSICD() override = default; bool Init(const unordered_map&) override; @@ -43,6 +43,7 @@ private: void AddCDROMPage(map>&, bool) const; void AddCDDAPage(map>&, bool) const; + scsi_defs::scsi_level scsi_level; void OpenIso(); void OpenPhysical(); diff --git a/cpp/piscsi/piscsi_core.cpp b/cpp/piscsi/piscsi_core.cpp index 401199e7..ff6ecc18 100644 --- a/cpp/piscsi/piscsi_core.cpp +++ b/cpp/piscsi/piscsi_core.cpp @@ -62,7 +62,8 @@ void Piscsi::Banner(const vector& args) const cout << " hdi : SCSI HD image (Anex86 HD image)\n"; cout << " nhd : SCSI HD image (T98Next HD image)\n"; cout << " mos : SCSI MO image (MO image)\n"; - cout << " iso : SCSI CD image (ISO 9660 image)\n" << flush; + cout << " iso : SCSI CD image (ISO 9660 image)\n"; + cout << " is1 : SCSI CD image (ISO 9660 image, SCSI-1)\n" << flush; exit(EXIT_SUCCESS); } diff --git a/cpp/test/device_factory_test.cpp b/cpp/test/device_factory_test.cpp index 7f41c415..def637b6 100644 --- a/cpp/test/device_factory_test.cpp +++ b/cpp/test/device_factory_test.cpp @@ -29,6 +29,7 @@ TEST(DeviceFactoryTest, GetTypeForFile) EXPECT_EQ(device_factory.GetTypeForFile("test.hdr"), SCRM); EXPECT_EQ(device_factory.GetTypeForFile("test.mos"), SCMO); EXPECT_EQ(device_factory.GetTypeForFile("test.iso"), SCCD); + EXPECT_EQ(device_factory.GetTypeForFile("test.is1"), SCCD); EXPECT_EQ(device_factory.GetTypeForFile("test.suffix.iso"), SCCD); EXPECT_EQ(device_factory.GetTypeForFile("bridge"), SCBR); EXPECT_EQ(device_factory.GetTypeForFile("daynaport"), SCDP); @@ -79,7 +80,7 @@ TEST(DeviceFactoryTest, GetExtensionMapping) DeviceFactory device_factory; unordered_map mapping = device_factory.GetExtensionMapping(); - EXPECT_EQ(9, mapping.size()); + EXPECT_EQ(10, mapping.size()); EXPECT_EQ(SCHD, mapping["hd1"]); EXPECT_EQ(SCHD, mapping["hds"]); EXPECT_EQ(SCHD, mapping["hda"]); @@ -89,6 +90,7 @@ TEST(DeviceFactoryTest, GetExtensionMapping) EXPECT_EQ(SCRM, mapping["hdr"]); EXPECT_EQ(SCMO, mapping["mos"]); EXPECT_EQ(SCCD, mapping["iso"]); + EXPECT_EQ(SCCD, mapping["is1"]); } TEST(DeviceFactoryTest, GetDefaultParams) diff --git a/cpp/test/piscsi_response_test.cpp b/cpp/test/piscsi_response_test.cpp index a735040e..168eb5bc 100644 --- a/cpp/test/piscsi_response_test.cpp +++ b/cpp/test/piscsi_response_test.cpp @@ -221,5 +221,5 @@ TEST(PiscsiResponseTest, GetMappingInfo) const auto& info = response.GetMappingInfo(result); EXPECT_TRUE(result.status()); - EXPECT_EQ(9, info->mapping().size()); + EXPECT_EQ(10, info->mapping().size()); } diff --git a/cpp/test/scsicd_test.cpp b/cpp/test/scsicd_test.cpp index 7b7f9315..925ad06d 100644 --- a/cpp/test/scsicd_test.cpp +++ b/cpp/test/scsicd_test.cpp @@ -30,6 +30,8 @@ void ScsiCdTest_SetUpModePages(map>& pages) TEST(ScsiCdTest, Inquiry) { TestInquiry(SCCD, device_type::CD_ROM, scsi_level::SCSI_2, "PiSCSI SCSI CD-ROM ", 0x1f, true); + + TestInquiry(SCCD, device_type::CD_ROM, scsi_level::SCSI_1_CCS, "PiSCSI SCSI CD-ROM ", 0x1f, true, ".is1"); } TEST(ScsiCdTest, SetUpModePages) diff --git a/doc/piscsi.1 b/doc/piscsi.1 index 53fadf68..a40418e2 100644 --- a/doc/piscsi.1 +++ b/doc/piscsi.1 @@ -34,6 +34,7 @@ PiSCSI will determine the type of device based upon the file extension of the FI hda: SCSI Hard Disk image (Apple compatible - typically used with Macintosh computers) mos: SCSI Magneto-Optical image (generic - typically used with NeXT, X68000, etc.) iso: SCSI CD-ROM or DVD-ROM image (ISO 9660 image) + is1: SCSI CD-ROM or DVD-ROM image (ISO 9660 image, SCSI-1) For example, if you want to specify an Apple-compatible HD image on ID 0, you can use the following command: sudo piscsi -ID0 /path/to/drive/hdimage.hda diff --git a/doc/piscsi_man_page.txt b/doc/piscsi_man_page.txt index 22b64a80..727a4982 100644 --- a/doc/piscsi_man_page.txt +++ b/doc/piscsi_man_page.txt @@ -29,6 +29,7 @@ DESCRIPTION hda: SCSI Hard Disk image (Apple compatible - typically used with Macintosh computers) mos: SCSI Magneto-Optical image (generic - typically used with NeXT, X68000, etc.) iso: SCSI CD-ROM or DVD-ROM image (ISO 9660 image) + is1: SCSI CD-ROM or DVD-ROM image (ISO 9660 image, SCSI-1) For example, if you want to specify an Apple-compatible HD image on ID 0, you can use the following command: sudo piscsi -ID0 /path/to/drive/hdimage.hda From 282c639438d9ca80d86f8e3649370a76cddcd2b3 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 27 Feb 2023 14:26:30 -0800 Subject: [PATCH 09/30] Netatalk: Configure atalkd to use piscsi_bridge by default - Inject piscsi_bridge into atalkd.conf if in use (#1088) - Pass more parameters to the Netatalk script (cores, headless, no make clean, no packages) - Bump to Netatalk 2.x 230202 --- easyinstall.sh | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/easyinstall.sh b/easyinstall.sh index cb0efd17..83cdf52d 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -713,8 +713,9 @@ function setupWirelessNetworking() { # Downloads, compiles, and installs Netatalk (AppleShare server) function installNetatalk() { - NETATALK_VERSION="2-230201" + NETATALK_VERSION="230202" NETATALK_CONFIG_PATH="/etc/netatalk" + NETATALK_OPTIONS="--cores=$CORES --share-name='$FILE_SHARE_NAME' --share-path='$FILE_SHARE_PATH'" if [ -d "$NETATALK_CONFIG_PATH" ]; then echo @@ -742,14 +743,26 @@ function installNetatalk() { fi fi - echo "Downloading netatalk-$NETATALK_VERSION to $HOME" + echo + echo "Downloading tarball to $HOME..." cd $HOME || exit 1 - wget -O "netatalk-$NETATALK_VERSION.tar.gz" "https://github.com/rdmark/Netatalk-2.x/archive/refs/tags/netatalk-$NETATALK_VERSION.tar.gz" Date: Tue, 28 Feb 2023 22:46:52 -0800 Subject: [PATCH 10/30] Fix bugs in the upload to images form (#1111) * Fix formatting of the image subdir list for uploading * Fix upload path --- python/web/src/templates/upload.html | 5 +---- python/web/src/web.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index 9a8df9e8..11c269b5 100644 --- a/python/web/src/templates/upload.html +++ b/python/web/src/templates/upload.html @@ -15,11 +15,8 @@ diff --git a/python/web/src/web.py b/python/web/src/web.py index f7b09148..0e15fd59 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -990,7 +990,7 @@ def upload_file(): return make_response(auth["msg"], 403) destination = request.form.get("destination") - subdir = request.form.get("subdir") + subdir = request.form.get("subdir").replace("images/", "", 1) if destination == "disk_images": safe_path = is_safe_path(Path(subdir)) if not safe_path["status"]: From 3de66af55c675f656354f4ddc96a1be34a592a77 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Thu, 2 Mar 2023 13:51:22 -0800 Subject: [PATCH 11/30] Use one core with the compiler by default (#1114) --- easyinstall.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/easyinstall.sh b/easyinstall.sh index 83cdf52d..9f3a30d5 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -49,8 +49,7 @@ echo -e $logo CONNECT_TYPE="FULLSPEC" # clang v11 is the latest distributed by Buster COMPILER="clang++-11" -# Takes half of the CPU cores available, to avoid running out of memory on low spec devices -CORES=$(awk 'BEGIN { x = '$(nproc)'; y = 2; print (x / y) }' | numfmt --round=up --format=%.0f) +CORES=1 USER=$(whoami) BASE=$(dirname "$(readlink -f "${0}")") CPP_PATH="$BASE/cpp" From 5fd0dc420b076520fc8e42119748c792ccf8725f Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sat, 4 Mar 2023 16:57:32 -0800 Subject: [PATCH 12/30] WebUI: Traverse target dir to get subdirs to download/upload to (#1115) --- python/common/src/piscsi/file_cmds.py | 24 ++++++++++++++-- python/web/src/templates/index.html | 12 ++++++++ python/web/src/templates/upload.html | 13 +++++++-- python/web/src/web.py | 41 +++++++++++++++++++-------- python/web/tests/api/test_files.py | 12 +++++--- 5 files changed, 81 insertions(+), 21 deletions(-) diff --git a/python/common/src/piscsi/file_cmds.py b/python/common/src/piscsi/file_cmds.py index 19959608..5987f1c7 100644 --- a/python/common/src/piscsi/file_cmds.py +++ b/python/common/src/piscsi/file_cmds.py @@ -4,7 +4,7 @@ Module for methods reading from and writing to the file system import logging import asyncio -from os import walk +from os import walk, path from functools import lru_cache from pathlib import PurePath, Path from zipfile import ZipFile, is_zipfile @@ -57,7 +57,7 @@ class FileCmds: # noinspection PyMethodMayBeStatic def list_config_files(self): """ - Finds fils with file ending CONFIG_FILE_SUFFIX in CFG_DIR. + Finds files with file ending CONFIG_FILE_SUFFIX in CFG_DIR. Returns a (list) of (str) files_list """ files_list = [] @@ -67,6 +67,26 @@ class FileCmds: files_list.append(file) return files_list + # noinspection PyMethodMayBeStatic + def list_subdirs(self, directory): + """ + Finds subdirs within the (str) directory dir. + Returns a (list) of (str) subdir_list. + """ + subdir_list = [] + # Filter out file sharing meta data dirs + excluded_dirs = ("Network Trash Folder", "Temporary Items", "TheVolumeSettingsFolder") + for root, dirs, _files in walk(directory, topdown=True): + # Strip out dirs that begin with . + dirs[:] = [d for d in dirs if not d[0] == "."] + for dir in dirs: + if dir not in excluded_dirs: + dirpath = path.join(root, dir) + subdir_list.append(dirpath.replace(directory, "", 1)) + + subdir_list.sort() + return subdir_list + def list_images(self): """ Sends a IMAGE_FILES_INFO command to the server diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index 8ab45539..b9d74cc4 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -393,8 +393,20 @@ + + diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index 11c269b5..67d6b57f 100644 --- a/python/web/src/templates/upload.html +++ b/python/web/src/templates/upload.html @@ -14,13 +14,20 @@
- + {% for dir in images_subdirs %} + {% endfor %} + +
diff --git a/python/web/src/web.py b/python/web/src/web.py index 0e15fd59..40d9b032 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -275,6 +275,8 @@ def index(): image_suffixes_to_create=image_suffixes_to_create, valid_image_suffixes=valid_image_suffixes, drive_properties=format_drive_properties(APP.config["PISCSI_DRIVE_PROPERTIES"]), + images_subdirs=file_cmd.list_subdirs(server_info["image_dir"]), + shared_subdirs=file_cmd.list_subdirs(FILE_SERVER_DIR), RESERVATIONS=RESERVATIONS, CFG_DIR=CFG_DIR, FILE_SERVER_DIR=FILE_SERVER_DIR, @@ -314,13 +316,13 @@ def upload_page(): """ Sets up the data structures and kicks off the rendering of the file uploading page """ - image_files = file_cmd.list_images() - formatted_image_files = format_image_list(image_files["files"]) + server_info = piscsi_cmd.get_server_info() return response( template="upload.html", page_title=_("PiSCSI File Upload"), - formatted_image_files=formatted_image_files, + images_subdirs=file_cmd.list_subdirs(server_info["image_dir"]), + shared_subdirs=file_cmd.list_subdirs(FILE_SERVER_DIR), max_file_size=int(int(MAX_FILE_SIZE) / 1024 / 1024), CFG_DIR=CFG_DIR, FILE_SERVER_DIR=FILE_SERVER_DIR, @@ -959,11 +961,22 @@ def download_file(): """ destination = request.form.get("destination") url = request.form.get("url") - if destination == "shared_files": - destination_dir = FILE_SERVER_DIR - else: + images_subdir = request.form.get("images_subdir") + shared_subdir = request.form.get("shared_subdir") + if destination == "disk_images": + safe_path = is_safe_path(Path("." + images_subdir)) + if not safe_path["status"]: + return make_response(safe_path["msg"], 403) server_info = piscsi_cmd.get_server_info() - destination_dir = server_info["image_dir"] + destination_dir = server_info["image_dir"] + images_subdir + elif destination == "shared_files": + safe_path = is_safe_path(Path("." + shared_subdir)) + if not safe_path["status"]: + return make_response(safe_path["msg"], 403) + destination_dir = FILE_SERVER_DIR + shared_subdir + else: + return response(error=True, message=_("Unknown destination")) + process = file_cmd.download_to_dir(url, destination_dir, Path(url).name) process = ReturnCodeMapper.add_msg(process) if process["status"]: @@ -990,19 +1003,23 @@ def upload_file(): return make_response(auth["msg"], 403) destination = request.form.get("destination") - subdir = request.form.get("subdir").replace("images/", "", 1) + images_subdir = request.form.get("images_subdir") + shared_subdir = request.form.get("shared_subdir") if destination == "disk_images": - safe_path = is_safe_path(Path(subdir)) + safe_path = is_safe_path(Path("." + images_subdir)) if not safe_path["status"]: return make_response(safe_path["msg"], 403) server_info = piscsi_cmd.get_server_info() - destination_dir = Path(server_info["image_dir"]) / subdir + destination_dir = server_info["image_dir"] + images_subdir elif destination == "shared_files": - destination_dir = FILE_SERVER_DIR + safe_path = is_safe_path(Path("." + shared_subdir)) + if not safe_path["status"]: + return make_response(safe_path["msg"], 403) + destination_dir = FILE_SERVER_DIR + shared_subdir elif destination == "piscsi_config": destination_dir = CFG_DIR else: - return make_response("Unknown destination", 403) + return make_response(_("Unknown destination"), 403) return upload_with_dropzonejs(destination_dir) diff --git a/python/web/tests/api/test_files.py b/python/web/tests/api/test_files.py index 7da66f12..8239dd22 100644 --- a/python/web/tests/api/test_files.py +++ b/python/web/tests/api/test_files.py @@ -207,7 +207,8 @@ def test_extract_file( http_client.post( "/files/download_url", data={ - "destination": "images", + "destination": "disk_images", + "images_subdir": "/", "url": url, }, ) @@ -254,7 +255,7 @@ def test_upload_file(http_client, delete_file): form_data = { "destination": "disk_images", - "subdir": "", + "images_subdir": "/", "dzuuid": str(uuid.uuid4()), "dzchunkindex": chunk_number, "dzchunksize": chunk_size, @@ -334,6 +335,7 @@ def test_download_properties(http_client, list_files, delete_file): def test_download_url_to_dir(env, httpserver, http_client, list_files, delete_file): file_name = str(uuid.uuid4()) http_path = f"/images/{file_name}" + subdir = "/" url = httpserver.url_for(http_path) with open("tests/assets/test_image.hds", mode="rb") as file: @@ -347,7 +349,8 @@ def test_download_url_to_dir(env, httpserver, http_client, list_files, delete_fi response = http_client.post( "/files/download_url", data={ - "destination": "images", + "destination": "disk_images", + "images_subdir": subdir, "url": url, }, ) @@ -358,7 +361,8 @@ def test_download_url_to_dir(env, httpserver, http_client, list_files, delete_fi assert response_data["status"] == STATUS_SUCCESS assert file_name in list_files() assert ( - response_data["messages"][0]["message"] == f"{file_name} downloaded to {env['images_dir']}" + response_data["messages"][0]["message"] + == f"{file_name} downloaded to {env['images_dir']}{subdir}" ) # Cleanup From f5ac9376b1890df8b631f487dcb1f69bcaccf502 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 6 Mar 2023 09:17:28 -0800 Subject: [PATCH 13/30] Allow copy and move file operations to opt-in to overwrite. (#1120) - Allow create, copy and move file operations to opt-in to overwrite - Use this when extracting packaged properties to avoid it getting stuck in the images dir - Better error handling in common file operation methods --- python/common/src/piscsi/file_cmds.py | 68 ++++++++++++++++++------ python/common/src/piscsi/return_codes.py | 2 + python/web/src/return_code_mapper.py | 4 ++ 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/python/common/src/piscsi/file_cmds.py b/python/common/src/piscsi/file_cmds.py index 5987f1c7..a64298ae 100644 --- a/python/common/src/piscsi/file_cmds.py +++ b/python/common/src/piscsi/file_cmds.py @@ -166,7 +166,15 @@ class FileCmds: parameters = {"file_path": file_path} if file_path.exists(): - file_path.unlink() + try: + file_path.unlink() + except OSError as error: + logging.error(error) + return { + "status": False, + "return_code": ReturnCodes.DELETEFILE_UNABLE_TO_DELETE, + "parameters": parameters, + } return { "status": True, "return_code": ReturnCodes.DELETEFILE_SUCCESS, @@ -179,18 +187,28 @@ class FileCmds: } # noinspection PyMethodMayBeStatic - def rename_file(self, file_path, target_path): + def rename_file(self, file_path, target_path, overwrite_target=False): """ Takes: - (Path) file_path for the file to rename - (Path) target_path for the name to rename + - optional (bool) overwrite_target Returns (dict) with (bool) status, (str) msg, (dict) parameters """ parameters = {"target_path": target_path} if not target_path.parent.exists(): target_path.parent.mkdir(parents=True) - if target_path.parent.exists() and not target_path.exists(): - file_path.rename(target_path) + + if overwrite_target or not target_path.exists(): + try: + file_path.rename(target_path) + except OSError as error: + logging.error(error) + return { + "status": False, + "return_code": ReturnCodes.RENAMEFILE_UNABLE_TO_MOVE, + "parameters": parameters, + } return { "status": True, "return_code": ReturnCodes.RENAMEFILE_SUCCESS, @@ -198,23 +216,33 @@ class FileCmds: } return { "status": False, - "return_code": ReturnCodes.RENAMEFILE_UNABLE_TO_MOVE, + "return_code": ReturnCodes.WRITEFILE_COULD_NOT_OVERWRITE, "parameters": parameters, } # noinspection PyMethodMayBeStatic - def copy_file(self, file_path, target_path): + def copy_file(self, file_path, target_path, overwrite_target=False): """ Takes: - (Path) file_path for the file to copy from - (Path) target_path for the name to copy to + - optional (bool) overwrite_target Returns (dict) with (bool) status, (str) msg, (dict) parameters """ parameters = {"target_path": target_path} if not target_path.parent.exists(): target_path.parent.mkdir(parents=True) - if target_path.parent.exists() and not target_path.exists(): - copyfile(str(file_path), str(target_path)) + + if overwrite_target or not target_path.exists(): + try: + copyfile(str(file_path), str(target_path)) + except OSError as error: + logging.error(error) + return { + "status": False, + "return_code": ReturnCodes.WRITEFILE_COULD_NOT_WRITE, + "parameters": parameters, + } return { "status": True, "return_code": ReturnCodes.WRITEFILE_SUCCESS, @@ -222,32 +250,41 @@ class FileCmds: } return { "status": False, - "return_code": ReturnCodes.WRITEFILE_COULD_NOT_WRITE, + "return_code": ReturnCodes.WRITEFILE_COULD_NOT_OVERWRITE, "parameters": parameters, } - def create_empty_image(self, target_path, size): + def create_empty_image(self, target_path, size, overwrite_target=False): """ - Takes (Path) target_path and (int) size in bytes - Creates a new empty binary file to use as image + Creates a new empty binary file to use as image. + Takes: + - (Path) target_path + - (int) size in bytes + - optional (bool) overwrite_target Returns (dict) with (bool) status, (str) msg, (dict) parameters """ parameters = {"target_path": target_path} if not target_path.parent.exists(): target_path.parent.mkdir(parents=True) - if target_path.parent.exists() and not target_path.exists(): + + if overwrite_target or not target_path.exists(): try: with open(f"{target_path}", "wb") as out: out.seek(size - 1) out.write(b"\0") except OSError as error: - return {"status": False, "msg": str(error)} + logging.error(error) + return { + "status": False, + "return_code": ReturnCodes.WRITEFILE_COULD_NOT_WRITE, + "parameters": parameters, + } return {"status": True, "msg": ""} return { "status": False, - "return_code": ReturnCodes.WRITEFILE_COULD_NOT_WRITE, + "return_code": ReturnCodes.WRITEFILE_COULD_NOT_OVERWRITE, "parameters": parameters, } @@ -282,6 +319,7 @@ class FileCmds: if self.rename_file( Path(file["absolute_path"]), prop_path, + overwrite_target=True, ): properties_files_moved.append( { diff --git a/python/common/src/piscsi/return_codes.py b/python/common/src/piscsi/return_codes.py index d1ea9764..cfd8265c 100644 --- a/python/common/src/piscsi/return_codes.py +++ b/python/common/src/piscsi/return_codes.py @@ -9,12 +9,14 @@ class ReturnCodes: DELETEFILE_SUCCESS = 0 DELETEFILE_FILE_NOT_FOUND = 1 + DELETEFILE_UNABLE_TO_DELETE = 2 RENAMEFILE_SUCCESS = 10 RENAMEFILE_UNABLE_TO_MOVE = 11 DOWNLOADFILETOISO_SUCCESS = 20 DOWNLOADTODIR_SUCCESS = 30 WRITEFILE_SUCCESS = 40 WRITEFILE_COULD_NOT_WRITE = 41 + WRITEFILE_COULD_NOT_OVERWRITE = 42 READCONFIG_SUCCESS = 50 READCONFIG_COULD_NOT_READ = 51 READCONFIG_INVALID_CONFIG_FILE_FORMAT = 52 diff --git a/python/web/src/return_code_mapper.py b/python/web/src/return_code_mapper.py index 6ff3ba15..f6c6e273 100644 --- a/python/web/src/return_code_mapper.py +++ b/python/web/src/return_code_mapper.py @@ -14,6 +14,8 @@ class ReturnCodeMapper: _("File deleted: %(file_path)s"), ReturnCodes.DELETEFILE_FILE_NOT_FOUND: _("File to delete not found: %(file_path)s"), + ReturnCodes.DELETEFILE_UNABLE_TO_DELETE: + _("Could not delete file: %(file_path)s"), ReturnCodes.RENAMEFILE_SUCCESS: _("File moved to: %(target_path)s"), ReturnCodes.RENAMEFILE_UNABLE_TO_MOVE: @@ -26,6 +28,8 @@ class ReturnCodeMapper: _("File created: %(target_path)s"), ReturnCodes.WRITEFILE_COULD_NOT_WRITE: _("Could not create file: %(target_path)s"), + ReturnCodes.WRITEFILE_COULD_NOT_OVERWRITE: + _("A file with name %(target_path)s already exists"), ReturnCodes.READCONFIG_SUCCESS: _("Loaded configurations from: %(file_name)s"), ReturnCodes.READCONFIG_COULD_NOT_READ: From b6cc6a23af99b1550f95bd65bed20778c2b5575b Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 6 Mar 2023 09:18:04 -0800 Subject: [PATCH 14/30] Bump to Netatalk 2.x 230301 (#1119) --- easyinstall.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easyinstall.sh b/easyinstall.sh index 9f3a30d5..499476d0 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -712,7 +712,7 @@ function setupWirelessNetworking() { # Downloads, compiles, and installs Netatalk (AppleShare server) function installNetatalk() { - NETATALK_VERSION="230202" + NETATALK_VERSION="230301" NETATALK_CONFIG_PATH="/etc/netatalk" NETATALK_OPTIONS="--cores=$CORES --share-name='$FILE_SHARE_NAME' --share-path='$FILE_SHARE_PATH'" From ef6cd97656e3e8d9d1fc7d9b308624cf0fd95a89 Mon Sep 17 00:00:00 2001 From: Uwe Seimet <48174652+uweseimet@users.noreply.github.com> Date: Wed, 15 Mar 2023 22:38:44 +0100 Subject: [PATCH 15/30] Improve OpenVMS/VAX compatibility (issue #1117) (#1123) * Set TB, PER and DTE bits in read/write error recovery page * Fixed typo * Added unit test * Comment update --- cpp/devices/disk.cpp | 7 ++++++- cpp/test/mocks.h | 3 ++- cpp/test/scsihd_nec_test.cpp | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/cpp/devices/disk.cpp b/cpp/devices/disk.cpp index 63574ad3..8649103f 100644 --- a/cpp/devices/disk.cpp +++ b/cpp/devices/disk.cpp @@ -396,7 +396,12 @@ void Disk::SetUpModePages(map>& pages, int page, bool changeab void Disk::AddErrorPage(map>& pages, bool) const { // Retry count is 0, limit time uses internal default value - pages[1] = vector(12); + vector buf(12); + + // TB, PER, DTE (required for OpenVMS/VAX compatibility, see issue #1117) + buf[2] = (byte)0x26; + + pages[1] = buf; } void Disk::AddFormatPage(map>& pages, bool changeable) const diff --git a/cpp/test/mocks.h b/cpp/test/mocks.h index ef49fa6b..f654054d 100644 --- a/cpp/test/mocks.h +++ b/cpp/test/mocks.h @@ -3,7 +3,7 @@ // SCSI Target Emulator PiSCSI // for Raspberry Pi // -// Copyright (C) 2022 Uwe Seimet +// Copyright (C) 2022-2023 Uwe Seimet // //--------------------------------------------------------------------------- @@ -358,6 +358,7 @@ class MockSCSIHD : public SCSIHD //NOSONAR Ignore inheritance hierarchy depth in class MockSCSIHD_NEC : public SCSIHD_NEC //NOSONAR Ignore inheritance hierarchy depth in unit tests { FRIEND_TEST(ScsiHdNecTest, SetUpModePages); + FRIEND_TEST(ScsiHdNecTest, TestAddErrorPage); FRIEND_TEST(ScsiHdNecTest, TestAddFormatPage); FRIEND_TEST(ScsiHdNecTest, TestAddDrivePage); FRIEND_TEST(PiscsiExecutorTest, ProcessDeviceCmd); diff --git a/cpp/test/scsihd_nec_test.cpp b/cpp/test/scsihd_nec_test.cpp index 9ddf9a11..cfff8485 100644 --- a/cpp/test/scsihd_nec_test.cpp +++ b/cpp/test/scsihd_nec_test.cpp @@ -3,7 +3,7 @@ // SCSI Target Emulator PiSCSI // for Raspberry Pi // -// Copyright (C) 2022 Uwe Seimet +// Copyright (C) 2022-2023 Uwe Seimet // //--------------------------------------------------------------------------- @@ -47,6 +47,20 @@ TEST(ScsiHdNecTest, SetUpModePages) ScsiHdNecTest_SetUpModePages(pages); } +TEST(ScsiHdNecTest, TestAddErrorPage) +{ + map> pages; + MockSCSIHD_NEC hd(0); + + hd.SetBlockCount(0x1234); + hd.SetReady(true); + // Non changeable + hd.SetUpModePages(pages, 0x01, false); + EXPECT_EQ(1, pages.size()) << "Unexpected number of mode pages"; + const vector& page_1 = pages[1]; + EXPECT_EQ(0x26, to_integer(page_1[2])); +} + TEST(ScsiHdNecTest, TestAddFormatPage) { map> pages; From 5414a780983781530dc7142d2d3c2c77920cc0d5 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sun, 19 Mar 2023 13:46:43 -0700 Subject: [PATCH 16/30] Remove git hash info (#1129) --- python/common/src/piscsi/sys_cmds.py | 18 +----------------- python/web/src/templates/base.html | 2 +- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/python/common/src/piscsi/sys_cmds.py b/python/common/src/piscsi/sys_cmds.py index 56a38049..0da185d8 100644 --- a/python/common/src/piscsi/sys_cmds.py +++ b/python/common/src/piscsi/sys_cmds.py @@ -21,23 +21,8 @@ class SysCmds: @staticmethod def running_env(): """ - Returns (str) git and (str) env - git contains the git hash of the checked out code - env is the various system information where this app is running + Returns (str) env, with details on the system hardware and software """ - try: - ra_git_version = ( - subprocess.run( - ["git", "rev-parse", "HEAD"], - capture_output=True, - check=True, - ) - .stdout.decode("utf-8") - .strip() - ) - except subprocess.CalledProcessError as error: - logging.warning(SHELL_ERROR, error.cmd, error.stderr.decode("utf-8")) - ra_git_version = "" PROC_MODEL_PATH = "/proc/device-tree/model" SYS_VENDOR_PATH = "/sys/devices/virtual/dmi/id/sys_vendor" @@ -67,7 +52,6 @@ class SysCmds: env = uname() return { - "git": ra_git_version, "env": f"{hardware}, {env.system} {env.release} {env.machine}", } diff --git a/python/web/src/templates/base.html b/python/web/src/templates/base.html index 6beb33be..25331690 100644 --- a/python/web/src/templates/base.html +++ b/python/web/src/templates/base.html @@ -117,7 +117,7 @@ {% endif %}
- {{ _("PiSCSI version:") }} {{ env["version"] }} {{ env["running_env"]["git"][:7] }} + {{ _("PiSCSI software version:") }} {{ env["version"] }}
{{ _("Hardware and OS:") }} {{ env["running_env"]["env"] }} From ff017a9c1d70083fd68c660c8d577b1a7a512f00 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Thu, 23 Mar 2023 20:07:19 -0700 Subject: [PATCH 17/30] Web UI: Handling for non-existence of working dirs (#1130) --- easyinstall.sh | 59 ++++++++++++---------------- python/web/src/templates/index.html | 7 +++- python/web/src/templates/upload.html | 4 ++ python/web/src/web.py | 25 +++++++----- python/web/src/web_utils.py | 15 ++++++- 5 files changed, 65 insertions(+), 45 deletions(-) diff --git a/easyinstall.sh b/easyinstall.sh index 499476d0..37084a61 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -710,6 +710,29 @@ function setupWirelessNetworking() { sudo reboot } +# Detects or creates the file sharing directory +function createFileSharingDir() { + if [ ! -d "$FILE_SHARE_PATH" ] && [ -d "$HOME/afpshare" ]; then + echo + echo "File server dir $HOME/afpshare detected. This script will rename it to $FILE_SHARE_PATH." + echo + echo "Do you want to proceed with the installation? [y/N]" + read -r REPLY + if [ "$REPLY" == "y" ] || [ "$REPLY" == "Y" ]; then + sudo mv "$HOME/afpshare" "$FILE_SHARE_PATH" || exit 1 + else + exit 0 + fi + elif [ -d "$FILE_SHARE_PATH" ]; then + echo "Found a $FILE_SHARE_PATH directory; will use it for file sharing." + else + echo "Creating the $FILE_SHARE_PATH directory and granting read/write permissions to all users..." + sudo mkdir -p "$FILE_SHARE_PATH" + sudo chown -R "$USER:$USER" "$FILE_SHARE_PATH" + chmod -Rv 775 "$FILE_SHARE_PATH" + fi +} + # Downloads, compiles, and installs Netatalk (AppleShare server) function installNetatalk() { NETATALK_VERSION="230301" @@ -729,19 +752,6 @@ function installNetatalk() { fi fi - if [ ! -d "$FILE_SHARE_PATH" ] && [ -d "$HOME/afpshare" ]; then - echo - echo "File server dir $HOME/afpshare detected. This script will rename it to $FILE_SHARE_PATH." - echo - echo "Do you want to proceed with the installation? [y/N]" - read -r REPLY - if [ "$REPLY" == "y" ] || [ "$REPLY" == "Y" ]; then - sudo mv "$HOME/afpshare" "$FILE_SHARE_PATH" || exit 1 - else - exit 0 - fi - fi - echo echo "Downloading tarball to $HOME..." cd $HOME || exit 1 @@ -874,26 +884,6 @@ function installSamba() { fi fi - if [ ! -d "$FILE_SHARE_PATH" ] && [ -d "$HOME/afpshare" ]; then - echo - echo "File server dir $HOME/afpshare detected. This script will rename it to $FILE_SHARE_PATH." - echo - echo "Do you want to proceed with the installation? [y/N]" - read -r REPLY - if [ "$REPLY" == "y" ] || [ "$REPLY" == "Y" ]; then - sudo mv "$HOME/afpshare" "$FILE_SHARE_PATH" || exit 1 - else - exit 0 - fi - elif [ -d "$FILE_SHARE_PATH" ]; then - echo "Found a $FILE_SHARE_PATH directory; will use it for file sharing." - else - echo "Creating the $FILE_SHARE_PATH directory and granting read/write permissions to all users..." - sudo mkdir -p "$FILE_SHARE_PATH" - sudo chown -R "$USER:$USER" "$FILE_SHARE_PATH" - chmod -Rv 775 "$FILE_SHARE_PATH" - fi - echo "" echo "Installing dependencies..." sudo apt-get update || true @@ -1279,6 +1269,7 @@ function runChoice() { ;; 7) echo "Installing AppleShare File Server" + createFileSharingDir installNetatalk echo "Installing AppleShare File Server - Complete!" ;; @@ -1290,6 +1281,7 @@ function runChoice() { echo "WARNING: The FTP server may transfer unencrypted data over the network." echo "Proceed with this installation only if you are on a private, secure network." sudoCheck + createFileSharingDir installFtp echo "Installing FTP File Server - Complete!" ;; @@ -1301,6 +1293,7 @@ function runChoice() { echo " - Create a directory in the current user's home directory where shared files will be stored" echo " - Create a Samba user for the current user" sudoCheck + createFileSharingDir installSamba echo "Installing SMB File Server - Complete!" ;; diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index b9d74cc4..f6364c92 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -383,8 +383,11 @@
  • {{ _("Disk Images") }} = {{ env["image_dir"] }}
  • + {% if file_server_dir_exists %}
  • {{ _("Shared Files") }} = {{ FILE_SERVER_DIR }}
  • -
  • {{ _("To access shared files remotely, you may have to install one of the file servers first.") }}
  • + {% else %} +
  • {{ _("Install a file server and create the shared files directory in order to share files between the Pi and your vintage computers.") }}
  • + {% endif %}
@@ -399,6 +402,7 @@ {% endfor %} + {% if file_server_dir_exists %} + {% endif %} diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index 67d6b57f..c572469e 100644 --- a/python/web/src/templates/upload.html +++ b/python/web/src/templates/upload.html @@ -6,7 +6,9 @@
  • {{ _("The largest file size accepted in this form is %(max_file_size)s MiB. Use other file transfer means for larger files.", max_file_size=max_file_size) }}
  • {{ _("You have to manually clean up partially uploaded files, as a result of cancelling the upload or closing this page.") }}
  • {{ _("Disk Images") }} = {{ env["image_dir"] }}
  • + {% if file_server_dir_exists %}
  • {{ _("Shared Files") }} = {{ FILE_SERVER_DIR }}
  • + {% endif %}
  • {{ _("PiSCSI Config") }} = {{ CFG_DIR }}
  • @@ -20,6 +22,7 @@ {% endfor %} + {% if file_server_dir_exists %} + {% endif %} diff --git a/python/web/src/web.py b/python/web/src/web.py index 40d9b032..5ac8ea22 100644 --- a/python/web/src/web.py +++ b/python/web/src/web.py @@ -24,7 +24,6 @@ from flask import ( send_from_directory, make_response, session, - abort, jsonify, ) @@ -44,6 +43,7 @@ from return_code_mapper import ReturnCodeMapper from socket_cmds_flask import SocketCmdsFlask from web_utils import ( + working_dirs_exist, sort_and_format_devices, get_valid_scsi_ids, map_device_types_and_names, @@ -209,16 +209,9 @@ def index(): """ Sets up data structures for and renders the index page """ - if not piscsi_cmd.is_token_auth()["status"] and not APP.config["PISCSI_TOKEN"]: - abort( - 403, - _( - "PiSCSI is password protected. " - "Start the Web Interface with the --password parameter." - ), - ) - server_info = piscsi_cmd.get_server_info() + working_dirs_exist((server_info["image_dir"], CFG_DIR)) + devices = piscsi_cmd.list_devices() device_types = map_device_types_and_names(piscsi_cmd.get_device_types()["device_types"]) image_files = file_cmd.list_images() @@ -277,6 +270,7 @@ def index(): drive_properties=format_drive_properties(APP.config["PISCSI_DRIVE_PROPERTIES"]), images_subdirs=file_cmd.list_subdirs(server_info["image_dir"]), shared_subdirs=file_cmd.list_subdirs(FILE_SERVER_DIR), + file_server_dir_exists=Path(FILE_SERVER_DIR).exists(), RESERVATIONS=RESERVATIONS, CFG_DIR=CFG_DIR, FILE_SERVER_DIR=FILE_SERVER_DIR, @@ -302,6 +296,8 @@ def drive_list(): """ Sets up the data structures and kicks off the rendering of the drive list page """ + server_info = piscsi_cmd.get_server_info() + working_dirs_exist((server_info["image_dir"], CFG_DIR)) return response( template="drives.html", @@ -317,12 +313,14 @@ def upload_page(): Sets up the data structures and kicks off the rendering of the file uploading page """ server_info = piscsi_cmd.get_server_info() + working_dirs_exist((server_info["image_dir"], CFG_DIR)) return response( template="upload.html", page_title=_("PiSCSI File Upload"), images_subdirs=file_cmd.list_subdirs(server_info["image_dir"]), shared_subdirs=file_cmd.list_subdirs(FILE_SERVER_DIR), + file_server_dir_exists=Path(FILE_SERVER_DIR).exists(), max_file_size=int(int(MAX_FILE_SIZE) / 1024 / 1024), CFG_DIR=CFG_DIR, FILE_SERVER_DIR=FILE_SERVER_DIR, @@ -516,6 +514,7 @@ def show_diskinfo(): if not safe_path["status"]: return response(error=True, message=safe_path["msg"]) server_info = piscsi_cmd.get_server_info() + working_dirs_exist((server_info["image_dir"], CFG_DIR)) returncode, diskinfo = sys_cmd.get_diskinfo(Path(server_info["image_dir"]) / file_name) if returncode == 0: return response( @@ -1474,6 +1473,12 @@ if __name__ == "__main__": file_cmd = FileCmds(sock_cmd=sock_cmd, piscsi=piscsi_cmd, token=APP.config["PISCSI_TOKEN"]) sys_cmd = SysCmds() + if not piscsi_cmd.is_token_auth()["status"] and not APP.config["PISCSI_TOKEN"]: + raise Exception( + "PiSCSI is password protected. " + "Start the Web Interface with the --password parameter." + ) + if Path(f"{CFG_DIR}/{DEFAULT_CONFIG}").is_file(): file_cmd.read_config(DEFAULT_CONFIG) if Path(f"{DRIVE_PROPERTIES_FILE}").is_file(): diff --git a/python/web/src/web_utils.py b/python/web/src/web_utils.py index 3cf71b3e..d085510f 100644 --- a/python/web/src/web_utils.py +++ b/python/web/src/web_utils.py @@ -9,13 +9,26 @@ from pathlib import Path from ua_parser import user_agent_parser from re import findall -from flask import request, make_response +from flask import request, make_response, abort from flask_babel import _ from werkzeug.utils import secure_filename from piscsi.sys_cmds import SysCmds +def working_dirs_exist(working_dirs): + """ + Method for validating that working dirs exist. + Takes (tuple) of (str) working_dirs with paths to required dirs. + """ + for dir_path in working_dirs: + if not Path(dir_path).exists(): + abort( + 503, + _(f"Please create directory: {dir_path}"), + ) + + def get_valid_scsi_ids(devices, reserved_ids): """ Takes a list of (dict)s devices, and list of (int)s reserved_ids. From ef3002dd41bb5a861e9a4806dfa50c6987c19ff1 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Thu, 23 Mar 2023 20:07:41 -0700 Subject: [PATCH 18/30] Make ids unique in each subdir table (#1131) --- python/web/src/templates/index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index f6364c92..b95165a1 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -341,14 +341,14 @@ {% endif %} -
    + - +
    -
    + - +
    From 2092b35c89172f203f1c47d467ddee97ed24c600 Mon Sep 17 00:00:00 2001 From: Uwe Seimet <48174652+uweseimet@users.noreply.github.com> Date: Fri, 24 Mar 2023 08:54:05 +0100 Subject: [PATCH 19/30] Added optional LDFLAGS in order to control linking, e.g. for faster linking (#1128) --- cpp/Makefile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cpp/Makefile b/cpp/Makefile index a71868d9..1a5f95b0 100644 --- a/cpp/Makefile +++ b/cpp/Makefile @@ -199,22 +199,22 @@ docs: $(DOC_DIR)/piscsi_man_page.txt $(DOC_DIR)/scsictl_man_page.txt $(DOC_DIR)/ $(SRC_PISCSI_CORE) $(SRC_SCSICTL_CORE) : $(OBJ_GENERATED) $(BINDIR)/$(PISCSI): $(SRC_GENERATED) $(OBJ_PISCSI_CORE) $(OBJ_PISCSI) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR) - $(CXX) $(CXXFLAGS) -o $@ $(OBJ_PISCSI_CORE) $(OBJ_PISCSI) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -lstdc++fs + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_PISCSI_CORE) $(OBJ_PISCSI) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -lstdc++fs $(BINDIR)/$(SCSICTL): $(SRC_GENERATED) $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR) - $(CXX) $(CXXFLAGS) -o $@ $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lprotobuf + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSICTL_CORE) $(OBJ_SCSICTL) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lprotobuf $(BINDIR)/$(SCSIDUMP): $(OBJ_SCSIDUMP) $(OBJ_SHARED) | $(BINDIR) - $(CXX) $(CXXFLAGS) -o $@ $(OBJ_SCSIDUMP) $(OBJ_SHARED) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSIDUMP) $(OBJ_SHARED) $(BINDIR)/$(SCSIMON): $(OBJ_SCSIMON) $(OBJ_SHARED) | $(BINDIR) - $(CXX) $(CXXFLAGS) -o $@ $(OBJ_SCSIMON) $(OBJ_SHARED) - -$(BINDIR)/$(PISCSI_TEST): $(SRC_GENERATED) $(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SCSICTL_TEST) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR) - $(CXX) $(CXXFLAGS) $(TEST_WRAPS) -o $@ $(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -lstdc++fs -lgmock -lgtest + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SCSIMON) $(OBJ_SHARED) $(BINDIR)/$(SCSILOOP): $(OBJ_SHARED) $(OBJ_SCSILOOP) | $(BINDIR) - $(CXX) $(CXXFLAGS) -o $@ $(OBJ_SHARED) $(OBJ_SCSILOOP) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ_SHARED) $(OBJ_SCSILOOP) + +$(BINDIR)/$(PISCSI_TEST): $(SRC_GENERATED) $(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SCSICTL_TEST) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) | $(BINDIR) + $(CXX) $(CXXFLAGS) $(LDFLAGS) $(TEST_WRAPS) -o $@ $(OBJ_PISCSI_CORE) $(OBJ_SCSICTL_CORE) $(OBJ_PISCSI_TEST) $(OBJ_SHARED) $(OBJ_PROTOBUF) $(OBJ_GENERATED) -lpthread -lpcap -lprotobuf -lstdc++fs -lgmock -lgtest # Phony rules for building individual utilities .PHONY: $(PISCSI) $(SCSICTL) $(SCSIDUMP) $(SCSIMON) $(PISCSI_TEST) $(SCSILOOP) From 1c59a70b916702673456634bbbb171aa121b2a1c Mon Sep 17 00:00:00 2001 From: cvictor Date: Sat, 25 Mar 2023 04:17:38 +0100 Subject: [PATCH 20/30] German language update (#1134) --- .../translations/de/LC_MESSAGES/messages.po | 729 +++++++++--------- 1 file changed, 375 insertions(+), 354 deletions(-) diff --git a/python/web/src/translations/de/LC_MESSAGES/messages.po b/python/web/src/translations/de/LC_MESSAGES/messages.po index c9720ee7..938477dd 100644 --- a/python/web/src/translations/de/LC_MESSAGES/messages.po +++ b/python/web/src/translations/de/LC_MESSAGES/messages.po @@ -5,19 +5,18 @@ # msgid "" msgstr "" -"Project-Id-Version: PiSCSI\n" +"Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/PiSCSI/piscsi/issues\n" -"POT-Creation-Date: 2023-02-03 22:30+0100\n" -"PO-Revision-Date: 2023-02-03 22:47+0100\n" +"POT-Creation-Date: 2023-03-24 11:05+0100\n" +"PO-Revision-Date: 2023-03-24 11:00+0100\n" "Last-Translator: Christian Victor \n" -"Language-Team: de N/A\n" "Language: de\n" +"Language-Team: de N/A\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\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" "Generated-By: Babel 2.11.0\n" -"X-Generator: Poedit 3.2.2\n" #: src/return_code_mapper.py:14 #, python-format @@ -31,80 +30,91 @@ msgstr "Datei zum Löschen nicht gefunden: %(file_path)s" #: src/return_code_mapper.py:18 #, python-format +msgid "Could not delete file: %(file_path)s" +msgstr "Konnte Datei %(file_path)s nicht löschen" + +#: src/return_code_mapper.py:20 +#, python-format msgid "File moved to: %(target_path)s" msgstr "Datei nach: %(target_path)s verschoben" -#: src/return_code_mapper.py:20 +#: src/return_code_mapper.py:22 #, python-format msgid "Unable to move file to: %(target_path)s" msgstr "Datei kann nicht verschoben werden nach: %(target_path)s" -#: src/return_code_mapper.py:22 +#: src/return_code_mapper.py:24 #, python-format msgid "Created CD-ROM ISO image with arguments \"%(value)s\"" msgstr "CD-ROM ISO-Image mit Parametern \"%(value)s\" erzeugt" -#: src/return_code_mapper.py:24 +#: src/return_code_mapper.py:26 #, python-format msgid "%(file_name)s downloaded to %(save_dir)s" msgstr "%(file_name)s heruntergeladen nach %(save_dir)s" -#: src/return_code_mapper.py:26 +#: src/return_code_mapper.py:28 #, python-format msgid "File created: %(target_path)s" msgstr "Datei erzeugt: %(target_path)s" -#: src/return_code_mapper.py:28 +#: src/return_code_mapper.py:30 #, python-format msgid "Could not create file: %(target_path)s" msgstr "Konnte Datei %(target_path)s nicht erzeugen" -#: src/return_code_mapper.py:30 +#: src/return_code_mapper.py:32 +#, python-format +msgid "A file with name %(target_path)s already exists" +msgstr "Eine Datei mit Namen %(target_path)s existiert bereits" + +#: src/return_code_mapper.py:34 #, python-format msgid "Loaded configurations from: %(file_name)s" msgstr "Konfigurationen von %(file_name)s geladen" -#: src/return_code_mapper.py:32 +#: src/return_code_mapper.py:36 #, python-format msgid "Could not read configuration file: %(file_name)s" msgstr "Konnte die Konfigurationsdatei %(file_name)s nicht lesen" -#: src/return_code_mapper.py:34 +#: src/return_code_mapper.py:38 msgid "Invalid configuration file format" msgstr "Ungültiges Konfigurationsdateiformat" -#: src/return_code_mapper.py:36 +#: src/return_code_mapper.py:40 #, python-format msgid "Read properties from file: %(file_path)s" msgstr "Eigenschaften von Datei %(file_path)s gelesen" -#: src/return_code_mapper.py:38 +#: src/return_code_mapper.py:42 #, python-format msgid "Could not read properties from file: %(file_path)s" msgstr "Konnte Eigenschaften von Datei %(file_path)s nicht lesen" -#: src/return_code_mapper.py:40 +#: src/return_code_mapper.py:44 #, python-format msgid "" -"Cannot insert an image for %(device_type)s into a %(current_device_type)s device" +"Cannot insert an image for %(device_type)s into a %(current_device_type)s" +" device" msgstr "" "Kann kein Image für %(device_type)s in ein %(current_device_type)s Gerät " "einlegen" -#: src/return_code_mapper.py:42 +#: src/return_code_mapper.py:46 #, python-format msgid "Extracted %(count)s file(s)" msgstr "%(count)s Datei(en) entpackt" -#: src/return_code_mapper.py:44 +#: src/return_code_mapper.py:48 msgid "Unable to extract archive: No files were specified" msgstr "Konnte Archiv nicht entpacken: Es wurden keine Dateien angegeben" -#: src/return_code_mapper.py:46 +#: src/return_code_mapper.py:50 msgid "No files were extracted (existing files are skipped)" msgstr "Es wurden keine Dateien entpackt (vorhandene Dateien werden übersprungen)" -#: src/return_code_mapper.py:48 +#: src/return_code_mapper.py:52 #, python-format msgid "Unable to extract archive: %(error)s" msgstr "Kann Archiv %(error)s nicht entpacken" @@ -112,47 +122,41 @@ msgstr "Kann Archiv %(error)s nicht entpacken" #: src/socket_cmds_flask.py:42 #, python-format msgid "" -"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s with " -"error: %(error_msg)s. The PiSCSI process is not running or may have crashed." +"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s" +" with error: %(error_msg)s. The PiSCSI process is not running or may have" +" crashed." msgstr "" -"Das PiSCSI-Webinterface konnte sich mit Fehler %(error_msg)s nicht mit PiSCSI " -"an %(host)s:%(port)s verbinden. Der PiSCSI-Prozess läuft nicht oder könnte " -"abgestürzt sein." +"Das PiSCSI-Webinterface konnte sich mit Fehler %(error_msg)s nicht mit " +"PiSCSI an %(host)s:%(port)s verbinden. Der PiSCSI-Prozess läuft nicht " +"oder könnte abgestürzt sein." #: src/socket_cmds_flask.py:54 msgid "" -"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and try " -"again. If the issue persists, please report a bug." +"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and " +"try again. If the issue persists, please report a bug." msgstr "" -"Das PiSCSI-Webinterface hat die Verbindung verloren. Bitte gehe zurück und " -"versuche es nochmals. Wenn das Problem bestehen bleibt, melde bitte einen Bug." +"Das PiSCSI-Webinterface hat die Verbindung verloren. Bitte gehe zurück " +"und versuche es nochmals. Wenn das Problem bestehen bleibt, melde bitte " +"einen Bug." #: src/socket_cmds_flask.py:64 msgid "" -"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please go " -"back and try again. If the issue persists, please report a bug." +"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please" +" go back and try again. If the issue persists, please report a bug." msgstr "" -"Das PiSCSI-Webinterface hat keine gültige Antwort von PiSCSI bekommen. Bitte " -"gehe zurück und versuche es nochmals. Wenn das Problem bestehen bleibt, melde " -"bitte einen Bug." +"Das PiSCSI-Webinterface hat keine gültige Antwort von PiSCSI bekommen. " +"Bitte gehe zurück und versuche es nochmals. Wenn das Problem bestehen " +"bleibt, melde bitte einen Bug." -#: src/web.py:214 -msgid "" -"PiSCSI is password protected. Start the Web Interface with the --password " -"parameter." -msgstr "" -"PiSCSI ist passwortgeschützt. Starte das Webinterface mit dem —password " -"Parameter." - -#: src/web.py:263 +#: src/web.py:252 msgid "PiSCSI Control Page" msgstr "PiSCSI Kontrollseite" -#: src/web.py:309 +#: src/web.py:304 msgid "PiSCSI Create Drive" msgstr "PiSCSI Erzeuge Laufwerk" -#: src/web.py:323 +#: src/web.py:320 msgid "PiSCSI File Upload" msgstr "PiSCSI Dateiupload" @@ -160,8 +164,8 @@ msgstr "PiSCSI Dateiupload" #, python-format msgid "You must log in with valid credentials for a user in the '%(group)s' group" msgstr "" -"Du musst dich mit gültigen Zugangsdaten eines Users aus der Gruppe %(group)s’ " -"einloggen" +"Du musst dich mit gültigen Zugangsdaten eines Users aus der Gruppe " +"%(group)s’ einloggen" #: src/web.py:399 src/web.py:444 #, python-format @@ -173,367 +177,356 @@ msgstr "Keine Eigenschaften für Laufwerk %(drive_name)s" msgid "Image file with properties created: %(file_name)s" msgstr "Imagedatei mit Eigenschaften erzeugt %(file_name)s" -#: src/web.py:521 +#: src/web.py:522 msgid "PiSCSI Image Info" msgstr "PiSCSI Image-Info" -#: src/web.py:528 +#: src/web.py:529 #, python-format msgid "An error occurred when getting disk info: %(error)s" msgstr "Fehler beim Abrufen der Diskinformationen: %(error)s" -#: src/web.py:542 +#: src/web.py:543 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s ist keine bekannte PiSCSI-App" -#: src/web.py:569 +#: src/web.py:570 msgid "PiSCSI Manual" msgstr "PiSCSI Handbuch" -#: src/web.py:576 +#: src/web.py:577 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "Beim Abrufen der Handbuchseite ist ein Fehler aufgetreten: %(error)s" -#: src/web.py:592 +#: src/web.py:593 msgid "PiSCSI System Logs" msgstr "PiSCSI System-Logs" -#: src/web.py:600 +#: src/web.py:601 #, python-format msgid "An error occurred when fetching logs: %(error)s" msgstr "Beim Abrufen der Logs is ein Fehler aufgetreten: %(error)s" -#: src/web.py:614 +#: src/web.py:615 #, python-format msgid "Log level set to %(value)s" msgstr "Log-Level auf %(value)s gesetzt" -#: src/web.py:631 src/web.py:694 +#: src/web.py:632 src/web.py:695 msgid "No SCSI ID specified" msgstr "Keine SCSI ID angegeben" -#: src/web.py:672 +#: src/web.py:673 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "%(device_type)s mit SCSI-ID %(id_number)s LUN %(unit_number)s verbunden" -#: src/web.py:696 +#: src/web.py:697 msgid "No image file to insert" msgstr "Keine Imagedatei zum Einfügen" -#: src/web.py:736 +#: src/web.py:737 #, python-format msgid "" "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " "%(unit_number)s" msgstr "" -"%(file_name)s als %(device_type)s mit SCSI ID %(id_number)s LUN %(unit_number)s " -"verbunden" +"%(file_name)s als %(device_type)s mit SCSI ID %(id_number)s LUN " +"%(unit_number)s verbunden" -#: src/web.py:753 +#: src/web.py:754 msgid "Detached all SCSI devices" msgstr "Alle SCSI-Geräte getrennt" -#: src/web.py:769 +#: src/web.py:770 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "SCSI-ID %(id_number)s LUN %(unit_number)s getrennt" -#: src/web.py:791 +#: src/web.py:792 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "SCSI-ID %(id_number)s LUN %(unit_number)s ausgeworfen" -#: src/web.py:810 +#: src/web.py:811 msgid "PiSCSI Device Info" msgstr "PiSCSI Geräteinfo" -#: src/web.py:814 +#: src/web.py:815 msgid "No devices attached" msgstr "Kein Gerät angehängt" -#: src/web.py:830 +#: src/web.py:831 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "Reservierte SCSI-ID %(id_number)s" -#: src/web.py:848 +#: src/web.py:849 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "Reservierung für SCSI-ID %(id_number)s entfernt" -#: src/web.py:867 +#: src/web.py:868 #, python-format msgid "System name changed to '%(name)s'." msgstr "Systemname in '%(name)s' geändert." -#: src/web.py:868 +#: src/web.py:869 msgid "System name reset to default." msgstr "Systemname auf default zurückgesetzt." -#: src/web.py:870 +#: src/web.py:871 msgid "Failed to change system name." msgstr "Systemname konnte nicht geändert werden." -#: src/web.py:924 +#: src/web.py:925 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." msgstr "%(iso_type)s ist kein gültiges CD-ROM-Format." -#: src/web.py:939 +#: src/web.py:940 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" msgstr "Der folgende Fehler trat beim Erstellen des CD-ROM-Image auf: %(error)s" -#: src/web.py:946 +#: src/web.py:947 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "CD-ROM-Image %(file_name)s des Typs %(iso_type)s wurde erstellt." -#: src/web.py:974 +#: src/web.py:977 src/web.py:1021 +msgid "Unknown destination" +msgstr "Unbekanntes Ziel" + +#: src/web.py:986 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "Der folgende Fehler trat beim Download auf: %(error)s" -#: src/web.py:1045 src/web.py:1058 +#: src/web.py:1065 src/web.py:1078 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s ist kein gültiges Festplatten-Format." -#: src/web.py:1103 +#: src/web.py:1123 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "Imagedatei mit Eigenschaften erstellt: %(file_name)s%(drive_format)s" -#: src/web.py:1113 +#: src/web.py:1133 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "Imagedatei erstellt: %(file_name)s%(drive_format)s" -#: src/web.py:1174 +#: src/web.py:1194 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "Imagedatei mit Eigenschaften gelöscht: %(file_name)s" -#: src/web.py:1183 +#: src/web.py:1203 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "Imagedatei %(file_name)s gelöscht" -#: src/web.py:1221 +#: src/web.py:1241 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "Imagedatei mit Eigenschaften umbenannt in: %(file_name)s" -#: src/web.py:1230 +#: src/web.py:1250 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "Imagedatei umbenannt in: %(file_name)s" -#: src/web.py:1268 +#: src/web.py:1288 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "Kopie der Imagedatei mit Eigenschaften gespeichert als: %(file_name)s" -#: src/web.py:1277 +#: src/web.py:1297 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "Kopie der Imagedatei gespeichert als: %(file_name)s" -#: src/web.py:1330 +#: src/web.py:1350 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Webinterface-Sprache auf %(locale)s geändert" -#: src/web.py:1341 +#: src/web.py:1361 msgid "The requested theme does not exist." msgstr "Das angeforderte Theme existiert nicht." -#: src/web.py:1344 +#: src/web.py:1364 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "Theme geändert zu '%(theme)s'." -#: src/web_utils.py:98 +#: src/web_utils.py:112 msgid "Hard Disk Drive" msgstr "Festplatte" -#: src/web_utils.py:100 +#: src/web_utils.py:114 msgid "Removable Disk Drive" msgstr "Wechsellaufwerk" -#: src/web_utils.py:102 +#: src/web_utils.py:116 msgid "Magneto-Optical Drive" msgstr "Magneto-Optisches Laufwerk" -#: src/web_utils.py:104 +#: src/web_utils.py:118 msgid "CD/DVD Drive" msgstr "CD/DVD-Laufwerk" -#: src/web_utils.py:106 +#: src/web_utils.py:120 msgid "Host Bridge" msgstr "Host-Bridge" -#: src/web_utils.py:108 +#: src/web_utils.py:122 msgid "Ethernet Adapter" msgstr "Ethernet-Adapter" -#: src/web_utils.py:110 +#: src/web_utils.py:124 msgid "Printer" msgstr "Drucker" -#: src/web_utils.py:112 +#: src/web_utils.py:126 msgid "Host Services" msgstr "Host-Dienste" -#: src/web_utils.py:135 +#: src/web_utils.py:149 msgid "Hard Disk Image (Generic)" msgstr "Festplatten-Image (generisch)" -#: src/web_utils.py:137 +#: src/web_utils.py:151 msgid "Hard Disk Image (Apple)" msgstr "Festplatten-Image (Apple)" -#: src/web_utils.py:139 +#: src/web_utils.py:153 msgid "Hard Disk Image (NEC)" msgstr "Festplatten-Image (NEC)" -#: src/web_utils.py:141 +#: src/web_utils.py:155 msgid "Hard Disk Image (SCSI-1)" msgstr "Festplatten-Image (SCSI-1)" -#: src/web_utils.py:143 +#: src/web_utils.py:157 msgid "Removable Disk Image" msgstr "Wechsellaufwerks-Image" -#: src/web_utils.py:145 +#: src/web_utils.py:159 msgid "Magneto-Optical Disk Image" msgstr "Magneto-Optisches Laufwerks-Image" -#: src/web_utils.py:219 +#: src/web_utils.py:260 msgid "You must log in to use this function" msgstr "Du musst dich einloggen um diese Funktion zu nutzen" -#: src/web_utils.py:233 +#: src/web_utils.py:274 #, python-format msgid "Configure the network bridge for %(interface)s first: " msgstr "Konfiguriere zuerst die Netzwerk-Bridge für %(interface)s: " -#: src/web_utils.py:262 +#: src/web_utils.py:303 #, python-format -msgid "%(file_name)s is not a valid path" -msgstr "%(file_name)s ist kein gültiger Pfad" +msgid "No permission to use path '%(file_name)s'" +msgstr "Keine Berechtigung den Pfad '%(file_name)s' zu benutzen" -#: src/web_utils.py:283 +#: src/web_utils.py:324 msgid "The file already exists!" msgstr "Die Datei existiert bereits!" -#: src/web_utils.py:291 +#: src/web_utils.py:332 msgid "Unable to write the file to disk!" msgstr "Kann die Datei nicht auf die Disk schreiben!" -#: src/web_utils.py:299 +#: src/web_utils.py:340 msgid "Transferred file corrupted!" msgstr "Übertragene Datei beschädigt!" -#: src/web_utils.py:301 +#: src/web_utils.py:342 msgid "File upload successful!" msgstr "Dateiupload erfolgreich!" -#: src/templates/base.html:29 -msgid "" -" This process may take a while, and will continue in the background if you " -"navigate away from this page." -msgstr "" -" Dieser Prozess dauert möglicherweise länger und wird im Hintergrund " -"fortgesetzt wenn Du von dieser Seite wegnavigierst." - -#: src/templates/base.html:34 -msgid "" -" The Web Interface will become unresponsive momentarily. Reload this page after " -"the Pi has started up again." -msgstr "" -" Das Webinterface wird gleich nicht mehr reagieren. Lade diese Seite erneut " -"wenn der Pi wieder hochgefahren ist." - -#: src/templates/base.html:47 +#: src/templates/base.html:33 #, python-format msgid "Logged in as %(username)s" msgstr "Als %(username)s angemeldet" -#: src/templates/base.html:49 +#: src/templates/base.html:35 msgid "Log Out" msgstr "Abmelden" -#: src/templates/base.html:54 +#: src/templates/base.html:40 msgid "Log in to use Web Interface" msgstr "Melde dich an um das Webinterface zu benutzen" -#: src/templates/base.html:56 +#: src/templates/base.html:42 msgid "Username:" msgstr "Username:" -#: src/templates/base.html:60 +#: src/templates/base.html:46 msgid "Password:" msgstr "Passwort:" -#: src/templates/base.html:69 +#: src/templates/base.html:55 msgid "Web Interface Authentication Disabled" msgstr "Webinterface-Authentifizierung deaktiviert" -#: src/templates/base.html:71 +#: src/templates/base.html:57 #, python-format msgid "See Wiki for more information" msgstr "" -"Siehe Wiki für mehr Informationen" +"Siehe Wiki für mehr " +"Informationen" -#: src/templates/base.html:78 +#: src/templates/base.html:64 msgid "PiSCSI" msgstr "PiSCSI" -#: src/templates/base.html:79 +#: src/templates/base.html:65 msgid "Control Page" msgstr "Kontrollseite" -#: src/templates/base.html:85 src/templates/index.html:707 +#: src/templates/base.html:71 src/templates/index.html:754 msgid "System Name:" msgstr "Systemname:" -#: src/templates/base.html:112 src/templates/base.html:114 +#: src/templates/base.html:98 src/templates/base.html:100 #, python-format msgid "Switch to the %(theme)s theme" msgstr "Wechsle zum %(theme)s Theme" -#: src/templates/base.html:120 +#: src/templates/base.html:106 msgid "The AppleShare server is running. No active connections." msgstr "Der AppleShare-Server läuft. Keine aktiven Verbindungen." -#: src/templates/base.html:123 +#: src/templates/base.html:109 #, python-format msgid "%(value)d active AFP connection" msgstr "%(value)d aktive AFP-Verbindung" -#: src/templates/base.html:125 +#: src/templates/base.html:111 #, python-format msgid "%(value)d active AFP connections" msgstr "%(value)d aktive AFP-Verbindungen" -#: src/templates/base.html:130 +#: src/templates/base.html:116 #, python-format msgid "Macproxy is running at %(ip_addr)s (default port 5000)" msgstr "Macproxy läuft auf %(ip_addr)s (Default-Port 5000)" -#: src/templates/base.html:134 -msgid "PiSCSI version:" -msgstr "PiSCSI-Version:" +#: src/templates/base.html:120 +msgid "PiSCSI software version:" +msgstr "PiSCSI Software-Version:" -#: src/templates/base.html:137 +#: src/templates/base.html:123 msgid "Hardware and OS:" msgstr "Hardware und OS:" -#: src/templates/base.html:140 +#: src/templates/base.html:126 msgid "Network Address:" msgstr "Netzwerkadresse:" @@ -545,12 +538,12 @@ msgstr "Detailinfo für verbundene Laufwerke" msgid "SCSI ID" msgstr "SCSI ID" -#: src/templates/deviceinfo.html:13 src/templates/index.html:51 -#: src/templates/index.html:303 src/templates/index.html:613 +#: src/templates/deviceinfo.html:13 src/templates/index.html:63 +#: src/templates/index.html:321 src/templates/index.html:660 msgid "LUN" msgstr "LUN" -#: src/templates/deviceinfo.html:17 src/templates/index.html:309 +#: src/templates/deviceinfo.html:17 src/templates/index.html:327 msgid "Type" msgstr "Typ" @@ -558,11 +551,11 @@ msgstr "Typ" msgid "Status" msgstr "Status" -#: src/templates/deviceinfo.html:25 src/templates/index.html:203 +#: src/templates/deviceinfo.html:25 src/templates/index.html:228 msgid "File" msgstr "Datei" -#: src/templates/deviceinfo.html:29 src/templates/index.html:54 +#: src/templates/deviceinfo.html:29 src/templates/index.html:66 msgid "Parameters" msgstr "Parameter" @@ -570,7 +563,7 @@ msgstr "Parameter" msgid "Vendor" msgstr "Anbieter" -#: src/templates/deviceinfo.html:37 src/templates/index.html:55 +#: src/templates/deviceinfo.html:37 src/templates/index.html:67 msgid "Product" msgstr "Produkt" @@ -604,19 +597,20 @@ msgstr "Haftungsausschluss" #: src/templates/drives.html:5 #, python-format msgid "" -"These device profiles are provided as-is with no guarantee to work equally to " -"the actual physical device they are named after. You may need to provide " -"appropirate device drivers and/or configuration parameters for them to function " -"properly. If you would like to see data modified, or have additional devices to " -"add to the list, please raise an issue ticket at GitHub." +"These device profiles are provided as-is with no guarantee to work " +"equally to the actual physical device they are named after. You may need " +"to provide appropirate device drivers and/or configuration parameters for" +" them to function properly. If you would like to see data modified, or " +"have additional devices to add to the list, please raise an issue ticket " +"at GitHub." msgstr "" -"Diese Geräteprofile werden im Ist-Zuastand und ohne Garantie genauso wie das " -"tatsächliche physische Gerät nach dem sie benannt sind zu funktionieren " -"angeboten. Möglicherweise musst Du passende Gerätetreiber und/oder " -"Konfigurationsparameter liefern damit sie ordentlich funktionieren. Möchtest Du " -"gerne Daten geändert haben oder hast zusätzliche Geräte die der Liste " -"hinzugefügt werden sollen dann eröffne bitte ein Ticket auf GitHub." +"Diese Geräteprofile werden im Ist-Zuastand und ohne Garantie genauso wie " +"das tatsächliche physische Gerät nach dem sie benannt sind zu " +"funktionieren angeboten. Möglicherweise musst Du passende Gerätetreiber " +"und/oder Konfigurationsparameter liefern damit sie ordentlich " +"funktionieren. Möchtest Du gerne Daten geändert haben oder hast " +"zusätzliche Geräte die der Liste hinzugefügt werden sollen dann eröffne " +"bitte ein Ticket auf GitHub." #: src/templates/drives.html:6 msgid "Hard Disk Drives" @@ -646,8 +640,8 @@ msgid "Save as:" msgstr "Speichern als:" #: src/templates/drives.html:32 src/templates/drives.html:72 -#: src/templates/drives.html:107 src/templates/index.html:422 -#: src/templates/index.html:454 src/templates/index.html:514 +#: src/templates/drives.html:107 src/templates/index.html:469 +#: src/templates/index.html:501 src/templates/index.html:561 msgid "Create" msgstr "Erzeuge" @@ -657,11 +651,11 @@ msgstr "CD/DVD-Laufwerke" #: src/templates/drives.html:43 msgid "" -"This will create a properties file for the given CD-ROM or DVD image. No new " -"image file will be created." +"This will create a properties file for the given CD-ROM or DVD image. No " +"new image file will be created." msgstr "" -"Dies wird eine Eigenschaften-Datei für das ausgewählte CD-ROM- oder DVD-Image " -"erstellen. Es wird keine neue Image-Datei erzeugt." +"Dies wird eine Eigenschaften-Datei für das ausgewählte CD-ROM- oder DVD-" +"Image erstellen. Es wird keine neue Image-Datei erzeugt." #: src/templates/drives.html:64 msgid "Create for:" @@ -676,11 +670,27 @@ msgstr "Wechsellaufwerke" msgid "%(disk_space)s MiB disk space remaining on the Pi" msgstr "%(disk_space)s MiB Festplattenplatz auf dem Pi übrig" -#: src/templates/index.html:7 +#: src/templates/index.html:6 +msgid "" +" This process may take a while, and will continue in the background if " +"you navigate away from this page." +msgstr "" +" Dieser Prozess dauert möglicherweise länger und wird im Hintergrund " +"fortgesetzt wenn Du von dieser Seite wegnavigierst." + +#: src/templates/index.html:11 +msgid "" +" The Web Interface will become unresponsive momentarily. Reload this page" +" after the Pi has started up again." +msgstr "" +" Das Webinterface wird gleich nicht mehr reagieren. Lade diese Seite " +"erneut wenn der Pi wieder hochgefahren ist." + +#: src/templates/index.html:19 msgid "Current PiSCSI Configuration" msgstr "Aktuelle PiSCSI-Konfiguration" -#: src/templates/index.html:10 +#: src/templates/index.html:22 #, python-format msgid "" "Save and load device configurations, stored as json files in " @@ -689,460 +699,467 @@ msgstr "" "Speichere und lade Gerätekonfigurationen die als JSON-Dateien in " "%(config_dir)s abgelegt sind" -#: src/templates/index.html:11 +#: src/templates/index.html:23 msgid "" -"To have a particular device configuration load when PiSCSI starts, save it as " -"default." +"To have a particular device configuration load when PiSCSI starts, save " +"it as default." msgstr "" -"Um eine bestimmte Gerätekonfiguration zu laden wenn PiSCSI startet, speichere " -"sie als default." +"Um eine bestimmte Gerätekonfiguration zu laden wenn PiSCSI startet, " +"speichere sie als default." -#: src/templates/index.html:17 src/templates/index.html:39 -#: src/templates/index.html:473 +#: src/templates/index.html:29 src/templates/index.html:51 +#: src/templates/index.html:520 msgid "File Name:" msgstr "Dateiname:" -#: src/templates/index.html:27 +#: src/templates/index.html:39 msgid "No saved configurations" msgstr "Keine gespeicherten Konfigurationen" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Load" msgstr "Laden" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Detach all current device and Load configuration?" msgstr "Alle derzeitigen Geräte trennen und Konfiguration laden?" -#: src/templates/index.html:32 src/templates/index.html:338 +#: src/templates/index.html:44 src/templates/index.html:356 msgid "Delete" msgstr "Löschen" -#: src/templates/index.html:32 +#: src/templates/index.html:44 msgid "Delete configuration file?" msgstr "Konfigurationsdatei löschen?" -#: src/templates/index.html:33 src/templates/index.html:376 +#: src/templates/index.html:45 src/templates/index.html:415 msgid "Download" msgstr "Herunterladen" -#: src/templates/index.html:42 +#: src/templates/index.html:54 msgid "Save" msgstr "Speichern" -#: src/templates/index.html:49 src/templates/index.html:295 -#: src/templates/index.html:605 +#: src/templates/index.html:61 src/templates/index.html:313 +#: src/templates/index.html:652 msgid "ID" msgstr "ID" -#: src/templates/index.html:53 src/templates/index.html:545 +#: src/templates/index.html:65 src/templates/index.html:592 msgid "Device" msgstr "Gerät" -#: src/templates/index.html:56 src/templates/index.html:205 +#: src/templates/index.html:68 src/templates/index.html:230 msgid "Actions" msgstr "Aktionen" -#: src/templates/index.html:79 +#: src/templates/index.html:91 msgid "File name" msgstr "Dateiname" -#: src/templates/index.html:97 src/templates/index.html:323 -#: src/templates/index.html:615 +#: src/templates/index.html:109 src/templates/index.html:341 +#: src/templates/index.html:662 msgid "Attach" msgstr "Verbinden" -#: src/templates/index.html:127 +#: src/templates/index.html:139 msgid "Eject Disk? WARNING: On Mac OS, eject the Disk in the Finder instead!" msgstr "Disk auswerfen? WARNUNG: Auf Mac OS Disk zuerst im Finder auswerfen!" -#: src/templates/index.html:130 +#: src/templates/index.html:142 msgid "Eject" msgstr "Auswerfen" -#: src/templates/index.html:133 +#: src/templates/index.html:145 msgid "Detach Device?" msgstr "Gerät trennen?" -#: src/templates/index.html:136 +#: src/templates/index.html:148 msgid "Detach" msgstr "Trennen" -#: src/templates/index.html:139 +#: src/templates/index.html:151 msgid "Enter a memo for this reservation" msgstr "Gib ein memo für diese Reservierung ein" -#: src/templates/index.html:142 +#: src/templates/index.html:154 msgid "Reserve" msgstr "Reservieren" -#: src/templates/index.html:151 +#: src/templates/index.html:163 msgid "Reserved ID" msgstr "Reservierte ID" -#: src/templates/index.html:157 +#: src/templates/index.html:169 msgid "Release" msgstr "Lösen" -#: src/templates/index.html:167 +#: src/templates/index.html:179 msgid "Detach all SCSI Devices?" msgstr "Alle SCSI-Geräte trennen?" -#: src/templates/index.html:168 +#: src/templates/index.html:180 msgid "Detach All Devices" msgstr "Alle Geräte trennen" -#: src/templates/index.html:171 +#: src/templates/index.html:183 msgid "Show Device Info" msgstr "Zeige Geräteinfo" -#: src/templates/index.html:181 +#: src/templates/index.html:193 msgid "Image File Management" msgstr "Image-Dateiverwaltung" -#: src/templates/index.html:184 +#: src/templates/index.html:196 #, python-format msgid "" -"Manage image files in the active PiSCSI image directory: %(directory)s " -"with a scan depth of %(scan_depth)s." +"Manage image files in the active PiSCSI image directory: " +"%(directory)s with a scan depth of %(scan_depth)s." msgstr "" -"Verwalte Imagedateien im aktiven PiSCSI Imageverzeichnis %(directory)s " -"mit einer Scantiefe von %(scan_depth)s." +"Verwalte Imagedateien im aktiven PiSCSI Imageverzeichnis " +"%(directory)s mit einer Scantiefe von %(scan_depth)s." -#: src/templates/index.html:185 +#: src/templates/index.html:197 #, python-format msgid "" -"Select a valid SCSI ID and LUN to " -"attach to. Unless you know what you're doing, always use LUN 0." +"Select a valid SCSI ID and LUN " +"to attach to. Unless you know what you're doing, always use LUN 0." msgstr "" -"Wähle eine gültige SCSI-ID und LUN " -"zum Verbinden. Wenn Du nicht sicher bist dann benutze immer LUN 0." +"Wähle eine gültige SCSI-ID und LUN zum Verbinden. Wenn Du nicht sicher bist dann " +"benutze immer LUN 0." -#: src/templates/index.html:188 +#: src/templates/index.html:200 msgid "Recognized image file types:" msgstr "Erkannte Image-Dateitypen:" -#: src/templates/index.html:193 +#: src/templates/index.html:205 msgid "Recognized archive file types:" msgstr "Erkannte Archiv-Dateitypen:" -#: src/templates/index.html:204 -msgid "Size" -msgstr "Größe" - -#: src/templates/index.html:210 +#: src/templates/index.html:214 msgid "The images directory is currently empty." msgstr "Das Images-Verzeichnis ist derzeit leer." -#: src/templates/index.html:228 +#: src/templates/index.html:229 +msgid "Size" +msgstr "Größe" + +#: src/templates/index.html:246 msgid "Properties File" msgstr "Eigenschaftendatei" -#: src/templates/index.html:250 src/templates/index.html:262 -#: src/templates/index.html:289 +#: src/templates/index.html:268 src/templates/index.html:280 +#: src/templates/index.html:307 msgid "Extract" msgstr "Entdecken" -#: src/templates/index.html:250 src/templates/index.html:262 +#: src/templates/index.html:268 src/templates/index.html:280 msgid "Extracting a single file..." msgstr "Entpacke eine einzelne Datei…" -#: src/templates/index.html:277 src/templates/index.html:484 -#: src/templates/upload.html:50 +#: src/templates/index.html:295 src/templates/index.html:531 +#: src/templates/upload.html:68 msgid "MiB" msgstr "MiB" -#: src/templates/index.html:282 +#: src/templates/index.html:300 msgid "In use" msgstr "In Benutzung" -#: src/templates/index.html:289 +#: src/templates/index.html:307 msgid "Extracting all files..." msgstr "Entpacke alle Dateien…" -#: src/templates/index.html:312 +#: src/templates/index.html:330 msgid "Unknown" msgstr "Unbekannt" -#: src/templates/index.html:326 +#: src/templates/index.html:344 #, python-format msgid "Enter new file name for: %(file_name)s" msgstr "Gib einen neuen Dateinamen für %(file_name)s ein" -#: src/templates/index.html:329 src/templates/index.html:709 +#: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" msgstr "Umbenennen" -#: src/templates/index.html:331 +#: src/templates/index.html:349 #, python-format msgid "Save copy of %(file_name)s as:" msgstr "Speichere Kopie von %(file_name)s als:" -#: src/templates/index.html:334 +#: src/templates/index.html:352 msgid "Copy" msgstr "Kopiere" -#: src/templates/index.html:336 +#: src/templates/index.html:354 #, python-format msgid "Delete file: %(file_name)s?" msgstr "Datei %(file_name)s löschen?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "?" msgstr "?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "Info" msgstr "Info" -#: src/templates/index.html:352 +#: src/templates/index.html:374 #, python-format msgid "%(disk_space)s MiB disk space remaining on the system" msgstr "%(disk_space)s MiB Festplattenplatz auf dem Pi übrig" -#: src/templates/index.html:360 +#: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" msgstr "Übertrage Dateien zum PiSCSI" -#: src/templates/index.html:363 src/templates/index.html:373 -#: src/templates/upload.html:8 src/templates/upload.html:16 +#: src/templates/index.html:385 src/templates/index.html:398 +#: src/templates/upload.html:8 src/templates/upload.html:18 msgid "Disk Images" msgstr "Laufwerksimages" -#: src/templates/index.html:364 src/templates/index.html:375 -#: src/templates/upload.html:9 src/templates/upload.html:18 +#: src/templates/index.html:387 src/templates/index.html:407 +#: src/templates/upload.html:10 src/templates/upload.html:27 msgid "Shared Files" msgstr "Geteilte Dateien" -#: src/templates/index.html:365 +#: src/templates/index.html:389 msgid "" -"To access shared files remotely, you may have to install one of the file " -"servers first." +"Install a file server and create the shared files directory in order to " +"share files between the Pi and your vintage computers." msgstr "" -"Um entfernt auf geteilte Dateien zuzugreifen wirst Du möglicherweise zuerst " -"einen der Dateiserver installieren müssen." +"Installiere einen Dateiserver und erstelle das Verzeichnis für geteilte " +"Dateien um Dateien zwischen dem Pi und deinen Vintage-Computern " +"auszutauschen." -#: src/templates/index.html:370 src/templates/index.html:399 +#: src/templates/index.html:395 src/templates/index.html:446 msgid "Download file from URL:" msgstr "Datei von URL herunterladen:" -#: src/templates/index.html:376 +#: src/templates/index.html:415 msgid "Downloading File..." msgstr "Lade Datei herunter…" -#: src/templates/index.html:381 +#: src/templates/index.html:420 msgid "Upload Files (new tab)" msgstr "Dateien hochladen (neuer Tab)" -#: src/templates/index.html:389 +#: src/templates/index.html:427 src/templates/upload.html:77 +msgid "The file uploading functionality requires JavaScript." +msgstr "Die Dateiupload-Funktionalität benötigt JavaScript." + +#: src/templates/index.html:436 msgid "Create CD-ROM Image" msgstr "Erstelle CD-ROM-Image" -#: src/templates/index.html:392 +#: src/templates/index.html:439 msgid "HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX." msgstr "HFS ist für Mac OS, Joliet für Windows, und Rock Ridge für POSIX." -#: src/templates/index.html:393 +#: src/templates/index.html:440 msgid "" -"If the downloaded file is a zip archive, we will attempt to unzip it and store " -"the resulting files." +"If the downloaded file is a zip archive, we will attempt to unzip it and " +"store the resulting files." msgstr "" -"Die heruntergeladene Datei ist ein Zip-Archiv. Wir versuchen es zu entziehen " -"und die enthaltenen Dateien abzulegen." +"Die heruntergeladene Datei ist ein Zip-Archiv. Wir versuchen es zu " +"entziehen und die enthaltenen Dateien abzulegen." -#: src/templates/index.html:401 src/templates/index.html:433 -#: src/templates/index.html:475 +#: src/templates/index.html:448 src/templates/index.html:480 +#: src/templates/index.html:522 msgid "Type:" msgstr "Typ:" -#: src/templates/index.html:422 +#: src/templates/index.html:469 msgid "Downloading file and generating CD-ROM image..." msgstr "Lade Datei herunter und erzeuge CD-ROM-Image…" -#: src/templates/index.html:427 +#: src/templates/index.html:474 msgid "Use local file:" msgstr "Benutze lokale Datei:" -#: src/templates/index.html:454 +#: src/templates/index.html:501 msgid "Generating CD-ROM image..." msgstr "Erzeuge CD-ROM-Image..." -#: src/templates/index.html:464 +#: src/templates/index.html:511 msgid "Create Empty Disk Image" msgstr "Erstelle leeres Diskimage" -#: src/templates/index.html:467 +#: src/templates/index.html:514 #, python-format msgid "" -"Please refer to wiki documentation to " -"learn more about the supported image file types." +"Please refer to wiki " +"documentation to learn more about the supported image file types." msgstr "" -"Siehe wiki documentation um mehr über " -"die unterstützten Imagedatei-Typen zu erfahren." +"Siehe wiki documentation um " +"mehr über die unterstützten Imagedatei-Typen zu erfahren." -#: src/templates/index.html:468 +#: src/templates/index.html:515 msgid "" -"It is not recommended to use the Lido hard disk driver with the Macintosh Plus." +"It is not recommended to use the Lido hard disk driver with the Macintosh" +" Plus." msgstr "" -"Es wird nicht empfohlen den Lido Festplattentreiber mit dem Macintosh Plus zu " -"verwenden." +"Es wird nicht empfohlen den Lido Festplattentreiber mit dem Macintosh " +"Plus zu verwenden." -#: src/templates/index.html:483 +#: src/templates/index.html:530 msgid "Size:" msgstr "Größe:" -#: src/templates/index.html:485 src/templates/index.html:577 +#: src/templates/index.html:532 src/templates/index.html:624 msgid "Masquerade as:" msgstr "Maskiere als:" -#: src/templates/index.html:488 src/templates/index.html:499 -#: src/templates/index.html:580 +#: src/templates/index.html:535 src/templates/index.html:546 +#: src/templates/index.html:627 msgid "None" msgstr "Keines" -#: src/templates/index.html:496 +#: src/templates/index.html:543 msgid "Format as:" msgstr "Formatiere als:" -#: src/templates/index.html:519 +#: src/templates/index.html:566 msgid "Create Disk Image With Properties" msgstr "Erzeuge Diskimage mit Eigenschaften" -#: src/templates/index.html:528 +#: src/templates/index.html:575 msgid "Attach Peripheral Device" msgstr "Verbinde Peripherie-Gerät" -#: src/templates/index.html:533 +#: src/templates/index.html:580 msgid "" -"The piscsi_bridge network bridge is active and ready to be used by an " -"emulated network adapter!" +"The piscsi_bridge network bridge is active and ready to be used " +"by an emulated network adapter!" msgstr "" -"Die piscsi_bridge-Netzwerk-Bridge ist aktiv und bereit vom emulierten " -"Netzwerkadapter verwendet zu werden!" +"Die piscsi_bridge-Netzwerk-Bridge ist aktiv und bereit vom " +"emulierten Netzwerkadapter verwendet zu werden!" -#: src/templates/index.html:535 +#: src/templates/index.html:582 msgid "" -"Please configure the piscsi_bridge network bridge before attaching an " -"emulated network adapter!" +"Please configure the piscsi_bridge network bridge before " +"attaching an emulated network adapter!" msgstr "" -"Bitte konfiguriere die piscsi_bridge-Netzwerk-Bridge vor dem Anhängen " -"an einen emulierten Netzwerkadapter!" +"Bitte konfiguriere die piscsi_bridge-Netzwerk-Bridge vor dem " +"Anhängen an einen emulierten Netzwerkadapter!" -#: src/templates/index.html:537 +#: src/templates/index.html:584 #, python-format msgid "" "To browse the modern web, install a vintage web proxy such as Macproxy." msgstr "" -"Um das moderne Web zu browsen, installiere einen Vintage Web-Proxy wie z.B. Macproxy." +"Um das moderne Web zu browsen, installiere einen Vintage Web-Proxy wie " +"z.B. Macproxy." -#: src/templates/index.html:539 +#: src/templates/index.html:586 #, python-format msgid "" -"Read more about supported device types on the wiki." +"Read more about supported device " +"types on the wiki." msgstr "" -"Lies mehr über unterstützte Gerätetypen auf dem Wiki." +"Lies mehr über unterstützte " +"Gerätetypen auf dem Wiki." -#: src/templates/index.html:546 +#: src/templates/index.html:593 msgid "Key" msgstr "Taste" -#: src/templates/index.html:547 +#: src/templates/index.html:594 msgid "Parameters and Actions" msgstr "Parameter und Aktionen" -#: src/templates/index.html:627 +#: src/templates/index.html:674 msgid "Logging" msgstr "Logging" -#: src/templates/index.html:630 +#: src/templates/index.html:677 msgid "The current dropdown selection indicates the active log level." msgstr "Die aktuelle Dropdown-Auswahl markiert den aktiven Log-Level." -#: src/templates/index.html:636 +#: src/templates/index.html:683 msgid "Log Lines:" msgstr "Log-Zeilen:" -#: src/templates/index.html:638 +#: src/templates/index.html:685 msgid "Scope:" msgstr "Bereich:" -#: src/templates/index.html:641 +#: src/templates/index.html:688 msgid "All logs" msgstr "Alle Logs" -#: src/templates/index.html:656 +#: src/templates/index.html:703 msgid "Show Logs" msgstr "Zeige Logs" -#: src/templates/index.html:662 +#: src/templates/index.html:709 msgid "Log Level:" msgstr "Log-Level:" -#: src/templates/index.html:670 +#: src/templates/index.html:717 msgid "Set Log Level" msgstr "Setze Log-Level" -#: src/templates/index.html:680 +#: src/templates/index.html:727 msgid "System Operations" msgstr "Systemoperationen" -#: src/templates/index.html:683 +#: src/templates/index.html:730 msgid "" -"The System Name is the \"pretty\" hostname if set, with a fallback to the " -"regular hostname." +"The System Name is the \"pretty\" hostname if set, with a fallback to the" +" regular hostname." msgstr "" -"Der Systemname ist der \"schöne\" Hostname wenn gesetzt, mit Fallback auf den " -"gewöhnlichen Hostnamen." +"Der Systemname ist der \"schöne\" Hostname wenn gesetzt, mit Fallback auf" +" den gewöhnlichen Hostnamen." -#: src/templates/index.html:684 +#: src/templates/index.html:731 msgid "" -"IMPORTANT: Always shut down the system before turning off the power. Failing to " -"do so may lead to data loss." +"IMPORTANT: Always shut down the system before turning off the power. " +"Failing to do so may lead to data loss." msgstr "" "WICHTIG: Fahre das System immer herunter bevor Du die Stromversorgung " "ausschaltest. Andernfalls kann es zu Datenverlust kommen." -#: src/templates/index.html:690 +#: src/templates/index.html:737 msgid "Language:" msgstr "Sprache:" -#: src/templates/index.html:702 +#: src/templates/index.html:749 msgid "Change Language" msgstr "Sprache ändern" -#: src/templates/index.html:713 +#: src/templates/index.html:760 msgid "Reset" msgstr "Zurücksetzen" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Reboot the System?" msgstr "Das System neustarten?" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Rebooting the system..." msgstr "Das System wird neugestartet…" -#: src/templates/index.html:718 +#: src/templates/index.html:765 msgid "Reboot System" msgstr "System neustarten" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shut Down the System?" msgstr "Das System herunterfahren?" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shutting down the system..." msgstr "System wird heruntergefahren…" -#: src/templates/index.html:721 +#: src/templates/index.html:768 msgid "Shut Down System" msgstr "System herunterfahren" -#: src/templates/index.html:729 +#: src/templates/index.html:776 msgid "Read the PiSCSI Manual" msgstr "Lies das PiSCSI-Handbuch" @@ -1163,11 +1180,12 @@ msgstr "Datei vom lokalen Computer hochladen" #: src/templates/upload.html:6 #, python-format msgid "" -"The largest file size accepted in this form is %(max_file_size)s MiB. Use other " -"file transfer means for larger files." +"The largest file size accepted in this form is %(max_file_size)s MiB. Use" +" other file transfer means for larger files." msgstr "" -"Die größte akzeptierte Dateigröße in diesem Formular ist %(max_file_size)s MiB. " -"Benutze andere Übertragungsmöglichkeiten für größere Dateien." +"Die größte akzeptierte Dateigröße in diesem Formular ist " +"%(max_file_size)s MiB. Benutze andere Übertragungsmöglichkeiten für " +"größere Dateien." #: src/templates/upload.html:7 msgid "" @@ -1177,72 +1195,75 @@ msgstr "" "Du musst (aufgrund unterbrochener Übertragung oder verlassen der Seite) " "teilweise hochgeladene Dateien selbst aufräumen." -#: src/templates/upload.html:10 src/templates/upload.html:20 +#: src/templates/upload.html:12 src/templates/upload.html:36 msgid "PiSCSI Config" msgstr "PiSCSI Konfiguration" -#: src/templates/upload.html:13 +#: src/templates/upload.html:15 msgid "Destination" msgstr "Ziel" -#: src/templates/upload.html:36 +#: src/templates/upload.html:54 msgid "Drop files here to upload" msgstr "Dateien zum Hochladen hier ablegen" -#: src/templates/upload.html:37 +#: src/templates/upload.html:55 msgid "Your browser does not support drag'n'drop file uploads." msgstr "Dein Browser unterstützt keine Drag’n’Drop Dateiuploads." -#: src/templates/upload.html:38 +#: src/templates/upload.html:56 msgid "" -"Please use the fallback form below to upload your files like in the olden days." +"Please use the fallback form below to upload your files like in the olden" +" days." msgstr "" -"Bitte benutze das Formular unten als Ausweichlösung wie zur guten alten Zeit." +"Bitte benutze das Formular unten als Ausweichlösung wie zur guten alten " +"Zeit." -#: src/templates/upload.html:39 +#: src/templates/upload.html:57 msgid "File is too big: {{filesize}}MiB. Max filesize: {{maxFilesize}}MiB." msgstr "Datei ist zu groß: {{filesize}}MiB. Max. Dateigröße: {{maxFilesize}}MiB." -#: src/templates/upload.html:40 +#: src/templates/upload.html:58 msgid "You can't upload files of this type." msgstr "Du kannst diesen Dateityp nicht hochladen." -#: src/templates/upload.html:41 +#: src/templates/upload.html:59 msgid "Server responded with code: {{statusCode}}" msgstr "Server hat mit Code {{statusCode}} geantwortet" -#: src/templates/upload.html:42 +#: src/templates/upload.html:60 msgid "Cancel upload" msgstr "Hochladen abbrechen" -#: src/templates/upload.html:43 +#: src/templates/upload.html:61 msgid "Upload canceled." msgstr "Hochladen abgebrochen." -#: src/templates/upload.html:44 +#: src/templates/upload.html:62 msgid "Are you sure you want to cancel this upload?" msgstr "Bist Du sicher dass Du das Hochladen abbrechen möchtest?" -#: src/templates/upload.html:45 +#: src/templates/upload.html:63 msgid "Dismiss" msgstr "Verwerfen" -#: src/templates/upload.html:46 +#: src/templates/upload.html:64 msgid "You can not upload any more files." msgstr "Du kannst keine Dateien mehr hochladen." -#: src/templates/upload.html:48 +#: src/templates/upload.html:66 msgid "TiB" msgstr "TiB" -#: src/templates/upload.html:49 +#: src/templates/upload.html:67 msgid "GiB" msgstr "GiB" -#: src/templates/upload.html:51 +#: src/templates/upload.html:69 msgid "KiB" msgstr "KiB" -#: src/templates/upload.html:52 +#: src/templates/upload.html:70 msgid "B" msgstr "B" + From 8987ce30cdbdd0a5617f8b90e63813f86e58a2a2 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Mon, 27 Mar 2023 17:49:21 -0700 Subject: [PATCH 21/30] Remove the deprecated Python loopback test (#1138) --- python/loopback_test/test.py | 380 ----------------------------------- 1 file changed, 380 deletions(-) delete mode 100644 python/loopback_test/test.py diff --git a/python/loopback_test/test.py b/python/loopback_test/test.py deleted file mode 100644 index 2e27dd00..00000000 --- a/python/loopback_test/test.py +++ /dev/null @@ -1,380 +0,0 @@ -#!/usr/bin/env python3 -# BSD 3-Clause License -# -# Copyright (c) 2021, akuker -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import RPi.GPIO as gpio -import time - -pin_settle_delay = 0.01 - -err_count = 0 - -# Define constants for each of the SCSI signals, based upon their -# raspberry pi pin number (since we're using BOARD mode of RPi.GPIO) -scsi_d0_gpio = 19 -scsi_d1_gpio = 23 -scsi_d2_gpio = 32 -scsi_d3_gpio = 33 -scsi_d4_gpio = 8 -scsi_d5_gpio = 10 -scsi_d6_gpio = 36 -scsi_d7_gpio = 11 -scsi_dp_gpio = 12 -scsi_atn_gpio = 35 -scsi_rst_gpio = 38 -scsi_ack_gpio = 40 -scsi_req_gpio = 15 -scsi_msg_gpio = 16 -scsi_cd_gpio = 18 -scsi_io_gpio = 22 -scsi_bsy_gpio = 37 -scsi_sel_gpio = 13 - -# Pin numbers of the direction controllers of the PiSCSI board -piscsi_ind_gpio = 31 -piscsi_tad_gpio = 26 -piscsi_dtd_gpio = 24 -piscsi_none = -1 - -# Matrix showing all of the SCSI signals, along what signal they're looped back to. -# dir_ctrl indicates which direction control pin is associated with that output -gpio_map = [ - { - "gpio_num": scsi_d0_gpio, - "attached_to": scsi_ack_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d1_gpio, - "attached_to": scsi_sel_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d2_gpio, - "attached_to": scsi_atn_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d3_gpio, - "attached_to": scsi_rst_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d4_gpio, - "attached_to": scsi_cd_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d5_gpio, - "attached_to": scsi_io_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d6_gpio, - "attached_to": scsi_msg_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_d7_gpio, - "attached_to": scsi_req_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_dp_gpio, - "attached_to": scsi_bsy_gpio, - "dir_ctrl": piscsi_dtd_gpio, - }, - { - "gpio_num": scsi_atn_gpio, - "attached_to": scsi_d2_gpio, - "dir_ctrl": piscsi_ind_gpio, - }, - { - "gpio_num": scsi_rst_gpio, - "attached_to": scsi_d3_gpio, - "dir_ctrl": piscsi_ind_gpio, - }, - { - "gpio_num": scsi_ack_gpio, - "attached_to": scsi_d0_gpio, - "dir_ctrl": piscsi_ind_gpio, - }, - { - "gpio_num": scsi_req_gpio, - "attached_to": scsi_d7_gpio, - "dir_ctrl": piscsi_tad_gpio, - }, - { - "gpio_num": scsi_msg_gpio, - "attached_to": scsi_d6_gpio, - "dir_ctrl": piscsi_tad_gpio, - }, - { - "gpio_num": scsi_cd_gpio, - "attached_to": scsi_d4_gpio, - "dir_ctrl": piscsi_tad_gpio, - }, - { - "gpio_num": scsi_io_gpio, - "attached_to": scsi_d5_gpio, - "dir_ctrl": piscsi_tad_gpio, - }, - { - "gpio_num": scsi_bsy_gpio, - "attached_to": scsi_dp_gpio, - "dir_ctrl": piscsi_tad_gpio, - }, - { - "gpio_num": scsi_sel_gpio, - "attached_to": scsi_d1_gpio, - "dir_ctrl": piscsi_ind_gpio, - }, -] - -# List of all of the SCSI signals that is also a dictionary to their human readable name -scsi_signals = { - scsi_d0_gpio: "D0", - scsi_d1_gpio: "D1", - scsi_d2_gpio: "D2", - scsi_d3_gpio: "D3", - scsi_d4_gpio: "D4", - scsi_d5_gpio: "D5", - scsi_d6_gpio: "D6", - scsi_d7_gpio: "D7", - scsi_dp_gpio: "DP", - scsi_atn_gpio: "ATN", - scsi_rst_gpio: "RST", - scsi_ack_gpio: "ACK", - scsi_req_gpio: "REQ", - scsi_msg_gpio: "MSG", - scsi_cd_gpio: "CD", - scsi_io_gpio: "IO", - scsi_bsy_gpio: "BSY", - scsi_sel_gpio: "SEL", -} - - -# Debug function that just dumps the status of all of the scsi signals to the console -def print_all(): - for cur_gpio in gpio_map: - print( - cur_gpio["name"] + "=" + str(gpio.input(cur_gpio["gpio_num"])) + " ", - end="", - flush=True, - ) - print("") - - -# Set transceivers IC1 and IC2 to OUTPUT -def set_dtd_out(): - gpio.output(piscsi_dtd_gpio, gpio.LOW) - - -# Set transceivers IC1 and IC2 to INPUT -def set_dtd_in(): - gpio.output(piscsi_dtd_gpio, gpio.HIGH) - - -# Set transceiver IC4 to OUTPUT -def set_ind_out(): - gpio.output(piscsi_ind_gpio, gpio.HIGH) - - -# Set transceiver IC4 to INPUT -def set_ind_in(): - gpio.output(piscsi_ind_gpio, gpio.LOW) - - -# Set transceiver IC3 to OUTPUT -def set_tad_out(): - gpio.output(piscsi_tad_gpio, gpio.HIGH) - - -# Set transceiver IC3 to INPUT -def set_tad_in(): - gpio.output(piscsi_tad_gpio, gpio.LOW) - - -# Set the specified transciever to an OUTPUT. All of the other transceivers -# will be set to inputs. If a non-existent direction gpio is specified, this -# will set all of the transceivers to inputs. -def set_output_channel(out_gpio): - if out_gpio == piscsi_tad_gpio: - set_tad_out() - else: - set_tad_in() - if out_gpio == piscsi_dtd_gpio: - set_dtd_out() - else: - set_dtd_in() - if out_gpio == piscsi_ind_gpio: - set_ind_out() - else: - set_ind_in() - - -# Main test procedure. This will execute for each of the SCSI pins to make sure its connected -# properly. -def test_gpio_pin(gpio_rec): - global err_count - - set_output_channel(gpio_rec["dir_ctrl"]) - - ############################################ - # set the test gpio low - gpio.output(gpio_rec["gpio_num"], gpio.LOW) - - time.sleep(pin_settle_delay) - - # loop through all of the gpios - for cur_gpio in scsi_signals: - # all of the gpios should be high except for the test gpio and the connected gpio - cur_val = gpio.input(cur_gpio) - if cur_gpio == gpio_rec["gpio_num"]: - if cur_val != gpio.LOW: - print( - "Error: Test commanded GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " to be low, but it did not respond" - ) - err_count = err_count + 1 - elif cur_gpio == gpio_rec["attached_to"]: - if cur_val != gpio.LOW: - print( - "Error: GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " should drive " - + scsi_signals[gpio_rec["attached_to"]] - + " low, but did not" - ) - err_count = err_count + 1 - else: - if cur_val != gpio.HIGH: - print( - "Error: GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " incorrectly pulled " - + scsi_signals[cur_gpio] - + " LOW, when it shouldn't have" - ) - err_count = err_count + 1 - - ############################################ - # set the transceivers to input - set_output_channel(piscsi_none) - - time.sleep(pin_settle_delay) - - # loop through all of the gpios - for cur_gpio in scsi_signals: - # all of the gpios should be high except for the test gpio - cur_val = gpio.input(cur_gpio) - if cur_gpio == gpio_rec["gpio_num"]: - if cur_val != gpio.LOW: - print( - "Error: Test commanded GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " to be low, but it did not respond" - ) - err_count = err_count + 1 - else: - if cur_val != gpio.HIGH: - print( - "Error: GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " incorrectly pulled " - + scsi_signals[cur_gpio] - + " LOW, when it shouldn't have" - ) - err_count = err_count + 1 - - # Set the transceiver back to output - set_output_channel(gpio_rec["dir_ctrl"]) - - ############################################# - # set the test gpio high - gpio.output(gpio_rec["gpio_num"], gpio.HIGH) - - time.sleep(pin_settle_delay) - - # loop through all of the gpios - for cur_gpio in scsi_signals: - # all of the gpios should be high - cur_val = gpio.input(cur_gpio) - if cur_gpio == gpio_rec["gpio_num"]: - if cur_val != gpio.HIGH: - print( - "Error: Test commanded GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " to be high, but it did not respond" - ) - err_count = err_count + 1 - else: - if cur_val != gpio.HIGH: - print( - "Error: GPIO " - + scsi_signals[gpio_rec["gpio_num"]] - + " incorrectly pulled " - + scsi_signals[cur_gpio] - + " LOW, when it shouldn't have" - ) - err_count = err_count + 1 - - -# Initialize the GPIO library, set all of the gpios associated with SCSI signals to outputs and set -# all of the direction control gpios to outputs -def setup(): - gpio.setmode(gpio.BOARD) - gpio.setwarnings(False) - for cur_gpio in gpio_map: - gpio.setup(cur_gpio["gpio_num"], gpio.OUT, initial=gpio.HIGH) - - # Setup direction control - gpio.setup(piscsi_ind_gpio, gpio.OUT) - gpio.setup(piscsi_tad_gpio, gpio.OUT) - gpio.setup(piscsi_dtd_gpio, gpio.OUT) - - -# Main functions for running the actual test. -if __name__ == "__main__": - # setup the GPIOs - setup() - # Test each SCSI signal in the gpio_map - for cur_gpio in gpio_map: - test_gpio_pin(cur_gpio) - - # Print the test results - if err_count == 0: - print("-------- Test PASSED --------") - else: - print("!!!!!!!! Test FAILED !!!!!!!!") - print("Total errors: " + str(err_count)) - - gpio.cleanup() From 07e953fa778b796f39b381b80e4c5726d22093cb Mon Sep 17 00:00:00 2001 From: Uwe Seimet <48174652+uweseimet@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:21:36 +0200 Subject: [PATCH 22/30] Fixed a potential issue with the unit test order (reserved file cleanup was missing) (#1137) * Fixed a potential issue with the unit test order * Updated error handling --- cpp/hal/gpiobus_raspberry.cpp | 4 ++-- cpp/test/piscsi_image_test.cpp | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cpp/hal/gpiobus_raspberry.cpp b/cpp/hal/gpiobus_raspberry.cpp index 757edc3b..c3dfe3ca 100644 --- a/cpp/hal/gpiobus_raspberry.cpp +++ b/cpp/hal/gpiobus_raspberry.cpp @@ -87,7 +87,7 @@ bool GPIOBUS_Raspberry::Init(mode_e mode) // Map peripheral region memory void *map = mmap(NULL, 0x1000100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, baseaddr); if (map == MAP_FAILED) { - LOGERROR("Error: Unable to map memory") + LOGERROR("Error: Unable to map memory: %s", strerror(errno)) close(fd); return false; } @@ -985,4 +985,4 @@ uint32_t GPIOBUS_Raspberry::Acquire() #endif // SIGNAL_CONTROL_MODE return signals; -} \ No newline at end of file +} diff --git a/cpp/test/piscsi_image_test.cpp b/cpp/test/piscsi_image_test.cpp index b4a12095..ac48aa2b 100644 --- a/cpp/test/piscsi_image_test.cpp +++ b/cpp/test/piscsi_image_test.cpp @@ -39,6 +39,8 @@ TEST(PiscsiImageTest, CreateImage) PbCommand command; PiscsiImage image; + StorageDevice::UnreserveAll(); + EXPECT_FALSE(image.CreateImage(context, command)) << "Filename must be reported as missing"; SetParam(command, "file", "/a/b/c/filename"); @@ -63,6 +65,8 @@ TEST(PiscsiImageTest, DeleteImage) PbCommand command; PiscsiImage image; + StorageDevice::UnreserveAll(); + EXPECT_FALSE(image.DeleteImage(context, command)) << "Filename must be reported as missing"; SetParam(command, "file", "/a/b/c/filename"); @@ -82,6 +86,8 @@ TEST(PiscsiImageTest, RenameImage) PbCommand command; PiscsiImage image; + StorageDevice::UnreserveAll(); + EXPECT_FALSE(image.RenameImage(context, command)) << "Source filename must be reported as missing"; SetParam(command, "from", "/a/b/c/filename_from"); @@ -99,6 +105,8 @@ TEST(PiscsiImageTest, CopyImage) PbCommand command; PiscsiImage image; + StorageDevice::UnreserveAll(); + EXPECT_FALSE(image.CopyImage(context, command)) << "Source filename must be reported as missing"; SetParam(command, "from", "/a/b/c/filename_from"); @@ -116,6 +124,8 @@ TEST(PiscsiImageTest, SetImagePermissions) PbCommand command; PiscsiImage image; + StorageDevice::UnreserveAll(); + EXPECT_FALSE(image.SetImagePermissions(context, command)) << "Filename must be reported as missing"; SetParam(command, "file", "/a/b/c/filename"); From 620f4e972ed5bd09557441b107c14969a8f435f8 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Tue, 28 Mar 2023 07:50:21 -0700 Subject: [PATCH 23/30] Swedish translation update March 2023 (#1136) --- .../translations/sv/LC_MESSAGES/messages.po | 749 +++++++++--------- 1 file changed, 376 insertions(+), 373 deletions(-) diff --git a/python/web/src/translations/sv/LC_MESSAGES/messages.po b/python/web/src/translations/sv/LC_MESSAGES/messages.po index 181ea914..6241a3e2 100644 --- a/python/web/src/translations/sv/LC_MESSAGES/messages.po +++ b/python/web/src/translations/sv/LC_MESSAGES/messages.po @@ -5,18 +5,19 @@ # msgid "" msgstr "" -"Project-Id-Version: PiSCSI\n" +"Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/PiSCSI/piscsi/issues\n" -"POT-Creation-Date: 2023-01-28 22:53-0800\n" -"PO-Revision-Date: 2023-01-28 20:16-0800\n" +"POT-Creation-Date: 2023-03-19 14:43-0700\n" +"PO-Revision-Date: 2023-03-24 09:06-0700\n" "Last-Translator: Daniel Markstedt \n" -"Language: sv\n" "Language-Team: N/A\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: sv\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" "Generated-By: Babel 2.11.0\n" +"X-Generator: Poedit 3.2.2\n" #: src/return_code_mapper.py:14 #, python-format @@ -30,81 +31,90 @@ msgstr "Kunde ej radera filen %(file_path)s" #: src/return_code_mapper.py:18 #, python-format +msgid "Could not delete file: %(file_path)s" +msgstr "Kunde ej skapa filen %(file_path)s" + +#: src/return_code_mapper.py:20 +#, python-format msgid "File moved to: %(target_path)s" msgstr "Flyttade filen till %(target_path)s" -#: src/return_code_mapper.py:20 +#: src/return_code_mapper.py:22 #, python-format msgid "Unable to move file to: %(target_path)s" msgstr "Kunde ej flytta filen till %(target_path)s" -#: src/return_code_mapper.py:22 +#: src/return_code_mapper.py:24 #, python-format msgid "Created CD-ROM ISO image with arguments \"%(value)s\"" msgstr "Skapade en cd-rom ISO-fil med argumentet \"%(value)s\"" -#: src/return_code_mapper.py:24 +#: src/return_code_mapper.py:26 #, python-format msgid "%(file_name)s downloaded to %(save_dir)s" msgstr "Laddade ner %(file_name)s till %(save_dir)s" -#: src/return_code_mapper.py:26 +#: src/return_code_mapper.py:28 #, python-format msgid "File created: %(target_path)s" msgstr "Skapade filen %(target_path)s" -#: src/return_code_mapper.py:28 +#: src/return_code_mapper.py:30 #, python-format msgid "Could not create file: %(target_path)s" msgstr "Kunde ej skapa filen %(target_path)s" -#: src/return_code_mapper.py:30 +#: src/return_code_mapper.py:32 +#, python-format +msgid "A file with name %(target_path)s already exists" +msgstr "En fil med namn %(target_path)s finns redan" + +#: src/return_code_mapper.py:34 #, python-format msgid "Loaded configurations from: %(file_name)s" msgstr "Laddade konfigurationer från %(file_name)s" -#: src/return_code_mapper.py:32 +#: src/return_code_mapper.py:36 #, python-format msgid "Could not read configuration file: %(file_name)s" msgstr "Kunde ej läsa konfigurationer från filen %(file_name)s" -#: src/return_code_mapper.py:34 +#: src/return_code_mapper.py:38 msgid "Invalid configuration file format" msgstr "Ogiltigt konfigurationsfilformat" -#: src/return_code_mapper.py:36 +#: src/return_code_mapper.py:40 #, python-format msgid "Read properties from file: %(file_path)s" msgstr "Läste egenskaper från filen %(file_path)s" -#: src/return_code_mapper.py:38 +#: src/return_code_mapper.py:42 #, python-format msgid "Could not read properties from file: %(file_path)s" msgstr "Kunde ej läsa egenskaper från filen %(file_path)s" -#: src/return_code_mapper.py:40 +#: src/return_code_mapper.py:44 #, python-format msgid "" -"Cannot insert an image for %(device_type)s into a %(current_device_type)s" -" device" +"Cannot insert an image for %(device_type)s into a %(current_device_type)s device" msgstr "" -"Det går inte att mata in en skiva av typ %(device_type)s i en enhet av " -"typ %(current_device_type)s" +"Det går inte att mata in en skiva av typ %(device_type)s i en enhet av typ " +"%(current_device_type)s" -#: src/return_code_mapper.py:42 +#: src/return_code_mapper.py:46 #, python-format msgid "Extracted %(count)s file(s)" msgstr "Packade upp %(count)s fil(er)" -#: src/return_code_mapper.py:44 +#: src/return_code_mapper.py:48 msgid "Unable to extract archive: No files were specified" msgstr "Kunde ej packa upp arkivet: Inga filer blev valda" -#: src/return_code_mapper.py:46 +#: src/return_code_mapper.py:50 msgid "No files were extracted (existing files are skipped)" msgstr "Inga filer packages upp (hoppade över existerande filer)" -#: src/return_code_mapper.py:48 +#: src/return_code_mapper.py:52 #, python-format msgid "Unable to extract archive: %(error)s" msgstr "Kunde ej packa upp arkivet: %(error)s" @@ -112,47 +122,38 @@ msgstr "Kunde ej packa upp arkivet: %(error)s" #: src/socket_cmds_flask.py:42 #, python-format msgid "" -"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s" -" with error: %(error_msg)s. The PiSCSI process is not running or may have" -" crashed." +"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s with " +"error: %(error_msg)s. The PiSCSI process is not running or may have crashed." msgstr "" -"PiSCSIs webbgränssnitt kunde inte ansluta till PiSCSI på " -"%(host)s:%(port)s med felmeddelandet '%(error_msg)s'. PiSCSI-processen är" -" antingen avslagen eller har krashat." +"PiSCSIs webbgränssnitt kunde inte ansluta till PiSCSI på %(host)s:%(port)s med " +"felmeddelandet '%(error_msg)s'. PiSCSI-processen är antingen avslagen eller har " +"krashat." #: src/socket_cmds_flask.py:54 msgid "" -"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and " -"try again. If the issue persists, please report a bug." +"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and try " +"again. If the issue persists, please report a bug." msgstr "" -"PiSCSIs webbgränssnitt tappade kontaken med PiSCSI. Gå tillbaks och " -"försök igen. Om samma fel upprepas så rapportera en bugg." +"PiSCSIs webbgränssnitt tappade kontaken med PiSCSI. Gå tillbaks och försök igen. " +"Om samma fel upprepas så rapportera en bugg." #: src/socket_cmds_flask.py:64 msgid "" -"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please" -" go back and try again. If the issue persists, please report a bug." +"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please go " +"back and try again. If the issue persists, please report a bug." msgstr "" -"PiSCSIs webbgränssnitt fick en ogiltig respons från PiSCSI. Gå tillbaks " -"och försök igen. Om samma fel upprepas så rapportera en bugg." +"PiSCSIs webbgränssnitt fick en ogiltig respons från PiSCSI. Gå tillbaks och " +"försök igen. Om samma fel upprepas så rapportera en bugg." -#: src/web.py:214 -msgid "" -"PiSCSI is password protected. Start the Web Interface with the --password" -" parameter." -msgstr "" -"PiSCSI är lösenordsskyddat. Start webbgränssnittet med parametern '--" -"password'." - -#: src/web.py:263 +#: src/web.py:252 msgid "PiSCSI Control Page" msgstr "PiSCSI kontrollsida" -#: src/web.py:309 +#: src/web.py:304 msgid "PiSCSI Create Drive" msgstr "PiSCSI skapa skiva" -#: src/web.py:323 +#: src/web.py:320 msgid "PiSCSI File Upload" msgstr "PiSCSI uppladdning" @@ -171,385 +172,372 @@ msgstr "Saknar egenskapsdata för skivan %(drive_name)s" msgid "Image file with properties created: %(file_name)s" msgstr "Skapade skivbildsfil med egenskaper: %(file_name)s" -#: src/web.py:521 +#: src/web.py:522 msgid "PiSCSI Image Info" msgstr "PiSCSI bildfilsinfo" -#: src/web.py:528 +#: src/web.py:529 #, python-format msgid "An error occurred when getting disk info: %(error)s" msgstr "Ett fel inträffade när vi hämtade skivinfo: %(error)s" -#: src/web.py:542 +#: src/web.py:543 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s är inte en giltig PiSCSI-app" -#: src/web.py:569 +#: src/web.py:570 msgid "PiSCSI Manual" msgstr "PiSCSI manual" -#: src/web.py:576 +#: src/web.py:577 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "Ett fel inträffade när vi hämtade manualsidan: %(error)s" -#: src/web.py:592 +#: src/web.py:593 msgid "PiSCSI System Logs" msgstr "PiSCSI systemloggar" -#: src/web.py:600 +#: src/web.py:601 #, python-format msgid "An error occurred when fetching logs: %(error)s" msgstr "Ett fel inträffade när vi hämtade loggar: %(error)s" -#: src/web.py:614 +#: src/web.py:615 #, python-format msgid "Log level set to %(value)s" msgstr "Bytte loggnivån till %(value)s" -#: src/web.py:631 src/web.py:694 +#: src/web.py:632 src/web.py:695 msgid "No SCSI ID specified" msgstr "Inget SCSI-id angett" -#: src/web.py:672 +#: src/web.py:673 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "" -"Anslöt %(device_type)s till SCSI-id %(id_number)s enhetsnummer " -"%(unit_number)s" +"Anslöt %(device_type)s till SCSI-id %(id_number)s enhetsnummer %(unit_number)s" -#: src/web.py:696 +#: src/web.py:697 msgid "No image file to insert" msgstr "Ingen skivfil att ansluta" -#: src/web.py:736 +#: src/web.py:737 #, python-format msgid "" "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " "%(unit_number)s" msgstr "" -"Anslöt %(file_name)s som %(device_type)s till SCSI-id %(id_number)s " -"enhetsnummer %(unit_number)s" +"Anslöt %(file_name)s som %(device_type)s till SCSI-id %(id_number)s enhetsnummer " +"%(unit_number)s" -#: src/web.py:753 +#: src/web.py:754 msgid "Detached all SCSI devices" msgstr "Kopplade ifrån alla SCSI-enheter" -#: src/web.py:769 +#: src/web.py:770 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Kopplade ifrån SCSI-id %(id_number)s enhetsnummer %(unit_number)s" -#: src/web.py:791 +#: src/web.py:792 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Matade ut SCSI-id %(id_number)s enhetsnummer %(unit_number)s" -#: src/web.py:810 +#: src/web.py:811 msgid "PiSCSI Device Info" msgstr "PiSCSI enhetsinfo" -#: src/web.py:814 +#: src/web.py:815 msgid "No devices attached" msgstr "Inga enheter anslutna" -#: src/web.py:830 +#: src/web.py:831 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "Reserverat SCSI-id %(id_number)s" -#: src/web.py:848 +#: src/web.py:849 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "Frigjorde SCSI-id %(id_number)s" -#: src/web.py:867 +#: src/web.py:868 #, python-format msgid "System name changed to '%(name)s'." msgstr "Ändrade systemnamnet till '%(name)s'." -#: src/web.py:868 +#: src/web.py:869 msgid "System name reset to default." msgstr "Återställde systemnamnet till grundvärdet." -#: src/web.py:870 +#: src/web.py:871 msgid "Failed to change system name." msgstr "Kunde ej ändra systemnamnet." -#: src/web.py:924 +#: src/web.py:925 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." -msgstr "%(iso_type)s är inte ett giltigt cd-romformat" +msgstr "%(iso_type)s är inte ett giltigt cd-romformat." -#: src/web.py:939 +#: src/web.py:940 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" msgstr "Ett fel inträffade när vi skapade en cd-bildfil: %(error)s" -#: src/web.py:946 +#: src/web.py:947 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "Cd-bildfilen %(file_name)s av typ %(iso_type)s har skapats." -#: src/web.py:974 +#: src/web.py:977 src/web.py:1021 +msgid "Unknown destination" +msgstr "Okänd destination" + +#: src/web.py:986 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "Ett fel inträffade under nedladdningen: %(error)s" -#: src/web.py:1045 src/web.py:1058 +#: src/web.py:1065 src/web.py:1078 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s är inte ett giltigt hårddisksformat." -#: src/web.py:1103 +#: src/web.py:1123 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "Skapade skivbildsfil med egenskaper: %(file_name)s%(drive_format)s" -#: src/web.py:1113 +#: src/web.py:1133 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "Skapade skivbildsfil %(file_name)s%(drive_format)s" -#: src/web.py:1174 +#: src/web.py:1194 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "Bildfil med egenskaper raderades: %(file_name)s" -#: src/web.py:1183 +#: src/web.py:1203 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "Filen %(file_name)s raderades" -#: src/web.py:1221 +#: src/web.py:1241 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "Filen med egenskaper döptes om till %(file_name)s" -#: src/web.py:1230 +#: src/web.py:1250 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "Filen döptes om till %(file_name)s" -#: src/web.py:1268 +#: src/web.py:1288 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "Kopierade filen med egenskaper och sparade den som %(file_name)s" -#: src/web.py:1277 +#: src/web.py:1297 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "Kopierade filen och sparade den som %(file_name)s" -#: src/web.py:1330 +#: src/web.py:1350 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Bytte webbgränssnittets språk till %(locale)s" -#: src/web.py:1341 +#: src/web.py:1361 msgid "The requested theme does not exist." msgstr "Temat existerar inte." -#: src/web.py:1344 +#: src/web.py:1364 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "Bytte till temat '%(theme)s'." -#: src/web_utils.py:98 +#: src/web_utils.py:112 msgid "Hard Disk Drive" msgstr "Hårddisk" -#: src/web_utils.py:100 +#: src/web_utils.py:114 msgid "Removable Disk Drive" msgstr "Uttagbar skivenhet" -#: src/web_utils.py:102 +#: src/web_utils.py:116 msgid "Magneto-Optical Drive" msgstr "Magnetoptisk enhet" -#: src/web_utils.py:104 +#: src/web_utils.py:118 msgid "CD/DVD Drive" msgstr "Cd- eller dvd-spelare" -#: src/web_utils.py:106 +#: src/web_utils.py:120 msgid "Host Bridge" msgstr "Värdbrygga" -#: src/web_utils.py:108 +#: src/web_utils.py:122 msgid "Ethernet Adapter" msgstr "Ethernet-gränssnitt" -#: src/web_utils.py:110 +#: src/web_utils.py:124 msgid "Printer" msgstr "Skrivare" -#: src/web_utils.py:112 +#: src/web_utils.py:126 msgid "Host Services" msgstr "Värdtjänster" -#: src/web_utils.py:135 +#: src/web_utils.py:149 msgid "Hard Disk Image (Generic)" msgstr "Hårddiskskiva (allmän)" -#: src/web_utils.py:137 +#: src/web_utils.py:151 msgid "Hard Disk Image (Apple)" msgstr "Hårddiskskiva (Apple)" -#: src/web_utils.py:139 +#: src/web_utils.py:153 msgid "Hard Disk Image (NEC)" msgstr "Hårddiskskiva (NEC)" -#: src/web_utils.py:141 +#: src/web_utils.py:155 msgid "Hard Disk Image (SCSI-1)" msgstr "Hårddiskskiva (SCSI-1)" -#: src/web_utils.py:143 +#: src/web_utils.py:157 msgid "Removable Disk Image" msgstr "Uttagbar skiva" -#: src/web_utils.py:145 +#: src/web_utils.py:159 msgid "Magneto-Optical Disk Image" msgstr "Magnetoptisk skiva" -#: src/web_utils.py:219 +#: src/web_utils.py:260 msgid "You must log in to use this function" msgstr "Du måste logga in för att använda den här funktionen" -#: src/web_utils.py:233 +#: src/web_utils.py:274 #, python-format msgid "Configure the network bridge for %(interface)s first: " msgstr "Ställ in nätverksbryggan för %(interface)s först: " -#: src/web_utils.py:262 +#: src/web_utils.py:303 #, python-format -msgid "%(file_name)s is not a valid path" -msgstr "%(file_name)s är inte en giltig sökväg" +msgid "No permission to use path '%(file_name)s'" +msgstr "Ingen behörighet att använda sökvägen \"%(file_name)s\"" -#: src/web_utils.py:283 +#: src/web_utils.py:324 msgid "The file already exists!" -msgstr "Filen existerar redan!" +msgstr "Filen finns redan!" -#: src/web_utils.py:291 +#: src/web_utils.py:332 msgid "Unable to write the file to disk!" msgstr "Kunde ej skriva filen till skivan!" -#: src/web_utils.py:299 +#: src/web_utils.py:340 msgid "Transferred file corrupted!" msgstr "Den överförda filen är skadad!" -#: src/web_utils.py:301 +#: src/web_utils.py:342 msgid "File upload successful!" msgstr "Filen har laddas upp!" -#: src/templates/base.html:29 -msgid "" -" This process may take a while, and will continue in the background if " -"you navigate away from this page." -msgstr "" -" Denna process kan ta ett tag, och kommer att forsätta i bakgrunden om du" -" navigerar bort från den här sidan." - -#: src/templates/base.html:34 -msgid "" -" The Web Interface will become unresponsive momentarily. Reload this page" -" after the Pi has started up again." -msgstr "" -" Webbgränssnittet kommer att sluta reagera nu. Ladda om den här sidan " -"efter systemet har startat igen." - -#: src/templates/base.html:47 +#: src/templates/base.html:33 #, python-format msgid "Logged in as %(username)s" msgstr "Inloggad som %(username)s" -#: src/templates/base.html:49 +#: src/templates/base.html:35 msgid "Log Out" msgstr "Logga ut" -#: src/templates/base.html:54 +#: src/templates/base.html:40 msgid "Log in to use Web Interface" msgstr "Logga in för att använda webbgränssnittet" -#: src/templates/base.html:56 +#: src/templates/base.html:42 msgid "Username:" -msgstr "Användarnamn:" +msgstr "Användare:" -#: src/templates/base.html:60 +#: src/templates/base.html:46 msgid "Password:" msgstr "Lösenord:" -#: src/templates/base.html:69 +#: src/templates/base.html:55 msgid "Web Interface Authentication Disabled" msgstr "Webbgränssnittets autensisering är avstängt" -#: src/templates/base.html:71 +#: src/templates/base.html:57 #, python-format msgid "See Wiki for more information" msgstr "Se wikin för vidare information" -#: src/templates/base.html:78 +#: src/templates/base.html:64 msgid "PiSCSI" msgstr "PiSCSI" -#: src/templates/base.html:79 +#: src/templates/base.html:65 msgid "Control Page" msgstr "kontrollsida" -#: src/templates/base.html:85 src/templates/index.html:707 +#: src/templates/base.html:71 src/templates/index.html:754 msgid "System Name:" msgstr "Systemnamn:" -#: src/templates/base.html:112 src/templates/base.html:114 +#: src/templates/base.html:98 src/templates/base.html:100 #, python-format msgid "Switch to the %(theme)s theme" msgstr "Byt till temat %(theme)s" -#: src/templates/base.html:120 +#: src/templates/base.html:106 msgid "The AppleShare server is running. No active connections." msgstr "AppleShare-servern är aktiv. Inga klienter är anslutna." -#: src/templates/base.html:123 +#: src/templates/base.html:109 #, python-format msgid "%(value)d active AFP connection" msgstr "%(value)d aktiv AFP-klient" -#: src/templates/base.html:125 +#: src/templates/base.html:111 #, python-format msgid "%(value)d active AFP connections" msgstr "%(value)d aktiva AFP-klienter" -#: src/templates/base.html:130 +#: src/templates/base.html:116 #, python-format msgid "Macproxy is running at %(ip_addr)s (default port 5000)" msgstr "Macproxy är tillgängligt på %(ip_addr)s (vanligtvis port 5000)" -#: src/templates/base.html:134 +#: src/templates/base.html:120 msgid "PiSCSI version:" msgstr "PiSCSI-version:" -#: src/templates/base.html:137 +#: src/templates/base.html:123 msgid "Hardware and OS:" msgstr "Hårdvara och operativsystem:" -#: src/templates/base.html:140 +#: src/templates/base.html:126 msgid "Network Address:" msgstr "Nätverksadress:" #: src/templates/deviceinfo.html:4 msgid "Detailed Info for Attached Devices" -msgstr "Detaljerad info om anslutna enheter" +msgstr "Detaljerad information för anslutna enheter" #: src/templates/deviceinfo.html:9 msgid "SCSI ID" msgstr "SCSI-id" -#: src/templates/deviceinfo.html:13 src/templates/index.html:51 -#: src/templates/index.html:303 src/templates/index.html:613 +#: src/templates/deviceinfo.html:13 src/templates/index.html:63 +#: src/templates/index.html:321 src/templates/index.html:660 msgid "LUN" msgstr "LUN" -#: src/templates/deviceinfo.html:17 src/templates/index.html:309 +#: src/templates/deviceinfo.html:17 src/templates/index.html:327 msgid "Type" msgstr "Typ" @@ -557,11 +545,11 @@ msgstr "Typ" msgid "Status" msgstr "Status" -#: src/templates/deviceinfo.html:25 src/templates/index.html:203 +#: src/templates/deviceinfo.html:25 src/templates/index.html:228 msgid "File" msgstr "Fil" -#: src/templates/deviceinfo.html:29 src/templates/index.html:54 +#: src/templates/deviceinfo.html:29 src/templates/index.html:66 msgid "Parameters" msgstr "Parametrar" @@ -569,7 +557,7 @@ msgstr "Parametrar" msgid "Vendor" msgstr "Tillverkare" -#: src/templates/deviceinfo.html:37 src/templates/index.html:55 +#: src/templates/deviceinfo.html:37 src/templates/index.html:67 msgid "Product" msgstr "Produkt" @@ -598,23 +586,22 @@ msgstr "Skivbildsdetaljer: %(file_name)s" #: src/templates/drives.html:4 msgid "Disclaimer" -msgstr "Notis" +msgstr "Observera" #: src/templates/drives.html:5 #, python-format msgid "" -"These device profiles are provided as-is with no guarantee to work " -"equally to the actual physical device they are named after. You may need " -"to provide appropirate device drivers and/or configuration parameters for" -" them to function properly. If you would like to see data modified, or " -"have additional devices to add to the list, please raise an issue ticket " -"at GitHub." +"These device profiles are provided as-is with no guarantee to work equally to " +"the actual physical device they are named after. You may need to provide " +"appropirate device drivers and/or configuration parameters for them to function " +"properly. If you would like to see data modified, or have additional devices to " +"add to the list, please raise an issue ticket at GitHub." msgstr "" -"Det finns ingen garanti att dessa enhetsprofiler fungerar lika väl som de" -" verkliga enheterna de delar namn med. Du bör antagligen skaffa " -"drivrutiner och ange vissa parametrar för att de ska fungera korrekt. Om " -"du ser något som bör ändras, eller om du har andra enhetsprofiler som du " -"skulle vilja lägga till, kontakta oss via GitHub." +"Det finns ingen garanti att dessa enhetsprofiler fungerar lika väl som de " +"verkliga enheterna de delar namn med. Du bör antagligen skaffa drivrutiner och " +"ange vissa parametrar för att de ska fungera korrekt. Om du ser något som bör " +"ändras, eller om du har andra enhetsprofiler som du skulle vilja lägga till, " +"kontakta oss via GitHub." #: src/templates/drives.html:6 msgid "Hard Disk Drives" @@ -644,8 +631,8 @@ msgid "Save as:" msgstr "Spara som:" #: src/templates/drives.html:32 src/templates/drives.html:72 -#: src/templates/drives.html:107 src/templates/index.html:422 -#: src/templates/index.html:454 src/templates/index.html:514 +#: src/templates/drives.html:107 src/templates/index.html:469 +#: src/templates/index.html:501 src/templates/index.html:561 msgid "Create" msgstr "Skapa" @@ -655,11 +642,11 @@ msgstr "Cd- och dvd-spelare" #: src/templates/drives.html:43 msgid "" -"This will create a properties file for the given CD-ROM or DVD image. No " -"new image file will be created." +"This will create a properties file for the given CD-ROM or DVD image. No new " +"image file will be created." msgstr "" -"Denna funktion skapar endast en egenskapsfil för en cd- eller dvd-" -"bildfil. Ingen ny cd-bildfil kommer att skapas." +"Denna funktion skapar endast en egenskapsfil för en cd- eller dvd-bildfil. Ingen " +"ny cd-bildfil kommer att skapas." #: src/templates/drives.html:64 msgid "Create for:" @@ -674,473 +661,493 @@ msgstr "Uttagbara enheter" msgid "%(disk_space)s MiB disk space remaining on the Pi" msgstr "%(disk_space)s MiB återstår på Pi-systemets skiva" -#: src/templates/index.html:7 +#: src/templates/index.html:6 +msgid "" +" This process may take a while, and will continue in the background if you " +"navigate away from this page." +msgstr "" +" Denna process kan ta ett tag, och kommer att forsätta i bakgrunden om du " +"navigerar bort från den här sidan." + +#: src/templates/index.html:11 +msgid "" +" The Web Interface will become unresponsive momentarily. Reload this page after " +"the Pi has started up again." +msgstr "" +" Webbgränssnittet kommer att sluta reagera nu. Ladda om den här sidan efter " +"systemet har startat igen." + +#: src/templates/index.html:19 msgid "Current PiSCSI Configuration" msgstr "Nuvarande PiSCSI-konfiguration" -#: src/templates/index.html:10 +#: src/templates/index.html:22 #, python-format msgid "" -"Save and load device configurations, stored as json files in " -"%(config_dir)s" +"Save and load device configurations, stored as json files in %(config_dir)s" msgstr "" "Spara och läs enhetskonfigurationer. Sparas som json-format i " "%(config_dir)s" -#: src/templates/index.html:11 +#: src/templates/index.html:23 msgid "" -"To have a particular device configuration load when PiSCSI starts, save " -"it as default." +"To have a particular device configuration load when PiSCSI starts, save it as " +"default." msgstr "" -"Om du sparar en enhetskonfiguration som default så blir den läst" -" när PiSCSI startar." +"Om du sparar en enhetskonfiguration som default så blir den läst när " +"PiSCSI startar." -#: src/templates/index.html:17 src/templates/index.html:39 -#: src/templates/index.html:473 +#: src/templates/index.html:29 src/templates/index.html:51 +#: src/templates/index.html:520 msgid "File Name:" msgstr "Filnamn:" -#: src/templates/index.html:27 +#: src/templates/index.html:39 msgid "No saved configurations" msgstr "Inga sparade konfigurationer" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Load" -msgstr "Läs" +msgstr "Läs in" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Detach all current device and Load configuration?" msgstr "Koppla ifrån alla enheter och läs in konfigurationen?" -#: src/templates/index.html:32 src/templates/index.html:338 +#: src/templates/index.html:44 src/templates/index.html:356 msgid "Delete" msgstr "Radera" -#: src/templates/index.html:32 +#: src/templates/index.html:44 msgid "Delete configuration file?" msgstr "Radera konfigurationsfilen?" -#: src/templates/index.html:33 src/templates/index.html:376 +#: src/templates/index.html:45 src/templates/index.html:415 msgid "Download" msgstr "Ladda ner" -#: src/templates/index.html:42 +#: src/templates/index.html:54 msgid "Save" msgstr "Spara" -#: src/templates/index.html:49 src/templates/index.html:295 -#: src/templates/index.html:605 +#: src/templates/index.html:61 src/templates/index.html:313 +#: src/templates/index.html:652 msgid "ID" msgstr "Id" -#: src/templates/index.html:53 src/templates/index.html:545 +#: src/templates/index.html:65 src/templates/index.html:592 msgid "Device" msgstr "Enhet" -#: src/templates/index.html:56 src/templates/index.html:205 +#: src/templates/index.html:68 src/templates/index.html:230 msgid "Actions" msgstr "Handlingar" -#: src/templates/index.html:79 +#: src/templates/index.html:91 msgid "File name" msgstr "Filnamn" -#: src/templates/index.html:97 src/templates/index.html:323 -#: src/templates/index.html:615 +#: src/templates/index.html:109 src/templates/index.html:341 +#: src/templates/index.html:662 msgid "Attach" msgstr "Anslut" -#: src/templates/index.html:127 +#: src/templates/index.html:139 msgid "Eject Disk? WARNING: On Mac OS, eject the Disk in the Finder instead!" msgstr "Mata ut skiva? VARNING: På Mac OS bör du mata ut skivan i Finder istället!" -#: src/templates/index.html:130 +#: src/templates/index.html:142 msgid "Eject" msgstr "Mata ut" -#: src/templates/index.html:133 +#: src/templates/index.html:145 msgid "Detach Device?" msgstr "Koppla ifrån enhet?" -#: src/templates/index.html:136 +#: src/templates/index.html:148 msgid "Detach" msgstr "Koppla ifrån" -#: src/templates/index.html:139 +#: src/templates/index.html:151 msgid "Enter a memo for this reservation" msgstr "Skriv ett memo för reservationen" -#: src/templates/index.html:142 +#: src/templates/index.html:154 msgid "Reserve" msgstr "Reservera" -#: src/templates/index.html:151 +#: src/templates/index.html:163 msgid "Reserved ID" msgstr "Reserverat id" -#: src/templates/index.html:157 +#: src/templates/index.html:169 msgid "Release" msgstr "Frigör" -#: src/templates/index.html:167 +#: src/templates/index.html:179 msgid "Detach all SCSI Devices?" msgstr "Koppla ifrån alla SCSI-enheter?" -#: src/templates/index.html:168 +#: src/templates/index.html:180 msgid "Detach All Devices" msgstr "Koppla ifrån alla enheter" -#: src/templates/index.html:171 +#: src/templates/index.html:183 msgid "Show Device Info" msgstr "Visa enhetsinfo" -#: src/templates/index.html:181 +#: src/templates/index.html:193 msgid "Image File Management" msgstr "Bildfilshanterare" -#: src/templates/index.html:184 +#: src/templates/index.html:196 #, python-format msgid "" -"Manage image files in the active PiSCSI image directory: " -"%(directory)s with a scan depth of %(scan_depth)s." +"Manage image files in the active PiSCSI image directory: %(directory)s " +"with a scan depth of %(scan_depth)s." msgstr "" "Hantera filer i den aktiva bildfilskatalogen: %(directory)s med " "hierarkiskt djup %(scan_depth)s." -#: src/templates/index.html:185 +#: src/templates/index.html:197 #, python-format msgid "" -"Select a valid SCSI ID and LUN " -"to attach to. Unless you know what you're doing, always use LUN 0." +"Select a valid SCSI ID and LUN to " +"attach to. Unless you know what you're doing, always use LUN 0." msgstr "" -"Välj ett giltigt SCSI-id samt LUN (enhetsnummer) att ansluta till. Om du inte har" -" särskild orsak, använd alltid enhetsnummer 0." +"Välj ett giltigt SCSI-id samt LUN " +"(enhetsnummer) att ansluta till. Om du inte har särskild orsak, använd alltid " +"enhetsnummer 0." -#: src/templates/index.html:188 +#: src/templates/index.html:200 msgid "Recognized image file types:" msgstr "Kända bildfilstyper:" -#: src/templates/index.html:193 +#: src/templates/index.html:205 msgid "Recognized archive file types:" msgstr "Kända arkivfiltyper:" -#: src/templates/index.html:204 -msgid "Size" -msgstr "Storlek" - -#: src/templates/index.html:210 +#: src/templates/index.html:214 msgid "The images directory is currently empty." msgstr "Bildfilskatalogen är tom." -#: src/templates/index.html:228 +#: src/templates/index.html:229 +msgid "Size" +msgstr "Storlek" + +#: src/templates/index.html:246 msgid "Properties File" msgstr "Egenskapsfil" -#: src/templates/index.html:250 src/templates/index.html:262 -#: src/templates/index.html:289 +#: src/templates/index.html:268 src/templates/index.html:280 +#: src/templates/index.html:307 msgid "Extract" msgstr "Packa upp" -#: src/templates/index.html:250 src/templates/index.html:262 +#: src/templates/index.html:268 src/templates/index.html:280 msgid "Extracting a single file..." msgstr "Packar upp en fil..." -#: src/templates/index.html:277 src/templates/index.html:484 -#: src/templates/upload.html:50 +#: src/templates/index.html:295 src/templates/index.html:531 +#: src/templates/upload.html:68 msgid "MiB" msgstr "MiB" -#: src/templates/index.html:282 +#: src/templates/index.html:300 msgid "In use" msgstr "Används" -#: src/templates/index.html:289 +#: src/templates/index.html:307 msgid "Extracting all files..." msgstr "Packar upp alla filer..." -#: src/templates/index.html:312 +#: src/templates/index.html:330 msgid "Unknown" msgstr "Okänd" -#: src/templates/index.html:326 +#: src/templates/index.html:344 #, python-format msgid "Enter new file name for: %(file_name)s" msgstr "Ange ett nytt filnamn åt %(file_name)s" -#: src/templates/index.html:329 src/templates/index.html:709 +#: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" msgstr "Döp om" -#: src/templates/index.html:331 +#: src/templates/index.html:349 #, python-format msgid "Save copy of %(file_name)s as:" msgstr "Spara kopia av %(file_name)s som:" -#: src/templates/index.html:334 +#: src/templates/index.html:352 msgid "Copy" msgstr "Kopiera" -#: src/templates/index.html:336 +#: src/templates/index.html:354 #, python-format msgid "Delete file: %(file_name)s?" msgstr "Radera filen %(file_name)s?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "?" msgstr "?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "Info" msgstr "Info" -#: src/templates/index.html:352 +#: src/templates/index.html:374 #, python-format msgid "%(disk_space)s MiB disk space remaining on the system" msgstr "Fritt utrymme på skivan: %(disk_space)s MiB" -#: src/templates/index.html:360 +#: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" msgstr "Överför filer till PiSCSI" -#: src/templates/index.html:363 src/templates/index.html:373 -#: src/templates/upload.html:8 src/templates/upload.html:16 +#: src/templates/index.html:385 src/templates/index.html:398 +#: src/templates/upload.html:8 src/templates/upload.html:18 msgid "Disk Images" msgstr "Skivbilder" -#: src/templates/index.html:364 src/templates/index.html:375 -#: src/templates/upload.html:9 src/templates/upload.html:18 +#: src/templates/index.html:387 src/templates/index.html:407 +#: src/templates/upload.html:10 src/templates/upload.html:27 msgid "Shared Files" msgstr "Fildelning" -#: src/templates/index.html:365 +#: src/templates/index.html:389 msgid "" -"To access shared files remotely, you may have to install one of the file " -"servers first." -msgstr "För att använda fildelning så kan du behöva installera en filserver först." +"Install a file server and create the shared files directory in order to share " +"files between the Pi and your vintage computers." +msgstr "" +"Installera en filserver och skapa en katalog för fildelning för att dela filer " +"mellan Pi och dina gamla datorer." -#: src/templates/index.html:370 src/templates/index.html:399 +#: src/templates/index.html:395 src/templates/index.html:446 msgid "Download file from URL:" msgstr "Ladda ner fil från adress:" -#: src/templates/index.html:376 +#: src/templates/index.html:415 msgid "Downloading File..." msgstr "Laddar ner fil..." -#: src/templates/index.html:381 +#: src/templates/index.html:420 msgid "Upload Files (new tab)" msgstr "Ladda up filer (ny flik)" -#: src/templates/index.html:389 +#: src/templates/index.html:427 src/templates/upload.html:77 +msgid "The file uploading functionality requires JavaScript." +msgstr "Filöverföringsfunktionen kräver JavaScript." + +#: src/templates/index.html:436 msgid "Create CD-ROM Image" msgstr "Skapa cd-bildfil" -#: src/templates/index.html:392 +#: src/templates/index.html:439 msgid "HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX." msgstr "HFS är för Mac OS, Joliet för Windows, samt Rock Ridge för POSIX." -#: src/templates/index.html:393 +#: src/templates/index.html:440 msgid "" -"If the downloaded file is a zip archive, we will attempt to unzip it and " -"store the resulting files." +"If the downloaded file is a zip archive, we will attempt to unzip it and store " +"the resulting files." msgstr "" -"Om den nedladdade filen är en zipfil så försöker vi packa up den och " -"spara de uppackade filerna på cd-bildfilen." +"Om den nedladdade filen är en zipfil så försöker vi packa up den och spara de " +"uppackade filerna på cd-bildfilen." -#: src/templates/index.html:401 src/templates/index.html:433 -#: src/templates/index.html:475 +#: src/templates/index.html:448 src/templates/index.html:480 +#: src/templates/index.html:522 msgid "Type:" msgstr "Typ:" -#: src/templates/index.html:422 +#: src/templates/index.html:469 msgid "Downloading file and generating CD-ROM image..." msgstr "Laddar ner fil och skapar cd-bildfil..." -#: src/templates/index.html:427 +#: src/templates/index.html:474 msgid "Use local file:" msgstr "Använd lokal fil:" -#: src/templates/index.html:454 +#: src/templates/index.html:501 msgid "Generating CD-ROM image..." msgstr "Skapar cd-bildfil..." -#: src/templates/index.html:464 +#: src/templates/index.html:511 msgid "Create Empty Disk Image" msgstr "Skapa tom skivbilsdfil" -#: src/templates/index.html:467 +#: src/templates/index.html:514 #, python-format msgid "" -"Please refer to wiki " -"documentation to learn more about the supported image file types." +"Please refer to wiki documentation to " +"learn more about the supported image file types." msgstr "" -"Se wikin för vidare information" -" angående filtyper som stödjs." +"Se wikin för vidare information " +"angående filtyper som stödjs." -#: src/templates/index.html:468 +#: src/templates/index.html:515 msgid "" -"It is not recommended to use the Lido hard disk driver with the Macintosh" -" Plus." +"It is not recommended to use the Lido hard disk driver with the Macintosh Plus." msgstr "Det är inte rekommenderat att använda Lido-drivrutiner med Macintosh Plus." -#: src/templates/index.html:483 +#: src/templates/index.html:530 msgid "Size:" msgstr "Storlek:" -#: src/templates/index.html:485 src/templates/index.html:577 +#: src/templates/index.html:532 src/templates/index.html:624 msgid "Masquerade as:" msgstr "Maskera som:" -#: src/templates/index.html:488 src/templates/index.html:499 -#: src/templates/index.html:580 +#: src/templates/index.html:535 src/templates/index.html:546 +#: src/templates/index.html:627 msgid "None" msgstr "Ingen" -#: src/templates/index.html:496 +#: src/templates/index.html:543 msgid "Format as:" msgstr "Formatera som:" -#: src/templates/index.html:519 +#: src/templates/index.html:566 msgid "Create Disk Image With Properties" msgstr "Skapa skivbild med egenskaper" -#: src/templates/index.html:528 +#: src/templates/index.html:575 msgid "Attach Peripheral Device" -msgstr "Anslut tillbehör" +msgstr "Anslut kringutrustning" -#: src/templates/index.html:533 +#: src/templates/index.html:580 msgid "" -"The piscsi_bridge network bridge is active and ready to be used " -"by an emulated network adapter!" +"The piscsi_bridge network bridge is active and ready to be used by an " +"emulated network adapter!" msgstr "" -"Nätverksbryggan piscsi_bridge är påslagen och kan användas av " -"det emulerade gränssnittet!" +"Nätverksbryggan piscsi_bridge är påslagen och kan användas av det " +"emulerade gränssnittet!" -#: src/templates/index.html:535 +#: src/templates/index.html:582 msgid "" -"Please configure the piscsi_bridge network bridge before " -"attaching an emulated network adapter!" +"Please configure the piscsi_bridge network bridge before attaching an " +"emulated network adapter!" msgstr "" -"Se till att ställa in och sätta på piscsi_bridge innan du " -"ansluter det emulerade nätverksgränssnittet!" +"Se till att ställa in och sätta på piscsi_bridge innan du ansluter det " +"emulerade nätverksgränssnittet!" -#: src/templates/index.html:537 +#: src/templates/index.html:584 #, python-format msgid "" "To browse the modern web, install a vintage web proxy such as Macproxy." msgstr "" -"För att surfa på det moderna nätet, installera en webb-proxyserver så som" -" Macproxy." +"För att surfa på den moderna webben, installera en webb-proxyserver så som Macproxy." -#: src/templates/index.html:539 +#: src/templates/index.html:586 #, python-format msgid "" -"Read more about supported device " -"types on the wiki." +"Read more about supported device types " +"on the wiki." msgstr "" -"Läs mer om enheter som stödjs " -"(engelska) på wikin." +"Läs mer om enheter som stödjs (engelska) på wikin." -#: src/templates/index.html:546 +#: src/templates/index.html:593 msgid "Key" msgstr "Kod" -#: src/templates/index.html:547 +#: src/templates/index.html:594 msgid "Parameters and Actions" msgstr "Parametrar och handlingar" -#: src/templates/index.html:627 +#: src/templates/index.html:674 msgid "Logging" msgstr "Loggar" -#: src/templates/index.html:630 +#: src/templates/index.html:677 msgid "The current dropdown selection indicates the active log level." msgstr "Det nuvarande valet i rullgardinsmenyn påvisar aktiv loggnivå." -#: src/templates/index.html:636 +#: src/templates/index.html:683 msgid "Log Lines:" msgstr "Antal loggrader:" -#: src/templates/index.html:638 +#: src/templates/index.html:685 msgid "Scope:" -msgstr "Process:" +msgstr "Omfattning:" -#: src/templates/index.html:641 +#: src/templates/index.html:688 msgid "All logs" msgstr "Alla loggar" -#: src/templates/index.html:656 +#: src/templates/index.html:703 msgid "Show Logs" msgstr "Visa loggar" -#: src/templates/index.html:662 +#: src/templates/index.html:709 msgid "Log Level:" msgstr "Loggnivå:" -#: src/templates/index.html:670 +#: src/templates/index.html:717 msgid "Set Log Level" -msgstr "Byt loggnivå" +msgstr "Ange loggnivå" -#: src/templates/index.html:680 +#: src/templates/index.html:727 msgid "System Operations" -msgstr "Systemkommandon" +msgstr "Systemdrift" -#: src/templates/index.html:683 +#: src/templates/index.html:730 msgid "" -"The System Name is the \"pretty\" hostname if set, with a fallback to the" -" regular hostname." +"The System Name is the \"pretty\" hostname if set, with a fallback to the " +"regular hostname." msgstr "" -"Vi använder \"pretty hostname\" som systemnamn, med vanligt hostname som " -"reserv." +"Vi använder \"pretty hostname\" som systemnamn, med vanligt hostname som reserv." -#: src/templates/index.html:684 +#: src/templates/index.html:731 msgid "" -"IMPORTANT: Always shut down the system before turning off the power. " -"Failing to do so may lead to data loss." +"IMPORTANT: Always shut down the system before turning off the power. Failing to " +"do so may lead to data loss." msgstr "" -"VIKTIGT: Stäng alltid av systemet innan du kopplar ur strömmen. På så vis" -" undviker du risken att förlora data." +"VIKTIGT: Stäng alltid av systemet innan du stänger av strömmen. Om du inte gör " +"det kan det leda till dataförlust." -#: src/templates/index.html:690 +#: src/templates/index.html:737 msgid "Language:" msgstr "Språk:" -#: src/templates/index.html:702 +#: src/templates/index.html:749 msgid "Change Language" msgstr "Byt språk" -#: src/templates/index.html:713 +#: src/templates/index.html:760 msgid "Reset" msgstr "Återställ" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Reboot the System?" msgstr "Vill du starta om systemet?" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Rebooting the system..." msgstr "Startar om systemet..." -#: src/templates/index.html:718 +#: src/templates/index.html:765 msgid "Reboot System" msgstr "Starta om systemet" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shut Down the System?" msgstr "Vill du stänga av systemet?" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shutting down the system..." msgstr "Stänger av systemet..." -#: src/templates/index.html:721 +#: src/templates/index.html:768 msgid "Shut Down System" msgstr "Stäng av systemet" -#: src/templates/index.html:729 +#: src/templates/index.html:776 msgid "Read the PiSCSI Manual" -msgstr "Läs manualen för PiSCSI (engelska)" +msgstr "Läs PiSCSI-handboken (engelska)" #: src/templates/logs.html:4 #, python-format @@ -1159,91 +1166,87 @@ msgstr "Ladda upp filer från din dator" #: src/templates/upload.html:6 #, python-format msgid "" -"The largest file size accepted in this form is %(max_file_size)s MiB. Use" -" other file transfer means for larger files." +"The largest file size accepted in this form is %(max_file_size)s MiB. Use other " +"file transfer means for larger files." msgstr "" -"Den största filstorlek som kan hanteras i detta formulär är " -"%(max_file_size)s MiB. Använd andra men för större storlekar." +"Den största filstorlek som kan hanteras i detta formulär är %(max_file_size)s " +"MiB. Använd andra men för större storlekar." #: src/templates/upload.html:7 msgid "" "You have to manually clean up partially uploaded files, as a result of " "cancelling the upload or closing this page." msgstr "" -"Du bör städa upp ofullständiga filer själv efter att ha avbrytit eller " -"stängt ner den här sidan." +"Du måste själv rensa upp delvis uppladdade filer som ett resultat av att du " +"avbryter uppladdningen eller stänger den här sidan." -#: src/templates/upload.html:10 src/templates/upload.html:20 +#: src/templates/upload.html:12 src/templates/upload.html:36 msgid "PiSCSI Config" msgstr "PiSCSI-konfigurationer" -#: src/templates/upload.html:13 +#: src/templates/upload.html:15 msgid "Destination" -msgstr "Mål" +msgstr "Destination" -#: src/templates/upload.html:36 +#: src/templates/upload.html:54 msgid "Drop files here to upload" msgstr "Släpp filer här för att ladda upp" -#: src/templates/upload.html:37 +#: src/templates/upload.html:55 msgid "Your browser does not support drag'n'drop file uploads." msgstr "Din webbläsare stöder ej filuppladdning via dra och släpp." -#: src/templates/upload.html:38 +#: src/templates/upload.html:56 msgid "" -"Please use the fallback form below to upload your files like in the olden" -" days." +"Please use the fallback form below to upload your files like in the olden days." msgstr "" -"Använd reservformuläret nedan för att ladda upp dina filer på gammaldags " -"vis." +"Använd reservformuläret nedan för att ladda upp dina filer på gammaldags vis." -#: src/templates/upload.html:39 +#: src/templates/upload.html:57 msgid "File is too big: {{filesize}}MiB. Max filesize: {{maxFilesize}}MiB." msgstr "" -"Filen är för stor: {{filesize}}MiB. Största möjliga storlek: " -"{{maxFilesize}}MiB." +"Filen är för stor: {{filesize}}MiB. Största möjliga storlek: {{maxFilesize}}MiB." -#: src/templates/upload.html:40 +#: src/templates/upload.html:58 msgid "You can't upload files of this type." msgstr "Du kan ej ladda upp filer av den här typen." -#: src/templates/upload.html:41 +#: src/templates/upload.html:59 msgid "Server responded with code: {{statusCode}}" msgstr "Servern svarade med kod: {{statusCode}}" -#: src/templates/upload.html:42 +#: src/templates/upload.html:60 msgid "Cancel upload" msgstr "Avbryt uppladdning" -#: src/templates/upload.html:43 +#: src/templates/upload.html:61 msgid "Upload canceled." msgstr "Uppladdningen avbröts." -#: src/templates/upload.html:44 +#: src/templates/upload.html:62 msgid "Are you sure you want to cancel this upload?" msgstr "Är du säker på att du vill avbryta uppladdningen?" -#: src/templates/upload.html:45 +#: src/templates/upload.html:63 msgid "Dismiss" msgstr "Avfärda" -#: src/templates/upload.html:46 +#: src/templates/upload.html:64 msgid "You can not upload any more files." -msgstr "Du kan inte ladda upp vidare filer." +msgstr "Du kan inte ladda upp fler filer." -#: src/templates/upload.html:48 +#: src/templates/upload.html:66 msgid "TiB" msgstr "TiB" -#: src/templates/upload.html:49 +#: src/templates/upload.html:67 msgid "GiB" msgstr "GiB" -#: src/templates/upload.html:51 +#: src/templates/upload.html:69 msgid "KiB" msgstr "KiB" -#: src/templates/upload.html:52 +#: src/templates/upload.html:70 msgid "B" msgstr "B" - From e21251c228943f2eeaa958c3ac556e54a9ffab46 Mon Sep 17 00:00:00 2001 From: Tony Kuker <34318535+akuker@users.noreply.github.com> Date: Fri, 7 Apr 2023 09:53:42 -0500 Subject: [PATCH 24/30] Updates to French translation (#1141) * updated AI translation of fr * remove old translations --------- Co-authored-by: Tony Kuker --- .../translations/fr/LC_MESSAGES/messages.po | 1104 +++++++---------- 1 file changed, 420 insertions(+), 684 deletions(-) diff --git a/python/web/src/translations/fr/LC_MESSAGES/messages.po b/python/web/src/translations/fr/LC_MESSAGES/messages.po index 5b020338..ddadbf12 100644 --- a/python/web/src/translations/fr/LC_MESSAGES/messages.po +++ b/python/web/src/translations/fr/LC_MESSAGES/messages.po @@ -7,16 +7,16 @@ msgid "" msgstr "" "Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/akuker/PISCSI/issues\n" -"POT-Creation-Date: 2023-02-04 20:05-0600\n" -"PO-Revision-Date: 2023-02-08 20:16-0600\n" +"POT-Creation-Date: 2023-03-27 20:27-0500\n" +"PO-Revision-Date: 2023-03-27 20:39-0500\n" "Last-Translator: Kamel Makhloufi \n" "Language-Team: N/A\n" "Language: fr\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.12.1\n" "X-Generator: Poedit 3.2.2\n" #: src/return_code_mapper.py:14 @@ -31,78 +31,90 @@ msgstr "Fichier à supprimer non trouvé : %(file_path)s" #: src/return_code_mapper.py:18 #, python-format +msgid "Could not delete file: %(file_path)s" +msgstr "Impossible de supprimer le fichier : %(file_path)s" + +#: src/return_code_mapper.py:20 +#, python-format msgid "File moved to: %(target_path)s" msgstr "Fichier déplacé vers : %(target_path)s" -#: src/return_code_mapper.py:20 +#: src/return_code_mapper.py:22 #, python-format msgid "Unable to move file to: %(target_path)s" msgstr "Echec lors du déplacement du fichier vers : %(target_path)s" -#: src/return_code_mapper.py:22 +#: src/return_code_mapper.py:24 #, python-format msgid "Created CD-ROM ISO image with arguments \"%(value)s\"" msgstr "Image ISO CD-ROM créée avec les arguments \"%(value)s\"" -#: src/return_code_mapper.py:24 +#: src/return_code_mapper.py:26 #, python-format msgid "%(file_name)s downloaded to %(save_dir)s" msgstr "%(file_name)s téléchargé dans %(save_dir)s" -#: src/return_code_mapper.py:26 +#: src/return_code_mapper.py:28 #, python-format msgid "File created: %(target_path)s" msgstr "Fichier créé : %(target_path)s" -#: src/return_code_mapper.py:28 +#: src/return_code_mapper.py:30 #, python-format msgid "Could not create file: %(target_path)s" msgstr "Echec de la création du fichier : %(target_path)s" -#: src/return_code_mapper.py:30 +#: src/return_code_mapper.py:32 +#, python-format +msgid "A file with name %(target_path)s already exists" +msgstr "Un fichier dont le nom existe déjà %(target_path)s existe déjà" + +#: src/return_code_mapper.py:34 #, python-format msgid "Loaded configurations from: %(file_name)s" msgstr "Configurations chargées depuis : %(file_name)s" -#: src/return_code_mapper.py:32 +#: src/return_code_mapper.py:36 #, python-format msgid "Could not read configuration file: %(file_name)s" msgstr "Echec de lecture du fichier de configuration : %(file_name)s" -#: src/return_code_mapper.py:34 +#: src/return_code_mapper.py:38 msgid "Invalid configuration file format" msgstr "Format de fichier de configuration invalide" -#: src/return_code_mapper.py:36 +#: src/return_code_mapper.py:40 #, python-format msgid "Read properties from file: %(file_path)s" msgstr "Lecture des propriétés depuis le fichier : %(file_path)s" -#: src/return_code_mapper.py:38 +#: src/return_code_mapper.py:42 #, python-format msgid "Could not read properties from file: %(file_path)s" msgstr "Echec de lecture des propriétés depuis le fichier : %(file_path)s" -#: src/return_code_mapper.py:40 +#: src/return_code_mapper.py:44 #, python-format -msgid "Cannot insert an image for %(device_type)s into a %(current_device_type)s device" +msgid "" +"Cannot insert an image for %(device_type)s into a %(current_device_type)s device" msgstr "" -"Ne peux pas introduire une image de type %(device_type)s dans un appareil de type %(current_device_type)s" +"Ne peux pas introduire une image de type %(device_type)s dans un appareil de " +"type %(current_device_type)s" -#: src/return_code_mapper.py:42 +#: src/return_code_mapper.py:46 #, python-format msgid "Extracted %(count)s file(s)" msgstr "%(count)s fichier(s) extrait(s)" -#: src/return_code_mapper.py:44 +#: src/return_code_mapper.py:48 msgid "Unable to extract archive: No files were specified" msgstr "Impossible de décompresser l'archive : aucun fichier n'a été spécifié" -#: src/return_code_mapper.py:46 +#: src/return_code_mapper.py:50 msgid "No files were extracted (existing files are skipped)" msgstr "Aucun fichier n'a été décompressé (les fichiers existants sont ignorés)" -#: src/return_code_mapper.py:48 +#: src/return_code_mapper.py:52 #, python-format msgid "Unable to extract archive: %(error)s" msgstr "Impossible de décompresser l'archive : %(error)s" @@ -110,49 +122,47 @@ msgstr "Impossible de décompresser l'archive : %(error)s" #: src/socket_cmds_flask.py:42 #, python-format msgid "" -"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s with error: %(error_msg)s. The " -"PiSCSI process is not running or may have crashed." +"The PiSCSI Web Interface failed to connect to PiSCSI at %(host)s:%(port)s with " +"error: %(error_msg)s. The PiSCSI process is not running or may have crashed." msgstr "" -"L’interface web PiSCSI n’as pas pu se connecter à PiSCSI à l’adresse %(host)s:%(port)s avec l’erreur : " -"%(error_msg)s. Le processus PiSCSI n’est peut-être pas en cours d’exécution ou a planté." +"L’interface web PiSCSI n’as pas pu se connecter à PiSCSI à l’adresse %(host)s:" +"%(port)s avec l’erreur : %(error_msg)s. Le processus PiSCSI n’est peut-être pas " +"en cours d’exécution ou a planté." #: src/socket_cmds_flask.py:54 msgid "" -"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and try again. If the issue persists, " -"please report a bug." +"The PiSCSI Web Interface lost connection to PiSCSI. Please go back and try " +"again. If the issue persists, please report a bug." msgstr "" -"L’interface web PiSCSI à perdu la connexion à PiSCSI. Merci de réessayer. Si le problème persiste, merci de " -"faire remonter un bug." +"L’interface web PiSCSI à perdu la connexion à PiSCSI. Merci de réessayer. Si le " +"problème persiste, merci de faire remonter un bug." #: src/socket_cmds_flask.py:64 msgid "" -"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please go back and try again. If the " -"issue persists, please report a bug." +"The PiSCSI Web Interface did not get a valid response from PiSCSI. Please go " +"back and try again. If the issue persists, please report a bug." msgstr "" -"L’interface web PiSCSI à reçu une réponse invalide de PiSCSI. Merci de réessayer. Si le problème persiste, " -"merci de faire remonter un bug." +"L’interface web PiSCSI à reçu une réponse invalide de PiSCSI. Merci de " +"réessayer. Si le problème persiste, merci de faire remonter un bug." -#: src/web.py:214 -msgid "PiSCSI is password protected. Start the Web Interface with the --password parameter." -msgstr "" -"PiSCSI est protégé par un mot de passe. Merci de démarrer l’interface web avec le paramètre --password." - -#: src/web.py:263 +#: src/web.py:252 msgid "PiSCSI Control Page" msgstr "Page de contrôle de PiSCSI" -#: src/web.py:309 +#: src/web.py:304 msgid "PiSCSI Create Drive" msgstr "PiSCSI Créer un lecteur" -#: src/web.py:323 +#: src/web.py:320 msgid "PiSCSI File Upload" msgstr "Déposez le fichier ici pour le transférer" #: src/web.py:346 #, python-format msgid "You must log in with valid credentials for a user in the '%(group)s' group" -msgstr "Vous devez vous connecter avec les identifiants d’un utilisateur appartenant au groupe '%(group)s'" +msgstr "" +"Vous devez vous connecter avec les identifiants d’un utilisateur appartenant au " +"groupe '%(group)s'" #: src/web.py:399 src/web.py:444 #, python-format @@ -164,374 +174,377 @@ msgstr "Aucune donnée de propriétés pour le lecteur %(drive_name)s" msgid "Image file with properties created: %(file_name)s" msgstr "Fichier image avec propriétés créé : %(file_name)s" -#: src/web.py:521 +#: src/web.py:522 msgid "PiSCSI Image Info" msgstr "Informations sur l'image PiSCSI" -#: src/web.py:528 +#: src/web.py:529 #, python-format msgid "An error occurred when getting disk info: %(error)s" -msgstr "Une erreur s'est produite lors de l'obtention des informations du disque : %(error)s" +msgstr "" +"Une erreur s'est produite lors de l'obtention des informations du disque : " +"%(error)s" -#: src/web.py:542 +#: src/web.py:543 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s n'est pas une application PiSCSI reconnue" -#: src/web.py:569 +#: src/web.py:570 msgid "PiSCSI Manual" msgstr "Manuel PiSCSI" -#: src/web.py:576 +#: src/web.py:577 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "Une erreur s'est produite lors de l'accès à la page du manuel : %(error)s" -#: src/web.py:592 +#: src/web.py:593 msgid "PiSCSI System Logs" msgstr "Journaux système PiSCSI" -#: src/web.py:600 +#: src/web.py:601 #, python-format msgid "An error occurred when fetching logs: %(error)s" -msgstr "Une erreur s'est produite lors de la récupération des fichiers logs : %(error)s" +msgstr "" +"Une erreur s'est produite lors de la récupération des fichiers logs : %(error)s" -#: src/web.py:614 +#: src/web.py:615 #, python-format msgid "Log level set to %(value)s" msgstr "Niveau de journalisation défini sur %(value)s" -#: src/web.py:631 src/web.py:694 +#: src/web.py:632 src/web.py:695 msgid "No SCSI ID specified" msgstr "Aucun ID SCSI spécifié" -#: src/web.py:672 +#: src/web.py:673 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "%(device_type)s connecté au SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:696 +#: src/web.py:697 msgid "No image file to insert" msgstr "Aucun fichier image à insérer" -#: src/web.py:736 +#: src/web.py:737 #, python-format -msgid "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" -msgstr "%(file_name)s attaché(s) en tant que %(device_type)s au SCSI ID %(id_number)s LUN %(unit_number)s" +msgid "" +"Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " +"%(unit_number)s" +msgstr "" +"%(file_name)s attaché(s) en tant que %(device_type)s au SCSI ID %(id_number)s " +"LUN %(unit_number)s" -#: src/web.py:753 +#: src/web.py:754 msgid "Detached all SCSI devices" msgstr "Tout les périphériques SCSI ont été détachés" -#: src/web.py:769 +#: src/web.py:770 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Périphérique SCSI ID %(id_number)s LUN %(unit_number)s détaché" -#: src/web.py:791 +#: src/web.py:792 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "SCSI ID %(id_number)s LUN %(unit_number)s éjecté" -#: src/web.py:810 +#: src/web.py:811 msgid "PiSCSI Device Info" msgstr "Informations sur le périphérique PiSCSI" -#: src/web.py:814 +#: src/web.py:815 msgid "No devices attached" msgstr "Aucun appareil connecté" -#: src/web.py:830 +#: src/web.py:831 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "ID SCSI réservés %(id_number)s" -#: src/web.py:848 +#: src/web.py:849 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "Réservation libérée pour SCSI ID %(id_number)s" -#: src/web.py:867 +#: src/web.py:868 #, python-format msgid "System name changed to '%(name)s'." msgstr "Nom du système a été remplacé par '%(name)s'." -#: src/web.py:868 +#: src/web.py:869 msgid "System name reset to default." msgstr "Nom du système réinitialisé par défaut." -#: src/web.py:870 +#: src/web.py:871 msgid "Failed to change system name." msgstr "Echec du changement de nom du système." -#: src/web.py:924 +#: src/web.py:925 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." msgstr "%(iso_type)s n'est pas un format de CD-ROM valide." -#: src/web.py:939 +#: src/web.py:940 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" -msgstr "L'erreur suivante s'est produite lors de la création de l'image du CD-ROM : %(error)s" +msgstr "" +"L'erreur suivante s'est produite lors de la création de l'image du CD-ROM : " +"%(error)s" -#: src/web.py:946 +#: src/web.py:947 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "L'image du CD-ROM %(file_name)s avec le type %(iso_type)s a été créée." -#: src/web.py:974 +#: src/web.py:977 src/web.py:1021 +msgid "Unknown destination" +msgstr "Destination inconnue" + +#: src/web.py:986 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "L'erreur suivante s'est produite lors du téléchargement : %(error)s" -#: src/web.py:1045 src/web.py:1058 +#: src/web.py:1065 src/web.py:1078 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s n'est pas un format de disque dur valide." -#: src/web.py:1103 +#: src/web.py:1123 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "Fichier image avec propriétés créé : %(file_name)s%(drive_format)s" -#: src/web.py:1113 +#: src/web.py:1133 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "Fichier image créé : %(file_name)s%(drive_format)s" -#: src/web.py:1174 +#: src/web.py:1194 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "Fichier image avec propriétés supprimé : %(file_name)s" -#: src/web.py:1183 +#: src/web.py:1203 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "Fichier image supprimé : %(file_name)s" -#: src/web.py:1221 +#: src/web.py:1241 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "Fichier image avec propriétés renommé en : %(file_name)s" -#: src/web.py:1230 +#: src/web.py:1250 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "Fichier image renommé en : %(file_name)s" -#: src/web.py:1268 +#: src/web.py:1288 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "Copie du fichier image avec propriétés enregistrée sous : %(file_name)s" -#: src/web.py:1277 +#: src/web.py:1297 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "Copie du fichier image enregistré sous : %(file_name)s" -#: src/web.py:1330 +#: src/web.py:1350 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Langue de l’interface web changée en %(locale)s" -#: src/web.py:1341 +#: src/web.py:1361 msgid "The requested theme does not exist." msgstr "Le thème demandé n'existe pas." -#: src/web.py:1344 +#: src/web.py:1364 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "Thème remplacé par '%(theme)s’." -#: src/web_utils.py:98 +#: src/web_utils.py:112 msgid "Hard Disk Drive" msgstr "Disque dur" -#: src/web_utils.py:100 +#: src/web_utils.py:114 msgid "Removable Disk Drive" msgstr "Disque amovible" -#: src/web_utils.py:102 +#: src/web_utils.py:116 msgid "Magneto-Optical Drive" msgstr "Disque magnéto-optique" -#: src/web_utils.py:104 +#: src/web_utils.py:118 msgid "CD/DVD Drive" msgstr "Lecteur CD/DVD" -#: src/web_utils.py:106 +#: src/web_utils.py:120 msgid "Host Bridge" msgstr "Pont Hôte" -#: src/web_utils.py:108 +#: src/web_utils.py:122 msgid "Ethernet Adapter" msgstr "Adaptateur Ethernet" -#: src/web_utils.py:110 +#: src/web_utils.py:124 msgid "Printer" msgstr "Imprimante" -#: src/web_utils.py:112 +#: src/web_utils.py:126 msgid "Host Services" msgstr "Services Hôte" -#: src/web_utils.py:135 +#: src/web_utils.py:149 msgid "Hard Disk Image (Generic)" msgstr "Image de disque dur (générique)" -#: src/web_utils.py:137 +#: src/web_utils.py:151 msgid "Hard Disk Image (Apple)" msgstr "Image de disque dur (Apple)" -#: src/web_utils.py:139 +#: src/web_utils.py:153 msgid "Hard Disk Image (NEC)" msgstr "Image de disque dur (NEC)" -#: src/web_utils.py:141 +#: src/web_utils.py:155 msgid "Hard Disk Image (SCSI-1)" msgstr "Image de disque dur (SCSI-1)" -#: src/web_utils.py:143 +#: src/web_utils.py:157 msgid "Removable Disk Image" msgstr "Disque amovible" -#: src/web_utils.py:145 +#: src/web_utils.py:159 msgid "Magneto-Optical Disk Image" msgstr "Image de disque magnéto-optique" -#: src/web_utils.py:219 +#: src/web_utils.py:260 msgid "You must log in to use this function" msgstr "Vous devez vous connecter pour utiliser cette fonctionnalité" -#: src/web_utils.py:233 +#: src/web_utils.py:274 #, python-format msgid "Configure the network bridge for %(interface)s first: " msgstr "Configurez d'abord le pont réseau pour %(interface)s : " -#: src/web_utils.py:262 +#: src/web_utils.py:303 #, python-format -msgid "%(file_name)s is not a valid path" -msgstr "%(file_name)s n'est pas un chemin valide" +msgid "No permission to use path '%(file_name)s'" +msgstr "Aucune autorisation d’utiliser le chemin '%(file_name)s'" -#: src/web_utils.py:283 +#: src/web_utils.py:324 msgid "The file already exists!" msgstr "Le fichier existe déjà !" -#: src/web_utils.py:291 +#: src/web_utils.py:332 msgid "Unable to write the file to disk!" msgstr "Echec d’écriture du fichier sur le disque !" -#: src/web_utils.py:299 +#: src/web_utils.py:340 msgid "Transferred file corrupted!" msgstr "Fichier transféré corrompu !" -#: src/web_utils.py:301 +#: src/web_utils.py:342 msgid "File upload successful!" msgstr "Transfert de fichier réussi !" -#: src/templates/base.html:29 -msgid "" -" This process may take a while, and will continue in the background if you navigate away from this page." -msgstr "" -" Ce processus peut prendre du temps, et continuera de s’exécuter en arrière plan si vous quittez cette page." - -#: src/templates/base.html:34 -msgid "" -" The Web Interface will become unresponsive momentarily. Reload this page after the Pi has started up again." -msgstr " L’interface web ne répondras pas momentanément. Rechargez cette page après que le Pi ai redémarré." - -#: src/templates/base.html:47 +#: src/templates/base.html:33 #, python-format msgid "Logged in as %(username)s" msgstr "Connecté en tant que %(username)s" -#: src/templates/base.html:49 +#: src/templates/base.html:35 msgid "Log Out" msgstr "Se déconnecter" -#: src/templates/base.html:54 +#: src/templates/base.html:40 msgid "Log in to use Web Interface" msgstr "Se connecter à l’interface web" -#: src/templates/base.html:56 +#: src/templates/base.html:42 msgid "Username:" msgstr "Nom d'utilisateur:" -#: src/templates/base.html:60 +#: src/templates/base.html:46 msgid "Password:" msgstr "Mot de passe:" -#: src/templates/base.html:69 +#: src/templates/base.html:55 msgid "Web Interface Authentication Disabled" msgstr "Authentification sur l’interface web desactivée" -#: src/templates/base.html:71 +#: src/templates/base.html:57 #, python-format msgid "See Wiki for more information" -msgstr "Voir le Wiki pour plus d’informations" +msgstr "" +"Voir le Wiki pour plus d’informations" -#: src/templates/base.html:78 +#: src/templates/base.html:64 msgid "PiSCSI" msgstr "PiSCSI" -#: src/templates/base.html:79 +#: src/templates/base.html:65 msgid "Control Page" msgstr "Page de contrôle" -#: src/templates/base.html:85 src/templates/index.html:707 +#: src/templates/base.html:71 src/templates/index.html:754 msgid "System Name:" msgstr "Nom du système:" -#: src/templates/base.html:112 src/templates/base.html:114 +#: src/templates/base.html:98 src/templates/base.html:100 #, python-format msgid "Switch to the %(theme)s theme" msgstr "Passer au thème %(theme)s" -#: src/templates/base.html:120 +#: src/templates/base.html:106 msgid "The AppleShare server is running. No active connections." msgstr "Le serveur AppleShare s'exécute. Aucune connexion active." -#: src/templates/base.html:123 +#: src/templates/base.html:109 #, python-format msgid "%(value)d active AFP connection" msgstr "%(value)d connexion AFP active" -#: src/templates/base.html:125 +#: src/templates/base.html:111 #, python-format msgid "%(value)d active AFP connections" msgstr "%(value)d connexions AFP actives" -#: src/templates/base.html:130 +#: src/templates/base.html:116 #, python-format msgid "Macproxy is running at %(ip_addr)s (default port 5000)" msgstr "Macproxy s'exécute à l'adresse %(ip_addr)s (port par défaut 5000)" -#: src/templates/base.html:134 -msgid "PiSCSI version:" +#: src/templates/base.html:120 +msgid "PiSCSI software version:" msgstr "Version PiSCSI :" -#: src/templates/base.html:137 +#: src/templates/base.html:123 msgid "Hardware and OS:" msgstr "Hardware et système d'exploitation :" -#: src/templates/base.html:140 +#: src/templates/base.html:126 msgid "Network Address:" msgstr "Adresse réseau :" #: src/templates/deviceinfo.html:4 msgid "Detailed Info for Attached Devices" -msgstr "" +msgstr "Informations détaillées pour les périphériques connectés" #: src/templates/deviceinfo.html:9 msgid "SCSI ID" msgstr "ID SCSI" -#: src/templates/deviceinfo.html:13 src/templates/index.html:51 src/templates/index.html:303 -#: src/templates/index.html:613 +#: src/templates/deviceinfo.html:13 src/templates/index.html:63 +#: src/templates/index.html:321 src/templates/index.html:660 msgid "LUN" msgstr "LUN" -#: src/templates/deviceinfo.html:17 src/templates/index.html:309 +#: src/templates/deviceinfo.html:17 src/templates/index.html:327 msgid "Type" msgstr "Type" @@ -539,11 +552,11 @@ msgstr "Type" msgid "Status" msgstr "Statut" -#: src/templates/deviceinfo.html:25 src/templates/index.html:203 +#: src/templates/deviceinfo.html:25 src/templates/index.html:228 msgid "File" msgstr "Fichier" -#: src/templates/deviceinfo.html:29 src/templates/index.html:54 +#: src/templates/deviceinfo.html:29 src/templates/index.html:66 msgid "Parameters" msgstr "Paramètres" @@ -551,7 +564,7 @@ msgstr "Paramètres" msgid "Vendor" msgstr "Fournisseur" -#: src/templates/deviceinfo.html:37 src/templates/index.html:55 +#: src/templates/deviceinfo.html:37 src/templates/index.html:67 msgid "Product" msgstr "Produit" @@ -567,8 +580,9 @@ msgstr "Taille de bloc" msgid "Image Size" msgstr "Taille de l'image" -#: src/templates/deviceinfo.html:55 src/templates/diskinfo.html:6 src/templates/drives.html:115 -#: src/templates/logs.html:6 src/templates/manpage.html:10 +#: src/templates/deviceinfo.html:55 src/templates/diskinfo.html:6 +#: src/templates/drives.html:115 src/templates/logs.html:6 +#: src/templates/manpage.html:10 msgid "Go to Home" msgstr "Menu principal" @@ -584,22 +598,26 @@ msgstr "Avertissement" #: src/templates/drives.html:5 #, python-format msgid "" -"These device profiles are provided as-is with no guarantee to work equally to the actual physical device " -"they are named after. You may need to provide appropirate device drivers and/or configuration parameters " -"for them to function properly. If you would like to see data modified, or have additional devices to add to " -"the list, please raise an issue ticket at GitHub." +"These device profiles are provided as-is with no guarantee to work equally to " +"the actual physical device they are named after. You may need to provide " +"appropirate device drivers and/or configuration parameters for them to function " +"properly. If you would like to see data modified, or have additional devices to " +"add to the list, please raise an issue ticket at GitHub." msgstr "" -"Ces profils de périphérique sont donnés tel-quels sans garantie que leur fonctionnement soit égal au " -"périphérique physique desquels ils tirent leur nom. Vous pourriez avoir besoin d'ajouter les pilotes de " -"périphérique appropriés et / ou les paramètres de configuration nécessaires pour qu'ils fonctionnent " -"correctement. Si vous souhaitez voir les données modifiées ou avez des périphériques additionnels à ajouter " -"à la liste, merci d'ouvrir un billet de support sur GitHub." +"Ces profils de périphérique sont donnés tel-quels sans garantie que leur " +"fonctionnement soit égal au périphérique physique desquels ils tirent leur nom. " +"Vous pourriez avoir besoin d'ajouter les pilotes de périphérique appropriés " +"et / ou les paramètres de configuration nécessaires pour qu'ils fonctionnent " +"correctement. Si vous souhaitez voir les données modifiées ou avez des " +"périphériques additionnels à ajouter à la liste, merci d'ouvrir un billet de " +"support sur GitHub." #: src/templates/drives.html:6 msgid "Hard Disk Drives" msgstr "Disques durs" -#: src/templates/drives.html:11 src/templates/drives.html:47 src/templates/drives.html:86 +#: src/templates/drives.html:11 src/templates/drives.html:47 +#: src/templates/drives.html:86 msgid "Name" msgstr "Nom" @@ -607,11 +625,13 @@ msgstr "Nom" msgid "Size (MiB)" msgstr "Taille (Mio)" -#: src/templates/drives.html:13 src/templates/drives.html:48 src/templates/drives.html:88 +#: src/templates/drives.html:13 src/templates/drives.html:48 +#: src/templates/drives.html:88 msgid "Description" msgstr "Description" -#: src/templates/drives.html:14 src/templates/drives.html:49 src/templates/drives.html:89 +#: src/templates/drives.html:14 src/templates/drives.html:49 +#: src/templates/drives.html:89 msgid "Action" msgstr "Action" @@ -619,8 +639,9 @@ msgstr "Action" msgid "Save as:" msgstr "Sauvegarder sous :" -#: src/templates/drives.html:32 src/templates/drives.html:72 src/templates/drives.html:107 -#: src/templates/index.html:422 src/templates/index.html:454 src/templates/index.html:514 +#: src/templates/drives.html:32 src/templates/drives.html:72 +#: src/templates/drives.html:107 src/templates/index.html:469 +#: src/templates/index.html:501 src/templates/index.html:561 msgid "Create" msgstr "Créer" @@ -630,9 +651,11 @@ msgstr "Lecteurs de CD/DVD" #: src/templates/drives.html:43 msgid "" -"This will create a properties file for the given CD-ROM or DVD image. No new image file will be created." +"This will create a properties file for the given CD-ROM or DVD image. No new " +"image file will be created." msgstr "" -"Cela créera un fichier de propriétés pour l'image CD-ROM ou DVD. Aucun nouveau fichier image sera créé." +"Cela créera un fichier de propriétés pour l'image CD-ROM ou DVD. Aucun nouveau " +"fichier image sera créé." #: src/templates/drives.html:64 msgid "Create for:" @@ -647,445 +670,495 @@ msgstr "Disques amovibles" msgid "%(disk_space)s MiB disk space remaining on the Pi" msgstr "%(disk_space)s Mio d'espace disque restant sur le Pi" -#: src/templates/index.html:7 +#: src/templates/index.html:6 +msgid "" +" This process may take a while, and will continue in the background if you " +"navigate away from this page." +msgstr "" +" Ce processus peut prendre du temps, et continuera de s’exécuter en arrière " +"plan si vous quittez cette page." + +#: src/templates/index.html:11 +msgid "" +" The Web Interface will become unresponsive momentarily. Reload this page after " +"the Pi has started up again." +msgstr "" +" L’interface web ne répondras pas momentanément. Rechargez cette page après que " +"le Pi ai redémarré." + +#: src/templates/index.html:19 msgid "Current PiSCSI Configuration" msgstr "Configuration PiSCSI actuelle" -#: src/templates/index.html:10 +#: src/templates/index.html:22 #, python-format -msgid "Save and load device configurations, stored as json files in %(config_dir)s" -msgstr "" -"Sauvegarder et charger les fichiers de configuration de périphériques, stockés en fichiers json dans " +msgid "" +"Save and load device configurations, stored as json files in " "%(config_dir)s" - -#: src/templates/index.html:11 -msgid "To have a particular device configuration load when PiSCSI starts, save it as default." msgstr "" -"Pour avoir une configuration de périphérique en particulier chargée au démarrage de PiSCSI, sauvegardez la " -"en tant que default." +"Sauvegarder et charger les fichiers de configuration de périphériques, stockés " +"en fichiers json dans %(config_dir)s" -#: src/templates/index.html:17 src/templates/index.html:39 src/templates/index.html:473 +#: src/templates/index.html:23 +msgid "" +"To have a particular device configuration load when PiSCSI starts, save it as " +"default." +msgstr "" +"Pour avoir une configuration de périphérique en particulier chargée au " +"démarrage de PiSCSI, sauvegardez la en tant que default." + +#: src/templates/index.html:29 src/templates/index.html:51 +#: src/templates/index.html:520 msgid "File Name:" msgstr "Nom de fichier :" -#: src/templates/index.html:27 +#: src/templates/index.html:39 msgid "No saved configurations" msgstr "Aucune configuration sauvegardée" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Load" msgstr "Charger" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Detach all current device and Load configuration?" msgstr "Détacher tout les périphériques actuels et charger la configuration ?" -#: src/templates/index.html:32 src/templates/index.html:338 +#: src/templates/index.html:44 src/templates/index.html:356 msgid "Delete" msgstr "Supprimer" -#: src/templates/index.html:32 +#: src/templates/index.html:44 msgid "Delete configuration file?" msgstr "Supprimer le fichier de configuration ?" -#: src/templates/index.html:33 src/templates/index.html:376 +#: src/templates/index.html:45 src/templates/index.html:415 msgid "Download" msgstr "Transférer" -#: src/templates/index.html:42 +#: src/templates/index.html:54 msgid "Save" msgstr "Sauvegarder" -#: src/templates/index.html:49 src/templates/index.html:295 src/templates/index.html:605 +#: src/templates/index.html:61 src/templates/index.html:313 +#: src/templates/index.html:652 msgid "ID" msgstr "ID" -#: src/templates/index.html:53 src/templates/index.html:545 +#: src/templates/index.html:65 src/templates/index.html:592 msgid "Device" msgstr "Périphérique" -#: src/templates/index.html:56 src/templates/index.html:205 +#: src/templates/index.html:68 src/templates/index.html:230 msgid "Actions" msgstr "Actions" -#: src/templates/index.html:79 +#: src/templates/index.html:91 msgid "File name" msgstr "Nom de fichier" -#: src/templates/index.html:97 src/templates/index.html:323 src/templates/index.html:615 +#: src/templates/index.html:109 src/templates/index.html:341 +#: src/templates/index.html:662 msgid "Attach" msgstr "Attacher" -#: src/templates/index.html:127 +#: src/templates/index.html:139 msgid "Eject Disk? WARNING: On Mac OS, eject the Disk in the Finder instead!" -msgstr "Ejecter le disque ? ATTENTION: Sur Mac OS, préférez éjecter le disque depuis le Finder !" +msgstr "" +"Ejecter le disque ? ATTENTION: Sur Mac OS, préférez éjecter le disque depuis le " +"Finder !" -#: src/templates/index.html:130 +#: src/templates/index.html:142 msgid "Eject" msgstr "Ejecter" -#: src/templates/index.html:133 +#: src/templates/index.html:145 msgid "Detach Device?" msgstr "Détacher le périphérique ?" -#: src/templates/index.html:136 +#: src/templates/index.html:148 msgid "Detach" msgstr "Détacher" -#: src/templates/index.html:139 +#: src/templates/index.html:151 msgid "Enter a memo for this reservation" msgstr "Entrez un mémo pour cette réservation" -#: src/templates/index.html:142 +#: src/templates/index.html:154 msgid "Reserve" msgstr "Réserver" -#: src/templates/index.html:151 +#: src/templates/index.html:163 msgid "Reserved ID" msgstr "ID réservé" -#: src/templates/index.html:157 +#: src/templates/index.html:169 msgid "Release" msgstr "Détacher" -#: src/templates/index.html:167 +#: src/templates/index.html:179 msgid "Detach all SCSI Devices?" msgstr "Détacher tout les périphériques SCSI ?" -#: src/templates/index.html:168 +#: src/templates/index.html:180 msgid "Detach All Devices" msgstr "Détacher tout les périphériques" -#: src/templates/index.html:171 +#: src/templates/index.html:183 msgid "Show Device Info" msgstr "Afficher les informations du périphérique" -#: src/templates/index.html:181 +#: src/templates/index.html:193 msgid "Image File Management" msgstr "Gestion des fichiers d'image" -#: src/templates/index.html:184 +#: src/templates/index.html:196 #, python-format msgid "" -"Manage image files in the active PiSCSI image directory: %(directory)s with a scan depth of " -"%(scan_depth)s." +"Manage image files in the active PiSCSI image directory: %(directory)s " +"with a scan depth of %(scan_depth)s." msgstr "" -"Gérer les fichiers image dans le dossier image PiSCSI actif : %(directory)s avec un profondeur de " -"scan de %(scan_depth)s." +"Gérer les fichiers image dans le dossier image PiSCSI actif : " +"%(directory)s avec un profondeur de scan de %(scan_depth)s." -#: src/templates/index.html:185 +#: src/templates/index.html:197 #, python-format msgid "" -"Select a valid SCSI ID and LUN to attach to. Unless you know what " -"you're doing, always use LUN 0." +"Select a valid SCSI ID and LUN to " +"attach to. Unless you know what you're doing, always use LUN 0." msgstr "" -"Sélectionnez un ID SCSI et un LUN valides.À moins que vous ne " -"sachiez ce que vous faites, utilisez toujours LUN 0." +"Sélectionnez un ID SCSI et un LUN " +"valides.À moins que vous ne sachiez ce que vous faites, utilisez toujours LUN 0." -#: src/templates/index.html:188 +#: src/templates/index.html:200 msgid "Recognized image file types:" msgstr "Types de fichiers image reconnus:" -#: src/templates/index.html:193 +#: src/templates/index.html:205 msgid "Recognized archive file types:" msgstr "Types de fichiers d'archive reconnus:" -#: src/templates/index.html:204 -msgid "Size" -msgstr "Taille" - -#: src/templates/index.html:210 +#: src/templates/index.html:214 msgid "The images directory is currently empty." msgstr "Le répertoire des images est actuellement vide." -#: src/templates/index.html:228 +#: src/templates/index.html:229 +msgid "Size" +msgstr "Taille" + +#: src/templates/index.html:246 msgid "Properties File" msgstr "Fichier de propriété" -#: src/templates/index.html:250 src/templates/index.html:262 src/templates/index.html:289 +#: src/templates/index.html:268 src/templates/index.html:280 +#: src/templates/index.html:307 msgid "Extract" msgstr "Décompresser" -#: src/templates/index.html:250 src/templates/index.html:262 +#: src/templates/index.html:268 src/templates/index.html:280 msgid "Extracting a single file..." msgstr "Décompression d'un fichier unique..." -#: src/templates/index.html:277 src/templates/index.html:484 src/templates/upload.html:50 +#: src/templates/index.html:295 src/templates/index.html:531 +#: src/templates/upload.html:68 msgid "MiB" msgstr "Mio" -#: src/templates/index.html:282 +#: src/templates/index.html:300 msgid "In use" msgstr "Utilisé" -#: src/templates/index.html:289 +#: src/templates/index.html:307 msgid "Extracting all files..." msgstr "Décompression de tous les fichiers..." -#: src/templates/index.html:312 +#: src/templates/index.html:330 msgid "Unknown" msgstr "Inconnu" -#: src/templates/index.html:326 +#: src/templates/index.html:344 #, python-format msgid "Enter new file name for: %(file_name)s" msgstr "Entrez un nouveau nom de fichier pour : %(file_name)s" -#: src/templates/index.html:329 src/templates/index.html:709 +#: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" msgstr "Renommer" -#: src/templates/index.html:331 +#: src/templates/index.html:349 #, python-format msgid "Save copy of %(file_name)s as:" msgstr "Enregistrer une copie de %(file_name)s sous:" -#: src/templates/index.html:334 +#: src/templates/index.html:352 msgid "Copy" msgstr "Copier" -#: src/templates/index.html:336 +#: src/templates/index.html:354 #, python-format msgid "Delete file: %(file_name)s?" msgstr "Supprimer le fichier : %(file_name)s ?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "?" msgstr "?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "Info" msgstr "Info" -#: src/templates/index.html:352 +#: src/templates/index.html:374 #, python-format msgid "%(disk_space)s MiB disk space remaining on the system" msgstr "%(disk_space)s Mio d'espace disque restant sur le système" -#: src/templates/index.html:360 +#: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" msgstr "Transférer des fichiers vers le PiSCSI" -#: src/templates/index.html:363 src/templates/index.html:373 src/templates/upload.html:8 -#: src/templates/upload.html:16 +#: src/templates/index.html:385 src/templates/index.html:398 +#: src/templates/upload.html:8 src/templates/upload.html:18 msgid "Disk Images" msgstr "Images Disque" -#: src/templates/index.html:364 src/templates/index.html:375 src/templates/upload.html:9 -#: src/templates/upload.html:18 +#: src/templates/index.html:387 src/templates/index.html:407 +#: src/templates/upload.html:10 src/templates/upload.html:27 msgid "Shared Files" msgstr "Fichiers Partagés" -#: src/templates/index.html:365 -msgid "To access shared files remotely, you may have to install one of the file servers first." +#: src/templates/index.html:389 +msgid "" +"Install a file server and create the shared files directory in order to share " +"files between the Pi and your vintage computers." msgstr "" -"Pour accéder à distance aux fichiers partagés, vous devrez peut-être d'abord installer l'un des serveurs de " -"fichier d'abord." +"Installez un serveur de fichiers et créez le répertoire des fichiers partagés " +"afin de partager des fichiers entre le Pi et vos ordinateurs vintage." -#: src/templates/index.html:370 src/templates/index.html:399 +#: src/templates/index.html:395 src/templates/index.html:446 msgid "Download file from URL:" msgstr "Télécharger le fichier à partir de l'URL:" -#: src/templates/index.html:376 +#: src/templates/index.html:415 msgid "Downloading File..." msgstr "Téléchargement du fichier..." -#: src/templates/index.html:381 +#: src/templates/index.html:420 msgid "Upload Files (new tab)" msgstr "Télécharger des fichiers (nouvel onglet)" -#: src/templates/index.html:389 +#: src/templates/index.html:427 src/templates/upload.html:77 +msgid "The file uploading functionality requires JavaScript." +msgstr "La fonctionnalité de téléchargement de fichiers nécessite JavaScript." + +#: src/templates/index.html:436 msgid "Create CD-ROM Image" msgstr "Créer une image de CD-ROM" -#: src/templates/index.html:392 +#: src/templates/index.html:439 msgid "HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX." msgstr "HFS est pour Mac OS, Joliet pour Windows, et Rock Ridge pour POSIX." -#: src/templates/index.html:393 -msgid "If the downloaded file is a zip archive, we will attempt to unzip it and store the resulting files." +#: src/templates/index.html:440 +msgid "" +"If the downloaded file is a zip archive, we will attempt to unzip it and store " +"the resulting files." msgstr "" -"Si le fichier téléchargé est une archive zip, nous allons tenter de la décompresser et de stocker les " -"fichiers résultants." +"Si le fichier téléchargé est une archive zip, nous allons tenter de la " +"décompresser et de stocker les fichiers résultants." -#: src/templates/index.html:401 src/templates/index.html:433 src/templates/index.html:475 +#: src/templates/index.html:448 src/templates/index.html:480 +#: src/templates/index.html:522 msgid "Type:" msgstr "Type :" -#: src/templates/index.html:422 +#: src/templates/index.html:469 msgid "Downloading file and generating CD-ROM image..." msgstr "Téléchargement du fichier et génération de l’image CD-ROM..." -#: src/templates/index.html:427 +#: src/templates/index.html:474 msgid "Use local file:" msgstr "Utilisez un fichier local :" -#: src/templates/index.html:454 +#: src/templates/index.html:501 msgid "Generating CD-ROM image..." msgstr "Génération de l'image du CD-ROM..." -#: src/templates/index.html:464 +#: src/templates/index.html:511 msgid "Create Empty Disk Image" msgstr "Créer un fichier d’image disque vide" -#: src/templates/index.html:467 +#: src/templates/index.html:514 #, python-format msgid "" -"Please refer to wiki documentation to learn more about the " -"supported image file types." +"Please refer to wiki documentation to " +"learn more about the supported image file types." msgstr "" -"Veuillez consulter wiki pour en savoir plus sur les types de " -"fichiers image pris en charge." +"Veuillez consulter wiki pour en " +"savoir plus sur les types de fichiers image pris en charge." -#: src/templates/index.html:468 -msgid "It is not recommended to use the Lido hard disk driver with the Macintosh Plus." -msgstr "Il n'est pas recommandé d'utiliser le pilote de disque dur Lido avec le Macintosh Plus." +#: src/templates/index.html:515 +msgid "" +"It is not recommended to use the Lido hard disk driver with the Macintosh Plus." +msgstr "" +"Il n'est pas recommandé d'utiliser le pilote de disque dur Lido avec le " +"Macintosh Plus." -#: src/templates/index.html:483 +#: src/templates/index.html:530 msgid "Size:" msgstr "Taille :" -#: src/templates/index.html:485 src/templates/index.html:577 +#: src/templates/index.html:532 src/templates/index.html:624 msgid "Masquerade as:" msgstr "Se faire passer pour:" -#: src/templates/index.html:488 src/templates/index.html:499 src/templates/index.html:580 +#: src/templates/index.html:535 src/templates/index.html:546 +#: src/templates/index.html:627 msgid "None" msgstr "Aucun" -#: src/templates/index.html:496 +#: src/templates/index.html:543 msgid "Format as:" msgstr "Formater comme:" -#: src/templates/index.html:519 +#: src/templates/index.html:566 msgid "Create Disk Image With Properties" msgstr "Créer une image disque avec propriétés" -#: src/templates/index.html:528 +#: src/templates/index.html:575 msgid "Attach Peripheral Device" msgstr "Attacher le Périphérique" -#: src/templates/index.html:533 +#: src/templates/index.html:580 msgid "" -"The piscsi_bridge network bridge is active and ready to be used by an emulated network adapter!" +"The piscsi_bridge network bridge is active and ready to be used by an " +"emulated network adapter!" msgstr "" -"L'interface piscsi_bridge est active et prête à être utilisée par un adaptateur réseau émulé!" +"L'interface piscsi_bridge est active et prête à être utilisée par un " +"adaptateur réseau émulé!" -#: src/templates/index.html:535 +#: src/templates/index.html:582 msgid "" -"Please configure the piscsi_bridge network bridge before attaching an emulated network adapter!" +"Please configure the piscsi_bridge network bridge before attaching an " +"emulated network adapter!" msgstr "" -"Veuillez configurer le pont réseau piscsi_bridge avantde connecter une carte réseau virtuelle !" +"Veuillez configurer le pont réseau piscsi_bridge avantde connecter une " +"carte réseau virtuelle !" -#: src/templates/index.html:537 +#: src/templates/index.html:584 #, python-format msgid "" -"To browse the modern web, install a vintage web proxy such as Macproxy." +"To browse the modern web, install a vintage web proxy such as Macproxy." msgstr "" -"Pour naviguer sur le Web moderne, installez un proxy Web vintage tel que Macproxy." +"Pour naviguer sur le Web moderne, installez un proxy Web vintage tel que Macproxy." -#: src/templates/index.html:539 +#: src/templates/index.html:586 #, python-format -msgid "Read more about supported device types on the wiki." +msgid "" +"Read more about supported device types on the wiki." msgstr "" -"En savoir plus sur les appareils pris en chargetypes sur wiki." +"En savoir plus sur les appareils pris en " +"chargetypes sur wiki." -#: src/templates/index.html:546 +#: src/templates/index.html:593 msgid "Key" msgstr "Clé" -#: src/templates/index.html:547 +#: src/templates/index.html:594 msgid "Parameters and Actions" msgstr "Paramètres et Actions" -#: src/templates/index.html:627 +#: src/templates/index.html:674 msgid "Logging" msgstr "Journalisation" -#: src/templates/index.html:630 +#: src/templates/index.html:677 msgid "The current dropdown selection indicates the active log level." msgstr "Le menu déroulant indique le niveau de journalisation." -#: src/templates/index.html:636 +#: src/templates/index.html:683 msgid "Log Lines:" msgstr "Lignes du journal :" -#: src/templates/index.html:638 +#: src/templates/index.html:685 msgid "Scope:" msgstr "Portée :" -#: src/templates/index.html:641 +#: src/templates/index.html:688 msgid "All logs" msgstr "Tout les journaux" -#: src/templates/index.html:656 +#: src/templates/index.html:703 msgid "Show Logs" msgstr "Montrer les journaux" -#: src/templates/index.html:662 +#: src/templates/index.html:709 msgid "Log Level:" msgstr "Niveau de journalisation :" -#: src/templates/index.html:670 +#: src/templates/index.html:717 msgid "Set Log Level" msgstr "Définir le niveau de journalisation" -#: src/templates/index.html:680 +#: src/templates/index.html:727 msgid "System Operations" msgstr "Opérations système" -#: src/templates/index.html:683 -msgid "The System Name is the \"pretty\" hostname if set, with a fallback to the regular hostname." -msgstr "" -"Le nom du système est le nom d'hôte \"pretty\" s'il est défini, avec une solution de repli versun nom " -"d'hôte normal." - -#: src/templates/index.html:684 +#: src/templates/index.html:730 msgid "" -"IMPORTANT: Always shut down the system before turning off the power. Failing to do so may lead to data loss." +"The System Name is the \"pretty\" hostname if set, with a fallback to the " +"regular hostname." msgstr "" -"IMPORTANT: Éteignez toujours le Raspberry Pi avant de couper l'alimentation. Ne pas le faire peut entraîner " -"une perte de données." +"Le nom du système est le nom d'hôte \"pretty\" s'il est défini, avec une " +"solution de repli versun nom d'hôte normal." -#: src/templates/index.html:690 +#: src/templates/index.html:731 +msgid "" +"IMPORTANT: Always shut down the system before turning off the power. Failing to " +"do so may lead to data loss." +msgstr "" +"IMPORTANT: Éteignez toujours le Raspberry Pi avant de couper l'alimentation. Ne " +"pas le faire peut entraîner une perte de données." + +#: src/templates/index.html:737 msgid "Language:" msgstr "Langue :" -#: src/templates/index.html:702 +#: src/templates/index.html:749 msgid "Change Language" msgstr "Changer la langue" -#: src/templates/index.html:713 +#: src/templates/index.html:760 msgid "Reset" msgstr "Réinitialiser" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Reboot the System?" msgstr "Redémarrer le Raspberry Pi ?" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Rebooting the system..." msgstr "Redémarrage du Raspberry Pi..." -#: src/templates/index.html:718 +#: src/templates/index.html:765 msgid "Reboot System" msgstr "Redémarrer le Raspberry Pi" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shut Down the System?" msgstr "Éteindre le Raspberry Pi ?" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shutting down the system..." msgstr "Le Raspberry Pi est en cours d’extinction..." -#: src/templates/index.html:721 +#: src/templates/index.html:768 msgid "Shut Down System" msgstr "Éteindre le Raspberry Pi" -#: src/templates/index.html:729 +#: src/templates/index.html:776 msgid "Read the PiSCSI Manual" msgstr "Lire le manuel du PiSCSI" @@ -1106,427 +1179,90 @@ msgstr "Télécharger le fichier depuis l'ordinateur local" #: src/templates/upload.html:6 #, python-format msgid "" -"The largest file size accepted in this form is %(max_file_size)s MiB. Use other file transfer means for " -"larger files." +"The largest file size accepted in this form is %(max_file_size)s MiB. Use other " +"file transfer means for larger files." msgstr "" -"La plus grande taille de fichier acceptée pour ce formulaire est de %(max_file_size)s Mio. Veuillez " -"utiliser d'autres moyens de transfert de fichiers pour les fichiers plus volumineux." +"La plus grande taille de fichier acceptée pour ce formulaire est de " +"%(max_file_size)s Mio. Veuillez utiliser d'autres moyens de transfert de " +"fichiers pour les fichiers plus volumineux." #: src/templates/upload.html:7 msgid "" -"You have to manually clean up partially uploaded files, as a result of cancelling the upload or closing " -"this page." +"You have to manually clean up partially uploaded files, as a result of " +"cancelling the upload or closing this page." msgstr "" -"Vous devez nettoyer manuellement les fichiers partiellement téléchargés, à la suite de l'annulation du " -"téléchargement ou de la fermeture de cette page." +"Vous devez nettoyer manuellement les fichiers partiellement téléchargés, à la " +"suite de l'annulation du téléchargement ou de la fermeture de cette page." -#: src/templates/upload.html:10 src/templates/upload.html:20 +#: src/templates/upload.html:12 src/templates/upload.html:36 msgid "PiSCSI Config" msgstr "Configuration PiSCSI" -#: src/templates/upload.html:13 +#: src/templates/upload.html:15 msgid "Destination" msgstr "Destination" -#: src/templates/upload.html:36 +#: src/templates/upload.html:54 msgid "Drop files here to upload" msgstr "Déposez le fichier ici pour le transférer" -#: src/templates/upload.html:37 +#: src/templates/upload.html:55 msgid "Your browser does not support drag'n'drop file uploads." msgstr "Votre navigateur ne supporte pas l'envoi de fichier par glisser-déposer." -#: src/templates/upload.html:38 -msgid "Please use the fallback form below to upload your files like in the olden days." +#: src/templates/upload.html:56 +msgid "" +"Please use the fallback form below to upload your files like in the olden days." msgstr "" -"Merci d'utiliser le formulaire de replis ci-dessous pour transférer vos fichiers de manière classique." +"Merci d'utiliser le formulaire de replis ci-dessous pour transférer vos " +"fichiers de manière classique." -#: src/templates/upload.html:39 +#: src/templates/upload.html:57 msgid "File is too big: {{filesize}}MiB. Max filesize: {{maxFilesize}}MiB." -msgstr "Le fichier est trop volumineux : {{filesize}} Mio. Taille maximale du fichier : {{maxFilesize}} Mio." +msgstr "" +"Le fichier est trop volumineux : {{filesize}} Mio. Taille maximale du fichier : " +"{{maxFilesize}} Mio." -#: src/templates/upload.html:40 +#: src/templates/upload.html:58 msgid "You can't upload files of this type." msgstr "Vous ne pouvez pas transférer de fichiers de ce type." -#: src/templates/upload.html:41 +#: src/templates/upload.html:59 msgid "Server responded with code: {{statusCode}}" msgstr "Le serveur à répondu avec le code : {{statusCode}}" -#: src/templates/upload.html:42 +#: src/templates/upload.html:60 msgid "Cancel upload" msgstr "Annuler le transfert" -#: src/templates/upload.html:43 +#: src/templates/upload.html:61 msgid "Upload canceled." msgstr "Transfert annulé." -#: src/templates/upload.html:44 +#: src/templates/upload.html:62 msgid "Are you sure you want to cancel this upload?" msgstr "Êtes vous sûr de vouloir annuler ce transfert ?" -#: src/templates/upload.html:45 +#: src/templates/upload.html:63 msgid "Dismiss" msgstr "Rejeter" -#: src/templates/upload.html:46 +#: src/templates/upload.html:64 msgid "You can not upload any more files." msgstr "Vous ne pouvez plus transférer d'autres fichiers." -#: src/templates/upload.html:48 +#: src/templates/upload.html:66 msgid "TiB" msgstr "Tio" -#: src/templates/upload.html:49 +#: src/templates/upload.html:67 msgid "GiB" msgstr "Gio" -#: src/templates/upload.html:51 +#: src/templates/upload.html:69 msgid "KiB" msgstr "Kio@" -#: src/templates/upload.html:52 +#: src/templates/upload.html:70 msgid "B" msgstr "o" - -#~ msgid "Saved configuration file to %(file_name)s" -#~ msgstr "Fichier de configuration sauvegardé dans %(file_name)s" - -#~ msgid "Created properties file: %(file_path)s" -#~ msgstr "Fichier de propriétés créé : %(file_path)s" - -#~ msgid "Could not write to properties file: %(file_path)s" -#~ msgstr "Echec d’écriture du fichier de propriétés : %(file_path)s" - -#~ msgid "return_code" -#~ msgstr "code_retour" - -#~ msgid "Could not read drive properties from %(properties_file)s" -#~ msgstr "Echec de lecture des propriétés du disque depuis %(properties_file)s" - -#~ msgid "Please follow the instructions at %(url)s" -#~ msgstr "Merci de suivre les instructions à %(url)s" - -#~ msgid "" -#~ "The image file size %(file_size)s bytes is not a multiple of %(block_size)s. PiSCSI will ignore the " -#~ "trailing data. The image may be corrupted, so proceed with caution." -#~ msgstr "" -#~ "La taille du fichier image %(file_size)s octets n’est pas un multiple de %(block_size)s. PiSCSI va " -#~ "ignorer les données de fin. L’image peut être corrompue, merci de continuer avec précaution." - -#~ msgid "Failed to attach %(file_name)s to SCSI ID %(id_number)s LUN %(unit_number)s" -#~ msgstr "Echec d'attachement de %(file_name)s au périphérique SCSI ID %(id_number)s LUN %(unit_number)s" - -#~ msgid "Failed to detach SCSI ID %(id_number)s LUN %(unit_number)s" -#~ msgstr "Echec lors du détachement du SCSI ID %(id_number)s LUN %(unit_number)s" - -#~ msgid "Failed to eject SCSI ID %(id_number)s LUN %(unit_number)s" -#~ msgstr "Echec lors de l’éjection de SCSI ID %(id_number)s LUN %(unit_number)s" - -#~ msgid "DEVICE INFO" -#~ msgstr "INFO PÉRIPHÉRIQUE" - -#~ msgid "SCSI ID: %(id_number)s" -#~ msgstr "SCSI ID : %(id_number)s" - -#~ msgid "LUN: %(unit_number)s" -#~ msgstr "LUN : %(unit_number)s" - -#~ msgid "Type: %(device_type)s" -#~ msgstr "Type : %(device_type)s" - -#~ msgid "Status: %(device_status)s" -#~ msgstr "Statut : %(device_status)s" - -#~ msgid "File: %(image_file)s" -#~ msgstr "Fichier : %(image_file)s" - -#~ msgid "Parameters: %(value)s" -#~ msgstr "Paramètres : %(value)s" - -#~ msgid "Vendor: %(value)s" -#~ msgstr "Vendeur : %(value)s" - -#~ msgid "Product: %(value)s" -#~ msgstr "Produit : %(value)s" - -#~ msgid "Revision: %(revision_number)s" -#~ msgstr "Révision : %(revision_number)s" - -#~ msgid "Block Size: %(value)s bytes" -#~ msgstr "Taille de bloc : %(value)s octets" - -#~ msgid "Image Size: %(value)s bytes" -#~ msgstr "Taille de l’image : %(value)s octets" - -#~ msgid "Failed to reserve SCSI ID %(id_number)s" -#~ msgstr "Echec de réservation du SCSI ID %(id_number)s" - -#~ msgid "Failed to release the reservation for SCSI ID %(id_number)s" -#~ msgstr "Echec de libération de la réservation pour SCSI ID %(id_number)s" - -#~ msgid "Failed to create CD-ROM image from %(url)s" -#~ msgstr "Echec de création de l’image CD-ROM depuis %(url)s" - -#~ msgid "Attached to SCSI ID %(id_number)s" -#~ msgstr "Attaché au SCSI ID %(id_number)s" - -#~ msgid "Failed to attach image to SCSI ID %(id_number)s. Try attaching it manually." -#~ msgstr "" -#~ "Echec lors de l'attachement de l’image au SCSI ID %(id_number)s. Essayez de l’attacher manuellement." - -#~ msgid "Aborted unzip: File(s) with the same name already exists." -#~ msgstr "Décompression avortée : Fichier(s) avec le même nom déjà existants." - -#~ msgid "Unzipped the following files:" -#~ msgstr "Décompression des fichiers suivants terminée :" - -#~ msgid "Properties file(s) have been moved to %(directory)s" -#~ msgstr "Fichier(s) de propriétés déplacés vers %(directory)s" - -#~ msgid "Failed to unzip %(zip_file)s" -#~ msgstr "Echec lors de la décompression de %(zip_file)s" - -#~ msgid "SASI Hard Disk" -#~ msgstr "Disque Dur SASI" - -#~ msgid "SCSI Hard Disk" -#~ msgstr "Disque Dur SCSI" - -#~ msgid "CD / DVD" -#~ msgstr "CD / DVD" - -#~ msgid "DaynaPORT SCSI/Link" -#~ msgstr "DaynaPORT SCSI/Link" - -#~ msgid "Configure IPv4 forwarding before using a wireless network device." -#~ msgstr "Configurez le forwarding IPv4 avant d’utiliser un périphérique réseau sans fil." - -#~ msgid "Configure NAT before using a wireless network device." -#~ msgstr "Configurez NAT avant d’utiliser un périphérique réseau sans fil." - -#~ msgid "Pi environment: " -#~ msgstr "Environnement Pi : " - -#~ msgid "Cancel" -#~ msgstr "Annuler" - -#~ msgid "Ref." -#~ msgstr "Réf." - -#~ msgid "Link" -#~ msgstr "Lien" - -#~ msgid "CD-ROM Drives" -#~ msgstr "Lecteurs CD-ROM" - -#~ msgid "Displays the currently attached devices for each available SCSI ID." -#~ msgstr "Montre l’appareil actuellement attaché pour chaque ID SCSI disponible." - -#~ msgid "" -#~ "If PiSCSI was unable to detect the media type associated with the image, you get to choose the type from " -#~ "the dropdown." -#~ msgstr "" -#~ "Si PiSCSI n'as pas pu détecter le type de média associé à l'image, vous pouvez choisir le type depuis le " -#~ "menu déroulant." - -#~ msgid "Unzip" -#~ msgstr "Décompresser" - -#~ msgid "MB" -#~ msgstr "MO" - -#~ msgid "Attached!" -#~ msgstr "Attaché!" - -#~ msgid "Unzip All" -#~ msgstr "Tout décompresser" - -#~ msgid "Select media type" -#~ msgstr "Choisir le type de média" - -#~ msgid "" -#~ "DaynaPORT SCSI/Link and X68000 Host Bridge are network " -#~ "devices." -#~ msgstr "" -#~ "DaynaPORT SCSI/Link et Pont Hôte X68000 sont des " -#~ "périphériques réseau." - -#~ msgid "" -#~ "If you have a DHCP setup, choose only the interface you have configured the bridge with. You can ignore " -#~ "the inet field when attaching." -#~ msgstr "" -#~ "Si vous avez une configuration DHCP, choisir uniquement l'interface pour laquelle le pont est configuré. " -#~ "Vous pouvez ignorer le champ inet lors de l'attache." - -#~ msgid "" -#~ "Configure the network bridge by running easyinstall.sh, or follow the manual steps " -#~ "in the wiki." -#~ msgstr "" -#~ "Configurer le pont réseau en exécutant easyinstall.sh, ou suivre les étapes " -#~ "manuelles décrites dans le wiki." - -#~ msgid "" -#~ "The Printer and Host Services device are currently supported on compatible Atari systems, and require driver software to be installed on the host system." -#~ msgstr "" -#~ "Les périphériques Imprimante et Services Hôte sont actuellement supportés sur les systèmes Atari " -#~ "compatibles et requièrent des pilotes installés sur le système hôte." - -#~ msgid "Peripheral" -#~ msgstr "Périphérique" - -#~ msgid "SCSI ID:" -#~ msgstr "SCSI ID :" - -#~ msgid "" -#~ "Install Macproxy to browse the Web with any vintage browser. It's not just for " -#~ "Macs!" -#~ msgstr "" -#~ "Installez Macproxy pour naviguer sur le web avec n'importe quel navigateur " -#~ "ancien. Ce n'est pas que pour les Macs !" - -#~ msgid "Upload File" -#~ msgstr "Transférer fichier" - -#~ msgid "Uploads file to %(directory)s. The largest file size accepted is %(max_file_size)s MB." -#~ msgstr "" -#~ "Transfert le fichier vers %(directory)s. La taille maximale de fichier acceptée est de " -#~ "%(max_file_size)s MO." - -#~ msgid "" -#~ "For unrecognized file types, try renaming hard drive images to '.hds', CD-ROM images to '.iso', and " -#~ "removable drive images to '.hdr' before uploading." -#~ msgstr "" -#~ "Pour les types de fichiers non reconnus, essayez de renommer les image disque dur en '.hds', les images " -#~ "CD-ROM en '.iso', et les images de disques amovibles en '.hdr' avant de les transférer." - -#~ msgid "Recognized file types: %(valid_file_suffix)s" -#~ msgstr "Types de fichiers reconnus : %(valid_file_suffix)s" - -#~ msgid "Remove file" -#~ msgstr "Supprimer le fichier" - -#~ msgid "TB" -#~ msgstr "TO" - -#~ msgid "GB" -#~ msgstr "GO" - -#~ msgid "KB" -#~ msgstr "KO" - -#~ msgid "Download File to Images" -#~ msgstr "Transférer fichier vers les images" - -#~ msgid "Given a URL, download that file to the %(directory)s directory." -#~ msgstr "A partir d’une URL, télécharge ce fichier dans le répertoire %(directory)s." - -#~ msgid "URL:" -#~ msgstr "URL :" - -#~ msgid "URL" -#~ msgstr "URL" - -#~ msgid "Download File to AppleShare" -#~ msgstr "Transférer fichier vers AppleShare" - -#~ msgid "Given a URL, download that file to the %(directory)s directory and share it over AFP." -#~ msgstr "" -#~ "A partir d'une URL, télécharger ce fichier dans le répertoire %(directory)s et le partager via " -#~ "AFP." - -#~ msgid "Manage the files you download here through AppleShare on your vintage Mac." -#~ msgstr "Gérer les fichiers que vous avez transférés ici via AppleShare sur votre Mac vintage." - -#~ msgid "" -#~ "Requires Netatalk to be installed and configured correctly for your network." -#~ msgstr "" -#~ "A besoin que Netatalk soit installé et configuré correctement pour votre réseau." - -#~ msgid "Downloading File to AppleShare..." -#~ msgstr "Transfert du fichier vers AppleShare..." - -#~ msgid "Install Netatalk to use the AppleShare File Server." -#~ msgstr "Installez Netatalk pour utiliser le serveur de fichiers AppleShare." - -#~ msgid "Download File and Create CD-ROM image" -#~ msgstr "Transférer le fichier et créer une image CD-ROM" - -#~ msgid "Create an ISO file system CD-ROM image with the downloaded file, and mount it on the given SCSI ID." -#~ msgstr "Créer une image CD-ROM ISO avec le fichier téléchargé et la monter sur le SCSI ID donné." - -#~ msgid "On Mac OS, a compatible CD-ROM driver is required." -#~ msgstr "Sur Mac OS, un pilote CD-ROM compatible est requis." - -#~ msgid "Download and Mount CD-ROM image" -#~ msgstr "Télécharger et monter image CD-ROM" - -#~ msgid "The Generic image type is recommended for most computer platforms." -#~ msgstr "Le type d'image générique est recommandé pour la plupart des plateformes." - -#~ msgid "" -#~ "APPLE GENUINE (.hda) and NEC GENUINE (.hdn) image types will make PiSCSI behave as a particular drive " -#~ "type that are recognized by Mac and PC98 systems, respectively." -#~ msgstr "" -#~ "Les types d'image APPLE AUTHENTIQUE (.hda) et NEC AUTHENTIQUE (.hdn) feront que PiSCSI se comportera " -#~ "comme un type de disque particulier qui sont reconnus par les systèmes Mac et PC98 respectivement." - -#~ msgid "" -#~ "SASI images should only be used on the original Sharp X68000, or other legacy systems that utilize this " -#~ "pre-SCSI standard." -#~ msgstr "" -#~ "Les images SASI ne devraient être utilisées que sur le Sharp X68000 originel, ou autre systèmes anciens " -#~ "qui utilisent ce standard pre-SCSI." - -#~ msgid "SCSI Hard Disk image (APPLE GENUINE) [.hda]" -#~ msgstr "Image de disque dur SCSI (APPLE AUTHENTIQUE) [.hda]" - -#~ msgid "SCSI Hard Disk image (NEC GENUINE) [.hdn]" -#~ msgstr "Image de disque dur SCSI (NEC AUTHENTIQUE) [.hdn]" - -#~ msgid "SCSI Removable Media Disk image (Generic) [.hdr]" -#~ msgstr "Image de disque amovible SCSI (Générique) [.hdr]" - -#~ msgid "SASI Hard Disk image (Legacy) [.hdf]" -#~ msgstr "Image de disque dur SASI (Héritée) [.hdf]" - -#~ msgid "Create Named Drive" -#~ msgstr "Créer un disque nommé" - -#~ msgid "Create pairs of images and properties files from a list of real-life drives." -#~ msgstr "Créer une paire d'image et de fichier de propriétés depuis une liste de vrais disques." - -#~ msgid "" -#~ "This will make PiSCSI use certain vendor strings and block sizes that may improve compatibility with " -#~ "certain systems." -#~ msgstr "" -#~ "PiSCSI utilisera certains noms de vendeurs et tailles de blocs afin d'améliorer la compatibilité avec " -#~ "certains systèmes." - -#~ msgid "Create a named disk image that mimics real-life drives" -#~ msgstr "Créer une image disque nommée imitant les disques réels" - -#~ msgid "Fetch a certain number of lines of system logs with the given scope." -#~ msgstr "Charger un certain nombre de lignes depuis les journaux système avec la portée donnée." - -#~ msgid "Server Log Level" -#~ msgstr "Niveau de journalisation du serveur" - -#~ msgid "Change the log level of the PiSCSI backend process." -#~ msgstr "Changer le niveau de journalisation des processus principaux PiSCSI." - -#~ msgid "Language" -#~ msgstr "Langue" - -#~ msgid "Change the Web Interface language." -#~ msgstr "Changer la langue de l'interface web." - -#~ msgid "Reboot or shut down the Raspberry Pi that PiSCSI is running on." -#~ msgstr "Redémarrer ou éteindre le Raspberry Pi sur lequel PiSCSI s'exécute." - -#~ msgid "Reboot Raspberry Pi" -#~ msgstr "Redémarrer le Raspberry Pi" - -#~ msgid "Shut Down Raspberry Pi" -#~ msgstr "Éteindre le Raspberry Pi" From 5caede988e891450c74d3616ea5e9c606a0e000a Mon Sep 17 00:00:00 2001 From: n4al Date: Sun, 9 Apr 2023 17:44:19 +0000 Subject: [PATCH 25/30] Updating the Spanish localisation (#1145) --- .../translations/es/LC_MESSAGES/messages.po | 570 +++++++++--------- 1 file changed, 277 insertions(+), 293 deletions(-) diff --git a/python/web/src/translations/es/LC_MESSAGES/messages.po b/python/web/src/translations/es/LC_MESSAGES/messages.po index a17915e6..1322689d 100644 --- a/python/web/src/translations/es/LC_MESSAGES/messages.po +++ b/python/web/src/translations/es/LC_MESSAGES/messages.po @@ -8,16 +8,16 @@ msgid "" msgstr "" "Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/PiSCSI/piscsi/issues\n" -"POT-Creation-Date: 2023-02-04 20:05-0600\n" -"PO-Revision-Date: 2023-02-04 20:13-0600\n" +"POT-Creation-Date: 2023-04-09 10:06+0200\n" +"PO-Revision-Date: 2023-04-09 13:16+0200\n" "Last-Translator: n4al \n" "Language-Team: es N/A\n" "Language: es\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.12.1\n" "X-Generator: Poedit 3.2.2\n" #: src/return_code_mapper.py:14 @@ -32,59 +32,69 @@ msgstr "No se ha encontrado el archivo a eliminar: %(file_path)s" #: src/return_code_mapper.py:18 #, python-format +msgid "Could not delete file: %(file_path)s" +msgstr "No se ha podido eliminar el archivo: %(file_path)s" + +#: src/return_code_mapper.py:20 +#, python-format msgid "File moved to: %(target_path)s" msgstr "El archivo se ha trasladado a: %(target_path)s" -#: src/return_code_mapper.py:20 +#: src/return_code_mapper.py:22 #, python-format msgid "Unable to move file to: %(target_path)s" msgstr "No se puede mover el archivo a: %(target_path)s" -#: src/return_code_mapper.py:22 +#: src/return_code_mapper.py:24 #, python-format msgid "Created CD-ROM ISO image with arguments \"%(value)s\"" msgstr "Creada la imagen ISO del CD-ROM con argumentos “%(value)s”" -#: src/return_code_mapper.py:24 +#: src/return_code_mapper.py:26 #, python-format msgid "%(file_name)s downloaded to %(save_dir)s" msgstr "%(file_name)s descargado en %(save_dir)s" -#: src/return_code_mapper.py:26 +#: src/return_code_mapper.py:28 #, python-format msgid "File created: %(target_path)s" msgstr "Archivo creado: %(target_path)s" -#: src/return_code_mapper.py:28 +#: src/return_code_mapper.py:30 #, python-format msgid "Could not create file: %(target_path)s" msgstr "No se pudo crear el archivo: %(target_path)s" -#: src/return_code_mapper.py:30 +#: src/return_code_mapper.py:32 +#, python-format +msgid "A file with name %(target_path)s already exists" +msgstr "Ya existe un archivo con el nombre %(target_path)s" + +#: src/return_code_mapper.py:34 #, python-format msgid "Loaded configurations from: %(file_name)s" msgstr "Configuraciones cargadas de: %(file_name)s" -#: src/return_code_mapper.py:32 +#: src/return_code_mapper.py:36 #, python-format msgid "Could not read configuration file: %(file_name)s" msgstr "No se ha podido leer el archivo de configuración: %(file_name)s" -#: src/return_code_mapper.py:34 +#: src/return_code_mapper.py:38 msgid "Invalid configuration file format" msgstr "Formato de archivo de configuración no válido" -#: src/return_code_mapper.py:36 +#: src/return_code_mapper.py:40 #, python-format msgid "Read properties from file: %(file_path)s" msgstr "Leer las propiedades del archivo: %(file_path)s" -#: src/return_code_mapper.py:38 +#: src/return_code_mapper.py:42 #, python-format msgid "Could not read properties from file: %(file_path)s" msgstr "No se han podido leer las propiedades del archivo: %(file_path)s" -#: src/return_code_mapper.py:40 +#: src/return_code_mapper.py:44 #, python-format msgid "" "Cannot insert an image for %(device_type)s into a %(current_device_type)s device" @@ -92,20 +102,20 @@ msgstr "" "No se puede insertar una imagen para %(device_type)s en un dispositivo " "%(current_device_type)s" -#: src/return_code_mapper.py:42 +#: src/return_code_mapper.py:46 #, python-format msgid "Extracted %(count)s file(s)" msgstr "Extraido %(count)s archivo(s)" -#: src/return_code_mapper.py:44 +#: src/return_code_mapper.py:48 msgid "Unable to extract archive: No files were specified" msgstr "No se puede extraer el archivo: No se han especificado archivos" -#: src/return_code_mapper.py:46 +#: src/return_code_mapper.py:50 msgid "No files were extracted (existing files are skipped)" msgstr "No se ha extraído ningún archivo (se omiten los archivos existentes)" -#: src/return_code_mapper.py:48 +#: src/return_code_mapper.py:52 #, python-format msgid "Unable to extract archive: %(error)s" msgstr "No se puede extraer el archivo: %(error)s" @@ -136,23 +146,15 @@ msgstr "" "La interfaz web de PiSCSI no ha obtenido una respuesta válida de PiSCSI. Por " "favor, vuelva a intentarlo. Si el problema persiste, informe de un error." -#: src/web.py:214 -msgid "" -"PiSCSI is password protected. Start the Web Interface with the --password " -"parameter." -msgstr "" -"PiSCSI está protegido por contraseña. Inicie la Interfaz Web con el parámetro —" -"password." - -#: src/web.py:263 +#: src/web.py:252 msgid "PiSCSI Control Page" msgstr "Página de control PiSCSI" -#: src/web.py:309 +#: src/web.py:304 msgid "PiSCSI Create Drive" msgstr "PiSCSI Crear unidad" -#: src/web.py:323 +#: src/web.py:320 msgid "PiSCSI File Upload" msgstr "Carga de archivos PiSCSI" @@ -172,57 +174,57 @@ msgstr "No hay datos de propiedades para la unidad %(drive_name)s" msgid "Image file with properties created: %(file_name)s" msgstr "Archivo de imagen con propiedades creado: %(file_name)s" -#: src/web.py:521 +#: src/web.py:522 msgid "PiSCSI Image Info" msgstr "Información de imagen PiSCSI" -#: src/web.py:528 +#: src/web.py:529 #, python-format msgid "An error occurred when getting disk info: %(error)s" msgstr "Se ha producido un error al obtener la información del disco: %(error)s" -#: src/web.py:542 +#: src/web.py:543 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s no es una aplicación PiSCSI reconocida" -#: src/web.py:569 +#: src/web.py:570 msgid "PiSCSI Manual" msgstr "PiSCSI Manual" -#: src/web.py:576 +#: src/web.py:577 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "Se ha producido un error al acceder a la página del manual: %(error)s" -#: src/web.py:592 +#: src/web.py:593 msgid "PiSCSI System Logs" msgstr "Registros del sistema PiSCSI" -#: src/web.py:600 +#: src/web.py:601 #, python-format msgid "An error occurred when fetching logs: %(error)s" msgstr "Se ha producido un error al obtener los registros: %(error)s" -#: src/web.py:614 +#: src/web.py:615 #, python-format msgid "Log level set to %(value)s" msgstr "Nivel de registro fijado en %(value)s" -#: src/web.py:631 src/web.py:694 +#: src/web.py:632 src/web.py:695 msgid "No SCSI ID specified" msgstr "No se ha especificado el SCSI ID" -#: src/web.py:672 +#: src/web.py:673 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Conectado %(device_type)s a SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:696 +#: src/web.py:697 msgid "No image file to insert" msgstr "No hay archivo de imagen para insertar" -#: src/web.py:736 +#: src/web.py:737 #, python-format msgid "" "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " @@ -231,310 +233,298 @@ msgstr "" "Conectado %(file_name)s como %(device_type)s a SCSI ID %(id_number)s LUN " "%(unit_number)s" -#: src/web.py:753 +#: src/web.py:754 msgid "Detached all SCSI devices" msgstr "Se han desconectado todos los dispositivos SCSI" -#: src/web.py:769 +#: src/web.py:770 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "SCSI ID desconectado %(id_number)s LUN %(unit_number)s" -#: src/web.py:791 +#: src/web.py:792 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "Expulsado SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:810 +#: src/web.py:811 msgid "PiSCSI Device Info" msgstr "Información del dispositivo PiSCSI" -#: src/web.py:814 +#: src/web.py:815 msgid "No devices attached" msgstr "No hay dispositivos conectados" -#: src/web.py:830 +#: src/web.py:831 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "SCSI ID reservado %(id_number)s" -#: src/web.py:848 +#: src/web.py:849 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "Liberada la reserva para SCSI ID %(id_number)s" -#: src/web.py:867 +#: src/web.py:868 #, python-format msgid "System name changed to '%(name)s'." msgstr "El nombre del sistema ha cambiado a ‘%(name)s’." -#: src/web.py:868 +#: src/web.py:869 msgid "System name reset to default." msgstr "Nombre del sistema restablecido por defecto." -#: src/web.py:870 +#: src/web.py:871 msgid "Failed to change system name." msgstr "Error al cambiar el nombre del sistema." -#: src/web.py:924 +#: src/web.py:925 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." msgstr "%(iso_type)s no es un formato de CD-ROM válido." -#: src/web.py:939 +#: src/web.py:940 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" msgstr "" "Se ha producido el siguiente error al crear la imagen del CD-ROM: %(error)s" -#: src/web.py:946 +#: src/web.py:947 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "Se creó %(file_name)s de imagen de CD-ROM con el tipo %(iso_type)s." -#: src/web.py:974 +#: src/web.py:977 src/web.py:1021 +msgid "Unknown destination" +msgstr "Destino desconocido" + +#: src/web.py:986 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "Se ha producido el siguiente error al descargar: %(error)s" -#: src/web.py:1045 src/web.py:1058 +#: src/web.py:1065 src/web.py:1078 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s no es un formato de disco duro válido." -#: src/web.py:1103 +#: src/web.py:1123 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "Archivo de imagen con propiedades creadas: %(file_name)s%(drive_format)s" -#: src/web.py:1113 +#: src/web.py:1133 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "Archivo de imagen creado: %(file_name)s%(drive_format)s" -#: src/web.py:1174 +#: src/web.py:1194 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "Archivo de imagen con propiedades borrado: %(file_name)s" -#: src/web.py:1183 +#: src/web.py:1203 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "Archivo de imagen borrado: %(file_name)s" -#: src/web.py:1221 +#: src/web.py:1241 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "Archivo de imagen con propiedades renombrado a: %(file_name)s" -#: src/web.py:1230 +#: src/web.py:1250 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "Archivo de imagen renombrado a: %(file_name)s" -#: src/web.py:1268 +#: src/web.py:1288 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "" "Copia del archivo de imagen con las propiedades guardado como: %(file_name)s" -#: src/web.py:1277 +#: src/web.py:1297 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "Copia del archivo de imagen guardado como: %(file_name)s" -#: src/web.py:1330 +#: src/web.py:1350 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Se ha cambiado el lenguaje de la Interfaz Web a %(locale)s" -#: src/web.py:1341 +#: src/web.py:1361 msgid "The requested theme does not exist." msgstr "El tema solicitado no existe." -#: src/web.py:1344 +#: src/web.py:1364 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "Tema cambiado a ‘%(theme)s’." -#: src/web_utils.py:98 +#: src/web_utils.py:112 msgid "Hard Disk Drive" msgstr "Unidad de disco duro" -#: src/web_utils.py:100 +#: src/web_utils.py:114 msgid "Removable Disk Drive" msgstr "Unidad de disco extraíble" -#: src/web_utils.py:102 +#: src/web_utils.py:116 msgid "Magneto-Optical Drive" msgstr "Unidad magneto-óptica" -#: src/web_utils.py:104 +#: src/web_utils.py:118 msgid "CD/DVD Drive" msgstr "Unidad de CD/DVD" -#: src/web_utils.py:106 +#: src/web_utils.py:120 msgid "Host Bridge" msgstr "Host Bridge" -#: src/web_utils.py:108 +#: src/web_utils.py:122 msgid "Ethernet Adapter" msgstr "Adaptador Ethernet" -#: src/web_utils.py:110 +#: src/web_utils.py:124 msgid "Printer" msgstr "Impresora" -#: src/web_utils.py:112 +#: src/web_utils.py:126 msgid "Host Services" msgstr "Servicios de Host" -#: src/web_utils.py:135 +#: src/web_utils.py:149 msgid "Hard Disk Image (Generic)" msgstr "Imagen de disco duro (genérica)" -#: src/web_utils.py:137 +#: src/web_utils.py:151 msgid "Hard Disk Image (Apple)" msgstr "Imagen del disco duro (Apple)" -#: src/web_utils.py:139 +#: src/web_utils.py:153 msgid "Hard Disk Image (NEC)" msgstr "Imagen de disco duro (NEC)" -#: src/web_utils.py:141 +#: src/web_utils.py:155 msgid "Hard Disk Image (SCSI-1)" msgstr "Imagen de disco duro (SCSI-1)" -#: src/web_utils.py:143 +#: src/web_utils.py:157 msgid "Removable Disk Image" msgstr "Imagen de disco extraíble" -#: src/web_utils.py:145 +#: src/web_utils.py:159 msgid "Magneto-Optical Disk Image" msgstr "Imagen de disco magneto-óptico" -#: src/web_utils.py:219 +#: src/web_utils.py:260 msgid "You must log in to use this function" msgstr "Debe conectarse para utilizar esta función" -#: src/web_utils.py:233 +#: src/web_utils.py:274 #, python-format msgid "Configure the network bridge for %(interface)s first: " msgstr "Configure primero el puente de red para %(interface)s: " -#: src/web_utils.py:262 +#: src/web_utils.py:303 #, python-format -msgid "%(file_name)s is not a valid path" -msgstr "%(file_name)s no es una ruta válida" +msgid "No permission to use path '%(file_name)s'" +msgstr "No hay permiso para usar la ruta ‘%(file_name)s’" -#: src/web_utils.py:283 +#: src/web_utils.py:324 msgid "The file already exists!" msgstr "¡El archivo ya existe!" -#: src/web_utils.py:291 +#: src/web_utils.py:332 msgid "Unable to write the file to disk!" msgstr "¡No se puede escribir el archivo en el disco!" -#: src/web_utils.py:299 +#: src/web_utils.py:340 msgid "Transferred file corrupted!" msgstr "¡Archivo transferido corrompido!" -#: src/web_utils.py:301 +#: src/web_utils.py:342 msgid "File upload successful!" msgstr "¡La carga de archivos se ha realizado con éxito!" -#: src/templates/base.html:29 -msgid "" -" This process may take a while, and will continue in the background if you " -"navigate away from this page." -msgstr "" -" Este proceso puede tardar un poco, y continuará en segundo plano si navega " -"fuera de esta página." - -#: src/templates/base.html:34 -msgid "" -" The Web Interface will become unresponsive momentarily. Reload this page after " -"the Pi has started up again." -msgstr "" -" La interfaz web dejará de responder momentáneamente. Vuelva a cargar esta " -"página después de que la Pi haya arrancado de nuevo." - -#: src/templates/base.html:47 +#: src/templates/base.html:33 #, python-format msgid "Logged in as %(username)s" msgstr "Conectado como %(username)s" -#: src/templates/base.html:49 +#: src/templates/base.html:35 msgid "Log Out" msgstr "Cerrar la sesión" -#: src/templates/base.html:54 +#: src/templates/base.html:40 msgid "Log in to use Web Interface" msgstr "Iniciar sesión para utilizar la Interfaz Web" -#: src/templates/base.html:56 +#: src/templates/base.html:42 msgid "Username:" msgstr "Nombre de usuario:" -#: src/templates/base.html:60 +#: src/templates/base.html:46 msgid "Password:" msgstr "Contraseña:" -#: src/templates/base.html:69 +#: src/templates/base.html:55 msgid "Web Interface Authentication Disabled" msgstr "Autenticación de la interfaz web deshabilitada" -#: src/templates/base.html:71 +#: src/templates/base.html:57 #, python-format msgid "See Wiki for more information" msgstr "" "Consulte Wiki para obtener más información" -#: src/templates/base.html:78 +#: src/templates/base.html:64 msgid "PiSCSI" msgstr "PiSCSI" -#: src/templates/base.html:79 +#: src/templates/base.html:65 msgid "Control Page" msgstr "Página de control" -#: src/templates/base.html:85 src/templates/index.html:707 +#: src/templates/base.html:71 src/templates/index.html:754 msgid "System Name:" msgstr "Nombre del sistema:" -#: src/templates/base.html:112 src/templates/base.html:114 +#: src/templates/base.html:98 src/templates/base.html:100 #, python-format msgid "Switch to the %(theme)s theme" msgstr "Cambia al tema %(theme)s " -#: src/templates/base.html:120 +#: src/templates/base.html:106 msgid "The AppleShare server is running. No active connections." msgstr "El servidor AppleShare está funcionando. No hay conexiones activas." -#: src/templates/base.html:123 +#: src/templates/base.html:109 #, python-format msgid "%(value)d active AFP connection" msgstr "%(value)d conexión AFP activa" -#: src/templates/base.html:125 +#: src/templates/base.html:111 #, python-format msgid "%(value)d active AFP connections" msgstr "%(value)d conexiones AFP activas" -#: src/templates/base.html:130 +#: src/templates/base.html:116 #, python-format msgid "Macproxy is running at %(ip_addr)s (default port 5000)" msgstr "Macproxy se está ejecutando en %(ip_addr)s (puerto por defecto: 5000)" -#: src/templates/base.html:134 -msgid "PiSCSI version:" -msgstr "Versión de PiSCSI:" +#: src/templates/base.html:120 +msgid "PiSCSI software version:" +msgstr "Versión del software PiSCSI:" -#: src/templates/base.html:137 +#: src/templates/base.html:123 msgid "Hardware and OS:" msgstr "Hardware y sistema operativo:" -#: src/templates/base.html:140 +#: src/templates/base.html:126 msgid "Network Address:" msgstr "Dirección de red:" @@ -546,12 +536,12 @@ msgstr "Información detallada de los dispositivos conectados" msgid "SCSI ID" msgstr "ID de SCSI" -#: src/templates/deviceinfo.html:13 src/templates/index.html:51 -#: src/templates/index.html:303 src/templates/index.html:613 +#: src/templates/deviceinfo.html:13 src/templates/index.html:63 +#: src/templates/index.html:321 src/templates/index.html:660 msgid "LUN" msgstr "LUN" -#: src/templates/deviceinfo.html:17 src/templates/index.html:309 +#: src/templates/deviceinfo.html:17 src/templates/index.html:327 msgid "Type" msgstr "Tipo" @@ -559,11 +549,11 @@ msgstr "Tipo" msgid "Status" msgstr "Estado" -#: src/templates/deviceinfo.html:25 src/templates/index.html:203 +#: src/templates/deviceinfo.html:25 src/templates/index.html:228 msgid "File" msgstr "Archivo" -#: src/templates/deviceinfo.html:29 src/templates/index.html:54 +#: src/templates/deviceinfo.html:29 src/templates/index.html:66 msgid "Parameters" msgstr "Parámetros" @@ -571,7 +561,7 @@ msgstr "Parámetros" msgid "Vendor" msgstr "Fabricante" -#: src/templates/deviceinfo.html:37 src/templates/index.html:55 +#: src/templates/deviceinfo.html:37 src/templates/index.html:67 msgid "Product" msgstr "Producto" @@ -646,8 +636,8 @@ msgid "Save as:" msgstr "Guardado como:" #: src/templates/drives.html:32 src/templates/drives.html:72 -#: src/templates/drives.html:107 src/templates/index.html:422 -#: src/templates/index.html:454 src/templates/index.html:514 +#: src/templates/drives.html:107 src/templates/index.html:469 +#: src/templates/index.html:501 src/templates/index.html:561 msgid "Create" msgstr "Crear" @@ -676,11 +666,27 @@ msgstr "Unidades de disco extraíbles" msgid "%(disk_space)s MiB disk space remaining on the Pi" msgstr "%(disk_space)s MiB de espacio en disco restante en la Pi" -#: src/templates/index.html:7 +#: src/templates/index.html:6 +msgid "" +" This process may take a while, and will continue in the background if you " +"navigate away from this page." +msgstr "" +" Este proceso puede tardar un poco, y continuará en segundo plano si navega " +"fuera de esta página." + +#: src/templates/index.html:11 +msgid "" +" The Web Interface will become unresponsive momentarily. Reload this page after " +"the Pi has started up again." +msgstr "" +" La interfaz web dejará de responder momentáneamente. Vuelva a cargar esta " +"página después de que la Pi haya arrancado de nuevo." + +#: src/templates/index.html:19 msgid "Current PiSCSI Configuration" msgstr "Configuración actual de PiSCSI" -#: src/templates/index.html:10 +#: src/templates/index.html:22 #, python-format msgid "" "Save and load device configurations, stored as json files in " @@ -689,7 +695,7 @@ msgstr "" "Guardar y cargar las configuraciones de los dispositivos, almacenadas como " "archivos json en %(config_dir)s" -#: src/templates/index.html:11 +#: src/templates/index.html:23 msgid "" "To have a particular device configuration load when PiSCSI starts, save it as " "default." @@ -697,111 +703,111 @@ msgstr "" "Para que se cargue una configuración de dispositivo concreta cuando se inicie " "PiSCSI, guárdela como default." -#: src/templates/index.html:17 src/templates/index.html:39 -#: src/templates/index.html:473 +#: src/templates/index.html:29 src/templates/index.html:51 +#: src/templates/index.html:520 msgid "File Name:" msgstr "Nombre del archivo:" -#: src/templates/index.html:27 +#: src/templates/index.html:39 msgid "No saved configurations" msgstr "No hay configuraciones guardadas" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Load" msgstr "Cargar" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Detach all current device and Load configuration?" msgstr "¿Desconectar todo el dispositivo actual y cargar la configuración?" -#: src/templates/index.html:32 src/templates/index.html:338 +#: src/templates/index.html:44 src/templates/index.html:356 msgid "Delete" msgstr "Borrar" -#: src/templates/index.html:32 +#: src/templates/index.html:44 msgid "Delete configuration file?" msgstr "¿Borrar el archivo de configuración?" -#: src/templates/index.html:33 src/templates/index.html:376 +#: src/templates/index.html:45 src/templates/index.html:415 msgid "Download" msgstr "Descargar" -#: src/templates/index.html:42 +#: src/templates/index.html:54 msgid "Save" msgstr "Guardar" -#: src/templates/index.html:49 src/templates/index.html:295 -#: src/templates/index.html:605 +#: src/templates/index.html:61 src/templates/index.html:313 +#: src/templates/index.html:652 msgid "ID" msgstr "ID" -#: src/templates/index.html:53 src/templates/index.html:545 +#: src/templates/index.html:65 src/templates/index.html:592 msgid "Device" msgstr "Dispositivo" -#: src/templates/index.html:56 src/templates/index.html:205 +#: src/templates/index.html:68 src/templates/index.html:230 msgid "Actions" msgstr "Acciones" -#: src/templates/index.html:79 +#: src/templates/index.html:91 msgid "File name" msgstr "Nombre del archivo" -#: src/templates/index.html:97 src/templates/index.html:323 -#: src/templates/index.html:615 +#: src/templates/index.html:109 src/templates/index.html:341 +#: src/templates/index.html:662 msgid "Attach" msgstr "Conectar" -#: src/templates/index.html:127 +#: src/templates/index.html:139 msgid "Eject Disk? WARNING: On Mac OS, eject the Disk in the Finder instead!" msgstr "" "¿Expulsar el disco? ADVERTENCIA: ¡En Mac OS, expulse el disco en el Finder!" -#: src/templates/index.html:130 +#: src/templates/index.html:142 msgid "Eject" msgstr "Expulsar" -#: src/templates/index.html:133 +#: src/templates/index.html:145 msgid "Detach Device?" msgstr "¿Desconectar el dispositivo?" -#: src/templates/index.html:136 +#: src/templates/index.html:148 msgid "Detach" msgstr "Desconectar" -#: src/templates/index.html:139 +#: src/templates/index.html:151 msgid "Enter a memo for this reservation" msgstr "Introduzca una nota para esta reserva" -#: src/templates/index.html:142 +#: src/templates/index.html:154 msgid "Reserve" msgstr "Reserva" -#: src/templates/index.html:151 +#: src/templates/index.html:163 msgid "Reserved ID" msgstr "ID reservado" -#: src/templates/index.html:157 +#: src/templates/index.html:169 msgid "Release" msgstr "Liberar" -#: src/templates/index.html:167 +#: src/templates/index.html:179 msgid "Detach all SCSI Devices?" msgstr "¿Desconectar todos los dispositivos SCSI?" -#: src/templates/index.html:168 +#: src/templates/index.html:180 msgid "Detach All Devices" msgstr "Desconectar todos los dispositivos" -#: src/templates/index.html:171 +#: src/templates/index.html:183 msgid "Show Device Info" msgstr "Mostrar información del dispositivo" -#: src/templates/index.html:181 +#: src/templates/index.html:193 msgid "Image File Management" msgstr "Gestión de archivos de imagen" -#: src/templates/index.html:184 +#: src/templates/index.html:196 #, python-format msgid "" "Manage image files in the active PiSCSI image directory: %(directory)s " @@ -810,7 +816,7 @@ msgstr "" "Gestionar los archivos de imagen en el directorio activo de las imágenes de " "PiSCSI: %(directory)s con la profundidad de escaneo de %(scan_depth)s." -#: src/templates/index.html:185 +#: src/templates/index.html:197 #, python-format msgid "" "Select a valid SCSI ID and LUN to " @@ -819,131 +825,135 @@ msgstr "" "Seleccione un SCSI ID válido y LUN al que " "conectar. A menos que sepa lo que está haciendo, utilice siempre el LUN 0." -#: src/templates/index.html:188 +#: src/templates/index.html:200 msgid "Recognized image file types:" msgstr "Tipos de archivos de imagen reconocidos:" -#: src/templates/index.html:193 +#: src/templates/index.html:205 msgid "Recognized archive file types:" msgstr "Tipos de archivo reconocidos:" -#: src/templates/index.html:204 -msgid "Size" -msgstr "Tamaño" - -#: src/templates/index.html:210 +#: src/templates/index.html:214 msgid "The images directory is currently empty." msgstr "El directorio de imágenes está vacío." -#: src/templates/index.html:228 +#: src/templates/index.html:229 +msgid "Size" +msgstr "Tamaño" + +#: src/templates/index.html:246 msgid "Properties File" msgstr "Archivo de propiedades" -#: src/templates/index.html:250 src/templates/index.html:262 -#: src/templates/index.html:289 +#: src/templates/index.html:268 src/templates/index.html:280 +#: src/templates/index.html:307 msgid "Extract" msgstr "Extraer" -#: src/templates/index.html:250 src/templates/index.html:262 +#: src/templates/index.html:268 src/templates/index.html:280 msgid "Extracting a single file..." msgstr "Extraer un solo archivo…" -#: src/templates/index.html:277 src/templates/index.html:484 -#: src/templates/upload.html:50 +#: src/templates/index.html:295 src/templates/index.html:531 +#: src/templates/upload.html:68 msgid "MiB" msgstr "MiB" -#: src/templates/index.html:282 +#: src/templates/index.html:300 msgid "In use" msgstr "En uso" -#: src/templates/index.html:289 +#: src/templates/index.html:307 msgid "Extracting all files..." msgstr "Extrayendo todos los archivos…" -#: src/templates/index.html:312 +#: src/templates/index.html:330 msgid "Unknown" msgstr "Desconocido" -#: src/templates/index.html:326 +#: src/templates/index.html:344 #, python-format msgid "Enter new file name for: %(file_name)s" msgstr "Introduzca un nuevo nombre de archivo para: %(file_name)s" -#: src/templates/index.html:329 src/templates/index.html:709 +#: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" msgstr "Renombrar" -#: src/templates/index.html:331 +#: src/templates/index.html:349 #, python-format msgid "Save copy of %(file_name)s as:" msgstr "Guardar copia de %(file_name)s como:" -#: src/templates/index.html:334 +#: src/templates/index.html:352 msgid "Copy" msgstr "Copia" -#: src/templates/index.html:336 +#: src/templates/index.html:354 #, python-format msgid "Delete file: %(file_name)s?" msgstr "¿Borrar el archivo: %(file_name)s?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "?" msgstr "?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "Info" msgstr "Info" -#: src/templates/index.html:352 +#: src/templates/index.html:374 #, python-format msgid "%(disk_space)s MiB disk space remaining on the system" msgstr "%(disk_space)s MiB de espacio en disco restante en el sistema" -#: src/templates/index.html:360 +#: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" msgstr "Transferir archivos al PiSCSI" -#: src/templates/index.html:363 src/templates/index.html:373 -#: src/templates/upload.html:8 src/templates/upload.html:16 +#: src/templates/index.html:385 src/templates/index.html:398 +#: src/templates/upload.html:8 src/templates/upload.html:18 msgid "Disk Images" msgstr "Imágenes de disco" -#: src/templates/index.html:364 src/templates/index.html:375 -#: src/templates/upload.html:9 src/templates/upload.html:18 +#: src/templates/index.html:387 src/templates/index.html:407 +#: src/templates/upload.html:10 src/templates/upload.html:27 msgid "Shared Files" msgstr "Archivos compartidos" -#: src/templates/index.html:365 +#: src/templates/index.html:389 msgid "" -"To access shared files remotely, you may have to install one of the file " -"servers first." +"Install a file server and create the shared files directory in order to share " +"files between the Pi and your vintage computers." msgstr "" -"Para acceder de forma remota a los archivos compartidos, es posible que tengas " -"que instalar primero uno de los servidores de archivos." +"Instala un servidor de archivos y crea el directorio de archivos compartidos " +"para poder compartir archivos entre la Pi y tus ordenadores vintage." -#: src/templates/index.html:370 src/templates/index.html:399 +#: src/templates/index.html:395 src/templates/index.html:446 msgid "Download file from URL:" msgstr "Descarga de archivos desde la web:" -#: src/templates/index.html:376 +#: src/templates/index.html:415 msgid "Downloading File..." msgstr "Descarga de archivos…" -#: src/templates/index.html:381 +#: src/templates/index.html:420 msgid "Upload Files (new tab)" msgstr "Subir archivos (nueva pestaña)" -#: src/templates/index.html:389 +#: src/templates/index.html:427 src/templates/upload.html:77 +msgid "The file uploading functionality requires JavaScript." +msgstr "La función de carga de archivos requiere JavaScript." + +#: src/templates/index.html:436 msgid "Create CD-ROM Image" msgstr "Crear imagen de CD-ROM" -#: src/templates/index.html:392 +#: src/templates/index.html:439 msgid "HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX." msgstr "HFS es para Mac OS, Joliet para Windows y Rock Ridge para POSIX." -#: src/templates/index.html:393 +#: src/templates/index.html:440 msgid "" "If the downloaded file is a zip archive, we will attempt to unzip it and store " "the resulting files." @@ -951,28 +961,28 @@ msgstr "" "Si el fichero descargado es un archivo zip, intentaremos descomprimirlo y " "almacenar los ficheros resultantes." -#: src/templates/index.html:401 src/templates/index.html:433 -#: src/templates/index.html:475 +#: src/templates/index.html:448 src/templates/index.html:480 +#: src/templates/index.html:522 msgid "Type:" msgstr "Tipo:" -#: src/templates/index.html:422 +#: src/templates/index.html:469 msgid "Downloading file and generating CD-ROM image..." msgstr "Descargando archivo y generando imagen de CD-ROM..." -#: src/templates/index.html:427 +#: src/templates/index.html:474 msgid "Use local file:" msgstr "Usar archivo local:" -#: src/templates/index.html:454 +#: src/templates/index.html:501 msgid "Generating CD-ROM image..." msgstr "Generando imagen de CD-ROM..." -#: src/templates/index.html:464 +#: src/templates/index.html:511 msgid "Create Empty Disk Image" msgstr "Crear imagen de disco vacía" -#: src/templates/index.html:467 +#: src/templates/index.html:514 #, python-format msgid "" "Please refer to wiki documentation to " @@ -981,39 +991,39 @@ msgstr "" "Consulte documentación de la wiki para " "obtener más información sobre los tipos de archivos de imagen admitidos." -#: src/templates/index.html:468 +#: src/templates/index.html:515 msgid "" "It is not recommended to use the Lido hard disk driver with the Macintosh Plus." msgstr "" "No se recomienda utilizar el controlador de disco duro Lido con el Macintosh " "Plus." -#: src/templates/index.html:483 +#: src/templates/index.html:530 msgid "Size:" msgstr "Tamaño:" -#: src/templates/index.html:485 src/templates/index.html:577 +#: src/templates/index.html:532 src/templates/index.html:624 msgid "Masquerade as:" msgstr "Enmascararse como:" -#: src/templates/index.html:488 src/templates/index.html:499 -#: src/templates/index.html:580 +#: src/templates/index.html:535 src/templates/index.html:546 +#: src/templates/index.html:627 msgid "None" msgstr "Ninguno" -#: src/templates/index.html:496 +#: src/templates/index.html:543 msgid "Format as:" msgstr "Formatear como:" -#: src/templates/index.html:519 +#: src/templates/index.html:566 msgid "Create Disk Image With Properties" msgstr "Crear imagen de disco con propiedades" -#: src/templates/index.html:528 +#: src/templates/index.html:575 msgid "Attach Peripheral Device" msgstr "Conectar dispositivo periférico" -#: src/templates/index.html:533 +#: src/templates/index.html:580 msgid "" "The piscsi_bridge network bridge is active and ready to be used by an " "emulated network adapter!" @@ -1021,7 +1031,7 @@ msgstr "" "¡El puente de red piscsi_bridge está activo y listo para ser utilizado " "por un adaptador de red emulado!" -#: src/templates/index.html:535 +#: src/templates/index.html:582 msgid "" "Please configure the piscsi_bridge network bridge before attaching an " "emulated network adapter!" @@ -1029,7 +1039,7 @@ msgstr "" "Configure el puente de red piscsi_bridge antes de conectar un " "adaptador de red emulado!" -#: src/templates/index.html:537 +#: src/templates/index.html:584 #, python-format msgid "" "To browse the modern web, install a vintage web proxy such as Macproxy." -#: src/templates/index.html:539 +#: src/templates/index.html:586 #, python-format msgid "" "Read more about supported device typestipos de dispositivos " "compatibles en la wiki." -#: src/templates/index.html:546 +#: src/templates/index.html:593 msgid "Key" msgstr "Clave" -#: src/templates/index.html:547 +#: src/templates/index.html:594 msgid "Parameters and Actions" msgstr "Parámetros y acciones" -#: src/templates/index.html:627 +#: src/templates/index.html:674 msgid "Logging" msgstr "Registro" -#: src/templates/index.html:630 +#: src/templates/index.html:677 msgid "The current dropdown selection indicates the active log level." msgstr "La selección desplegable actual indica el nivel de registro activo." -#: src/templates/index.html:636 +#: src/templates/index.html:683 msgid "Log Lines:" msgstr "Líneas de registro:" -#: src/templates/index.html:638 +#: src/templates/index.html:685 msgid "Scope:" msgstr "Rango:" -#: src/templates/index.html:641 +#: src/templates/index.html:688 msgid "All logs" msgstr "Todos los registros" -#: src/templates/index.html:656 +#: src/templates/index.html:703 msgid "Show Logs" msgstr "Mostrar registros" -#: src/templates/index.html:662 +#: src/templates/index.html:709 msgid "Log Level:" msgstr "Nivel de registro:" -#: src/templates/index.html:670 +#: src/templates/index.html:717 msgid "Set Log Level" msgstr "Establecer el nivel de registro" -#: src/templates/index.html:680 +#: src/templates/index.html:727 msgid "System Operations" msgstr "Operaciones del sistema" -#: src/templates/index.html:683 +#: src/templates/index.html:730 msgid "" "The System Name is the \"pretty\" hostname if set, with a fallback to the " "regular hostname." @@ -1099,7 +1109,7 @@ msgstr "" "El Nombre del Sistema es el nombre de host “bonito” si está configurado, con un " "fallback al nombre de host normal." -#: src/templates/index.html:684 +#: src/templates/index.html:731 msgid "" "IMPORTANT: Always shut down the system before turning off the power. Failing to " "do so may lead to data loss." @@ -1107,43 +1117,43 @@ msgstr "" "IMPORTANTE: Apague siempre el sistema antes de desconectar la alimentación. No " "hacerlo puede provocar la pérdida de datos." -#: src/templates/index.html:690 +#: src/templates/index.html:737 msgid "Language:" msgstr "Idioma:" -#: src/templates/index.html:702 +#: src/templates/index.html:749 msgid "Change Language" msgstr "Cambiar el idioma" -#: src/templates/index.html:713 +#: src/templates/index.html:760 msgid "Reset" msgstr "Resetear" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Reboot the System?" msgstr "¿Reiniciar el sistema?" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Rebooting the system..." msgstr "Reiniciando el sistema…" -#: src/templates/index.html:718 +#: src/templates/index.html:765 msgid "Reboot System" msgstr "Reiniciar el sistema" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shut Down the System?" msgstr "¿Apagar el sistema?" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shutting down the system..." msgstr "Apagando el sistema…" -#: src/templates/index.html:721 +#: src/templates/index.html:768 msgid "Shut Down System" msgstr "Apagar el sistema" -#: src/templates/index.html:729 +#: src/templates/index.html:776 msgid "Read the PiSCSI Manual" msgstr "Lea el manual de PiSCSI" @@ -1179,103 +1189,77 @@ msgstr "" "Tienes que limpiar manualmente los archivos cargados parcialmente, como " "resultado de cancelar la carga o cerrar esta página." -#: src/templates/upload.html:10 src/templates/upload.html:20 +#: src/templates/upload.html:12 src/templates/upload.html:36 msgid "PiSCSI Config" msgstr "Configuración de PiSCSI" -#: src/templates/upload.html:13 +#: src/templates/upload.html:15 msgid "Destination" msgstr "Destino" -#: src/templates/upload.html:36 +#: src/templates/upload.html:54 msgid "Drop files here to upload" msgstr "Suelte los archivos aquí para cargarlos" -#: src/templates/upload.html:37 +#: src/templates/upload.html:55 msgid "Your browser does not support drag'n'drop file uploads." msgstr "" "Su navegador no admite la carga de archivos mediante la función de arrastrar y " "soltar." -#: src/templates/upload.html:38 +#: src/templates/upload.html:56 msgid "" "Please use the fallback form below to upload your files like in the olden days." msgstr "" "Por favor, utilice el siguiente formulario para subir sus archivos como en los " "viejos tiempos." -#: src/templates/upload.html:39 +#: src/templates/upload.html:57 msgid "File is too big: {{filesize}}MiB. Max filesize: {{maxFilesize}}MiB." msgstr "" "El archivo es demasiado grande: {{filesize}}MiB. Tamaño máximo del archivo: " "{{maxFilesize}}MiB." -#: src/templates/upload.html:40 +#: src/templates/upload.html:58 msgid "You can't upload files of this type." msgstr "No se pueden subir archivos de este tipo." -#: src/templates/upload.html:41 +#: src/templates/upload.html:59 msgid "Server responded with code: {{statusCode}}" msgstr "El servidor ha respondido con un código: {{statusCode}}" -#: src/templates/upload.html:42 +#: src/templates/upload.html:60 msgid "Cancel upload" msgstr "Cancelar la subida" -#: src/templates/upload.html:43 +#: src/templates/upload.html:61 msgid "Upload canceled." msgstr "Subida cancelada." -#: src/templates/upload.html:44 +#: src/templates/upload.html:62 msgid "Are you sure you want to cancel this upload?" msgstr "¿Estás seguro de que quieres cancelar esta subida?" -#: src/templates/upload.html:45 +#: src/templates/upload.html:63 msgid "Dismiss" msgstr "Descartar" -#: src/templates/upload.html:46 +#: src/templates/upload.html:64 msgid "You can not upload any more files." msgstr "No puedes subir más archivos." -#: src/templates/upload.html:48 +#: src/templates/upload.html:66 msgid "TiB" msgstr "TiB" -#: src/templates/upload.html:49 +#: src/templates/upload.html:67 msgid "GiB" msgstr "GiB" -#: src/templates/upload.html:51 +#: src/templates/upload.html:69 msgid "KiB" msgstr "KiB" -#: src/templates/upload.html:52 +#: src/templates/upload.html:70 msgid "B" msgstr "B" - -#~ msgid "" -#~ "CD-ROM image %(file_name)s with type %(iso_type)s was created and attached " -#~ "to SCSI ID %(id_number)s" -#~ msgstr "" -#~ "Se ha creado una imagen de CD-ROM %(file_name)s con tipo %(iso_type)s y se " -#~ "ha conectado a SCSI ID %(id_number)s" - -#~ msgid "Download File and Create CD-ROM Image" -#~ msgstr "Descargar archivo y crear imagen de CD-ROM" - -#~ msgid "" -#~ "Create an ISO file system CD-ROM image with the downloaded file, and mount " -#~ "it on the given SCSI ID." -#~ msgstr "" -#~ "Cree una imagen de CD-ROM del sistema de archivos ISO con el archivo " -#~ "descargado y móntelo en la SCSI ID indicada." - -#~ msgid "Download and Mount CD-ROM image" -#~ msgstr "Descargar y montar la imagen del CD-ROM" - -#~ msgid "Language" -#~ msgstr "Idioma" - -#~ msgid "Change the Web Interface language." -#~ msgstr "Cambiar el idioma de la Interfaz Web." From 1a5f1851838e06643634c262b8577c661fb15fae Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sun, 9 Apr 2023 17:29:03 -0700 Subject: [PATCH 26/30] Remove SonarCloud cache setup as it is now offered by default (#1135) (#1143) No need to configure the cache anymore, SonarCloud now has an automatic analysis caching. See https://docs.sonarcloud.io/advanced-setup/languages/c-c-objective-c/#analysis-cache. Co-authored-by: Massimo Paladin --- .github/workflows/cpp.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml index b70855fb..33a84537 100644 --- a/.github/workflows/cpp.yml +++ b/.github/workflows/cpp.yml @@ -93,28 +93,16 @@ jobs: working-directory: cpp run: gcov --preserve-paths $(find -name '*.gcno') - - uses: actions/cache@v3 - name: Cache SonarCloud scan cache - id: sonar-scan-cache - with: - path: ~/.sonar_cache/ - key: sonar-scan-cache-${{ env.SONAR_SCANNER_VERSION }}-${{ github.ref_name }}-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }} - restore-keys: | - sonar-scan-cache-${{ env.SONAR_SCANNER_VERSION }}-${{ github.ref_name }} - - name: Run sonar-scanner env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: >- - (mkdir -p $HOME/.sonar_cache || true) && $HOME/.sonar/sonar-scanner-${{ env.SONAR_SCANNER_VERSION }}-linux/bin/sonar-scanner --define sonar.host.url="${{ env.SONAR_SERVER_URL }}" --define sonar.projectKey=${{ env.SONAR_PROJECT_KEY }} --define sonar.organization=${{ env.SONAR_ORGANIZATION }} --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}" --define sonar.cfamily.gcov.reportsPath=. - --define sonar.cfamily.cache.enabled=true - --define sonar.cfamily.cache.path="$HOME/.sonar_cache/" --define sonar.coverage.exclusions="cpp/**/test/**" --define sonar.cpd.exclusions="cpp/**/test/**" --define sonar.inclusions="cpp/**,python/**" From 8dd5071122b31fd0418f67c3816b4f086bbe88c2 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Sun, 9 Apr 2023 17:29:25 -0700 Subject: [PATCH 27/30] Bump Netatalk to v230302 (#1142) --- easyinstall.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easyinstall.sh b/easyinstall.sh index 37084a61..33c2fdb6 100755 --- a/easyinstall.sh +++ b/easyinstall.sh @@ -735,7 +735,7 @@ function createFileSharingDir() { # Downloads, compiles, and installs Netatalk (AppleShare server) function installNetatalk() { - NETATALK_VERSION="230301" + NETATALK_VERSION="230302" NETATALK_CONFIG_PATH="/etc/netatalk" NETATALK_OPTIONS="--cores=$CORES --share-name='$FILE_SHARE_NAME' --share-path='$FILE_SHARE_PATH'" From 3cceb515cdd73b660f5636b79a6cde4df76c6094 Mon Sep 17 00:00:00 2001 From: Daniel Markstedt Date: Thu, 20 Apr 2023 06:38:31 -0700 Subject: [PATCH 28/30] For HD Product name, use GiB unit from 10,000 Mib and higher. (#1147) * For HD Product name, use GiB unit from 10,000 Mib and higher. * Update unit test --- cpp/devices/scsihd.cpp | 6 +++--- cpp/test/scsihd_test.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cpp/devices/scsihd.cpp b/cpp/devices/scsihd.cpp index 9a8fb216..0b0cca89 100644 --- a/cpp/devices/scsihd.cpp +++ b/cpp/devices/scsihd.cpp @@ -36,9 +36,9 @@ string SCSIHD::GetProductData() const uint64_t capacity = GetBlockCount() * GetSectorSizeInBytes(); string unit; - // 10 GiB and more - if (capacity >= 1'099'511'627'776) { - capacity /= 1'099'511'627'776; + // 10,000 MiB and more + if (capacity >= 10'485'760'000) { + capacity /= 1'073'741'824; unit = "GiB"; } // 1 MiB and more diff --git a/cpp/test/scsihd_test.cpp b/cpp/test/scsihd_test.cpp index b1ff985e..179c7170 100644 --- a/cpp/test/scsihd_test.cpp +++ b/cpp/test/scsihd_test.cpp @@ -69,10 +69,10 @@ TEST(ScsiHdTest, GetProductData) hd_gb.SetFilename(string(filename)); hd_gb.SetSectorSizeInBytes(1024); - hd_gb.SetBlockCount(1'099'511'627'776 / 1024); + hd_gb.SetBlockCount(10'737'418'240 / 1024); hd_gb.FinalizeSetup(0); s = hd_gb.GetProduct(); - EXPECT_NE(string::npos, s.find("1 GiB")); + EXPECT_NE(string::npos, s.find("10 GiB")); remove(filename); } From dafb2a66773de91b48eaf0534a623fb71a82872b Mon Sep 17 00:00:00 2001 From: Tony Kuker <34318535+akuker@users.noreply.github.com> Date: Sat, 22 Apr 2023 19:00:27 -0500 Subject: [PATCH 29/30] Updated Chinese Translations (#1140) * updated translations * remove obsolete translations --------- Co-authored-by: Tony Kuker --- .../translations/zh/LC_MESSAGES/messages.po | 583 +++++++++--------- 1 file changed, 284 insertions(+), 299 deletions(-) diff --git a/python/web/src/translations/zh/LC_MESSAGES/messages.po b/python/web/src/translations/zh/LC_MESSAGES/messages.po index cdc91ae3..88f51a3e 100644 --- a/python/web/src/translations/zh/LC_MESSAGES/messages.po +++ b/python/web/src/translations/zh/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PiSCSI\n" "Report-Msgid-Bugs-To: https://github.com/PiSCSI/piscsi/issues\n" -"POT-Creation-Date: 2023-02-03 20:46-0600\n" -"PO-Revision-Date: 2023-02-08 20:21-0600\n" +"POT-Creation-Date: 2023-03-27 20:18-0500\n" +"PO-Revision-Date: 2023-04-09 19:31-0500\n" "Last-Translator: Tony Kuker \n" "Language-Team: N/A\n" "Language: zh\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Generated-By: Babel 2.11.0\n" +"Generated-By: Babel 2.12.1\n" "X-Generator: Poedit 3.2.2\n" #: src/return_code_mapper.py:14 @@ -31,79 +31,89 @@ msgstr "未找到要删除的文件:%(file_path)s" #: src/return_code_mapper.py:18 #, python-format +msgid "Could not delete file: %(file_path)s" +msgstr "无法删除文件:%(file_path)s" + +#: src/return_code_mapper.py:20 +#, python-format msgid "File moved to: %(target_path)s" msgstr "文件移动到:%(target_path)s" -#: src/return_code_mapper.py:20 +#: src/return_code_mapper.py:22 #, python-format msgid "Unable to move file to: %(target_path)s" msgstr "无法将文件移动到:%(target_path)s" -#: src/return_code_mapper.py:22 +#: src/return_code_mapper.py:24 #, python-format msgid "Created CD-ROM ISO image with arguments \"%(value)s\"" msgstr "用参数 \"%(value)s\" 创建了 CD-ROM ISO 映像" -#: src/return_code_mapper.py:24 +#: src/return_code_mapper.py:26 #, python-format msgid "%(file_name)s downloaded to %(save_dir)s" msgstr "%(file_name)s 下载到 %(save_dir)s" -#: src/return_code_mapper.py:26 +#: src/return_code_mapper.py:28 #, python-format msgid "File created: %(target_path)s" msgstr "文件已创建到:%(target_path)s" -#: src/return_code_mapper.py:28 +#: src/return_code_mapper.py:30 #, python-format msgid "Could not create file: %(target_path)s" msgstr "无法创建文件:%(target_path)s" -#: src/return_code_mapper.py:30 +#: src/return_code_mapper.py:32 +#, python-format +msgid "A file with name %(target_path)s already exists" +msgstr "名称为 %(target_path)s 的文件已存在" + +#: src/return_code_mapper.py:34 #, python-format msgid "Loaded configurations from: %(file_name)s" msgstr "从 %(file_name)s 加载配置" -#: src/return_code_mapper.py:32 +#: src/return_code_mapper.py:36 #, python-format msgid "Could not read configuration file: %(file_name)s" msgstr "无法读取配置文件:%(file_name)s" -#: src/return_code_mapper.py:34 +#: src/return_code_mapper.py:38 msgid "Invalid configuration file format" msgstr "无效的配置文件格式" -#: src/return_code_mapper.py:36 +#: src/return_code_mapper.py:40 #, python-format msgid "Read properties from file: %(file_path)s" msgstr "从文件中读取属性:%(file_path)s" -#: src/return_code_mapper.py:38 +#: src/return_code_mapper.py:42 #, python-format msgid "Could not read properties from file: %(file_path)s" msgstr "无法从文件读取属性:%(file_path)s" -#: src/return_code_mapper.py:40 +#: src/return_code_mapper.py:44 #, python-format msgid "" "Cannot insert an image for %(device_type)s into a %(current_device_type)s device" msgstr "" "无法将%(device_type)s类型的映像文件载入到 %(current_device_type)s 类型的设备" -#: src/return_code_mapper.py:42 +#: src/return_code_mapper.py:46 #, python-format msgid "Extracted %(count)s file(s)" msgstr "提取了%(count)s个文件" -#: src/return_code_mapper.py:44 +#: src/return_code_mapper.py:48 msgid "Unable to extract archive: No files were specified" msgstr "无法提取存档:未指定文件" -#: src/return_code_mapper.py:46 +#: src/return_code_mapper.py:50 msgid "No files were extracted (existing files are skipped)" msgstr "未提取任何文件(跳过现有文件)" -#: src/return_code_mapper.py:48 +#: src/return_code_mapper.py:52 #, python-format msgid "Unable to extract archive: %(error)s" msgstr "无法提取档案:%(error)s" @@ -132,24 +142,17 @@ msgstr "" "PiSCSI Web 界面未从 PiSCSI 获得有效响应,请返回重试。 如果问题仍然存在,请报告错" "误。" -#: src/web.py:214 -msgid "" -"PiSCSI is password protected. Start the Web Interface with the --password " -"parameter." -msgstr "PiSCSI 受密码保护。 请使用 --password 参数启动 Web 界面。" - -#: src/web.py:263 +#: src/web.py:252 msgid "PiSCSI Control Page" msgstr "PiSCSI 控制页面" -#: src/web.py:309 +#: src/web.py:304 msgid "PiSCSI Create Drive" -msgstr "" +msgstr "PiSCSI 创建驱动器" -#: src/web.py:323 -#, fuzzy +#: src/web.py:320 msgid "PiSCSI File Upload" -msgstr "将文件拖放到此处以上传" +msgstr "PiSCSI 文件上传" #: src/web.py:346 #, python-format @@ -166,57 +169,57 @@ msgstr "驱动器 %(drive_name)s 中没有属性数据" msgid "Image file with properties created: %(file_name)s" msgstr "已创建含属性的映像文件:%(file_name)s" -#: src/web.py:521 +#: src/web.py:522 msgid "PiSCSI Image Info" -msgstr "" +msgstr "PiSCSI 映像信息" -#: src/web.py:528 +#: src/web.py:529 #, python-format msgid "An error occurred when getting disk info: %(error)s" msgstr "获取磁盘信息时产生错误:%(error)s" -#: src/web.py:542 +#: src/web.py:543 #, python-format msgid "%(app)s is not a recognized PiSCSI app" msgstr "%(app)s不是可识别的 PiSCSI 应用程序" -#: src/web.py:569 +#: src/web.py:570 msgid "PiSCSI Manual" -msgstr "" +msgstr "PiSCSI 手册" -#: src/web.py:576 +#: src/web.py:577 #, python-format msgid "An error occurred when accessing manual page: %(error)s" msgstr "获取帮助页面时产生错误:%(error)s" -#: src/web.py:592 +#: src/web.py:593 msgid "PiSCSI System Logs" -msgstr "" +msgstr "PiSCSI 系统日志" -#: src/web.py:600 +#: src/web.py:601 #, python-format msgid "An error occurred when fetching logs: %(error)s" msgstr "获取日志时产生错误:%(error)s" -#: src/web.py:614 +#: src/web.py:615 #, python-format msgid "Log level set to %(value)s" msgstr "日志级别设置为 %(value)s" -#: src/web.py:631 src/web.py:694 +#: src/web.py:632 src/web.py:695 msgid "No SCSI ID specified" msgstr "未指定 SCSI ID" -#: src/web.py:672 +#: src/web.py:673 #, python-format msgid "Attached %(device_type)s to SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "已将 %(device_type)s 加载到 SCSI ID %(id_number)s 的LUN %(unit_number)s" -#: src/web.py:696 +#: src/web.py:697 msgid "No image file to insert" msgstr "没有要插入的图像文件" -#: src/web.py:736 +#: src/web.py:737 #, python-format msgid "" "Attached %(file_name)s as %(device_type)s to SCSI ID %(id_number)s LUN " @@ -225,303 +228,295 @@ msgstr "" "将%(file_name)s作为%(device_type)s附加到 SCSI ID %(id_number)s LUN " "%(unit_number)s" -#: src/web.py:753 +#: src/web.py:754 msgid "Detached all SCSI devices" msgstr "已断开所有 SCSI 设备" -#: src/web.py:769 +#: src/web.py:770 #, python-format msgid "Detached SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "断开 SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:791 +#: src/web.py:792 #, python-format msgid "Ejected SCSI ID %(id_number)s LUN %(unit_number)s" msgstr "已弹出 SCSI ID %(id_number)s LUN %(unit_number)s" -#: src/web.py:810 +#: src/web.py:811 msgid "PiSCSI Device Info" -msgstr "" +msgstr "PiSCSI 设备信息" -#: src/web.py:814 +#: src/web.py:815 msgid "No devices attached" msgstr "没有连接任何设备" -#: src/web.py:830 +#: src/web.py:831 #, python-format msgid "Reserved SCSI ID %(id_number)s" msgstr "保留的 SCSI ID %(id_number)s" -#: src/web.py:848 +#: src/web.py:849 #, python-format msgid "Released the reservation for SCSI ID %(id_number)s" msgstr "释放了对 SCSI ID %(id_number)s 的预留" -#: src/web.py:867 +#: src/web.py:868 #, python-format msgid "System name changed to '%(name)s'." msgstr "系统名称更改为 %(name)s." -#: src/web.py:868 +#: src/web.py:869 msgid "System name reset to default." msgstr "系统名称重置为默认值." -#: src/web.py:870 +#: src/web.py:871 msgid "Failed to change system name." msgstr "更改系统名称失败." -#: src/web.py:924 +#: src/web.py:925 #, python-format msgid "%(iso_type)s is not a valid CD-ROM format." msgstr "%(iso_type)s 不是有效的 CD-ROM 格式." -#: src/web.py:939 +#: src/web.py:940 #, python-format msgid "The following error occurred when creating the CD-ROM image: %(error)s" msgstr "创建光盘镜像时出现如下错误:%(error)s" -#: src/web.py:946 +#: src/web.py:947 #, python-format msgid "CD-ROM image %(file_name)s with type %(iso_type)s was created." msgstr "创建了类型为 %(iso_type)s 的 CD-ROM 映像%(file_name)s。" -#: src/web.py:974 +#: src/web.py:977 src/web.py:1021 +msgid "Unknown destination" +msgstr "文件存放目的位置未知" + +#: src/web.py:986 #, python-format msgid "The following error occurred when downloading: %(error)s" msgstr "下载时产生以下错误:%(error)s" -#: src/web.py:1045 src/web.py:1058 +#: src/web.py:1065 src/web.py:1078 #, python-format msgid "%(drive_format)s is not a valid hard disk format." msgstr "%(drive_format)s 不是有效的硬盘格式。" -#: src/web.py:1103 +#: src/web.py:1123 #, python-format msgid "Image file with properties created: %(file_name)s%(drive_format)s" msgstr "已创建带属性的映像文件:%(file_name)s%(drive_format)s" -#: src/web.py:1113 +#: src/web.py:1133 #, python-format msgid "Image file created: %(file_name)s%(drive_format)s" msgstr "已创建映像文件:%(file_name)s%(drive_format)s" -#: src/web.py:1174 +#: src/web.py:1194 #, python-format msgid "Image file with properties deleted: %(file_name)s" msgstr "已删除带属性的映像文件:%(file_name)s" -#: src/web.py:1183 +#: src/web.py:1203 #, python-format msgid "Image file deleted: %(file_name)s" msgstr "映像文件已删除:%(file_name)s" -#: src/web.py:1221 +#: src/web.py:1241 #, python-format msgid "Image file with properties renamed to: %(file_name)s" msgstr "带属性的映像文件已重命名为:%(file_name)s" -#: src/web.py:1230 +#: src/web.py:1250 #, python-format msgid "Image file renamed to: %(file_name)s" msgstr "映像文件重命名为:%(file_name)s" -#: src/web.py:1268 +#: src/web.py:1288 #, python-format msgid "Copy of image file with properties saved as: %(file_name)s" msgstr "已保存带属性映像文件的拷贝:%(file_name)s" -#: src/web.py:1277 +#: src/web.py:1297 #, python-format msgid "Copy of image file saved as: %(file_name)s" msgstr "已保存映像文件的拷贝:%(file_name)s" -#: src/web.py:1330 +#: src/web.py:1350 #, python-format msgid "Changed Web Interface language to %(locale)s" msgstr "Web 界面语言已更改为 %(locale)s" -#: src/web.py:1341 +#: src/web.py:1361 msgid "The requested theme does not exist." msgstr "请求的主题不存在." -#: src/web.py:1344 +#: src/web.py:1364 #, python-format msgid "Theme changed to '%(theme)s'." msgstr "主题更改为 '%(theme)s'." -#: src/web_utils.py:98 +#: src/web_utils.py:112 msgid "Hard Disk Drive" msgstr "硬盘" -#: src/web_utils.py:100 +#: src/web_utils.py:114 msgid "Removable Disk Drive" msgstr "可移动磁盘" -#: src/web_utils.py:102 +#: src/web_utils.py:116 msgid "Magneto-Optical Drive" msgstr "磁光驱" -#: src/web_utils.py:104 +#: src/web_utils.py:118 msgid "CD/DVD Drive" msgstr "光驱" -#: src/web_utils.py:106 +#: src/web_utils.py:120 msgid "Host Bridge" msgstr "主机桥" -#: src/web_utils.py:108 +#: src/web_utils.py:122 msgid "Ethernet Adapter" msgstr "以太网适配器" -#: src/web_utils.py:110 +#: src/web_utils.py:124 msgid "Printer" msgstr "打印机" -#: src/web_utils.py:112 +#: src/web_utils.py:126 msgid "Host Services" msgstr "主机服务" -#: src/web_utils.py:135 +#: src/web_utils.py:149 msgid "Hard Disk Image (Generic)" msgstr "硬盘映像(通用)" -#: src/web_utils.py:137 +#: src/web_utils.py:151 msgid "Hard Disk Image (Apple)" msgstr "硬盘映像(Apple)" -#: src/web_utils.py:139 +#: src/web_utils.py:153 msgid "Hard Disk Image (NEC)" msgstr "硬盘映像(NEC)" -#: src/web_utils.py:141 +#: src/web_utils.py:155 msgid "Hard Disk Image (SCSI-1)" msgstr "硬盘映像 (SCSI-1)" -#: src/web_utils.py:143 +#: src/web_utils.py:157 msgid "Removable Disk Image" msgstr "可移动磁盘映像" -#: src/web_utils.py:145 +#: src/web_utils.py:159 msgid "Magneto-Optical Disk Image" msgstr "磁光盘图像" -#: src/web_utils.py:219 +#: src/web_utils.py:260 msgid "You must log in to use this function" msgstr "您必须登录才能使用此功能" -#: src/web_utils.py:233 +#: src/web_utils.py:274 #, python-format msgid "Configure the network bridge for %(interface)s first: " -msgstr "请首先为界面 %(interface)s 配置网桥:" +msgstr "请首先为界面 %(interface)s 配置网桥: " -#: src/web_utils.py:262 +#: src/web_utils.py:303 #, python-format -msgid "%(file_name)s is not a valid path" -msgstr "%(file_name)s 不是有效路径" +msgid "No permission to use path '%(file_name)s'" +msgstr "无权使用路径“%(file_name)s”" -#: src/web_utils.py:283 +#: src/web_utils.py:324 msgid "The file already exists!" msgstr "文件已经存在!" -#: src/web_utils.py:291 +#: src/web_utils.py:332 msgid "Unable to write the file to disk!" msgstr "无法将文件写入磁盘!" -#: src/web_utils.py:299 +#: src/web_utils.py:340 msgid "Transferred file corrupted!" msgstr "传输的文件已损坏!" -#: src/web_utils.py:301 +#: src/web_utils.py:342 msgid "File upload successful!" msgstr "文件上传成功!" -#: src/templates/base.html:29 -msgid "" -" This process may take a while, and will continue in the background if you " -"navigate away from this page." -msgstr "该操作需时稍久,将在后台自动进行。您现在可以转向其他页面。" - -#: src/templates/base.html:34 -msgid "" -" The Web Interface will become unresponsive momentarily. Reload this page after " -"the Pi has started up again." -msgstr " Web界面将暂时停止响应。 请在树莓派启动后重新加载此页面。" - -#: src/templates/base.html:47 +#: src/templates/base.html:33 #, python-format msgid "Logged in as %(username)s" msgstr "以%(username)s的身份登录" -#: src/templates/base.html:49 +#: src/templates/base.html:35 msgid "Log Out" msgstr "注销" -#: src/templates/base.html:54 +#: src/templates/base.html:40 msgid "Log in to use Web Interface" msgstr "请登录后再使用 Web 界面" -#: src/templates/base.html:56 +#: src/templates/base.html:42 msgid "Username:" msgstr "用户名:" -#: src/templates/base.html:60 +#: src/templates/base.html:46 msgid "Password:" msgstr "密码:" -#: src/templates/base.html:69 +#: src/templates/base.html:55 msgid "Web Interface Authentication Disabled" msgstr "Web 界面身份验证已禁用" -#: src/templates/base.html:71 +#: src/templates/base.html:57 #, python-format msgid "See Wiki for more information" msgstr "查看Wiki以了解更多信息" -#: src/templates/base.html:78 +#: src/templates/base.html:64 msgid "PiSCSI" msgstr "PiSCSI" -#: src/templates/base.html:79 +#: src/templates/base.html:65 msgid "Control Page" msgstr "控制页面" -#: src/templates/base.html:85 src/templates/index.html:707 +#: src/templates/base.html:71 src/templates/index.html:754 msgid "System Name:" msgstr "系统名:" -#: src/templates/base.html:112 src/templates/base.html:114 +#: src/templates/base.html:98 src/templates/base.html:100 #, python-format msgid "Switch to the %(theme)s theme" msgstr "切换到 %(theme)s 主题" -#: src/templates/base.html:120 +#: src/templates/base.html:106 msgid "The AppleShare server is running. No active connections." msgstr "AppleShare 服务器正在运行。没有活动连接。" -#: src/templates/base.html:123 +#: src/templates/base.html:109 #, python-format msgid "%(value)d active AFP connection" msgstr "%(value)d 个活动的 AFP 连接" -#: src/templates/base.html:125 +#: src/templates/base.html:111 #, python-format msgid "%(value)d active AFP connections" msgstr "%(value)d 个活动的 AFP 连接" -#: src/templates/base.html:130 +#: src/templates/base.html:116 #, python-format msgid "Macproxy is running at %(ip_addr)s (default port 5000)" msgstr "Macproxy 正在 %(ip_addr)s(默认端口 5000)上运行" -#: src/templates/base.html:134 -msgid "PiSCSI version:" -msgstr "PiSCSI 版本:" +#: src/templates/base.html:120 +msgid "PiSCSI software version:" +msgstr "PiSCSI 软件版本:" -#: src/templates/base.html:137 +#: src/templates/base.html:123 msgid "Hardware and OS:" msgstr "硬件和操作系统:" -#: src/templates/base.html:140 +#: src/templates/base.html:126 msgid "Network Address:" msgstr "网络地址:" @@ -533,12 +528,12 @@ msgstr "已加载设备的详细信息" msgid "SCSI ID" msgstr "SCSI ID" -#: src/templates/deviceinfo.html:13 src/templates/index.html:51 -#: src/templates/index.html:303 src/templates/index.html:613 +#: src/templates/deviceinfo.html:13 src/templates/index.html:63 +#: src/templates/index.html:321 src/templates/index.html:660 msgid "LUN" msgstr "LUN" -#: src/templates/deviceinfo.html:17 src/templates/index.html:309 +#: src/templates/deviceinfo.html:17 src/templates/index.html:327 msgid "Type" msgstr "类型" @@ -546,11 +541,11 @@ msgstr "类型" msgid "Status" msgstr "状态" -#: src/templates/deviceinfo.html:25 src/templates/index.html:203 +#: src/templates/deviceinfo.html:25 src/templates/index.html:228 msgid "File" msgstr "文件" -#: src/templates/deviceinfo.html:29 src/templates/index.html:54 +#: src/templates/deviceinfo.html:29 src/templates/index.html:66 msgid "Parameters" msgstr "参数" @@ -558,7 +553,7 @@ msgstr "参数" msgid "Vendor" msgstr "供应商" -#: src/templates/deviceinfo.html:37 src/templates/index.html:55 +#: src/templates/deviceinfo.html:37 src/templates/index.html:67 msgid "Product" msgstr "产品" @@ -631,8 +626,8 @@ msgid "Save as:" msgstr "另存为:" #: src/templates/drives.html:32 src/templates/drives.html:72 -#: src/templates/drives.html:107 src/templates/index.html:422 -#: src/templates/index.html:454 src/templates/index.html:514 +#: src/templates/drives.html:107 src/templates/index.html:469 +#: src/templates/index.html:501 src/templates/index.html:561 msgid "Create" msgstr "创建" @@ -659,127 +654,139 @@ msgstr "可移动磁盘" msgid "%(disk_space)s MiB disk space remaining on the Pi" msgstr "在 Pi 上剩余%(disk_space)s MB 磁盘空间" -#: src/templates/index.html:7 +#: src/templates/index.html:6 +msgid "" +" This process may take a while, and will continue in the background if you " +"navigate away from this page." +msgstr " 该操作需时稍久,将在后台自动进行。您现在可以转向其他页面。" + +#: src/templates/index.html:11 +msgid "" +" The Web Interface will become unresponsive momentarily. Reload this page after " +"the Pi has started up again." +msgstr " Web界面将暂时停止响应。 请在树莓派启动后重新加载此页面。" + +#: src/templates/index.html:19 msgid "Current PiSCSI Configuration" msgstr "当前的 PiSCSI 配置" -#: src/templates/index.html:10 +#: src/templates/index.html:22 #, python-format msgid "" "Save and load device configurations, stored as json files in " "%(config_dir)s" msgstr "保存和加载设备配置,在 %(config_dir)s 目录下存储为 json 文件" -#: src/templates/index.html:11 +#: src/templates/index.html:23 msgid "" "To have a particular device configuration load when PiSCSI starts, save it as " "default." msgstr "若需在 PiSCSI 启动时加载特定的设备配置,请将其保存为default." -#: src/templates/index.html:17 src/templates/index.html:39 -#: src/templates/index.html:473 +#: src/templates/index.html:29 src/templates/index.html:51 +#: src/templates/index.html:520 msgid "File Name:" msgstr "文件名:" -#: src/templates/index.html:27 +#: src/templates/index.html:39 msgid "No saved configurations" msgstr "没有保存的配置" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Load" msgstr "加载" -#: src/templates/index.html:31 +#: src/templates/index.html:43 msgid "Detach all current device and Load configuration?" msgstr "断开所有当前设备和加载配置?" -#: src/templates/index.html:32 src/templates/index.html:338 +#: src/templates/index.html:44 src/templates/index.html:356 msgid "Delete" msgstr "删除" -#: src/templates/index.html:32 +#: src/templates/index.html:44 msgid "Delete configuration file?" msgstr "删除配置文件?" -#: src/templates/index.html:33 src/templates/index.html:376 +#: src/templates/index.html:45 src/templates/index.html:415 msgid "Download" msgstr "下载" -#: src/templates/index.html:42 +#: src/templates/index.html:54 msgid "Save" msgstr "保存" -#: src/templates/index.html:49 src/templates/index.html:295 -#: src/templates/index.html:605 +#: src/templates/index.html:61 src/templates/index.html:313 +#: src/templates/index.html:652 msgid "ID" msgstr "ID" -#: src/templates/index.html:53 src/templates/index.html:545 +#: src/templates/index.html:65 src/templates/index.html:592 msgid "Device" msgstr "设备" -#: src/templates/index.html:56 src/templates/index.html:205 +#: src/templates/index.html:68 src/templates/index.html:230 msgid "Actions" msgstr "操作" -#: src/templates/index.html:79 +#: src/templates/index.html:91 msgid "File name" msgstr "文件名" -#: src/templates/index.html:97 src/templates/index.html:323 -#: src/templates/index.html:615 +#: src/templates/index.html:109 src/templates/index.html:341 +#: src/templates/index.html:662 msgid "Attach" msgstr "挂载" -#: src/templates/index.html:127 +#: src/templates/index.html:139 msgid "Eject Disk? WARNING: On Mac OS, eject the Disk in the Finder instead!" msgstr "弹出磁盘? 警告:如果是您使用的是Mac OS,请在 Finder 中弹出磁盘!" -#: src/templates/index.html:130 +#: src/templates/index.html:142 msgid "Eject" msgstr "弹出" -#: src/templates/index.html:133 +#: src/templates/index.html:145 msgid "Detach Device?" msgstr "断开设备?" -#: src/templates/index.html:136 +#: src/templates/index.html:148 msgid "Detach" msgstr "断开" -#: src/templates/index.html:139 +#: src/templates/index.html:151 msgid "Enter a memo for this reservation" msgstr "为此预订输入备注" -#: src/templates/index.html:142 +#: src/templates/index.html:154 msgid "Reserve" msgstr "预订" -#: src/templates/index.html:151 +#: src/templates/index.html:163 msgid "Reserved ID" msgstr "预订 ID" -#: src/templates/index.html:157 +#: src/templates/index.html:169 msgid "Release" msgstr "释放" -#: src/templates/index.html:167 +#: src/templates/index.html:179 msgid "Detach all SCSI Devices?" msgstr "断开所有 SCSI 设备?" -#: src/templates/index.html:168 +#: src/templates/index.html:180 msgid "Detach All Devices" msgstr "断开所有设备" -#: src/templates/index.html:171 +#: src/templates/index.html:183 msgid "Show Device Info" msgstr "显示设备信息" -#: src/templates/index.html:181 +#: src/templates/index.html:193 msgid "Image File Management" msgstr "映像文件管理" -#: src/templates/index.html:184 +#: src/templates/index.html:196 #, python-format msgid "" "Manage image files in the active PiSCSI image directory: %(directory)s " @@ -788,7 +795,7 @@ msgstr "" "管理PiSCSI映像目录中的活动映像文件:%(directory)s,扫描深度为 " "%(scan_depth)s。" -#: src/templates/index.html:185 +#: src/templates/index.html:197 #, python-format msgid "" "Select a valid SCSI ID and LUN to " @@ -797,157 +804,160 @@ msgstr "" "选择一个有效的 SCSI ID 和要加载的 LUN。如果不确定,请使" "用 LUN 0。" -#: src/templates/index.html:188 +#: src/templates/index.html:200 msgid "Recognized image file types:" msgstr "识别的图像文件类型:" -#: src/templates/index.html:193 +#: src/templates/index.html:205 msgid "Recognized archive file types:" msgstr "识别到的存档文件类型:" -#: src/templates/index.html:204 -msgid "Size" -msgstr "大小" - -#: src/templates/index.html:210 +#: src/templates/index.html:214 msgid "The images directory is currently empty." msgstr "图片目录当前为空。" -#: src/templates/index.html:228 +#: src/templates/index.html:229 +msgid "Size" +msgstr "大小" + +#: src/templates/index.html:246 msgid "Properties File" msgstr "属性文件" -#: src/templates/index.html:250 src/templates/index.html:262 -#: src/templates/index.html:289 +#: src/templates/index.html:268 src/templates/index.html:280 +#: src/templates/index.html:307 msgid "Extract" msgstr "解压" -#: src/templates/index.html:250 src/templates/index.html:262 +#: src/templates/index.html:268 src/templates/index.html:280 msgid "Extracting a single file..." msgstr "解压单个文件..." -#: src/templates/index.html:277 src/templates/index.html:484 -#: src/templates/upload.html:50 +#: src/templates/index.html:295 src/templates/index.html:531 +#: src/templates/upload.html:68 msgid "MiB" msgstr "MiB" -#: src/templates/index.html:282 +#: src/templates/index.html:300 msgid "In use" msgstr "正在使用" -#: src/templates/index.html:289 +#: src/templates/index.html:307 msgid "Extracting all files..." msgstr "正在解压所有文件..." -#: src/templates/index.html:312 +#: src/templates/index.html:330 msgid "Unknown" msgstr "未知" -#: src/templates/index.html:326 +#: src/templates/index.html:344 #, python-format msgid "Enter new file name for: %(file_name)s" msgstr "为 %(file_name)s 输入新文件名:" -#: src/templates/index.html:329 src/templates/index.html:709 +#: src/templates/index.html:347 src/templates/index.html:756 msgid "Rename" msgstr "重命名" -#: src/templates/index.html:331 +#: src/templates/index.html:349 #, python-format msgid "Save copy of %(file_name)s as:" msgstr "将文件 %(file_name)s 的副本保存为:" -#: src/templates/index.html:334 +#: src/templates/index.html:352 msgid "Copy" msgstr "复制" -#: src/templates/index.html:336 +#: src/templates/index.html:354 #, python-format msgid "Delete file: %(file_name)s?" msgstr "删除文件:%(file_name)s?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "?" msgstr "?" -#: src/templates/index.html:344 +#: src/templates/index.html:362 msgid "Info" msgstr "信息" -#: src/templates/index.html:352 +#: src/templates/index.html:374 #, python-format msgid "%(disk_space)s MiB disk space remaining on the system" msgstr "系统剩余磁盘空间为%(disk_space)s MB" -#: src/templates/index.html:360 +#: src/templates/index.html:382 msgid "Transfer Files to the PiSCSI" msgstr "将文件传输至PiSCSI" -#: src/templates/index.html:363 src/templates/index.html:373 -#: src/templates/upload.html:8 src/templates/upload.html:16 +#: src/templates/index.html:385 src/templates/index.html:398 +#: src/templates/upload.html:8 src/templates/upload.html:18 msgid "Disk Images" msgstr "磁盘映像" -#: src/templates/index.html:364 src/templates/index.html:375 -#: src/templates/upload.html:9 src/templates/upload.html:18 +#: src/templates/index.html:387 src/templates/index.html:407 +#: src/templates/upload.html:10 src/templates/upload.html:27 msgid "Shared Files" -msgstr "" +msgstr "文件共享" -#: src/templates/index.html:365 +#: src/templates/index.html:389 msgid "" -"To access shared files remotely, you may have to install one of the file " -"servers first." -msgstr "要远程访问共享文件,您必须首先安装一个文件服务器。" +"Install a file server and create the shared files directory in order to share " +"files between the Pi and your vintage computers." +msgstr "安装文件服务器并创建共享文件目录,以便在Pi和老式计算机之间共享文件。" -#: src/templates/index.html:370 src/templates/index.html:399 +#: src/templates/index.html:395 src/templates/index.html:446 msgid "Download file from URL:" msgstr "从网址下载文件:" -#: src/templates/index.html:376 +#: src/templates/index.html:415 msgid "Downloading File..." msgstr "正在下载文件..." -#: src/templates/index.html:381 +#: src/templates/index.html:420 msgid "Upload Files (new tab)" -msgstr "" +msgstr "上传文件(新选项卡)" -#: src/templates/index.html:389 +#: src/templates/index.html:427 src/templates/upload.html:77 +msgid "The file uploading functionality requires JavaScript." +msgstr "文件上传功能需要 JavaScript。" + +#: src/templates/index.html:436 msgid "Create CD-ROM Image" -msgstr "" +msgstr "创建光盘映像" -#: src/templates/index.html:392 +#: src/templates/index.html:439 msgid "HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX." msgstr "HFS 适用于 Mac OS,Joliet 适用于 Windows,Rock Ridge 适用于 POSIX。" -#: src/templates/index.html:393 +#: src/templates/index.html:440 msgid "" "If the downloaded file is a zip archive, we will attempt to unzip it and store " "the resulting files." msgstr "如果下载的文件是 zip 存档,我们将尝试解压缩它并存储生成的文件。" -#: src/templates/index.html:401 src/templates/index.html:433 -#: src/templates/index.html:475 +#: src/templates/index.html:448 src/templates/index.html:480 +#: src/templates/index.html:522 msgid "Type:" msgstr "类型:" -#: src/templates/index.html:422 +#: src/templates/index.html:469 msgid "Downloading file and generating CD-ROM image..." msgstr "正在下载文件并生成光盘映像..." -#: src/templates/index.html:427 +#: src/templates/index.html:474 msgid "Use local file:" -msgstr "" +msgstr "使用本地文件:" -#: src/templates/index.html:454 +#: src/templates/index.html:501 msgid "Generating CD-ROM image..." -msgstr "" +msgstr "正在生成光盘映像..." -#: src/templates/index.html:464 -#, fuzzy +#: src/templates/index.html:511 msgid "Create Empty Disk Image" msgstr "创建空磁盘映像文件" -#: src/templates/index.html:467 +#: src/templates/index.html:514 #, python-format msgid "" "Please refer to wiki documentation to " @@ -956,49 +966,49 @@ msgstr "" "请查看wiki文档了解关于支持的映像文件类" "型。" -#: src/templates/index.html:468 +#: src/templates/index.html:515 msgid "" "It is not recommended to use the Lido hard disk driver with the Macintosh Plus." msgstr "不建议在Macintosh Plus上使用Lido硬盘驱动。" -#: src/templates/index.html:483 +#: src/templates/index.html:530 msgid "Size:" msgstr "大小:" -#: src/templates/index.html:485 src/templates/index.html:577 +#: src/templates/index.html:532 src/templates/index.html:624 msgid "Masquerade as:" msgstr "伪装为:" -#: src/templates/index.html:488 src/templates/index.html:499 -#: src/templates/index.html:580 +#: src/templates/index.html:535 src/templates/index.html:546 +#: src/templates/index.html:627 msgid "None" msgstr "空" -#: src/templates/index.html:496 +#: src/templates/index.html:543 msgid "Format as:" msgstr "格式为:" -#: src/templates/index.html:519 +#: src/templates/index.html:566 msgid "Create Disk Image With Properties" msgstr "创建带属性的磁盘映像" -#: src/templates/index.html:528 +#: src/templates/index.html:575 msgid "Attach Peripheral Device" msgstr "连接外围设备" -#: src/templates/index.html:533 +#: src/templates/index.html:580 msgid "" "The piscsi_bridge network bridge is active and ready to be used by an " "emulated network adapter!" msgstr "piscsi_bridge 网桥处于活动状态,可供虚拟网络适配器使用!" -#: src/templates/index.html:535 +#: src/templates/index.html:582 msgid "" "Please configure the piscsi_bridge network bridge before attaching an " "emulated network adapter!" msgstr "在连接虚拟网络适配器前,请配置 piscsi_bridge 网桥!" -#: src/templates/index.html:537 +#: src/templates/index.html:584 #, python-format msgid "" "To browse the modern web, install a vintage web proxy such as Macproxy。" -#: src/templates/index.html:539 +#: src/templates/index.html:586 #, python-format msgid "" "Read more about supported device types支持的设备类型了解更多信" "息。" -#: src/templates/index.html:546 +#: src/templates/index.html:593 msgid "Key" msgstr "秘钥" -#: src/templates/index.html:547 +#: src/templates/index.html:594 msgid "Parameters and Actions" msgstr "参数和操作" -#: src/templates/index.html:627 +#: src/templates/index.html:674 msgid "Logging" msgstr "日志记录" -#: src/templates/index.html:630 +#: src/templates/index.html:677 msgid "The current dropdown selection indicates the active log level." msgstr "当前的下拉选择表示活动日志级别。" -#: src/templates/index.html:636 +#: src/templates/index.html:683 msgid "Log Lines:" msgstr "日志行:" -#: src/templates/index.html:638 +#: src/templates/index.html:685 msgid "Scope:" msgstr "范围:" -#: src/templates/index.html:641 +#: src/templates/index.html:688 msgid "All logs" msgstr "所有日志" -#: src/templates/index.html:656 +#: src/templates/index.html:703 msgid "Show Logs" msgstr "显示日志" -#: src/templates/index.html:662 +#: src/templates/index.html:709 msgid "Log Level:" msgstr "日志级别:" -#: src/templates/index.html:670 +#: src/templates/index.html:717 msgid "Set Log Level" msgstr "设置日志级别" -#: src/templates/index.html:680 +#: src/templates/index.html:727 msgid "System Operations" msgstr "系统操作" -#: src/templates/index.html:683 +#: src/templates/index.html:730 msgid "" "The System Name is the \"pretty\" hostname if set, with a fallback to the " "regular hostname." msgstr "如果您没有设置一个“好听”的主机名,则系统会自动返回到其“常规”的主机名。" -#: src/templates/index.html:684 +#: src/templates/index.html:731 msgid "" "IMPORTANT: Always shut down the system before turning off the power. Failing to " "do so may lead to data loss." msgstr "重要提示:务必在切断电源之前先关闭系统,否则可能会导致数据丢失。" -#: src/templates/index.html:690 +#: src/templates/index.html:737 msgid "Language:" msgstr "语言:" -#: src/templates/index.html:702 +#: src/templates/index.html:749 msgid "Change Language" msgstr "改变语言" -#: src/templates/index.html:713 +#: src/templates/index.html:760 msgid "Reset" msgstr "重置" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Reboot the System?" msgstr "重启系统?" -#: src/templates/index.html:717 +#: src/templates/index.html:764 msgid "Rebooting the system..." msgstr "正在重启系统..." -#: src/templates/index.html:718 +#: src/templates/index.html:765 msgid "Reboot System" msgstr "重启系统" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shut Down the System?" msgstr "关闭系统?" -#: src/templates/index.html:720 +#: src/templates/index.html:767 msgid "Shutting down the system..." msgstr "正在关闭系统..." -#: src/templates/index.html:721 +#: src/templates/index.html:768 msgid "Shut Down System" msgstr "关闭系统" -#: src/templates/index.html:729 +#: src/templates/index.html:776 msgid "Read the PiSCSI Manual" msgstr "阅读 PiSCSI 手册" @@ -1141,96 +1151,71 @@ msgid "" "cancelling the upload or closing this page." msgstr "取消上传或关闭此页面." -#: src/templates/upload.html:10 src/templates/upload.html:20 +#: src/templates/upload.html:12 src/templates/upload.html:36 msgid "PiSCSI Config" -msgstr "" +msgstr "PiSCSI 配置" -#: src/templates/upload.html:13 +#: src/templates/upload.html:15 msgid "Destination" msgstr "文件存放位置" -#: src/templates/upload.html:36 +#: src/templates/upload.html:54 msgid "Drop files here to upload" msgstr "将文件拖放到此处以上传" -#: src/templates/upload.html:37 +#: src/templates/upload.html:55 msgid "Your browser does not support drag'n'drop file uploads." msgstr "您的浏览器不支持拖放文件上传。" -#: src/templates/upload.html:38 +#: src/templates/upload.html:56 msgid "" "Please use the fallback form below to upload your files like in the olden days." msgstr "请和老时候一样使用下面的后备表格上传您的文件。" -#: src/templates/upload.html:39 +#: src/templates/upload.html:57 msgid "File is too big: {{filesize}}MiB. Max filesize: {{maxFilesize}}MiB." msgstr "文件太大:{{filesize}}MiB。最大可允许的大小为:{{maxFilesize}}MiB。" -#: src/templates/upload.html:40 +#: src/templates/upload.html:58 msgid "You can't upload files of this type." msgstr "您不能上传这种类型的文件。" -#: src/templates/upload.html:41 +#: src/templates/upload.html:59 msgid "Server responded with code: {{statusCode}}" msgstr "服务器响应代码:{{statusCode}}" -#: src/templates/upload.html:42 +#: src/templates/upload.html:60 msgid "Cancel upload" msgstr "取消上传" -#: src/templates/upload.html:43 +#: src/templates/upload.html:61 msgid "Upload canceled." msgstr "上传已取消。" -#: src/templates/upload.html:44 +#: src/templates/upload.html:62 msgid "Are you sure you want to cancel this upload?" msgstr "您确定要取消此上传吗?" -#: src/templates/upload.html:45 +#: src/templates/upload.html:63 msgid "Dismiss" msgstr "取消" -#: src/templates/upload.html:46 +#: src/templates/upload.html:64 msgid "You can not upload any more files." msgstr "您不能再上传任何文件。" -#: src/templates/upload.html:48 +#: src/templates/upload.html:66 msgid "TiB" msgstr "TiB" -#: src/templates/upload.html:49 +#: src/templates/upload.html:67 msgid "GiB" msgstr "GiB" -#: src/templates/upload.html:51 +#: src/templates/upload.html:69 msgid "KiB" msgstr "KiB" -#: src/templates/upload.html:52 +#: src/templates/upload.html:70 msgid "B" msgstr "B" - -#~ msgid "" -#~ "CD-ROM image %(file_name)s with type %(iso_type)s was created and attached " -#~ "to SCSI ID %(id_number)s" -#~ msgstr "" -#~ "已创建类型为 %(iso_type)s 的 CD-ROM 映像 %(file_name)s 并且 加载到 SCSI ID " -#~ "%(id_number)s" - -#~ msgid "Download File and Create CD-ROM Image" -#~ msgstr "下载文件并创建 CD-ROM 映像" - -#~ msgid "" -#~ "Create an ISO file system CD-ROM image with the downloaded file, and mount " -#~ "it on the given SCSI ID." -#~ msgstr "" -#~ "使用下载的文件创建 ISO 文件系统 CD-ROM 映像,并将其加载到给定的 SCSI ID 上。" - -#~ msgid "Download and Mount CD-ROM image" -#~ msgstr "下载并加载 CD-ROM 映像" - -#~ msgid "Language" -#~ msgstr "语言" - -#~ msgid "Change the Web Interface language." -#~ msgstr "更改 Web 界面语言" From ba1d867ad5db22e54f45a308cd5583d75bda3a2c Mon Sep 17 00:00:00 2001 From: Tony Kuker Date: Sat, 22 Apr 2023 19:42:55 -0500 Subject: [PATCH 30/30] Update revision number for release --- cpp/shared/piscsi_version.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/shared/piscsi_version.cpp b/cpp/shared/piscsi_version.cpp index 53bd973b..c24f5958 100644 --- a/cpp/shared/piscsi_version.cpp +++ b/cpp/shared/piscsi_version.cpp @@ -14,8 +14,8 @@ // The following should be updated for each release const int piscsi_major_version = 23; // Last two digits of year -const int piscsi_minor_version = 3; // Month -const int piscsi_patch_version = -1; // Patch number - increment for each update +const int piscsi_minor_version = 4; // Month +const int piscsi_patch_version = 1; // Patch number - increment for each update using namespace std;