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/**" 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) 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/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/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/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/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/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/shared/piscsi_version.cpp b/cpp/shared/piscsi_version.cpp index d6e3c60c..c24f5958 100644 --- a/cpp/shared/piscsi_version.cpp +++ b/cpp/shared/piscsi_version.cpp @@ -14,7 +14,7 @@ // 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_minor_version = 4; // Month const int piscsi_patch_version = 1; // Patch number - increment for each update using namespace std; 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/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/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"); 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/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; 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); } 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 diff --git a/easyinstall.sh b/easyinstall.sh index 2b70994f..33c2fdb6 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" @@ -87,6 +86,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 @@ -705,10 +710,34 @@ 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="2-230201" + NETATALK_VERSION="230302" 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 @@ -723,27 +752,26 @@ 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 + echo + echo "Downloading tarball to $HOME..." + cd $HOME || exit 1 + wget -O "netatalk-2.$NETATALK_VERSION.tar.gz" "https://github.com/rdmark/netatalk-2.x/releases/download/netatalk-2-$NETATALK_VERSION/netatalk-2.$NETATALK_VERSION.tar.gz" - - - - @@ -131,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"] }} diff --git a/python/web/src/templates/index.html b/python/web/src/templates/index.html index 06adc9b5..b95165a1 100644 --- a/python/web/src/templates/index.html +++ b/python/web/src/templates/index.html @@ -1,6 +1,18 @@ {% extends "base.html" %} {% block content %} + +
@@ -197,6 +209,19 @@
+{% if not files|length: %} +
+ {{ _("The images directory is currently empty.") }} +
+{% else %} + +
+{% for subdir, group in formatted_image_files.items() %} + +
+ + {{ subdir }} + @@ -204,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"] }}
    @@ -232,8 +250,8 @@
-
- +
+ {{ file["name"] }}
    @@ -241,8 +259,8 @@ {% if not member["is_properties_file"] %}
  • {% if member["related_properties_file"] %} -
    - +
    +
    @@ -323,14 +341,14 @@ {% endif %}
    -
    + - +
    -
    + - +
    @@ -349,6 +367,10 @@ {% endfor %}
+
+{% endfor %} +
+{% endif %}

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

@@ -361,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 %}
@@ -371,8 +396,22 @@ + + {% if file_server_dir_exists %} + + {% endif %} @@ -380,6 +419,14 @@

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

+
diff --git a/python/web/src/templates/upload.html b/python/web/src/templates/upload.html index c76aecb0..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 }}
  • @@ -14,12 +16,28 @@
    + + {% if file_server_dir_exists %} + + {% endif %}
    + + + + {% endblock content %} 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" + 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." 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" 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" - 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 界面语言" diff --git a/python/web/src/web.py b/python/web/src/web.py index c0b780a5..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,11 +43,13 @@ 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, get_device_name, map_image_file_descriptions, + format_image_list, format_drive_properties, get_properties_by_drive_name, auth_active, @@ -208,27 +209,15 @@ 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() 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 +255,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"], @@ -278,6 +268,9 @@ 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), + file_server_dir_exists=Path(FILE_SERVER_DIR).exists(), RESERVATIONS=RESERVATIONS, CFG_DIR=CFG_DIR, FILE_SERVER_DIR=FILE_SERVER_DIR, @@ -303,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,10 +312,15 @@ 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, @@ -514,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( @@ -959,11 +960,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,15 +1002,23 @@ def upload_file(): return make_response(auth["msg"], 403) destination = request.form.get("destination") + 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": - 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("Invalid destination", 403) + return make_response(_("Unknown destination"), 403) return upload_with_dropzonejs(destination_dir) @@ -1453,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 c9a42dc4..d085510f 100644 --- a/python/web/src/web_utils.py +++ b/python/web/src/web_utils.py @@ -7,14 +7,28 @@ 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 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. @@ -146,6 +160,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 f"images/{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 +297,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..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,6 +255,7 @@ def test_upload_file(http_client, delete_file): form_data = { "destination": "disk_images", + "images_subdir": "/", "dzuuid": str(uuid.uuid4()), "dzchunkindex": chunk_number, "dzchunksize": chunk_size, @@ -333,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: @@ -346,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, }, ) @@ -357,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