diff --git a/.clang-format b/.clang-format index 61441ef66..238060c55 100644 --- a/.clang-format +++ b/.clang-format @@ -5,7 +5,8 @@ Standard: Cpp11 ColumnLimit: 0 # We want a space between the type and the star for pointer types. -PointerBindsToType: false +DerivePointerAlignment: false +PointerAlignment: Right # We use template< without space. SpaceAfterTemplateKeyword: false @@ -43,20 +44,32 @@ NamespaceIndentation: None # The coding style does not specify the following, but this is what gives # results closest to the existing code. AlignAfterOpenBracket: true -AlwaysBreakTemplateDeclarations: true +BreakTemplateDeclarations: Yes # Ideally we should also allow less short function in a single line, but # clang-format does not handle that. AllowShortFunctionsOnASingleLine: Inline -# The coding style specifies some include order categories, but also tells to -# separate categories with an empty line. It does not specify the order within -# the categories. Since the SortInclude feature of clang-format does not -# re-order includes separated by empty lines, the feature is not used. -SortIncludes: false +# Sort includes and regroup them into consistent blocks: +# 0. self include (the .h matching the .cpp, automatic) +# 1. project includes "" +# 2. Qt includes +# 3. system includes <...> +SortIncludes: CaseSensitive +IncludeBlocks: Regroup +IncludeCategories: + - Regex: "^\"" + Priority: 1 + - Regex: "^> $GITHUB_OUTPUT diff --git a/.github/actions/prepare-release-artifacts/action.yml b/.github/actions/prepare-release-artifacts/action.yml new file mode 100644 index 000000000..cd56f49f0 --- /dev/null +++ b/.github/actions/prepare-release-artifacts/action.yml @@ -0,0 +1,33 @@ +name: Prepare Release Artifacts +description: Download and flatten release artifacts for publishing + +runs: + using: composite + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: List downloaded artifacts + shell: bash + run: | + echo "=== All artifacts downloaded ===" + ls -lR artifacts/ + echo "" + echo "=== Windows artifacts only ===" + ls -l artifacts/windows-*/ + + - name: Flatten artifacts (exclude unsigned Windows installers) + shell: bash + run: | + mkdir -p staging + # Copy all files except those from unsigned Windows artifact directories + find artifacts -type f ! -path "*/windows-*-unsigned-*/*" -exec cp {} staging/ \; + echo "" + echo "=== Files copied to staging ===" + ls -lh staging/ + echo "" + echo "=== Windows installers in staging ===" + ls -lh staging/YACReader*.exe || echo "No Windows installers found" + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bd246f114..b846abfd4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,14 +5,16 @@ on: branches: - master - develop + - yacreader10 pull_request: branches: - master - develop + - yacreader10 env: - IS_ORIGINAL_REPO: ${{ github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') }} - IS_FORK: ${{ github.repository != 'YACReader/yacreader' || (github.ref != 'refs/heads/master' && github.ref != 'refs/heads/develop') }} + IS_ORIGINAL_REPO: ${{ github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') }} + IS_FORK: ${{ github.repository != 'YACReader/yacreader' || (github.ref != 'refs/heads/master' && github.ref != 'refs/heads/develop' && github.ref != 'refs/heads/yacreader10') }} jobs: # Build number generation @@ -38,79 +40,53 @@ jobs: runs-on: macos-latest needs: initialization steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Install dependencies run: brew install clang-format - + + - name: Print clang-format version + run: clang-format --version + - name: Run clang-format run: | find . \( -name '*.h' -or -name '*.cpp' -or -name '*.c' -or -name '*.mm' -or -name '*.m' \) -print0 | xargs -0 clang-format -style=file -i git diff ${{ github.sha }} if [ "$(git diff ${{ github.sha }})" != "" ]; then exit 1; fi - # Linux build (Qt5 with unarr) - linux: - name: Linux (Qt5) - runs-on: ubuntu-22.04 - needs: [initialization, code-format-validation] - steps: - - uses: actions/checkout@v4 - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y qtchooser qtbase5-dev-tools qt5-qmake \ - qtbase5-dev qtmultimedia5-dev libpoppler-qt5-dev qttools5-dev-tools \ - libqt5opengl5-dev libunarr-dev qtdeclarative5-dev libqt5svg5-dev qtquickcontrols2-5-dev - - - name: Create tarball - run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" - ./mktarball.sh $VERSION - mkdir tarball - cp yacreader-*-src.tar.xz* tarball/ - - - name: Build - run: | - export DEFINES_VAR=DEFINES+=\"BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"\" - qmake CONFIG+="unarr" $DEFINES_VAR - make - - - name: Run tests - run: make check TESTARGS="-maxwarnings 100000" - - - name: Upload tarball - uses: actions/upload-artifact@v4 - with: - name: src-${{ needs.initialization.outputs.build_number }}-tarball - path: tarball/* - # Linux Qt6 build linux-qt6: name: Linux (Qt6) runs-on: ubuntu-24.04 needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ - qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev qt6-l10n-tools \ - libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev libpoppler-qt6-dev - + sudo apt-get install -y libunarr-dev libgl-dev libgles2-mesa-dev \ + libfontconfig1-dev libfreetype-dev libxkbcommon-dev libpoppler-qt6-dev \ + libspeechd-dev + + - name: Install Qt + uses: jurplel/install-qt-action@v4 + with: + version: '6.9.3' + modules: 'qt5compat qtmultimedia qtimageformats qtshadertools qtspeech' + cache: true + - name: Build run: | - qtchooser -list-versions - export DEFINES_VAR=DEFINES+=\"BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"\" - qmake6 CONFIG+="unarr" $DEFINES_VAR - qmake6 -v - make - + cmake -B build \ + -DDECOMPRESSION_BACKEND=unarr \ + -DPDF_BACKEND=poppler \ + -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" \ + -DCMAKE_BUILD_TYPE=Release + cmake --build build --parallel 2 + - name: Run tests - run: make check TESTARGS="-maxwarnings 100000" + run: ctest --test-dir build --output-on-failure # Linux Qt6 with 7zip linux-qt6-7zip: @@ -118,28 +94,33 @@ jobs: runs-on: ubuntu-24.04 needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ - qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev qt6-l10n-tools \ - libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev libpoppler-qt6-dev - mkdir -p ${{ github.workspace }}/compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O ${{ github.workspace }}/compressed_archive/7z2301-src.7z - 7z x ${{ github.workspace }}/compressed_archive/7z2301-src.7z -o${{ github.workspace }}/compressed_archive/lib7zip - + sudo apt-get install -y libgl-dev libgles2-mesa-dev \ + libfontconfig1-dev libfreetype-dev libxkbcommon-dev libpoppler-qt6-dev \ + libspeechd-dev + + - name: Install Qt + uses: jurplel/install-qt-action@v4 + with: + version: '6.9.3' + modules: 'qt5compat qtmultimedia qtimageformats qtshadertools qtspeech' + cache: true + - name: Build run: | - qtchooser -list-versions - export DEFINES_VAR=DEFINES+=\"BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"\" - qmake6 CONFIG+="7zip" $DEFINES_VAR - qmake6 -v - make - + cmake -B build \ + -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=poppler \ + -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" \ + -DCMAKE_BUILD_TYPE=Release + cmake --build build --parallel 2 + - name: Run tests - run: make check TESTARGS="-maxwarnings 100000" + run: ctest --test-dir build --output-on-failure # macOS Qt6 Universal build macos-qt6-universal: @@ -147,337 +128,104 @@ jobs: runs-on: macos-15 needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '18' - + - name: Install dependencies run: | pip3 install --break-system-packages aqtinstall - python3 -m aqt install-qt mac desktop 6.9.3 -m qt5compat qtmultimedia qtimageformats qtshadertools + python3 -m aqt install-qt mac desktop 6.9.3 -m qt5compat qtmultimedia qtimageformats qtshadertools qtspeech echo "${{ github.workspace }}/6.9.3/macos/bin" >> $GITHUB_PATH npm install -g appdmg - mkdir -p ${{ github.workspace }}/compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O ${{ github.workspace }}/compressed_archive/7z2301-src.7z - 7z x ${{ github.workspace }}/compressed_archive/7z2301-src.7z -o${{ github.workspace }}/compressed_archive/lib7zip - + - name: Import Code Signing Certificate - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') uses: apple-actions/import-codesign-certs@v2 with: p12-file-base64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }} p12-password: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} - + - name: Build env: MACOSX_DEPLOYMENT_TARGET: "11" run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" + VERSION="$(tr -d '\r\n' < VERSION)" SKIP_CODESIGN="${{ env.IS_FORK }}" SKIP_CODESIGN=$(echo "$SKIP_CODESIGN" | tr '[:upper:]' '[:lower:]') ./compileOSX.sh $VERSION ${{ needs.initialization.outputs.build_number }} $SKIP_CODESIGN Qt6 universal - - - name: Build and run tests - run: | - cd tests - qmake - make check TESTARGS="-maxwarnings 100000" - - - name: Notarize - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - run: | - xcrun notarytool submit *.dmg --apple-id "${{ secrets.MACOS_APPLE_ID }}" --team-id "${{ secrets.MACOS_TEAM_ID }}" --password "${{ secrets.MACOS_APP_PASSWORD }}" --wait - xcrun stapler staple *.dmg - - - name: Upload DMG - uses: actions/upload-artifact@v4 - with: - name: macos-qt6-universal-${{ needs.initialization.outputs.build_number }}-dmg - path: "*.dmg" - # macOS Qt5 build - macos: - name: macOS (Qt5) - runs-on: macos-15-intel - needs: [initialization, code-format-validation] - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '18' - - - name: Install dependencies - run: | - brew install qt@5 - brew link qt@5 --force - npm install -g appdmg - mkdir -p ${{ github.workspace }}/compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O ${{ github.workspace }}/compressed_archive/7z2301-src.7z - 7z x ${{ github.workspace }}/compressed_archive/7z2301-src.7z -o${{ github.workspace }}/compressed_archive/lib7zip - - - name: Import Code Signing Certificate - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: apple-actions/import-codesign-certs@v2 - with: - p12-file-base64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }} - p12-password: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} - - - name: Build - env: - MACOSX_DEPLOYMENT_TARGET: "10.13" - run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" - SKIP_CODESIGN="${{ env.IS_FORK }}" - SKIP_CODESIGN=$(echo "$SKIP_CODESIGN" | tr '[:upper:]' '[:lower:]') - ./compileOSX.sh $VERSION ${{ needs.initialization.outputs.build_number }} $SKIP_CODESIGN Qt5 x86_64 - - - name: Build and run tests - run: | - cd tests - qmake - make check TESTARGS="-maxwarnings 100000" - + - name: Run tests + run: ctest --test-dir build --output-on-failure + - name: Notarize - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') run: | xcrun notarytool submit *.dmg --apple-id "${{ secrets.MACOS_APPLE_ID }}" --team-id "${{ secrets.MACOS_TEAM_ID }}" --password "${{ secrets.MACOS_APP_PASSWORD }}" --wait xcrun stapler staple *.dmg - + - name: Upload DMG - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: - name: macos-${{ needs.initialization.outputs.build_number }}-dmg + name: macos-qt6-universal-${{ needs.initialization.outputs.build_number }}-dmg path: "*.dmg" - # Windows x64 Qt5 build - windows-x64: - name: Windows x64 (Qt5) - runs-on: windows-2022 - needs: [initialization, code-format-validation] - steps: - - uses: actions/checkout@v4 - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - architecture: 'x64' - - - name: Install dependencies - shell: cmd - run: | - pip install -U pip - pip install aqtinstall - mkdir C:\Qt - python -m aqt install-qt windows desktop 5.15.2 win64_msvc2019_64 -O c:\Qt - dir C:\Qt\5.15.2\msvc2019_64\bin - choco install -y wget - choco install innosetup - mkdir %GITHUB_WORKSPACE%\compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z - 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip - wget "https://aka.ms/vs/17/release/vc_redist.x64.exe" -O %GITHUB_WORKSPACE%\vc_redist.x64.exe - - - name: Build - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" - set PATH=C:\Qt\5.15.2\msvc2019_64\bin;%PATH% - set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" - qmake CONFIG+="7zip" %DEFINES_VAR% - nmake - - - name: Run tests - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" - set PATH=C:\Qt\5.15.2\msvc2019_64\bin;%PATH% - nmake check TESTARGS="-maxwarnings 100000" - - - name: Upload executables for signing - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 - id: upload_executables - with: - name: windows-x64-executables-unsigned-${{ needs.initialization.outputs.build_number }} - path: | - release64/YACReader.exe - release64/YACReaderLibrary.exe - release64/YACReaderLibraryServer.exe - - - name: Sign executables with SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: signpath/github-action-submit-signing-request@v1 - with: - api-token: ${{ secrets.SIGNPATH_API_TOKEN }} - organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} - project-slug: 'yacreader' - signing-policy-slug: 'release-signing' - artifact-configuration-slug: 'zipped-files' - github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }} - wait-for-completion: true - wait-for-completion-timeout-in-seconds: "7200" - output-artifact-directory: release64/signed - - - name: Replace with signed executables - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - shell: pwsh - run: | - Write-Host "=== Replacing executables with signed versions ===" - Get-ChildItem -Path "release64/signed" -Filter "*.exe" | ForEach-Object { - $destPath = "release64/$($_.Name)" - Write-Host "Moving signed: $($_.Name) -> $destPath" - Move-Item -Path $_.FullName -Destination $destPath -Force - Write-Host " Moved successfully" - } - Remove-Item -Path "release64/signed" -Recurse -Force -ErrorAction SilentlyContinue - Write-Host "Signed executables are ready for installer creation" - - - name: Create installer - shell: cmd - working-directory: ci/win - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" - set PATH=C:\Qt\5.15.2\msvc2019_64\bin;%PATH% - .\create_installer.cmd x64 7z ${{ needs.initialization.outputs.build_number }} qt5 - - - name: Verify installer was created - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - shell: pwsh - run: | - if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { - throw "Installer file was not created" - } - Get-ChildItem "ci/win/Output/YACReader*.exe" - - - name: Upload unsigned installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 - id: upload_unsigned - with: - name: windows-x64-unsigned-${{ needs.initialization.outputs.build_number }} - path: ci/win/Output/YACReader*.exe - - - name: Submit to SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: signpath/github-action-submit-signing-request@v1 - with: - api-token: ${{ secrets.SIGNPATH_API_TOKEN }} - organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} - project-slug: 'yacreader' - signing-policy-slug: 'release-signing' - artifact-configuration-slug: 'zipped-files' - github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }} - wait-for-completion: true - wait-for-completion-timeout-in-seconds: "7200" - output-artifact-directory: ci/win/Output/signed - - - name: Replace with signed installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - shell: pwsh - run: | - Write-Host "=== Files in signed directory before move ===" - Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } - - $signedFiles = Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" - foreach ($signedFile in $signedFiles) { - $destPath = "ci/win/Output/$($signedFile.Name)" - Write-Host "Moving signed: $($signedFile.Name) -> $destPath" - Move-Item -Path $signedFile.FullName -Destination $destPath -Force - Write-Host " Moved successfully" - } - - Write-Host "=== Files in Output directory after move ===" - Get-ChildItem -Path "ci/win/Output" -Filter "*.exe" | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } - - Remove-Item -Path "ci/win/Output/signed" -Recurse -Force -ErrorAction SilentlyContinue - Write-Host "Cleaned up signed directory" - - - name: Upload installer - uses: actions/upload-artifact@v4 - with: - name: windows-x64-${{ needs.initialization.outputs.build_number }} - path: ci/win/Output/YACReader*.exe - # Windows x64 Qt6 build windows-x64-qt6: name: Windows x64 (Qt6) runs-on: windows-2022 needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.10' architecture: 'x64' - + - name: Install dependencies shell: cmd run: | pip install -U pip pip install aqtinstall mkdir C:\Qt - python -m aqt install-qt windows desktop 6.9.3 win64_msvc2022_64 -O c:\Qt -m qt5compat qtmultimedia qtimageformats qtshadertools + python -m aqt install-qt windows desktop 6.9.3 win64_msvc2022_64 -O c:\Qt -m qt5compat qtmultimedia qtimageformats qtshadertools qtspeech dir C:\Qt\6.9.3\msvc2022_64\bin - choco install -y wget - choco install innosetup - mkdir %GITHUB_WORKSPACE%\compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z - 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip - wget "https://aka.ms/vs/17/release/vc_redist.x64.exe" -O %GITHUB_WORKSPACE%\vc_redist.x64.exe - - - name: Check MSVC installations - shell: pwsh - run: | - Write-Host "=== Checking for VS 2019 installation ===" - if (Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\2019") { - Get-ChildItem "C:\Program Files (x86)\Microsoft Visual Studio\2019" -Recurse -Depth 2 - } else { - Write-Host "VS 2019 path does not exist" - } - Write-Host "`n=== Checking VS 2022 MSVC Tools ===" - if (Test-Path "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC") { - Get-ChildItem "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC" - } - Write-Host "`n=== Testing vcvars with -vcvars_ver=14.29 ===" - cmd /c '"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=14.29 && set' | Select-String -Pattern "MSVC|VCTools" - + curl.exe -L --retry 5 --retry-delay 5 --retry-all-errors "https://aka.ms/vs/17/release/vc_redist.x64.exe" -o "%GITHUB_WORKSPACE%\vc_redist.x64.exe" + where iscc + - name: Build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\6.9.3\msvc2022_64\bin;%PATH% - set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" - qmake CONFIG+="7zip" %DEFINES_VAR% - nmake - + cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DDECOMPRESSION_BACKEND=7zip -DPDF_BACKEND=pdfium -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" -DCMAKE_PREFIX_PATH=C:\Qt\6.9.3\msvc2022_64 + cmake --build build --parallel + - name: Run tests shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\6.9.3\msvc2022_64\bin;%PATH% - nmake check TESTARGS="-maxwarnings 100000" - + ctest --test-dir build --output-on-failure + - name: Upload executables for signing - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') + uses: actions/upload-artifact@v6 id: upload_executables with: name: windows-x64-qt6-executables-unsigned-${{ needs.initialization.outputs.build_number }} path: | - release64/YACReader.exe - release64/YACReaderLibrary.exe - release64/YACReaderLibraryServer.exe - + build/bin/YACReader.exe + build/bin/YACReaderLibrary.exe + build/bin/YACReaderLibraryServer.exe + - name: Sign executables with SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} @@ -488,49 +236,49 @@ jobs: github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }} wait-for-completion: true wait-for-completion-timeout-in-seconds: "7200" - output-artifact-directory: release64/signed - + output-artifact-directory: build/bin/signed + - name: Replace with signed executables - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') shell: pwsh run: | Write-Host "=== Replacing executables with signed versions ===" - Get-ChildItem -Path "release64/signed" -Filter "*.exe" | ForEach-Object { - $destPath = "release64/$($_.Name)" + Get-ChildItem -Path "build/bin/signed" -Filter "*.exe" | ForEach-Object { + $destPath = "build/bin/$($_.Name)" Write-Host "Moving signed: $($_.Name) -> $destPath" Move-Item -Path $_.FullName -Destination $destPath -Force Write-Host " Moved successfully" } - Remove-Item -Path "release64/signed" -Recurse -Force -ErrorAction SilentlyContinue + Remove-Item -Path "build/bin/signed" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "Signed executables are ready for installer creation" - + - name: Create installer shell: cmd working-directory: ci/win run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\6.9.3\msvc2022_64\bin;%PATH% - .\create_installer.cmd x64 7z ${{ needs.initialization.outputs.build_number }} qt6 - + .\create_installer.cmd x64 7z ${{ needs.initialization.outputs.build_number }} + - name: Verify installer was created - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') shell: pwsh run: | if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { throw "Installer file was not created" } Get-ChildItem "ci/win/Output/YACReader*.exe" - + - name: Upload unsigned installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') + uses: actions/upload-artifact@v6 id: upload_unsigned with: name: windows-x64-qt6-unsigned-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe - + - name: Submit to SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} @@ -542,14 +290,14 @@ jobs: wait-for-completion: true wait-for-completion-timeout-in-seconds: "7200" output-artifact-directory: ci/win/Output/signed - + - name: Replace with signed installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') shell: pwsh run: | Write-Host "=== Files in signed directory before move ===" Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } - + $signedFiles = Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" foreach ($signedFile in $signedFiles) { $destPath = "ci/win/Output/$($signedFile.Name)" @@ -557,15 +305,15 @@ jobs: Move-Item -Path $signedFile.FullName -Destination $destPath -Force Write-Host " Moved successfully" } - + Write-Host "=== Files in Output directory after move ===" Get-ChildItem -Path "ci/win/Output" -Filter "*.exe" | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } - + Remove-Item -Path "ci/win/Output/signed" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "Cleaned up signed directory" - + - name: Upload installer - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: windows-x64-qt6-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe @@ -576,57 +324,46 @@ jobs: runs-on: windows-2022 needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.10' architecture: 'x64' - + - name: Install dependencies shell: cmd run: | pip install aqtinstall mkdir C:\Qt - python -m aqt install-qt windows desktop 6.9.3 win64_msvc2022_64 -O c:\Qt -m qt5compat qtmultimedia qtimageformats qtshadertools - python -m aqt install-qt windows desktop 6.9.3 win64_msvc2022_arm64_cross_compiled -O c:\Qt -m qt5compat qtmultimedia qtimageformats qtshadertools + python -m aqt install-qt windows desktop 6.9.3 win64_msvc2022_64 -O c:\Qt -m qt5compat qtmultimedia qtimageformats qtshadertools qtspeech + python -m aqt install-qt windows desktop 6.9.3 win64_msvc2022_arm64_cross_compiled -O c:\Qt -m qt5compat qtmultimedia qtimageformats qtshadertools qtspeech dir C:\Qt\6.9.3\msvc2022_arm64\bin - choco install -y wget - choco install innosetup - mkdir %GITHUB_WORKSPACE%\compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z - 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip - wget "https://aka.ms/vs/17/release/vc_redist.arm64.exe" -O %GITHUB_WORKSPACE%\vc_redist.arm64.exe - - - name: Prepare Build - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64_arm64 - set PATH=C:\Qt\6.9.3\msvc2022_arm64\bin;%PATH% - set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" - qmake CONFIG+="7zip" %DEFINES_VAR% - - - name: Build + curl.exe -L --retry 5 --retry-delay 5 --retry-all-errors "https://aka.ms/vs/17/release/vc_redist.arm64.exe" -o "%GITHUB_WORKSPACE%\vc_redist.arm64.exe" + where iscc + + - name: Build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64_arm64 set PATH=C:\Qt\6.9.3\msvc2022_arm64\bin;%PATH% - nmake - + cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DDECOMPRESSION_BACKEND=7zip -DPDF_BACKEND=pdfium -DBUILD_NUMBER="${{ needs.initialization.outputs.build_number }}" -DCMAKE_PREFIX_PATH=C:\Qt\6.9.3\msvc2022_arm64 -DQT_HOST_PATH=C:\Qt\6.9.3\msvc2022_64 -DCMAKE_SYSTEM_PROCESSOR=ARM64 + cmake --build build --parallel + - name: Upload executables for signing - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') + uses: actions/upload-artifact@v6 id: upload_executables with: name: windows-arm64-qt6-executables-unsigned-${{ needs.initialization.outputs.build_number }} path: | - release/YACReader.exe - release/YACReaderLibrary.exe - release/YACReaderLibraryServer.exe - + build/bin/YACReader.exe + build/bin/YACReaderLibrary.exe + build/bin/YACReaderLibraryServer.exe + - name: Submit to SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} @@ -637,44 +374,44 @@ jobs: github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }} wait-for-completion: true wait-for-completion-timeout-in-seconds: "7200" - output-artifact-directory: 'release/signed' - + output-artifact-directory: 'build/bin/signed' + - name: Replace executables with signed versions - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') shell: pwsh run: | - Copy-Item "release/signed/YACReader.exe" "release/YACReader.exe" -Force - Copy-Item "release/signed/YACReaderLibrary.exe" "release/YACReaderLibrary.exe" -Force - Copy-Item "release/signed/YACReaderLibraryServer.exe" "release/YACReaderLibraryServer.exe" -Force - Remove-Item -Path "release/signed" -Recurse -Force -ErrorAction SilentlyContinue + Copy-Item "build/bin/signed/YACReader.exe" "build/bin/YACReader.exe" -Force + Copy-Item "build/bin/signed/YACReaderLibrary.exe" "build/bin/YACReaderLibrary.exe" -Force + Copy-Item "build/bin/signed/YACReaderLibraryServer.exe" "build/bin/YACReaderLibraryServer.exe" -Force + Remove-Item -Path "build/bin/signed" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "Signed executables are ready for installer creation" - + - name: Create installer shell: cmd working-directory: ci/win run: | set PATH=C:\Qt\6.9.3\msvc2022_64\bin;%PATH% - .\create_installer.cmd arm64 7z ${{ needs.initialization.outputs.build_number }} qt6 - + .\create_installer.cmd arm64 7z ${{ needs.initialization.outputs.build_number }} + - name: Verify installer was created - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') shell: pwsh run: | if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { throw "Installer file was not created" } Get-ChildItem "ci/win/Output/YACReader*.exe" - + - name: Upload unsigned installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') + uses: actions/upload-artifact@v6 id: upload_unsigned with: name: windows-arm64-qt6-unsigned-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe - + - name: Submit to SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} @@ -686,9 +423,9 @@ jobs: wait-for-completion: true wait-for-completion-timeout-in-seconds: "7200" output-artifact-directory: 'ci/win/Output/signed' - + - name: Replace with signed installer and cleanup - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') + if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/yacreader10') shell: pwsh working-directory: ci/win/Output run: | @@ -700,161 +437,11 @@ jobs: } Remove-Item -Path "signed" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "Cleaned up signed directory" - - - name: Upload installer - uses: actions/upload-artifact@v4 - with: - name: windows-arm64-qt6-${{ needs.initialization.outputs.build_number }} - path: ci/win/Output/YACReader*.exe - # Windows x86 Qt5 build - windows-x86: - name: Windows x86 (Qt5) - runs-on: windows-2022 - needs: [initialization, code-format-validation] - steps: - - uses: actions/checkout@v4 - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - architecture: 'x64' - - - name: Install dependencies - shell: cmd - run: | - pip install -U pip - pip install aqtinstall - mkdir C:\Qt - python -m aqt install-qt windows desktop 5.15.2 win32_msvc2019 -O c:\Qt - dir C:\Qt\5.15.2\msvc2019\bin - choco install -y wget - choco install innosetup - mkdir %GITHUB_WORKSPACE%\compressed_archive - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z - 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip - wget "https://aka.ms/vs/17/release/vc_redist.x86.exe" -O %GITHUB_WORKSPACE%\vc_redist.x86.exe - - - name: Build - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" - set PATH=C:\Qt\5.15.2\msvc2019\bin;%PATH% - set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" - qmake CONFIG+="7zip" %DEFINES_VAR% - nmake - - - name: Run tests - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" - set PATH=C:\Qt\5.15.2\msvc2019\bin;%PATH% - nmake check TESTARGS="-maxwarnings 100000" - - - name: Upload executables for signing - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 - id: upload_executables - with: - name: windows-x86-executables-unsigned-${{ needs.initialization.outputs.build_number }} - path: | - release/YACReader.exe - release/YACReaderLibrary.exe - release/YACReaderLibraryServer.exe - - - name: Sign executables with SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: signpath/github-action-submit-signing-request@v1 - with: - api-token: ${{ secrets.SIGNPATH_API_TOKEN }} - organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} - project-slug: 'yacreader' - signing-policy-slug: 'release-signing' - artifact-configuration-slug: 'zipped-files' - github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }} - wait-for-completion: true - wait-for-completion-timeout-in-seconds: "7200" - output-artifact-directory: release/signed - - - name: Replace with signed executables - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - shell: pwsh - run: | - Write-Host "=== Replacing executables with signed versions ===" - Get-ChildItem -Path "release/signed" -Filter "*.exe" | ForEach-Object { - $destPath = "release/$($_.Name)" - Write-Host "Moving signed: $($_.Name) -> $destPath" - Move-Item -Path $_.FullName -Destination $destPath -Force - Write-Host " Moved successfully" - } - Remove-Item -Path "release/signed" -Recurse -Force -ErrorAction SilentlyContinue - Write-Host "Signed executables are ready for installer creation" - - - name: Create installer - shell: cmd - working-directory: ci/win - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" - set PATH=C:\Qt\5.15.2\msvc2019\bin;%PATH% - .\create_installer.cmd x86 7z ${{ needs.initialization.outputs.build_number }} qt5 - - - name: Verify installer was created - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - shell: pwsh - run: | - if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { - throw "Installer file was not created" - } - Get-ChildItem "ci/win/Output/YACReader*.exe" - - - name: Upload unsigned installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: actions/upload-artifact@v4 - id: upload_unsigned - with: - name: windows-x86-unsigned-${{ needs.initialization.outputs.build_number }} - path: ci/win/Output/YACReader*.exe - - - name: Submit to SignPath - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - uses: signpath/github-action-submit-signing-request@v1 - with: - api-token: ${{ secrets.SIGNPATH_API_TOKEN }} - organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} - project-slug: 'yacreader' - signing-policy-slug: 'release-signing' - artifact-configuration-slug: 'zipped-files' - github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }} - wait-for-completion: true - wait-for-completion-timeout-in-seconds: "7200" - output-artifact-directory: ci/win/Output/signed - - - name: Replace with signed installer - if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') - shell: pwsh - run: | - Write-Host "=== Files in signed directory before move ===" - Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } - - $signedFiles = Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" - foreach ($signedFile in $signedFiles) { - $destPath = "ci/win/Output/$($signedFile.Name)" - Write-Host "Moving signed: $($signedFile.Name) -> $destPath" - Move-Item -Path $signedFile.FullName -Destination $destPath -Force - Write-Host " Moved successfully" - } - - Write-Host "=== Files in Output directory after move ===" - Get-ChildItem -Path "ci/win/Output" -Filter "*.exe" | ForEach-Object { Write-Host " $($_.Name) - $($_.Length) bytes" } - - Remove-Item -Path "ci/win/Output/signed" -Recurse -Force -ErrorAction SilentlyContinue - Write-Host "Cleaned up signed directory" - - name: Upload installer - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: - name: windows-x86-${{ needs.initialization.outputs.build_number }} + name: windows-arm64-qt6-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe # Docker amd64 build @@ -863,19 +450,19 @@ jobs: runs-on: ubuntu-latest needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Build amd64 Image working-directory: docker run: | - docker build --no-cache --platform linux/amd64 -f Dockerfile -t yacreader/yacreaderlibraryserver:develop-amd64 . + docker build --no-cache --platform linux/amd64 -f Dockerfile --build-arg YACR_VERSION=${{ github.head_ref || github.ref_name }} -t yacreader/yacreaderlibraryserver:develop-amd64 . docker save yacreader/yacreaderlibraryserver:develop-amd64 -o amd64.tar - + - name: Upload Docker Image - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: docker-amd64 path: docker/amd64.tar @@ -886,16 +473,16 @@ jobs: runs-on: ubuntu-24.04-arm needs: [initialization, code-format-validation] steps: - - uses: actions/checkout@v4 - + - uses: actions/checkout@v6 + - name: Build arm64 Image (native) working-directory: docker run: | - docker build --no-cache -f Dockerfile.aarch64 -t yacreader/yacreaderlibraryserver:develop-arm64 . + docker build --no-cache -f Dockerfile.aarch64 --build-arg YACR_VERSION=${{ github.head_ref || github.ref_name }} -t yacreader/yacreaderlibraryserver:develop-arm64 . docker save yacreader/yacreaderlibraryserver:develop-arm64 -o arm64.tar - + - name: Upload Docker Image - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: docker-arm64 path: docker/arm64.tar @@ -907,89 +494,41 @@ jobs: runs-on: ubuntu-24.04 needs: - initialization - - linux - linux-qt6 - linux-qt6-7zip - - macos - macos-qt6-universal - - windows-x86 - - windows-x64 - windows-x64-qt6 - windows-arm64-qt6 - docker-amd64 - docker-arm64 steps: - - uses: actions/checkout@v4 - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: List downloaded artifacts - run: | - echo "=== All artifacts downloaded ===" - ls -lR artifacts/ - echo "" - echo "=== Windows artifacts only ===" - ls -l artifacts/windows-*/ - - - name: Flatten artifacts (exclude unsigned Windows installers) - run: | - mkdir -p staging - # Copy all files except those from unsigned Windows artifact directories - find artifacts -type f ! -path "*/windows-*-unsigned-*/*" -exec cp {} staging/ \; - echo "" - echo "=== Files copied to staging ===" - ls -lh staging/ - echo "" - echo "=== Windows installers in staging ===" - ls -lh staging/YACReader*.exe || echo "No Windows installers found" - - - name: Verify Windows installer signatures - run: | - echo "=== Installing osslsigncode to verify signatures ===" - sudo apt-get update - sudo apt-get install -y osslsigncode - - echo "" - echo "=== Checking signatures on Windows installers ===" - for installer in staging/YACReader*.exe; do - if [ -f "$installer" ]; then - echo "Checking: $(basename $installer)" - echo "File size: $(stat -c%s $installer) bytes" - - # Try to extract signature info - if osslsigncode verify -in "$installer" 2>&1 | grep -q "Signature verification: ok"; then - echo " ✓ SIGNED - Signature verified successfully" - osslsigncode verify -in "$installer" 2>&1 | grep -E "(Signed|Signer|Timestamp)" - else - echo " ✗ UNSIGNED or INVALID - No valid signature found" - osslsigncode verify -in "$installer" 2>&1 | head -20 - fi - echo "" - fi - done - - echo "=== Summary ===" - echo "Total installers in staging: $(ls staging/YACReader*.exe 2>/dev/null | wc -l)" - + - uses: actions/checkout@v6 + + - name: Prepare release artifacts + uses: ./.github/actions/prepare-release-artifacts + - name: Get version id: version run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' ).${{ needs.initialization.outputs.build_number }}" + VERSION="$(tr -d '\r\n' < VERSION).${{ needs.initialization.outputs.build_number }}" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" - + + - name: Extract release notes + id: release_notes + uses: ./.github/actions/extract-release-notes + with: + version: ${{ steps.version.outputs.version }} + - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Push Docker Images run: | for arch in amd64 arm64; do @@ -997,18 +536,19 @@ jobs: docker push yacreader/yacreaderlibraryserver:develop-${arch} rm staging/${arch}.tar done - + docker buildx imagetools create \ -t yacreader/yacreaderlibraryserver:develop \ yacreader/yacreaderlibraryserver:develop-amd64 \ yacreader/yacreaderlibraryserver:develop-arm64 - + - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: repository: YACReader/yacreader-dev-builds tag_name: ${{ steps.version.outputs.version }} name: ${{ steps.version.outputs.version }} + body: ${{ steps.release_notes.outputs.notes }} target_commitish: 25313e3d4d03fcbe44d3943db23bc03bbd1a5205 files: staging/* env: @@ -1021,89 +561,41 @@ jobs: runs-on: ubuntu-24.04 needs: - initialization - - linux - linux-qt6 - linux-qt6-7zip - - macos - macos-qt6-universal - - windows-x86 - - windows-x64 - windows-x64-qt6 - windows-arm64-qt6 - docker-amd64 - docker-arm64 steps: - - uses: actions/checkout@v4 - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: List downloaded artifacts - run: | - echo "=== All artifacts downloaded ===" - ls -lR artifacts/ - echo "" - echo "=== Windows artifacts only ===" - ls -l artifacts/windows-*/ - - - name: Flatten artifacts (exclude unsigned Windows installers) - run: | - mkdir -p staging - # Copy all files except those from unsigned Windows artifact directories - find artifacts -type f ! -path "*/windows-*-unsigned-*/*" -exec cp {} staging/ \; - echo "" - echo "=== Files copied to staging ===" - ls -lh staging/ - echo "" - echo "=== Windows installers in staging ===" - ls -lh staging/YACReader*.exe || echo "No Windows installers found" - - - name: Verify Windows installer signatures - run: | - echo "=== Installing osslsigncode to verify signatures ===" - sudo apt-get update - sudo apt-get install -y osslsigncode - - echo "" - echo "=== Checking signatures on Windows installers ===" - for installer in staging/YACReader*.exe; do - if [ -f "$installer" ]; then - echo "Checking: $(basename $installer)" - echo "File size: $(stat -c%s $installer) bytes" - - # Try to extract signature info - if osslsigncode verify -in "$installer" 2>&1 | grep -q "Signature verification: ok"; then - echo " ✓ SIGNED - Signature verified successfully" - osslsigncode verify -in "$installer" 2>&1 | grep -E "(Signed|Signer|Timestamp)" - else - echo " ✗ UNSIGNED or INVALID - No valid signature found" - osslsigncode verify -in "$installer" 2>&1 | head -20 - fi - echo "" - fi - done - - echo "=== Summary ===" - echo "Total installers in staging: $(ls staging/YACReader*.exe 2>/dev/null | wc -l)" - + - uses: actions/checkout@v6 + + - name: Prepare release artifacts + uses: ./.github/actions/prepare-release-artifacts + - name: Get version id: version run: | - VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" + VERSION="$(tr -d '\r\n' < VERSION)" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" - + + - name: Extract release notes + id: release_notes + uses: ./.github/actions/extract-release-notes + with: + version: ${{ steps.version.outputs.version }} + - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Push Docker Images run: | for arch in amd64 arm64; do @@ -1112,22 +604,92 @@ jobs: docker push yacreader/yacreaderlibraryserver:latest-${arch} rm staging/${arch}.tar done - + docker buildx imagetools create \ -t yacreader/yacreaderlibraryserver:latest \ yacreader/yacreaderlibraryserver:latest-amd64 \ yacreader/yacreaderlibraryserver:latest-arm64 - + docker buildx imagetools create \ -t yacreader/yacreaderlibraryserver:${{ steps.version.outputs.version }} \ yacreader/yacreaderlibraryserver:latest-amd64 \ yacreader/yacreaderlibraryserver:latest-arm64 - + - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ steps.version.outputs.version }} name: ${{ steps.version.outputs.version }} + body: ${{ steps.release_notes.outputs.notes }} files: staging/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Publish yacreader10 pre-release builds + publish-yacreader10-builds: + name: Publish YACReader10 Pre-release Builds + if: github.repository == 'YACReader/yacreader' && github.ref == 'refs/heads/yacreader10' + runs-on: ubuntu-24.04 + needs: + - initialization + - linux-qt6 + - linux-qt6-7zip + - macos-qt6-universal + - windows-x64-qt6 + - windows-arm64-qt6 + - docker-amd64 + - docker-arm64 + steps: + - uses: actions/checkout@v6 + + - name: Prepare release artifacts + uses: ./.github/actions/prepare-release-artifacts + + - name: Get version + id: version + run: | + VERSION="$(tr -d '\r\n' < VERSION).${{ needs.initialization.outputs.build_number }}" + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Version: $VERSION" + + - name: Extract release notes + id: release_notes + uses: ./.github/actions/extract-release-notes + with: + version: ${{ steps.version.outputs.version }} + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Push Docker Images + run: | + for arch in amd64 arm64; do + docker load -i staging/${arch}.tar + docker tag yacreader/yacreaderlibraryserver:develop-${arch} yacreader/yacreaderlibraryserver:develop-yacreader10-${arch} + docker push yacreader/yacreaderlibraryserver:develop-yacreader10-${arch} + rm staging/${arch}.tar + done + + docker buildx imagetools create \ + -t yacreader/yacreaderlibraryserver:develop-yacreader10 \ + yacreader/yacreaderlibraryserver:develop-yacreader10-amd64 \ + yacreader/yacreaderlibraryserver:develop-yacreader10-arm64 + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + repository: YACReader/yacreader-dev-builds + tag_name: ${{ steps.version.outputs.version }} + name: ${{ steps.version.outputs.version }} + body: ${{ steps.release_notes.outputs.notes }} + prerelease: true + target_commitish: 25313e3d4d03fcbe44d3943db23bc03bbd1a5205 + files: staging/* + env: + GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 397e9743e..e90e8a215 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,6 @@ dependencies/create-dmg signapps.sh lib7zip libp7zip -YACReader/build -YACReaderLibrary/build -YACReaderLibraryServer/build -build/ # C++ objects and libs *.slo @@ -24,16 +20,7 @@ build/ *.pch *.obj -# Qt-es -object_script.*.Release -object_script.*.Debug -*_plugin_import.cpp -/.qmake.cache -/.qmake.stash -*.pro.user -*.pro.user.* -*.qbs.user -*.qbs.user.* +# Qt generated files *.moc moc_*.cpp moc_*.h @@ -41,38 +28,43 @@ qrc_*.cpp ui_*.h *.qmlc *.jsc -Makefile* -*build-* -*.build* -*.app* -*.pbxproj -*.mak -*.xcworkspace* -*xcshareddata* -*.swp *.qm # Qt unit tests target_wrapper.* # QtCreator +.qtcreator/ *.autosave - -# QtCreator Qml *.qmlproject.user *.qmlproject.user.* - -# QtCreator CMake CMakeLists.txt.user* *.stash +*build-* +*.build* + +# CMake +build*/ +CMakeCache.txt +CMakeFiles/ +cmake_install.cmake +CMakeUserPresets.json +# IDE / platform +*.app* +*.pbxproj +*.xcworkspace* +*xcshareddata* +*.swp *.plist *.dmg - YACReaderLibrary/YACReaderLibrary\.xcodeproj/ .DS_Store +compile_commands.json +.ccls-cache + compressed_archive/libp7zip c_x86_64.pch -compile_commands.json -.ccls-cache +# Claude Code +.claude/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..6debdc6dc --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,104 @@ +# AGENTS GUIDANCE + +This file provides guidance to AI agents when working with code in this repository. + +## Build + +Out-of-source builds are required. In-source builds will be rejected by CMake. + +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build --parallel +``` + +Build options: +- `DECOMPRESSION_BACKEND`: `unarr` | `7zip` | `libarchive` (default: 7zip on Windows/macOS, unarr on Linux) +- `PDF_BACKEND`: `pdfium` | `poppler` | `pdfkit` | `no_pdf` (default: pdfium on Windows, pdfkit on macOS, poppler on Linux) +- `BUILD_SERVER_STANDALONE=ON`: builds only `YACReaderLibraryServer` (headless), requires only Qt 6.4+ +- `BUILD_TESTS=ON` (default): enables the test suite + +## Translations + +Use CMake translation targets (Qt LinguistTools integration), not ad-hoc `lupdate` calls. + +Update `.ts` files from source code (C++ + QML): + +```bash +cmake --build build --target update_translations +``` + +On multi-config generators (Visual Studio / Ninja Multi-Config), include config: + +```bash +cmake --build build --config Release --target update_translations +``` + +Build `.qm` files: + +```bash +cmake --build build --target release_translations +``` + +Multi-config variant: + +```bash +cmake --build build --config Release --target release_translations +``` + +Important: +- Do not run `lupdate` only on a hand-picked subset of QML files, because that can mark unrelated translations as obsolete. +- In `YACReaderLibrary`, `qt_add_translations(...)` is configured to scan full target sources and include the QML files directly. +- `update_translations` updates both locale TS files and `*_source.ts` template files for all apps. +- `*_source.ts` files are translator base templates and must not be treated as shipped locales. + +## Tests + +```bash +ctest --test-dir build --output-on-failure +``` + +Tests live in `tests/` and are built as Qt Test executables (`compressed_archive_test`, `concurrent_queue_test`). + +## Code Formatting + +CI enforces `clang-format`. Run it before committing. There are multiple `.clang-format` files — subdirectories for third-party code have their own to opt out of reformatting. Always run recursively from the repo root via the provided scripts: + +- Linux: `scripts/clang-format-linux.sh` +- macOS: `scripts/clang-format-macos.sh` +- Windows: `scripts\clang-format-windows.cmd` (or `.ps1`) + +Style is WebKit-based with custom brace wrapping (braces on same line for control flow, new line after functions/classes), no column limit, and `SortIncludes: false`. + +## Architecture + +The repo builds three applications that share a common set of static libraries: + +| App | Description | +|-----|-------------| +| `YACReader` | Comic viewer | +| `YACReaderLibrary` | Comic library manager (GUI) | +| `YACReaderLibraryServer` | Headless HTTP server | + +### Static library dependency layers (bottom to top) + +1. **`yr_global`** — version/global constants, no GUI, used by everything +2. **`naturalsort`, `concurrent_queue`, `worker`** — utilities +3. **`common_all`** — shared non-GUI: `ComicDB`, `Folder`, `Bookmarks`, HTTP helpers, cover utils +4. **`comic_backend`** — comic file abstraction + PDF backend (source varies by `PDF_BACKEND`) +5. **`cbx_backend`** — compressed archive abstraction (in `compressed_archive/`) +6. **`db_helper`** — SQLite database layer: schema management, reading lists, query parser +7. **`library_common`** — library scanning, bundle creation, XML metadata parsing; shared between `YACReaderLibrary` and `YACReaderLibraryServer` +8. **`common_gui`** — GUI widgets, themes infrastructure, version check (not built in `BUILD_SERVER_STANDALONE`) +9. **`rhi_flow_reader` / `rhi_flow_library`** — RHI-based 3D coverflow widget, compiled twice with different defines (`YACREADER` vs `YACREADER_LIBRARY`); shaders compiled via `qt_add_shaders()` + +### Key design notes + +- **Theme system**: `theme_manager.h/cpp` is NOT part of `common_gui` because it depends on app-specific `Theme` structs. Each app (`YACReader/themes/`, `YACReaderLibrary/themes/`) defines its own `theme.h` and includes `theme_manager` directly. +- **Compile-time app identity**: `YACREADER` or `YACREADER_LIBRARY` defines distinguish shared source compiled into different apps. +- **PDF backend**: resolved at configure time into an `INTERFACE` target `pdf_backend_iface` (see `cmake/PdfBackend.cmake`); `comic_backend` and `common_all` link against this interface. +- **Third-party code**: `third_party/` contains QsLog, KDToolBox, QtWebApp, QrCode — each has its own `.clang-format` to prevent reformatting. +- **Runtime dependencies**: Qt binaries must be in `PATH`; third-party DLLs/dylibs must be next to the executable. Check an existing YACReader installation for the required files. + +### PRs + +Target branch is always `develop`. diff --git a/CHANGELOG.md b/CHANGELOG.md index bb2249f47..b90c75d63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ Version counting is based on semantic versioning (Major.Feature.Patch) +## 10 (WIP) + +### YACReader +* Add support for continuous scroll mode. +* Fix the translator. +* Add Lanczos interpolation for image scaling. You can control the method used via the settings under `Image adjustments`. + +### All GUI Apps +* Migrate Flow implementation from OpenGL to QRhi. This is a full new implementation with better performance and compatibility with operating systems and hardware. +* Add light/dark themes support that follow the system configuration. +* Add a theme editor and support for custom themes. +* The apps include 12 built in themes to pick from. +* Add an application language setting with a system default option in YACReader and YACReaderLibrary. + +### All apps +* Add support for user-installed Qt image format plugins via the shared `plugins/imageformats` folder in the YACReader settings directory. + ## 9.16.4 ### YACReaderLibrary @@ -120,7 +137,7 @@ Version counting is based on semantic versioning (Major.Feature.Patch) ### YACReaderLibraryServer * Add `rescan-xml-info` command. -* Improved API to provide better integration with the clients (Android 1.4.0 and iOS 3.29.0). +* Improved API to provide better integration with the clients (Android 1.4.0 and iOS 3.29.0). ### All Apps * New universal builds for macos. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..c17412640 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +See AGENTS.md for project context. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..ed3108de4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,211 @@ +cmake_minimum_required(VERSION 3.25...4.3.1) + +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" YACREADER_VERSION) +string(STRIP "${YACREADER_VERSION}" YACREADER_VERSION) +if(NOT YACREADER_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$") + message(FATAL_ERROR "VERSION must contain a semantic version like x.y.z") +endif() + +project(YACReader + VERSION ${YACREADER_VERSION} + LANGUAGES C CXX +) + +# Enable Objective-C/C++ on Apple platforms +if(APPLE) + enable_language(OBJC) + enable_language(OBJCXX) +endif() + +# Enforce out-of-source build +file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" _in_source_check) +if(EXISTS "${_in_source_check}") + message(FATAL_ERROR "In-source builds are not allowed. Use: cmake -B build") +endif() + +# C++ standard +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Default build type (single-config generators only) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif() + +# Install paths +include(GNUInstallDirs) +list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Compiler options (MSVC flags) +include(cmake/CompilerOptions.cmake) + +# --- Build options --- + +# Build configuration +option(BUILD_TESTS "Build tests" ON) +option(BUILD_SERVER_STANDALONE "Server standalone install (Linux only)" OFF) + +# Build number (set by CI) +set(BUILD_NUMBER "" CACHE STRING "CI build number") + +set(YACREADER_DECOMPRESSION_BACKENDS unarr 7zip libarchive) +set(YACREADER_PDF_BACKENDS pdfium poppler pdfkit no_pdf) + +# --- Platform defaults (mirrors config.pri) --- +if(UNIX AND NOT APPLE) + set(_default_decompression_backend "unarr") + set(_default_pdf_backend "poppler") +elseif(APPLE) + set(_default_decompression_backend "7zip") + set(_default_pdf_backend "pdfkit") +else() + set(_default_decompression_backend "7zip") + set(_default_pdf_backend "pdfium") +endif() + +# Archive decompression backend (mutually exclusive) +set(_decompression_backend_value "") +if(DEFINED CACHE{DECOMPRESSION_BACKEND}) + set(_decompression_backend_value "$CACHE{DECOMPRESSION_BACKEND}") +endif() +if(_decompression_backend_value STREQUAL "") + set(_decompression_backend_value "${_default_decompression_backend}") + string(JOIN ", " _available_decompression_backends ${YACREADER_DECOMPRESSION_BACKENDS}) + message(STATUS + "DECOMPRESSION_BACKEND not set, defaulting to ${_decompression_backend_value}. " + "Available: ${_available_decompression_backends}.") +endif() +set(DECOMPRESSION_BACKEND "${_decompression_backend_value}" CACHE STRING + "Archive backend: unarr | 7zip | libarchive" FORCE) +set_property(CACHE DECOMPRESSION_BACKEND PROPERTY STRINGS ${YACREADER_DECOMPRESSION_BACKENDS}) +if(NOT DECOMPRESSION_BACKEND IN_LIST YACREADER_DECOMPRESSION_BACKENDS) + string(JOIN ", " _valid_decompression_backends ${YACREADER_DECOMPRESSION_BACKENDS}) + message(FATAL_ERROR + "Unknown DECOMPRESSION_BACKEND: '${DECOMPRESSION_BACKEND}'. " + "Use one of: ${_valid_decompression_backends}") +endif() + +# PDF rendering backend (mutually exclusive) +set(_pdf_backend_value "") +if(DEFINED CACHE{PDF_BACKEND}) + set(_pdf_backend_value "$CACHE{PDF_BACKEND}") +endif() +if(_pdf_backend_value STREQUAL "") + set(_pdf_backend_value "${_default_pdf_backend}") + string(JOIN ", " _available_pdf_backends ${YACREADER_PDF_BACKENDS}) + message(STATUS + "PDF_BACKEND not set, defaulting to ${_pdf_backend_value}. " + "Available: ${_available_pdf_backends}.") +endif() +set(PDF_BACKEND "${_pdf_backend_value}" CACHE STRING + "PDF backend: pdfium | poppler | pdfkit | no_pdf" FORCE) +set_property(CACHE PDF_BACKEND PROPERTY STRINGS ${YACREADER_PDF_BACKENDS}) +if(NOT PDF_BACKEND IN_LIST YACREADER_PDF_BACKENDS) + string(JOIN ", " _valid_pdf_backends ${YACREADER_PDF_BACKENDS}) + message(FATAL_ERROR + "Unknown PDF_BACKEND: '${PDF_BACKEND}'. " + "Use one of: ${_valid_pdf_backends}") +endif() + +# macOS universal binary default +if(APPLE AND NOT CMAKE_OSX_ARCHITECTURES) + set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "Target architectures") +endif() + +# --- Qt --- +# BUILD_SERVER_STANDALONE only needs Qt 6.4+ (no GUI/shader components required) +if(BUILD_SERVER_STANDALONE) + find_package(Qt6 6.4 REQUIRED COMPONENTS + Core + Core5Compat + Gui + LinguistTools + Network + Sql + ) +else() + find_package(Qt6 6.7 REQUIRED COMPONENTS + Core + Core5Compat + Gui + GuiPrivate + LinguistTools + Multimedia + Network + OpenGLWidgets + Quick + QuickControls2 + QuickWidgets + Qml + ShaderTools + Sql + Svg + Test + TextToSpeech + Widgets + ) +endif() +qt_standard_project_setup() + +# PDF backend detection (creates pdf_backend_iface INTERFACE target) +include(PdfBackend) + +# Output directory +if(WIN32 OR APPLE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +endif() + +# --- Subdirectories (dependency order) --- +add_subdirectory(third_party) +add_subdirectory(compressed_archive) +add_subdirectory(common) + +# GUI-only subdirectories (not needed for server-standalone builds) +if(NOT BUILD_SERVER_STANDALONE) + add_subdirectory(shortcuts_management) + add_subdirectory(custom_widgets) + add_subdirectory(image_processing) +endif() + +add_subdirectory(YACReaderLibrary/server) + +if(NOT BUILD_SERVER_STANDALONE) + add_subdirectory(YACReaderLibrary/comic_vine) +endif() + +# Always add YACReaderLibrary: defines library_common and db_helper (shared with server) +# When BUILD_SERVER_STANDALONE=ON, only those shared targets are built (not the app) +add_subdirectory(YACReaderLibrary) + +if(NOT BUILD_SERVER_STANDALONE) + add_subdirectory(YACReader) +endif() + +add_subdirectory(YACReaderLibraryServer) + +if(BUILD_TESTS AND NOT BUILD_SERVER_STANDALONE) + enable_testing() + add_subdirectory(tests) +endif() + +# Summary +if(CMAKE_CONFIGURATION_TYPES) + string(JOIN ", " _configured_build_types ${CMAKE_CONFIGURATION_TYPES}) + set(_build_type_summary "multi-config (${_configured_build_types})") +else() + set(_build_type_summary "${CMAKE_BUILD_TYPE}") +endif() + +message(STATUS "") +message(STATUS "YACReader ${PROJECT_VERSION} build configuration:") +message(STATUS " Decompression backend: ${DECOMPRESSION_BACKEND}") +message(STATUS " PDF backend: ${PDF_BACKEND}") +message(STATUS " Build tests: ${BUILD_TESTS}") +message(STATUS " Server standalone: ${BUILD_SERVER_STANDALONE}") +message(STATUS " Build type: ${_build_type_summary}") +if(BUILD_NUMBER) + message(STATUS " Build number: ${BUILD_NUMBER}") +endif() +message(STATUS "") diff --git a/INSTALL.md b/INSTALL.md index 8a3155f2c..182b2b55f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,36 +1,40 @@ # Building YACReader from source -YACReader and YACReaderLibrary are build using qmake. To build and install the -program, run: +YACReader and YACReaderLibrary are built using CMake. To build from the top +source directory: ``` -qmake CONFIG+=[Options] -make -make install +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build --parallel ``` -from the top source dir. For separate builds of YACReader or YACReaderLibrary, -enter their respective subfolders and run the commands from there. +To install (Linux): + +``` +cmake --install build +``` -The headless version of YACReaderLibrary is located in the YACReaderLibraryServer -folder. To build it, enter the folder and run the commands described above. ## Build dependencies: -- Qt >= 5.15 with the following modules: - - declarative - - quickcontrols - - sql - - multimedia - - imageformats - - opengl - - sql-sqlite - - network +- CMake >= 3.25 +- C++20 compiler +- Qt >= 6.7 with the following modules: + - Core, Core5Compat, Gui, Widgets + - Quick, QuickControls2, QuickWidgets, Qml + - Sql (with SQLite driver) + - Multimedia + - Network + - Svg + - OpenGLWidgets + - ShaderTools + - LinguistTools + - Test (for running tests) - Backends for pdf rendering (optional) and file decompression (see below) Not all dependencies are needed at build time. For example the qml components in YACReaderLibrary (GridView, InfoView) will only show a white page if the -required qml modules (declarative, quickcontrols) are missing. +required qml modules (Quick, QuickControls2) are missing. ## Backends @@ -38,26 +42,26 @@ required qml modules (declarative, quickcontrols) are missing. YACReader currently supports two decompression backends, 7zip and (lib)unarr. YACReader defaults to 7zip for Windows and Mac OS and unarr for Linux and other OS, but you can -override this using one of the following config options: +override this using the `DECOMPRESSION_BACKEND` option: -`CONFIG+=7zip` - -`CONFIG+=unarr` +``` +cmake -B build -DDECOMPRESSION_BACKEND=7zip +cmake -B build -DDECOMPRESSION_BACKEND=unarr +cmake -B build -DDECOMPRESSION_BACKEND=libarchive +``` #### 7zip -[7zip](https://www.7-zip.org/) and [p7zip](http://p7zip.sourceforge.net/) -are the default decompression backend for Windows and Mac OS builds. +[7zip](https://www.7-zip.org/) is the default decompression backend for Windows and Mac OS builds. -They are recommended for these systems, as they currently have better support for 7z -files and support the RAR5 format. +It is recommended for these systems, as it currently has better support for 7z +files and supports the RAR5 format. -As this backend requires specific versions of 7zip for Windows and p7zip for *NIX and -is not 100% GPL compatible (unrar License restriction), it is not recommended for -installations where you can't guarantee the installed version of (p7zip) or the license is an issue. +The 7zip source code is automatically downloaded during configuration via CMake's +FetchContent. No manual setup is needed. -To build using this backend, you need to install additional sources to the build environment. -For more information, please refer to [README_7zip](compressed_archive/README_7zip.txt). +As this backend is not 100% GPL compatible (unrar license restriction), it is not +recommended for installations where the license is an issue. #### unarr @@ -77,12 +81,18 @@ For more information, please consult the [README](compressed_archive/unarr/READM Starting with version 9.0.0 YACReader supports the following pdf rendering engines: - poppler (Linux/Unix default) -- pdfium (default for Windows and MacOS) -- pdfkit (MacOS only) +- pdfium (default for Windows) +- pdfkit (macOS default, macOS only) - no_pdf (disable pdf support) -To override the default for a given platform add CONFIG+=[pdfbackend] as an option -when running qmake. +To override the default for a given platform use the `PDF_BACKEND` option: + +``` +cmake -B build -DPDF_BACKEND=poppler +cmake -B build -DPDF_BACKEND=pdfium +cmake -B build -DPDF_BACKEND=pdfkit +cmake -B build -DPDF_BACKEND=no_pdf +``` While the Poppler backend is well tested and has been the standard for YACReader for a long time, its performance is a bit lacking. The pdfium engine offers @@ -92,33 +102,31 @@ prepackaged for Linux. ### Other build options: -You can adjust the installation prefix as well als the path "make install" uses -to install the files. +You can adjust the installation prefix: -`qmake PREFIX=DIR` - -sets the default prefix (for example "/", "/usr", "/usr/local"). - -`make install INSTALL_ROOT=DIR` +``` +cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local +``` -can be used to install to a different location, which is usefull for packaging. +Default value on Linux is `/usr`. -Default values: +For packaging, use `DESTDIR` with the install command: ``` -PREFIX=/usr -INSTALL_ROOT="" +DESTDIR=/path/to/staging cmake --install build ``` -On embedded devices that don't support desktop OpenGL, it is recommended to use -the no_opengl config option: +To build only YACReaderLibraryServer (headless server): -`qmake CONFIG+=no_opengl` +``` +cmake -B build -DBUILD_SERVER_STANDALONE=ON +``` -This will remove any dependency on desktop OpenGL and hardlock YACReader's -coverflow to software rendering. Please note that it does not actually remove -OpenGL from the build, the Qt toolkit will still make use of it. +### Running tests +``` +ctest --test-dir build --output-on-failure +``` # Feedback and contribution diff --git a/README.md b/README.md index 8df7d43ef..4e5b9c269 100644 --- a/README.md +++ b/README.md @@ -52,15 +52,21 @@ If you are interested in contributing to the project the first step should be to Contributions are not restricted to coding; you can help the project by bringing new UI/UX ideas, designing new assets, writing manuals or tutorials, translating the apps, etc. If you are interested in DevOps, YACReader uses Azure Pipelines for CI/CD, any improvements in that area are welcome. Testing pre-releases is also really appreciated. #### Dev Setup -YACReader is developed in *c++/Qt*, so the first thing you need to do is to install a *C++* compiler or environment that supports at least *C++17* and *Qt*. In *Windows* I use *Visual Studio Community Edition 2019* as build system and in *macos* I use Xcode, but I do all the coding using *QtCreator*. The project support *Qt5* and *Qt6* at the moment so you need to make sure that everything works in both *Qt5* and *Qt6*, you only need to install one flavor of *Qt* and *CI* will check that everything builds with both, I recommend using *Qt6*. +YACReader is developed in *C++/Qt* and built with *CMake*. You need a *C++20* compiler and *Qt 6.7+*. In *Windows* I use *Visual Studio 2022* and in *macOS* I use Xcode, but I do all the coding using *QtCreator*. -The repo includes binaries for the dependencies needed for *Windows* (MSVC compiler) and *macos* (clang) but you need to configure *7zip* dependency manually, please take a look at *compressed_archive/README_7zip.txt*. +The repo includes binaries for the dependencies needed for *Windows* (MSVC compiler) and *macOS* (clang). The *7zip* decompression backend source is downloaded automatically by CMake during configuration. + +To build: +``` +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build --parallel +``` + +See [INSTALL.md](./INSTALL.md) for detailed build options. ##### Running and debugging YACReader needs to find its dependencies at runtime, make sure that *Qt* binaries are in your *PATH* and the third-party binaries are next to the executable. The best way to make sure you have all the third-party binaries in place is to check YACReader installation and copy the binaries in your output folder. -If you have the time and the energy, please open a PR with a script that automatizes any of these manual processes. - #### Code Format YACReader uses `clang-format` to ensure a common style and avoid deviances from it. CI checks this and will fail if the correct format is not used. `clang-format` needs to be called recursively in all the folders because some of them have their own `.clang-format` file, mainly to exclude changing the format in third-party libraries which are included in the source code. I recommend configuring your development tools to use `clang-format`, you can try to use it manually, but please, do it always before committing changes. I recommend using QtCreator configured properly, you can find a tutorial [here]( https://www.vikingsoftware.com/using-clang-format-with-qtcreator/). diff --git a/VERSION b/VERSION new file mode 100644 index 000000000..95c4e8d27 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +10.0.0 \ No newline at end of file diff --git a/YACReader.pro b/YACReader.pro deleted file mode 100644 index f3106c4f4..000000000 --- a/YACReader.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = YACReader YACReaderLibrary YACReaderLibraryServer -YACReaderLibrary.depends = YACReader -!CONFIG(no_tests): SUBDIRS += tests diff --git a/YACReader/CMakeLists.txt b/YACReader/CMakeLists.txt new file mode 100644 index 000000000..ea9322df8 --- /dev/null +++ b/YACReader/CMakeLists.txt @@ -0,0 +1,292 @@ +# YACReader - Comic Viewer + +qt_add_executable(YACReader WIN32 + configuration.h + configuration.cpp + goto_dialog.h + goto_dialog.cpp + magnifying_glass.h + magnifying_glass.cpp + main_window_viewer.h + main_window_viewer.cpp + continuous_page_widget.h + continuous_page_widget.cpp + continuous_view_model.h + continuous_view_model.cpp + mouse_handler.h + mouse_handler.cpp + viewer.h + viewer.cpp + options_dialog.h + options_dialog.cpp + bookmarks_dialog.h + bookmarks_dialog.cpp + render.h + render.cpp + translator.h + translator.cpp + goto_flow_widget.h + goto_flow_widget.cpp + page_label_widget.h + page_label_widget.cpp + goto_flow_toolbar.h + goto_flow_toolbar.cpp + width_slider.h + width_slider.cpp + notifications_label_widget.h + notifications_label_widget.cpp + yacreader_local_client.h + yacreader_local_client.cpp + main.cpp + # App-specific themes + shared theme_manager (depends on app theme.h) + themes/theme.h + themes/theme_factory.h + themes/theme_factory.cpp + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.h + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.cpp +) +yacreader_apply_build_options(YACReader) + +target_include_directories(YACReader PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/themes +) + +target_compile_definitions(YACReader PRIVATE YACREADER) + +# Resources +set(yacreader_image_files + ${PROJECT_SOURCE_DIR}/images/icon-new.svg + ${PROJECT_SOURCE_DIR}/images/goto.svg + ${PROJECT_SOURCE_DIR}/images/find_folder.svg + ${PROJECT_SOURCE_DIR}/images/flow1.png + ${PROJECT_SOURCE_DIR}/images/flow2.png + ${PROJECT_SOURCE_DIR}/images/flow3.png + ${PROJECT_SOURCE_DIR}/images/flow4.png + ${PROJECT_SOURCE_DIR}/images/flow5.png + ${PROJECT_SOURCE_DIR}/images/notCover.png + ${PROJECT_SOURCE_DIR}/images/close.svg + ${PROJECT_SOURCE_DIR}/images/centerFlow.svg + ${PROJECT_SOURCE_DIR}/images/gotoFlow.svg + ${PROJECT_SOURCE_DIR}/images/defaultCover.png + ${PROJECT_SOURCE_DIR}/images/translator/close.svg + ${PROJECT_SOURCE_DIR}/images/translator/dropDownArrow.svg + ${PROJECT_SOURCE_DIR}/images/translator/fromTo.svg + ${PROJECT_SOURCE_DIR}/images/translator/speaker.svg + ${PROJECT_SOURCE_DIR}/images/translator/translatorSearch.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/clear_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/accept_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_comics.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_folders.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_general.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_libraries.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_mglass.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_page.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_reading.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_visualization.svg + ${PROJECT_SOURCE_DIR}/images/custom_dialog/custom_close_button.svg + ${PROJECT_SOURCE_DIR}/images/whats_new/whatsnew_header.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/bookmark.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/close.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doublePage.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doubleMangaPage.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/fitToPage.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/flow.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/full.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/goto.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/help.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/info.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/magnifyingGlass.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/next.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/open.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openFolder.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openNext.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openPrevious.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/options.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/previous.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateL.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateR.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/save.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/shortcuts.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/showBookmarks.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toHeight.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toContinuousScroll.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toWidth.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/translator.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/zoom.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/bookmark_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/close_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doublePage_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/doubleMangaPage_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/fitToPage_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/flow_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/full_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/goto_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/help_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/info_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/magnifyingGlass_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/next_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/open_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openFolder_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openNext_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/openPrevious_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/options_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/previous_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateL_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/rotateR_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/save_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/shortcuts_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/showBookmarks_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toHeight_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toContinuousScroll_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/toWidth_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/translator_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/zoom_18x18.svg + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/menuArrow.svg +) +set(yacreader_file_files + ${PROJECT_SOURCE_DIR}/files/about.html + ${PROJECT_SOURCE_DIR}/files/helpYACReader.html + ${PROJECT_SOURCE_DIR}/files/shortcuts.html +) +set(yacreader_file_files_es + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + ${PROJECT_SOURCE_DIR}/files/helpYACReader_es_ES.html +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "about.html" +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/helpYACReader_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "helpYACReader.html" +) +set(yacreader_theme_files + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_classic.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light4.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light5.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark4.json +) +set(yacreader_common_theme_image_files + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-system.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-light.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-dark.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-custom.svg +) + +qt_add_resources(YACReader "yacreader_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreader_image_files} +) +qt_add_resources(YACReader "yacreader_files" + PREFIX "/files" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreader_file_files} +) +qt_add_resources(YACReader "yacreader_files_es" + PREFIX "/files" + LANG "es_ES" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreader_file_files_es} +) +qt_add_resources(YACReader "yacreader_themes" + PREFIX "/themes" + BASE "${CMAKE_CURRENT_SOURCE_DIR}/themes" + FILES + ${yacreader_theme_files} +) +qt_add_resources(YACReader "yacreader_common_theme_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreader_common_theme_image_files} +) + +# Translations +qt_add_translations(YACReader + TS_FILES + yacreader_es.ts + yacreader_fr.ts + yacreader_ru.ts + yacreader_pt.ts + yacreader_nl.ts + yacreader_tr.ts + yacreader_de.ts + yacreader_zh_CN.ts + yacreader_zh_TW.ts + yacreader_zh_HK.ts + yacreader_it.ts + yacreader_source.ts + yacreader_en.ts +) + +target_link_libraries(YACReader PRIVATE + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Network + Qt6::Widgets + Qt6::Multimedia + Qt6::TextToSpeech + Qt6::Svg + Qt6::Core5Compat + comic_backend + common_gui + rhi_flow_reader + custom_widgets_reader + shortcuts_reader + cbx_backend + image_processing + QsLog +) + +# Platform-specific +if(WIN32) + target_sources(YACReader PRIVATE icon.rc) + target_link_libraries(YACReader PRIVATE oleaut32 ole32 shell32 user32) +endif() + +if(APPLE) + target_sources(YACReader PRIVATE YACReader.icns) + set_source_files_properties(YACReader.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + set_target_properties(YACReader PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist" + MACOSX_BUNDLE_GUI_IDENTIFIER "com.yacreader.YACReader" + MACOSX_BUNDLE_BUNDLE_NAME "YACReader" + ) + target_link_libraries(YACReader PRIVATE + "-framework Foundation" + "-framework ApplicationServices" + "-framework AppKit" + ) +endif() + +# Linux install +if(UNIX AND NOT APPLE) + target_compile_definitions(YACReader PRIVATE + "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"") + + install(TARGETS YACReader RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReader.1" + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReader.desktop" + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReader.svg" + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps) +endif() diff --git a/YACReader/Info.plist b/YACReader/Info.plist index 26134f11d..2bcd0f184 100644 --- a/YACReader/Info.plist +++ b/YACReader/Info.plist @@ -137,8 +137,6 @@ - NSRequiresAquaSystemAppearance - NSSupportsAutomaticGraphicsSwitching diff --git a/YACReader/YACReader.pro b/YACReader/YACReader.pro deleted file mode 100644 index d50940f8f..000000000 --- a/YACReader/YACReader.pro +++ /dev/null @@ -1,249 +0,0 @@ -TEMPLATE = app -TARGET = YACReader - -QMAKE_TARGET_BUNDLE_PREFIX = "com.yacreader" - -DEPENDPATH += . \ - release - -DEFINES += YACREADER - -#load default build flags -include (../config.pri) -include (../dependencies/pdf_backend.pri) - -CONFIG(force_angle) { - contains(QMAKE_TARGET.arch, x86_64) { - Release:DESTDIR = ../release64_angle - Debug:DESTDIR = ../debug64_angle - } else { - Release:DESTDIR = ../release_angle - Debug:DESTDIR = ../debug_angle - } -} else { - contains(QMAKE_TARGET.arch, x86_64) { - Release:DESTDIR = ../release64 - Debug:DESTDIR = ../debug64 - } else { - Release:DESTDIR = ../release - Debug:DESTDIR = ../debug - } -} - -SOURCES += main.cpp - -INCLUDEPATH += ../common \ - ../custom_widgets - -!CONFIG(no_opengl) { - INCLUDEPATH += ../common/gl -} - -#there are going to be two builds for windows, OpenGL based and ANGLE based -win32 { - CONFIG(force_angle) { - message("using ANGLE") - LIBS += -loleaut32 -lole32 -lshell32 -lopengl32 -luser32 - #linking extra libs are necesary for a successful compilation, a better approach should be - #to remove any OpenGL (desktop) dependencies - #the OpenGL stuff should be migrated to OpenGL ES - DEFINES += FORCE_ANGLE - } else { - LIBS += -loleaut32 -lole32 -lshell32 -lopengl32 -luser32 - } - - msvc { - QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT /GL - QMAKE_LFLAGS_RELEASE += /LTCG - } - CONFIG -= embed_manifest_exe -} - -macx { - QT += gui-private - CONFIG += objective_c - LIBS += -framework Foundation -framework ApplicationServices -framework AppKit - - lessThan(QT_MAJOR_VERSION, 6): QT += macextras -} - -QT += network widgets core multimedia svg - -greaterThan(QT_MAJOR_VERSION, 5): QT += openglwidgets core5compat - -#CONFIG += release -CONFIG -= flat - -# Sources -HEADERS += ../common/comic.h \ - configuration.h \ - goto_dialog.h \ - magnifying_glass.h \ - main_window_viewer.h \ - mouse_handler.h \ - viewer.h \ - goto_flow.h \ - options_dialog.h \ - ../common/bookmarks.h \ - bookmarks_dialog.h \ - render.h \ - translator.h \ - goto_flow_widget.h \ - page_label_widget.h \ - goto_flow_toolbar.h \ - width_slider.h \ - notifications_label_widget.h \ - ../common/pictureflow.h \ - ../common/custom_widgets.h \ - ../common/check_new_version.h \ - ../common/qnaturalsorting.h \ - ../common/yacreader_global.h \ - ../common/yacreader_global_gui.h \ - ../common/comic_db.h \ - ../common/folder.h \ - ../common/library_item.h \ - yacreader_local_client.h \ - ../common/http_worker.h \ - ../common/exit_check.h \ - ../common/scroll_management.h \ - ../common/opengl_checker.h \ - ../common/pdf_comic.h \ - ../common/global_info_provider.h \ - -!CONFIG(no_opengl) { - HEADERS += ../common/gl/yacreader_flow_gl.h \ - goto_flow_gl.h -} - -SOURCES += ../common/comic.cpp \ - configuration.cpp \ - goto_dialog.cpp \ - magnifying_glass.cpp \ - main_window_viewer.cpp \ - mouse_handler.cpp \ - viewer.cpp \ - goto_flow.cpp \ - options_dialog.cpp \ - ../common/bookmarks.cpp \ - bookmarks_dialog.cpp \ - render.cpp \ - translator.cpp \ - goto_flow_widget.cpp \ - page_label_widget.cpp \ - goto_flow_toolbar.cpp \ - width_slider.cpp \ - notifications_label_widget.cpp \ - ../common/pictureflow.cpp \ - ../common/custom_widgets.cpp \ - ../common/check_new_version.cpp \ - ../common/qnaturalsorting.cpp \ - ../common/comic_db.cpp \ - ../common/folder.cpp \ - ../common/library_item.cpp \ - yacreader_local_client.cpp \ - ../common/http_worker.cpp \ - ../common/yacreader_global.cpp \ - ../common/yacreader_global_gui.cpp \ - ../common/exit_check.cpp \ - ../common/scroll_management.cpp \ - ../common/opengl_checker.cpp \ - ../common/global_info_provider.cpp \ - -!CONFIG(no_opengl) { - SOURCES += ../common/gl/yacreader_flow_gl.cpp \ - goto_flow_gl.cpp -} - -include(../custom_widgets/custom_widgets_yacreader.pri) - -CONFIG(7zip) { -include(../compressed_archive/wrapper.pri) -} else:CONFIG(unarr) { -include(../compressed_archive/unarr/unarr-wrapper.pri) -} else:CONFIG(libarchive) { -include(../compressed_archive/libarchive/libarchive-wrapper.pri) -} else { - error(No compression backend specified. Did you mess with the build system?) -} -include(../shortcuts_management/shortcuts_management.pri) - -RESOURCES += yacreader_images.qrc \ - yacreader_files.qrc - -include(../third_party/QsLog/QsLog.pri) - -RC_FILE = icon.rc - -macx { - ICON = YACReader.icns - QMAKE_INFO_PLIST = Info.plist -} - -TRANSLATIONS = yacreader_es.ts \ - yacreader_fr.ts \ - yacreader_ru.ts \ - yacreader_pt.ts \ - yacreader_nl.ts \ - yacreader_tr.ts \ - yacreader_de.ts \ - yacreader_zh_CN.ts \ - yacreader_zh_TW.ts \ - yacreader_zh_HK.ts \ - yacreader_it.ts \ - yacreader_en.ts - -CONFIG += lrelease - -win32 { - CONFIG(release, debug|release) { - SOURCE_QM_DIR = $$OUT_PWD/release/*.qm - } - CONFIG(debug, debug|release) { - SOURCE_QM_DIR = $$OUT_PWD/debug/*.qm - } - - DEPLOYMENT_OUT_QM_DIR = ../release/languages/ - OUT_QM_DIR = $${DESTDIR}/languages/ - - QMAKE_POST_LINK += $(MKDIR) $$shell_path($${OUT_QM_DIR}) 2> NULL & \ - $(COPY) $$shell_path($${SOURCE_QM_DIR}) $$shell_path($${OUT_QM_DIR}) & \ - $(MKDIR) $$shell_path($${DEPLOYMENT_OUT_QM_DIR}) 2> NULL & \ - $(COPY) $$shell_path($${SOURCE_QM_DIR}) $$shell_path($${DEPLOYMENT_OUT_QM_DIR}) -} else { - LRELEASE_DIR = ../release/languages/ - QM_FILES_INSTALL_PATH = $$DATADIR/yacreader/languages -} - -unix:!macx { - -DEFINES += "LIBDIR=\\\"$$LIBDIR\\\"" "DATADIR=\\\"$$DATADIR\\\"" - -#MAKE INSTALL - -INSTALLS += bin docs icon desktop manpage - -bin.path = $$BINDIR -isEmpty(DESTDIR) { - bin.files = YACReader -} else { - bin.files = $$DESTDIR/YACReader -} - -docs.path = $$DATADIR/doc/yacreader - -#rename docs for better packageability -docs.extra = cp ../README.md ../README -docs.files = ../README ../CHANGELOG.md - -icon.path = $$DATADIR/icons/hicolor/scalable/apps -icon.files = ../YACReader.svg - -desktop.path = $$DATADIR/applications -desktop.files = ../YACReader.desktop - -manpage.path = $$DATADIR/man/man1 -manpage.files = ../YACReader.1 - -#remove leftover doc files when 'make clean' is invoked -QMAKE_CLEAN += "../README" -} diff --git a/YACReader/bookmarks_dialog.cpp b/YACReader/bookmarks_dialog.cpp index ea806afe0..6348d7016 100644 --- a/YACReader/bookmarks_dialog.cpp +++ b/YACReader/bookmarks_dialog.cpp @@ -1,13 +1,15 @@ #include "bookmarks_dialog.h" -#include -#include +#include "bookmarks.h" + #include #include +#include #include +#include #include -#include "bookmarks.h" +#include BookmarksDialog::BookmarksDialog(QWidget *parent) : QDialog(parent) @@ -28,7 +30,7 @@ BookmarksDialog::BookmarksDialog(QWidget *parent) QString labelsStyle = "QLabel {color:white;}"; - foreach (QLabel *label, pages) { + for (QLabel *const label : std::as_const(pages)) { label->setStyleSheet(labelsStyle); } diff --git a/YACReader/bookmarks_dialog.h b/YACReader/bookmarks_dialog.h index a440b8957..375223fc2 100644 --- a/YACReader/bookmarks_dialog.h +++ b/YACReader/bookmarks_dialog.h @@ -1,15 +1,15 @@ #ifndef __BOOKMARKS_DIALOG_H #define __BOOKMARKS_DIALOG_H -#include +#include "bookmarks.h" + #include -#include -#include #include #include +#include #include - -#include "bookmarks.h" +#include +#include class BookmarksDialog : public QDialog { diff --git a/YACReader/configuration.cpp b/YACReader/configuration.cpp index 15868a8f6..9e2b0d4a8 100644 --- a/YACReader/configuration.cpp +++ b/YACReader/configuration.cpp @@ -1,11 +1,10 @@ #include "configuration.h" -#include -#include -#include #include -#include +#include #include +#include +#include Configuration::Configuration() { @@ -37,8 +36,6 @@ void Configuration::load(QSettings *settings) settings->setValue(MAXIMIZED, false); if (!settings->contains(DOUBLE_PAGE)) settings->setValue(DOUBLE_PAGE, false); - if (!settings->contains(BACKGROUND_COLOR)) - settings->setValue(BACKGROUND_COLOR, QColor(40, 40, 40)); if (!settings->contains(SHOW_TOOLBARS)) settings->setValue(SHOW_TOOLBARS, true); if (!settings->contains(QUICK_NAVI_MODE)) diff --git a/YACReader/configuration.h b/YACReader/configuration.h index 2845b1227..2556b6fba 100644 --- a/YACReader/configuration.h +++ b/YACReader/configuration.h @@ -1,15 +1,16 @@ #ifndef __CONFIGURATION_H #define __CONFIGURATION_H +#include "resize_image.h" +#include "yacreader_global_gui.h" + #include -#include -#include -#include #include -#include #include - -#include "yacreader_global_gui.h" +#include +#include +#include +#include #define CONF_FILE_PATH "." #define SLIDE_ASPECT_RATIO 1.585 @@ -82,11 +83,13 @@ class Configuration : public QObject void setDoublePage(bool b) { settings->setValue(DOUBLE_PAGE, b); } bool getDoubleMangaPage() { return settings->value(DOUBLE_MANGA_PAGE).toBool(); } void setDoubleMangaPage(bool b) { settings->setValue(DOUBLE_MANGA_PAGE, b); } + bool getContinuousScroll() { return settings->value(CONTINUOUS_SCROLL, false).toBool(); } + void setContinuousScroll(bool b) { settings->setValue(CONTINUOUS_SCROLL, b); } bool getEnlargeImages() { return settings->value(ENLARGE_IMAGES, true).toBool(); } void setEnlargeImages(bool b) { settings->setValue(ENLARGE_IMAGES, b); } - QColor getBackgroundColor() { return settings->value(BACKGROUND_COLOR).value(); } - void setBackgroundColor(const QColor &color) { settings->value(BACKGROUND_COLOR, color); } + QColor getBackgroundColor(const QColor &color) { return settings->value(BACKGROUND_COLOR, color).value(); } + void setBackgroundColor(const QColor &color) { settings->setValue(BACKGROUND_COLOR, color); } bool getShowToolbars() { return settings->value(SHOW_TOOLBARS).toBool(); } void setShowToolbars(bool b) { settings->setValue(SHOW_TOOLBARS, b); } bool getShowInformation() { return settings->value(SHOW_INFO, false).toBool(); } @@ -115,6 +118,9 @@ class Configuration : public QObject MouseMode getMouseMode() { return static_cast(settings->value(MOUSE_MODE, MouseMode::Normal).toInt()); } void setMouseMode(MouseMode mouseMode) { settings->setValue(MOUSE_MODE, static_cast(mouseMode)); } + + ScaleMethod getScalingMethod() { return static_cast(settings->value(SCALING_METHOD, static_cast(ScaleMethod::Lanczos)).toInt()); } + void setScalingMethod(ScaleMethod method) { settings->setValue(SCALING_METHOD, static_cast(method)); } }; } diff --git a/YACReader/continuous_page_widget.cpp b/YACReader/continuous_page_widget.cpp new file mode 100644 index 000000000..e3c9cc722 --- /dev/null +++ b/YACReader/continuous_page_widget.cpp @@ -0,0 +1,205 @@ +#include "continuous_page_widget.h" + +#include "configuration.h" +#include "continuous_view_model.h" +#include "render.h" +#include "resize_image.h" + +#include +#include + +ContinuousPageWidget::ContinuousPageWidget(QWidget *parent) + : QWidget(parent) +{ + QSizePolicy sp(QSizePolicy::Preferred, QSizePolicy::Preferred); + sp.setHeightForWidth(true); + setSizePolicy(sp); + setMouseTracking(true); + initTheme(this); +} + +void ContinuousPageWidget::applyTheme(const Theme &) +{ + update(); +} + +void ContinuousPageWidget::setRender(Render *r) +{ + render = r; +} + +void ContinuousPageWidget::setViewModel(ContinuousViewModel *viewModel) +{ + if (continuousViewModel == viewModel) { + return; + } + + if (continuousViewModel) { + disconnect(continuousViewModel, &ContinuousViewModel::stateChanged, this, QOverload<>::of(&ContinuousPageWidget::update)); + } + + continuousViewModel = viewModel; + + if (continuousViewModel) { + connect(continuousViewModel, &ContinuousViewModel::stateChanged, this, QOverload<>::of(&ContinuousPageWidget::update)); + } + + updateGeometry(); + scaledPageCache.invalidateAll(); + update(); +} + +void ContinuousPageWidget::reset() +{ + setMinimumHeight(0); + setMaximumHeight(QWIDGETSIZE_MAX); + scaledPageCache.invalidateAll(); + updateGeometry(); + update(); +} + +bool ContinuousPageWidget::hasHeightForWidth() const +{ + return true; +} + +int ContinuousPageWidget::heightForWidth(int w) const +{ + if (!continuousViewModel || w <= 0) { + return 0; + } + Q_UNUSED(w) + return continuousViewModel->totalHeight(); +} + +QSize ContinuousPageWidget::sizeHint() const +{ + if (!continuousViewModel) { + return QSize(800, 0); + } + return QSize(width(), continuousViewModel->totalHeight()); +} + +void ContinuousPageWidget::invalidateScaledImageCache() +{ + scaledPageCache.invalidateAll(); + update(); +} + +void ContinuousPageWidget::onPageAvailable(int absolutePageIndex) +{ + if (!render || !continuousViewModel || absolutePageIndex < 0 || absolutePageIndex >= continuousViewModel->numPages()) { + return; + } + + const QImage *img = render->bufferedImage(absolutePageIndex); + if (!img || img->isNull()) { + return; + } + + scaledPageCache.invalidatePage(absolutePageIndex); + + // repaint the region where this page lives + if (absolutePageIndex < continuousViewModel->numPages()) { + QSize scaled = continuousViewModel->scaledPageSize(absolutePageIndex); + const int y = continuousViewModel->yPositionForPage(absolutePageIndex); + int x = (width() - scaled.width()) / 2; + if (x < 0) { + x = 0; + } + QRect pageRect(x, y, scaled.width(), scaled.height()); + update(pageRect); + } +} + +void ContinuousPageWidget::paintEvent(QPaintEvent *event) +{ + if (!continuousViewModel || continuousViewModel->numPages() == 0 || !render) { + return; + } + + QPainter painter(this); + const qreal dpr = devicePixelRatioF(); + const int effectivePixelWidth = std::max(1, qRound(width() * dpr)); + scaledPageCache.invalidateForWidth(effectivePixelWidth); + + QRect visibleRect = event->rect(); + int firstPage = continuousViewModel->pageAtY(visibleRect.top()); + int lastPage = continuousViewModel->pageAtY(visibleRect.bottom()); + firstPage = qBound(0, firstPage, continuousViewModel->numPages() - 1); + lastPage = qBound(0, lastPage, continuousViewModel->numPages() - 1); + + const int cacheMin = std::max(0, firstPage - 1); + const int cacheMax = std::min(continuousViewModel->numPages() - 1, lastPage + 1); + scaledPageCache.keepOnlyRange(cacheMin, cacheMax); + + int w = width(); + for (int i = firstPage; i <= lastPage && i < continuousViewModel->numPages(); ++i) { + int y = continuousViewModel->yPositionForPage(i); + QSize scaled = continuousViewModel->scaledPageSize(i); + // center horizontally if page is narrower than widget + int x = (w - scaled.width()) / 2; + if (x < 0) { + x = 0; + } + QRect pageRect(x, y, scaled.width(), scaled.height()); + + const QImage *img = render->bufferedImage(i); + if (img && !img->isNull()) { + const QImage *drawable = scaledImageForPaint(i, img, scaled, effectivePixelWidth, dpr); + if (drawable) { + painter.drawImage(pageRect, *drawable); + } + } else { + // placeholder + painter.fillRect(pageRect, QColor(45, 45, 45)); + painter.setPen(theme.viewer.defaultTextColor); + painter.drawText(pageRect, Qt::AlignCenter, tr("Loading page %1").arg(i + 1)); + } + } +} + +void ContinuousPageWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + if (continuousViewModel) { + continuousViewModel->setViewportSize(width(), continuousViewModel->viewportHeight()); + } +} + +const QImage *ContinuousPageWidget::scaledImageForPaint(int pageIndex, const QImage *source, const QSize &targetSize, int effectiveWidth, qreal devicePixelRatio) +{ + if (!source || source->isNull() || targetSize.isEmpty()) { + return nullptr; + } + + const qreal dpr = std::max(1.0, devicePixelRatio); + const QSize targetPixelSize(std::max(1, qRound(targetSize.width() * dpr)), + std::max(1, qRound(targetSize.height() * dpr))); + + scaledPageCache.invalidateForWidth(effectiveWidth); + + auto it = scaledPageCache.pages.find(pageIndex); + const qint64 sourceKey = source->cacheKey(); + + if (it != scaledPageCache.pages.end()) { + const ScaledPageCacheEntry &entry = it.value(); + const bool validEntry = entry.sourceCacheKey == sourceKey && entry.sourceSize == source->size() && entry.targetSize == targetSize && entry.targetPixelSize == targetPixelSize && qFuzzyCompare(entry.targetDevicePixelRatio, dpr) && !entry.scaledImage.isNull(); + if (validEntry) { + return &it.value().scaledImage; + } + } + + ScaledPageCacheEntry entry; + entry.sourceCacheKey = sourceKey; + entry.sourceSize = source->size(); + entry.targetSize = targetSize; + entry.targetPixelSize = targetPixelSize; + entry.targetDevicePixelRatio = dpr; + entry.scaledImage = scaleImage(*source, targetPixelSize.width(), targetPixelSize.height(), + Configuration::getConfiguration().getScalingMethod()); + entry.scaledImage.setDevicePixelRatio(dpr); + scaledPageCache.pages.insert(pageIndex, std::move(entry)); + + return &scaledPageCache.pages[pageIndex].scaledImage; +} diff --git a/YACReader/continuous_page_widget.h b/YACReader/continuous_page_widget.h new file mode 100644 index 000000000..aae139234 --- /dev/null +++ b/YACReader/continuous_page_widget.h @@ -0,0 +1,98 @@ +#ifndef CONTINUOUS_PAGE_WIDGET_H +#define CONTINUOUS_PAGE_WIDGET_H + +#include "themable.h" + +#include +#include +#include +#include +#include + +class Render; +class ContinuousViewModel; + +class ContinuousPageWidget : public QWidget, protected Themable +{ + Q_OBJECT +public: + explicit ContinuousPageWidget(QWidget *parent = nullptr); + + void setRender(Render *r); + void setViewModel(ContinuousViewModel *viewModel); + void reset(); + + bool hasHeightForWidth() const override; + int heightForWidth(int w) const override; + QSize sizeHint() const override; + +public slots: + void onPageAvailable(int absolutePageIndex); + void invalidateScaledImageCache(); + +protected: + void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + void applyTheme(const Theme &theme) override; + +private: + struct ScaledPageCacheEntry { + qint64 sourceCacheKey = 0; + QSize sourceSize; + QSize targetSize; + QSize targetPixelSize; + qreal targetDevicePixelRatio = 1.0; + QImage scaledImage; + }; + + struct ScaledPageCache { + int effectiveWidth = -1; + QHash pages; + + void invalidateAll() + { + effectiveWidth = -1; + pages.clear(); + } + + void invalidateForWidth(int width) + { + if (effectiveWidth != width) { + effectiveWidth = width; + pages.clear(); + } + } + + void invalidatePage(int pageIndex) + { + pages.remove(pageIndex); + } + + void keepOnlyRange(int minPageIndex, int maxPageIndex) + { + if (pages.isEmpty()) { + return; + } + + QList keysToRemove; + keysToRemove.reserve(pages.size()); + for (auto it = pages.constBegin(); it != pages.constEnd(); ++it) { + if (it.key() < minPageIndex || it.key() > maxPageIndex) { + keysToRemove.append(it.key()); + } + } + + for (int key : keysToRemove) { + pages.remove(key); + } + } + }; + + const QImage *scaledImageForPaint(int pageIndex, const QImage *source, const QSize &targetSize, int effectiveWidth, qreal devicePixelRatio); + + Render *render = nullptr; + ContinuousViewModel *continuousViewModel = nullptr; + ScaledPageCache scaledPageCache; +}; + +#endif // CONTINUOUS_PAGE_WIDGET_H diff --git a/YACReader/continuous_view_model.cpp b/YACReader/continuous_view_model.cpp new file mode 100644 index 000000000..7e2f55aaf --- /dev/null +++ b/YACReader/continuous_view_model.cpp @@ -0,0 +1,299 @@ +#include "continuous_view_model.h" + +#include +#include + +#include +#include + +ContinuousViewModel::ContinuousViewModel(QObject *parent) + : QObject(parent) +{ +} + +void ContinuousViewModel::reset() +{ + numPagesValue = 0; + pageSizes.clear(); + defaultPageSize = QSize(800, 1200); + scrollYValue = 0; + anchorPage = -1; + layoutSnapshot = LayoutSnapshot(); + emit stateChanged(); +} + +void ContinuousViewModel::setNumPages(int count) +{ + numPagesValue = std::max(0, count); + pageSizes.fill(QSize(0, 0), numPagesValue); + defaultPageSize = QSize(800, 1200); + recompute(RecomputePolicy::PreserveScrollClamped); +} + +void ContinuousViewModel::setZoomFactor(int zoom) +{ + if (zoomFactorValue == zoom) { + return; + } + + zoomFactorValue = zoom; + recompute(RecomputePolicy::PreserveViewportAnchor); +} + +void ContinuousViewModel::setViewportSize(int width, int height) +{ + width = std::max(0, width); + height = std::max(0, height); + + if (viewportWidth == width && viewportHeightValue == height) { + return; + } + + viewportWidth = width; + viewportHeightValue = height; + recompute(RecomputePolicy::PreserveViewportAnchor); +} + +void ContinuousViewModel::setScrollYFromUser(int scrollY) +{ + scrollYValue = std::max(0, scrollY); + recompute(RecomputePolicy::PreserveScrollClamped); +} + +void ContinuousViewModel::setAnchorPage(int page) +{ + if (page < 0 || page >= numPagesValue) { + return; + } + + anchorPage = page; +} + +void ContinuousViewModel::setCurrentPage(int page) +{ + if (page < 0 || page >= numPagesValue) { + return; + } + + anchorPage = page; + recompute(RecomputePolicy::ScrollToPageTop, page); +} + +void ContinuousViewModel::setPageNaturalSize(int pageIndex, const QSize &size) +{ + if (pageIndex < 0 || pageIndex >= numPagesValue || size.isEmpty()) { + return; + } + + if (defaultPageSize == QSize(800, 1200)) { + defaultPageSize = size; + } + + if (pageSizes[pageIndex] == size) { + return; + } + + pageSizes[pageIndex] = size; + recompute(RecomputePolicy::PreserveViewportAnchor); +} + +int ContinuousViewModel::numPages() const +{ + return numPagesValue; +} + +int ContinuousViewModel::totalHeight() const +{ + return layoutSnapshot.totalHeight; +} + +int ContinuousViewModel::scrollY() const +{ + return scrollYValue; +} + +int ContinuousViewModel::viewportHeight() const +{ + return viewportHeightValue; +} + +int ContinuousViewModel::zoomFactor() const +{ + return zoomFactorValue; +} + +int ContinuousViewModel::centerPage() const +{ + const int centerY = scrollYValue + std::max(0, viewportHeightValue / 2); + return pageAtY(centerY); +} + +int ContinuousViewModel::yPositionForPage(int pageIndex) const +{ + if (pageIndex < 0 || pageIndex >= layoutSnapshot.yPositions.size()) { + return 0; + } + + return layoutSnapshot.yPositions[pageIndex]; +} + +int ContinuousViewModel::pageAtY(int y) const +{ + return pageAtY(layoutSnapshot, y); +} + +QSize ContinuousViewModel::scaledPageSize(int pageIndex) const +{ + if (pageIndex < 0 || pageIndex >= layoutSnapshot.scaledSizes.size()) { + return QSize(); + } + + return layoutSnapshot.scaledSizes[pageIndex]; +} + +void ContinuousViewModel::recompute(RecomputePolicy policy, int targetPage) +{ + const LayoutSnapshot oldSnapshot = layoutSnapshot; + + const int effectiveWidth = viewportWidth > 0 ? viewportWidth : defaultPageSize.width(); + + ViewportAnchor anchor; + if (policy == RecomputePolicy::PreserveViewportAnchor) { + if (!oldSnapshot.yPositions.isEmpty() && viewportHeightValue > 0) { + anchor = anchorFromViewport(oldSnapshot, scrollYValue, viewportHeightValue); + } else if (anchorPage >= 0) { + anchor.pageIndex = anchorPage; + anchor.offsetRatio = 0.5f; + anchor.valid = true; + } + } + + layoutSnapshot = buildLayoutSnapshot(effectiveWidth); + + if (policy == RecomputePolicy::ScrollToPageTop) { + scrollYValue = yPositionForPage(targetPage); + } else if (policy == RecomputePolicy::PreserveViewportAnchor && anchor.valid && viewportHeightValue > 0) { + scrollYValue = resolveAnchorToScrollY(layoutSnapshot, anchor, viewportHeightValue); + } + + scrollYValue = qBound(0, scrollYValue, maxScrollFor(layoutSnapshot)); + + emit stateChanged(); +} + +ContinuousViewModel::LayoutSnapshot ContinuousViewModel::buildLayoutSnapshot(int width) const +{ + LayoutSnapshot snapshot; + + if (numPagesValue <= 0 || width <= 0) { + return snapshot; + } + + snapshot.yPositions.resize(numPagesValue); + snapshot.scaledSizes.resize(numPagesValue); + + qint64 y = 0; + for (int i = 0; i < numPagesValue; ++i) { + snapshot.yPositions[i] = static_cast(std::min(y, std::numeric_limits::max())); + QSize scaled = scaledPageSizeForWidth(i, width); + scaled.setWidth(std::max(1, scaled.width())); + scaled.setHeight(std::max(1, scaled.height())); + snapshot.scaledSizes[i] = scaled; + y += scaled.height(); + } + + snapshot.totalHeight = static_cast(std::min(y, static_cast(QWIDGETSIZE_MAX))); + return snapshot; +} + +ContinuousViewModel::ViewportAnchor ContinuousViewModel::anchorFromViewport(const LayoutSnapshot &snapshot, int scrollY, int viewportHeight) const +{ + ViewportAnchor anchor; + + if (snapshot.yPositions.isEmpty() || viewportHeight <= 0) { + return anchor; + } + + const int maxScroll = std::max(0, snapshot.totalHeight - viewportHeight); + const int clampedScroll = qBound(0, scrollY, maxScroll); + const int anchorY = clampedScroll + viewportHeight / 2; + const int page = pageAtY(snapshot, anchorY); + + if (page < 0 || page >= snapshot.scaledSizes.size()) { + return anchor; + } + + const int pageTop = snapshot.yPositions[page]; + const int pageHeight = std::max(1, snapshot.scaledSizes[page].height()); + const float ratio = static_cast(anchorY - pageTop) / static_cast(pageHeight); + + anchor.pageIndex = page; + anchor.offsetRatio = qBound(0.0f, ratio, 1.0f); + anchor.valid = true; + return anchor; +} + +int ContinuousViewModel::resolveAnchorToScrollY(const LayoutSnapshot &snapshot, const ViewportAnchor &anchor, int viewportHeight) const +{ + if (!anchor.valid || viewportHeight <= 0 || snapshot.yPositions.isEmpty()) { + return 0; + } + + if (anchor.pageIndex < 0 || anchor.pageIndex >= snapshot.yPositions.size() || anchor.pageIndex >= snapshot.scaledSizes.size()) { + return 0; + } + + const int pageTop = snapshot.yPositions[anchor.pageIndex]; + const int pageHeight = std::max(1, snapshot.scaledSizes[anchor.pageIndex].height()); + const int anchorY = pageTop + qRound(anchor.offsetRatio * pageHeight); + const int maxScroll = std::max(0, snapshot.totalHeight - viewportHeight); + const int target = anchorY - viewportHeight / 2; + return qBound(0, target, maxScroll); +} + +int ContinuousViewModel::pageAtY(const LayoutSnapshot &snapshot, int y) const +{ + if (snapshot.yPositions.isEmpty()) { + return 0; + } + + auto it = std::upper_bound(snapshot.yPositions.constBegin(), snapshot.yPositions.constEnd(), y); + if (it == snapshot.yPositions.constBegin()) { + return 0; + } + + --it; + return static_cast(it - snapshot.yPositions.constBegin()); +} + +int ContinuousViewModel::maxScrollFor(const LayoutSnapshot &snapshot) const +{ + return std::max(0, snapshot.totalHeight - viewportHeightValue); +} + +QSize ContinuousViewModel::scaledPageSizeForWidth(int pageIndex, int width) const +{ + QSize natural = (pageIndex < pageSizes.size() && pageSizes[pageIndex].width() > 0 && pageSizes[pageIndex].height() > 0) + ? pageSizes[pageIndex] + : defaultPageSize; + + const float scale = scaleForPage(pageIndex, width); + const int scaledW = std::max(1, qRound(natural.width() * scale)); + const int scaledH = std::max(1, qRound(natural.height() * scale)); + return QSize(scaledW, scaledH); +} + +float ContinuousViewModel::scaleForPage(int pageIndex, int width) const +{ + QSize natural = (pageIndex < pageSizes.size() && pageSizes[pageIndex].width() > 0 && pageSizes[pageIndex].height() > 0) + ? pageSizes[pageIndex] + : defaultPageSize; + + if (natural.width() <= 0 || width <= 0) { + return 1.0f; + } + + const float baseScale = static_cast(width) / natural.width(); + const float zoomMultiplier = zoomFactorValue / 100.0f; + return baseScale * zoomMultiplier; +} diff --git a/YACReader/continuous_view_model.h b/YACReader/continuous_view_model.h new file mode 100644 index 000000000..228de7ac5 --- /dev/null +++ b/YACReader/continuous_view_model.h @@ -0,0 +1,79 @@ +#ifndef CONTINUOUS_VIEW_MODEL_H +#define CONTINUOUS_VIEW_MODEL_H + +#include +#include +#include + +class ContinuousViewModel : public QObject +{ + Q_OBJECT +public: + explicit ContinuousViewModel(QObject *parent = nullptr); + + void reset(); + + void setNumPages(int count); + void setZoomFactor(int zoom); + void setViewportSize(int width, int height); + void setScrollYFromUser(int scrollY); + void setAnchorPage(int page); + void setCurrentPage(int page); + void setPageNaturalSize(int pageIndex, const QSize &size); + + int numPages() const; + int totalHeight() const; + int scrollY() const; + int viewportHeight() const; + int zoomFactor() const; + + int centerPage() const; + int yPositionForPage(int pageIndex) const; + int pageAtY(int y) const; + QSize scaledPageSize(int pageIndex) const; + +signals: + void stateChanged(); + +private: + struct LayoutSnapshot { + QVector yPositions; + QVector scaledSizes; + int totalHeight = 0; + }; + + struct ViewportAnchor { + int pageIndex = -1; + float offsetRatio = 0.0f; + bool valid = false; + }; + + enum class RecomputePolicy { + PreserveViewportAnchor, + PreserveScrollClamped, + ScrollToPageTop + }; + + void recompute(RecomputePolicy policy, int targetPage = -1); + LayoutSnapshot buildLayoutSnapshot(int width) const; + ViewportAnchor anchorFromViewport(const LayoutSnapshot &snapshot, int scrollY, int viewportHeight) const; + int resolveAnchorToScrollY(const LayoutSnapshot &snapshot, const ViewportAnchor &anchor, int viewportHeight) const; + int pageAtY(const LayoutSnapshot &snapshot, int y) const; + int maxScrollFor(const LayoutSnapshot &snapshot) const; + QSize scaledPageSizeForWidth(int pageIndex, int width) const; + float scaleForPage(int pageIndex, int width) const; + + int numPagesValue = 0; + QVector pageSizes; + QSize defaultPageSize { 800, 1200 }; + + int zoomFactorValue = 100; + int viewportWidth = 0; + int viewportHeightValue = 0; + int scrollYValue = 0; + int anchorPage = -1; + + LayoutSnapshot layoutSnapshot; +}; + +#endif // CONTINUOUS_VIEW_MODEL_H diff --git a/YACReader/goto_dialog.cpp b/YACReader/goto_dialog.cpp index 537ab9104..d0c5b12ed 100644 --- a/YACReader/goto_dialog.cpp +++ b/YACReader/goto_dialog.cpp @@ -1,13 +1,14 @@ #include "goto_dialog.h" #include -#include #include +#include GoToDialog::GoToDialog(QWidget *parent) : QDialog(parent) { setupUI(); + initTheme(this); } void GoToDialog::setupUI() @@ -42,9 +43,7 @@ void GoToDialog::setupUI() mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - auto imgLabel = new QLabel(); - QPixmap p(":/images/goto.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); @@ -78,3 +77,8 @@ void GoToDialog::open() pageNumber->setFocus(); QDialog::open(); } + +void GoToDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.goToDialogIcon); +} diff --git a/YACReader/goto_dialog.h b/YACReader/goto_dialog.h index 3e16a9740..339104d17 100644 --- a/YACReader/goto_dialog.h +++ b/YACReader/goto_dialog.h @@ -1,21 +1,27 @@ #ifndef __GOTODIALOG_H #define __GOTODIALOG_H +#include "themable.h" + #include +#include #include #include #include -#include -class GoToDialog : public QDialog +class GoToDialog : public QDialog, protected Themable { Q_OBJECT public: GoToDialog(QWidget *parent = nullptr); +protected: + void applyTheme(const Theme &theme) override; + private: QLabel *numPagesLabel; QLabel *textLabel; + QLabel *imgLabel; QLineEdit *pageNumber; QIntValidator *v; QPushButton *accept; diff --git a/YACReader/goto_flow.cpp b/YACReader/goto_flow.cpp deleted file mode 100644 index 96e42e84f..000000000 --- a/YACReader/goto_flow.cpp +++ /dev/null @@ -1,297 +0,0 @@ -#include "goto_flow.h" -#include "configuration.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "yacreader_flow.h" - -#include "goto_flow_toolbar.h" - -GoToFlow::GoToFlow(QWidget *parent, FlowType flowType) - : GoToFlowWidget(parent), ready(false) -{ - updateTimer = new QTimer; - connect(updateTimer, &QTimer::timeout, this, &GoToFlow::updateImageData); - - worker = new PageLoader(&mutexGoToFlow); - - flow = new YACReaderFlow(this, flowType); - flow->setReflectionEffect(PictureFlow::PlainReflection); - imageSize = Configuration::getConfiguration().getGotoSlideSize(); - - flow->setSlideSize(imageSize); - connect(flow, &PictureFlow::centerIndexChanged, this, &GoToFlowWidget::setPageNumber); - connect(flow, &YACReaderFlow::selected, this, &GoToFlow::goToPage); - connect(flow, &PictureFlow::centerIndexChanged, this, &GoToFlow::preload); - connect(flow, &PictureFlow::centerIndexChangedSilent, this, &GoToFlow::preload); - - connect(toolBar, &GoToFlowToolBar::goToPage, this, &GoToFlow::goToPage); - connect(toolBar, &GoToFlowToolBar::setCenter, flow, &PictureFlow::showSlide); - - mainLayout->addWidget(flow); - toolBar->raise(); - - resize(static_cast(5 * imageSize.width()), toolBar->height() + static_cast(imageSize.height() * 1.7)); - - this->setCursor(QCursor(Qt::ArrowCursor)); -} - -GoToFlow::~GoToFlow() -{ - delete flow; - delete updateTimer; - worker->deleteLater(); -} - -void GoToFlow::keyPressEvent(QKeyEvent *event) -{ - switch (event->key()) { - case Qt::Key_Left: - case Qt::Key_Right: - case Qt::Key_Up: - QApplication::sendEvent(flow, event); - return; - default: - break; - } - - GoToFlowWidget::keyPressEvent(event); -} - -void GoToFlow::resizeEvent(QResizeEvent *event) -{ - QWidget::resizeEvent(event); - - toolBar->move(0, event->size().height() - toolBar->height()); - toolBar->setFixedWidth(width()); -} - -void GoToFlow::centerSlide(int slide) -{ - if (flow->centerIndex() != slide) { - flow->setCenterIndex(slide); - if (ready) // load images if pages are loaded. - { - // worker->reset(); //BUG FIXED : image didn't load if worker was working - preload(); - } - } -} - -void GoToFlow::setNumSlides(unsigned int slides) -{ - // numPagesLabel->setText(tr("Total pages : ")+QString::number(slides)); - // numPagesLabel->adjustSize(); - imagesReady.clear(); - imagesReady.fill(false, slides); - - rawImages.clear(); - rawImages.resize(slides); - - toolBar->setTop(slides); - - imagesLoaded.clear(); - imagesLoaded.fill(false, slides); - - imagesSetted.clear(); - imagesSetted.fill(false, slides); - - numImagesLoaded = 0; - - ready = true; - worker->reset(); - - flow->clear(); - for (unsigned int i = 0; i < slides; i++) - flow->addSlide(QImage()); - flow->setCenterIndex(0); -} - -void GoToFlow::reset() -{ - updateTimer->stop(); - /*imagesLoaded.clear(); - numImagesLoaded = 0; - imagesReady.clear(); - rawImages.clear();*/ - ready = false; -} - -void GoToFlow::setImageReady(int index, const QByteArray &image) -{ - rawImages[index] = image; - imagesReady[index] = true; - preload(); -} - -void GoToFlow::preload() -{ - if (numImagesLoaded < imagesLoaded.size()) - updateTimer->start(30); // TODO comprobar rendimiento, antes era 70 -} - -void GoToFlow::updateImageData() -{ - // can't do anything, wait for the next possibility - if (worker->busy()) - return; - - // set image of last one - int idx = worker->index(); - if (idx >= 0 && !worker->result().isNull()) { - if (!imagesSetted[idx]) { - flow->setSlide(idx, worker->result()); - imagesSetted[idx] = true; - numImagesLoaded++; - rawImages[idx].clear(); - ; // release memory - imagesLoaded[idx] = true; - } - } - - // try to load only few images on the left and right side - // i.e. all visible ones plus some extra -#define COUNT 8 - int indexes[2 * COUNT + 1]; - int center = flow->centerIndex(); - indexes[0] = center; - for (int j = 0; j < COUNT; j++) { - indexes[j * 2 + 1] = center + j + 1; - indexes[j * 2 + 2] = center - j - 1; - } - for (int c = 0; c < 2 * COUNT + 1; c++) { - int i = indexes[c]; - if ((i >= 0) && (i < flow->slideCount())) - if (!imagesLoaded[i] && imagesReady[i]) // slide(i).isNull()) - { - // schedule thumbnail generation - - worker->generate(i, flow->slideSize(), rawImages[i]); - return; - } - } - - // no need to generate anything? stop polling... - updateTimer->stop(); -} - -void GoToFlow::wheelEvent(QWheelEvent *event) -{ - if (event->angleDelta().y() < 0) - flow->showNext(); - else - flow->showPrevious(); - event->accept(); -} - -void GoToFlow::setFlowType(YACReader::FlowType flowType) -{ - flow->setFlowType(flowType); -} - -void GoToFlow::updateConfig(QSettings *settings) -{ - GoToFlowWidget::updateConfig(settings); - - imageSize = Configuration::getConfiguration().getGotoSlideSize(); - flow->setFlowType(Configuration::getConfiguration().getFlowType()); - resize(5 * imageSize.width(), toolBar->height() + imageSize.height() * 1.7); - updateSize(); -} - -void GoToFlow::setFlowRightToLeft(bool b) -{ - flow->setFlowRightToLeft(b); -} - -//----------------------------------------------------------------------------- -// PageLoader -//----------------------------------------------------------------------------- - -PageLoader::PageLoader(QMutex *m) - : QThread(), mutex(m), restart(false), working(false), idx(-1) -{ -} - -PageLoader::~PageLoader() -{ - // TODO this destructor never runs. If it is ever called, it will hang, because - // the implementation is broken due to the absolutely endless loop in run(). - mutex->lock(); - condition.wakeOne(); - mutex->unlock(); - wait(); -} - -bool PageLoader::busy() const -{ - return isRunning() ? working.load() : false; -} - -void PageLoader::generate(int index, QSize size, const QByteArray &rImage) -{ - mutex->lock(); - this->idx = index; - // this->img = QImage(); - this->size = size; - this->rawImage = rImage; - mutex->unlock(); - - if (!isRunning()) - start(); - else { - mutex->lock(); - // already running, wake up whenever ready - restart = true; - condition.wakeOne(); - mutex->unlock(); - } -} - -void PageLoader::run() -{ - for (;;) { - // copy necessary data - mutex->lock(); - this->working = true; - // int idx = this->idx; - - QImage image; - image.loadFromData(this->rawImage); - // let everyone knows it is ready - image = image.scaled(this->size, Qt::KeepAspectRatio, Qt::SmoothTransformation); - - mutex->unlock(); - - mutex->lock(); - this->img = image; - this->working = false; - mutex->unlock(); - - // put to sleep - mutex->lock(); - while (!this->restart) - condition.wait(mutex); - restart = false; - mutex->unlock(); - } -} diff --git a/YACReader/goto_flow.h b/YACReader/goto_flow.h deleted file mode 100644 index 14b52929c..000000000 --- a/YACReader/goto_flow.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef __GOTO_FLOW_H -#define __GOTO_FLOW_H - -#include "goto_flow_widget.h" -#include "yacreader_global_gui.h" - -#include - -#include -#include - -#include - -class QLineEdit; -class QPushButton; -class QPixmap; -class QThread; -class QSize; -class QIntValidator; -class QWaitCondition; -class QEvent; -class QLabel; - -class Comic; -class PageLoader; -class YACReaderFlow; -class PictureFlow; -class QKeyEvent; - -class GoToFlow : public GoToFlowWidget -{ - Q_OBJECT -public: - GoToFlow(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); - ~GoToFlow() override; - bool ready; // comic is ready for read. -private: - YACReaderFlow *flow; - void keyPressEvent(QKeyEvent *event) override; - // Comic * comic; - QSize imageSize; - - QVector imagesLoaded; - QVector imagesSetted; - int numImagesLoaded; - QVector imagesReady; - QVector rawImages; - QTimer *updateTimer; - PageLoader *worker; - void wheelEvent(QWheelEvent *event) override; - QMutex mutexGoToFlow; - -private slots: - void preload(); - void updateImageData(); - void resizeEvent(QResizeEvent *event) override; - -public slots: - void centerSlide(int slide) override; - void reset() override; - void setNumSlides(unsigned int slides) override; - void setImageReady(int index, const QByteArray &image) override; - void setFlowType(YACReader::FlowType flowType) override; - void updateConfig(QSettings *settings) override; - void setFlowRightToLeft(bool b) override; -}; - -//----------------------------------------------------------------------------- -// PageLoader -//----------------------------------------------------------------------------- -class PageLoader : public QThread -{ -public: - PageLoader(QMutex *m); - ~PageLoader() override; - // returns FALSE if worker is still busy and can't take the task - bool busy() const; - void generate(int index, QSize size, const QByteArray &rImage); - void reset() { idx = -1; }; - int index() const { return idx; } - QImage result() const { return img; } - -protected: - void run() override; - -private: - QMutex *mutex; - QWaitCondition condition; - - bool restart; - std::atomic working; - int idx; - - QSize size; - QImage img; - QByteArray rawImage; -}; - -#endif diff --git a/YACReader/goto_flow_gl.cpp b/YACReader/goto_flow_gl.cpp deleted file mode 100644 index 323e368d6..000000000 --- a/YACReader/goto_flow_gl.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "goto_flow_gl.h" - -#include -#include -#include -#include -#include -#include - -#include "configuration.h" - -#include "goto_flow_toolbar.h" - -GoToFlowGL::GoToFlowGL(QWidget *parent, FlowType flowType) - : GoToFlowWidget(parent) -{ - Q_UNUSED(flowType) - flow = new YACReaderPageFlowGL(this); - flow->setShowMarks(false); - - imageSize = Configuration::getConfiguration().getGotoSlideSize(); - - flow->setSlideSize(imageSize); - connect(flow, &YACReaderFlowGL::centerIndexChanged, this, &GoToFlowWidget::setPageNumber); - connect(flow, &YACReaderFlowGL::selected, this, &GoToFlowGL::goToPage); - - connect(toolBar, &GoToFlowToolBar::goToPage, this, &GoToFlowGL::goToPage); - connect(toolBar, &GoToFlowToolBar::setCenter, flow, &YACReaderFlowGL::setCenterIndex); - - mainLayout->addWidget(flow); - toolBar->raise(); - - resize(static_cast(5 * imageSize.width()), toolBar->height() + static_cast(imageSize.height() * 1.7)); - - this->setCursor(QCursor(Qt::ArrowCursor)); -} - -GoToFlowGL::~GoToFlowGL() -{ - delete flow; -} - -void GoToFlowGL::reset() -{ - flow->reset(); -} - -void GoToFlowGL::centerSlide(int slide) -{ - if (flow->centerIndex() != slide) { - flow->setCenterIndex(slide); - } -} - -void GoToFlowGL::setFlowType(FlowType flowType) -{ - if (flowType == CoverFlowLike) - flow->setPreset(presetYACReaderFlowClassicConfig); - else if (flowType == Strip) - flow->setPreset(presetYACReaderFlowStripeConfig); - else if (flowType == StripOverlapped) - flow->setPreset(presetYACReaderFlowOverlappedStripeConfig); - else - flow->setPreset(defaultYACReaderFlowConfig); -} - -void GoToFlowGL::setNumSlides(unsigned int slides) -{ - flow->populate(slides); - toolBar->setTop(slides); -} -void GoToFlowGL::setImageReady(int index, const QByteArray &imageData) -{ - flow->rawImages[index] = imageData; - flow->imagesReady[index] = true; -} - -void GoToFlowGL::updateConfig(QSettings *settings) -{ - GoToFlowWidget::updateConfig(settings); - - Performance performance = medium; - switch (settings->value(PERFORMANCE).toInt()) { - case 0: - performance = low; - break; - case 1: - performance = medium; - break; - case 2: - performance = high; - break; - case 3: - performance = ultraHigh; - break; - } - - imageSize = Configuration::getConfiguration().getGotoSlideSize(); - resize(5 * imageSize.width(), toolBar->height() + imageSize.height() * 1.7); - updateSize(); - - flow->setPerformance(performance); - - switch (settings->value(FLOW_TYPE_GL).toInt()) { - case FlowType::CoverFlowLike: - flow->setPreset(presetYACReaderFlowClassicConfig); - break; - case FlowType::Strip: - flow->setPreset(presetYACReaderFlowStripeConfig); - break; - case FlowType::StripOverlapped: - flow->setPreset(presetYACReaderFlowOverlappedStripeConfig); - break; - case FlowType::Modern: - flow->setPreset(defaultYACReaderFlowConfig); - break; - case FlowType::Roulette: - flow->setPreset(pressetYACReaderFlowDownConfig); - break; - case FlowType::Custom: - flow->setCF_RX(settings->value(X_ROTATION).toInt()); - flow->setCF_Y(settings->value(Y_POSITION).toInt()); - flow->setX_Distance(settings->value(COVER_DISTANCE).toInt()); - flow->setCenter_Distance(settings->value(CENTRAL_DISTANCE).toInt()); - flow->setCF_Z(settings->value(ZOOM_LEVEL).toInt()); - flow->setY_Distance(settings->value(Y_COVER_OFFSET).toInt()); - flow->setZ_Distance(settings->value(Z_COVER_OFFSET).toInt()); - flow->setRotation(settings->value(COVER_ROTATION).toInt()); - flow->setFadeOutDist(settings->value(FADE_OUT_DIST).toInt()); - flow->setLightStrenght(settings->value(LIGHT_STRENGTH).toInt()); - flow->setMaxAngle(settings->value(MAX_ANGLE).toInt()); - break; - } - if (Configuration::getConfiguration().getQuickNaviMode()) - flow->setFadeOutDist(20); -} - -void GoToFlowGL::keyPressEvent(QKeyEvent *event) -{ - switch (event->key()) { - case Qt::Key_Left: - case Qt::Key_Right: - case Qt::Key_Up: - QApplication::sendEvent(flow, event); - return; - default: - break; - } - - GoToFlowWidget::keyPressEvent(event); -} - -void GoToFlowGL::resizeEvent(QResizeEvent *event) -{ - QWidget::resizeEvent(event); - - toolBar->move(0, event->size().height() - toolBar->height()); - toolBar->setFixedWidth(width()); -} - -void GoToFlowGL::setFlowRightToLeft(bool b) -{ - flow->setFlowRightToLeft(b); -} diff --git a/YACReader/goto_flow_gl.h b/YACReader/goto_flow_gl.h deleted file mode 100644 index 34ede703d..000000000 --- a/YACReader/goto_flow_gl.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef __GOTO_FLOW_GL_H -#define __GOTO_FLOW_GL_H - -#include "yacreader_global.h" -#include "goto_flow_widget.h" -#include "yacreader_flow_gl.h" - -class QLineEdit; -class QIntValidator; -class QPushButton; -class QPushButton; -class QSize; -class QKeyEvent; - -class GoToFlowGL : public GoToFlowWidget -{ - Q_OBJECT -public: - GoToFlowGL(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); - ~GoToFlowGL() override; - void reset() override; - void centerSlide(int slide) override; - void setFlowType(FlowType flowType) override; - void setNumSlides(unsigned int slides) override; - void setImageReady(int index, const QByteArray &image) override; - - void updateConfig(QSettings *settings) override; - void setFlowRightToLeft(bool b) override; - -private: - YACReaderPageFlowGL *flow; - void keyPressEvent(QKeyEvent *event) override; - void resizeEvent(QResizeEvent *event) override; - // Comic * comic; - QSize imageSize; -}; - -#endif diff --git a/YACReader/goto_flow_toolbar.cpp b/YACReader/goto_flow_toolbar.cpp index bf2b1e9f8..5905d76b8 100644 --- a/YACReader/goto_flow_toolbar.cpp +++ b/YACReader/goto_flow_toolbar.cpp @@ -1,9 +1,16 @@ #include "goto_flow_toolbar.h" -#include - #include "configuration.h" +#include +#include +#include +#include +#include +#include +#include +#include + GoToFlowToolBar::GoToFlowToolBar(QWidget *parent) : QStackedWidget(parent) { @@ -18,59 +25,39 @@ GoToFlowToolBar::GoToFlowToolBar(QWidget *parent) quickNavi->setLayout(naviLayout); slider = new QSlider(Qt::Horizontal, this); - slider->setStyleSheet( - "QSlider::groove:horizontal {" - " border: 1px solid #22FFFFFF;" - " border-radius: 1px;" - " background: #77000000;" - " margin: 2px 0;" - " padding: 1px;" - "}" - "QSlider::handle:horizontal {" - " background: #55FFFFFF;" - " width: 48px;" - " border-radius: 1px;" - "}"); connect(slider, &QSlider::valueChanged, this, &GoToFlowToolBar::setCenter); connect(slider, &QSlider::valueChanged, this, &GoToFlowToolBar::setPage); pageHint = new QLabel("" + tr("Page : ") + "", this); - v = new QIntValidator(this); + v = new QIntValidator(); v->setBottom(1); - edit = new QLineEdit(this); + edit = new QLineEdit(); edit->setValidator(v); edit->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - edit->setStyleSheet("QLineEdit {border: 1px solid #77000000; background: #55000000; color: white; padding: 3px 5px 5px 5px; margin: 13px 5px 12px 5px; font-weight:bold}"); edit->setFixedSize(54, 50); edit->setAttribute(Qt::WA_MacShowFocusRect, false); - // edit->setAttribute(Qt::WA_LayoutUsesWidgetRect,true); - // edit->resize(QSize(54,50)); edit->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); - // edit->setAutoFillBackground(false); connect(edit, &QLineEdit::returnPressed, this, &GoToFlowToolBar::goTo); - QString centerButtonCSS = "QPushButton {background-image: url(:/images/imgCenterSlide.png); width: 100%; height:100%; background-repeat: none; border: none;} " - "QPushButton:focus { border: none; outline: none;}" - "QPushButton:pressed {background-image: url(:/images/imgCenterSlidePressed.png); width: 100%; height:100%; background-repeat: none; border: none;} "; - centerButton = new QPushButton(this); - // centerButton->setIcon(QIcon(":/images/center.png")); - centerButton->setStyleSheet(centerButtonCSS); + centerButton = new QPushButton(); + centerButton->setIconSize(QSize(12, 12)); centerButton->setFixedSize(26, 50); centerButton->setAttribute(Qt::WA_LayoutUsesWidgetRect, true); connect(centerButton, &QAbstractButton::clicked, this, &GoToFlowToolBar::centerSlide); - QString goToButtonCSS = "QPushButton {background-image: url(:/images/imgGoToSlide.png); width: 100%; height:100%; background-repeat: none; border: none;} " - "QPushButton:focus { border: none; outline: none;}" - "QPushButton:pressed {background-image: url(:/images/imgGoToSlidePressed.png); width: 100%; height:100%; background-repeat: none; border: none;} "; - goToButton = new QPushButton(this); - // goToButton->setIcon(QIcon(":/images/goto.png")); - goToButton->setStyleSheet(goToButtonCSS); + goToButton = new QPushButton(); + goToButton->setIconSize(QSize(12, 12)); goToButton->setFixedSize(32, 50); goToButton->setAttribute(Qt::WA_LayoutUsesWidgetRect, true); - connect(goToButton, &QPushButton::clicked, this, &GoToFlowToolBar::goTo); + goToButton2 = new QPushButton(); + goToButton2->setIconSize(QSize(12, 12)); + goToButton2->setFixedSize(32, 50); + goToButton2->setAttribute(Qt::WA_LayoutUsesWidgetRect, true); + connect(goToButton2, &QPushButton::clicked, this, &GoToFlowToolBar::goTo); + normalLayout->setContentsMargins(0, 0, 0, 0); normalLayout->setSpacing(0); normalLayout->addStretch(); @@ -83,17 +70,42 @@ GoToFlowToolBar::GoToFlowToolBar(QWidget *parent) naviLayout->setContentsMargins(5, 0, 0, 0); naviLayout->setSpacing(2); naviLayout->addWidget(slider); - naviLayout->addWidget(goToButton); + naviLayout->addWidget(goToButton2); + + this->addWidget(normal); + this->addWidget(quickNavi); updateOptions(); setFixedHeight(50); + + initTheme(this); +} + +void GoToFlowToolBar::applyTheme(const Theme &theme) +{ + auto goToFlowTheme = theme.goToFlowWidget; + + slider->setStyleSheet(goToFlowTheme.sliderQSS); + edit->setStyleSheet(goToFlowTheme.editQSS); + pageHint->setStyleSheet(goToFlowTheme.labelQSS); + + centerButton->setStyleSheet(goToFlowTheme.buttonQSS); + centerButton->setIcon(goToFlowTheme.centerIcon); + + goToButton->setStyleSheet(goToFlowTheme.buttonQSS); + goToButton->setIcon(goToFlowTheme.goToIcon); + + goToButton2->setStyleSheet(goToFlowTheme.buttonQSS); + goToButton2->setIcon(goToFlowTheme.goToIcon); + + update(); } void GoToFlowToolBar::paintEvent(QPaintEvent *) { QPainter painter(this); - painter.fillRect(0, 0, width(), height(), QColor(0x99000000)); + painter.fillRect(0, 0, width(), height(), theme.goToFlowWidget.toolbarBackgroundColor); } void GoToFlowToolBar::setPage(int pageNumber) diff --git a/YACReader/goto_flow_toolbar.h b/YACReader/goto_flow_toolbar.h index 9368d1cb1..1f87526f1 100644 --- a/YACReader/goto_flow_toolbar.h +++ b/YACReader/goto_flow_toolbar.h @@ -1,8 +1,10 @@ #ifndef GOTO_FLOW_TOOLBAR_H #define GOTO_FLOW_TOOLBAR_H -#include +#include "themable.h" + #include +#include class QLineEdit; class QIntValidator; @@ -10,15 +12,19 @@ class QPushButton; class QSlider; class QLabel; -class GoToFlowToolBar : public QStackedWidget +class GoToFlowToolBar : public QStackedWidget, protected Themable { Q_OBJECT +protected: + void applyTheme(const Theme &theme) override; + private: QLineEdit *edit; QSlider *slider; QIntValidator *v; QPushButton *centerButton; QPushButton *goToButton; + QPushButton *goToButton2; QLabel *pageHint; QWidget *bar; void paintEvent(QPaintEvent *) override; diff --git a/YACReader/goto_flow_widget.cpp b/YACReader/goto_flow_widget.cpp index 0b32bf7dc..8071c6e14 100644 --- a/YACReader/goto_flow_widget.cpp +++ b/YACReader/goto_flow_widget.cpp @@ -1,16 +1,19 @@ #include "goto_flow_widget.h" -#include +#include "configuration.h" +#include "goto_flow_toolbar.h" + +#include +#include #include #include -#include - -#include "goto_flow_toolbar.h" -#include "configuration.h" +#include -GoToFlowWidget::GoToFlowWidget(QWidget *parent) +GoToFlowWidget::GoToFlowWidget(QWidget *parent, FlowType flowType) : QWidget(parent) { + Q_UNUSED(flowType) + mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); @@ -19,19 +22,161 @@ GoToFlowWidget::GoToFlowWidget(QWidget *parent) setLayout(mainLayout); - // toolBar->installEventFilter(this); + flow = new YACReaderPageFlow3D(this); + flow->setShowMarks(false); + + imageSize = Configuration::getConfiguration().getGotoSlideSize(); + + flow->setSlideSize(imageSize); + connect(flow, &YACReaderPageFlow3D::centerIndexChanged, this, &GoToFlowWidget::setPageNumber); + connect(flow, &YACReaderPageFlow3D::selected, this, &GoToFlowWidget::goToPage); + + connect(toolBar, &GoToFlowToolBar::goToPage, this, &GoToFlowWidget::goToPage); + connect(toolBar, &GoToFlowToolBar::setCenter, flow, &YACReaderPageFlow3D::setCenterIndex); + + mainLayout->addWidget(flow); + toolBar->raise(); + + resize(static_cast(5 * imageSize.width()), toolBar->height() + static_cast(imageSize.height() * 1.7)); + + this->setCursor(QCursor(Qt::ArrowCursor)); + + initTheme(this); +} + +void GoToFlowWidget::applyTheme(const Theme &theme) +{ + auto goToFlowTheme = theme.goToFlowWidget; + + flow->setBackgroundColor(goToFlowTheme.flowBackgroundColor); + flow->setTextColor(goToFlowTheme.flowTextColor); +} + +GoToFlowWidget::~GoToFlowWidget() +{ + delete flow; } -GoToFlowWidget::~GoToFlowWidget() { } +void GoToFlowWidget::reset() +{ + flow->reset(); +} + +void GoToFlowWidget::centerSlide(int slide) +{ + if (flow->centerIndex() != slide) { + flow->setCenterIndex(slide); + } +} void GoToFlowWidget::setPageNumber(int page) { toolBar->setPage(page); } +void GoToFlowWidget::setFlowType(FlowType flowType) +{ + if (flowType == CoverFlowLike) + flow->setPreset(presetYACReaderFlowClassicConfig); + else if (flowType == Strip) + flow->setPreset(presetYACReaderFlowStripeConfig); + else if (flowType == StripOverlapped) + flow->setPreset(presetYACReaderFlowOverlappedStripeConfig); + else + flow->setPreset(defaultYACReaderFlowConfig); +} + +void GoToFlowWidget::setNumSlides(unsigned int slides) +{ + flow->populate(slides); + toolBar->setTop(slides); +} + +void GoToFlowWidget::setImageReady(int index, const QByteArray &imageData) +{ + flow->rawImages[index] = imageData; + flow->imagesReady[index] = true; +} + +void GoToFlowWidget::updateSize() +{ + if (Configuration::getConfiguration().getQuickNaviMode() && parentWidget() != nullptr) + resize(parentWidget()->width(), height()); +} + +void GoToFlowWidget::updateConfig(QSettings *settings) +{ + toolBar->updateOptions(); + + Performance performance = medium; + switch (settings->value(PERFORMANCE).toInt()) { + case 0: + performance = low; + break; + case 1: + performance = medium; + break; + case 2: + performance = high; + break; + case 3: + performance = ultraHigh; + break; + } + + imageSize = Configuration::getConfiguration().getGotoSlideSize(); + resize(5 * imageSize.width(), toolBar->height() + imageSize.height() * 1.7); + updateSize(); + + flow->setPerformance(performance); + + switch (settings->value(FLOW_TYPE_GL).toInt()) { + case FlowType::CoverFlowLike: + flow->setPreset(presetYACReaderFlowClassicConfig); + break; + case FlowType::Strip: + flow->setPreset(presetYACReaderFlowStripeConfig); + break; + case FlowType::StripOverlapped: + flow->setPreset(presetYACReaderFlowOverlappedStripeConfig); + break; + case FlowType::Modern: + flow->setPreset(defaultYACReaderFlowConfig); + break; + case FlowType::Roulette: + flow->setPreset(pressetYACReaderFlowDownConfig); + break; + case FlowType::Custom: + flow->setCF_RX(settings->value(X_ROTATION).toInt()); + flow->setCF_Y(settings->value(Y_POSITION).toInt()); + flow->setX_Distance(settings->value(COVER_DISTANCE).toInt()); + flow->setCenter_Distance(settings->value(CENTRAL_DISTANCE).toInt()); + flow->setCF_Z(settings->value(ZOOM_LEVEL).toInt()); + flow->setY_Distance(settings->value(Y_COVER_OFFSET).toInt()); + flow->setZ_Distance(settings->value(Z_COVER_OFFSET).toInt()); + flow->setRotation(settings->value(COVER_ROTATION).toInt()); + flow->setFadeOutDist(settings->value(FADE_OUT_DIST).toInt()); + flow->setLightStrenght(settings->value(LIGHT_STRENGTH).toInt()); + flow->setMaxAngle(settings->value(MAX_ANGLE).toInt()); + break; + } + if (Configuration::getConfiguration().getQuickNaviMode()) + flow->setFadeOutDist(20); +} + +void GoToFlowWidget::setFlowRightToLeft(bool b) +{ + flow->setFlowRightToLeft(b); +} + void GoToFlowWidget::keyPressEvent(QKeyEvent *event) { switch (event->key()) { + case Qt::Key_Left: + case Qt::Key_Right: + case Qt::Key_Up: + QApplication::sendEvent(flow, event); + return; case Qt::Key_Return: case Qt::Key_Enter: toolBar->goTo(); @@ -48,31 +193,10 @@ void GoToFlowWidget::keyPressEvent(QKeyEvent *event) event->accept(); } -void GoToFlowWidget::updateConfig(QSettings *settings) +void GoToFlowWidget::resizeEvent(QResizeEvent *event) { - Q_UNUSED(settings) - toolBar->updateOptions(); -} + QWidget::resizeEvent(event); -void GoToFlowWidget::updateSize() -{ - // called by parent in resizeEvent - // no need to update width when QuickNaviMode disabled - // height is set in updateConfig - if (Configuration::getConfiguration().getQuickNaviMode() && parentWidget() != nullptr) - resize(parentWidget()->width(), height()); + toolBar->move(0, event->size().height() - toolBar->height()); + toolBar->setFixedWidth(width()); } - -/*bool GoToFlowWidget::eventFilter(QObject * target, QEvent * event) -{ - if(event->type() == QEvent::KeyPress) - { - QKeyEvent * e = static_cast(event); - if(e->key()==Qt::Key_S || e->key() == Qt::Key_Space) - { - this->keyPressEvent(e); - return true; - } - } - return QWidget::eventFilter(target,event); -}*/ diff --git a/YACReader/goto_flow_widget.h b/YACReader/goto_flow_widget.h index 1cb26d14b..809673a2e 100644 --- a/YACReader/goto_flow_widget.h +++ b/YACReader/goto_flow_widget.h @@ -1,42 +1,52 @@ #ifndef __GOTO_FLOW_WIDGET_H #define __GOTO_FLOW_WIDGET_H -#include -#include +#include "themable.h" #include "yacreader_global_gui.h" +#include "yacreader_page_flow_rhi.h" + +#include +#include using namespace YACReader; class QSettings; class GoToFlowToolBar; class QVBoxLayout; +class QKeyEvent; -class GoToFlowWidget : public QWidget +class GoToFlowWidget : public QWidget, protected Themable { Q_OBJECT -protected: - QVBoxLayout *mainLayout; - GoToFlowToolBar *toolBar; public: - GoToFlowWidget(QWidget *paret = nullptr); - ~GoToFlowWidget() override = 0; + GoToFlowWidget(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); + ~GoToFlowWidget() override; + public slots: - virtual void reset() = 0; - virtual void centerSlide(int slide) = 0; - virtual void setPageNumber(int page); - virtual void setFlowType(YACReader::FlowType flowType) = 0; - virtual void setNumSlides(unsigned int slides) = 0; - virtual void setImageReady(int index, const QByteArray &image) = 0; - virtual void updateSize(); - virtual void updateConfig(QSettings *settings); - virtual void setFlowRightToLeft(bool b) = 0; + void reset(); + void centerSlide(int slide); + void setPageNumber(int page); + void setFlowType(FlowType flowType); + void setNumSlides(unsigned int slides); + void setImageReady(int index, const QByteArray &image); + void updateSize(); + void updateConfig(QSettings *settings); + void setFlowRightToLeft(bool b); + signals: void goToPage(unsigned int); protected: void keyPressEvent(QKeyEvent *event) override; - // bool eventFilter(QObject *, QEvent *); + void resizeEvent(QResizeEvent *event) override; + void applyTheme(const Theme &theme) override; + +private: + QVBoxLayout *mainLayout; + GoToFlowToolBar *toolBar; + YACReaderPageFlow3D *flow; + QSize imageSize; }; #endif diff --git a/YACReader/magnifying_glass.cpp b/YACReader/magnifying_glass.cpp index 05c919bec..306c48a8f 100644 --- a/YACReader/magnifying_glass.cpp +++ b/YACReader/magnifying_glass.cpp @@ -1,8 +1,6 @@ #include "magnifying_glass.h" -#include "viewer.h" -#include "configuration.h" -#include +#include "viewer.h" MagnifyingGlass::MagnifyingGlass(int w, int h, float zoomLevel, QWidget *parent) : QLabel(parent), zoomLevel(zoomLevel) @@ -32,101 +30,9 @@ void MagnifyingGlass::mouseMoveEvent(QMouseEvent *event) void MagnifyingGlass::updateImage(int x, int y) { - // image section augmented - int zoomWidth = static_cast(width() * zoomLevel); - int zoomHeight = static_cast(height() * zoomLevel); - auto *const p = qobject_cast(parentWidget()); - int currentPos = p->verticalScrollBar()->sliderPosition(); - const QPixmap image = p->pixmap(); - int iWidth = image.width(); - int iHeight = image.height(); - float wFactor = static_cast(iWidth) / p->widget()->width(); - float hFactor = static_cast(iHeight) / p->widget()->height(); - zoomWidth *= wFactor; - zoomHeight *= hFactor; - if (p->verticalScrollBar()->minimum() == p->verticalScrollBar()->maximum()) { - int xp = static_cast(((x - p->widget()->pos().x()) * wFactor) - zoomWidth / 2); - int yp = static_cast((y - p->widget()->pos().y() + currentPos) * hFactor - zoomHeight / 2); - int xOffset = 0; - int yOffset = 0; - int zw = zoomWidth; - int zh = zoomHeight; - // int wOffset,hOffset=0; - bool outImage = false; - if (xp < 0) { - xOffset = -xp; - xp = 0; - zw = zw - xOffset; - outImage = true; - } - if (yp < 0) { - yOffset = -yp; - yp = 0; - zh = zh - yOffset; - outImage = true; - } - - if (xp + zoomWidth >= image.width()) { - zw -= xp + zw - image.width(); - outImage = true; - } - if (yp + zoomHeight >= image.height()) { - zh -= yp + zh - image.height(); - outImage = true; - } - if (outImage) { - QImage img(zoomWidth, zoomHeight, QImage::Format_RGB32); - img.setDevicePixelRatio(devicePixelRatioF()); - img.fill(Configuration::getConfiguration().getBackgroundColor()); - if (zw > 0 && zh > 0) { - QPainter painter(&img); - painter.drawPixmap(xOffset, yOffset, image.copy(xp, yp, zw, zh)); - } - setPixmap(QPixmap().fromImage(img)); - } else - setPixmap(image.copy(xp, yp, zoomWidth, zoomHeight)); - } else { - int xp = static_cast(((x - p->widget()->pos().x()) * wFactor) - zoomWidth / 2); - int yp = static_cast((y + currentPos) * hFactor - zoomHeight / 2); - int xOffset = 0; - int yOffset = 0; - int zw = zoomWidth; - int zh = zoomHeight; - // int wOffset,hOffset=0; - bool outImage = false; - if (xp < 0) { - xOffset = -xp; - xp = 0; - zw = zw - xOffset; - outImage = true; - } - if (yp < 0) { - yOffset = -yp; - yp = 0; - zh = zh - yOffset; - outImage = true; - } - - if (xp + zoomWidth >= image.width()) { - zw -= xp + zw - image.width(); - outImage = true; - } - if (yp + zoomHeight >= image.height()) { - zh -= yp + zh - image.height(); - outImage = true; - } - if (outImage) { - QImage img(zoomWidth, zoomHeight, QImage::Format_RGB32); - img.setDevicePixelRatio(devicePixelRatioF()); - img.fill(Configuration::getConfiguration().getBackgroundColor()); - if (zw > 0 && zh > 0) { - QPainter painter(&img); - painter.drawPixmap(xOffset, yOffset, image.copy(xp, yp, zw, zh)); - } - setPixmap(QPixmap().fromImage(img)); - } else - setPixmap(image.copy(xp, yp, zoomWidth, zoomHeight)); - } + auto *const viewer = qobject_cast(parentWidget()); + QImage img = viewer->grabMagnifiedRegion(QPoint(x, y), size(), zoomLevel); + setPixmap(QPixmap::fromImage(img)); move(static_cast(x - float(width()) / 2), static_cast(y - float(height()) / 2)); } diff --git a/YACReader/magnifying_glass.h b/YACReader/magnifying_glass.h index 33137de0a..d174c93f0 100644 --- a/YACReader/magnifying_glass.h +++ b/YACReader/magnifying_glass.h @@ -2,7 +2,6 @@ #define __MAGNIFYING_GLASS #include -#include #include #include diff --git a/YACReader/main.cpp b/YACReader/main.cpp index 39bbf3eb2..85437d982 100644 --- a/YACReader/main.cpp +++ b/YACReader/main.cpp @@ -1,21 +1,23 @@ +#include "QsLog.h" +#include "QsLogDest.h" +#include "app_language_utils.h" +#include "appearance_configuration.h" +#include "exit_check.h" +#include "main_window_viewer.h" +#include "theme_manager.h" +#include "theme_repository.h" +#include "yacreader_global.h" + #include -#include -#include #include +#include #include -#include "main_window_viewer.h" -#include "configuration.h" -#include "exit_check.h" - -#include "QsLog.h" -#include "QsLogDest.h" - using namespace QsLogging; +using namespace YACReader; #if defined(WIN32) && defined(_DEBUG) #define _CRTDBG_MAP_ALLOC -#include #include #define DEBUG_NEW new (_NORMAL_BLOCK, __FILE__, __LINE__) #define new DEBUG_NEW @@ -90,17 +92,9 @@ int main(int argc, char *argv[]) { qInstallMessageHandler(messageHandler); - static const char ENV_VAR_QT_DEVICE_PIXEL_RATIO[] = "QT_DEVICE_PIXEL_RATIO"; - if (!qEnvironmentVariableIsSet(ENV_VAR_QT_DEVICE_PIXEL_RATIO) && !qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) { - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - } - - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QImageReader::setAllocationLimit(0); -#endif #if defined(_MSC_VER) && defined(_DEBUG) _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); @@ -112,12 +106,15 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); #endif -#ifdef FORCE_ANGLE - app.setAttribute(Qt::AA_UseOpenGLES); -#endif - app.setApplicationName("YACReader"); app.setOrganizationName("YACReader"); + YACReader::initializeSharedPluginPaths(); + + auto *appearanceConfig = new AppearanceConfiguration( + YACReader::getSettingsPath() + "/YACReader.ini", qApp); + auto *themeRepo = new ThemeRepository( + ":/themes", YACReader::getSettingsPath() + "/themes/user", "YACReader"); + ThemeManager::instance().initialize(appearanceConfig, themeRepo); if (QIcon::hasThemeIcon("YACReader")) { app.setWindowIcon(QIcon::fromTheme("YACReader")); @@ -132,16 +129,10 @@ int main(int argc, char *argv[]) QCommandLineOption comicId("comicId", "", "comicId"); QCommandLineOption libraryId("libraryId", "", "libraryId"); QCommandLineOption readingListId("readingListId", "", "readingListId"); -// hide comicId and libraryId from help -#if QT_VERSION >= 0x050800 + // hide comicId and libraryId from help comicId.setFlags(QCommandLineOption::HiddenFromHelp); libraryId.setFlags(QCommandLineOption::HiddenFromHelp); readingListId.setFlags(QCommandLineOption::HiddenFromHelp); -#else - comicId.setHidden(true); - libraryId.setHidden(true); - readingListId.setHidden(true); -#endif // process parser.addOption(comicId); @@ -153,7 +144,7 @@ int main(int argc, char *argv[]) QDir().mkpath(YACReader::getSettingsPath()); Logger &logger = Logger::instance(); - logger.setLoggingLevel(QsLogging::InfoLevel); + logger.setLoggingLevel(QsLogging::TraceLevel); if (parser.isSet("loglevel")) { if (parser.value("loglevel") == "trace") { @@ -177,13 +168,8 @@ int main(int argc, char *argv[]) logger.addDestination(std::move(debugDestination)); logger.addDestination(std::move(fileDestination)); - QTranslator translator; -#if defined Q_OS_UNIX && !defined Q_OS_MACOS - translator.load(QLocale(), "yacreader", "_", QString(DATADIR) + "/yacreader/languages"); -#else - translator.load(QLocale(), "yacreader", "_", "languages"); -#endif - app.installTranslator(&translator); + QSettings uiSettings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat); + YACReader::UiLanguage::applyLanguage("yacreader", uiSettings.value(UI_LANGUAGE).toString()); auto mwv = new MainWindowViewer(); // some arguments need to be parsed after MainWindowViewer creation diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index 2c8331449..6070cd3c2 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -1,50 +1,51 @@ #include "main_window_viewer.h" -#include "configuration.h" -#include "viewer.h" -#include "goto_dialog.h" -#include "custom_widgets.h" -#include "options_dialog.h" + +#include "bookmarks_dialog.h" #include "check_new_version.h" #include "comic.h" -#include "bookmarks_dialog.h" -#include "width_slider.h" -#include "qnaturalsorting.h" -#include "help_about_dialog.h" -#include "yacreader_tool_bar_stretch.h" - #include "comic_db.h" -#include "yacreader_local_client.h" - -#include "yacreader_global.h" +#include "configuration.h" #include "edit_shortcuts_dialog.h" +#include "help_about_dialog.h" +#include "options_dialog.h" +#include "qnaturalsorting.h" #include "shortcuts_manager.h" - +#include "theme_manager.h" +#include "viewer.h" #include "whats_new_controller.h" +#include "width_slider.h" +#include "yacreader_global.h" +#include "yacreader_local_client.h" +#include "yacreader_tool_bar_stretch.h" -#include -#include -#include - +#include #include #include -#include -#include +#include +#include #include -#include #include -#include +#include #include +#include +#include +#include +#include + +#include +#include #ifdef use_unarr #include "unarr.h" #endif MainWindowViewer::MainWindowViewer() - : QMainWindow(), fullscreen(false), toolbars(true), currentDirectory("."), currentDirectoryImgDest("."), isClient(false) + : QMainWindow(), fullscreen(false), toolbars(true), currentDirectory("."), currentDirectoryImgDest("."), openToolButton(nullptr), isClient(false) { loadConfiguration(); setupUI(); afterLaunchTasks(); + initTheme(this); } void MainWindowViewer::afterLaunchTasks() @@ -54,6 +55,68 @@ void MainWindowViewer::afterLaunchTasks() whatsNewController.showWhatsNewIfNeeded(this); } +void MainWindowViewer::applySavedReaderMode() +{ + Configuration &config = Configuration::getConfiguration(); + const bool manga = config.getDoubleMangaPage(); + const bool continuousScroll = config.getContinuousScroll(); + viewer->setMangaWithoutStoringSetting(manga); + viewer->setContinuousScrollWithoutStoringSetting(continuousScroll); + syncModeActions(manga, continuousScroll); +} + +void MainWindowViewer::applyLibraryReaderMode(YACReader::FileType type) +{ + Configuration &config = Configuration::getConfiguration(); + bool manga = false; + bool continuousScroll = config.getContinuousScroll(); + + switch (type) { + case YACReader::FileType::Manga: + manga = true; + break; + case YACReader::FileType::WebComic: + continuousScroll = true; + break; + case YACReader::FileType::Comic: + case YACReader::FileType::WesternManga: + case YACReader::FileType::Yonkoma: + default: + break; + } + + viewer->setMangaWithoutStoringSetting(manga); + viewer->setContinuousScrollWithoutStoringSetting(continuousScroll); + syncModeActions(manga, continuousScroll); +} + +void MainWindowViewer::syncModeActions(bool manga, bool continuousScroll) +{ + doubleMangaPageAction->setChecked(manga); + + if (continuousScroll) { + continuousScrollAction->setChecked(true); + } else { + switch (Configuration::getConfiguration().getFitMode()) { + case YACReader::FitMode::ToWidth: + adjustWidthAction->setChecked(true); + break; + case YACReader::FitMode::ToHeight: + adjustHeightAction->setChecked(true); + break; + case YACReader::FitMode::FullRes: + adjustToFullSizeAction->setChecked(true); + break; + case YACReader::FitMode::FullPage: + default: + fitToPageAction->setChecked(true); + break; + } + } + + doubleMangaPageSwitch(); +} + MainWindowViewer::~MainWindowViewer() { delete settings; @@ -75,6 +138,7 @@ MainWindowViewer::~MainWindowViewer() delete rightRotationAction; delete doublePageAction; delete doubleMangaPageAction; + delete continuousScrollAction; delete increasePageZoomAction; delete decreasePageZoomAction; delete resetZoomAction; @@ -145,7 +209,7 @@ void MainWindowViewer::setupUI() connect(optionsDialog, &QDialog::accepted, viewer, &Viewer::updateOptions); connect(optionsDialog, &YACReaderOptionsDialog::optionsChanged, this, &MainWindowViewer::reloadOptions); connect(optionsDialog, &OptionsDialog::changedFilters, viewer, &Viewer::updateFilters); - connect(optionsDialog, &OptionsDialog::changedImageOptions, viewer, &Viewer::updatePage); + connect(optionsDialog, &OptionsDialog::changedImageOptions, viewer, &Viewer::onImageOptionsChanged); optionsDialog->restoreOptions(settings); // shortcutsDialog = new ShortcutsDialog(this); @@ -185,7 +249,6 @@ void MainWindowViewer::setupUI() void MainWindowViewer::createActions() { openAction = new QAction(tr("&Open"), this); - openAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/open"))); openAction->setToolTip(tr("Open a comic")); openAction->setData(OPEN_ACTION_Y); openAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_ACTION_Y)); @@ -212,7 +275,6 @@ void MainWindowViewer::createActions() #endif openFolderAction = new QAction(tr("Open Folder"), this); - openFolderAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/openFolder"))); openFolderAction->setToolTip(tr("Open image folder")); openFolderAction->setData(OPEN_FOLDER_ACTION_Y); openFolderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_FOLDER_ACTION_Y)); @@ -236,28 +298,24 @@ void MainWindowViewer::createActions() connect(clearRecentFilesAction, &QAction::triggered, this, &MainWindowViewer::clearRecentFiles); saveImageAction = new QAction(tr("Save"), this); - saveImageAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/save"))); saveImageAction->setToolTip(tr("Save current page")); saveImageAction->setData(SAVE_IMAGE_ACTION_Y); saveImageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SAVE_IMAGE_ACTION_Y)); connect(saveImageAction, &QAction::triggered, this, &MainWindowViewer::saveImage); openComicOnTheLeftAction = new QAction(tr("Previous Comic"), this); - openComicOnTheLeftAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/openPrevious"))); openComicOnTheLeftAction->setToolTip(tr("Open previous comic")); openComicOnTheLeftAction->setData(OPEN_PREVIOUS_COMIC_ACTION_Y); openComicOnTheLeftAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_PREVIOUS_COMIC_ACTION_Y)); connect(openComicOnTheLeftAction, &QAction::triggered, this, &MainWindowViewer::openLeftComic); openComicOnTheRightAction = new QAction(tr("Next Comic"), this); - openComicOnTheRightAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/openNext"))); openComicOnTheRightAction->setToolTip(tr("Open next comic")); openComicOnTheRightAction->setData(OPEN_NEXT_COMIC_ACTION_Y); openComicOnTheRightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_NEXT_COMIC_ACTION_Y)); connect(openComicOnTheRightAction, &QAction::triggered, this, &MainWindowViewer::openRightComic); goToPageOnTheLeftAction = new QAction(tr("&Previous"), this); - goToPageOnTheLeftAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/previous"))); goToPageOnTheLeftAction->setShortcutContext(Qt::WidgetShortcut); goToPageOnTheLeftAction->setToolTip(tr("Go to previous page")); goToPageOnTheLeftAction->setData(PREV_ACTION_Y); @@ -265,7 +323,6 @@ void MainWindowViewer::createActions() connect(goToPageOnTheLeftAction, &QAction::triggered, viewer, &Viewer::left); goToPageOnTheRightAction = new QAction(tr("&Next"), this); - goToPageOnTheRightAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/next"))); goToPageOnTheRightAction->setShortcutContext(Qt::WidgetShortcut); goToPageOnTheRightAction->setToolTip(tr("Go to next page")); goToPageOnTheRightAction->setData(NEXT_ACTION_Y); @@ -273,27 +330,20 @@ void MainWindowViewer::createActions() connect(goToPageOnTheRightAction, &QAction::triggered, viewer, &Viewer::right); adjustHeightAction = new QAction(tr("Fit Height"), this); - adjustHeightAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/toHeight"))); - // adjustWidth->setCheckable(true); adjustHeightAction->setToolTip(tr("Fit image to height")); - // adjustWidth->setIcon(QIcon(":/images/fitWidth.svg")); adjustHeightAction->setData(ADJUST_HEIGHT_ACTION_Y); adjustHeightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADJUST_HEIGHT_ACTION_Y)); adjustHeightAction->setCheckable(true); connect(adjustHeightAction, &QAction::triggered, this, &MainWindowViewer::fitToHeight); adjustWidthAction = new QAction(tr("Fit Width"), this); - adjustWidthAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/toWidth"))); - // adjustWidth->setCheckable(true); adjustWidthAction->setToolTip(tr("Fit image to width")); - // adjustWidth->setIcon(QIcon(":/images/fitWidth.svg")); adjustWidthAction->setData(ADJUST_WIDTH_ACTION_Y); adjustWidthAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADJUST_WIDTH_ACTION_Y)); adjustWidthAction->setCheckable(true); connect(adjustWidthAction, &QAction::triggered, this, &MainWindowViewer::fitToWidth); adjustToFullSizeAction = new QAction(tr("Show full size"), this); - adjustToFullSizeAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/full"))); adjustToFullSizeAction->setCheckable(false); adjustToFullSizeAction->setData(ADJUST_TO_FULL_SIZE_ACTION_Y); adjustToFullSizeAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADJUST_TO_FULL_SIZE_ACTION_Y)); @@ -301,34 +351,42 @@ void MainWindowViewer::createActions() connect(adjustToFullSizeAction, &QAction::triggered, this, &MainWindowViewer::adjustToFullSizeSwitch); fitToPageAction = new QAction(tr("Fit to page"), this); - fitToPageAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/fitToPage"))); fitToPageAction->setData(FIT_TO_PAGE_ACTION_Y); fitToPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(FIT_TO_PAGE_ACTION_Y)); fitToPageAction->setCheckable(true); connect(fitToPageAction, &QAction::triggered, this, &MainWindowViewer::fitToPageSwitch); + continuousScrollAction = new QAction(tr("Continuous scroll"), this); + continuousScrollAction->setToolTip(tr("Switch to continuous scroll mode")); + continuousScrollAction->setCheckable(true); + continuousScrollAction->setChecked(Configuration::getConfiguration().getContinuousScroll()); + connect(continuousScrollAction, &QAction::toggled, viewer, &Viewer::setContinuousScroll); + // fit modes have to be exclusive and checkable auto fitModes = new QActionGroup(this); fitModes->addAction(adjustHeightAction); fitModes->addAction(adjustWidthAction); fitModes->addAction(adjustToFullSizeAction); fitModes->addAction(fitToPageAction); + fitModes->addAction(continuousScrollAction); - switch (Configuration::getConfiguration().getFitMode()) { - case YACReader::FitMode::ToWidth: - adjustWidthAction->setChecked(true); - break; - case YACReader::FitMode::ToHeight: - adjustHeightAction->setChecked(true); - break; - case YACReader::FitMode::FullRes: - adjustToFullSizeAction->setChecked(true); - break; - case YACReader::FitMode::FullPage: - fitToPageAction->setChecked(true); - break; - default: - fitToPageAction->setChecked(true); + if (Configuration::getConfiguration().getContinuousScroll()) { + continuousScrollAction->setChecked(true); + } else { + switch (Configuration::getConfiguration().getFitMode()) { + case YACReader::FitMode::ToWidth: + adjustWidthAction->setChecked(true); + break; + case YACReader::FitMode::ToHeight: + adjustHeightAction->setChecked(true); + break; + case YACReader::FitMode::FullRes: + adjustToFullSizeAction->setChecked(true); + break; + case YACReader::FitMode::FullPage: + default: + fitToPageAction->setChecked(true); + } } resetZoomAction = new QAction(tr("Reset zoom"), this); @@ -337,7 +395,6 @@ void MainWindowViewer::createActions() connect(resetZoomAction, &QAction::triggered, this, &MainWindowViewer::resetZoomLevel); showZoomSliderlAction = new QAction(tr("Show zoom slider"), this); - showZoomSliderlAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/zoom"))); increasePageZoomAction = new QAction(tr("Zoom+"), this); increasePageZoomAction->setData(ZOOM_PLUS_ACTION_Y); @@ -350,20 +407,17 @@ void MainWindowViewer::createActions() connect(decreasePageZoomAction, &QAction::triggered, this, &MainWindowViewer::decreasePageZoomLevel); leftRotationAction = new QAction(tr("Rotate image to the left"), this); - leftRotationAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/rotateL"))); leftRotationAction->setData(LEFT_ROTATION_ACTION_Y); leftRotationAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(LEFT_ROTATION_ACTION_Y)); connect(leftRotationAction, &QAction::triggered, viewer, &Viewer::rotateLeft); rightRotationAction = new QAction(tr("Rotate image to the right"), this); - rightRotationAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/rotateR"))); rightRotationAction->setData(RIGHT_ROTATION_ACTION_Y); rightRotationAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(RIGHT_ROTATION_ACTION_Y)); connect(rightRotationAction, &QAction::triggered, viewer, &Viewer::rotateRight); doublePageAction = new QAction(tr("Double page mode"), this); doublePageAction->setToolTip(tr("Switch to double page mode")); - doublePageAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/doublePage"))); doublePageAction->setCheckable(true); doublePageAction->setChecked(Configuration::getConfiguration().getDoublePage()); doublePageAction->setData(DOUBLE_PAGE_ACTION_Y); @@ -373,7 +427,6 @@ void MainWindowViewer::createActions() // inversed pictures mode doubleMangaPageAction = new QAction(tr("Double page manga mode"), this); doubleMangaPageAction->setToolTip(tr("Reverse reading order in double page mode")); - doubleMangaPageAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/doubleMangaPage"))); doubleMangaPageAction->setCheckable(true); doubleMangaPageAction->setChecked(Configuration::getConfiguration().getDoubleMangaPage()); doubleMangaPageAction->setData(DOUBLE_MANGA_PAGE_ACTION_Y); @@ -382,7 +435,6 @@ void MainWindowViewer::createActions() connect(doubleMangaPageAction, &QAction::triggered, this, &MainWindowViewer::doubleMangaPageSwitch); goToPageAction = new QAction(tr("Go To"), this); - goToPageAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/goto"))); goToPageAction->setToolTip(tr("Go to page ...")); goToPageAction->setData(GO_TO_PAGE_ACTION_Y); goToPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_PAGE_ACTION_Y)); @@ -392,20 +444,17 @@ void MainWindowViewer::createActions() optionsAction->setToolTip(tr("YACReader options")); optionsAction->setData(OPTIONS_ACTION_Y); optionsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPTIONS_ACTION_Y)); - optionsAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/options"))); connect(optionsAction, &QAction::triggered, optionsDialog, &OptionsDialog::show); helpAboutAction = new QAction(tr("Help"), this); helpAboutAction->setToolTip(tr("Help, About YACReader")); - helpAboutAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/help"))); helpAboutAction->setData(HELP_ABOUT_ACTION_Y); helpAboutAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(HELP_ABOUT_ACTION_Y)); connect(helpAboutAction, &QAction::triggered, had, &QWidget::show); showMagnifyingGlassAction = new QAction(tr("Magnifying glass"), this); showMagnifyingGlassAction->setToolTip(tr("Switch Magnifying glass")); - showMagnifyingGlassAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/magnifyingGlass"))); showMagnifyingGlassAction->setCheckable(true); showMagnifyingGlassAction->setData(SHOW_MAGNIFYING_GLASS_ACTION_Y); showMagnifyingGlassAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_MAGNIFYING_GLASS_ACTION_Y)); @@ -413,7 +462,6 @@ void MainWindowViewer::createActions() setBookmarkAction = new QAction(tr("Set bookmark"), this); setBookmarkAction->setToolTip(tr("Set a bookmark on the current page")); - setBookmarkAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/bookmark"))); setBookmarkAction->setCheckable(true); setBookmarkAction->setData(SET_BOOKMARK_ACTION_Y); setBookmarkAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_BOOKMARK_ACTION_Y)); @@ -423,38 +471,32 @@ void MainWindowViewer::createActions() showBookmarksAction = new QAction(tr("Show bookmarks"), this); showBookmarksAction->setToolTip(tr("Show the bookmarks of the current comic")); - showBookmarksAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/showBookmarks"))); showBookmarksAction->setData(SHOW_BOOKMARKS_ACTION_Y); showBookmarksAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_BOOKMARKS_ACTION_Y)); connect(showBookmarksAction, &QAction::triggered, viewer->getBookmarksDialog(), &QWidget::show); showShorcutsAction = new QAction(tr("Show keyboard shortcuts"), this); - showShorcutsAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/shortcuts"))); showShorcutsAction->setData(SHOW_SHORCUTS_ACTION_Y); showShorcutsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_SHORCUTS_ACTION_Y)); connect(showShorcutsAction, &QAction::triggered, editShortcutsDialog, &QWidget::show); showInfoAction = new QAction(tr("Show Info"), this); - showInfoAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/info"))); showInfoAction->setData(SHOW_INFO_ACTION_Y); showInfoAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_INFO_ACTION_Y)); connect(showInfoAction, &QAction::triggered, viewer, &Viewer::informationSwitch); closeAction = new QAction(tr("Close"), this); - closeAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/close"))); closeAction->setData(CLOSE_ACTION_Y); closeAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(CLOSE_ACTION_Y)); connect(closeAction, &QAction::triggered, this, &QWidget::close); showDictionaryAction = new QAction(tr("Show Dictionary"), this); - showDictionaryAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/translator"))); // showDictionaryAction->setCheckable(true); showDictionaryAction->setData(SHOW_DICTIONARY_ACTION_Y); showDictionaryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_DICTIONARY_ACTION_Y)); connect(showDictionaryAction, &QAction::triggered, viewer, &Viewer::translatorSwitch); showFlowAction = new QAction(tr("Show go to flow"), this); - showFlowAction->setIcon(QIcon(addExtensionToIconPath(":/images/viewer_toolbar/flow"))); showFlowAction->setData(SHOW_FLOW_ACTION_Y); showFlowAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_FLOW_ACTION_Y)); connect(showFlowAction, &QAction::triggered, viewer, &Viewer::goToFlowSwitch); @@ -478,9 +520,7 @@ void MainWindowViewer::createToolBars() { #ifdef Y_MAC_UI comicToolBar = new YACReaderMacOSXToolbar(this); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) comicToolBar->setIconSize(QSize(18, 18)); -#endif #else comicToolBar = addToolBar(tr("&File")); #endif @@ -494,8 +534,8 @@ void MainWindowViewer::createToolBars() #endif #ifdef Y_MAC_UI - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/open")), openAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/openFolder")), openFolderAction)); + comicToolBar->addAction(wrappedToolbarAction(openAction)); + comicToolBar->addAction(wrappedToolbarAction(openFolderAction)); #else auto recentmenu = new QMenu(tr("Open recent")); recentmenu->addActions(recentFilesActionList); @@ -503,73 +543,78 @@ void MainWindowViewer::createToolBars() recentmenu->addAction(clearRecentFilesAction); refreshRecentFilesActionList(); - auto tb = new QToolButton(); - auto open = actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/open")), openAction); - tb->addAction(open); - tb->addAction(actionWithCustomIcon(QIcon(), openLatestComicAction)); - tb->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/openFolder")), openFolderAction)); - tb->addAction(recentmenu->menuAction()); - tb->setPopupMode(QToolButton::MenuButtonPopup); - tb->setDefaultAction(open); + openToolButton = new QToolButton(); + auto open = wrappedToolbarAction(openAction); + openToolButton->addAction(open); + openToolButton->addAction(wrappedToolbarAction(openLatestComicAction)); + openToolButton->addAction(wrappedToolbarAction(openFolderAction)); + openToolButton->addAction(recentmenu->menuAction()); + openToolButton->setPopupMode(QToolButton::MenuButtonPopup); + openToolButton->setDefaultAction(open); - comicToolBar->addWidget(tb); + comicToolBar->addWidget(openToolButton); #endif - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/save")), saveImageAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/openPrevious")), openComicOnTheLeftAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/openNext")), openComicOnTheRightAction)); + comicToolBar->addAction(wrappedToolbarAction(saveImageAction)); + comicToolBar->addAction(wrappedToolbarAction(openComicOnTheLeftAction)); + comicToolBar->addAction(wrappedToolbarAction(openComicOnTheRightAction)); comicToolBar->addSeparator(); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/previous")), goToPageOnTheLeftAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/next")), goToPageOnTheRightAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/goto")), goToPageAction)); + comicToolBar->addAction(wrappedToolbarAction(goToPageOnTheLeftAction)); + comicToolBar->addAction(wrappedToolbarAction(goToPageOnTheRightAction)); + comicToolBar->addAction(wrappedToolbarAction(goToPageAction)); comicToolBar->addSeparator(); - auto adjustToWidthTBAction = actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/toWidth")), adjustWidthAction); + auto adjustToWidthTBAction = wrappedToolbarAction(adjustWidthAction); comicToolBar->addAction(adjustToWidthTBAction); - auto adjustToHeightTBAction = actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/toHeight")), adjustHeightAction); + auto adjustToHeightTBAction = wrappedToolbarAction(adjustHeightAction); comicToolBar->addAction(adjustToHeightTBAction); - auto adjustToFullSizeTBAction = actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/full")), adjustToFullSizeAction); + auto adjustToFullSizeTBAction = wrappedToolbarAction(adjustToFullSizeAction); comicToolBar->addAction(adjustToFullSizeAction); - auto fitToPageTBAction = actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/fitToPage")), fitToPageAction); + auto fitToPageTBAction = wrappedToolbarAction(fitToPageAction); comicToolBar->addAction(fitToPageTBAction); + auto continuousScroollTBAction = wrappedToolbarAction(continuousScrollAction); + comicToolBar->addAction(continuousScroollTBAction); + + comicToolBar->addSeparator(); auto fitModes = new QActionGroup(this); fitModes->addAction(adjustToWidthTBAction); fitModes->addAction(adjustToHeightTBAction); fitModes->addAction(adjustToFullSizeTBAction); fitModes->addAction(fitToPageTBAction); + fitModes->addAction(continuousScroollTBAction); zoomSliderAction = new YACReaderSlider(this); zoomSliderAction->hide(); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/zoom")), showZoomSliderlAction)); + comicToolBar->addAction(wrappedToolbarAction(showZoomSliderlAction)); connect(showZoomSliderlAction, &QAction::triggered, this, &MainWindowViewer::toggleFitToWidthSlider); connect(zoomSliderAction, &YACReaderSlider::zoomRatioChanged, viewer, &Viewer::updateZoomRatio); connect(viewer, &Viewer::zoomUpdated, zoomSliderAction, &YACReaderSlider::updateZoomRatio); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/rotateL")), leftRotationAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/rotateR")), rightRotationAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/doublePage")), doublePageAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/doubleMangaPage")), doubleMangaPageAction)); + comicToolBar->addAction(wrappedToolbarAction(leftRotationAction)); + comicToolBar->addAction(wrappedToolbarAction(rightRotationAction)); + comicToolBar->addAction(wrappedToolbarAction(doublePageAction)); + comicToolBar->addAction(wrappedToolbarAction(doubleMangaPageAction)); comicToolBar->addSeparator(); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/magnifyingGlass")), showMagnifyingGlassAction)); + comicToolBar->addAction(wrappedToolbarAction(showMagnifyingGlassAction)); comicToolBar->addSeparator(); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/bookmark")), setBookmarkAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/showBookmarks")), showBookmarksAction)); + comicToolBar->addAction(wrappedToolbarAction(setBookmarkAction)); + comicToolBar->addAction(wrappedToolbarAction(showBookmarksAction)); comicToolBar->addSeparator(); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/translator")), showDictionaryAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/flow")), showFlowAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/info")), showInfoAction)); + comicToolBar->addAction(wrappedToolbarAction(showDictionaryAction)); + comicToolBar->addAction(wrappedToolbarAction(showFlowAction)); + comicToolBar->addAction(wrappedToolbarAction(showInfoAction)); #ifdef Y_MAC_UI comicToolBar->addStretch(); @@ -577,9 +622,9 @@ void MainWindowViewer::createToolBars() comicToolBar->addWidget(new YACReaderToolBarStretch()); #endif - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/shortcuts")), showShorcutsAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/options")), optionsAction)); - comicToolBar->addAction(actionWithCustomIcon(QIcon(addExtensionToIconPathInToolbar(":/images/viewer_toolbar/help")), helpAboutAction)); + comicToolBar->addAction(wrappedToolbarAction(showShorcutsAction)); + comicToolBar->addAction(wrappedToolbarAction(optionsAction)); + comicToolBar->addAction(wrappedToolbarAction(helpAboutAction)); #ifndef Y_MAC_UI comicToolBar->setMovable(false); @@ -595,10 +640,13 @@ void MainWindowViewer::createToolBars() viewer->addAction(goToPageOnTheLeftAction); viewer->addAction(goToPageOnTheRightAction); viewer->addAction(goToPageAction); + YACReader::addSperator(viewer); viewer->addAction(adjustHeightAction); viewer->addAction(adjustWidthAction); viewer->addAction(adjustToFullSizeAction); viewer->addAction(fitToPageAction); + viewer->addAction(continuousScrollAction); + YACReader::addSperator(viewer); viewer->addAction(leftRotationAction); viewer->addAction(rightRotationAction); viewer->addAction(doublePageAction); @@ -675,6 +723,7 @@ void MainWindowViewer::createToolBars() viewMenu->addSeparator(); viewMenu->addAction(doublePageAction); viewMenu->addAction(doubleMangaPageAction); + viewMenu->addAction(continuousScrollAction); viewMenu->addSeparator(); viewMenu->addAction(showMagnifyingGlassAction); @@ -823,12 +872,7 @@ void MainWindowViewer::open(QString path, ComicDB &comic, QList &siblin else setWindowTitle("YACReader - " + fi.fileName()); - auto type = comic.info.type.value(); - // TODO: support comic.info.type by adjusting the scrolling and double page mode behaviour depending on the actual type, for now type is mapped to manga mode - auto isManga = type == YACReader::FileType::Manga; - - viewer->setMangaWithoutStoringSetting(isManga); - doubleMangaPageAction->setChecked(isManga); + applyLibraryReaderMode(comic.info.type.value()); viewer->open(path, comic); enableActions(); @@ -868,7 +912,6 @@ void MainWindowViewer::open(QString path, qint64 comicId, qint64 libraryId, YACR void MainWindowViewer::openComicFromPath(QString pathFile) { - doubleMangaPageAction->setChecked(Configuration::getConfiguration().getDoubleMangaPage()); openComic(pathFile); isClient = false; // this method is used for direct openings updatePrevNextActions(!previousComicPath.isEmpty(), !nextComicPath.isEmpty()); @@ -889,6 +932,7 @@ void MainWindowViewer::openComic(QString pathFile) setWindowTitle("YACReader - " + fi.fileName()); enableActions(); + applySavedReaderMode(); viewer->open(pathFile); Configuration::getConfiguration().updateOpenRecentList(fi.absoluteFilePath()); @@ -914,6 +958,7 @@ void MainWindowViewer::openFolderFromPath(QString pathDir) setWindowTitle("YACReader - " + fi.fileName()); enableActions(); + applySavedReaderMode(); viewer->open(pathDir); Configuration::getConfiguration().updateOpenRecentList(fi.absoluteFilePath()); @@ -929,6 +974,7 @@ void MainWindowViewer::openFolderFromPath(QString pathDir, QString atFileName) setWindowTitle("YACReader - " + fi.fileName()); enableActions(); + applySavedReaderMode(); QDir d(pathDir); d.setFilter(QDir::Files | QDir::NoDotAndDotDot); @@ -938,7 +984,7 @@ void MainWindowViewer::openFolderFromPath(QString pathDir, QString atFileName) std::sort(list.begin(), list.end(), naturalSortLessThanCI); int i = 0; - foreach (QString path, list) { + for (const QString &path : std::as_const(list)) { if (path.endsWith(atFileName)) break; i++; @@ -1158,10 +1204,22 @@ void MainWindowViewer::processReset() void MainWindowViewer::setUpShortcutsManagement() { + // Set up icon mapping for theme changes + QMap> iconMapping; + iconMapping[tr("Comics")] = [](const Theme &t) { return t.shortcutsIcons.comicsIcon; }; + iconMapping[tr("General")] = [](const Theme &t) { return t.shortcutsIcons.generalIcon; }; + iconMapping[tr("Magnifiying glass")] = [](const Theme &t) { return t.shortcutsIcons.magnifyingGlassIcon; }; + iconMapping[tr("Page adjustement")] = [](const Theme &t) { return t.shortcutsIcons.pageIcon; }; + iconMapping[tr("Reading")] = [](const Theme &t) { return t.shortcutsIcons.readingIcon; }; + editShortcutsDialog->setGroupIconMapping(iconMapping); + QList allActions; QList tmpList; - editShortcutsDialog->addActionsGroup(tr("Comics"), QIcon(":/images/shortcuts_group_comics.svg"), + // Get current theme for initial icons + const auto &theme = ThemeManager::instance().getCurrentTheme(); + + editShortcutsDialog->addActionsGroup(tr("Comics"), theme.shortcutsIcons.comicsIcon, tmpList = { openAction, openLatestComicAction, openFolderAction, @@ -1177,7 +1235,7 @@ void MainWindowViewer::setUpShortcutsManagement() auto *const toggleToolbarsAction = addActionWithShortcut(tr("Hide/show toolbar"), TOGGLE_TOOL_BARS_ACTION_Y); connect(toggleToolbarsAction, &QAction::triggered, this, &MainWindowViewer::toggleToolBars); - editShortcutsDialog->addActionsGroup(tr("General"), QIcon(":/images/shortcuts_group_general.svg"), + editShortcutsDialog->addActionsGroup(tr("General"), theme.shortcutsIcons.generalIcon, tmpList = QList() << optionsAction << helpAboutAction @@ -1215,7 +1273,7 @@ void MainWindowViewer::setUpShortcutsManagement() zoomInMglassAction, zoomOutMglassAction, resetMglassAction }; - editShortcutsDialog->addActionsGroup(tr("Magnifiying glass"), QIcon(":/images/shortcuts_group_mglass.svg"), + editShortcutsDialog->addActionsGroup(tr("Magnifiying glass"), theme.shortcutsIcons.magnifyingGlassIcon, tmpList = QList() << showMagnifyingGlassAction << mglassActions); @@ -1226,7 +1284,7 @@ void MainWindowViewer::setUpShortcutsManagement() CHANGE_FIT_ACTION_Y); connect(toggleFitToScreenAction, &QAction::triggered, this, &MainWindowViewer::toggleWidthHeight); - editShortcutsDialog->addActionsGroup(tr("Page adjustement"), QIcon(":/images/shortcuts_group_page.svg"), + editShortcutsDialog->addActionsGroup(tr("Page adjustement"), theme.shortcutsIcons.pageIcon, tmpList = QList() << adjustHeightAction << adjustWidthAction @@ -1235,6 +1293,7 @@ void MainWindowViewer::setUpShortcutsManagement() << rightRotationAction << doublePageAction << doubleMangaPageAction + << continuousScrollAction << adjustToFullSizeAction << fitToPageAction << increasePageZoomAction @@ -1303,7 +1362,7 @@ void MainWindowViewer::setUpShortcutsManagement() offsetDoublePageToTheLeft, offsetDoublePageToTheRight }; - editShortcutsDialog->addActionsGroup(tr("Reading"), QIcon(":/images/shortcuts_group_reading.svg"), + editShortcutsDialog->addActionsGroup(tr("Reading"), theme.shortcutsIcons.readingIcon, tmpList = QList() << goToPageOnTheRightAction << goToPageOnTheLeftAction @@ -1340,7 +1399,7 @@ void MainWindowViewer::toggleFitToWidthSlider() if (zoomSliderAction->isVisible()) { zoomSliderAction->hide(); } else { -#if defined(Y_MAC_UI) && (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) +#ifdef Y_MAC_UI zoomSliderAction->move((this->width() - zoomSliderAction->width()) / 2, y); #else zoomSliderAction->move(250, y); @@ -1495,7 +1554,7 @@ void MainWindowViewer::getSiblingComics(QString path, QString currentComic) txtS << path << '\n'; txtS << currentComic << '\n'; txtS << "Comic list count : " + list.count() << '\n'; - foreach(QString s, list){ + for (const QString &s : std::as_const(list)) { txtS << s << '\n'; } f.close(); @@ -1528,6 +1587,7 @@ void MainWindowViewer::setActionsEnabled(bool enabled) showMagnifyingGlassAction, doublePageAction, doubleMangaPageAction, + continuousScrollAction, adjustToFullSizeAction, fitToPageAction, showZoomSliderlAction, @@ -1554,6 +1614,57 @@ void MainWindowViewer::setLoadedComicActionsEnabled(bool enabled) a->setEnabled(enabled); } +void MainWindowViewer::applyTheme(const Theme &theme) +{ + const auto toolbarTheme = theme.toolbar; + + if (comicToolBar) { + comicToolBar->setStyleSheet(toolbarTheme.toolbarQSS); + } + + auto setIcon = [](QAction *action, const QIcon &icon, const QIcon &icon18x18) { + if (action) { + action->setIcon(icon); + + auto action18x18 = action->property("wrappedToolbarAction").value(); + if (action18x18) { + + action18x18->setIcon(icon18x18); + } + } + }; + + setIcon(openAction, toolbarTheme.openAction, toolbarTheme.openAction18x18); + setIcon(openFolderAction, toolbarTheme.openFolderAction, toolbarTheme.openFolderAction18x18); + setIcon(openLatestComicAction, toolbarTheme.openLatestComicAction, toolbarTheme.openLatestComicAction18x18); + setIcon(saveImageAction, toolbarTheme.saveImageAction, toolbarTheme.saveImageAction18x18); + setIcon(openComicOnTheLeftAction, toolbarTheme.openComicOnTheLeftAction, toolbarTheme.openComicOnTheLeftAction18x18); + setIcon(openComicOnTheRightAction, toolbarTheme.openComicOnTheRightAction, toolbarTheme.openComicOnTheRightAction18x18); + setIcon(goToPageOnTheLeftAction, toolbarTheme.goToPageOnTheLeftAction, toolbarTheme.goToPageOnTheLeftAction18x18); + setIcon(goToPageOnTheRightAction, toolbarTheme.goToPageOnTheRightAction, toolbarTheme.goToPageOnTheRightAction18x18); + setIcon(adjustHeightAction, toolbarTheme.adjustHeightAction, toolbarTheme.adjustHeightAction18x18); + setIcon(adjustWidthAction, toolbarTheme.adjustWidthAction, toolbarTheme.adjustWidthAction18x18); + setIcon(leftRotationAction, toolbarTheme.leftRotationAction, toolbarTheme.leftRotationAction18x18); + setIcon(rightRotationAction, toolbarTheme.rightRotationAction, toolbarTheme.rightRotationAction18x18); + setIcon(doublePageAction, toolbarTheme.doublePageAction, toolbarTheme.doublePageAction18x18); + setIcon(doubleMangaPageAction, toolbarTheme.doubleMangaPageAction, toolbarTheme.doubleMangaPageAction18x18); + setIcon(showZoomSliderlAction, toolbarTheme.showZoomSliderlAction, toolbarTheme.showZoomSliderlAction18x18); + setIcon(goToPageAction, toolbarTheme.goToPageAction, toolbarTheme.goToPageAction18x18); + setIcon(optionsAction, toolbarTheme.optionsAction, toolbarTheme.optionsAction18x18); + setIcon(helpAboutAction, toolbarTheme.helpAboutAction, toolbarTheme.helpAboutAction18x18); + setIcon(showMagnifyingGlassAction, toolbarTheme.showMagnifyingGlassAction, toolbarTheme.showMagnifyingGlassAction18x18); + setIcon(setBookmarkAction, toolbarTheme.setBookmarkAction, toolbarTheme.setBookmarkAction18x18); + setIcon(showBookmarksAction, toolbarTheme.showBookmarksAction, toolbarTheme.showBookmarksAction18x18); + setIcon(showShorcutsAction, toolbarTheme.showShorcutsAction, toolbarTheme.showShorcutsAction18x18); + setIcon(showInfoAction, toolbarTheme.showInfoAction, toolbarTheme.showInfoAction18x18); + setIcon(closeAction, toolbarTheme.closeAction, toolbarTheme.closeAction18x18); + setIcon(showDictionaryAction, toolbarTheme.showDictionaryAction, toolbarTheme.showDictionaryAction18x18); + setIcon(adjustToFullSizeAction, toolbarTheme.adjustToFullSizeAction, toolbarTheme.adjustToFullSizeAction18x18); + setIcon(fitToPageAction, toolbarTheme.fitToPageAction, toolbarTheme.fitToPageAction18x18); + setIcon(continuousScrollAction, toolbarTheme.continuousScrollAction, toolbarTheme.continuousScrollAction18x18); + setIcon(showFlowAction, toolbarTheme.showFlowAction, toolbarTheme.showFlowAction18x18); +} + void MainWindowViewer::dropEvent(QDropEvent *event) { QList urlList; diff --git a/YACReader/main_window_viewer.h b/YACReader/main_window_viewer.h index b2d086636..b1c1b5d0a 100644 --- a/YACReader/main_window_viewer.h +++ b/YACReader/main_window_viewer.h @@ -1,14 +1,16 @@ #ifndef __MAIN_WINDOW_VIEWER_H #define __MAIN_WINDOW_VIEWER_H -#include -#include -#include +#include "themable.h" +#include "yacreader_global.h" + #include -#include #include +#include +#include +#include #include - -#include "yacreader_global.h" +#include +#include #ifdef Y_MAC_UI #include "yacreader_macosx_toolbar.h" @@ -28,7 +30,7 @@ class EditShortcutsDialog; namespace YACReader { -class MainWindowViewer : public QMainWindow +class MainWindowViewer : public QMainWindow, protected Themable { Q_OBJECT @@ -138,6 +140,7 @@ public slots: QAction *closeAction; QAction *doublePageAction; QAction *doubleMangaPageAction; + QAction *continuousScrollAction; QAction *showShorcutsAction; QAction *showDictionaryAction; QAction *adjustToFullSizeAction; @@ -153,6 +156,8 @@ public slots: QList mglassActions; QList loadedComicActions; + QToolButton *openToolButton; + YACReaderSlider *zoomSliderAction; HttpVersionChecker *versionChecker; @@ -169,6 +174,9 @@ public slots: void setActionsEnabled(bool enabled); void setMglassActionsEnabled(bool enabled); void setLoadedComicActionsEnabled(bool enabled); + void syncModeActions(bool manga, bool continuousScroll); + void applySavedReaderMode(); + void applyLibraryReaderMode(YACReader::FileType type); //! Manejadores de evento: // void resizeEvent(QResizeEvent * event); @@ -195,6 +203,7 @@ public slots: void sendComic(); void updatePrevNextActions(bool thereIsPrevious, bool thereIsNext); void afterLaunchTasks(); + void applyTheme(const Theme &theme) override; public: MainWindowViewer(); diff --git a/YACReader/mouse_handler.cpp b/YACReader/mouse_handler.cpp index d4b7a6c1a..dcdfec9f4 100644 --- a/YACReader/mouse_handler.cpp +++ b/YACReader/mouse_handler.cpp @@ -1,18 +1,12 @@ #include "mouse_handler.h" -#include - #include "configuration.h" +#include "goto_flow_widget.h" #include "magnifying_glass.h" #include "render.h" #include "viewer.h" -#include "goto_flow.h" -#ifndef NO_OPENGL -#include "goto_flow_gl.h" -#else -#include -#endif +#include using namespace YACReader; @@ -25,11 +19,7 @@ void YACReader::MouseHandler::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { viewer->drag = true; -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto position = event->position(); -#else - auto position = QPointF(event->x(), event->y()); -#endif dragOrigin = dragLatestPosition = position; viewer->setCursor(Qt::ClosedHandCursor); event->accept(); @@ -59,11 +49,7 @@ void YACReader::MouseHandler::mouseReleaseEvent(QMouseEvent *event) event->accept(); } -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto position = event->position(); -#else - auto position = QPointF(event->x(), event->y()); -#endif auto dragDistance = QLineF(position, dragOrigin).length(); auto mouseMode = Configuration::getConfiguration().getMouseMode(); @@ -110,11 +96,7 @@ void YACReader::MouseHandler::mouseMoveEvent(QMouseEvent *event) viewer->showCursor(); viewer->hideCursorTimer->start(2500); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto position = event->position(); -#else - auto position = QPointF(event->x(), event->y()); -#endif if (viewer->magnifyingGlassShown) viewer->mglass->move(static_cast(position.x() - float(viewer->mglass->width()) / 2), static_cast(position.y() - float(viewer->mglass->height()) / 2)); diff --git a/YACReader/notifications_label_widget.cpp b/YACReader/notifications_label_widget.cpp index 2d5ff56f2..480025fb9 100644 --- a/YACReader/notifications_label_widget.cpp +++ b/YACReader/notifications_label_widget.cpp @@ -1,6 +1,13 @@ #include "notifications_label_widget.h" -#include +#include +#include +#include +#include +#include +#include +#include +#include NotificationsLabelWidget::NotificationsLabelWidget(QWidget *parent) : QWidget(parent) diff --git a/YACReader/options_dialog.cpp b/YACReader/options_dialog.cpp index 611ce8d38..f54af77c8 100644 --- a/YACReader/options_dialog.cpp +++ b/YACReader/options_dialog.cpp @@ -1,23 +1,27 @@ #include "options_dialog.h" + +#include "app_language_utils.h" +#include "appearance_tab_widget.h" #include "configuration.h" -#include -#include +#include "theme_factory.h" +#include "theme_manager.h" +#include "yacreader_3d_flow_config_widget.h" +#include "yacreader_spin_slider_widget.h" + +#include +#include +#include #include #include -#include -#include -#include +#include +#include #include +#include #include -#include -#include -#include - -#include "yacreader_spin_slider_widget.h" -#include "yacreader_flow_config_widget.h" -#ifndef NO_OPENGL -#include "yacreader_gl_flow_config_widget.h" -#endif +#include +#include +#include +#include OptionsDialog::OptionsDialog(QWidget *parent) : YACReaderOptionsDialog(parent) @@ -35,9 +39,22 @@ OptionsDialog::OptionsDialog(QWidget *parent) auto path = new QHBoxLayout(); path->addWidget(pathEdit = new QLineEdit()); - path->addWidget(pathFindButton = new QPushButton(QIcon(":/images/find_folder.png"), "")); + path->addWidget(pathFindButton = new QPushButton("")); pathBox->setLayout(path); + auto *languageBox = new QGroupBox(tr("Language")); + auto *languageLayout = new QHBoxLayout(); + languageLayout->addWidget(new QLabel(tr("Application language"))); + languageCombo = new QComboBox(this); + languageCombo->addItem(tr("System default"), QString()); + const auto availableLanguages = YACReader::UiLanguage::availableLanguages("yacreader"); + for (const auto &language : availableLanguages) { + languageCombo->addItem( + QString("%1 (%2)").arg(language.displayName, language.code), language.code); + } + languageLayout->addWidget(languageCombo); + languageBox->setLayout(languageLayout); + QGroupBox *displayBox = new QGroupBox(tr("Display")); auto displayLayout = new QHBoxLayout(); showTimeInInformationLabel = new QCheckBox(tr("Show time in current page information label")); @@ -68,10 +85,12 @@ OptionsDialog::OptionsDialog(QWidget *parent) // backgroundColor->setMinimumWidth(100); colorSelection->addWidget(backgroundColor); colorSelection->addWidget(selectBackgroundColorButton = new QPushButton(tr("Choose"))); + colorSelection->addWidget(clearBackgroundColorButton = new QPushButton(tr("Clear"))); colorSelection->setStretchFactor(backgroundColor, 1); colorSelection->setStretchFactor(selectBackgroundColorButton, 0); // colorSelection->addStretch(); connect(selectBackgroundColorButton, &QAbstractButton::clicked, this, &OptionsDialog::showColorDialog); + connect(clearBackgroundColorButton, &QAbstractButton::clicked, this, &OptionsDialog::clearBackgroundColor); colorBox->setLayout(colorSelection); auto scrollBox = new QGroupBox(tr("Scroll behaviour")); @@ -101,6 +120,7 @@ OptionsDialog::OptionsDialog(QWidget *parent) mouseModeBox->setLayout(mouseModeLayout); layoutGeneral->addWidget(pathBox); + layoutGeneral->addWidget(languageBox); layoutGeneral->addWidget(displayBox); layoutGeneral->addWidget(slideSizeBox); // layoutGeneral->addWidget(fitBox); @@ -120,19 +140,13 @@ OptionsDialog::OptionsDialog(QWidget *parent) quickNavi = new QCheckBox(tr("Quick Navigation Mode")); disableShowOnMouseOver = new QCheckBox(tr("Disable mouse over activation")); - layoutFlow->addWidget(sw); -#ifndef NO_OPENGL layoutFlow->addWidget(gl); - layoutFlow->addWidget(useGL); -#endif + layoutFlow->addWidget(quickNavi); layoutFlow->addWidget(disableShowOnMouseOver); layoutFlow->addStretch(); - // disable vSyncCheck -#ifndef NO_OPENGL gl->vSyncCheck->hide(); -#endif // PAGE FLOW END ------------------------------------- @@ -180,7 +194,7 @@ OptionsDialog::OptionsDialog(QWidget *parent) auto scaleLayout = new QVBoxLayout(); scaleCheckbox = new QCheckBox(tr("Enlarge images to fit width/height")); connect(scaleCheckbox, &QCheckBox::clicked, scaleCheckbox, - [=](bool checked) { + [=, this](bool checked) { Configuration::getConfiguration().setEnlargeImages(checked); emit changedImageOptions(); }); @@ -193,7 +207,7 @@ OptionsDialog::OptionsDialog(QWidget *parent) auto doublePageBoxLayout = new QVBoxLayout(); coverSPCheckBox = new QCheckBox(tr("Show covers as single page")); connect(coverSPCheckBox, &QCheckBox::clicked, coverSPCheckBox, - [=](bool checked) { + [=, this](bool checked) { settings->setValue(COVER_IS_SP, checked); emit changedImageOptions(); }); @@ -201,6 +215,23 @@ OptionsDialog::OptionsDialog(QWidget *parent) doublePageBoxLayout->addWidget(coverSPCheckBox); doublePageBox->setLayout(doublePageBoxLayout); layoutImageV->addWidget(doublePageBox); + + auto scalingBox = new QGroupBox(tr("Scaling")); + auto scalingLayout = new QHBoxLayout(); + scalingLayout->addWidget(new QLabel(tr("Scaling method"))); + scalingMethodCombo = new QComboBox(); + scalingMethodCombo->addItem(tr("Nearest (fast, low quality)")); + scalingMethodCombo->addItem(tr("Bilinear")); + scalingMethodCombo->addItem(tr("Lanczos (better quality)")); + connect(scalingMethodCombo, &QComboBox::currentIndexChanged, this, [this](int index) { + Configuration::getConfiguration().setScalingMethod(static_cast(index)); + emit changedImageOptions(); + }); + scalingLayout->addWidget(scalingMethodCombo); + scalingLayout->addStretch(); + scalingBox->setLayout(scalingLayout); + layoutImageV->addWidget(scalingBox); + layoutImageV->addStretch(); // IMAGE ADJUSTMENTS END ----------------------------- @@ -209,9 +240,21 @@ OptionsDialog::OptionsDialog(QWidget *parent) pageFlow->setLayout(layoutFlow); pageImage->setLayout(layoutImageV); + // APPEARANCE ---------------------------------------- + + auto *pageAppearance = new AppearanceTabWidget( + ThemeManager::instance().getAppearanceConfiguration(), + ThemeManager::instance().getRepository(), + []() { return ThemeManager::instance().getCurrentTheme().sourceJson; }, + [](const QJsonObject &json) { ThemeManager::instance().setTheme(makeTheme(json)); }, + this); + + // APPEARANCE END ------------------------------------ + tabWidget->addTab(pageGeneral, tr("General")); tabWidget->addTab(pageFlow, tr("Page Flow")); tabWidget->addTab(pageImage, tr("Image adjustment")); + tabWidget->addTab(pageAppearance, tr("Appearance")); layout->addWidget(tabWidget); @@ -229,6 +272,17 @@ OptionsDialog::OptionsDialog(QWidget *parent) setWindowTitle(tr("Options")); this->layout()->setSizeConstraint(QLayout::SetFixedSize); + + initTheme(this); +} + +void OptionsDialog::applyTheme(const Theme &theme) +{ + pathFindButton->setIcon(theme.dialogIcons.findFolderIcon); + + if (backgroundColorFollowsTheme) { + updateColor(theme.viewer.defaultBackgroundColor); + } } void OptionsDialog::findFolder() @@ -242,6 +296,11 @@ void OptionsDialog::findFolder() void OptionsDialog::showColorDialog() { auto color = QColorDialog::getColor(currentColor, this); + if (!color.isValid()) { + return; + } + + backgroundColorFollowsTheme = false; updateColor(color); } @@ -249,18 +308,15 @@ void OptionsDialog::saveOptions() { settings->setValue(GO_TO_FLOW_SIZE, QSize(static_cast(slideSize->sliderPosition() / SLIDE_ASPECT_RATIO), slideSize->sliderPosition())); - if (sw->radio1->isChecked()) - settings->setValue(FLOW_TYPE_SW, 0); - if (sw->radio2->isChecked()) - settings->setValue(FLOW_TYPE_SW, 1); - if (sw->radio3->isChecked()) - settings->setValue(FLOW_TYPE_SW, 2); - settings->setValue(PATH, pathEdit->text()); Configuration::getConfiguration().setShowTimeInInformation(showTimeInInformationLabel->isChecked()); - settings->setValue(BACKGROUND_COLOR, currentColor); + if (!backgroundColorFollowsTheme) { + settings->setValue(BACKGROUND_COLOR, currentColor); + } else { + settings->remove(BACKGROUND_COLOR); + } // settings->setValue(FIT_TO_WIDTH_RATIO,fitToWidthRatioS->sliderPosition()/100.0); settings->setValue(QUICK_NAVI_MODE, quickNavi->isChecked()); settings->setValue(DISABLE_MOUSE_OVER_GOTO_FLOW, disableShowOnMouseOver->isChecked()); @@ -281,6 +337,15 @@ void OptionsDialog::saveOptions() } Configuration::getConfiguration().setMouseMode(mouseMode); + Configuration::getConfiguration().setScalingMethod(static_cast(scalingMethodCombo->currentIndex())); + emit changedImageOptions(); + + const auto selectedLanguage = languageCombo->currentData().toString().trimmed(); + if (selectedLanguage.isEmpty()) + settings->remove(UI_LANGUAGE); + else + settings->setValue(UI_LANGUAGE, selectedLanguage); + YACReaderOptionsDialog::saveOptions(); } @@ -289,26 +354,21 @@ void OptionsDialog::restoreOptions(QSettings *settings) YACReaderOptionsDialog::restoreOptions(settings); slideSize->setSliderPosition(settings->value(GO_TO_FLOW_SIZE).toSize().height()); - switch (settings->value(FLOW_TYPE_SW).toInt()) { - case 0: - sw->radio1->setChecked(true); - break; - case 1: - sw->radio2->setChecked(true); - break; - case 2: - sw->radio3->setChecked(true); - break; - default: - sw->radio1->setChecked(true); - break; - } pathEdit->setText(settings->value(PATH).toString()); + const auto selectedLanguage = settings->value(UI_LANGUAGE).toString().trimmed(); + int languageIndex = languageCombo->findData(selectedLanguage); + if (languageIndex < 0) + languageIndex = 0; + languageCombo->setCurrentIndex(languageIndex); + showTimeInInformationLabel->setChecked(Configuration::getConfiguration().getShowTimeInInformation()); - updateColor(settings->value(BACKGROUND_COLOR).value()); + backgroundColorFollowsTheme = !settings->contains(BACKGROUND_COLOR); + updateColor(backgroundColorFollowsTheme + ? theme.viewer.defaultBackgroundColor + : settings->value(BACKGROUND_COLOR).value()); // fitToWidthRatioS->setSliderPosition(settings->value(FIT_TO_WIDTH_RATIO).toFloat()*100); quickNavi->setChecked(settings->value(QUICK_NAVI_MODE).toBool()); @@ -331,6 +391,11 @@ void OptionsDialog::restoreOptions(QSettings *settings) #endif disableScrollAnimations->setChecked(settings->value(DISABLE_SCROLL_ANIMATION, defaultDisableScrollAnimationsValue).toBool()); + { + QSignalBlocker blocker(scalingMethodCombo); + scalingMethodCombo->setCurrentIndex(static_cast(Configuration::getConfiguration().getScalingMethod())); + } + auto mouseMode = Configuration::getConfiguration().getMouseMode(); switch (mouseMode) { @@ -354,8 +419,6 @@ void OptionsDialog::updateColor(const QColor &color) backgroundColor->setAutoFillBackground(true); currentColor = color; - settings->setValue(BACKGROUND_COLOR, color); - emit changedOptions(); } @@ -422,3 +485,11 @@ void OptionsDialog::setFilters(int brightness, int contrast, int gamma) else gammaS->setValue(100); } + +void OptionsDialog::clearBackgroundColor() +{ + backgroundColorFollowsTheme = true; + settings->remove(BACKGROUND_COLOR); + + updateColor(theme.viewer.defaultBackgroundColor); +} diff --git a/YACReader/options_dialog.h b/YACReader/options_dialog.h index 0f15e196b..eb65fe1dd 100644 --- a/YACReader/options_dialog.h +++ b/YACReader/options_dialog.h @@ -1,8 +1,12 @@ #ifndef __OPTIONS_DIALOG_H #define __OPTIONS_DIALOG_H +#include "themable.h" #include "yacreader_options_dialog.h" +#include + +class QComboBox; class QDialog; class QLabel; class QLineEdit; @@ -12,16 +16,20 @@ class QPushButton; class QRadioButton; class YACReaderSpinSliderWidget; -class OptionsDialog : public YACReaderOptionsDialog +class OptionsDialog : public YACReaderOptionsDialog, protected Themable { Q_OBJECT public: OptionsDialog(QWidget *parent = nullptr); +protected: + void applyTheme(const Theme &theme) override; + private: // QLabel * pathLabel; QLineEdit *pathEdit; QPushButton *pathFindButton; + QComboBox *languageCombo; QCheckBox *showTimeInInformationLabel; @@ -42,6 +50,7 @@ class OptionsDialog : public YACReaderOptionsDialog QLabel *backgroundColor; QPushButton *selectBackgroundColorButton; + QPushButton *clearBackgroundColorButton; QCheckBox *doNotTurnPageOnScroll; QCheckBox *useSingleScrollStepToTurnPage; @@ -54,6 +63,9 @@ class OptionsDialog : public YACReaderOptionsDialog YACReaderSpinSliderWidget *gammaS; QColor currentColor; + bool backgroundColorFollowsTheme = true; + + QComboBox *scalingMethodCombo; QRadioButton *normalMouseModeRadioButton; QRadioButton *leftRightNavigationMouseModeRadioButton; @@ -72,6 +84,7 @@ public slots: void resetImageConfig(); void show(); void setFilters(int brightness, int contrast, int gamma); + void clearBackgroundColor(); signals: void changedOptions(); diff --git a/YACReader/page_label_widget.cpp b/YACReader/page_label_widget.cpp index 8fd6a4b96..93ddf4aee 100644 --- a/YACReader/page_label_widget.cpp +++ b/YACReader/page_label_widget.cpp @@ -1,6 +1,11 @@ #include "page_label_widget.h" -#include +#include +#include +#include +#include +#include +#include PageLabelWidget::PageLabelWidget(QWidget *parent) : QWidget(parent) @@ -25,13 +30,13 @@ PageLabelWidget::PageLabelWidget(QWidget *parent) int contentMargin = 0; if (verticalRes <= 1024) { - textLabel->setStyleSheet("QLabel { color : white; font-size:12px; }"); + fontSizePx = 12; contentMargin = 12; } else if (verticalRes <= 1200) { - textLabel->setStyleSheet("QLabel { color : white; font-size:16px; }"); + fontSizePx = 16; contentMargin = 16; } else { - textLabel->setStyleSheet("QLabel { color : white; font-size:20px; }"); + fontSizePx = 20; contentMargin = 20; } @@ -47,6 +52,8 @@ PageLabelWidget::PageLabelWidget(QWidget *parent) if (parent != nullptr) move(QPoint((parent->geometry().size().width() - this->width()), -this->height())); + + initTheme(this); } void PageLabelWidget::show() @@ -90,7 +97,7 @@ void PageLabelWidget::paintEvent(QPaintEvent *) { QPainter painter(this); - painter.fillRect(0, 0, width(), height(), QColor(0xBB000000)); + painter.fillRect(rect(), infoBackgroundColor); } void PageLabelWidget::updatePosition() @@ -106,3 +113,14 @@ void PageLabelWidget::updatePosition() else move(QPoint((parent->geometry().size().width() - this->width()), -this->height())); } + +void PageLabelWidget::applyTheme(const Theme &theme) +{ + const auto viewerTheme = theme.viewer; + + infoBackgroundColor = viewerTheme.infoBackgroundColor; + + textLabel->setStyleSheet(viewerTheme.infoLabelQSS.arg(fontSizePx)); + + update(); +} diff --git a/YACReader/page_label_widget.h b/YACReader/page_label_widget.h index 35b0c94ed..898c5b1d4 100644 --- a/YACReader/page_label_widget.h +++ b/YACReader/page_label_widget.h @@ -1,20 +1,25 @@ #ifndef PAGE_LABEL_WIDGET_H #define PAGE_LABEL_WIDGET_H +#include "themable.h" + #include class QLabel; class QPropertyAnimation; -class PageLabelWidget : public QWidget +class PageLabelWidget : public QWidget, protected Themable { Q_OBJECT private: QLabel *textLabel; QPropertyAnimation *animation; + QColor infoBackgroundColor; + int fontSizePx = 0; protected: void paintEvent(QPaintEvent *) override; + void applyTheme(const Theme &theme) override; public: PageLabelWidget(QWidget *parent); diff --git a/YACReader/render.cpp b/YACReader/render.cpp index fee12b11d..bfba392b9 100644 --- a/YACReader/render.cpp +++ b/YACReader/render.cpp @@ -1,17 +1,17 @@ #include "render.h" -#include -#include -#include -#include -#include -#include -#include - -#include #include "comic_db.h" -#include "yacreader_global_gui.h" #include "configuration.h" +#include "yacreader_global_gui.h" + +#include +#include +#include +#include +#include + +#include +#include template inline const T &kClamp(const T &x, const T &low, const T &high) @@ -546,6 +546,17 @@ QPixmap *Render::getCurrentDoubleMangaPage() } } +const QImage *Render::bufferedImage(int absolutePageIndex) const +{ + int offset = absolutePageIndex - currentIndex; + int pos = currentPageBufferedIndex + offset; + if (pos < 0 || pos >= buffer.size()) { + return nullptr; + } + const QImage *img = buffer[pos]; + return (img && !img->isNull()) ? img : nullptr; +} + bool Render::currentPageIsDoublePage() { if (currentIndex == 0 && Configuration::getConfiguration().getSettings()->value(COVER_IS_SP, true).toBool()) { @@ -627,6 +638,8 @@ void Render::setComic(Comic *c) void Render::prepareAvailablePage(int page) { + emit pageRendered(page); + if (!doublePage) { if (currentIndex == page) { emit currentPageReady(); @@ -987,7 +1000,7 @@ void Render::fillBuffer() pageRenders[currentPageBufferedIndex + i]->start(); } - if ((currentIndex - i > 0) && + if ((currentIndex - i >= 0) && buffer[currentPageBufferedIndex - i]->isNull() && i <= numLeftPages && pageRenders[currentPageBufferedIndex - i] == 0 && diff --git a/YACReader/render.h b/YACReader/render.h index bfeb81aff..da7a57ce3 100644 --- a/YACReader/render.h +++ b/YACReader/render.h @@ -1,13 +1,14 @@ #ifndef RENDER_H #define RENDER_H +#include "comic.h" + +#include #include -#include #include +#include #include -#include #include -#include "comic.h" //----------------------------------------------------------------------------- // FILTERS //----------------------------------------------------------------------------- @@ -142,6 +143,7 @@ public slots: bool currentPageIsDoublePage(); bool nextPageIsDoublePage(); bool previousPageIsDoublePage(); + const QImage *bufferedImage(int absolutePageIndex) const; void goTo(int index); void doublePageSwitch(); void setManga(bool manga); @@ -197,6 +199,7 @@ public slots: void isLast(); void isCover(); + void pageRendered(int absolutePageIndex); void bookmarksUpdated(); private: diff --git a/YACReader/themes/builtin_classic.json b/YACReader/themes/builtin_classic.json new file mode 100644 index 000000000..ac1bda11e --- /dev/null +++ b/YACReader/themes/builtin_classic.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#404040" + }, + "goToFlowWidget": { + "editBackgroundColor": "#55000000", + "editBorderColor": "#77000000", + "editTextColor": "#FFFFFF", + "flowBackgroundColor": "#282828", + "flowTextColor": "#FFFFFF", + "iconColor": "#FFFFFF", + "labelTextColor": "#FFFFFF", + "sliderBorderColor": "#22FFFFFF", + "sliderGrooveColor": "#77000000", + "sliderHandleColor": "#55FFFFFF", + "toolbarBackgroundColor": "#99000000" + }, + "helpAboutDialog": { + "headingColor": "#302F2D", + "linkColor": "#C19441" + }, + "meta": { + "displayName": "Default Classic", + "id": "builtin/classic", + "targetApp": "YACReader", + "variant": "dark", + "version": "10.0.0" + }, + "shortcutsIcons": { + "iconColor": "#404040" + }, + "translator": { + "backgroundColor": "#404040", + "borderColor": "#212121", + "iconColor": "#CCCCCC", + "inputBackgroundColor": "#2A2A2A", + "inputDarkerBackgroundColor": "#272727", + "primaryTextColor": "#FFFFFF", + "scrollbarHandleColor": "#DDDDDD", + "secondaryTextColor": "#E3E3E3", + "selectionBackgroundColor": "#202020" + }, + "toolbar": { + "backgroundColor": "#F3F3F3", + "checkedButtonColor": "#CCCCCC", + "iconCheckedColor": "#5A5A5A", + "iconColor": "#404040", + "iconDisabledColor": "#858585", + "menuIndicatorColor": "#404040", + "separatorColor": "#CCCCCC" + }, + "viewer": { + "defaultBackgroundColor": "#282828", + "defaultTextColor": "#FFFFFF", + "infoBackgroundColor": "#BB000000", + "infoTextColor": "#FFFFFF" + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#444444", + "contentTextColor": "#0A0A0A", + "headerDecorationColor": "#E8B800", + "headerTextColor": "#0A0A0A", + "linkColor": "#E8B800", + "versionTextColor": "#858585" + } +} diff --git a/YACReader/themes/builtin_dark.json b/YACReader/themes/builtin_dark.json new file mode 100644 index 000000000..40dc2dd2a --- /dev/null +++ b/YACReader/themes/builtin_dark.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#CCCCCC" + }, + "goToFlowWidget": { + "editBackgroundColor": "#55000000", + "editBorderColor": "#77000000", + "editTextColor": "#FFFFFF", + "flowBackgroundColor": "#282828", + "flowTextColor": "#FFFFFF", + "iconColor": "#CCCCCC", + "labelTextColor": "#FFFFFF", + "sliderBorderColor": "#22FFFFFF", + "sliderGrooveColor": "#77000000", + "sliderHandleColor": "#55FFFFFF", + "toolbarBackgroundColor": "#99000000" + }, + "helpAboutDialog": { + "headingColor": "#E0E0E0", + "linkColor": "#D4A84B" + }, + "meta": { + "displayName": "Default Dark", + "id": "builtin/dark", + "targetApp": "YACReader", + "variant": "dark", + "version": "10.0.0" + }, + "shortcutsIcons": { + "iconColor": "#D0D0D0" + }, + "translator": { + "backgroundColor": "#404040", + "borderColor": "#212121", + "iconColor": "#CCCCCC", + "inputBackgroundColor": "#2A2A2A", + "inputDarkerBackgroundColor": "#272727", + "primaryTextColor": "#FFFFFF", + "scrollbarHandleColor": "#DDDDDD", + "secondaryTextColor": "#E3E3E3", + "selectionBackgroundColor": "#202020" + }, + "toolbar": { + "backgroundColor": "#202020", + "checkedButtonColor": "#3A3A3A", + "iconCheckedColor": "#DADADA", + "iconColor": "#CCCCCC", + "iconDisabledColor": "#444444", + "menuIndicatorColor": "#CCCCCC", + "separatorColor": "#444444" + }, + "viewer": { + "defaultBackgroundColor": "#282828", + "defaultTextColor": "#FFFFFF", + "infoBackgroundColor": "#BB000000", + "infoTextColor": "#B0B0B0" + }, + "whatsNewDialog": { + "backgroundColor": "#2A2A2A", + "closeButtonColor": "#DDDDDD", + "contentTextColor": "#E0E0E0", + "headerDecorationColor": "#E8B800", + "headerTextColor": "#E0E0E0", + "linkColor": "#E8B800", + "versionTextColor": "#858585" + } +} diff --git a/YACReader/themes/builtin_dark1.json b/YACReader/themes/builtin_dark1.json new file mode 100644 index 000000000..23e5d7130 --- /dev/null +++ b/YACReader/themes/builtin_dark1.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#FCFCFA" + }, + "goToFlowWidget": { + "editBackgroundColor": "#AA403E41", + "editBorderColor": "#885B595C", + "editTextColor": "#C1C0C0", + "flowBackgroundColor": "#221F22", + "flowTextColor": "#939293", + "iconColor": "#FCFCFA", + "labelTextColor": "#FCFCFA", + "sliderBorderColor": "#33FCFCFA", + "sliderGrooveColor": "#771C1A1D", + "sliderHandleColor": "#66FCFCFA", + "toolbarBackgroundColor": "#991C1A1D" + }, + "helpAboutDialog": { + "headingColor": "#FCFCFA", + "linkColor": "#78DCE8" + }, + "meta": { + "displayName": "Monodark", + "id": "builtin/dark1", + "targetApp": "YACReader", + "variant": "dark", + "version": "10.0.2" + }, + "shortcutsIcons": { + "iconColor": "#FCFCFA" + }, + "translator": { + "backgroundColor": "#403E41", + "borderColor": "#221F22", + "iconColor": "#FCFCFA", + "inputBackgroundColor": "#2B282D", + "inputDarkerBackgroundColor": "#353236", + "primaryTextColor": "#FCFCFA", + "scrollbarHandleColor": "#D7D6D7", + "secondaryTextColor": "#939293", + "selectionBackgroundColor": "#5B595C" + }, + "toolbar": { + "backgroundColor": "#1C1A1D", + "checkedButtonColor": "#5B595C", + "iconCheckedColor": "#FCFCFA", + "iconColor": "#FCFCFA", + "iconDisabledColor": "#6E6C70", + "menuIndicatorColor": "#FCFCFA", + "separatorColor": "#5B595C" + }, + "viewer": { + "defaultBackgroundColor": "#221F22", + "defaultTextColor": "#939293", + "infoBackgroundColor": "#BB1C1A1D", + "infoTextColor": "#FCFCFA" + }, + "whatsNewDialog": { + "backgroundColor": "#2B282D", + "closeButtonColor": "#FCFCFA", + "contentTextColor": "#E6E6E3", + "headerDecorationColor": "#78DCE8", + "headerTextColor": "#FCFCFA", + "linkColor": "#78DCE8", + "versionTextColor": "#939293" + } +} diff --git a/YACReader/themes/builtin_dark2.json b/YACReader/themes/builtin_dark2.json new file mode 100644 index 000000000..b3e3a6ace --- /dev/null +++ b/YACReader/themes/builtin_dark2.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#F8F8F2" + }, + "goToFlowWidget": { + "editBackgroundColor": "#AA424450", + "editBorderColor": "#88424450", + "editTextColor": "#EDEDF0", + "flowBackgroundColor": "#282A36", + "flowTextColor": "#6C789C", + "iconColor": "#F8F8F2", + "labelTextColor": "#F8F8F2", + "sliderBorderColor": "#33F8F8F2", + "sliderGrooveColor": "#7721222C", + "sliderHandleColor": "#66F8F8F2", + "toolbarBackgroundColor": "#9921222C" + }, + "helpAboutDialog": { + "headingColor": "#F8F8F2", + "linkColor": "#8BE9FD" + }, + "meta": { + "displayName": "Late Night", + "id": "builtin/dark2", + "targetApp": "YACReader", + "variant": "dark", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#F8F8F2" + }, + "translator": { + "backgroundColor": "#424450", + "borderColor": "#282A36", + "iconColor": "#F8F8F2", + "inputBackgroundColor": "#343746", + "inputDarkerBackgroundColor": "#424450", + "primaryTextColor": "#F8F8F2", + "scrollbarHandleColor": "#EDEDF0", + "secondaryTextColor": "#6272A4", + "selectionBackgroundColor": "#44475A" + }, + "toolbar": { + "backgroundColor": "#21222C", + "checkedButtonColor": "#44475A", + "iconCheckedColor": "#F8F8F2", + "iconColor": "#F8F8F2", + "iconDisabledColor": "#4F566B", + "menuIndicatorColor": "#F8F8F2", + "separatorColor": "#424450" + }, + "viewer": { + "defaultBackgroundColor": "#282A36", + "defaultTextColor": "#6C789C", + "infoBackgroundColor": "#BB21222C", + "infoTextColor": "#F8F8F2" + }, + "whatsNewDialog": { + "backgroundColor": "#343746", + "closeButtonColor": "#F8F8F2", + "contentTextColor": "#EDEDF0", + "headerDecorationColor": "#8BE9FD", + "headerTextColor": "#F8F8F2", + "linkColor": "#8BE9FD", + "versionTextColor": "#6272A4" + } +} diff --git a/YACReader/themes/builtin_dark3.json b/YACReader/themes/builtin_dark3.json new file mode 100644 index 000000000..1d43cf455 --- /dev/null +++ b/YACReader/themes/builtin_dark3.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#EBDBB2" + }, + "goToFlowWidget": { + "editBackgroundColor": "#AA3C3836", + "editBorderColor": "#88504945", + "editTextColor": "#D5C4A1", + "flowBackgroundColor": "#282828", + "flowTextColor": "#928374", + "iconColor": "#EBDBB2", + "labelTextColor": "#EBDBB2", + "sliderBorderColor": "#33EBDBB2", + "sliderGrooveColor": "#771D2021", + "sliderHandleColor": "#66EBDBB2", + "toolbarBackgroundColor": "#991D2021" + }, + "helpAboutDialog": { + "headingColor": "#EBDBB2", + "linkColor": "#8EC07C" + }, + "meta": { + "displayName": "Retro Dark", + "id": "builtin/dark3", + "targetApp": "YACReader", + "variant": "dark", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#EBDBB2" + }, + "translator": { + "backgroundColor": "#504945", + "borderColor": "#282828", + "iconColor": "#EBDBB2", + "inputBackgroundColor": "#32302F", + "inputDarkerBackgroundColor": "#3C3836", + "primaryTextColor": "#EBDBB2", + "scrollbarHandleColor": "#D5C4A1", + "secondaryTextColor": "#928374", + "selectionBackgroundColor": "#504945" + }, + "toolbar": { + "backgroundColor": "#1D2021", + "checkedButtonColor": "#504945", + "iconCheckedColor": "#EBDBB2", + "iconColor": "#EBDBB2", + "iconDisabledColor": "#5B5248", + "menuIndicatorColor": "#EBDBB2", + "separatorColor": "#504945" + }, + "viewer": { + "defaultBackgroundColor": "#282828", + "defaultTextColor": "#928374", + "infoBackgroundColor": "#BB1D2021", + "infoTextColor": "#EBDBB2" + }, + "whatsNewDialog": { + "backgroundColor": "#32302F", + "closeButtonColor": "#EBDBB2", + "contentTextColor": "#D5C4A1", + "headerDecorationColor": "#8EC07C", + "headerTextColor": "#EBDBB2", + "linkColor": "#8EC07C", + "versionTextColor": "#928374" + } +} diff --git a/YACReader/themes/builtin_dark4.json b/YACReader/themes/builtin_dark4.json new file mode 100644 index 000000000..5d98ecc23 --- /dev/null +++ b/YACReader/themes/builtin_dark4.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#ECEFF4" + }, + "goToFlowWidget": { + "editBackgroundColor": "#AA434C5E", + "editBorderColor": "#884C566A", + "editTextColor": "#E5E9F0", + "flowBackgroundColor": "#2E3440", + "flowTextColor": "#787D88", + "iconColor": "#ECEFF4", + "labelTextColor": "#ECEFF4", + "sliderBorderColor": "#33ECEFF4", + "sliderGrooveColor": "#772A303B", + "sliderHandleColor": "#66ECEFF4", + "toolbarBackgroundColor": "#992A303B" + }, + "helpAboutDialog": { + "headingColor": "#ECEFF4", + "linkColor": "#8FBCBB" + }, + "meta": { + "displayName": "Frozen Dark", + "id": "builtin/dark4", + "targetApp": "YACReader", + "variant": "dark", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#ECEFF4" + }, + "translator": { + "backgroundColor": "#4C566A", + "borderColor": "#2E3440", + "iconColor": "#ECEFF4", + "inputBackgroundColor": "#3B4252", + "inputDarkerBackgroundColor": "#434C5E", + "primaryTextColor": "#ECEFF4", + "scrollbarHandleColor": "#E5E9F0", + "secondaryTextColor": "#81A1C1", + "selectionBackgroundColor": "#4C566A" + }, + "toolbar": { + "backgroundColor": "#2A303B", + "checkedButtonColor": "#4C566A", + "iconCheckedColor": "#ECEFF4", + "iconColor": "#ECEFF4", + "iconDisabledColor": "#4A5568", + "menuIndicatorColor": "#ECEFF4", + "separatorColor": "#4C566A" + }, + "viewer": { + "defaultBackgroundColor": "#2E3440", + "defaultTextColor": "#787D88", + "infoBackgroundColor": "#BB2A303B", + "infoTextColor": "#ECEFF4" + }, + "whatsNewDialog": { + "backgroundColor": "#3B4252", + "closeButtonColor": "#ECEFF4", + "contentTextColor": "#E5E9F0", + "headerDecorationColor": "#8FBCBB", + "headerTextColor": "#ECEFF4", + "linkColor": "#8FBCBB", + "versionTextColor": "#81A1C1" + } +} diff --git a/YACReader/themes/builtin_light.json b/YACReader/themes/builtin_light.json new file mode 100644 index 000000000..4027bc539 --- /dev/null +++ b/YACReader/themes/builtin_light.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#404040" + }, + "goToFlowWidget": { + "editBackgroundColor": "#22000000", + "editBorderColor": "#33000000", + "editTextColor": "#202020", + "flowBackgroundColor": "#F6F6F6", + "flowTextColor": "#202020", + "iconColor": "#404040", + "labelTextColor": "#202020", + "sliderBorderColor": "#22000000", + "sliderGrooveColor": "#33000000", + "sliderHandleColor": "#55000000", + "toolbarBackgroundColor": "#BBFFFFFF" + }, + "helpAboutDialog": { + "headingColor": "#302F2D", + "linkColor": "#C19441" + }, + "meta": { + "displayName": "Default Light", + "id": "builtin/light", + "targetApp": "YACReader", + "variant": "light", + "version": "10.0.0" + }, + "shortcutsIcons": { + "iconColor": "#606060" + }, + "translator": { + "backgroundColor": "#E8E8E8", + "borderColor": "#CCCCCC", + "iconColor": "#404040", + "inputBackgroundColor": "#F5F5F5", + "inputDarkerBackgroundColor": "#EBEBEB", + "primaryTextColor": "#1A1A1A", + "scrollbarHandleColor": "#909090", + "secondaryTextColor": "#2A2A2A", + "selectionBackgroundColor": "#DCDCDC" + }, + "toolbar": { + "backgroundColor": "#F3F3F3", + "checkedButtonColor": "#CCCCCC", + "iconCheckedColor": "#5A5A5A", + "iconColor": "#404040", + "iconDisabledColor": "#B0B0B0", + "menuIndicatorColor": "#404040", + "separatorColor": "#CCCCCC" + }, + "viewer": { + "defaultBackgroundColor": "#F6F6F6", + "defaultTextColor": "#202020", + "infoBackgroundColor": "#BBFFFFFF", + "infoTextColor": "#404040" + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#444444", + "contentTextColor": "#0A0A0A", + "headerDecorationColor": "#E8B800", + "headerTextColor": "#0A0A0A", + "linkColor": "#E8B800", + "versionTextColor": "#858585" + } +} diff --git a/YACReader/themes/builtin_light1.json b/YACReader/themes/builtin_light1.json new file mode 100644 index 000000000..f19822fe3 --- /dev/null +++ b/YACReader/themes/builtin_light1.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#5C5F77" + }, + "goToFlowWidget": { + "editBackgroundColor": "#CCF2F4F8", + "editBorderColor": "#66CCD0DA", + "editTextColor": "#4C4F69", + "flowBackgroundColor": "#E6E9EF", + "flowTextColor": "#5C5F77", + "iconColor": "#4C4F69", + "labelTextColor": "#4C4F69", + "sliderBorderColor": "#33CCD0DA", + "sliderGrooveColor": "#66CCD0DA", + "sliderHandleColor": "#884C4F69", + "toolbarBackgroundColor": "#CCF2F4F8" + }, + "helpAboutDialog": { + "headingColor": "#303446", + "linkColor": "#8CAAEE" + }, + "meta": { + "displayName": "Pastel", + "id": "builtin/light1", + "targetApp": "YACReader", + "variant": "light", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#5C5F77" + }, + "translator": { + "backgroundColor": "#F4F5F8", + "borderColor": "#CCD0DA", + "iconColor": "#5C5F77", + "inputBackgroundColor": "#EFF1F5", + "inputDarkerBackgroundColor": "#E6E9EF", + "primaryTextColor": "#4C4F69", + "scrollbarHandleColor": "#8C8FA1", + "secondaryTextColor": "#8C8FA1", + "selectionBackgroundColor": "#DCE0E8" + }, + "toolbar": { + "backgroundColor": "#F2F4F8", + "checkedButtonColor": "#CCD0DA", + "iconCheckedColor": "#303446", + "iconColor": "#4C4F69", + "iconDisabledColor": "#9CA0B0", + "menuIndicatorColor": "#4C4F69", + "separatorColor": "#CCD0DA" + }, + "viewer": { + "defaultBackgroundColor": "#E6E9EF", + "defaultTextColor": "#5C5F77", + "infoBackgroundColor": "#CCF2F4F8", + "infoTextColor": "#4C4F69" + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#4C4F69", + "contentTextColor": "#303446", + "headerDecorationColor": "#BABBF1", + "headerTextColor": "#303446", + "linkColor": "#8CAAEE", + "versionTextColor": "#8C8FA1" + } +} diff --git a/YACReader/themes/builtin_light2.json b/YACReader/themes/builtin_light2.json new file mode 100644 index 000000000..bac201e04 --- /dev/null +++ b/YACReader/themes/builtin_light2.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#4A5685" + }, + "goToFlowWidget": { + "editBackgroundColor": "#CCEEF1F8", + "editBorderColor": "#66C4C8DA", + "editTextColor": "#2F334D", + "flowBackgroundColor": "#D5D6DB", + "flowTextColor": "#4A5685", + "iconColor": "#2F334D", + "labelTextColor": "#2F334D", + "sliderBorderColor": "#33C4C8DA", + "sliderGrooveColor": "#66C4C8DA", + "sliderHandleColor": "#882F334D", + "toolbarBackgroundColor": "#CCEEF1F8" + }, + "helpAboutDialog": { + "headingColor": "#2F334D", + "linkColor": "#2E7DE9" + }, + "meta": { + "displayName": "Late Day", + "id": "builtin/light2", + "targetApp": "YACReader", + "variant": "light", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#4A5685" + }, + "translator": { + "backgroundColor": "#F5F6FA", + "borderColor": "#C4C8DA", + "iconColor": "#4A5685", + "inputBackgroundColor": "#EEF1F8", + "inputDarkerBackgroundColor": "#D7D8DD", + "primaryTextColor": "#2F334D", + "scrollbarHandleColor": "#8990B3", + "secondaryTextColor": "#8990B3", + "selectionBackgroundColor": "#D7D8DD" + }, + "toolbar": { + "backgroundColor": "#EEF1F8", + "checkedButtonColor": "#C4C8DA", + "iconCheckedColor": "#2F334D", + "iconColor": "#2F334D", + "iconDisabledColor": "#A1A6C5", + "menuIndicatorColor": "#2F334D", + "separatorColor": "#C4C8DA" + }, + "viewer": { + "defaultBackgroundColor": "#D5D6DB", + "defaultTextColor": "#4A5685", + "infoBackgroundColor": "#CCEEF1F8", + "infoTextColor": "#2F334D" + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#2F334D", + "contentTextColor": "#1F2335", + "headerDecorationColor": "#2E7DE9", + "headerTextColor": "#1F2335", + "linkColor": "#2E7DE9", + "versionTextColor": "#8990B3" + } +} diff --git a/YACReader/themes/builtin_light3.json b/YACReader/themes/builtin_light3.json new file mode 100644 index 000000000..37c822007 --- /dev/null +++ b/YACReader/themes/builtin_light3.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#708089" + }, + "goToFlowWidget": { + "editBackgroundColor": "#CCFBF7EA", + "editBorderColor": "#66E6E2CC", + "editTextColor": "#4F5B58", + "flowBackgroundColor": "#EFEBD4", + "flowTextColor": "#5C6A72", + "iconColor": "#4F5B58", + "labelTextColor": "#4F5B58", + "sliderBorderColor": "#33E6E2CC", + "sliderGrooveColor": "#66E6E2CC", + "sliderHandleColor": "#884F5B58", + "toolbarBackgroundColor": "#CCFBF7EA" + }, + "helpAboutDialog": { + "headingColor": "#4F5B58", + "linkColor": "#3A94C5" + }, + "meta": { + "displayName": "Fadegreen", + "id": "builtin/light3", + "targetApp": "YACReader", + "variant": "light", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#708089" + }, + "translator": { + "backgroundColor": "#FDF6E3", + "borderColor": "#E6E2CC", + "iconColor": "#708089", + "inputBackgroundColor": "#FFFBEF", + "inputDarkerBackgroundColor": "#F4F0D9", + "primaryTextColor": "#4F5B58", + "scrollbarHandleColor": "#859289", + "secondaryTextColor": "#859289", + "selectionBackgroundColor": "#EFEBD4" + }, + "toolbar": { + "backgroundColor": "#FBF7EA", + "checkedButtonColor": "#E6E2CC", + "iconCheckedColor": "#4F5B58", + "iconColor": "#4F5B58", + "iconDisabledColor": "#9DA9A0", + "menuIndicatorColor": "#4F5B58", + "separatorColor": "#E6E2CC" + }, + "viewer": { + "defaultBackgroundColor": "#EFEBD4", + "defaultTextColor": "#5C6A72", + "infoBackgroundColor": "#CCFBF7EA", + "infoTextColor": "#4F5B58" + }, + "whatsNewDialog": { + "backgroundColor": "#FFFBEF", + "closeButtonColor": "#4F5B58", + "contentTextColor": "#3F4B47", + "headerDecorationColor": "#8DA101", + "headerTextColor": "#3F4B47", + "linkColor": "#3A94C5", + "versionTextColor": "#859289" + } +} diff --git a/YACReader/themes/builtin_light4.json b/YACReader/themes/builtin_light4.json new file mode 100644 index 000000000..d7f33aa62 --- /dev/null +++ b/YACReader/themes/builtin_light4.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#6E6A86" + }, + "goToFlowWidget": { + "editBackgroundColor": "#CCFFF8F1", + "editBorderColor": "#66D9CEC7", + "editTextColor": "#575279", + "flowBackgroundColor": "#E8DDD3", + "flowTextColor": "#6E6A86", + "iconColor": "#575279", + "labelTextColor": "#575279", + "sliderBorderColor": "#33D9CEC7", + "sliderGrooveColor": "#66D9CEC7", + "sliderHandleColor": "#88575279", + "toolbarBackgroundColor": "#CCFFF8F1" + }, + "helpAboutDialog": { + "headingColor": "#4F4A72", + "linkColor": "#286983" + }, + "meta": { + "displayName": "Rose", + "id": "builtin/light4", + "targetApp": "YACReader", + "variant": "light", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#6E6A86" + }, + "translator": { + "backgroundColor": "#FFF8F2", + "borderColor": "#D9CEC7", + "iconColor": "#6E6A86", + "inputBackgroundColor": "#FAF4ED", + "inputDarkerBackgroundColor": "#F2E9E1", + "primaryTextColor": "#575279", + "scrollbarHandleColor": "#8E879C", + "secondaryTextColor": "#A59EAF", + "selectionBackgroundColor": "#E8DDD3" + }, + "toolbar": { + "backgroundColor": "#FFF8F1", + "checkedButtonColor": "#E8DDD3", + "iconCheckedColor": "#4F4A72", + "iconColor": "#575279", + "iconDisabledColor": "#B4AAB8", + "menuIndicatorColor": "#575279", + "separatorColor": "#D9CEC7" + }, + "viewer": { + "defaultBackgroundColor": "#E8DDD3", + "defaultTextColor": "#6E6A86", + "infoBackgroundColor": "#CCFFF8F1", + "infoTextColor": "#575279" + }, + "whatsNewDialog": { + "backgroundColor": "#FFF8F2", + "closeButtonColor": "#575279", + "contentTextColor": "#4F4A72", + "headerDecorationColor": "#907AA9", + "headerTextColor": "#4F4A72", + "linkColor": "#286983", + "versionTextColor": "#A59EAF" + } +} diff --git a/YACReader/themes/builtin_light5.json b/YACReader/themes/builtin_light5.json new file mode 100644 index 000000000..3cb78d05f --- /dev/null +++ b/YACReader/themes/builtin_light5.json @@ -0,0 +1,67 @@ +{ + "dialogIcons": { + "iconColor": "#716E61" + }, + "goToFlowWidget": { + "editBackgroundColor": "#CCFCF7ED", + "editBorderColor": "#66D8CDBA", + "editTextColor": "#545464", + "flowBackgroundColor": "#E7DCCB", + "flowTextColor": "#716E61", + "iconColor": "#545464", + "labelTextColor": "#545464", + "sliderBorderColor": "#33D8CDBA", + "sliderGrooveColor": "#66D8CDBA", + "sliderHandleColor": "#88545464", + "toolbarBackgroundColor": "#CCFCF7ED" + }, + "helpAboutDialog": { + "headingColor": "#43436C", + "linkColor": "#4D699B" + }, + "meta": { + "displayName": "Lotus", + "id": "builtin/light5", + "targetApp": "YACReader", + "variant": "light", + "version": "10.1.0" + }, + "shortcutsIcons": { + "iconColor": "#716E61" + }, + "translator": { + "backgroundColor": "#FFF9F0", + "borderColor": "#D8CDBA", + "iconColor": "#716E61", + "inputBackgroundColor": "#F7F2E7", + "inputDarkerBackgroundColor": "#F1E7D7", + "primaryTextColor": "#545464", + "scrollbarHandleColor": "#7D7A73", + "secondaryTextColor": "#A6A294", + "selectionBackgroundColor": "#E7DCCB" + }, + "toolbar": { + "backgroundColor": "#FCF7ED", + "checkedButtonColor": "#E7DCCB", + "iconCheckedColor": "#43436C", + "iconColor": "#545464", + "iconDisabledColor": "#A6A294", + "menuIndicatorColor": "#545464", + "separatorColor": "#D8CDBA" + }, + "viewer": { + "defaultBackgroundColor": "#E7DCCB", + "defaultTextColor": "#716E61", + "infoBackgroundColor": "#CCFCF7ED", + "infoTextColor": "#545464" + }, + "whatsNewDialog": { + "backgroundColor": "#FFF9F0", + "closeButtonColor": "#545464", + "contentTextColor": "#43436C", + "headerDecorationColor": "#5D57A3", + "headerTextColor": "#43436C", + "linkColor": "#4D699B", + "versionTextColor": "#A6A294" + } +} diff --git a/YACReader/themes/theme.h b/YACReader/themes/theme.h new file mode 100644 index 000000000..1355dfbeb --- /dev/null +++ b/YACReader/themes/theme.h @@ -0,0 +1,202 @@ +#ifndef THEME_H +#define THEME_H + +#include "help_about_dialog_theme.h" +#include "theme_meta.h" +#include "whats_new_dialog_theme.h" + +#include +#include + +struct ToolbarThemeTemplates { + QString toolbarQSS = "QToolBar { border: none; background: %1; }\n" + "QToolBar::separator { background: %2; width: 1px; margin: 5px 4px; }\n" + "QToolButton:checked { background-color: %3; }\n" + "QToolButton::menu-button {border: none; width: 18px; }\n" + "QToolButton::menu-arrow { image: url(%4); width: 8px; height: 8px; }\n"; + QString menuArrowPath = ":/images/viewer_toolbar/menuArrow.svg"; +}; + +struct ViewerThemeTemplates { + QString infoLabelQSS = "QLabel { color : %1; font-size:%2px; }"; +}; + +struct TranslatorThemeTemplates { + // %1 = track color, %2 = handle color + QString scrollBarQSS = "QScrollBar:vertical { border: none; background: %1; width: 7px; margin: 0 3px 0 0; }" + "QScrollBar::handle:vertical { background: %2; width: 7px; min-height: 20px; }" + "QScrollBar::add-line:vertical { border: none; background: %1; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::sub-line:vertical { border: none; background: %1; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" + "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" + "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }"; + // %1 = background, %2 = text color + QString textEditQSS = "QTextEdit{border:none;background:%1;color:%2; font-size:12px; padding:6px;}"; + // %1 = background, %2 = text color, %3 = arrow icon path, %4 = list background, %5 = selection background + QString comboBoxQSS = "QComboBox {border:none;background:%1;color:%2;font-size:12px;font-family:Arial;padding-left:8px;}" + "QComboBox::down-arrow {image: url(%3);}" + "QComboBox::drop-down {border:none; padding-right:10px;}" + "QComboBox QAbstractItemView {border: none; background:%4; color:%2; selection-background-color: %5; outline:none;}" + "QComboBox QAbstractItemView::item {padding-left:8px;}"; + // %1 = border color, %2 = background, %3 = text color + QString clearButtonQSS = "QPushButton {border:1px solid %1; background:%2; color:%3; font-family:Arial; font-size:12px; padding-top:5px; padding-bottom:5px;}"; + // %1 = text color + QString titleQSS = "QLabel {font-size:18px; font-family:Arial; color:%1;}"; + QString resultsTitleQSS = "QLabel {font-family:Arial;font-size:14px;color:%1;}"; + QString resultTextQSS = "QLabel {color:%1;font-size:12px;}"; +}; + +struct GoToFlowWidgetThemeTemplates { + QString sliderQSS = "QSlider::groove:horizontal {" + " border: 1px solid %1;" + " border-radius: 1px;" + " background: %2;" + " margin: 2px 0;" + " padding: 1px;" + "}" + "QSlider::handle:horizontal {" + " background: %3;" + " width: 48px;" + " border-radius: 1px;" + "}"; + QString editQSS = "QLineEdit {border: 1px solid %1; background: %2; color: %3; padding: 3px 5px 5px 5px; margin: 13px 5px 12px 5px; font-weight:bold}"; + QString buttonQSS = "QPushButton { border: none; padding: 0px; } " + "QPushButton:focus { border: none; outline: none; } " + "QPushButton:pressed { padding-top: 1px; padding-left: 1px; padding-bottom: -1px; padding-right: -1px; }"; + QString labelQSS = "QLabel { color: %1; }"; +}; + +struct TranslatorTheme { + QColor backgroundColor; + QColor inputBackgroundColor; + QString scrollBarQSS; + QString textEditQSS; + QString comboBoxQSS; + QString clearButtonQSS; + QString titleQSS; + QString resultsTitleQSS; + QString resultTextQSS; + QIcon closeIcon; + QIcon speakerIcon; + QIcon searchIcon; + QPixmap fromToPixmap; +}; + +struct ToolbarTheme { + QString toolbarQSS; + + QIcon openAction; + QIcon openAction18x18; + QIcon openFolderAction; + QIcon openFolderAction18x18; + QIcon openLatestComicAction; + QIcon openLatestComicAction18x18; + QIcon saveImageAction; + QIcon saveImageAction18x18; + QIcon openComicOnTheLeftAction; + QIcon openComicOnTheLeftAction18x18; + QIcon openComicOnTheRightAction; + QIcon openComicOnTheRightAction18x18; + QIcon goToPageOnTheLeftAction; + QIcon goToPageOnTheLeftAction18x18; + QIcon goToPageOnTheRightAction; + QIcon goToPageOnTheRightAction18x18; + QIcon adjustHeightAction; + QIcon adjustHeightAction18x18; + QIcon adjustWidthAction; + QIcon adjustWidthAction18x18; + QIcon leftRotationAction; + QIcon leftRotationAction18x18; + QIcon rightRotationAction; + QIcon rightRotationAction18x18; + QIcon doublePageAction; + QIcon doublePageAction18x18; + QIcon doubleMangaPageAction; + QIcon doubleMangaPageAction18x18; + QIcon increasePageZoomAction; + QIcon increasePageZoomAction18x18; + QIcon decreasePageZoomAction; + QIcon decreasePageZoomAction18x18; + QIcon resetZoomAction; + QIcon resetZoomAction18x18; + QIcon showZoomSliderlAction; + QIcon showZoomSliderlAction18x18; + QIcon goToPageAction; + QIcon goToPageAction18x18; + QIcon optionsAction; + QIcon optionsAction18x18; + QIcon helpAboutAction; + QIcon helpAboutAction18x18; + QIcon showMagnifyingGlassAction; + QIcon showMagnifyingGlassAction18x18; + QIcon setBookmarkAction; + QIcon setBookmarkAction18x18; + QIcon showBookmarksAction; + QIcon showBookmarksAction18x18; + QIcon showShorcutsAction; + QIcon showShorcutsAction18x18; + QIcon showInfoAction; + QIcon showInfoAction18x18; + QIcon closeAction; + QIcon closeAction18x18; + QIcon showDictionaryAction; + QIcon showDictionaryAction18x18; + QIcon adjustToFullSizeAction; + QIcon adjustToFullSizeAction18x18; + QIcon fitToPageAction; + QIcon fitToPageAction18x18; + QIcon continuousScrollAction; + QIcon continuousScrollAction18x18; + QIcon showFlowAction; + QIcon showFlowAction18x18; +}; + +struct ViewerTheme { + QColor defaultBackgroundColor; + QColor defaultTextColor; + + QColor infoBackgroundColor; + + QString infoLabelQSS; +}; + +struct GoToFlowWidgetTheme { + QColor flowBackgroundColor; + QColor flowTextColor; + QColor toolbarBackgroundColor; + QString sliderQSS; + QString editQSS; + QString buttonQSS; + QString labelQSS; + QIcon centerIcon; + QIcon goToIcon; +}; + +struct ShortcutsIconsTheme { + QIcon comicsIcon; + QIcon generalIcon; + QIcon magnifyingGlassIcon; + QIcon pageIcon; + QIcon readingIcon; +}; + +struct DialogIconsTheme { + QIcon findFolderIcon; + QPixmap goToDialogIcon; +}; + +struct Theme { + ThemeMeta meta; + QJsonObject sourceJson; + + TranslatorTheme translator; + ToolbarTheme toolbar; + ViewerTheme viewer; + GoToFlowWidgetTheme goToFlowWidget; + HelpAboutDialogTheme helpAboutDialog; + WhatsNewDialogTheme whatsNewDialog; + ShortcutsIconsTheme shortcutsIcons; + DialogIconsTheme dialogIcons; +}; + +#endif // THEME_H diff --git a/YACReader/themes/theme_factory.cpp b/YACReader/themes/theme_factory.cpp new file mode 100644 index 000000000..42f07fe80 --- /dev/null +++ b/YACReader/themes/theme_factory.cpp @@ -0,0 +1,383 @@ +#include "theme_factory.h" + +#include "icon_utils.h" +#include "theme_meta.h" + +#include + +struct ToolbarParams { + ToolbarThemeTemplates t; + + QColor iconColor; + QColor iconDisabledColor; + QColor iconCheckedColor; + QColor backgroundColor; + QColor separatorColor; + QColor checkedButtonColor; + QColor menuIndicatorColor; +}; + +struct ViewerParams { + ViewerThemeTemplates t; + + QColor defaultBackgroundColor; + QColor defaultTextColor; + QColor infoBackgroundColor; + QColor infoTextColor; +}; + +struct GoToFlowWidgetParams { + GoToFlowWidgetThemeTemplates t; + + QColor flowBackgroundColor; + QColor flowTextColor; + QColor toolbarBackgroundColor; + QColor sliderBorderColor; + QColor sliderGrooveColor; + QColor sliderHandleColor; + QColor editBorderColor; + QColor editBackgroundColor; + QColor editTextColor; + QColor labelTextColor; + QColor iconColor; +}; + +struct WhatsNewDialogParams { + QColor backgroundColor; + QColor headerTextColor; + QColor versionTextColor; + QColor contentTextColor; + QColor linkColor; + QColor closeButtonColor; + QColor headerDecorationColor; +}; + +struct ShortcutsIconsParams { + QColor iconColor; // Main icon color (replaces #f0f) +}; + +struct DialogIconsParams { + QColor iconColor; // Main icon color (replaces #f0f) +}; + +struct TranslatorParams { + TranslatorThemeTemplates t; + + QColor backgroundColor { 0x40, 0x40, 0x40 }; + QColor inputBackgroundColor { 0x2a, 0x2a, 0x2a }; + QColor inputDarkerBackgroundColor { 0x27, 0x27, 0x27 }; + QColor selectionBackgroundColor { 0x20, 0x20, 0x20 }; + QColor primaryTextColor { Qt::white }; + QColor secondaryTextColor { 0xe3, 0xe3, 0xe3 }; + QColor scrollbarHandleColor { 0xdd, 0xdd, 0xdd }; + QColor borderColor { 0x21, 0x21, 0x21 }; + QColor iconColor { 0xcc, 0xcc, 0xcc }; +}; + +struct ThemeParams { + ThemeMeta meta; + + ToolbarParams toolbarParams; + ViewerParams viewerParams; + GoToFlowWidgetParams goToFlowWidgetParams; + HelpAboutDialogTheme helpAboutDialogParams; + WhatsNewDialogParams whatsNewDialogParams; + ShortcutsIconsParams shortcutsIconsParams; + DialogIconsParams dialogIconsParams; + TranslatorParams translatorParams; +}; + +void setToolbarIconPair(QIcon &icon, + QIcon &icon18, + const QString &basePath, + const QColor &iconColor, + const QColor &disabledColor, + const QColor &checkedColor, + const QString &themeId) +{ + QString path18 = basePath; + if (path18.endsWith(".svg")) + path18.insert(path18.size() - 4, "_18x18"); + else + path18.append("_18x18"); + + // Normal + const QString normalPath = recoloredSvgToThemeFile(basePath, iconColor, themeId); + const QString normalPath18 = recoloredSvgToThemeFile(path18, iconColor, themeId); + // Disabled + const QString disabledPath = recoloredSvgToThemeFile(basePath, disabledColor, themeId, { .suffix = "_disabled" }); + const QString disabledPath18 = recoloredSvgToThemeFile(path18, disabledColor, themeId, { .suffix = "_disabled" }); + // Checked (On state) + const QString checkedPath = recoloredSvgToThemeFile(basePath, checkedColor, themeId, { .suffix = "_checked" }); + const QString checkedPath18 = recoloredSvgToThemeFile(path18, checkedColor, themeId, { .suffix = "_checked" }); + + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(disabledPath, QSize(), QIcon::Disabled, QIcon::Off); + icon.addFile(checkedPath, QSize(), QIcon::Normal, QIcon::On); + icon.addFile(disabledPath, QSize(), QIcon::Disabled, QIcon::On); + + icon18.addFile(normalPath18, QSize(), QIcon::Normal, QIcon::Off); + icon18.addFile(disabledPath18, QSize(), QIcon::Disabled, QIcon::Off); + icon18.addFile(checkedPath18, QSize(), QIcon::Normal, QIcon::On); + icon18.addFile(disabledPath18, QSize(), QIcon::Disabled, QIcon::On); +} + +Theme makeTheme(const ThemeParams ¶ms) +{ + Theme theme; + + theme.meta = params.meta; + + // Toolbar & actions + theme.toolbar.toolbarQSS = params.toolbarParams.t.toolbarQSS.arg(params.toolbarParams.backgroundColor.name(), params.toolbarParams.separatorColor.name(), params.toolbarParams.checkedButtonColor.name(), recoloredSvgToThemeFile(params.toolbarParams.t.menuArrowPath, params.toolbarParams.menuIndicatorColor, params.meta.id)); + + auto setToolbarIconPairT = [&](QIcon &icon, QIcon &icon18, const QString &basePath) { + setToolbarIconPair(icon, icon18, basePath, params.toolbarParams.iconColor, params.toolbarParams.iconDisabledColor, params.toolbarParams.iconCheckedColor, params.meta.id); + }; + + setToolbarIconPairT(theme.toolbar.openAction, theme.toolbar.openAction18x18, ":/images/viewer_toolbar/open.svg"); + setToolbarIconPairT(theme.toolbar.openFolderAction, theme.toolbar.openFolderAction18x18, ":/images/viewer_toolbar/openFolder.svg"); + setToolbarIconPairT(theme.toolbar.openLatestComicAction, theme.toolbar.openLatestComicAction18x18, ":/images/viewer_toolbar/openNext.svg"); + setToolbarIconPairT(theme.toolbar.saveImageAction, theme.toolbar.saveImageAction18x18, ":/images/viewer_toolbar/save.svg"); + setToolbarIconPairT(theme.toolbar.openComicOnTheLeftAction, theme.toolbar.openComicOnTheLeftAction18x18, ":/images/viewer_toolbar/openPrevious.svg"); + setToolbarIconPairT(theme.toolbar.openComicOnTheRightAction, theme.toolbar.openComicOnTheRightAction18x18, ":/images/viewer_toolbar/openNext.svg"); + setToolbarIconPairT(theme.toolbar.goToPageOnTheLeftAction, theme.toolbar.goToPageOnTheLeftAction18x18, ":/images/viewer_toolbar/previous.svg"); + setToolbarIconPairT(theme.toolbar.goToPageOnTheRightAction, theme.toolbar.goToPageOnTheRightAction18x18, ":/images/viewer_toolbar/next.svg"); + setToolbarIconPairT(theme.toolbar.adjustHeightAction, theme.toolbar.adjustHeightAction18x18, ":/images/viewer_toolbar/toHeight.svg"); + setToolbarIconPairT(theme.toolbar.adjustWidthAction, theme.toolbar.adjustWidthAction18x18, ":/images/viewer_toolbar/toWidth.svg"); + setToolbarIconPairT(theme.toolbar.leftRotationAction, theme.toolbar.leftRotationAction18x18, ":/images/viewer_toolbar/rotateL.svg"); + setToolbarIconPairT(theme.toolbar.rightRotationAction, theme.toolbar.rightRotationAction18x18, ":/images/viewer_toolbar/rotateR.svg"); + setToolbarIconPairT(theme.toolbar.doublePageAction, theme.toolbar.doublePageAction18x18, ":/images/viewer_toolbar/doublePage.svg"); + setToolbarIconPairT(theme.toolbar.doubleMangaPageAction, theme.toolbar.doubleMangaPageAction18x18, ":/images/viewer_toolbar/doubleMangaPage.svg"); + setToolbarIconPairT(theme.toolbar.showZoomSliderlAction, theme.toolbar.showZoomSliderlAction18x18, ":/images/viewer_toolbar/zoom.svg"); + setToolbarIconPairT(theme.toolbar.goToPageAction, theme.toolbar.goToPageAction18x18, ":/images/viewer_toolbar/goto.svg"); + setToolbarIconPairT(theme.toolbar.optionsAction, theme.toolbar.optionsAction18x18, ":/images/viewer_toolbar/options.svg"); + setToolbarIconPairT(theme.toolbar.helpAboutAction, theme.toolbar.helpAboutAction18x18, ":/images/viewer_toolbar/help.svg"); + setToolbarIconPairT(theme.toolbar.showMagnifyingGlassAction, theme.toolbar.showMagnifyingGlassAction18x18, ":/images/viewer_toolbar/magnifyingGlass.svg"); + setToolbarIconPairT(theme.toolbar.setBookmarkAction, theme.toolbar.setBookmarkAction18x18, ":/images/viewer_toolbar/bookmark.svg"); + setToolbarIconPairT(theme.toolbar.showBookmarksAction, theme.toolbar.showBookmarksAction18x18, ":/images/viewer_toolbar/showBookmarks.svg"); + setToolbarIconPairT(theme.toolbar.showShorcutsAction, theme.toolbar.showShorcutsAction18x18, ":/images/viewer_toolbar/shortcuts.svg"); + setToolbarIconPairT(theme.toolbar.showInfoAction, theme.toolbar.showInfoAction18x18, ":/images/viewer_toolbar/info.svg"); + setToolbarIconPairT(theme.toolbar.closeAction, theme.toolbar.closeAction18x18, ":/images/viewer_toolbar/close.svg"); + setToolbarIconPairT(theme.toolbar.showDictionaryAction, theme.toolbar.showDictionaryAction18x18, ":/images/viewer_toolbar/translator.svg"); + setToolbarIconPairT(theme.toolbar.adjustToFullSizeAction, theme.toolbar.adjustToFullSizeAction18x18, ":/images/viewer_toolbar/full.svg"); + setToolbarIconPairT(theme.toolbar.fitToPageAction, theme.toolbar.fitToPageAction18x18, ":/images/viewer_toolbar/fitToPage.svg"); + setToolbarIconPairT(theme.toolbar.continuousScrollAction, theme.toolbar.continuousScrollAction18x18, ":/images/viewer_toolbar/toContinuousScroll.svg"); + setToolbarIconPairT(theme.toolbar.showFlowAction, theme.toolbar.showFlowAction18x18, ":/images/viewer_toolbar/flow.svg"); + // end Toolbar & actions + + // Viewer + theme.viewer.defaultBackgroundColor = params.viewerParams.defaultBackgroundColor; + theme.viewer.defaultTextColor = params.viewerParams.defaultTextColor; + theme.viewer.infoBackgroundColor = params.viewerParams.infoBackgroundColor; + theme.viewer.infoLabelQSS = params.viewerParams.t.infoLabelQSS.arg(params.viewerParams.infoTextColor.name()); + // end Viewer + + // GoToFlowWidget + auto &gotoParams = params.goToFlowWidgetParams; + theme.goToFlowWidget.flowBackgroundColor = gotoParams.flowBackgroundColor; + theme.goToFlowWidget.flowTextColor = gotoParams.flowTextColor; + theme.goToFlowWidget.toolbarBackgroundColor = gotoParams.toolbarBackgroundColor; + theme.goToFlowWidget.sliderQSS = gotoParams.t.sliderQSS.arg( + gotoParams.sliderBorderColor.name(QColor::HexArgb), + gotoParams.sliderGrooveColor.name(QColor::HexArgb), + gotoParams.sliderHandleColor.name(QColor::HexArgb)); + theme.goToFlowWidget.editQSS = gotoParams.t.editQSS.arg( + gotoParams.editBorderColor.name(QColor::HexArgb), + gotoParams.editBackgroundColor.name(QColor::HexArgb), + gotoParams.editTextColor.name()); + theme.goToFlowWidget.buttonQSS = gotoParams.t.buttonQSS; + theme.goToFlowWidget.labelQSS = gotoParams.t.labelQSS.arg(gotoParams.labelTextColor.name()); + + const QString centerIconPath = recoloredSvgToThemeFile(":/images/centerFlow.svg", gotoParams.iconColor, params.meta.id); + const QString goToIconPath = recoloredSvgToThemeFile(":/images/gotoFlow.svg", gotoParams.iconColor, params.meta.id); + theme.goToFlowWidget.centerIcon = QIcon(centerIconPath); + theme.goToFlowWidget.goToIcon = QIcon(goToIconPath); + // end GoToFlowWidget + + // HelpAboutDialog + theme.helpAboutDialog = params.helpAboutDialogParams; + // end HelpAboutDialog + + // WhatsNewDialog + const auto &wn = params.whatsNewDialogParams; + theme.whatsNewDialog.backgroundColor = wn.backgroundColor; + theme.whatsNewDialog.headerTextColor = wn.headerTextColor; + theme.whatsNewDialog.versionTextColor = wn.versionTextColor; + theme.whatsNewDialog.contentTextColor = wn.contentTextColor; + theme.whatsNewDialog.linkColor = wn.linkColor; + theme.whatsNewDialog.closeButtonIcon = QPixmap(recoloredSvgToThemeFile(":/images/custom_dialog/custom_close_button.svg", wn.closeButtonColor, params.meta.id)); + theme.whatsNewDialog.headerDecoration = QPixmap(recoloredSvgToThemeFile(":/images/whats_new/whatsnew_header.svg", wn.headerDecorationColor, params.meta.id)); + // end WhatsNewDialog + + // ShortcutsIcons + const auto &sci = params.shortcutsIconsParams; + auto makeShortcutsIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, sci.iconColor, params.meta.id); + return QIcon(path); + }; + + theme.shortcutsIcons.comicsIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_comics.svg"); + theme.shortcutsIcons.generalIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_general.svg"); + theme.shortcutsIcons.magnifyingGlassIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_mglass.svg"); + theme.shortcutsIcons.pageIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_page.svg"); + theme.shortcutsIcons.readingIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_reading.svg"); + // end ShortcutsIcons + + // FindFolder icon (used in OptionsDialog) + { + const QString path = recoloredSvgToThemeFile(":/images/find_folder.svg", params.toolbarParams.iconColor, params.meta.id); + const qreal dpr = qApp->devicePixelRatio(); + theme.dialogIcons.findFolderIcon = QIcon(renderSvgToPixmap(path, 13, 13, dpr)); + } + + // Translator + { + const auto &tr = params.translatorParams; + theme.translator.backgroundColor = tr.backgroundColor; + theme.translator.inputBackgroundColor = tr.inputBackgroundColor; + theme.translator.scrollBarQSS = tr.t.scrollBarQSS.arg( + tr.backgroundColor.name(), + tr.scrollbarHandleColor.name()); + theme.translator.textEditQSS = tr.t.textEditQSS.arg( + tr.inputBackgroundColor.name(), + tr.primaryTextColor.name()); + const QString dropDownArrowPath = recoloredSvgToThemeFile( + ":/images/translator/dropDownArrow.svg", tr.iconColor, params.meta.id); + theme.translator.comboBoxQSS = tr.t.comboBoxQSS.arg( + tr.inputBackgroundColor.name(), + tr.primaryTextColor.name(), + dropDownArrowPath, + tr.inputDarkerBackgroundColor.name(), + tr.selectionBackgroundColor.name()); + theme.translator.clearButtonQSS = tr.t.clearButtonQSS.arg( + tr.borderColor.name(), + tr.inputBackgroundColor.name(), + tr.primaryTextColor.name()); + theme.translator.titleQSS = tr.t.titleQSS.arg(tr.primaryTextColor.name()); + theme.translator.resultsTitleQSS = tr.t.resultsTitleQSS.arg(tr.secondaryTextColor.name()); + theme.translator.resultTextQSS = tr.t.resultTextQSS.arg(tr.primaryTextColor.name()); + theme.translator.closeIcon = QIcon(recoloredSvgToThemeFile( + ":/images/translator/close.svg", tr.iconColor, params.meta.id)); + theme.translator.speakerIcon = QIcon(recoloredSvgToThemeFile( + ":/images/translator/speaker.svg", tr.iconColor, params.meta.id)); + theme.translator.searchIcon = QIcon(recoloredSvgToThemeFile( + ":/images/translator/translatorSearch.svg", tr.iconColor, params.meta.id)); + theme.translator.fromToPixmap = QPixmap(recoloredSvgToThemeFile( + ":/images/translator/fromTo.svg", tr.iconColor, params.meta.id)); + } + // end Translator + + return theme; +} + +// JSON helpers --------------------------------------------------------------- + +static QColor colorFromJson(const QJsonObject &obj, const QString &key, const QColor &fallback) +{ + if (!obj.contains(key)) + return fallback; + QColor c(obj[key].toString()); + return c.isValid() ? c : fallback; +} + +Theme makeTheme(const QJsonObject &json) +{ + ThemeParams p; + + if (json.contains("toolbar")) { + const auto t = json["toolbar"].toObject(); + auto &tp = p.toolbarParams; + tp.iconColor = colorFromJson(t, "iconColor", tp.iconColor); + tp.iconDisabledColor = colorFromJson(t, "iconDisabledColor", tp.iconDisabledColor); + tp.iconCheckedColor = colorFromJson(t, "iconCheckedColor", tp.iconCheckedColor); + tp.backgroundColor = colorFromJson(t, "backgroundColor", tp.backgroundColor); + tp.separatorColor = colorFromJson(t, "separatorColor", tp.separatorColor); + tp.checkedButtonColor = colorFromJson(t, "checkedButtonColor", tp.checkedButtonColor); + tp.menuIndicatorColor = colorFromJson(t, "menuIndicatorColor", tp.menuIndicatorColor); + } + + if (json.contains("viewer")) { + const auto v = json["viewer"].toObject(); + auto &vp = p.viewerParams; + vp.defaultBackgroundColor = colorFromJson(v, "defaultBackgroundColor", vp.defaultBackgroundColor); + vp.defaultTextColor = colorFromJson(v, "defaultTextColor", vp.defaultTextColor); + vp.infoBackgroundColor = colorFromJson(v, "infoBackgroundColor", vp.infoBackgroundColor); + vp.infoTextColor = colorFromJson(v, "infoTextColor", vp.infoTextColor); + } + + if (json.contains("goToFlowWidget")) { + const auto g = json["goToFlowWidget"].toObject(); + auto &gp = p.goToFlowWidgetParams; + gp.flowBackgroundColor = colorFromJson(g, "flowBackgroundColor", gp.flowBackgroundColor); + gp.flowTextColor = colorFromJson(g, "flowTextColor", gp.flowTextColor); + gp.toolbarBackgroundColor = colorFromJson(g, "toolbarBackgroundColor", gp.toolbarBackgroundColor); + gp.sliderBorderColor = colorFromJson(g, "sliderBorderColor", gp.sliderBorderColor); + gp.sliderGrooveColor = colorFromJson(g, "sliderGrooveColor", gp.sliderGrooveColor); + gp.sliderHandleColor = colorFromJson(g, "sliderHandleColor", gp.sliderHandleColor); + gp.editBorderColor = colorFromJson(g, "editBorderColor", gp.editBorderColor); + gp.editBackgroundColor = colorFromJson(g, "editBackgroundColor", gp.editBackgroundColor); + gp.editTextColor = colorFromJson(g, "editTextColor", gp.editTextColor); + gp.labelTextColor = colorFromJson(g, "labelTextColor", gp.labelTextColor); + gp.iconColor = colorFromJson(g, "iconColor", gp.iconColor); + } + + if (json.contains("helpAboutDialog")) { + const auto h = json["helpAboutDialog"].toObject(); + p.helpAboutDialogParams.headingColor = colorFromJson(h, "headingColor", p.helpAboutDialogParams.headingColor); + p.helpAboutDialogParams.linkColor = colorFromJson(h, "linkColor", p.helpAboutDialogParams.linkColor); + } + + if (json.contains("whatsNewDialog")) { + const auto w = json["whatsNewDialog"].toObject(); + auto &wn = p.whatsNewDialogParams; + wn.backgroundColor = colorFromJson(w, "backgroundColor", wn.backgroundColor); + wn.headerTextColor = colorFromJson(w, "headerTextColor", wn.headerTextColor); + wn.versionTextColor = colorFromJson(w, "versionTextColor", wn.versionTextColor); + wn.contentTextColor = colorFromJson(w, "contentTextColor", wn.contentTextColor); + wn.linkColor = colorFromJson(w, "linkColor", wn.linkColor); + wn.closeButtonColor = colorFromJson(w, "closeButtonColor", wn.closeButtonColor); + wn.headerDecorationColor = colorFromJson(w, "headerDecorationColor", wn.headerDecorationColor); + } + + if (json.contains("shortcutsIcons")) { + const auto s = json["shortcutsIcons"].toObject(); + p.shortcutsIconsParams.iconColor = colorFromJson(s, "iconColor", p.shortcutsIconsParams.iconColor); + } + + if (json.contains("dialogIcons")) { + const auto o = json["dialogIcons"].toObject(); + p.dialogIconsParams.iconColor = colorFromJson(o, "iconColor", p.dialogIconsParams.iconColor); + } + + if (json.contains("translator")) { + const auto t = json["translator"].toObject(); + auto &tp = p.translatorParams; + tp.backgroundColor = colorFromJson(t, "backgroundColor", tp.backgroundColor); + tp.inputBackgroundColor = colorFromJson(t, "inputBackgroundColor", tp.inputBackgroundColor); + tp.inputDarkerBackgroundColor = colorFromJson(t, "inputDarkerBackgroundColor", tp.inputDarkerBackgroundColor); + tp.selectionBackgroundColor = colorFromJson(t, "selectionBackgroundColor", tp.selectionBackgroundColor); + tp.primaryTextColor = colorFromJson(t, "primaryTextColor", tp.primaryTextColor); + tp.secondaryTextColor = colorFromJson(t, "secondaryTextColor", tp.secondaryTextColor); + tp.scrollbarHandleColor = colorFromJson(t, "scrollbarHandleColor", tp.scrollbarHandleColor); + tp.borderColor = colorFromJson(t, "borderColor", tp.borderColor); + tp.iconColor = colorFromJson(t, "iconColor", tp.iconColor); + } + + if (json.contains("meta")) { + const auto o = json["meta"].toObject(); + p.meta.id = o["id"].toString(p.meta.id); + p.meta.displayName = o["displayName"].toString(p.meta.displayName); + const QString variantStr = o["variant"].toString(); + if (variantStr == "light") + p.meta.variant = ThemeVariant::Light; + else if (variantStr == "dark") + p.meta.variant = ThemeVariant::Dark; + p.meta.targetApp = o["targetApp"].toString(p.meta.targetApp); + p.meta.version = o["version"].toString(p.meta.version); + } + + Theme theme = makeTheme(p); + theme.sourceJson = json; + return theme; +} diff --git a/YACReader/themes/theme_factory.h b/YACReader/themes/theme_factory.h new file mode 100644 index 000000000..ebed9bbb1 --- /dev/null +++ b/YACReader/themes/theme_factory.h @@ -0,0 +1,10 @@ +#ifndef THEME_FACTORY_H +#define THEME_FACTORY_H + +#include "theme.h" + +#include + +Theme makeTheme(const QJsonObject &json); + +#endif // THEME_FACTORY_H diff --git a/YACReader/translator.cpp b/YACReader/translator.cpp index 1419adba9..ad593d1f1 100644 --- a/YACReader/translator.cpp +++ b/YACReader/translator.cpp @@ -1,74 +1,51 @@ -#include - -#if QT_VERSION >= 0x050000 -#include -#else -#include -#include -#endif - -#include -#include -#include -#include -#include #include "translator.h" -#include "viewer.h" +#include "viewer.h" #include "yacreader_busy_widget.h" +#include +#include #include -#include -#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include -#include +#include #include -#include #include -#include -#include - -#include - -#define APPID "417CEAD93449502CC3C9B69FED26C54118E62BCC" +#include +#include YACReaderTranslator::YACReaderTranslator(Viewer *parent) : QWidget(parent), drag(false) { - QString scrollBarStyle = "QScrollBar:vertical { border: none; background: #404040; width: 7px; margin: 0 3px 0 0; }" - "QScrollBar::handle:vertical { background: #DDDDDD; width: 7px; min-height: 20px; }" - "QScrollBar::add-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" - - "QScrollBar::sub-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" - "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" - - "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }"; - this->setCursor(QCursor(Qt::ArrowCursor)); this->setAutoFillBackground(true); this->setBackgroundRole(QPalette::Window); - QPalette p(this->palette()); - p.setColor(QPalette::Window, QColor(0x404040)); - this->setPalette(p); auto layout = new QVBoxLayout(this); // TITLE BAR auto titleBar = new QHBoxLayout(); - auto close = new QPushButton(QIcon(":/images/close.svg"), ""); - close->setFlat(true); - auto title = new QLabel(tr("YACReader translator")); - title->setStyleSheet("QLabel {font-size:18px; font-family:Arial; color:white;}"); - titleBar->addWidget(title); + closeButton = new QPushButton(this); + closeButton->setFlat(true); + titleLabel = new QLabel(tr("YACReader translator")); + titleBar->addWidget(titleLabel); titleBar->addStretch(); - close->resize(14, 14); - close->setStyleSheet("QPushButton {margin:0;padding:0;border:none;}"); - titleBar->addWidget(close); + closeButton->resize(14, 14); + closeButton->setStyleSheet("QPushButton {margin:0;padding:0;border:none;}"); + titleBar->addWidget(closeButton); titleBar->setContentsMargins(0, 0, 0, 0); titleBar->setSpacing(0); - connect(close, &QAbstractButton::clicked, parent, &Viewer::animateHideTranslator); + connect(closeButton, &QAbstractButton::clicked, parent, &Viewer::animateHideTranslator); layout->addLayout(titleBar); @@ -78,32 +55,19 @@ YACReaderTranslator::YACReaderTranslator(Viewer *parent) text->setMaximumHeight(110); layout->addSpacing(12); layout->addWidget(text); - text->setStyleSheet("QTextEdit{border:none;background:#2a2a2a;color:white; font-size:12px; padding:6px;}" + scrollBarStyle); // COMBOBOXES auto combos = new QHBoxLayout(); from = new QComboBox(this); to = new QComboBox(this); - QString comboBoxStyle = "QComboBox {border:none;background:#2a2a2a;color:white;font-size:12px;font-family:Arial;padding-left:8px;}" - "QComboBox::down-arrow {image: url(:/images/dropDownArrow.png);}" - "QComboBox::drop-down {border:none; padding-right:10px;}" - "QComboBox QAbstractItemView {border: none; background:#272727; color:white; selection-background-color: #202020; outline:none;}" - "QComboBox QAbstractItemView::item {padding-left:8px;}" + - scrollBarStyle; - from->setStyleSheet(comboBoxStyle); - to->setStyleSheet(comboBoxStyle); from->setFixedHeight(22); to->setFixedHeight(22); - QLabel *arrow = new QLabel(this); - QPixmap arrowPixmap(":/images/fromTo.png"); - arrow->setPixmap(arrowPixmap); - auto searchButton = new QPushButton(this); - searchButton->setIcon(QIcon(":/images/translatorSearch.png")); - searchButton->setStyleSheet("QPushButton {border:none; background:#2a2a2a;}"); + arrowLabel = new QLabel(this); + searchButton = new QPushButton(this); searchButton->setFixedSize(22, 22); combos->addWidget(from, 1); combos->addSpacing(9); - combos->addWidget(arrow, 0); + combos->addWidget(arrowLabel, 0); combos->addSpacing(9); combos->addWidget(to, 1); combos->addSpacing(9); @@ -114,10 +78,8 @@ YACReaderTranslator::YACReaderTranslator(Viewer *parent) // RESULTS auto resultsTitleLayout = new QHBoxLayout(); resultsTitle = new QLabel(tr("Translation")); - resultsTitle->setStyleSheet("QLabel {font-family:Arial;font-size:14px;color:#e3e3e3;}"); speakButton = new QPushButton(this); speakButton->setStyleSheet("QPushButton {border:none;}"); - speakButton->setIcon(QIcon(":/images/speaker.png")); resultsTitleLayout->addWidget(resultsTitle, 0, Qt::AlignVCenter); resultsTitleLayout->addSpacing(10); resultsTitleLayout->addWidget(speakButton, 0, Qt::AlignVCenter); @@ -129,7 +91,6 @@ YACReaderTranslator::YACReaderTranslator(Viewer *parent) resultText = new QLabel(); resultText->setWordWrap(true); - resultText->setStyleSheet("QLabel {color:white;font-size:12px;}"); resultText->setText(""); layout->addWidget(resultText); @@ -139,7 +100,6 @@ YACReaderTranslator::YACReaderTranslator(Viewer *parent) clearButton = new QPushButton(tr("clear")); layout->addWidget(clearButton, 0, Qt::AlignRight); clearButton->setMinimumWidth(95); - clearButton->setStyleSheet("QPushButton {border:1px solid #212121; background:#2a2a2a; color:white; font-family:Arial; font-size:12px; padding-top:5px; padding-bottom:5px;}"); resize(400, 479); @@ -154,18 +114,41 @@ YACReaderTranslator::YACReaderTranslator(Viewer *parent) busyIndicator->move((this->width() - busyIndicator->width()) / 2, (this->height() - busyIndicator->height()) * 2 / 3); busyIndicator->hide(); - show(); - connect(searchButton, &QAbstractButton::pressed, this, &YACReaderTranslator::translate); connect(speakButton, &QAbstractButton::pressed, this, &YACReaderTranslator::play); connect(clearButton, &QAbstractButton::pressed, this, &YACReaderTranslator::clear); - // multimedia/phonon -#if QT_VERSION >= 0x050000 - player = new QMediaPlayer; -#else - music = createPlayer(MusicCategory); -#endif + tts = new QTextToSpeech(this); + + initTheme(this); + + show(); +} + +void YACReaderTranslator::applyTheme(const Theme &theme) +{ + const auto &tr = theme.translator; + + QPalette p(this->palette()); + p.setColor(QPalette::Window, tr.backgroundColor); + this->setPalette(p); + + text->setStyleSheet(tr.textEditQSS + tr.scrollBarQSS); + from->setStyleSheet(tr.comboBoxQSS + tr.scrollBarQSS); + to->setStyleSheet(tr.comboBoxQSS + tr.scrollBarQSS); + + titleLabel->setStyleSheet(tr.titleQSS); + resultsTitle->setStyleSheet(tr.resultsTitleQSS); + resultText->setStyleSheet(tr.resultTextQSS); + clearButton->setStyleSheet(tr.clearButtonQSS); + + searchButton->setStyleSheet( + QString("QPushButton {border:none; background:%1;}").arg(tr.inputBackgroundColor.name())); + + closeButton->setIcon(tr.closeIcon); + speakButton->setIcon(tr.speakerIcon); + searchButton->setIcon(tr.searchIcon); + arrowLabel->setPixmap(tr.fromToPixmap); } void YACReaderTranslator::hideResults() @@ -189,20 +172,16 @@ void YACReaderTranslator::translate() QString from = this->from->itemData(this->from->currentIndex()).toString(); QString to = this->to->itemData(this->to->currentIndex()).toString(); + speakText = text; + speakLocale = from; + TranslationLoader *translationLoader = new TranslationLoader(text, from, to); connect(translationLoader, &TranslationLoader::requestFinished, this, &YACReaderTranslator::setTranslation); connect(translationLoader, &TranslationLoader::error, this, &YACReaderTranslator::error); connect(translationLoader, &TranslationLoader::timeOut, this, &YACReaderTranslator::error); connect(translationLoader, &QThread::finished, translationLoader, &QObject::deleteLater); - TextToSpeachLoader *tts = new TextToSpeachLoader(text, from); - connect(tts, &TextToSpeachLoader::requestFinished, this, &YACReaderTranslator::setSpeak); - connect(tts, &TextToSpeachLoader::error, this, &YACReaderTranslator::error); - connect(tts, &TextToSpeachLoader::timeOut, this, &YACReaderTranslator::error); - connect(tts, &QThread::finished, tts, &QObject::deleteLater); - translationLoader->start(); - tts->start(); resultsTitle->setText(tr("Translation")); @@ -218,19 +197,12 @@ void YACReaderTranslator::error() busyIndicator->hide(); } -void YACReaderTranslator::setSpeak(const QUrl &url) -{ - resultsTitle->setHidden(false); - speakButton->setHidden(false); - - ttsSource = url; -} - void YACReaderTranslator::setTranslation(const QString &string) { resultText->setText(string); resultsTitle->setHidden(false); + speakButton->setHidden(false); resultText->setHidden(false); busyIndicator->hide(); } @@ -246,8 +218,8 @@ void YACReaderTranslator::populateCombos() combo->addItem("Arabic", "ar"); combo->addItem("Bulgarian", "bg"); combo->addItem("Catalan", "ca"); - combo->addItem("Chinese Simplified", "zh-CHS"); - combo->addItem("Chinese Traditional", "zh-CHT"); + combo->addItem("Chinese Simplified", "zh-CN"); + combo->addItem("Chinese Traditional", "zh-TW"); combo->addItem("Czech", "cs"); combo->addItem("Danish", "da"); combo->addItem("Dutch", "nl"); @@ -287,14 +259,8 @@ void YACReaderTranslator::populateCombos() void YACReaderTranslator::play() { - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - player->setSource(ttsSource); -#else - player->setMedia(ttsSource); -#endif - - player->play(); + tts->setLocale(QLocale(speakLocale)); + tts->say(speakText); } void YACReaderTranslator::mousePressEvent(QMouseEvent *event) @@ -338,10 +304,10 @@ void TranslationLoader::run() connect(&tT, &QTimer::timeout, &q, &QEventLoop::quit); connect(&manager, &QNetworkAccessManager::finished, &q, &QEventLoop::quit); - QString url = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appid=%1&from=%2&to=%3&text=%4&contentType=text/plain"; - url = url.arg(APPID, from, to, text); + QString urlStr = QString("https://api.mymemory.translated.net/get?q=%1&langpair=%2|%3") + .arg(QString::fromUtf8(QUrl::toPercentEncoding(text)), from, to); - QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url))); + QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(urlStr))); tT.start(5000); // 5s timeout q.exec(); @@ -349,55 +315,12 @@ void TranslationLoader::run() if (tT.isActive()) { // download complete if (reply->error() == QNetworkReply::NoError) { - QString utf8 = QString::fromUtf8(reply->readAll()); - utf8 = utf8.remove(0, 1); - utf8 = utf8.remove(utf8.count() - 1, 1); - - QString translated(utf8); - emit requestFinished(translated); - } else - emit error(); - } else { - emit timeOut(); - } -} - -//--------------------------------------------------------------------------- -//--------------------------------------------------------------------------- -//--------------------------------------------------------------------------- - -TextToSpeachLoader::TextToSpeachLoader(QString text, QString language) - : QThread(), text(text), language(language) -{ -} - -void TextToSpeachLoader::run() -{ - QNetworkAccessManager manager; - QEventLoop q; - QTimer tT; - - tT.setSingleShot(true); - connect(&tT, &QTimer::timeout, &q, &QEventLoop::quit); - connect(&manager, &QNetworkAccessManager::finished, &q, &QEventLoop::quit); - - QString url = "http://api.microsofttranslator.com/V2/Ajax.svc/Speak?appid=%1&language=%2&text=%3&contentType=text/plain"; - url = url.arg(APPID, language, text); - - QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url))); - - tT.start(5000); // 5s timeout - q.exec(); - - if (tT.isActive()) { - // download complete - if (reply->error() == QNetworkReply::NoError) { - QString utf8 = QString::fromUtf8(reply->readAll()); - utf8 = utf8.remove(0, 1); - utf8 = utf8.remove(utf8.count() - 1, 1); - utf8 = utf8.replace("\\", ""); - - emit requestFinished(QUrl(utf8)); + QJsonDocument doc = QJsonDocument::fromJson(reply->readAll()); + QString translated = doc["responseData"]["translatedText"].toString(); + if (!translated.isEmpty()) + emit requestFinished(translated); + else + emit error(); } else emit error(); } else { diff --git a/YACReader/translator.h b/YACReader/translator.h index be50f8b61..ba2cec307 100644 --- a/YACReader/translator.h +++ b/YACReader/translator.h @@ -1,7 +1,6 @@ #ifndef __TRANSLATOR_H #define __TRANSLATOR_H -class QUrl; class QMouseEvent; class QPoint; class QTextEdit; @@ -9,15 +8,16 @@ class QComboBox; class QLabel; class QPushButton; class YACReaderBusyWidget; +class QTextToSpeech; -#include -#include -#include +#include "themable.h" #include "viewer.h" -class QMediaPlayer; +#include +#include +#include -class YACReaderTranslator : public QWidget +class YACReaderTranslator : public QWidget, protected Themable { Q_OBJECT public: @@ -28,12 +28,12 @@ public slots: protected slots: void translate(); - void setSpeak(const QUrl &url); void setTranslation(const QString &string); void error(); void clear(); protected: + void applyTheme(const Theme &theme) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; @@ -44,16 +44,21 @@ protected slots: QPoint click; private: - QMediaPlayer *player; + QTextToSpeech *tts; + QString speakText; + QString speakLocale; QTextEdit *text; QComboBox *from; QComboBox *to; + QLabel *titleLabel; QLabel *resultsTitle; + QLabel *arrowLabel; QPushButton *speakButton; + QPushButton *closeButton; + QPushButton *searchButton; QLabel *resultText; YACReaderBusyWidget *busyIndicator; - QUrl ttsSource; QPushButton *clearButton; }; @@ -74,19 +79,4 @@ class TranslationLoader : public QThread void run() override; }; -class TextToSpeachLoader : public QThread -{ - Q_OBJECT -public: - TextToSpeachLoader(QString text, QString language); -signals: - void requestFinished(QUrl); - void timeOut(); - void error(); - -private: - QString text; - QString language; - void run() override; -}; #endif diff --git a/YACReader/viewer.cpp b/YACReader/viewer.cpp index b8ac3ccdc..c2b310cfd 100644 --- a/YACReader/viewer.cpp +++ b/YACReader/viewer.cpp @@ -1,27 +1,25 @@ #include "viewer.h" + +#include "bookmarks_dialog.h" +#include "comic_db.h" #include "configuration.h" +#include "continuous_page_widget.h" +#include "continuous_view_model.h" +#include "goto_dialog.h" +#include "goto_flow_widget.h" #include "magnifying_glass.h" -#include "goto_flow.h" -#ifndef NO_OPENGL -#include "goto_flow_gl.h" -#else -#include -#endif -#include "bookmarks_dialog.h" +#include "notifications_label_widget.h" +#include "page_label_widget.h" #include "render.h" -#include "goto_dialog.h" +#include "resize_image.h" #include "translator.h" -#include "page_label_widget.h" -#include "notifications_label_widget.h" -#include "comic_db.h" -#include "shortcuts_manager.h" - -#include "opengl_checker.h" #include #include - -#include +#include +#include +#include +#include Viewer::Viewer(QWidget *parent) : QScrollArea(parent), @@ -29,6 +27,7 @@ Viewer::Viewer(QWidget *parent) information(false), doublePage(false), doubleMangaPage(false), + continuousScroll(false), zoom(100), currentPage(nullptr), wheelStop(false), @@ -46,20 +45,32 @@ Viewer::Viewer(QWidget *parent) translatorAnimation->setDuration(150); translatorXPos = -10000; translator->move(-translator->width(), 10); - // current comic page + // current comic page (used in non-continuous mode when a comic is open) content = new QLabel(this); - configureContent(tr("Press 'O' to open comic.")); - // scroll area configuration - setBackgroundRole(QPalette::Dark); - setWidget(content); + content->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + if (!(devicePixelRatioF() > 1)) + content->setScaledContents(true); + content->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + content->setMouseTracking(true); + + // dedicated widget for status messages ("Press 'O' to open comic.", "Loading...", etc.) + messageLabel = new QLabel(this); + messageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + messageLabel->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + messageLabel->setText(tr("Press 'O' to open comic.")); + messageLabel->setFont(QFont("courier new", 12)); + messageLabel->setMouseTracking(true); + + setWidget(messageLabel); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setFrameStyle(QFrame::NoFrame); setAlignment(Qt::AlignCenter); - QPalette palette; - palette.setColor(backgroundRole(), Configuration::getConfiguration().getBackgroundColor()); - setPalette(palette); + continuousWidget = new ContinuousPageWidget(); + continuousViewModel = new ContinuousViewModel(this); + continuousWidget->setViewModel(continuousViewModel); + continuousWidget->installEventFilter(this); //--------------------------------------- mglass = new MagnifyingGlass( Configuration::getConfiguration().getMagnifyingGlassSize(), @@ -74,33 +85,15 @@ Viewer::Viewer(QWidget *parent) }); mglass->hide(); - content->setMouseTracking(true); setMouseTracking(true); showCursor(); goToDialog = new GoToDialog(this); - QSettings *settings = new QSettings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat); - // CONFIG GOTO_FLOW-------------------------------------------------------- -#ifndef NO_OPENGL - - OpenGLChecker openGLChecker; - bool openGLAvailable = openGLChecker.hasCompatibleOpenGLVersion(); - - if (openGLAvailable && !settings->contains(USE_OPEN_GL)) - settings->setValue(USE_OPEN_GL, 2); - else if (!openGLAvailable) - settings->setValue(USE_OPEN_GL, 0); + goToFlow = new GoToFlowWidget(this, Configuration::getConfiguration().getFlowType()); - if ((settings->value(USE_OPEN_GL).toBool() == true)) - goToFlow = new GoToFlowGL(this, Configuration::getConfiguration().getFlowType()); - else - goToFlow = new GoToFlow(this, Configuration::getConfiguration().getFlowType()); -#else - goToFlow = new GoToFlow(this, Configuration::getConfiguration().getFlowType()); -#endif goToFlow->setFocusPolicy(Qt::StrongFocus); goToFlow->hide(); showGoToFlowAnimation = new QPropertyAnimation(goToFlow, "pos"); @@ -109,6 +102,7 @@ Viewer::Viewer(QWidget *parent) bd = new BookmarksDialog(this->parentWidget()); render = new Render(); + continuousWidget->setRender(render); hideCursorTimer = new QTimer(); hideCursorTimer->setSingleShot(true); @@ -117,7 +111,10 @@ Viewer::Viewer(QWidget *parent) doublePageSwitch(); if (Configuration::getConfiguration().getDoubleMangaPage()) - doubleMangaPageSwitch(); + setMangaModeImpl(true, false); + + if (Configuration::getConfiguration().getContinuousScroll()) + setContinuousScrollImpl(true, false); createConnections(); @@ -140,6 +137,8 @@ Viewer::Viewer(QWidget *parent) informationLabel = new PageLabelWidget(this); setAcceptDrops(true); + + initTheme(this); } Viewer::~Viewer() @@ -148,7 +147,18 @@ Viewer::~Viewer() delete goToFlow; delete translator; delete translatorAnimation; - delete content; + // messageLabel, content or continuousWidget may not be owned by the scroll area + // (after takeWidget), so delete whichever ones are not currently set + if (widget() != messageLabel) { + delete messageLabel; + } + if (widget() != content) { + delete content; + } + if (widget() != continuousWidget) { + delete continuousWidget; + } + delete continuousViewModel; delete hideCursorTimer; delete informationLabel; delete verticalScroller; @@ -199,9 +209,15 @@ void Viewer::createConnections() connect(render, qOverload(&Render::numPages), this, &Viewer::comicLoaded); connect(render, QOverload::of(&Render::imageLoaded), goToFlow, &GoToFlowWidget::setImageReady); connect(render, &Render::currentPageReady, this, &Viewer::updatePage); + connect(render, &Render::pageRendered, continuousWidget, &ContinuousPageWidget::onPageAvailable); + connect(render, &Render::pageRendered, this, &Viewer::onContinuousPageRendered); + connect(continuousViewModel, &ContinuousViewModel::stateChanged, this, &Viewer::onContinuousViewModelChanged); + connect(render, qOverload(&Render::numPages), this, &Viewer::onNumPagesReady); + connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &Viewer::onContinuousScroll); connect(render, &Render::processingPage, this, &Viewer::setLoadingMessage); connect(render, &Render::currentPageIsBookmark, this, &Viewer::pageIsBookmark); connect(render, &Render::pageChanged, this, &Viewer::updateInformation); + connect(render, &Render::pageChanged, this, &Viewer::onRenderPageChanged); connect(render, &Render::isLast, this, &Viewer::showIsLastMessage); connect(render, &Render::isCover, this, &Viewer::showIsCoverMessage); @@ -330,11 +346,35 @@ void Viewer::goToLastPage() void Viewer::goTo(unsigned int page) { direction = 1; // in "go to" direction is always fordward + + if (continuousScroll) { + lastCenterPage = page; + continuousViewModel->setAnchorPage(static_cast(page)); + render->goTo(page); + scrollToCurrentContinuousPage(); + return; + } + render->goTo(page); } +void Viewer::onImageOptionsChanged() +{ + if (continuousScroll) { + continuousWidget->invalidateScaledImageCache(); + } else { + updatePage(); + } +} + void Viewer::updatePage() { + if (continuousScroll) { + return; + } + + setActiveWidget(content); + QPixmap *previousPage = currentPage; if (doublePage) { if (!doubleMangaPage) @@ -403,16 +443,17 @@ void Viewer::updateContentSize() if (zoom != 100) { pagefit.scale(floor(pagefit.width() * zoom / 100.0f), 0, Qt::KeepAspectRatioByExpanding); } - // apply scaling + // apply size to the container content->resize(pagefit); - // TODO: updtateContentSize should only scale the pixmap once - if (devicePixelRatioF() > 1) // only in HDPI displays - { - QPixmap page = currentPage->scaled(content->width() * devicePixelRatioF(), content->height() * devicePixelRatioF(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - page.setDevicePixelRatio(devicePixelRatioF()); - content->setPixmap(page); - } + // scale the pixmap to physical pixels for crisp rendering on all displays + auto dpr = devicePixelRatioF(); + QPixmap page = scalePixmap(*currentPage, + qRound(content->width() * dpr), + qRound(content->height() * dpr), + Configuration::getConfiguration().getScalingMethod()); + page.setDevicePixelRatio(dpr); + content->setPixmap(page); emit backgroundChanges(); } @@ -423,7 +464,11 @@ void Viewer::increaseZoomFactor() { zoom = std::min(zoom + 10, 500); - updateContentSize(); + if (continuousScroll) { + continuousViewModel->setZoomFactor(zoom); + } else { + updateContentSize(); + } notificationsLabel->setText(QString::number(getZoomFactor()) + "%"); notificationsLabel->flash(); @@ -433,7 +478,11 @@ void Viewer::decreaseZoomFactor() { zoom = std::max(zoom - 10, 30); - updateContentSize(); + if (continuousScroll) { + continuousViewModel->setZoomFactor(zoom); + } else { + updateContentSize(); + } notificationsLabel->setText(QString::number(getZoomFactor()) + "%"); notificationsLabel->flash(); @@ -461,16 +510,22 @@ void Viewer::setZoomFactor(int z) void Viewer::updateVerticalScrollBar() { - if (direction > 0) + if (direction > 0) { verticalScrollBar()->setSliderPosition(verticalScrollBar()->minimum()); - else + } else { verticalScrollBar()->setSliderPosition(verticalScrollBar()->maximum()); + } } void Viewer::scrollDown() { if (verticalScrollBar()->sliderPosition() == verticalScrollBar()->maximum()) { - next(); + if (continuousScroll) { + shouldOpenNext = true; + emit openNextComic(); + } else { + next(); + } } else { int currentPos = verticalScrollBar()->sliderPosition(); verticalScroller->setDuration(animationDuration()); @@ -486,7 +541,12 @@ void Viewer::scrollDown() void Viewer::scrollUp() { if (verticalScrollBar()->sliderPosition() == verticalScrollBar()->minimum()) { - prev(); + if (continuousScroll) { + shouldOpenPrevious = true; + emit openPreviousComic(); + } else { + prev(); + } } else { int currentPos = verticalScrollBar()->sliderPosition(); verticalScroller->setDuration(animationDuration()); @@ -696,6 +756,11 @@ void Viewer::wheelEventMouse(QWheelEvent *event) return; } + if (continuousScroll) { + animateScroll(*verticalScroller, *verticalScrollBar(), delta.y()); + return; + } + auto turnPageOnScroll = !Configuration::getConfiguration().getDoNotTurnPageOnScroll(); auto getUseSingleScrollStepToTurnPage = Configuration::getConfiguration().getUseSingleScrollStepToTurnPage(); @@ -744,6 +809,10 @@ void Viewer::wheelEventTrackpad(QWheelEvent *event) verticalScrollBar()->setValue(newVerticalValue); } + if (continuousScroll) { + return; + } + auto turnPageOnScroll = !Configuration::getConfiguration().getDoNotTurnPageOnScroll(); auto getUseSingleScrollStepToTurnPage = Configuration::getConfiguration().getUseSingleScrollStepToTurnPage(); @@ -776,20 +845,182 @@ void Viewer::wheelEventTrackpad(QWheelEvent *event) void Viewer::resizeEvent(QResizeEvent *event) { + QScrollArea::resizeEvent(event); + + if (continuousScroll) { + continuousViewModel->setViewportSize(viewport()->width(), viewport()->height()); + } + updateContentSize(); goToFlow->updateSize(); goToFlow->move((width() - goToFlow->width()) / 2, height() - goToFlow->height()); informationLabel->updatePosition(); - QScrollArea::resizeEvent(event); } QPixmap Viewer::pixmap() const { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) return content->pixmap(); -#else - return content->pixmap(Qt::ReturnByValue); -#endif +} + +QImage Viewer::grabMagnifiedRegion(const QPoint &viewerPos, const QSize &glassSize, float zoomLevel) const +{ + const int glassW = glassSize.width(); + const int glassH = glassSize.height(); + const int zoomW = static_cast(glassW * zoomLevel); + const int zoomH = static_cast(glassH * zoomLevel); + const QColor bgColor = Configuration::getConfiguration().getBackgroundColor(theme.viewer.defaultBackgroundColor); + + if (continuousScroll) { + // --- continuous mode --- + // map viewer coords to continuousWidget coords + const int scrollPos = verticalScrollBar()->sliderPosition(); + const int cwX = viewerPos.x(); + const int cwY = viewerPos.y() + scrollPos; + const int widgetW = continuousWidget->width(); + + // use the page under the cursor to derive source-to-widget scale factors, + // so the result image is sized at source resolution (like single-page mode) + int centerPageIdx = continuousViewModel->pageAtY(cwY); + centerPageIdx = qBound(0, centerPageIdx, continuousViewModel->numPages() - 1); + const QImage *centerImg = render->bufferedImage(centerPageIdx); + const QSize centerScaledSize = continuousViewModel->scaledPageSize(centerPageIdx); + + float wFactor = 1.0f, hFactor = 1.0f; + if (centerImg && !centerImg->isNull() && !centerScaledSize.isEmpty()) { + wFactor = static_cast(centerImg->width()) / centerScaledSize.width(); + hFactor = static_cast(centerImg->height()) / centerScaledSize.height(); + } + + // result image sized in source-resolution pixels (full quality) + const int resultW = static_cast(zoomW * wFactor); + const int resultH = static_cast(zoomH * hFactor); + + QImage result(resultW, resultH, QImage::Format_RGB32); + result.fill(bgColor); + + // zoom region in widget coordinates (centered on cursor) + const int regionLeft = cwX - zoomW / 2; + const int regionTop = cwY - zoomH / 2; + const int regionRight = regionLeft + zoomW; + const int regionBottom = regionTop + zoomH; + + // find which pages overlap the zoom region + int firstPage = continuousViewModel->pageAtY(regionTop); + int lastPage = continuousViewModel->pageAtY(regionBottom); + firstPage = qBound(0, firstPage, continuousViewModel->numPages() - 1); + lastPage = qBound(0, lastPage, continuousViewModel->numPages() - 1); + + QPainter painter(&result); + for (int i = firstPage; i <= lastPage; ++i) { + const QImage *srcImg = render->bufferedImage(i); + if (!srcImg || srcImg->isNull()) { + continue; + } + + const QSize scaledSize = continuousViewModel->scaledPageSize(i); + const int pageY = continuousViewModel->yPositionForPage(i); + int pageX = (widgetW - scaledSize.width()) / 2; + if (pageX < 0) { + pageX = 0; + } + + // intersection of zoom region and page rect (widget coords) + const int isectLeft = qMax(regionLeft, pageX); + const int isectTop = qMax(regionTop, pageY); + const int isectRight = qMin(regionRight, pageX + scaledSize.width()); + const int isectBottom = qMin(regionBottom, pageY + scaledSize.height()); + + if (isectLeft >= isectRight || isectTop >= isectBottom) { + continue; + } + + // map intersection to source image coordinates (full resolution crop) + const float pageScaleX = static_cast(srcImg->width()) / scaledSize.width(); + const float pageScaleY = static_cast(srcImg->height()) / scaledSize.height(); + + const int srcX = static_cast((isectLeft - pageX) * pageScaleX); + const int srcY = static_cast((isectTop - pageY) * pageScaleY); + const int srcW = static_cast((isectRight - isectLeft) * pageScaleX); + const int srcH = static_cast((isectBottom - isectTop) * pageScaleY); + + // destination in result image (source-resolution coordinates) + const int dstX = static_cast((isectLeft - regionLeft) * wFactor); + const int dstY = static_cast((isectTop - regionTop) * hFactor); + const int dstW = static_cast((isectRight - isectLeft) * wFactor); + const int dstH = static_cast((isectBottom - isectTop) * hFactor); + + QImage cropped = srcImg->copy(srcX, srcY, srcW, srcH); + if (cropped.size() != QSize(dstW, dstH)) { + cropped = cropped.scaled(dstW, dstH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + } + painter.drawImage(dstX, dstY, cropped); + } + + return result; + } + + // --- single-page mode --- + const QPixmap image = content->pixmap(); + if (image.isNull()) { + QImage result(zoomW, zoomH, QImage::Format_RGB32); + result.setDevicePixelRatio(devicePixelRatioF()); + result.fill(bgColor); + return result; + } + + const int iWidth = image.width(); + const int iHeight = image.height(); + const float wFactor = static_cast(iWidth) / widget()->width(); + const float hFactor = static_cast(iHeight) / widget()->height(); + const int zoomWScaled = static_cast(zoomW * wFactor); + const int zoomHScaled = static_cast(zoomH * hFactor); + + const int scrollPos = verticalScrollBar()->sliderPosition(); + int xp, yp; + if (verticalScrollBar()->minimum() == verticalScrollBar()->maximum()) { + xp = static_cast(((viewerPos.x() - widget()->pos().x()) * wFactor) - zoomWScaled / 2); + yp = static_cast((viewerPos.y() - widget()->pos().y() + scrollPos) * hFactor - zoomHScaled / 2); + } else { + xp = static_cast(((viewerPos.x() - widget()->pos().x()) * wFactor) - zoomWScaled / 2); + yp = static_cast((viewerPos.y() + scrollPos) * hFactor - zoomHScaled / 2); + } + + int xOffset = 0, yOffset = 0; + int zw = zoomWScaled, zh = zoomHScaled; + bool outImage = false; + if (xp < 0) { + xOffset = -xp; + xp = 0; + zw -= xOffset; + outImage = true; + } + if (yp < 0) { + yOffset = -yp; + yp = 0; + zh -= yOffset; + outImage = true; + } + if (xp + zoomWScaled >= iWidth) { + zw -= xp + zw - iWidth; + outImage = true; + } + if (yp + zoomHScaled >= iHeight) { + zh -= yp + zh - iHeight; + outImage = true; + } + + if (outImage) { + QImage img(zoomWScaled, zoomHScaled, QImage::Format_RGB32); + img.setDevicePixelRatio(devicePixelRatioF()); + img.fill(bgColor); + if (zw > 0 && zh > 0) { + QPainter painter(&img); + painter.drawPixmap(xOffset, yOffset, image.copy(xp, yp, zw, zh)); + } + return img; + } + + return image.copy(xp, yp, zoomWScaled, zoomHScaled).toImage(); } void Viewer::magnifyingGlassSwitch() @@ -957,27 +1188,206 @@ void Viewer::doublePageSwitch() Configuration::getConfiguration().setDoublePage(doublePage); } -void Viewer::setMangaWithoutStoringSetting(bool manga) +void Viewer::setContinuousScrollImpl(bool enabled, bool persistSettings) { + if (continuousScroll == enabled) { + return; + } + + continuousScroll = enabled; + if (persistSettings) { + Configuration::getConfiguration().setContinuousScroll(continuousScroll); + } + + if (continuousScroll) { + continuousViewModel->setZoomFactor(zoom); + if (render->hasLoadedComic()) { + continuousViewModel->setViewportSize(viewport()->width(), viewport()->height()); + continuousViewModel->setNumPages(render->numPages()); + lastCenterPage = render->getIndex(); + continuousViewModel->setAnchorPage(lastCenterPage); + probeContinuousBufferedPages(); + render->update(); + setActiveWidget(continuousWidget); + scrollToCurrentContinuousPage(); + continuousWidget->update(); + viewport()->update(); + } + } else { + lastCenterPage = -1; + if (render->hasLoadedComic()) { + updatePage(); + } + } +} + +void Viewer::setContinuousScrollWithoutStoringSetting(bool enabled) +{ + setContinuousScrollImpl(enabled, false); +} + +void Viewer::setContinuousScroll(bool enabled) +{ + setContinuousScrollImpl(enabled, true); +} + +void Viewer::onContinuousScroll(int value) +{ + if (!continuousScroll || !render->hasLoadedComic() || applyingContinuousModelState) { + return; + } + + continuousViewModel->setScrollYFromUser(value); + + int center = continuousViewModel->centerPage(); + + if (center != lastCenterPage && center >= 0) { + lastCenterPage = center; + continuousViewModel->setAnchorPage(center); + syncingRenderFromContinuousScroll = true; + render->goTo(center); + syncingRenderFromContinuousScroll = false; + emit pageAvailable(true); + } +} + +void Viewer::onContinuousViewModelChanged() +{ + if (!continuousScroll) { + return; + } + + applyContinuousStateToUi(); +} + +void Viewer::onContinuousPageRendered(int absolutePageIndex) +{ + if (!continuousScroll || !render->hasLoadedComic()) { + return; + } + + const QImage *img = render->bufferedImage(absolutePageIndex); + if (!img || img->isNull()) { + return; + } + + continuousViewModel->setPageNaturalSize(absolutePageIndex, img->size()); +} + +void Viewer::probeContinuousBufferedPages() +{ + if (!render->hasLoadedComic()) { + return; + } + + const int totalPages = static_cast(render->numPages()); + for (int i = 0; i < totalPages; ++i) { + const QImage *img = render->bufferedImage(i); + if (img && !img->isNull()) { + continuousViewModel->setPageNaturalSize(i, img->size()); + } + } +} + +void Viewer::applyContinuousStateToUi() +{ + if (!continuousScroll) { + return; + } + + applyingContinuousModelState = true; + + continuousWidget->setFixedHeight(continuousViewModel->totalHeight()); + continuousWidget->updateGeometry(); + + auto *sb = verticalScrollBar(); + const int target = qBound(sb->minimum(), continuousViewModel->scrollY(), sb->maximum()); + sb->blockSignals(true); + sb->setValue(target); + sb->blockSignals(false); + + applyingContinuousModelState = false; + + continuousWidget->update(); + viewport()->update(); +} + +void Viewer::scrollToCurrentContinuousPage() +{ + if (lastCenterPage < 0) { + return; + } + + continuousViewModel->setCurrentPage(lastCenterPage); +} + +void Viewer::onNumPagesReady(unsigned int numPages) +{ + if (continuousScroll && numPages > 0) { + setActiveWidget(continuousWidget); + + continuousViewModel->setViewportSize(viewport()->width(), viewport()->height()); + continuousViewModel->setNumPages(numPages); + probeContinuousBufferedPages(); + + int page = lastCenterPage; + if (page < 0) { + page = render->getIndex(); + } + page = qBound(0, page, static_cast(numPages) - 1); + lastCenterPage = page; + continuousViewModel->setAnchorPage(page); + + scrollToCurrentContinuousPage(); + } +} + +void Viewer::onRenderPageChanged(int page) +{ + if (!continuousScroll || page < 0 || page == lastCenterPage || syncingRenderFromContinuousScroll) { + return; + } + + lastCenterPage = page; + continuousViewModel->setAnchorPage(page); + scrollToCurrentContinuousPage(); +} + +void Viewer::setMangaModeImpl(bool manga, bool persistSettings) +{ + if (doubleMangaPage == manga) { + return; + } + doubleMangaPage = manga; + + if (persistSettings) { + Configuration &config = Configuration::getConfiguration(); + config.setDoubleMangaPage(doubleMangaPage); + goToFlow->updateConfig(config.getSettings()); + } + render->setManga(manga); goToFlow->setFlowRightToLeft(doubleMangaPage); } +void Viewer::setMangaWithoutStoringSetting(bool manga) +{ + setMangaModeImpl(manga, false); +} + void Viewer::doubleMangaPageSwitch() { - doubleMangaPage = !doubleMangaPage; - render->doubleMangaPageSwitch(); - Configuration &config = Configuration::getConfiguration(); - config.setDoubleMangaPage(doubleMangaPage); - goToFlow->setFlowRightToLeft(doubleMangaPage); - goToFlow->updateConfig(config.getSettings()); + setMangaModeImpl(!doubleMangaPage, true); } void Viewer::resetContent() { configureContent(tr("Press 'O' to open comic.")); goToFlow->reset(); + continuousViewModel->reset(); + continuousWidget->reset(); + lastCenterPage = -1; emit reset(); } @@ -988,7 +1398,9 @@ void Viewer::setLoadingMessage() restoreMagnifyingGlass = true; } emit pageAvailable(false); - configureContent(tr("Loading...please wait!")); + if (!continuousScroll) { + configureContent(tr("Loading...please wait!")); + } } void Viewer::setPageUnavailableMessage() @@ -1003,15 +1415,9 @@ void Viewer::setPageUnavailableMessage() void Viewer::configureContent(QString msg) { - content->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); - if (!(devicePixelRatioF() > 1)) - content->setScaledContents(true); - content->setAlignment(Qt::AlignTop | Qt::AlignHCenter); - content->setText(msg); - content->setFont(QFont("courier new", 12)); - content->adjustSize(); + messageLabel->setText(msg); + setActiveWidget(messageLabel); setFocus(Qt::ShortcutFocusReason); - // emit showingText(); } void Viewer::hideCursor() @@ -1033,7 +1439,7 @@ void Viewer::showCursor() void Viewer::updateOptions() { goToFlow->setFlowType(Configuration::getConfiguration().getFlowType()); - updateBackgroundColor(Configuration::getConfiguration().getBackgroundColor()); + updateBackgroundColor(Configuration::getConfiguration().getBackgroundColor(theme.viewer.defaultBackgroundColor)); updateContentSize(); updateInformation(); } @@ -1045,6 +1451,17 @@ void Viewer::updateBackgroundColor(const QColor &color) setPalette(palette); } +void Viewer::applyTheme(const Theme &theme) +{ + const auto viewerTheme = theme.viewer; + + updateBackgroundColor(Configuration::getConfiguration().getBackgroundColor(viewerTheme.defaultBackgroundColor)); + + const QString textColor = viewerTheme.defaultTextColor.name(QColor::HexArgb); + messageLabel->setStyleSheet(QStringLiteral("QLabel { color : %1; background: transparent; }").arg(textColor)); + content->setStyleSheet(QStringLiteral("QLabel { background: transparent; }")); +} + void Viewer::animateShowTranslator() { if (translator->isHidden() && translatorAnimation->state() != QPropertyAnimation::Running) { @@ -1092,10 +1509,50 @@ void Viewer::mouseMoveEvent(QMouseEvent *event) mouseHandler->mouseMoveEvent(event); } +bool Viewer::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == continuousWidget && event->type() == QEvent::MouseMove) { + auto *mouseEvent = static_cast(event); + // Map position from continuousWidget coords to Viewer coords so the + // go-to-flow proximity check and cursor management work correctly. + QPointF viewerPos = mapFromGlobal(mouseEvent->globalPosition().toPoint()); + QMouseEvent mappedEvent(mouseEvent->type(), + viewerPos, + mouseEvent->globalPosition(), + mouseEvent->button(), + mouseEvent->buttons(), + mouseEvent->modifiers()); + mouseHandler->mouseMoveEvent(&mappedEvent); + // Consume this event so we don't process the same drag movement again + // via Viewer::mouseMoveEvent() after bubbling. + event->accept(); + return true; + } + return QScrollArea::eventFilter(obj, event); +} + +void Viewer::setActiveWidget(QWidget *w) +{ + if (widget() == w) { + return; + } + verticalScrollBar()->blockSignals(true); + takeWidget(); + const bool isContinuous = (w == continuousWidget); + setWidgetResizable(isContinuous); + setVerticalScrollBarPolicy(isContinuous ? Qt::ScrollBarAsNeeded : Qt::ScrollBarAlwaysOff); + setWidget(w); + verticalScrollBar()->blockSignals(false); +} + void Viewer::updateZoomRatio(int ratio) { zoom = ratio; - updateContentSize(); + if (continuousScroll) { + continuousViewModel->setZoomFactor(zoom); + } else { + updateContentSize(); + } } bool Viewer::getIsMangaMode() @@ -1108,7 +1565,7 @@ void Viewer::updateConfig(QSettings *settings) goToFlow->updateConfig(settings); QPalette palette; - palette.setColor(backgroundRole(), Configuration::getConfiguration().getBackgroundColor()); + palette.setColor(backgroundRole(), Configuration::getConfiguration().getBackgroundColor(theme.viewer.defaultBackgroundColor)); setPalette(palette); } diff --git a/YACReader/viewer.h b/YACReader/viewer.h index c2bb183b3..5936ea0b5 100644 --- a/YACReader/viewer.h +++ b/YACReader/viewer.h @@ -1,23 +1,23 @@ #ifndef __VIEWER_H #define __VIEWER_H -#include +#include "mouse_handler.h" +#include "scroll_management.h" +#include "themable.h" -#include #include -#include +#include #include -#include -#include -#include +#include #include -#include -#include #include +#include +#include +#include +#include #include - -#include "scroll_management.h" -#include "mouse_handler.h" +#include +#include class ComicDB; class Comic; @@ -29,10 +29,12 @@ class GoToDialog; class YACReaderTranslator; class GoToFlowWidget; class Bookmarks; +class ContinuousPageWidget; +class ContinuousViewModel; class PageLabelWidget; class NotificationsLabelWidget; -class Viewer : public QScrollArea, public ScrollManagement +class Viewer : public QScrollArea, public ScrollManagement, protected Themable { Q_OBJECT public: @@ -55,6 +57,7 @@ public slots: void goToLastPage(); void goTo(unsigned int page); void updatePage(); + void onImageOptionsChanged(); void updateContentSize(); void updateVerticalScrollBar(); void updateOptions(); @@ -83,6 +86,7 @@ public slots: void save(); void doublePageSwitch(); void setMangaWithoutStoringSetting(bool manga); + void setContinuousScrollWithoutStoringSetting(bool enabled); void doubleMangaPageSwitch(); void resetContent(); void setLoadingMessage(); @@ -112,11 +116,13 @@ public slots: int getCurrentPageNumber(); void updateZoomRatio(int ratio); bool getIsMangaMode(); + void setContinuousScroll(bool enabled); private: bool information; bool doublePage; bool doubleMangaPage; + bool continuousScroll; int zoom; @@ -143,6 +149,12 @@ public slots: //! Widgets QLabel *content; + QLabel *messageLabel; + ContinuousPageWidget *continuousWidget; + ContinuousViewModel *continuousViewModel; + int lastCenterPage = -1; + bool syncingRenderFromContinuousScroll = false; + bool applyingContinuousModelState = false; YACReaderTranslator *translator; int translatorXPos; @@ -182,14 +194,30 @@ public slots: // Zero when animations are disabled int animationDuration() const; void animateScroll(QPropertyAnimation &scroller, const QScrollBar &scrollBar, int delta); + void onContinuousScroll(int value); + void onContinuousViewModelChanged(); + void onContinuousPageRendered(int absolutePageIndex); + void probeContinuousBufferedPages(); + void applyContinuousStateToUi(); + void scrollToCurrentContinuousPage(); + void onNumPagesReady(unsigned int numPages); + void onRenderPageChanged(int page); + void setActiveWidget(QWidget *w); + void setContinuousScrollImpl(bool enabled, bool persistSettings); + void setMangaModeImpl(bool manga, bool persistSettings); //! Mouse handler std::unique_ptr mouseHandler; +protected: + void applyTheme(const Theme &theme) override; + bool eventFilter(QObject *obj, QEvent *event) override; + public: Viewer(QWidget *parent = nullptr); ~Viewer(); QPixmap pixmap() const; + QImage grabMagnifiedRegion(const QPoint &viewerPos, const QSize &glassSize, float zoomLevel) const; // Comic * getComic(){return comic;} const BookmarksDialog *getBookmarksDialog() { return bd; } // returns the current index starting in 1 [1,nPages] diff --git a/YACReader/width_slider.cpp b/YACReader/width_slider.cpp index 70912043f..162610d8c 100644 --- a/YACReader/width_slider.cpp +++ b/YACReader/width_slider.cpp @@ -1,8 +1,10 @@ #include "width_slider.h" -#include - -#include "configuration.h" +#include +#include +#include +#include +#include YACReaderSliderAction::YACReaderSliderAction(QWidget *parent) : QWidgetAction(parent) diff --git a/YACReader/width_slider.h b/YACReader/width_slider.h index df5522ff3..d1bafa596 100644 --- a/YACReader/width_slider.h +++ b/YACReader/width_slider.h @@ -1,8 +1,8 @@ #ifndef WIDTH_SLIDER_H #define WIDTH_SLIDER_H -#include #include +#include class QLabel; class QSlider; diff --git a/YACReader/yacreader_de.ts b/YACReader/yacreader_de.ts index 5fdbbb2e1..1ef934e1f 100644 --- a/YACReader/yacreader_de.ts +++ b/YACReader/yacreader_de.ts @@ -9,6 +9,196 @@ Keine + + AddLabelDialog + + + Label name: + Label-Name: + + + + Choose a color: + Wähle eine Farbe: + + + + accept + Akzeptieren + + + + cancel + Abbrechen + + + + AddLibraryDialog + + + Comics folder : + Comics-Ordner : + + + + Library name : + Bibliothek-Name : + + + + Add + Hinzufügen + + + + Cancel + Abbrechen + + + + Add an existing library + Eine vorhandene Bibliothek hinzufügen + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Bevor du dich mit Comic Vine verbindest, brauchst du deinen eigenen API-Schlüssel. Du kannst <a href="http://www.comicvine.com/api/">hier</a> einen kostenlosen bekommen. + + + + Paste here your Comic Vine API key + Füge hier deinen Comic Vine API-Schlüssel ein. + + + + Accept + Akzeptieren + + + + Cancel + Abbrechen + + + + AppearanceTabWidget + + + Color scheme + Farbschema + + + + System + Systemumgebung + + + + Light + Licht + + + + Dark + Dunkel + + + + Custom + Brauch + + + + Remove + Entfernen + + + + Remove this user-imported theme + Entfernen Sie dieses vom Benutzer importierte Design + + + + Light: + Licht: + + + + Dark: + Dunkel: + + + + Custom: + Benutzerdefiniert: + + + + Import theme... + Theme importieren... + + + + Theme + Thema + + + + Theme editor + Theme-Editor + + + + Open Theme Editor... + Theme-Editor öffnen... + + + + Theme editor error + Fehler im Theme-Editor + + + + The current theme JSON could not be loaded. + Der aktuelle Theme-JSON konnte nicht geladen werden. + + + + Import theme + Thema importieren + + + + JSON files (*.json);;All files (*) + JSON-Dateien (*.json);;Alle Dateien (*) + + + + Could not import theme from: +%1 + Theme konnte nicht importiert werden von: +%1 + + + + Could not import theme from: +%1 + +%2 + Theme konnte nicht importiert werden von: +%1 + +%2 + + + + Import failed + Der Import ist fehlgeschlagen + + BookmarksDialog @@ -33,6 +223,200 @@ Neueste Seite + + ClassicComicsView + + + Hide comic flow + Comic Flow ausblenden + + + + ComicModel + + + yes + Ja + + + + no + Nein + + + + Title + Titel + + + + File Name + Dateiname + + + + Pages + Seiten + + + + Size + Größe + + + + Read + Lesen + + + + Current Page + Aktuelle Seite + + + + Publication Date + Veröffentlichungsdatum + + + + Rating + Bewertung + + + + Series + Serie + + + + Volume + Volumen + + + + Story Arc + Handlungsbogen + + + + ComicVineDialog + + + skip + überspringen + + + + back + zurück + + + + next + nächste + + + + search + suche + + + + close + schließen + + + + + comic %1 of %2 - %3 + Comic %1 von %2 - %3 + + + + + + Looking for volume... + Suche nach Band.... + + + + %1 comics selected + %1 Comic ausgewählt + + + + Error connecting to ComicVine + Fehler bei Verbindung zu ComicVine + + + + + Retrieving tags for : %1 + Herunterladen von Tags für : %1 + + + + Retrieving volume info... + Herunterladen von Info zu Ausgabe... + + + + Looking for comic... + Suche nach Comic... + + + + ContinuousPageWidget + + + Loading page %1 + Seite wird geladen %1 + + + + CreateLibraryDialog + + + Comics folder : + Comics-Ordner : + + + + Library Name : + Bibliothek-Name : + + + + Create + Erstellen + + + + Cancel + Abbrechen + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Es kann einige Minuten dauern, eine neue Bibliothek zu erstellen. Sie können den Prozess abbrechen und die Bibliothek später aktualisieren, um den Vorgang abzuschließen. + + + + Create new library + Erstelle eine neue Bibliothek + + + + Path not found + Pfad nicht gefunden + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben + + EditShortcutsDialog @@ -51,14 +435,132 @@ Kürzel-Einstellungen - + Shortcut in use Genutzte Kürzel - - The shortcut "%1" is already assigned to other function - Das Kürzel "%1" ist bereits für eine andere Funktion in Verwendung + + The shortcut "%1" is already assigned to other function + Das Kürzel "%1" ist bereits für eine andere Funktion in Verwendung + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Dieser Ordner enthält noch keine Comics + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Dieses Label enthält noch keine Comics + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Diese Leseliste enthält noch keine Comics + + + + EmptySpecialListWidget + + + No favorites + Keine Favoriten + + + + You are not reading anything yet, come on!! + Sie lesen noch nichts, starten Sie!! + + + + There are no recent comics! + Es gibt keine aktuellen Comics! + + + + ExportComicsInfoDialog + + + Output file : + Zieldatei : + + + + Create + Erstellen + + + + Cancel + Abbrechen + + + + Export comics info + Comicinfo exportieren + + + + Destination database name + Ziel-Datenbank Name + + + + Problem found while writing + Problem beim Schreiben + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben + + + + ExportLibraryDialog + + + Output folder : + Ziel-Ordner : + + + + Create + Erstellen + + + + Cancel + Abbrechen + + + + Create covers package + Erzeuge Titelbild-Paket + + + + Problem found while writing + Problem beim Schreiben + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben + + + + Destination directory + Ziel-Verzeichnis @@ -116,1266 +618,3469 @@ GoToFlowToolBar - + Page : Seite : + + GridComicsView + + + Show info + Info anzeigen + + HelpAboutDialog - + Help Hilfe - + System info - + Systeminformationen - + About Über - LogWindow + ImportComicsInfoDialog - - Log window - Änderungsprotokoll-Fenster + + Import comics info + Importiere Comic-Info - - &Pause - Pause + + Info database location : + Info-Datenbank Speicherort : - - &Save - Speichern + + Import + Importieren - - C&lear - L&öschen + + Cancel + Abbrechen - - &Copy - &Kopieren + + Comics info file (*.ydb) + Comics-Info-Datei (*.ydb) + + + ImportLibraryDialog - - Level: - Level + + Library Name : + Bibliothek-Name : - - &Auto scroll - &Automatisches Scrollen + + Package location : + Paket Ort : - - - MainWindowViewer - File - Datei + + Destination folder : + Zielordner : - Help - Hilfe + + Unpack + Entpacken - Save - Speichern + + Cancel + Abbrechen - &File - &Datei + + Extract a catalog + Einen Katalog extrahieren - &Next - &Nächstes + + Compresed library covers (*.clc) + Komprimierte Bibliothek Cover (*.clc) - + + + ImportWidget + + + stop + Stopp + + + + Some of the comics being added... + Einige der Comics werden hinzugefügt... + + + + Importing comics + Comics werden importiert + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary erstellt nun eine neue Bibliothek. </p><p>Es kann einige Minuten dauern, eine neue Bibliothek zu erstellen. Sie können den Prozess abbrechen und die Bibliothek später aktualisieren, um den Vorgang abzuschließen.</p> + + + + Updating the library + Aktualisierung der Bibliothek + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Die aktuelle Bibliothek wird gerade aktualisiert. Für eine schnellere Aktualisierung, aktualisieren Sie die Bibliothek bitte regelmäßig.</p><p>Sie können den Prozess abbrechen und mit der Aktualisierung später fortfahren.<p> + + + + Upgrading the library + Upgrade der Bibliothek + + + + <p>The current library is being upgraded, please wait.</p> + Die aktuelle Bibliothek wird gerade upgegradet, bitte warten. + + + + Scanning the library + Durchsuchen der Bibliothek + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Die aktuelle Bibliothek wird nach alten XML-Metadateninformationen durchsucht.</p><p>Dies ist nur einmal erforderlich und nur, wenn die Bibliothek mit YACReaderLibrary 9.8.2 oder früher erstellt wurde.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Bibliothek + + + + + + comic + komisch + + + + + + manga + Manga + + + + + + western manga (left to right) + Western-Manga (von links nach rechts) + + + + + + web comic + Webcomic + + + + + + 4koma (top to botom) + 4koma (von oben nach unten) + + + + + + + Set type + Typ festlegen + + + + Library + Bibliothek + + + + Folder + Ordner + + + + Comic + Komisch + + + + Upgrade failed + Update gescheitert + + + + There were errors during library upgrade in: + Beim Upgrade der Bibliothek kam es zu Fehlern in: + + + + Update needed + Update benötigt + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Diese Bibliothek wurde mit einer älteren Version von YACReader erzeugt. Sie muss geupdated werden. Jetzt updaten? + + + + Download new version + Neue Version herunterladen + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Die Bibliothek wurde mit einer neueren Version von YACReader erstellt. Die neue Version jetzt herunterladen? + + + + Library not available + Bibliothek nicht verfügbar + + + + Library '%1' is no longer available. Do you want to remove it? + Bibliothek '%1' ist nicht mehr verfügbar. Wollen Sie sie entfernen? + + + + Old library + Alte Bibliothek + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Bibliothek '%1' wurde mit einer älteren Version von YACReader erstellt. Sie muss neu erzeugt werden. Wollen Sie die Bibliothek jetzt erzeugen? + + + + + Copying comics... + Kopieren von Comics... + + + + + Moving comics... + Verschieben von Comics... + + + + Add new folder + Neuen Ordner erstellen + + + + Folder name: + Ordnername + + + + No folder selected + Kein Ordner ausgewählt + + + + Please, select a folder first + Bitte wählen Sie zuerst einen Ordner aus + + + + Error in path + Fehler im Pfad + + + + There was an error accessing the folder's path + Beim Aufrufen des Ordnerpfades kam es zu einem Fehler + + + + Delete folder + Ordner löschen + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Der ausgewählte Ordner und sein gesamter Inhalt wird von Ihrer Festplatte gelöscht. Sind Sie sicher? + + + + + Unable to delete + Löschen nicht möglich + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Beim Löschen des ausgewählten Ordners ist ein Problem aufgetreten. Bitte überprüfen Sie die Schreibrechte und stellen Sie sicher, dass keine Anwendung diese Ordner oder die darin enthaltenen Dateien verwendet. + + + + Add new reading lists + Neue Leseliste hinzufügen + + + + + List name: + Name der Liste + + + + Delete list/label + Ausgewählte/s Liste/Label löschen + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Das ausgewählte Element wird gelöscht; Ihre Comics oder Ordner werden NICHT von Ihrer Festplatte gelöscht. Sind Sie sicher? + + + + Rename list name + Listenname ändern + + + + Open folder... + Öffne Ordner... + + + + Update folder + Ordner aktualisieren + + + + Rescan library for XML info + Durchsuchen Sie die Bibliothek erneut nach XML-Informationen + + + + Set as uncompleted + Als nicht gelesen markieren + + + + Set as completed + Als gelesen markieren + + + + Set as read + Als gelesen markieren + + + + + Set as unread + Als ungelesen markieren + + + + Set custom cover + Legen Sie ein benutzerdefiniertes Cover fest + + + + Delete custom cover + Benutzerdefiniertes Cover löschen + + + + Save covers + Titelbilder speichern + + + + You are adding too many libraries. + Sie fügen zu viele Bibliotheken hinzu. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Sie fügen zu viele Bibliotheken hinzu. + +Wahrscheinlich brauchen Sie nur eine Bibliothek in Ihrem obersten Comic-Ordner, Sie können alle Unterordner mit Hilfe des Ordnerbereichs in der linken Seitenleiste durchsuchen. + +YACReaderLibrary wird Sie nicht daran hindern, weitere Bibliotheken zu erstellen, aber Sie sollten die Anzahl der Bibliotheken gering halten. + + + + + YACReader not found + YACReader nicht gefunden + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader nicht gefunden. YACReader muss im gleichen Ordner installiert sein wie YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader nicht gefunden. Eventuell besteht ein Problem mit Ihrer YACReader-Installation. + + + + Error + Fehler + + + + Error opening comic with third party reader. + Beim Öffnen des Comics mit dem Drittanbieter-Reader ist ein Fehler aufgetreten. + + + + Library not found + Bibliothek nicht gefunden + + + + The selected folder doesn't contain any library. + Der ausgewählte Ordner enthält keine Bibliothek. + + + + Are you sure? + Sind Sie sicher? + + + + Do you want remove + Möchten Sie entfernen + + + + library? + Bibliothek? + + + + Remove and delete metadata + Entferne und lösche Metadaten + + + + Library info + Informationen zur Bibliothek + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Es gab ein Problem beim Löschen der ausgewählten Comics. Überprüfen Sie bitte die Schreibberechtigung für die ausgewählten Dateien oder Ordner. + + + + Assign comics numbers + Comics Nummern zuweisen + + + + Assign numbers starting in: + Nummern zuweisen, beginnend mit: + + + + Invalid image + Ungültiges Bild + + + + The selected file is not a valid image. + Die ausgewählte Datei ist kein gültiges Bild. + + + + Error saving cover + Fehler beim Speichern des Covers + + + + There was an error saving the cover image. + Beim Speichern des Titelbildes ist ein Fehler aufgetreten. + + + + Error creating the library + Fehler beim Erstellen der Bibliothek + + + + Error updating the library + Fehler beim Updaten der Bibliothek + + + + Error opening the library + Fehler beim Öffnen der Bibliothek + + + + Delete comics + Comics löschen + + + + All the selected comics will be deleted from your disk. Are you sure? + Alle ausgewählten Comics werden von Ihrer Festplatte gelöscht. Sind Sie sicher? + + + + Remove comics + Comics löschen + + + + Comics will only be deleted from the current label/list. Are you sure? + Comics werden nur vom aktuellen Label/der aktuellen Liste gelöscht. Sind Sie sicher? + + + + Library name already exists + Bibliothek-Name bereits vorhanden + + + + There is another library with the name '%1'. + Es gibt bereits eine Bibliothek mit dem Namen '%1'. + + + + LibraryWindowActions + + + Create a new library + Neue Bibliothek erstellen + + + + Open an existing library + Eine vorhandede Bibliothek öffnen + + + + + Export comics info + Comicinfo exportieren + + + + + Import comics info + Importiere Comic-Info + + + + Pack covers + Titelbild-Paket erzeugen + + + + Pack the covers of the selected library + Packe die Titelbilder der ausgewählten Bibliothek in ein Paket + + + + Unpack covers + Titelbilder entpacken + + + + Unpack a catalog + Katalog entpacken + + + + Update library + Bibliothek updaten + + + + Update current library + Aktuelle Bibliothek updaten + + + + Rename library + Bibliothek umbenennen + + + + Rename current library + Aktuelle Bibliothek umbenennen + + + + Remove library + Bibliothek entfernen + + + + Remove current library from your collection + Aktuelle Bibliothek aus der Sammlung entfernen + + + + Rescan library for XML info + Durchsuchen Sie die Bibliothek erneut nach XML-Informationen + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Versucht, in Comic-Dateien eingebettete XML-Informationen zu finden. Sie müssen dies nur tun, wenn die Bibliothek mit 9.8.2 oder früheren Versionen erstellt wurde oder wenn Sie Software von Drittanbietern verwenden, um XML-Informationen in die Dateien einzubetten. + + + + Show library info + Bibliotheksinformationen anzeigen + + + + Show information about the current library + Informationen zur aktuellen Bibliothek anzeigen + + + + Open current comic + Aktuellen Comic öffnen + + + + Open current comic on YACReader + Aktuellen Comic mit YACReader öffnen + + + + Save selected covers to... + Ausgewählte Titelbilder speichern in... + + + + Save covers of the selected comics as JPG files + Titelbilder der ausgewählten Comics als JPG-Datei speichern + + + + + Set as read + Als gelesen markieren + + + + Set comic as read + Comic als gelesen markieren + + + + + Set as unread + Als ungelesen markieren + + + + Set comic as unread + Comic als ungelesen markieren + + + + + manga + Manga + + + + Set issue as manga + Ausgabe als Manga festlegen + + + + + comic + komisch + + + + Set issue as normal + Ausgabe als normal festlegen + + + + western manga + Western-Manga + + + + Set issue as western manga + Ausgabe als Western-Manga festlegen + + + + + web comic + Webcomic + + + + Set issue as web comic + Ausgabe als Webcomic festlegen + + + + + yonkoma + Yonkoma + + + + Set issue as yonkoma + Stellen Sie das Problem als Yonkoma ein + + + + Show/Hide marks + Zeige/Verberge Markierungen + + + + Show or hide read marks + Gelesen-Markierungen anzeigen oder verbergen + + + + Show/Hide recent indicator + Aktuelle Anzeige ein-/ausblenden + + + + Show or hide recent indicator + Aktuelle Anzeige anzeigen oder ausblenden + + + + + Fullscreen mode on/off + Vollbildmodus an/aus + + + + Help, About YACReader + Hilfe, über YACReader + + + + Add new folder + Neuen Ordner erstellen + + + + Add new folder to the current library + Neuen Ordner in der aktuellen Bibliothek erstellen + + + + Delete folder + Ordner löschen + + + + Delete current folder from disk + Aktuellen Ordner von der Festplatte löschen + + + + Select root node + Ursprungsordner auswählen + + + + Expand all nodes + Alle Unterordner anzeigen + + + + Collapse all nodes + Alle Unterordner einklappen + + + + Show options dialog + Zeige den Optionen-Dialog + + + + Show comics server options dialog + Zeige Comic-Server-Optionen-Dialog + + + + + Change between comics views + Zwischen Comic-Anzeigemodi wechseln + + + + Open folder... + Öffne Ordner... + + + + Set as uncompleted + Als nicht gelesen markieren + + + + Set as completed + Als gelesen markieren + + + + Set custom cover + Legen Sie ein benutzerdefiniertes Cover fest + + + + Delete custom cover + Benutzerdefiniertes Cover löschen + + + + western manga (left to right) + Western-Manga (von links nach rechts) + + + + Open containing folder... + Öffne aktuellen Ordner... + + + + Reset comic rating + Comic-Bewertung zurücksetzen + + + + Select all comics + Alle Comics auswählen + + + + Edit + Ändern + + + + Assign current order to comics + Aktuele Sortierung auf Comics anwenden + + + + Update cover + Titelbild updaten + + + + Delete selected comics + Ausgewählte Comics löschen + + + + Delete metadata from selected comics + Metadaten aus ausgewählten Comics löschen + + + + Download tags from Comic Vine + Tags von Comic Vine herunterladen + + + + Focus search line + Suchzeile fokussieren + + + + Focus comics view + Fokus-Comic-Ansicht + + + + Edit shortcuts + Kürzel ändern + + + + &Quit + &Schließen + + + + Update folder + Ordner aktualisieren + + + + Update current folder + Aktuellen Ordner aktualisieren + + + + Scan legacy XML metadata + Scannen Sie ältere XML-Metadaten + + + + Add new reading list + Neue Leseliste hinzufügen + + + + Add a new reading list to the current library + Neue Leseliste zur aktuellen Bibliothek hinzufügen + + + + Remove reading list + Leseliste entfernen + + + + Remove current reading list from the library + Aktuelle Leseliste von der Bibliothek entfernen + + + + Add new label + Neues Label hinzufügen + + + + Add a new label to this library + Neues Label zu dieser Bibliothek hinzufügen + + + + Rename selected list + Ausgewählte Liste umbenennen + + + + Rename any selected labels or lists + Ausgewählte Labels oder Listen umbenennen + + + + Add to... + Hinzufügen zu... + + + + Favorites + Favoriten + + + + Add selected comics to favorites list + Ausgewählte Comics zu Favoriten hinzufügen + + + + LocalComicListModel + + + file name + Dateiname + + + + LogWindow + + Log window + Änderungsprotokoll-Fenster + + + &Pause + Pause + + + &Save + Speichern + + + C&lear + L&öschen + + + &Copy + &Kopieren + + + Level: + Level + + + &Auto scroll + &Automatisches Scrollen + + + + MainWindowViewer + + File + Datei + + + Help + Hilfe + + + Save + Speichern + + + &File + &Datei + + + &Next + &Nächstes + + &Open &Öffnen - Close - Schliessen + Close + Schliessen + + + Open Comic + Comic öffnen + + + Go To + Gehe zu + + + Open image folder + Bilder-Ordner öffnen + + + Set bookmark + Lesezeichen setzen + + + page_%1.jpg + Seite_%1.jpg + + + Switch to double page mode + Zum Doppelseiten-Modus wechseln + + + Save current page + Aktuelle Seite speichern + + + Double page mode + Doppelseiten-Modus + + + Switch Magnifying glass + Vergrößerungsglas wechseln + + + Open Folder + Ordner öffnen + + + Fit Height + Höhe anpassen + + + Comic files + Comic-Dateien + + + Not now + Nicht jetzt + + + Go to previous page + Zur vorherigen Seite gehen + + + Open a comic + Comic öffnen + + + Image files (*.jpg) + Bildateien (*.jpg) + + + Next Comic + Nächster Comic + + + Fit Width + Breite anpassen + + + Options + Optionen + + + Show Info + Info anzeigen + + + Open folder + Ordner öffnen + + + Go to page ... + Gehe zu Seite ... + + + Fit image to width + Bildbreite anpassen + + + &Previous + &Vorherige + + + Go to next page + Zur nächsten Seite gehen + + + Show keyboard shortcuts + Tastenkürzel anzeigen + + + There is a new version available + Neue Version verfügbar + + + Open next comic + Nächsten Comic öffnen + + + Remind me in 14 days + In 14 Tagen erneut erinnern + + + Show bookmarks + Lesezeichen anzeigen + + + Open previous comic + Vorherigen Comic öffnen + + + Rotate image to the left + Bild nach links drehen + + + Fit image to height + Bild an Höhe anpassen + + + Show the bookmarks of the current comic + Lesezeichen für diesen Comic anzeigen + + + Show Dictionary + Wörterbuch anzeigen + + + YACReader options + YACReader Optionen + + + Help, About YACReader + Hilfe, über YACReader + + + Show go to flow + "Gehe zu Comic Flow" anzeigen + + + Previous Comic + Voheriger Comic + + + Show full size + Vollansicht anzeigen + + + Magnifying glass + Vergößerungsglas + + + General + Allgemein + + + Set a bookmark on the current page + Lesezeichen auf dieser Seite setzen + + + Do you want to download the new version? + Möchten Sie die neue Version herunterladen? + + + Rotate image to the right + Bild nach rechts drehen + + + Always on top + Immer Oberste Ansicht + + + New instance + Neuer Fall + + + Open latest comic + Neuesten Comic öffnen + + + Open the latest comic opened in the previous reading session + Öffne den neuesten Comic deiner letzten Sitzung + + + Clear + Löschen + + + Clear open recent list + Lösche Liste zuletzt geöffneter Elemente + + + Fit to page + An Seite anpassen + + + Reset zoom + Zoom zurücksetzen + + + Show zoom slider + Zoomleiste anzeigen + + + Zoom+ + Vergr??ern+ + + + Zoom- + Verkleinern- + + + Double page manga mode + Doppelseiten-Manga-Modus + + + Reverse reading order in double page mode + Umgekehrte Lesereihenfolge im Doppelseiten-Modus + + + Edit shortcuts + Kürzel ändern + + + Open recent + Kürzlich geöffnet + + + Edit + Ändern + + + View + Anzeigen + + + Go + Los + + + Window + Fenster + + + Comics + Comichefte + + + Toggle fullscreen mode + Vollbild-Modus umschalten + + + Hide/show toolbar + Symbolleiste anzeigen/verstecken + + + Size up magnifying glass + Vergrößerungsglas vergrößern + + + Size down magnifying glass + Vergrößerungsglas verkleinern + + + Zoom in magnifying glass + Vergrößerungsglas reinzoomen + + + Zoom out magnifying glass + Vergrößerungsglas rauszoomen + + + Magnifiying glass + Vergrößerungsglas + + + Toggle between fit to width and fit to height + Zwischen Anpassung an Seite und Höhe wechseln + + + Page adjustement + Seitenanpassung + + + Autoscroll down + Automatisches Runterscrollen + + + Autoscroll up + Automatisches Raufscrollen + + + Autoscroll forward, horizontal first + Automatisches Vorwärtsscrollen, horizontal zuerst + + + Autoscroll backward, horizontal first + Automatisches Zurückscrollen, horizontal zuerst + + + Autoscroll forward, vertical first + Automatisches Vorwärtsscrollen, vertikal zuerst + + + Autoscroll backward, vertical first + Automatisches Zurückscrollen, vertikal zuerst + + + Move down + Nach unten + + + Move up + Nach oben + + + Move left + Nach links + + + Move right + Nach rechts + + + Go to the first page + Zur ersten Seite gehen + + + Go to the last page + Zur letzten Seite gehen + + + Reading + Lesend + + + + NoLibrariesWidget + + + You don't have any libraries yet + Sie haben aktuell noch keine Bibliothek + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Sie können eine Bibliothek in jedem beliebigen Ordner erstellen, YACReaderLibrary wird alle Comics und Unterordner von diesem Ordner importieren. Wenn Sie bereits eine Bibliothek erstellt haben, können Sie sie öffnen.</p><p>Vergessen Sie nicht, dass Sie YACReader als eigentsändige Anwendung nutzen können, um Comics auf Ihrem Computer zu lesen.</p> + + + + create your first library + Erstellen Sie Ihre erste Bibliothek + + + + add an existing one + Existierende hinzufügen + + + + NoSearchResultsWidget + + + No results + Keine Ergebnisse + + + + OptionsDialog + + + Gamma + Gammawert + + + + Reset + Zurücksetzen + + + + My comics path + Meine Comics-Pfad + + + + Scaling + Skalierung + + + + Scaling method + Skalierungsmethode + + + + Nearest (fast, low quality) + Am nächsten (schnell, niedrige Qualität) - Open Comic - Comic öffnen + + Bilinear + Bilinear-Filter - Go To - Gehe zu + + Lanczos (better quality) + Lanczos (bessere Qualität) - Open image folder - Bilder-Ordner öffnen + + Image adjustment + Bildanpassung - Set bookmark - Lesezeichen setzen + + "Go to flow" size + Größe von "Gehe zu Comic Flow" - page_%1.jpg - Seite_%1.jpg + + Choose + Auswählen - Switch to double page mode - Zum Doppelseiten-Modus wechseln + + Image options + Bilderoptionen - Save current page - Aktuelle Seite speichern + + Contrast + Kontrast - Double page mode - Doppelseiten-Modus + + + Libraries + Bibliotheken - Switch Magnifying glass - Vergrößerungsglas wechseln + + Comic Flow + Comic Flow - Open Folder - Ordner öffnen + + Grid view + Rasteransicht - Fit Height - Höhe anpassen + + + Appearance + Aussehen - Comic files - Comic-Dateien + + + Options + Optionen + + + + + Language + Sprache + + + + + Application language + Anwendungssprache + + + + + System default + Systemstandard + + + + Tray icon settings (experimental) + Taskleisten-Einstellungen (experimentell) + + + + Close to tray + In Taskleiste schließen + + + + Start into the system tray + In die Taskleiste starten + + + + Edit Comic Vine API key + Comic Vine API-Schlüssel ändern + + + + Comic Vine API key + Comic Vine API Schlüssel + + + + ComicInfo.xml legacy support + ComicInfo.xml-Legacy-Unterstützung + + + + Import metadata from ComicInfo.xml when adding new comics + Importieren Sie Metadaten aus ComicInfo.xml, wenn Sie neue Comics hinzufügen + + + + Consider 'recent' items added or updated since X days ago + Berücksichtigen Sie „neue“ Elemente, die seit X Tagen hinzugefügt oder aktualisiert wurden + + + + Third party reader + Drittanbieter-Reader + + + + Write {comic_file_path} where the path should go in the command + Schreiben Sie {comic_file_path}, wohin der Pfad im Befehl gehen soll + + + + + Clear + Löschen + + + + Update libraries at startup + Aktualisieren Sie die Bibliotheken beim Start + + + + Try to detect changes automatically + Versuchen Sie, Änderungen automatisch zu erkennen + + + + Update libraries periodically + Aktualisieren Sie die Bibliotheken regelmäßig + + + + Interval: + Intervall: + + + + 30 minutes + 30 Minuten + + + + 1 hour + 1 Stunde + + + + 2 hours + 2 Stunden + + + + 4 hours + 4 Stunden + + + + 8 hours + 8 Stunden + + + + 12 hours + 12 Stunden + + + + daily + täglich + + + + Update libraries at certain time + Aktualisieren Sie Bibliotheken zu einem bestimmten Zeitpunkt + + + + Time: + Zeit: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + WARNUNG! Während Bibliotheksaktualisierungen sind Schreibvorgänge in die Datenbank deaktiviert! +Planen Sie keine Updates, während Sie die App möglicherweise aktiv nutzen. +Bei automatischen Updates blockiert die App einige Aktionen, bis das Update abgeschlossen ist. +Um eine automatische Aktualisierung zu stoppen, tippen Sie auf die Ladeanzeige neben dem Titel „Bibliotheken“. + + + + Modifications detection + Erkennung von Änderungen + + + + Compare the modified date of files when updating a library (not recommended) + Vergleichen Sie das Änderungsdatum von Dateien beim Aktualisieren einer Bibliothek (nicht empfohlen) + + + + Enable background image + Hintergrundbild aktivieren + + + + Opacity level + Deckkraft-Stufe + + + + Blur level + Unschärfe-Stufe + + + + Use selected comic cover as background + Den ausgewählten Comic als Hintergrund verwenden + + + + Restore defautls + Standardwerte wiederherstellen + + + + Background + Hintergrund + + + + Display continue reading banner + Weiterlesen-Banner anzeigen + + + + Display current comic banner + Aktuelles Comic-Banner anzeigen + + + + Continue reading + Weiterlesen + + + + Comics directory + Comics-Verzeichnis + + + + Background color + Hintergrundfarbe + + + + Page Flow + Seitenfluss + + + + + General + Allgemein + + + + Brightness + Helligkeit + + + + + Restart is needed + Neustart erforderlich + + + + Quick Navigation Mode + Schnellnavigations-Modus + + + + Display + Anzeige + + + + Show time in current page information label + Zeit im Informationsetikett der aktuellen Seite anzeigen + + + + Scroll behaviour + Scrollverhalten + + + + Disable scroll animations and smooth scrolling + Scroll-Animationen und sanftes Scrollen deaktivieren + + + + Do not turn page using scroll + Blättern Sie nicht mit dem Scrollen um + + + + Use single scroll step to turn page + Verwenden Sie einen einzelnen Bildlaufschritt, um die Seite umzublättern + + + + Mouse mode + Mausmodus + + + + Only Back/Forward buttons can turn pages + Nur mit den Zurück-/Vorwärts-Tasten können Seiten umgeblättert werden + + + + Use the Left/Right buttons to turn pages. + Verwenden Sie die Links-/Rechts-Tasten, um Seiten umzublättern. + + + + Click left or right half of the screen to turn pages. + Klicken Sie auf die linke oder rechte Hälfte des Bildschirms, um die Seiten umzublättern. + + + + Disable mouse over activation + Aktivierung durch Maus deaktivieren + + + + Fit options + Anpassungsoptionen + + + + Enlarge images to fit width/height + Bilder vergrößern, um sie Breite/Höhe anzupassen + + + + Double Page options + Doppelseiten-Einstellungen + + + + Show covers as single page + Cover als eine Seite darstellen + + + + PropertiesDialog + + + General info + Allgemeine Info + + + + Plot + Inhalt + + + + Authors + Autoren + + + + Publishing + Veröffentlichung + + + + Notes + Notizen + + + + Cover page + Titelbild + + + + Load previous page as cover + Vorherige Seite als Cover laden + + + + Load next page as cover + Nächste Seite als Cover laden + + + + Reset cover to the default image + Cover auf das Standardbild zurücksetzen + + + + Load custom cover image + Laden Sie ein benutzerdefiniertes Titelbild + + + + Series: + Serie: + + + + Title: + Titel: + + + + + + of: + von + + + + Issue number: + Ausgabennummer: + + + + Volume: + Band: + + + + Arc number: + Handlungsbogen Nummer: + + + + Story arc: + Handlung: + + + + alt. number: + alt. Nummer: + + + + Alternate series: + Alternative Serie: + + + + Series Group: + Seriengruppe: + + + + Genre: + Gattung: + + + + Size: + Größe: + + + + Writer(s): + Autor(en): + + + + Penciller(s): + Künstler(Bleistift): + + + + Inker(s): + Künstler(Tinte): + + + + Colorist(s): + Künstler(Farbe): + + + + Letterer(s): + Künstler(Schrift): + + + + Cover Artist(s): + Titelbild-Künstler: + + + + Editor(s): + Herausgeber(n): - Not now - Nicht jetzt + + Imprint: + Impressum: - Go to previous page - Zur vorherigen Seite gehen + + Day: + Tag: - Open a comic - Comic öffnen + + Month: + Monat: - Image files (*.jpg) - Bildateien (*.jpg) + + Year: + Jahr: - Next Comic - Nächster Comic + + Publisher: + Verlag: - Fit Width - Breite anpassen + + Format: + Formatangabe: - Options - Optionen + + Color/BW: + Farbe/Schwarz-Weiß: - Show Info - Info anzeigen + + Age rating: + Altersangabe: - Open folder - Ordner öffnen + + Type: + Typ: - Go to page ... - Gehe zu Seite ... + + Language (ISO): + Sprache (ISO): - Fit image to width - Bildbreite anpassen + + Synopsis: + Zusammenfassung: - &Previous - &Vorherige + + Characters: + Charaktere: - Go to next page - Zur nächsten Seite gehen + + Teams: + Mannschaften: - Show keyboard shortcuts - Tastenkürzel anzeigen + + Locations: + Standorte: - There is a new version available - Neue Version verfügbar + + Main character or team: + Hauptfigur oder Team: - Open next comic - Nächsten Comic öffnen + + Review: + Rezension: - Remind me in 14 days - In 14 Tagen erneut erinnern + + Notes: + Anmerkungen: - Show bookmarks - Lesezeichen anzeigen + + Tags: + Schlagworte: - Open previous comic - Vorherigen Comic öffnen + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine-Link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ansehen </a> - Rotate image to the left - Bild nach links drehen + + Not found + Nicht gefunden - Fit image to height - Bild an Höhe anpassen + + Comic not found. You should update your library. + Comic nicht gefunden. Sie sollten Ihre Bibliothek updaten. - Show the bookmarks of the current comic - Lesezeichen für diesen Comic anzeigen + + Edit comic information + Comic-Informationen bearbeiten - Show Dictionary - Wörterbuch anzeigen + + Edit selected comics information + Ausgewählte Comic-Informationen bearbeiten - YACReader options - YACReader Optionen + + Invalid cover + Ungültiger Versicherungsschutz - Help, About YACReader - Hilfe, über YACReader + + The image is invalid. + Das Bild ist ungültig. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer ist die Headless-Version (keine GUI) von YACReaderLibrary. + +Diese Anwendung unterstützt dauerhafte Einstellungen. Um sie einzurichten, bearbeiten Sie diese Datei %1 +Um mehr über die verfügbaren Einstellungen zu erfahren, lesen Sie bitte die Dokumentation unter https://raw.githubusercontent.com/YACReader/yareader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + QObject - Show go to flow - "Go to Flow" anzeigen + + 7z lib not found + 7z-Verzeichnis nicht gefunden - Previous Comic - Voheriger Comic + + unable to load 7z lib from ./utils + 7z -erzeichnis kann von ./utils nicht geladen werden - Show full size - Vollansicht anzeigen + + Trace + Verfolgen - Magnifying glass - Vergößerungsglas + + Debug + Fehlersuche - General - Allgemein + + Info + Information - Set a bookmark on the current page - Lesezeichen auf dieser Seite setzen + + Warning + Warnung - Do you want to download the new version? - Möchten Sie die neue Version herunterladen? + + Error + Fehler - Rotate image to the right - Bild nach rechts drehen + + Fatal + Tödlich - Always on top - Immer Oberste Ansicht + + Select custom cover + Wählen Sie ein benutzerdefiniertes Cover - New instance - Neuer Fall + + Images (%1) + Bilder (%1) - Open latest comic - Neuesten Comic öffnen + + The file could not be read or is not valid JSON. + Die Datei konnte nicht gelesen werden oder ist kein gültiges JSON. - Open the latest comic opened in the previous reading session - Öffne den neuesten Comic deiner letzten Sitzung + + This theme is for %1, not %2. + Dieses Thema ist für %1, nicht für %2. - Clear - Löschen + + Libraries + Bibliotheken - Clear open recent list - Lösche Liste zuletzt geöffneter Elemente + + Folders + Ordner - Fit to page - An Seite anpassen + + Reading Lists + Leselisten + + + QsLogging::LogWindowModel - Reset zoom - Zoom zurücksetzen + Time + Zeit - Show zoom slider - Zoomleiste anzeigen + Level + Stufe - Zoom+ - Zoom+ + Message + NAchricht + + + QsLogging::Window - Zoom- - Zoom- + &Pause + Pause - Double page manga mode - Doppelseiten-Manga-Modus + &Resume + &Weiter - Reverse reading order in double page mode - Umgekehrte Lesereihenfolge im Doppelseiten-Modus + Save log + Protokoll speichern - Edit shortcuts - Kürzel ändern + Log file (*.log) + Protokoll-Datei (*.log) + + + RenameLibraryDialog - Open recent - Kürzlich geöffnet + + New Library Name : + Neuer Bibliotheksname : - Edit - Ändern + + Rename + Umbenennen - View - Anzeigen + + Cancel + Abbrechen - Go - Los + + Rename current library + Aktuelle Bibliothek umbenennen + + + ScraperResultsPaginator - Window - Fenster + + Number of volumes found : %1 + Anzahl der gefundenen Bände: %1 - Comics - Comics + + + page %1 of %2 + Seite %1 von %2 - Toggle fullscreen mode - Vollbild-Modus umschalten + + Number of %1 found : %2 + Anzahl von %1 gefunden : %2 + + + SearchSingleComic - Hide/show toolbar - Symbolleiste anzeigen/verstecken + + Please provide some additional information for this comic. + Bitte stellen Sie weitere Informationen zur Verfügung. - Size up magnifying glass - Vergrößerungsglas vergrößern + + Series: + Serie: - Size down magnifying glass - Vergrößerungsglas verkleinern + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Verwenden Sie die Suche nach exakten Übereinstimmungen. Deaktivieren Sie diese Option, wenn Sie Bände finden möchten, die mit einigen Wörtern im Namen übereinstimmen. + + + SearchVolume - Zoom in magnifying glass - Vergrößerungsglas reinzoomen + + Please provide some additional information. + Bitte stellen Sie weitere Informationen zur Verfügung. - Zoom out magnifying glass - Vergrößerungsglas rauszoomen + + Series: + Serie: - Magnifiying glass - Vergrößerungsglas + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Verwenden Sie die Suche nach exakten Übereinstimmungen. Deaktivieren Sie diese Option, wenn Sie Bände finden möchten, die mit einigen Wörtern im Namen übereinstimmen. + + + SelectComic - Toggle between fit to width and fit to height - Zwischen Anpassung an Seite und Höhe wechseln + + Please, select the right comic info. + Bitte wählen Sie die korrekte Comic-Information aus. - Page adjustement - Seitenanpassung + + comics + Comics - Autoscroll down - Automatisches Runterscrollen + + loading cover + Titelbild wird geladen - Autoscroll up - Automatisches Raufscrollen + + loading description + Beschreibung wird laden - Autoscroll forward, horizontal first - Automatisches Vorwärtsscrollen, horizontal zuerst + + comic description unavailable + Comic-Beschreibung nicht verfügbar + + + SelectVolume - Autoscroll backward, horizontal first - Automatisches Zurückscrollen, horizontal zuerst + + Please, select the right series for your comic. + Bitte wählen Sie die korrekte Serie für Ihre Comics aus. - Autoscroll forward, vertical first - Automatisches Vorwärtsscrollen, vertikal zuerst + + Filter: + Filteroption: - Autoscroll backward, vertical first - Automatisches Zurückscrollen, vertikal zuerst + + volumes + Bände - Move down - Nach unten + + Nothing found, clear the filter if any. + Nichts gefunden. Löschen Sie ggf. den Filter. - Move up - Nach oben + + loading cover + Titelbild wird geladen - Move left - Nach links + + loading description + Beschreibung wird laden - Move right - Nach rechts + + volume description unavailable + Bandbeschreibung nicht verfügbar + + + SeriesQuestion - Go to the first page - Zur ersten Seite gehen + + You are trying to get information for various comics at once, are they part of the same series? + Sie versuchen, Informationen zu mehreren Comics gleichzeitig zu laden, sind diese Teil einer Serie? - Go to the last page - Zur letzten Seite gehen + + yes + Ja - Reading - Lesend + + no + Nein - OptionsDialog + ServerConfigDialog - - Gamma - Gamma + + set port + Anschluss wählen - - Reset - Zurücksetzen + + Server connectivity information + Serveranschluss-Information - - My comics path - Meine Comics-Pfad + + Scan it! + Durchsuchen! - - Image adjustment - Bildanpassung + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader ist für iOS- und Android-Geräte verfügbar.<br/>Entdecken Sie es für <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> oder <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - - "Go to flow" size - "Go to flow" Größe + + Choose an IP address + IP-Adresse auswählen - - Choose - Auswählen + + Port + Anschluss - - Image options - Bilderoptionen + + enable the server + Server aktivieren + + + ShortcutsDialog - - Contrast - Kontrast + Close + Schliessen - - Options - Optionen + YACReader keyboard shortcuts + YACReader Tastaturkürzel - - Comics directory - Comics-Verzeichnis + Keyboard Shortcuts + Tastaturkürzel + + + SortVolumeComics - - Background color - Hintergrundfarbe + + Please, sort the list of comics on the left until it matches the comics' information. + Sortieren Sie bitte die Comic-Informationen links, bis die Informationen mit den Comics übereinstimmen. - - Page Flow - Page Flow + + sort comics to match comic information + Comics laut Comic-Information sortieren - - General - Allgemein + + issues + Ausgaben - - Brightness - Helligkeit + + remove selected comics + Ausgewählte Comics entfernen - - Restart is needed - Neustart erforderlich + + restore all removed comics + Alle entfernten Comics wiederherstellen + + + + ThemeEditorDialog + + + Theme Editor + Theme-Editor - - Quick Navigation Mode - Schnellnavigations-Modus + + + + + + + + + - + - + + + + i + ich - - Display - + + Expand all + Alles erweitern - - Show time in current page information label - + + Collapse all + Alles einklappen - - Scroll behaviour - + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Halten Sie gedrückt, um den ausgewählten Wert in der Benutzeroberfläche zu blinken (Magenta / umgeschaltet / 0↔10). Loslassen stellt das Original wieder her. - - Disable scroll animations and smooth scrolling - + + Search… + Suchen… - - Do not turn page using scroll - + + Light + Licht - - Use single scroll step to turn page - + + Dark + Dunkel - - Mouse mode - + + ID: + AUSWEIS: - - Only Back/Forward buttons can turn pages - + + Display name: + Anzeigename: - - Use the Left/Right buttons to turn pages. - + + Variant: + Variante: - - Click left or right half of the screen to turn pages. - + + Theme info + Themeninfo - - Disable mouse over activation - Aktivierung durch Maus deaktivieren + + Parameter + Parameterwert - - Fit options - Anpassungsoptionen + + Value + Wert - - Enlarge images to fit width/height - Bilder vergrößern, um sie Breite/Höhe anzupassen + + Save and apply + Speichern und anwenden - - Double Page options - Doppelseiten-Einstellungen + + Export to file... + In Datei exportieren... - - Show covers as single page - Cover als eine Seite darstellen + + Load from file... + Aus Datei laden... - - - QObject - - 7z lib not found - 7z-Verzeichnis nicht gefunden + + Close + Schliessen - - unable to load 7z lib from ./utils - 7z -erzeichnis kann von ./utils nicht geladen werden + + Double-click to edit color + Doppelklicken Sie, um die Farbe zu bearbeiten - - Trace - Verfolgen + + + + + + + true + WAHR - - Debug - Fehlersuche + + + + + false + FALSCH - - Info - Information + + Double-click to toggle + Zum Umschalten doppelklicken - - Warning - Warnung + + Double-click to edit value + Doppelklicken Sie, um den Wert zu bearbeiten - - Error - Error + + + + Edit: %1 + Bearbeiten: %1 - - Fatal - Fatal + + Save theme + Thema speichern - - Select custom cover - + + + JSON files (*.json);;All files (*) + JSON-Dateien (*.json);;Alle Dateien (*) - - Images (%1) - + + Save failed + Speichern fehlgeschlagen - - - QsLogging::LogWindowModel - - Time - Zeit + + Could not open file for writing: +%1 + Die Datei konnte nicht zum Schreiben geöffnet werden: +%1 - - Level - Level + + Load theme + Theme laden - - Message - NAchricht + + + + Load failed + Das Laden ist fehlgeschlagen - - - QsLogging::Window - - &Pause - &Pause + + Could not open file: +%1 + Datei konnte nicht geöffnet werden: +%1 - - &Resume - &Weiter + + Invalid JSON: +%1 + Ungültiger JSON: +%1 - - Save log - Protokoll speichern + + Expected a JSON object. + Es wurde ein JSON-Objekt erwartet. + + + TitleHeader - - Log file (*.log) - Protokoll-Datei (*.log) + + SEARCH + Suchen - ShortcutsDialog + UpdateLibraryDialog - Close - Schliessen + + Updating.... + Aktualisierung.... - YACReader keyboard shortcuts - YACReader Tastaturkürzel + + Cancel + Abbrechen - Keyboard Shortcuts - Tastaturkürzel + + Update library + Bibliothek updaten Viewer - + Page not available! Seite nicht verfügbar! - - - Press 'O' to open comic. - 'O' drücken, um Comic zu öffnen. + + + Press 'O' to open comic. + 'O' drücken, um Comic zu öffnen. - + Error opening comic Fehler beim Öffnen des Comics - + Cover! Titelseite! - + CRC Error CRC Fehler - + Comic not found Comic nicht gefunden - + Not found Nicht gefunden - + Last page! Letzte Seite! - + Loading...please wait! Ladevorgang... Bitte warten! + + VolumeComicsModel + + + title + Titel + + + + VolumesModel + + + year + Jahr + + + + issues + Ausgaben + + + + publisher + Herausgeber + + + + YACReader3DFlowConfigWidget + + + Presets: + Voreinstellungen: + + + + Classic look + Klassische Ansicht + + + + Stripe look + Streifen-Ansicht + + + + Overlapped Stripe look + Überlappende Streifen-Ansicht + + + + Modern look + Moderne Ansicht + + + + Roulette look + Zufalls-Ansicht + + + + Show advanced settings + Zeige erweiterte Einstellungen + + + + Custom: + Benutzerdefiniert: + + + + View angle + Anzeige-Winkel + + + + Position + Lage + + + + Cover gap + Titelbild-Abstand + + + + Central gap + Mittiger Abstand + + + + Zoom + Vergrößern + + + + Y offset + Y-Anpassung + + + + Z offset + Z-Anpassung + + + + Cover Angle + Titelbild Ansichtswinkel + + + + Visibility + Sichtbarkeit + + + + Light + Licht + + + + Max angle + Maximaler Winkel + + + + Low Performance + Niedrige Leistung + + + + High Performance + Hohe Leistung + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Benutze VSync (verbessert die Bildqualität im Vollanzeigemodus, schlechtere Leistung) + + + + Performance: + Leistung: + + YACReader::MainWindowViewer - + &Open - &Öffnen + &Öffnen - + Open a comic - Comic öffnen + Comic öffnen - + New instance - Neuer Fall + Neuer Fall - + Open Folder - Ordner öffnen + Ordner öffnen - + Open image folder - Bilder-Ordner öffnen + Bilder-Ordner öffnen - + Open latest comic - Neuesten Comic öffnen + Neuesten Comic öffnen - + Open the latest comic opened in the previous reading session - Öffne den neuesten Comic deiner letzten Sitzung + Öffne den neuesten Comic deiner letzten Sitzung - + Clear - Löschen + Löschen - + Clear open recent list - Lösche Liste zuletzt geöffneter Elemente + Lösche Liste zuletzt geöffneter Elemente - + Save - Speichern + Speichern - + Save current page - Aktuelle Seite speichern + Aktuelle Seite speichern Previous Comic - Voheriger Comic + Voheriger Comic - - - + + + Open previous comic - Vorherigen Comic öffnen + Vorherigen Comic öffnen - + Next Comic - Nächster Comic + Nächster Comic - - - + + + Open next comic - Nächsten Comic öffnen + Nächsten Comic öffnen - + &Previous - &Vorherige + &Vorherige - - - + + + Go to previous page - Zur vorherigen Seite gehen + Zur vorherigen Seite gehen - + &Next - &Nächstes + &Nächstes - - - + + + Go to next page - Zur nächsten Seite gehen + Zur nächsten Seite gehen - + Fit Height - Höhe anpassen + Höhe anpassen - + Fit image to height - Bild an Höhe anpassen + Bild an Höhe anpassen - + Fit Width - Breite anpassen + Breite anpassen - + Fit image to width - Bildbreite anpassen + Bildbreite anpassen - + Show full size - Vollansicht anzeigen + Vollansicht anzeigen - + Fit to page - An Seite anpassen + An Seite anpassen + + + + Continuous scroll + Kontinuierliches Scrollen + + + + Switch to continuous scroll mode + Wechseln Sie in den kontinuierlichen Bildlaufmodus - + Reset zoom - Zoom zurücksetzen + Zoom zurücksetzen - + Show zoom slider - Zoomleiste anzeigen + Zoomleiste anzeigen - + Zoom+ - Zoom+ + Vergr??ern+ - + Zoom- - Zoom- + Verkleinern- - + Rotate image to the left - Bild nach links drehen + Bild nach links drehen - + Rotate image to the right - Bild nach rechts drehen + Bild nach rechts drehen - + Double page mode - Doppelseiten-Modus + Doppelseiten-Modus - + Switch to double page mode - Zum Doppelseiten-Modus wechseln + Zum Doppelseiten-Modus wechseln - + Double page manga mode - Doppelseiten-Manga-Modus + Doppelseiten-Manga-Modus - + Reverse reading order in double page mode - Umgekehrte Lesereihenfolge im Doppelseiten-Modus + Umgekehrte Lesereihenfolge im Doppelseiten-Modus - + Go To - Gehe zu + Gehe zu - + Go to page ... - Gehe zu Seite ... + Gehe zu Seite ... - + Options - Optionen + Optionen - + YACReader options - YACReader Optionen + YACReader Optionen - - + + Help - Hilfe + Hilfe - + Help, About YACReader - Hilfe, über YACReader + Hilfe, über YACReader - + Magnifying glass - Vergößerungsglas + Vergößerungsglas - + Switch Magnifying glass - Vergrößerungsglas wechseln + Vergrößerungsglas wechseln - + Set bookmark - Lesezeichen setzen + Lesezeichen setzen - + Set a bookmark on the current page - Lesezeichen auf dieser Seite setzen + Lesezeichen auf dieser Seite setzen - + Show bookmarks - Lesezeichen anzeigen + Lesezeichen anzeigen - + Show the bookmarks of the current comic - Lesezeichen für diesen Comic anzeigen + Lesezeichen für diesen Comic anzeigen - + Show keyboard shortcuts - Tastenkürzel anzeigen + Tastenkürzel anzeigen - + Show Info - Info anzeigen + Info anzeigen - + Close - + Schliessen - + Show Dictionary - Wörterbuch anzeigen + Wörterbuch anzeigen - + Show go to flow - "Go to Flow" anzeigen + "Gehe zu Comic Flow" anzeigen - + Edit shortcuts - + Kürzel ändern - + &File - &Datei + &Datei - - + + Open recent - Kürzlich geöffnet + Kürzlich geöffnet - + File - Datei + Datei - + Edit - Ändern + Ändern - + View - Anzeigen + Anzeigen - + Go - Los + Los - + Window - Fenster + Fenster - - - + + + Open Comic - Comic öffnen + Comic öffnen - - - + + + Comic files - Comic-Dateien + Comic-Dateien - + Open folder - Ordner öffnen + Ordner öffnen - + page_%1.jpg - Seite_%1.jpg + Seite_%1.jpg - + Image files (*.jpg) - Bildateien (*.jpg) + Bildateien (*.jpg) + Comics - Comics + Comichefte Toggle fullscreen mode - Vollbild-Modus umschalten + Vollbild-Modus umschalten Hide/show toolbar - Symbolleiste anzeigen/verstecken + Symbolleiste anzeigen/verstecken + General - Allgemein + Allgemein Size up magnifying glass - Vergrößerungsglas vergrößern + Vergrößerungsglas vergrößern Size down magnifying glass - Vergrößerungsglas verkleinern + Vergrößerungsglas verkleinern Zoom in magnifying glass - Vergrößerungsglas reinzoomen + Vergrößerungsglas reinzoomen Zoom out magnifying glass - Vergrößerungsglas rauszoomen + Vergrößerungsglas rauszoomen Reset magnifying glass - + Lupe zurücksetzen + Magnifiying glass - Vergrößerungsglas + Vergrößerungsglas Toggle between fit to width and fit to height - Zwischen Anpassung an Seite und Höhe wechseln + Zwischen Anpassung an Seite und Höhe wechseln + Page adjustement - Seitenanpassung + Seitenanpassung - + Autoscroll down - Automatisches Runterscrollen + Automatisches Runterscrollen - + Autoscroll up - Automatisches Raufscrollen + Automatisches Raufscrollen - + Autoscroll forward, horizontal first - Automatisches Vorwärtsscrollen, horizontal zuerst + Automatisches Vorwärtsscrollen, horizontal zuerst - + Autoscroll backward, horizontal first - Automatisches Zurückscrollen, horizontal zuerst + Automatisches Zurückscrollen, horizontal zuerst - + Autoscroll forward, vertical first - Automatisches Vorwärtsscrollen, vertikal zuerst + Automatisches Vorwärtsscrollen, vertikal zuerst - + Autoscroll backward, vertical first - Automatisches Zurückscrollen, vertikal zuerst + Automatisches Zurückscrollen, vertikal zuerst - + Move down - Nach unten + Nach unten - + Move up - Nach oben + Nach oben - + Move left - Nach links + Nach links - + Move right - Nach rechts + Nach rechts - + Go to the first page - Zur ersten Seite gehen + Zur ersten Seite gehen - + Go to the last page - Zur letzten Seite gehen + Zur letzten Seite gehen - + Offset double page to the left - + Doppelseite nach links versetzt - + Offset double page to the right - + Doppelseite nach rechts versetzt - + + Reading - Lesend + Lesend - + There is a new version available - Neue Version verfügbar + Neue Version verfügbar - + Do you want to download the new version? - Möchten Sie die neue Version herunterladen? + Möchten Sie die neue Version herunterladen? - + Remind me in 14 days - In 14 Tagen erneut erinnern + In 14 Tagen erneut erinnern - + Not now - Nicht jetzt + Nicht jetzt + + + + YACReader::TrayIconController + + + &Restore + &Wiederherstellen + + + + Systray + Taskleiste + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary wird im Hintergrund weiterlaufen. Um das Programm zu schließen, wählen Sie <b>Schließen</b> im Kontextmenü des Taskleisten-Symbols. YACReader::WhatsNewDialog - Close - Schließen + Schließen @@ -1411,172 +4116,152 @@ YACReaderFlowConfigWidget - CoverFlow look - Tielseiten Ansicht + Tielseiten Ansicht - How to show covers: - Titelseiten Anzeigeoptionen: + Titelseiten Anzeigeoptionen: - Stripe look - Streifen-Ansicht + Streifen-Ansicht - Overlapped Stripe look - Überlappende Streifen-Ansicht + Überlappende Streifen-Ansicht YACReaderGLFlowConfigWidget - Zoom - Vergrößern + Vergrößern - Light - Licht + Licht - Show advanced settings - Zeige erweiterte Einstellungen + Zeige erweiterte Einstellungen - Roulette look - Zufalls-Ansicht + Zufalls-Ansicht - Cover Angle - Titelbild Ansichtswinkel + Titelbild Ansichtswinkel - Stripe look - Streifen-Ansicht + Streifen-Ansicht - Position - Position + Lage - Z offset - Z-Anpassung + Z-Anpassung - Y offset - Y-Anpassung + Y-Anpassung - Central gap - Mittiger Abstand + Mittiger Abstand - Presets: - Voreinstellungen: + Voreinstellungen: - Overlapped Stripe look - Überlappende Streifen-Ansicht + Überlappende Streifen-Ansicht - Modern look - Moderne Ansicht + Moderne Ansicht - View angle - Anzeige-Winkel + Anzeige-Winkel - Max angle - Maximaler Winkel + Maximaler Winkel - Custom: - Benutzerdefiniert: + Benutzerdefiniert: - Classic look - Klassische Ansicht + Klassische Ansicht - Cover gap - Titelbild-Abstand + Titelbild-Abstand - High Performance - Hohe Leistung + Hohe Leistung - Performance: - Leistung: + Leistung: - Use VSync (improve the image quality in fullscreen mode, worse performance) - Benutze VSync (verbessert die Bildqualität im Vollanzeigemodus, schlechtere Leistung) + Benutze VSync (verbessert die Bildqualität im Vollanzeigemodus, schlechtere Leistung) - Visibility - Sichtbarkeit + Sichtbarkeit - Low Performance - Niedrige Leistung + Niedrige Leistung YACReaderOptionsDialog - + Save Speichern - Use hardware acceleration (restart needed) - Nutze Hardwarebeschleunigung (Neustart erforderlich) + Nutze Hardwarebeschleunigung (Neustart erforderlich) - + Cancel Abbrechen - + Edit shortcuts Kürzel bearbeiten - + Shortcuts Kürzel + + YACReaderSearchLineEdit + + + type to search + tippen, um zu suchen + + YACReaderSlider @@ -1588,23 +4273,23 @@ YACReaderTranslator - + clear Löschen - + Service not available Service nicht verfügbar - - + + Translation Übersetzung - + YACReader translator YACReader Übersetzer diff --git a/YACReader/yacreader_en.ts b/YACReader/yacreader_en.ts index bd065a64c..819f47c6e 100644 --- a/YACReader/yacreader_en.ts +++ b/YACReader/yacreader_en.ts @@ -6,7 +6,197 @@ None - + None + + + + AddLabelDialog + + + Label name: + Label name: + + + + Choose a color: + Choose a color: + + + + accept + accept + + + + cancel + cancel + + + + AddLibraryDialog + + + Comics folder : + Comics folder : + + + + Library name : + Library name : + + + + Add + Add + + + + Cancel + Cancel + + + + Add an existing library + Add an existing library + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + + + + Paste here your Comic Vine API key + Paste here your Comic Vine API key + + + + Accept + Accept + + + + Cancel + Cancel + + + + AppearanceTabWidget + + + Color scheme + Color scheme + + + + System + System + + + + Light + Light + + + + Dark + Dark + + + + Custom + Custom + + + + Remove + Remove + + + + Remove this user-imported theme + Remove this user-imported theme + + + + Light: + Light: + + + + Dark: + Dark: + + + + Custom: + Custom: + + + + Import theme... + Import theme... + + + + Theme + Theme + + + + Theme editor + Theme editor + + + + Open Theme Editor... + Open Theme Editor... + + + + Theme editor error + Theme editor error + + + + The current theme JSON could not be loaded. + The current theme JSON could not be loaded. + + + + Import theme + Import theme + + + + JSON files (*.json);;All files (*) + JSON files (*.json);;All files (*) + + + + Could not import theme from: +%1 + Could not import theme from: +%1 + + + + Could not import theme from: +%1 + +%2 + Could not import theme from: +%1 + +%2 + + + + Import failed + Import failed @@ -14,23 +204,217 @@ Lastest Page - + Lastest Page Close - + Close Click on any image to go to the bookmark - + Click on any image to go to the bookmark Loading... - + Loading... + + + + ClassicComicsView + + + Hide comic flow + Hide comic flow + + + + ComicModel + + + yes + yes + + + + no + no + + + + Title + Title + + + + File Name + File Name + + + + Pages + Pages + + + + Size + Size + + + + Read + Read + + + + Current Page + Current Page + + + + Publication Date + Publication Date + + + + Rating + Rating + + + + Series + Series + + + + Volume + Volume + + + + Story Arc + Story Arc + + + + ComicVineDialog + + + skip + skip + + + + back + back + + + + next + next + + + + search + search + + + + close + close + + + + + comic %1 of %2 - %3 + comic %1 of %2 - %3 + + + + + + Looking for volume... + Looking for volume... + + + + %1 comics selected + %1 comics selected + + + + Error connecting to ComicVine + Error connecting to ComicVine + + + + + Retrieving tags for : %1 + Retrieving tags for : %1 + + + + Retrieving volume info... + Retrieving volume info... + + + + Looking for comic... + Looking for comic... + + + + ContinuousPageWidget + + + Loading page %1 + Loading page %1 + + + + CreateLibraryDialog + + + Comics folder : + Comics folder : + + + + Library Name : + Library Name : + + + + Create + Create + + + + Cancel + Cancel + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + + + + Create new library + Create new library + + + + Path not found + Path not found + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder @@ -38,27 +422,145 @@ Restore defaults - + Restore defaults To change a shortcut, double click in the key combination and type the new keys. - + To change a shortcut, double click in the key combination and type the new keys. Shortcuts settings - + Shortcuts settings - + Shortcut in use - + Shortcut in use - + The shortcut "%1" is already assigned to other function - + The shortcut "%1" is already assigned to other function + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + This folder doesn't contain comics yet + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + This label doesn't contain comics yet + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + This reading list does not contain any comics yet + + + + EmptySpecialListWidget + + + No favorites + No favorites + + + + You are not reading anything yet, come on!! + You are not reading anything yet, come on!! + + + + There are no recent comics! + There are no recent comics! + + + + ExportComicsInfoDialog + + + Output file : + Output file : + + + + Create + Create + + + + Cancel + Cancel + + + + Export comics info + Export comics info + + + + Destination database name + Destination database name + + + + Problem found while writing + Problem found while writing + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + + + + ExportLibraryDialog + + + Output folder : + Output folder : + + + + Create + Create + + + + Cancel + Cancel + + + + Create covers package + Create covers package + + + + Problem found while writing + Problem found while writing + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + + + + Destination directory + Destination directory @@ -66,22 +568,22 @@ CRC error on page (%1): some of the pages will not be displayed correctly - + CRC error on page (%1): some of the pages will not be displayed correctly Unknown error opening the file - + Unknown error opening the file 7z not found - + 7z not found Format not supported - + Format not supported @@ -89,899 +591,3011 @@ Page : - + Page : Go To - + Go To Cancel - + Cancel + + + + + Total pages : + Total pages : + + + + Go to... + Go to... + + + + GoToFlowToolBar + + + Page : + Page : + + + + GridComicsView + + + Show info + Show info + + + + HelpAboutDialog + + + About + About + + + + Help + Help + + + + System info + System info + + + + ImportComicsInfoDialog + + + Import comics info + Import comics info + + + + Info database location : + Info database location : + + + + Import + Import + + + + Cancel + Cancel + + + + Comics info file (*.ydb) + Comics info file (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Library Name : + + + + Package location : + Package location : + + + + Destination folder : + Destination folder : + + + + Unpack + Unpack + + + + Cancel + Cancel + + + + Extract a catalog + Extract a catalog + + + + Compresed library covers (*.clc) + Compresed library covers (*.clc) + + + + ImportWidget + + + stop + stop + + + + Some of the comics being added... + Some of the comics being added... + + + + Importing comics + Importing comics + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + + + + Updating the library + Updating the library + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + + + + Upgrading the library + Upgrading the library + + + + <p>The current library is being upgraded, please wait.</p> + <p>The current library is being upgraded, please wait.</p> + + + + Scanning the library + Scanning the library + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Library + + + + + + comic + comic + + + + + + manga + manga + + + + + + western manga (left to right) + western manga (left to right) + + + + + + web comic + web comic + + + + + + 4koma (top to botom) + 4koma (top to botom) + + + + + + + Set type + Set type + + + + Library + Library + + + + Folder + Folder + + + + Comic + Comic + + + + Upgrade failed + Upgrade failed + + + + There were errors during library upgrade in: + There were errors during library upgrade in: + + + + Update needed + Update needed + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + + + + Download new version + Download new version + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + This library was created with a newer version of YACReaderLibrary. Download the new version now? + + + + Library not available + Library not available + + + + Library '%1' is no longer available. Do you want to remove it? + Library '%1' is no longer available. Do you want to remove it? + + + + Old library + Old library + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + + + + + Copying comics... + Copying comics... + + + + + Moving comics... + Moving comics... + + + + Add new folder + Add new folder + + + + Folder name: + Folder name: + + + + No folder selected + No folder selected + + + + Please, select a folder first + Please, select a folder first + + + + Error in path + Error in path + + + + There was an error accessing the folder's path + There was an error accessing the folder's path + + + + Delete folder + Delete folder + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + The selected folder and all its contents will be deleted from your disk. Are you sure? + + + + + Unable to delete + Unable to delete + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + + + + Add new reading lists + Add new reading lists + + + + + List name: + List name: + + + + Delete list/label + Delete list/label + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + + + + Rename list name + Rename list name + + + + Open folder... + Open folder... + + + + Update folder + Update folder + + + + Rescan library for XML info + Rescan library for XML info + + + + Set as uncompleted + Set as uncompleted + + + + Set as completed + Set as completed + + + + Set as read + Set as read + + + + + Set as unread + Set as unread + + + + Set custom cover + Set custom cover + + + + Delete custom cover + Delete custom cover + + + + Save covers + Save covers + + + + You are adding too many libraries. + You are adding too many libraries. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + + + + + YACReader not found + YACReader not found + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader not found. There might be a problem with your YACReader installation. + + + + Error + Error + + + + Error opening comic with third party reader. + Error opening comic with third party reader. + + + + Library not found + Library not found + + + + The selected folder doesn't contain any library. + The selected folder doesn't contain any library. + + + + Are you sure? + Are you sure? + + + + Do you want remove + Do you want remove + + + + library? + library? + + + + Remove and delete metadata + Remove and delete metadata + + + + Library info + Library info + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + + + + Assign comics numbers + Assign comics numbers + + + + Assign numbers starting in: + Assign numbers starting in: + + + + Invalid image + Invalid image + + + + The selected file is not a valid image. + The selected file is not a valid image. + + + + Error saving cover + Error saving cover + + + + There was an error saving the cover image. + There was an error saving the cover image. + + + + Error creating the library + Error creating the library + + + + Error updating the library + Error updating the library + + + + Error opening the library + Error opening the library + + + + Delete comics + Delete comics + + + + All the selected comics will be deleted from your disk. Are you sure? + All the selected comics will be deleted from your disk. Are you sure? + + + + Remove comics + Remove comics + + + + Comics will only be deleted from the current label/list. Are you sure? + Comics will only be deleted from the current label/list. Are you sure? + + + + Library name already exists + Library name already exists + + + + There is another library with the name '%1'. + There is another library with the name '%1'. + + + + LibraryWindowActions + + + Create a new library + Create a new library + + + + Open an existing library + Open an existing library + + + + + Export comics info + Export comics info + + + + + Import comics info + Import comics info + + + + Pack covers + Pack covers + + + + Pack the covers of the selected library + Pack the covers of the selected library + + + + Unpack covers + Unpack covers + + + + Unpack a catalog + Unpack a catalog + + + + Update library + Update library + + + + Update current library + Update current library + + + + Rename library + Rename library + + + + Rename current library + Rename current library + + + + Remove library + Remove library + + + + Remove current library from your collection + Remove current library from your collection + + + + Rescan library for XML info + Rescan library for XML info + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + + + + Show library info + Show library info + + + + Show information about the current library + Show information about the current library + + + + Open current comic + Open current comic + + + + Open current comic on YACReader + Open current comic on YACReader + + + + Save selected covers to... + Save selected covers to... + + + + Save covers of the selected comics as JPG files + Save covers of the selected comics as JPG files + + + + + Set as read + Set as read + + + + Set comic as read + Set comic as read + + + + + Set as unread + Set as unread + + + + Set comic as unread + Set comic as unread + + + + + manga + manga + + + + Set issue as manga + Set issue as manga + + + + + comic + comic + + + + Set issue as normal + Set issue as normal + + + + western manga + western manga + + + + Set issue as western manga + Set issue as western manga + + + + + web comic + web comic + + + + Set issue as web comic + Set issue as web comic + + + + + yonkoma + yonkoma + + + + Set issue as yonkoma + Set issue as yonkoma + + + + Show/Hide marks + Show/Hide marks + + + + Show or hide read marks + Show or hide read marks + + + + Show/Hide recent indicator + Show/Hide recent indicator + + + + Show or hide recent indicator + Show or hide recent indicator + + + + + Fullscreen mode on/off + Fullscreen mode on/off + + + + Help, About YACReader + Help, About YACReader + + + + Add new folder + Add new folder + + + + Add new folder to the current library + Add new folder to the current library + + + + Delete folder + Delete folder + + + + Delete current folder from disk + Delete current folder from disk + + + + Select root node + Select root node + + + + Expand all nodes + Expand all nodes + + + + Collapse all nodes + Collapse all nodes + + + + Show options dialog + Show options dialog + + + + Show comics server options dialog + Show comics server options dialog + + + + + Change between comics views + Change between comics views + + + + Open folder... + Open folder... + + + + Set as uncompleted + Set as uncompleted + + + + Set as completed + Set as completed + + + + Set custom cover + Set custom cover + + + + Delete custom cover + Delete custom cover + + + + western manga (left to right) + western manga (left to right) + + + + Open containing folder... + Open containing folder... + + + + Reset comic rating + Reset comic rating + + + + Select all comics + Select all comics + + + + Edit + Edit + + + + Assign current order to comics + Assign current order to comics + + + + Update cover + Update cover + + + + Delete selected comics + Delete selected comics + + + + Delete metadata from selected comics + Delete metadata from selected comics + + + + Download tags from Comic Vine + Download tags from Comic Vine + + + + Focus search line + Focus search line + + + + Focus comics view + Focus comics view + + + + Edit shortcuts + Edit shortcuts + + + + &Quit + &Quit + + + + Update folder + Update folder + + + + Update current folder + Update current folder + + + + Scan legacy XML metadata + Scan legacy XML metadata + + + + Add new reading list + Add new reading list + + + + Add a new reading list to the current library + Add a new reading list to the current library + + + + Remove reading list + Remove reading list + + + + Remove current reading list from the library + Remove current reading list from the library + + + + Add new label + Add new label + + + + Add a new label to this library + Add a new label to this library + + + + Rename selected list + Rename selected list + + + + Rename any selected labels or lists + Rename any selected labels or lists + + + + Add to... + Add to... + + + + Favorites + Favorites + + + + Add selected comics to favorites list + Add selected comics to favorites list + + + + LocalComicListModel + + + file name + file name + + + + NoLibrariesWidget + + + You don't have any libraries yet + You don't have any libraries yet + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + + + create your first library + create your first library + + + + add an existing one + add an existing one + + + + NoSearchResultsWidget + + + No results + No results + + + + OptionsDialog + + + "Go to flow" size + "Go to flow" size + + + + My comics path + My comics path + + + + Background color + Background color + + + + Choose + Choose + + + + Quick Navigation Mode + Quick Navigation Mode + + + + Disable mouse over activation + Disable mouse over activation + + + + Scaling + Scaling + + + + Scaling method + Scaling method + + + + Nearest (fast, low quality) + Nearest (fast, low quality) + + + + Bilinear + Bilinear + + + + Lanczos (better quality) + Lanczos (better quality) + + + + Restart is needed + Restart is needed + + + + Brightness + Brightness + + + + Display + Display + + + + Show time in current page information label + Show time in current page information label + + + + Scroll behaviour + Scroll behaviour + + + + Disable scroll animations and smooth scrolling + Disable scroll animations and smooth scrolling + + + + Do not turn page using scroll + Do not turn page using scroll + + + + Use single scroll step to turn page + Use single scroll step to turn page + + + + Mouse mode + Mouse mode + + + + Only Back/Forward buttons can turn pages + Only Back/Forward buttons can turn pages + + + + Use the Left/Right buttons to turn pages. + Use the Left/Right buttons to turn pages. + + + + Click left or right half of the screen to turn pages. + Click left or right half of the screen to turn pages. + + + + Contrast + Contrast + + + + Gamma + Gamma + + + + Reset + Reset + + + + Image options + Image options + + + + Fit options + Fit options + + + + Enlarge images to fit width/height + Enlarge images to fit width/height + + + + Double Page options + Double Page options + + + + Show covers as single page + Show covers as single page + + + + + General + General + + + + + Libraries + Libraries + + + + Comic Flow + Comic Flow + + + + Grid view + Grid view + + + + + Appearance + Appearance + + + + Tray icon settings (experimental) + Tray icon settings (experimental) + + + + Close to tray + Close to tray + + + + Start into the system tray + Start into the system tray + + + + Edit Comic Vine API key + Edit Comic Vine API key + + + + Comic Vine API key + Comic Vine API key + + + + ComicInfo.xml legacy support + ComicInfo.xml legacy support + + + + Import metadata from ComicInfo.xml when adding new comics + Import metadata from ComicInfo.xml when adding new comics + + + + Consider 'recent' items added or updated since X days ago + Consider 'recent' items added or updated since X days ago + + + + Third party reader + Third party reader + + + + Write {comic_file_path} where the path should go in the command + Write {comic_file_path} where the path should go in the command + + + + + Clear + Clear + + + + Update libraries at startup + Update libraries at startup + + + + Try to detect changes automatically + Try to detect changes automatically + + + + Update libraries periodically + Update libraries periodically + + + + Interval: + Interval: + + + + 30 minutes + 30 minutes + + + + 1 hour + 1 hour + + + + 2 hours + 2 hours + + + + 4 hours + 4 hours + + + + 8 hours + 8 hours + + + + 12 hours + 12 hours + + + + daily + daily + + + + Update libraries at certain time + Update libraries at certain time + + + + Time: + Time: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + + + + Modifications detection + Modifications detection + + + + Compare the modified date of files when updating a library (not recommended) + Compare the modified date of files when updating a library (not recommended) + + + + Enable background image + Enable background image + + + + Opacity level + Opacity level + + + + Blur level + Blur level + + + + Use selected comic cover as background + Use selected comic cover as background + + + + Restore defautls + Restore defautls + + + + Background + Background + + + + Display continue reading banner + Display continue reading banner + + + + Display current comic banner + Display current comic banner + + + + Continue reading + Continue reading + + + + Page Flow + Page Flow + + + + Image adjustment + Image adjustment + + + + + Options + Options + + + + Comics directory + Comics directory + + + + PropertiesDialog + + + General info + General info + + + + Plot + Plot + + + + Authors + Authors + + + + Publishing + Publishing + + + + Notes + Notes + + + + Cover page + Cover page + + + + Load previous page as cover + Load previous page as cover + + + + Load next page as cover + Load next page as cover + + + + Reset cover to the default image + Reset cover to the default image + + + + Load custom cover image + Load custom cover image + + + + Series: + Series: + + + + Title: + Title: + + + + + + of: + of: + + + + Issue number: + Issue number: + + + + Volume: + Volume: + + + + Arc number: + Arc number: + + + + Story arc: + Story arc: + + + + alt. number: + alt. number: + + + + Alternate series: + Alternate series: + + + + Series Group: + Series Group: + + + + Genre: + Genre: + + + + Size: + Size: + + + + Writer(s): + Writer(s): + + + + Penciller(s): + Penciller(s): + + + + Inker(s): + Inker(s): + + + + Colorist(s): + Colorist(s): + + + + Letterer(s): + Letterer(s): + + + + Cover Artist(s): + Cover Artist(s): + + + + Editor(s): + Editor(s): + + + + Imprint: + Imprint: + + + + Day: + Day: + + + + Month: + Month: + + + + Year: + Year: + + + + Publisher: + Publisher: + + + + Format: + Format: + + + + Color/BW: + Color/BW: + + + + Age rating: + Age rating: + + + + Type: + Type: + + + + Language (ISO): + Language (ISO): + + + + Synopsis: + Synopsis: + + + + Characters: + Characters: + + + + Teams: + Teams: + + + + Locations: + Locations: + + + + Main character or team: + Main character or team: + + + + Review: + Review: + + + + Notes: + Notes: + + + + Tags: + Tags: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + + + + Not found + Not found + + + + Comic not found. You should update your library. + Comic not found. You should update your library. + + + + Edit comic information + Edit comic information + + + + Edit selected comics information + Edit selected comics information + + + + Invalid cover + Invalid cover + + + + The image is invalid. + The image is invalid. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + 7z lib not found + 7z lib not found + + + + unable to load 7z lib from ./utils + unable to load 7z lib from ./utils + + + + Trace + Trace + + + + Debug + Debug + + + + Info + Info + + + + Warning + Warning + + + + Error + Error + + + + Fatal + Fatal + + + + Select custom cover + Select custom cover + + + + Images (%1) + Images (%1) + + + + The file could not be read or is not valid JSON. + The file could not be read or is not valid JSON. + + + + This theme is for %1, not %2. + This theme is for %1, not %2. + + + + Libraries + Libraries + + + + Folders + Folders + + + + Reading Lists + Reading Lists + + + + RenameLibraryDialog + + + New Library Name : + New Library Name : + + + + Rename + Rename + + + + Cancel + Cancel + + + + Rename current library + Rename current library + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Number of volumes found : %1 + + + + + page %1 of %2 + page %1 of %2 + + + + Number of %1 found : %2 + Number of %1 found : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Please provide some additional information for this comic. + + + + Series: + Series: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + + + + SearchVolume + + + Please provide some additional information. + Please provide some additional information. + + + + Series: + Series: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + + + + SelectComic + + + Please, select the right comic info. + Please, select the right comic info. + + + + comics + comics + + + + loading cover + loading cover + + + + loading description + loading description + + + + comic description unavailable + comic description unavailable + + + + SelectVolume + + + Please, select the right series for your comic. + Please, select the right series for your comic. + + + + Filter: + Filter: + + + + volumes + volumes + + + + Nothing found, clear the filter if any. + Nothing found, clear the filter if any. + + + + loading cover + loading cover + + + + loading description + loading description + + + + volume description unavailable + volume description unavailable + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + You are trying to get information for various comics at once, are they part of the same series? + + + + yes + yes + + + + no + no + + + + ServerConfigDialog + + + set port + set port + + + + Server connectivity information + Server connectivity information + + + + Scan it! + Scan it! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Choose an IP address + + + + Port + Port + + + + enable the server + enable the server + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Please, sort the list of comics on the left until it matches the comics' information. + + + + sort comics to match comic information + sort comics to match comic information + + + + issues + issues + + + + remove selected comics + remove selected comics + + + + restore all removed comics + restore all removed comics + + + + ThemeEditorDialog + + + Theme Editor + Theme Editor + + + + + + + + + + + - + - + + + + i + i + + + + Expand all + Expand all - - - Total pages : - + + Collapse all + Collapse all - - Go to... - + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. - - - GoToFlowToolBar - - Page : - + + Search… + Search… - - - HelpAboutDialog - - About - + + Light + Light - - Help - + + Dark + Dark - - System info - + + ID: + ID: - - - LogWindow - - Log window - + + Display name: + Display name: - - &Pause - + + Variant: + Variant: - - &Save - + + Theme info + Theme info - - C&lear - + + Parameter + Parameter - - &Copy - + + Value + Value - - Level: - + + Save and apply + Save and apply - - &Auto scroll - + + Export to file... + Export to file... - - - OptionsDialog - - "Go to flow" size - + + Load from file... + Load from file... - - My comics path - + + Close + Close - - Background color - + + Double-click to edit color + Double-click to edit color - - Choose - + + + + + + + true + true - - Quick Navigation Mode - + + + + + false + false - - Disable mouse over activation - + + Double-click to toggle + Double-click to toggle - - Restart is needed - + + Double-click to edit value + Double-click to edit value - - Brightness - + + + + Edit: %1 + Edit: %1 - - Display - + + Save theme + Save theme - - Show time in current page information label - + + + JSON files (*.json);;All files (*) + JSON files (*.json);;All files (*) - - Scroll behaviour - + + Save failed + Save failed - - Disable scroll animations and smooth scrolling - + + Could not open file for writing: +%1 + Could not open file for writing: +%1 - - Do not turn page using scroll - + + Load theme + Load theme - - Use single scroll step to turn page - + + + + Load failed + Load failed - - Mouse mode - + + Could not open file: +%1 + Could not open file: +%1 - - Only Back/Forward buttons can turn pages - + + Invalid JSON: +%1 + Invalid JSON: +%1 - - Use the Left/Right buttons to turn pages. - + + Expected a JSON object. + Expected a JSON object. + + + TitleHeader - - Click left or right half of the screen to turn pages. - + + SEARCH + SEARCH + + + UpdateLibraryDialog - - Contrast - + + Updating.... + Updating.... - - Gamma - + + Cancel + Cancel - - Reset - + + Update library + Update library + + + Viewer - - Image options - + + + Press 'O' to open comic. + Press 'O' to open comic. - - Fit options - + + Not found + Not found - - Enlarge images to fit width/height - + + Comic not found + Comic not found - - Double Page options - + + Error opening comic + Error opening comic - - Show covers as single page - + + CRC Error + CRC Error - - General - + + Loading...please wait! + Loading...please wait! - - Page Flow - + + Page not available! + Page not available! - - Image adjustment - + + Cover! + Cover! - - Options - + + Last page! + Last page! + + + VolumeComicsModel - - Comics directory - + + title + title - QObject + VolumesModel - - 7z lib not found - + + year + year - - unable to load 7z lib from ./utils - + + issues + issues - - Trace - + + publisher + publisher + + + YACReader3DFlowConfigWidget - - Debug - + + Presets: + Presets: - - Info - + + Classic look + Classic look - - Warning - + + Stripe look + Stripe look - - Error - + + Overlapped Stripe look + Overlapped Stripe look - - Fatal - + + Modern look + Modern look - - Select custom cover - + + Roulette look + Roulette look - - Images (%1) - + + Show advanced settings + Show advanced settings - - - QsLogging::LogWindowModel - - Time - + + Custom: + Custom: - - Level - + + View angle + View angle - - Message - + + Position + Position - - - QsLogging::Window - - &Pause - + + Cover gap + Cover gap - - &Resume - + + Central gap + Central gap - - Save log - + + Zoom + Zoom - - Log file (*.log) - + + Y offset + Y offset - - - Viewer - - - Press 'O' to open comic. - + + Z offset + Z offset - - Not found - + + Cover Angle + Cover Angle - - Comic not found - + + Visibility + Visibility - - Error opening comic - + + Light + Light - - CRC Error - + + Max angle + Max angle - - Loading...please wait! - + + Low Performance + Low Performance - - Page not available! - + + High Performance + High Performance - - Cover! - + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Use VSync (improve the image quality in fullscreen mode, worse performance) - - Last page! - + + Performance: + Performance: YACReader::MainWindowViewer - + &Open - + &Open - + Open a comic - + Open a comic - + New instance - + New instance - + Open Folder - + Open Folder - + Open image folder - + Open image folder - + Open latest comic - + Open latest comic - + Open the latest comic opened in the previous reading session - + Open the latest comic opened in the previous reading session - + Clear - + Clear - + Clear open recent list - + Clear open recent list - + Save - + Save - + Save current page - + Save current page Previous Comic - + Previous Comic - - - + + + Open previous comic - + Open previous comic - + Next Comic - + Next Comic - - - + + + Open next comic - + Open next comic - + &Previous - + &Previous - - - + + + Go to previous page - + Go to previous page - + &Next - + &Next - - - + + + Go to next page - + Go to next page - + Fit Height - + Fit Height - + Fit image to height - + Fit image to height - + Fit Width - + Fit Width - + Fit image to width - + Fit image to width - + Show full size - + Show full size - + Fit to page - + Fit to page - + + Continuous scroll + Continuous scroll + + + + Switch to continuous scroll mode + Switch to continuous scroll mode + + + Reset zoom - + Reset zoom - + Show zoom slider - + Show zoom slider - + Zoom+ - + Zoom+ - + Zoom- - + Zoom- - + Rotate image to the left - + Rotate image to the left - + Rotate image to the right - + Rotate image to the right - + Double page mode - + Double page mode - + Switch to double page mode - + Switch to double page mode - + Double page manga mode - + Double page manga mode - + Reverse reading order in double page mode - + Reverse reading order in double page mode - + Go To - + Go To - + Go to page ... - + Go to page ... - + Options - + Options - + YACReader options - + YACReader options - - + + Help - + Help - + Help, About YACReader - + Help, About YACReader - + Magnifying glass - + Magnifying glass - + Switch Magnifying glass - + Switch Magnifying glass - + Set bookmark - + Set bookmark - + Set a bookmark on the current page - + Set a bookmark on the current page - + Show bookmarks - + Show bookmarks - + Show the bookmarks of the current comic - + Show the bookmarks of the current comic - + Show keyboard shortcuts - + Show keyboard shortcuts - + Show Info - + Show Info - + Close - + Close - + Show Dictionary - + Show Dictionary - + Show go to flow - + Show go to flow - + Edit shortcuts - + Edit shortcuts - + &File - + &File - - + + Open recent - + Open recent - + File - + File - + Edit - + Edit - + View - + View - + Go - + Go - + Window - + Window - - - + + + Open Comic - + Open Comic - - - + + + Comic files - + Comic files - + Open folder - + Open folder - + page_%1.jpg - + page_%1.jpg - + Image files (*.jpg) - + Image files (*.jpg) + Comics - + Comics Toggle fullscreen mode - + Toggle fullscreen mode Hide/show toolbar - + Hide/show toolbar + General - + General Size up magnifying glass - + Size up magnifying glass Size down magnifying glass - + Size down magnifying glass Zoom in magnifying glass - + Zoom in magnifying glass Zoom out magnifying glass - + Zoom out magnifying glass Reset magnifying glass - + Reset magnifying glass + Magnifiying glass - + Magnifiying glass Toggle between fit to width and fit to height - + Toggle between fit to width and fit to height + Page adjustement - + Page adjustement - + Autoscroll down - + Autoscroll down - + Autoscroll up - + Autoscroll up - + Autoscroll forward, horizontal first - + Autoscroll forward, horizontal first - + Autoscroll backward, horizontal first - + Autoscroll backward, horizontal first - + Autoscroll forward, vertical first - + Autoscroll forward, vertical first - + Autoscroll backward, vertical first - + Autoscroll backward, vertical first - + Move down - + Move down - + Move up - + Move up - + Move left - + Move left - + Move right - + Move right - + Go to the first page - + Go to the first page - + Go to the last page - + Go to the last page - + Offset double page to the left - + Offset double page to the left - + Offset double page to the right - + Offset double page to the right - + + Reading - + Reading - + There is a new version available - + There is a new version available - + Do you want to download the new version? - + Do you want to download the new version? - + Remind me in 14 days - + Remind me in 14 days - + Not now - + Not now - YACReader::WhatsNewDialog + YACReader::TrayIconController - - Close - + + &Restore + &Restore + + + + Systray + Systray + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. @@ -990,12 +3604,12 @@ Click to overwrite - + Click to overwrite Restore to default - + Restore to default @@ -1006,181 +3620,43 @@ Click to overwrite - + Click to overwrite Restore to default - - - - - YACReaderFlowConfigWidget - - - How to show covers: - - - - - CoverFlow look - - - - - Stripe look - - - - - Overlapped Stripe look - - - - - YACReaderGLFlowConfigWidget - - - Presets: - - - - - Classic look - - - - - Stripe look - - - - - Overlapped Stripe look - - - - - Modern look - - - - - Roulette look - - - - - Show advanced settings - - - - - Custom: - - - - - View angle - - - - - Position - - - - - Cover gap - - - - - Central gap - - - - - Zoom - - - - - Y offset - - - - - Z offset - - - - - Cover Angle - - - - - Visibility - - - - - Light - - - - - Max angle - - - - - Low Performance - - - - - High Performance - - - - - Use VSync (improve the image quality in fullscreen mode, worse performance) - - - - - Performance: - + Restore to default YACReaderOptionsDialog - + Save - + Save - + Cancel - + Cancel - + Edit shortcuts - + Edit shortcuts - + Shortcuts - + Shortcuts + + + YACReaderSearchLineEdit - - Use hardware acceleration (restart needed) - + + type to search + type to search @@ -1188,31 +3664,31 @@ Reset - + Reset YACReaderTranslator - + YACReader translator - + YACReader translator - - + + Translation - + Translation - + clear - + clear - + Service not available - + Service not available diff --git a/YACReader/yacreader_es.ts b/YACReader/yacreader_es.ts index 56605c326..b073d0383 100644 --- a/YACReader/yacreader_es.ts +++ b/YACReader/yacreader_es.ts @@ -10,759 +10,3367 @@ - BookmarksDialog + AddLabelDialog - - Close - Cerrar + + Label name: + Nombre de la etiqueta: - - - Loading... - Cargando... + + Choose a color: + Elige un color: - - Click on any image to go to the bookmark - Pulsa en cualquier imagen para ir al marcador + + accept + aceptar - - Lastest Page - Última página + + cancel + Cancelar - EditShortcutsDialog + AddLibraryDialog - - Restore defaults - Restaurar los valores predeterminados + + Comics folder : + Carpeta de cómics : - - To change a shortcut, double click in the key combination and type the new keys. - Para cambiar un atajo, haz doble clic en la combinación de teclas y escribe las nuevas teclas. + + Library name : + Nombre de la biblioteca : - - Shortcuts settings - Configuración de accesos directos + + Add + Añadir - - Shortcut in use - Accesos directos en uso + + Cancel + Cancelar - - The shortcut "%1" is already assigned to other function - El acceso directo "%1" ya está asignado a otra función + + Add an existing library + Añadir una biblioteca existente - FileComic + ApiKeyDialog - - Format not supported - Formato no soportado + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Antes de que te puedas conectar a Comic Vine necesitas tu propia clave API. Por favor, obtén una gratis <a href="http://www.comicvine.com/api/">aquí</a> - - 7z not found - 7z no encontrado + + Paste here your Comic Vine API key + Pega aquí tu clave API de Comic Vine - - Unknown error opening the file - Error desconocido abriendo el archivo + + Accept + Aceptar - - CRC error on page (%1): some of the pages will not be displayed correctly - Error CRC en la página (%1): algunas de las páginas no se mostrarán correctamente + + Cancel + Cancelar - GoToDialog + AppearanceTabWidget - - Go To - Ir a + + Color scheme + Esquema de color - - Go to... - Ir a... + + System + Sistema - - - Total pages : - Páginas totales : + + Light + Luz - - Cancel - Cancelar + + Dark + Oscuro - - Page : - Página : + + Custom + Personalizado - - - GoToFlowToolBar - - Page : - Página : + + Remove + Eliminar - - - HelpAboutDialog - - Help - Ayuda + + Remove this user-imported theme + Eliminar este tema importado por el usuario - - System info - Información de sistema + + Light: + Claro: - - About - Acerca de + + Dark: + Oscuro: - - - LogWindow - - Log window - + + Custom: + Personalizado: - - &Pause - + + Import theme... + Importar tema... - - &Save - + + Theme + Tema - - C&lear - + + Theme editor + Editor de temas - - &Copy - + + Open Theme Editor... + Abrir editor de temas... - - Level: - + + Theme editor error + Error del editor de temas - - &Auto scroll - + + The current theme JSON could not be loaded. + No se ha podido cargar el JSON del tema actual. - - - MainWindowViewer - File - Archivo + + Import theme + Importar tema - Help - Ayuda + + JSON files (*.json);;All files (*) + Archivos JSON (*.json);;Todos los archivos (*) - Save - Guardar + + Could not import theme from: +%1 + No se pudo importar el tema desde: +%1 - &File - &Archivo + + Could not import theme from: +%1 + +%2 + No se pudo importar el tema desde: +%1 + +%2 - &Next - Siguie&nte + + Import failed + Error al importar + + + BookmarksDialog - &Open - &Abrir + + Close + Cerrar - Close - Cerrar + + + Loading... + Cargando... - Open Comic - Abrir cómic + + Click on any image to go to the bookmark + Pulsa en cualquier imagen para ir al marcador - Go To - Ir a + + Lastest Page + Última página + + + ClassicComicsView - Open image folder - Abrir carpeta de imágenes + + Hide comic flow + Ocultar Comic Flow + + + ComicModel - Set bookmark - Añadir marcador + + yes + - page_%1.jpg - página_%1.jpg + + no + No - Switch to double page mode - Cambiar a modo de doble página + + Title + Título - Save current page - Guardar la página actual + + File Name + Nombre de archivo - Double page mode - Modo a doble página + + Pages + Páginas - Switch Magnifying glass - Lupa On/Off + + Size + Tamaño - Open Folder - Abrir carpeta + + Read + Leído - Fit Height - Ajustar altura + + Current Page + Página Actual - Comic files - Archivos de cómic + + Publication Date + Fecha de publicación - Not now - Ahora no + + Rating + Nota - Go to previous page - Ir a la página anterior + + Series + Serie - Open a comic - Abrir cómic + + Volume + Volumen - Image files (*.jpg) - Archivos de imagen (*.jpg) + + Story Arc + Arco argumental + + + ComicVineDialog - Next Comic - Siguiente Cómic + + skip + omitir - Fit Width - Ajustar anchura + + back + atrás - Options - Opciones + + next + siguiente - Show Info - Mostrar información + + search + buscar - Open folder - Abrir carpeta + + close + Cerrar - Go to page ... - Ir a página... + + + comic %1 of %2 - %3 + cómic %1 de %2 - %3 - Fit image to width - Ajustar página a lo ancho + + + + Looking for volume... + Buscando volumen... - &Previous - A&nterior + + %1 comics selected + %1 cómics seleccionados - Go to next page - Ir a la página siguiente + + Error connecting to ComicVine + Error conectando a ComicVine - Show keyboard shortcuts - Mostrar atajos de teclado + + + Retrieving tags for : %1 + Recuperando etiquetas para : %1 - There is a new version available - Hay una nueva versión disponible + + Retrieving volume info... + Recuperando información del volumen... - Open next comic - Abrir siguiente cómic + + Looking for comic... + Buscando cómic... + + + ContinuousPageWidget - Remind me in 14 days - Recordar en 14 días + + Loading page %1 + Cargando página %1 + + + CreateLibraryDialog - Show bookmarks - Mostrar marcadores + + Comics folder : + Carpeta de cómics : - Open previous comic - Abrir cómic anterior + + Library Name : + Nombre de la biblioteca : - Rotate image to the left - Rotar imagen a la izquierda + + Create + Crear - Fit image to height - Ajustar página a lo alto + + Cancel + Cancelar - Show the bookmarks of the current comic - Mostrar los marcadores del cómic actual + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Crear una biblioteca puede llevar varios minutos. Puedes parar el proceso en cualquier momento y completar la tarea más tarde. - Show Dictionary - Mostrar diccionario + + Create new library + Crear la nueva biblioteca - YACReader options - Opciones de YACReader + + Path not found + Ruta no encontrada - Help, About YACReader - Ayuda, Sobre YACReader + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + La ruta seleccionada no existe o no es válida. Asegúrate de que tienes privilegios de escritura en esta carpeta + + + EditShortcutsDialog - Show go to flow - Mostrar flow ir a + + Restore defaults + Restaurar los valores predeterminados - Previous Comic - Cómic anterior + + To change a shortcut, double click in the key combination and type the new keys. + Para cambiar un atajo, haz doble clic en la combinación de teclas y escribe las nuevas teclas. - Show full size - Mostrar a tamaño original + + Shortcuts settings + Configuración de accesos directos - Magnifying glass - Lupa + + Shortcut in use + Accesos directos en uso - General - General + + The shortcut "%1" is already assigned to other function + El acceso directo "%1" ya está asignado a otra función + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Esta carpeta aún no contiene cómics + + + EmptyLabelWidget - Set a bookmark on the current page - Añadir un marcador en la página actual + + This label doesn't contain comics yet + Esta etiqueta aún no contiene ningún cómic + + + EmptyReadingListWidget - Do you want to download the new version? - ¿Desea descargar la nueva versión? + + This reading list does not contain any comics yet + Esta lista de tectura aún no contiene ningún cómic + + + EmptySpecialListWidget - Rotate image to the right - Rotar imagen a la derecha + + No favorites + Ningún favorito - Always on top - Siempre visible + + You are not reading anything yet, come on!! + No estás leyendo nada aún, ¡vamos! + + + + There are no recent comics! + ¡No hay comics recientes! - OptionsDialog + ExportComicsInfoDialog - - Gamma - Gamma + + Output file : + Archivo de salida : - - Reset - Reset + + Create + Crear - - My comics path - Ruta a mis cómics + + Cancel + Cancelar - - Image adjustment - Ajustes de imagen + + Export comics info + Exportar información de los cómics + + + + Destination database name + Nombre de la base de datos de destino + + + + Problem found while writing + Problema encontrado mientras se escribía + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + La ruta seleccionada para el archivo de salida no existe o no es una ruta válida. Asegúrate de que tienes permisos de escritura en esta carpeta + + + + ExportLibraryDialog + + + Output folder : + Carpeta de destino : + + + + Create + Crear + + + + Cancel + Cancelar + + + + Create covers package + Crear paquete de portadas + + + + Problem found while writing + Problema encontrado mientras se escribía + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + La ruta seleccionada para el archivo de salida no existe o no es una ruta válida. Asegúrate de que tienes permisos de escritura en esta carpeta + + + + Destination directory + Carpeta de destino + + + + FileComic + + + Format not supported + Formato no soportado + + + + 7z not found + 7z no encontrado + + + + Unknown error opening the file + Error desconocido abriendo el archivo + + + + CRC error on page (%1): some of the pages will not be displayed correctly + Error CRC en la página (%1): algunas de las páginas no se mostrarán correctamente + + + + GoToDialog + + + Go To + Ir a + + + + Go to... + Ir a... + + + + + Total pages : + Páginas totales : + + + + Cancel + Cancelar + + + + Page : + Página : + + + + GoToFlowToolBar + + + Page : + Página : + + + + GridComicsView + + + Show info + Mostrar información + + + + HelpAboutDialog + + + Help + Ayuda + + + + System info + Información de sistema + + + + About + Acerca de + + + + ImportComicsInfoDialog + + + Import comics info + Importar información de cómics + + + + Info database location : + Ubicación de la base de datos de información : + + + + Import + Importar + + + + Cancel + Cancelar + + + + Comics info file (*.ydb) + Archivo de información de cómics (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nombre de la biblioteca : + + + + Package location : + Ubicación del paquete : + + + + Destination folder : + Directorio de destino : + + + + Unpack + Desempaquetar + + + + Cancel + Cancelar + + + + Extract a catalog + Extraer un catálogo + + + + Compresed library covers (*.clc) + Portadas de biblioteca comprimidas (*.clc) + + + + ImportWidget + + + stop + parar + + + + Some of the comics being added... + Algunos de los cómics que estan siendo añadidos.... + + + + Importing comics + Importando cómics + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary está creando una nueva biblioteca.</p><p>Crear una biblioteca puede llevar varios minutos. Puedes parar el proceso en cualquier momento y actualizar la biblioteca más tarde para completar el proceso.</p> + + + + Updating the library + Actualizando la biblioteca + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>La biblioteca actual está siendo actualizada. Para actualizaciones más rápidas, por favor, actualiza tus bibliotecas frecuentemente.</p><p>Puedes parar el proceso y continunar la actualización más tarde.</p> + + + + Upgrading the library + Actualizando la biblioteca + + + + <p>The current library is being upgraded, please wait.</p> + <p>La biblioteca actual está siendo actualizadad, espera por favor.</p> + + + + Scanning the library + Escaneando la biblioteca + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>La biblioteca está siendo escaneada para encontrar metadatos en formato XML.</p><p>Sólo necesitas hacer esto una vez, y sólo si la biblioteca fue creada con YACReaderLibrary 9.8.2 o antes.</p> + + + + LibraryWindow + + + YACReader Library + Biblioteca YACReader + + + + + + comic + Cómic + + + + + + manga + historieta manga + + + + + + western manga (left to right) + manga occidental (izquierda a derecha) + + + + + + web comic + cómic web + + + + + + 4koma (top to botom) + 4koma (de arriba a abajo) + + + + + + + Set type + Establecer tipo + + + + Library + Librería + + + + Folder + Carpeta + + + + Comic + Cómic + + + + Upgrade failed + La actualización falló + + + + There were errors during library upgrade in: + Hubo errores durante la actualización de la biblioteca en: + + + + Update needed + Se necesita actualizar + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Esta biblioteca fue creada con una versión anterior de YACReaderLibrary. Es necesario que se actualice. ¿Deseas hacerlo ahora? + + + + Download new version + Descargar la nueva versión + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Esta biblioteca fue creada con una versión más nueva de YACReaderLibrary. ¿Deseas descargar la nueva versión ahora? + + + + Library not available + Biblioteca no disponible + + + + Library '%1' is no longer available. Do you want to remove it? + La biblioteca '%1' no está disponible. ¿Deseas eliminarla? + + + + Old library + Biblioteca antigua + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La biblioteca '%1' ha sido creada con una versión más antigua de YACReaderLibrary y debe ser creada de nuevo. ¿Deseas crear la biblioteca ahora? + + + + + Copying comics... + Copiando cómics... + + + + + Moving comics... + Moviendo cómics... + + + + Add new folder + Añadir carpeta + + + + Folder name: + Nombre de la carpeta: + + + + No folder selected + No has selecionado ninguna carpeta + + + + Please, select a folder first + Por favor, selecciona una carpeta primero + + + + Error in path + Error en la ruta + + + + There was an error accessing the folder's path + Hubo un error al acceder a la ruta de la carpeta + + + + Delete folder + Borrar carpeta + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + ¿Estás seguro de que deseas eliminar la carpeta seleccionada y todo su contenido de tu disco? + + + + + Unable to delete + No se ha podido borrar + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Se produjo un problema al intentar eliminar las carpetas seleccionadas. Por favor, verifica los permisos de escritura y asegúrate de que no haya aplicaciones usando estas carpetas o alguno de los archivos contenidos en ellas. + + + + Add new reading lists + Añadir nuevas listas de lectura + + + + + List name: + Nombre de la lista: + + + + Delete list/label + Eliminar lista/etiqueta + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + El elemento seleccionado se eliminará, tus cómics o carpetas NO se eliminarán de tu disco. ¿Estás seguro? + + + + Rename list name + Renombrar lista + + + + Open folder... + Abrir carpeta... + + + + Update folder + Actualizar carpeta + + + + Rescan library for XML info + Volver a escanear la biblioteca en busca de información XML + + + + Set as uncompleted + Marcar como incompleto + + + + Set as completed + Marcar como completo + + + + Set as read + Marcar como leído + + + + + Set as unread + Marcar como no leído + + + + Set custom cover + Establecer portada personalizada + + + + Delete custom cover + Eliminar portada personalizada + + + + Save covers + Guardar portadas + + + + You are adding too many libraries. + Estás añadiendo demasiadas bibliotecas. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Estás añadiendo demasiadas bibliotecas. + +Probablemente solo necesites una biblioteca en la carpeta principal de tus cómics, puedes explorar cualquier subcarpeta utilizando la sección de carpetas en la barra lateral izquierda. + +YACReaderLibrary no te detendrá de crear más bibliotecas, pero deberías mantener el número de bibliotecas bajo control. + + + + + YACReader not found + YACReader no encontrado + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader no encontrado. YACReader debería estar instalado en la misma carpeta que YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader no encontrado. Podría haber un problema con tu instalación de YACReader. + + + + Error + Fallo + + + + Error opening comic with third party reader. + Error al abrir el cómic con una aplicación de terceros. + + + + Library not found + Biblioteca no encontrada + + + + The selected folder doesn't contain any library. + La carpeta seleccionada no contiene ninguna biblioteca. + + + + Are you sure? + ¿Estás seguro? + + + + Do you want remove + ¿Deseas eliminar la biblioteca + + + + library? + ? + + + + Remove and delete metadata + Eliminar y borrar metadatos + + + + Library info + Información de la biblioteca + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Ha habido algún problema intentando borrar los cómics selecionados. Por favor, verifica los permisos de escritura en los arhicovs seleccionados o los directorios que los conienen. + + + + Assign comics numbers + Asignar números a los cómics + + + + Assign numbers starting in: + Asignar números comenzando en: + + + + Invalid image + Imagen inválida + + + + The selected file is not a valid image. + El archivo seleccionado no es una imagen válida. + + + + Error saving cover + Error guardando portada + + + + There was an error saving the cover image. + Hubo un error guardando la image de portada. + + + + Error creating the library + Errar creando la biblioteca + + + + Error updating the library + Error actualizando la biblioteca + + + + Error opening the library + Error abriendo la biblioteca + + + + Delete comics + Borrar cómics + + + + All the selected comics will be deleted from your disk. Are you sure? + Todos los cómics seleccionados serán borrados de tu disco. ¿Estás seguro? + + + + Remove comics + Eliminar cómics + + + + Comics will only be deleted from the current label/list. Are you sure? + Los cómics sólo se eliminarán de la etiqueta/lista actual. ¿Estás seguro? + + + + Library name already exists + Ya existe el nombre de la biblioteca + + + + There is another library with the name '%1'. + Hay otra biblioteca con el nombre '%1'. + + + + LibraryWindowActions + + + Create a new library + Crear una nueva biblioteca + + + + Open an existing library + Abrir una biblioteca existente + + + + + Export comics info + Exportar información de los cómics + + + + + Import comics info + Importar información de cómics + + + + Pack covers + Empaquetar portadas + + + + Pack the covers of the selected library + Empaquetar las portadas de la biblioteca seleccionada + + + + Unpack covers + Desempaquetar portadas + + + + Unpack a catalog + Desempaquetar un catálogo + + + + Update library + Actualizar biblioteca + + + + Update current library + Actualizar la biblioteca seleccionada + + + + Rename library + Renombrar biblioteca + + + + Rename current library + Renombrar la biblioteca seleccionada + + + + Remove library + Eliminar biblioteca + + + + Remove current library from your collection + Eliminar biblioteca de la colección + + + + Rescan library for XML info + Volver a escanear la biblioteca en busca de información XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Intenta encontrar información XML incrustada en los archivos de cómic. Solo necesitas hacer esto si la biblioteca fue creada con la versión 9.8.2 o versiones anteriores o si estás utilizando software de terceros para incrustar información XML en los archivos. + + + + Show library info + Mostrar información de la biblioteca + + + + Show information about the current library + Mostrar información de la biblioteca actual + + + + Open current comic + Abrir cómic actual + + + + Open current comic on YACReader + Abrir el cómic actual en YACReader + + + + Save selected covers to... + Guardar las portadas seleccionadas en... + + + + Save covers of the selected comics as JPG files + Guardar las portadas de los cómics seleccionados como archivos JPG + + + + + Set as read + Marcar como leído + + + + Set comic as read + Marcar cómic como leído + + + + + Set as unread + Marcar como no leído + + + + Set comic as unread + Marcar cómic como no leído + + + + + manga + historieta manga + + + + Set issue as manga + Marcar número como manga + + + + + comic + Cómic + + + + Set issue as normal + Marcar número como cómic + + + + western manga + manga occidental + + + + Set issue as western manga + Marcar número como manga occidental + + + + + web comic + cómic web + + + + Set issue as web comic + Marcar número como cómic web + + + + + yonkoma + tira yonkoma + + + + Set issue as yonkoma + Marcar número como yonkoma + + + + Show/Hide marks + Mostrar/Ocultar marcas + + + + Show or hide read marks + Mostrar u ocultar marcas + + + + Show/Hide recent indicator + Mostrar/Ocultar el indicador reciente + + + + Show or hide recent indicator + Mostrar o ocultar el indicador reciente + + + + + Fullscreen mode on/off + Modo a pantalla completa on/off + + + + Help, About YACReader + Ayuda, Sobre YACReader + + + + Add new folder + Añadir carpeta + + + + Add new folder to the current library + Añadir carpeta a la biblioteca actual + + + + Delete folder + Borrar carpeta + + + + Delete current folder from disk + Borrar carpeta actual del disco + + + + Select root node + Seleccionar el nodo raíz + + + + Expand all nodes + Expandir todos los nodos + + + + Collapse all nodes + Contraer todos los nodos + + + + Show options dialog + Mostrar opciones + + + + Show comics server options dialog + Mostrar el diálogo de opciones del servidor de cómics + + + + + Change between comics views + Cambiar entre vistas de cómics + + + + Open folder... + Abrir carpeta... + + + + Set as uncompleted + Marcar como incompleto + + + + Set as completed + Marcar como completo + + + + Set custom cover + Establecer portada personalizada + + + + Delete custom cover + Eliminar portada personalizada + + + + western manga (left to right) + manga occidental (izquierda a derecha) + + + + Open containing folder... + Abrir carpeta contenedora... + + + + Reset comic rating + Reseteal cómic rating + + + + Select all comics + Seleccionar todos los cómics + + + + Edit + Editar + + + + Assign current order to comics + Asignar el orden actual a los cómics + + + + Update cover + Actualizar portada + + + + Delete selected comics + Borrar los cómics seleccionados + + + + Delete metadata from selected comics + Borrar metadatos de los cómics seleccionados + + + + Download tags from Comic Vine + Descargar etiquetas de Comic Vine + + + + Focus search line + Selecionar el campo de búsqueda + + + + Focus comics view + Selecionar la vista de cómics + + + + Edit shortcuts + Editar accesos directos + + + + &Quit + &Salir + + + + Update folder + Actualizar carpeta + + + + Update current folder + Actualizar carpeta actual + + + + Scan legacy XML metadata + Escaneal metadatos XML + + + + Add new reading list + Añadir lista de lectura + + + + Add a new reading list to the current library + Añadir una nueva lista de lectura a la biblioteca actual + + + + Remove reading list + Eliminar lista de lectura + + + + Remove current reading list from the library + Eliminar la lista de lectura actual de la biblioteca + + + + Add new label + Añadir etiqueta + + + + Add a new label to this library + Añadir etiqueta a esta biblioteca + + + + Rename selected list + Renombrar la lista seleccionada + + + + Rename any selected labels or lists + Renombrar las etiquetas o listas seleccionadas + + + + Add to... + Añadir a... + + + + Favorites + Favoritos + + + + Add selected comics to favorites list + Añadir cómics seleccionados a la lista de favoritos + + + + LocalComicListModel + + + file name + Nombre de archivo + + + + MainWindowViewer + + File + Archivo + + + Help + Ayuda + + + Save + Guardar + + + &File + &Archivo + + + &Next + Siguie&nte + + + &Open + &Abrir + + + Close + Cerrar + + + Open Comic + Abrir cómic + + + Go To + Ir a + + + Open image folder + Abrir carpeta de imágenes + + + Set bookmark + Añadir marcador + + + page_%1.jpg + página_%1.jpg + + + Switch to double page mode + Cambiar a modo de doble página + + + Save current page + Guardar la página actual + + + Double page mode + Modo a doble página + + + Switch Magnifying glass + Lupa On/Off + + + Open Folder + Abrir carpeta + + + Fit Height + Ajustar altura + + + Comic files + Archivos de cómic + + + Not now + Ahora no + + + Go to previous page + Ir a la página anterior + + + Open a comic + Abrir cómic + + + Image files (*.jpg) + Archivos de imagen (*.jpg) + + + Next Comic + Siguiente Cómic + + + Fit Width + Ajustar anchura + + + Options + Opciones + + + Show Info + Mostrar información + + + Open folder + Abrir carpeta + + + Go to page ... + Ir a página... + + + Fit image to width + Ajustar página a lo ancho + + + &Previous + A&nterior + + + Go to next page + Ir a la página siguiente + + + Show keyboard shortcuts + Mostrar atajos de teclado + + + There is a new version available + Hay una nueva versión disponible + + + Open next comic + Abrir siguiente cómic + + + Remind me in 14 days + Recordar en 14 días + + + Show bookmarks + Mostrar marcadores + + + Open previous comic + Abrir cómic anterior + + + Rotate image to the left + Rotar imagen a la izquierda + + + Fit image to height + Ajustar página a lo alto + + + Show the bookmarks of the current comic + Mostrar los marcadores del cómic actual + + + Show Dictionary + Mostrar diccionario + + + YACReader options + Opciones de YACReader + + + Help, About YACReader + Ayuda, Sobre YACReader + + + Show go to flow + Mostrar "Ir a Comic Flow" + + + Previous Comic + Cómic anterior + + + Show full size + Mostrar a tamaño original + + + Magnifying glass + Lupa + + + General + Opciones generales + + + Set a bookmark on the current page + Añadir un marcador en la página actual + + + Do you want to download the new version? + ¿Desea descargar la nueva versión? + + + Rotate image to the right + Rotar imagen a la derecha + + + Always on top + Siempre visible + + + + NoLibrariesWidget + + + You don't have any libraries yet + Aún no tienes ninguna biblioteca + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Puedes crear una biblioteca en cualquier carpeta, YACReaderLibrary importará todos las carpetas y cómics de esa carpeta. Si has creado alguna biblioteca anteriormente, puedes abrirla sin volver a crearla.</p><p>No olvides que puedes usar YACReader como una aplicación independiente para leer los cómics en tu ordenador.</p> + + + + create your first library + crea tu primera biblioteca + + + + add an existing one + añade una existente + + + + NoSearchResultsWidget + + + No results + Sin resultados + + + + OptionsDialog + + + Gamma + Gama + + + + Reset + Restablecer + + + + My comics path + Ruta a mis cómics + + + + Scaling + Escalado + + + + Scaling method + Método de escalado + + + + Nearest (fast, low quality) + Vecino más cercano (rápido, baja calidad) + + + + Bilinear + Bilineal + + + + Lanczos (better quality) + Lanczos (mejor calidad) + + + + Image adjustment + Ajustes de imagen + + + + "Go to flow" size + Tamaño de "Ir a Comic Flow" + + + + Choose + Elegir + + + + Image options + Opciones de imagen + + + + Contrast + Contraste + + + + + Libraries + Bibliotecas + + + + Comic Flow + Comic Flow + + + + Grid view + Vista en cuadrícula + + + + + Appearance + Apariencia + + + + + Options + Opciones + + + + + Language + Idioma + + + + + Application language + Idioma de la aplicación + + + + + System default + Predeterminado del sistema + + + + Tray icon settings (experimental) + Opciones de bandeja de sistema (experimental) + + + + Close to tray + Cerrar a la bandeja + + + + Start into the system tray + Comenzar en la bandeja de sistema + + + + Edit Comic Vine API key + Editar la clave API de Comic Vine + + + + Comic Vine API key + Clave API de Comic Vine + + + + ComicInfo.xml legacy support + Soporte para ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importar metadatos desde ComicInfo.xml al añadir nuevos cómics + + + + Consider 'recent' items added or updated since X days ago + Considerar elementos 'recientes' añadidos o actualizados desde hace X días + + + + Third party reader + Lector externo + + + + Write {comic_file_path} where the path should go in the command + Escribe {comic_file_path} donde la ruta al cómic debería ir en el comando + + + + + Clear + Limpiar + + + + Update libraries at startup + Actualizar bibliotecas al inicio + + + + Try to detect changes automatically + Intentar detectar cambios automáticamente + + + + Update libraries periodically + Actualizar bibliotecas periódicamente + + + + Interval: + Intervalo: + + + + 30 minutes + 30 minutos + + + + 1 hour + 1 hora + + + + 2 hours + 2 horas + + + + 4 hours + 4 horas + + + + 8 hours + 8 horas + + + + 12 hours + 12 horas + + + + daily + dirariamente + + + + Update libraries at certain time + Actualizar bibliotecas en un momento determinado + + + + Time: + Hora: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + ¡ADVERTENCIA! Durante las actualizaciones de la biblioteca se desactivan las escrituras en la base de datos. +No programes actualizaciones mientras puedas estar usando la aplicación activamente. +Durante las actualizaciones automáticas, la aplicación bloqueará algunas de las acciones hasta que la actualización esté terminada. +Para detener una actualización automática, toca en el indicador de carga junto al título de Bibliotecas. + + + + Modifications detection + Detección de modificaciones + + + + Compare the modified date of files when updating a library (not recommended) + Comparar la fecha de modificación de los archivos al actualizar una biblioteca (no recomendado) + + + + Enable background image + Activar imagen de fondo + + + + Opacity level + Nivel de opacidad + + + + Blur level + Nivel de desenfoque + + + + Use selected comic cover as background + Usar la portada del cómic seleccionado como fondo + + + + Restore defautls + Restaurar valores predeterminados + + + + Background + Fondo + + + + Display continue reading banner + Mostrar banner de "Continuar leyendo" + + + + Display current comic banner + Mostar el báner del cómic actual + + + + Continue reading + Continuar leyendo + + + + Comics directory + Directorio de cómics + + + + Background color + Color de fondo + + + + Page Flow + Flujo de página + + + + + General + Opciones generales + + + + Brightness + Brillo + + + + + Restart is needed + Es necesario reiniciar + + + + Quick Navigation Mode + Modo de navegación rápida + + + + Display + Visualización + + + + Show time in current page information label + Mostrar la hora en la etiqueta de información de la página actual + + + + Scroll behaviour + Comportamiento del scroll + + + + Disable scroll animations and smooth scrolling + Desactivar animaciones de desplazamiento y desplazamiento suave + + + + Do not turn page using scroll + No cambiar de página usando el scroll + + + + Use single scroll step to turn page + Usar un solo paso de desplazamiento para cambiar de página + + + + Mouse mode + Modo del ratón + + + + Only Back/Forward buttons can turn pages + Solo los botones Atrás/Adelante pueden cambiar de página + + + + Use the Left/Right buttons to turn pages. + Usar los botones Izquierda/Derecha para cambiar de página. + + + + Click left or right half of the screen to turn pages. + Hacer clic en la mitad izquierda o derecha de la pantalla para cambiar de página. + + + + Disable mouse over activation + Desactivar activación al pasar el ratón + + + + Fit options + Opciones de ajuste + + + + Enlarge images to fit width/height + Ampliar imágenes para ajustarse al ancho/alto + + + + Double Page options + Opciones de doble página + + + + Show covers as single page + Mostrar portadas como página única + + + + PropertiesDialog + + + General info + Información general + + + + Plot + Argumento + + + + Authors + Autores + + + + Publishing + Publicación + + + + Notes + Notas + + + + Cover page + Página de portada + + + + Load previous page as cover + Cargar página anterior como portada + + + + Load next page as cover + Cargar página siguiente como portada + + + + Reset cover to the default image + Restaurar la portada por defecto + + + + Load custom cover image + Cargar portada personalizada + + + + Series: + Serie: + + + + Title: + Título: + + + + + + of: + de: + + + + Issue number: + Número: + + + + Volume: + Volumen: + + + + Arc number: + Número de arco: + + + + Story arc: + Arco argumental: + + + + alt. number: + número alternativo: + + + + Alternate series: + Serie alternativa: + + + + Series Group: + Grupo de series: + + + + Genre: + Género: + + + + Size: + Tamaño: + + + + Writer(s): + Guionista(s): + + + + Penciller(s): + Dibujant(es): + + + + Inker(s): + Entintador(es): + + + + Colorist(s): + Color: + + + + Letterer(s): + Rotulista(s): + + + + Cover Artist(s): + Artista(s) portada: + + + + Editor(s): + Editor(es): + + + + Imprint: + Sello: + + + + Day: + Día: + + + + Month: + Mes: + + + + Year: + Año: + + + + Publisher: + Editorial: + + + + Format: + Formato: + + + + Color/BW: + Color/BN: + + + + Age rating: + Casificación edades: + + + + Type: + Tipo: + + + + Language (ISO): + Idioma (ISO): + + + + Synopsis: + Sinopsis: + + + + Characters: + Personajes: + + + + Teams: + Equipos: + + + + Locations: + Lugares: + + + + Main character or team: + Personaje o equipo principal: + + + + Review: + Reseña: + + + + Notes: + Notas: + + + + Tags: + Etiquetas: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ver </a> + + + + Not found + No encontrado + + + + Comic not found. You should update your library. + Cómic no encontrado. Deberias actualizar tu biblioteca. + + + + Edit comic information + Editar la información del cócmic + + + + Edit selected comics information + Editar la información de los cómics seleccionados + + + + Invalid cover + Portada inválida + + + + The image is invalid. + La imagen no es válida. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer es la versión sin interfaz gráfica (headless) de YACReaderLibrary. + +Esta aplicación admite ajustes persistentes; para configurarlos, edita este archivo %1 +Para conocer los ajustes disponibles, consulta la documentación en https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + 7z lib not found + 7z lib no encontrado + + + + unable to load 7z lib from ./utils + imposible cargar 7z lib de ./utils + + + + Trace + Traza + + + + Debug + Depuración + + + + Info + Información + + + + Warning + Advertencia + + + + Error + Fallo + + + + Fatal + Cr?tico + + + + Select custom cover + Seleccionar portada personalizada + + + + Images (%1) + Imágenes (%1) + + + + The file could not be read or is not valid JSON. + No se pudo leer el archivo o no es un JSON válido. + + + + This theme is for %1, not %2. + Este tema es para %1, no para %2. + + + + Libraries + Bibliotecas + + + + Folders + CARPETAS + + + + Reading Lists + Listas de lectura + + + + RenameLibraryDialog + + + New Library Name : + Nuevo nombre de la biblioteca : + + + + Rename + Renombrar + + + + Cancel + Cancelar + + + + Rename current library + Renombrar la biblioteca seleccionada + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Número de volúmenes encontrados : %1 + + + + + page %1 of %2 + página %1 de %2 + + + + Number of %1 found : %2 + Número de %1 encontrados : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Por favor, proporciona alguna información adicional para éste cómic. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Usar búsqueda exacta. Desactívala si quieres encontrar volúmenes que coincidan con algunas palabras del nombre. + + + + SearchVolume + + + Please provide some additional information. + Por favor, proporciona alguna informacion adicional. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Usar búsqueda exacta. Desactívala si quieres encontrar volúmenes que coincidan con algunas palabras del nombre. + + + + SelectComic + + + Please, select the right comic info. + Por favor, selecciona la información correcta. + + + + comics + Cómics + + + + loading cover + cargando portada + + + + loading description + cargando descripción + + + + comic description unavailable + Descripción del cómic no disponible + + + + SelectVolume + + + Please, select the right series for your comic. + Por favor, seleciona la serie correcta para tu cómic. + + + + Filter: + Filtro: + + + + volumes + volúmenes + + + + Nothing found, clear the filter if any. + No se encontró nada, limpia el filtro si lo hubiera. + + + + loading cover + cargando portada + + + + loading description + cargando descripción + + + + volume description unavailable + Descripción del volumen no disponible + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Estás intentando obtener información de varios cómics a la vez, ¿son parte de la misma serie? + + + + yes + + + + + no + No + + + + ServerConfigDialog + + + set port + fijar puerto + + + + Server connectivity information + Infomación de conexión del servidor + + + + Scan it! + ¡Escaneálo! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader está disponible para iOS y Android.<br/> Descúbrela para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a>o <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Elige una dirección IP + + + + Port + Puerto + + + + enable the server + activar el servidor + + + + ShortcutsDialog + + Close + Cerrar + + + YACReader keyboard shortcuts + Atajos de teclado de YACReader + + + Keyboard Shortcuts + Atajos de teclado + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Por favor, ordena la lista de cómics en la izquiera hasta que coincida con la información adecuada. + + + + sort comics to match comic information + ordena los cómics para coincidir con la información + + + + issues + números + + + + remove selected comics + eliminar cómics seleccionados + + + + restore all removed comics + restaurar todos los cómics eliminados + + + + ThemeEditorDialog + + + Theme Editor + Editor de temas + + + + + + + + + + + - + - + + + + i + ? + + + + Expand all + Expandir todo + + + + Collapse all + Contraer todo + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Mantén pulsado para resaltar temporalmente el valor seleccionado en la interfaz (magenta / alternado / 0↔10). Al soltar se restaura el original. + + + + Search… + Buscar… + + + + Light + Luz + + + + Dark + Oscuro + + + + ID: + IDENTIFICACIÓN: + + + + Display name: + Nombre para mostrar: - - "Go to flow" size - Tamaño de "Go to flow" + + Variant: + Variante: - - Choose - Elegir + + Theme info + Información del tema - - Image options - Opciones de imagen + + Parameter + Parámetro - - Contrast - Contraste + + Value + Valor - - Options - Opciones + + Save and apply + Guardar y aplicar - - Comics directory - Directorio de cómics + + Export to file... + Exportar a archivo... - - Background color - Color de fondo + + Load from file... + Cargar desde archivo... - - Page Flow - Page Flow + + Close + Cerrar - - General - General + + Double-click to edit color + Doble clic para editar el color - - Brightness - Brillo + + + + + + + true + verdadero - - Restart is needed - Es necesario reiniciar + + + + + false + falso - - Quick Navigation Mode - Modo de navegación rápida + + Double-click to toggle + Doble clic para alternar - - Display - Visualización + + Double-click to edit value + Doble clic para editar el valor - - Show time in current page information label - Mostrar la hora en la etiqueta de información de la página actual + + + + Edit: %1 + Editar: %1 - - Scroll behaviour - Comportamiento del scroll + + Save theme + Guardar tema - - Disable scroll animations and smooth scrolling - Desactivar animaciones de desplazamiento y desplazamiento suave + + + JSON files (*.json);;All files (*) + Archivos JSON (*.json);;Todos los archivos (*) - - Do not turn page using scroll - No cambiar de página usando el scroll + + Save failed + Error al guardar - - Use single scroll step to turn page - Usar un solo paso de desplazamiento para cambiar de página + + Could not open file for writing: +%1 + No se pudo abrir el archivo para escribir: +%1 - - Mouse mode - Modo del ratón + + Load theme + Cargar tema - - Only Back/Forward buttons can turn pages - Solo los botones Atrás/Adelante pueden cambiar de página + + + + Load failed + Error al cargar - - Use the Left/Right buttons to turn pages. - Usar los botones Izquierda/Derecha para cambiar de página. + + Could not open file: +%1 + No se pudo abrir el archivo: +%1 - - Click left or right half of the screen to turn pages. - Hacer clic en la mitad izquierda o derecha de la pantalla para cambiar de página. + + Invalid JSON: +%1 + JSON no válido: +%1 - - Disable mouse over activation - Desactivar activación al pasar el ratón + + Expected a JSON object. + Se esperaba un objeto JSON. + + + TitleHeader - - Fit options - Opciones de ajuste + + SEARCH + buscar + + + UpdateLibraryDialog - - Enlarge images to fit width/height - Ampliar imágenes para ajustarse al ancho/alto + + Updating.... + Actualizado... - - Double Page options - Opciones de doble página + + Cancel + Cancelar - - Show covers as single page - Mostrar portadas como página única + + Update library + Actualizar biblioteca - QObject + Viewer - - 7z lib not found - 7z lib no encontrado + + Page not available! + ¡Página no disponible! - - unable to load 7z lib from ./utils - imposible cargar 7z lib de ./utils + + + Press 'O' to open comic. + Pulsa 'O' para abrir un fichero. - - Trace - + + Error opening comic + Error abriendo cómic - - Debug - + + Cover! + ¡Portada! - - Info - + + CRC Error + Error CRC - - Warning - + + Comic not found + Cómic no encontrado - - Error - + + Not found + No encontrado - - Fatal - + + Last page! + ¡Última página! - - Select custom cover - + + Loading...please wait! + Cargando...espere, por favor! + + + VolumeComicsModel - - Images (%1) - + + title + Título - QsLogging::LogWindowModel + VolumesModel - - Time - + + year + año - - Level - + + issues + números - - Message - + + publisher + Editorial - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - + + Presets: + Predefinidos: - - &Resume - + + Classic look + Tipo clásico - - Save log - + + Stripe look + Tipo tira - - Log file (*.log) - + + Overlapped Stripe look + Tipo tira solapada - - - ShortcutsDialog - Close - Cerrar + + Modern look + Tipo moderno - YACReader keyboard shortcuts - Atajos de teclado de YACReader + + Roulette look + Tipo ruleta - Keyboard Shortcuts - Atajos de teclado + + Show advanced settings + Opciones avanzadas - - - Viewer - - Page not available! - ¡Página no disponible! + + Custom: + Personalizado: - - - Press 'O' to open comic. - Pulsa 'O' para abrir un fichero. + + View angle + Ángulo de vista - - Error opening comic - Error abriendo cómic + + Position + Posición - - Cover! - ¡Portada! + + Cover gap + Hueco entre portadas - - CRC Error - Error CRC + + Central gap + Hueco central - - Comic not found - Cómic no encontrado + + Zoom + Ampliaci?n - - Not found - No encontrado + + Y offset + Desplazamiento en Y - - Last page! - ¡Última página! + + Z offset + Desplazamiento en Z - - Loading...please wait! - Cargando...espere, por favor! + + Cover Angle + Ángulo de las portadas + + + + Visibility + Visibilidad + + + + Light + Luz + + + + Max angle + Ángulo máximo + + + + Low Performance + Rendimiento bajo + + + + High Performance + Alto rendimiento + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Utilizar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + + + + Performance: + Rendimiento: YACReader::MainWindowViewer - + &Open &Abrir - + Open a comic Abrir cómic - + New instance Nueva instancia - + Open Folder Abrir carpeta - + Open image folder Abrir carpeta de imágenes - + Open latest comic Abrir el cómic más reciente - + Open the latest comic opened in the previous reading session Abrir el cómic más reciente abierto en la sesión de lectura anterior - + Clear Limpiar - + Clear open recent list Limpiar lista de abiertos recientemente - + Save Guardar - + Save current page Guardar la página actual @@ -772,285 +3380,296 @@ Cómic anterior - - - + + + Open previous comic Abrir cómic anterior - + Next Comic Siguiente Cómic - - - + + + Open next comic Abrir siguiente cómic - + &Previous A&nterior - - - + + + Go to previous page Ir a la página anterior - + &Next Siguie&nte - - - + + + Go to next page Ir a la página siguiente - + Fit Height Ajustar altura - + Fit image to height Ajustar página a lo alto - + Fit Width Ajustar anchura - + Fit image to width Ajustar página a lo ancho - + Show full size Mostrar a tamaño original - + Fit to page Ajustar a página - + + Continuous scroll + Desplazamiento continuo + + + + Switch to continuous scroll mode + Cambiar al modo de desplazamiento continuo + + + Reset zoom Restablecer zoom - + Show zoom slider Mostrar control deslizante de zoom - + Zoom+ - Zoom+ + Ampliar+ - + Zoom- - Zoom- + Reducir - + Rotate image to the left Rotar imagen a la izquierda - + Rotate image to the right Rotar imagen a la derecha - + Double page mode Modo a doble página - + Switch to double page mode Cambiar a modo de doble página - + Double page manga mode Modo de manga de página doble - + Reverse reading order in double page mode Invertir el orden de lectura en modo de página doble - + Go To Ir a - + Go to page ... Ir a página... - + Options Opciones - + YACReader options Opciones de YACReader - - + + Help Ayuda - + Help, About YACReader Ayuda, Sobre YACReader - + Magnifying glass Lupa - + Switch Magnifying glass Lupa On/Off - + Set bookmark Añadir marcador - + Set a bookmark on the current page Añadir un marcador en la página actual - + Show bookmarks Mostrar marcadores - + Show the bookmarks of the current comic Mostrar los marcadores del cómic actual - + Show keyboard shortcuts Mostrar atajos de teclado - + Show Info Mostrar información - + Close Cerrar - + Show Dictionary Mostrar diccionario - + Show go to flow - Mostrar flow ir a + Mostrar "Ir a Comic Flow" - + Edit shortcuts Editar accesos directos - + &File &Archivo - - + + Open recent Abrir reciente - + File Archivo - + Edit Editar - + View Ver - + Go Ir - + Window Ventana - - - + + + Open Comic Abrir cómic - - - + + + Comic files Archivos de cómic - + Open folder Abrir carpeta - + page_%1.jpg página_%1.jpg - + Image files (*.jpg) Archivos de imagen (*.jpg) + Comics Cómics @@ -1066,9 +3685,10 @@ Ocultar/mostrar barra de herramientas + General - General + Opciones generales @@ -1096,6 +3716,7 @@ Resetear lupa + Magnifiying glass Lupa @@ -1106,112 +3727,131 @@ Alternar entre ajuste al ancho y ajuste al alto + Page adjustement Ajuste de página - + Autoscroll down Desplazamiento automático hacia abajo - + Autoscroll up Desplazamiento automático hacia arriba - + Autoscroll forward, horizontal first Desplazamiento automático hacia adelante, primero horizontal - + Autoscroll backward, horizontal first Desplazamiento automático hacia atrás, primero horizontal - + Autoscroll forward, vertical first Desplazamiento automático hacia adelante, primero vertical - + Autoscroll backward, vertical first Desplazamiento automático hacia atrás, primero vertical - + Move down Mover abajo - + Move up Mover arriba - + Move left Mover a la izquierda - + Move right Mover a la derecha - + Go to the first page Ir a la primera página - + Go to the last page Ir a la última página - + Offset double page to the left Mover una página a la izquierda - + Offset double page to the right Mover una página a la derecha - + + Reading Leyendo - + There is a new version available Hay una nueva versión disponible - + Do you want to download the new version? ¿Desea descargar la nueva versión? - + Remind me in 14 days Recordar en 14 días - + Not now Ahora no + + YACReader::TrayIconController + + + &Restore + &Restaurar + + + + Systray + Bandeja del sistema + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary se continuará ejecutando en la bandeja del sistema. Para cerrar el programa elige <b>Cerrar</b> en el menú contextual del icono de la aplicación en la bandeja del sistema. + + YACReader::WhatsNewDialog - Close - Cerrar + Cerrar @@ -1225,7 +3865,7 @@ Click to overwrite - Click para sobreescribir + Clic para sobrescribir @@ -1241,206 +3881,186 @@ Click to overwrite - Click para sobreescribir + Clic para sobrescribir YACReaderFlowConfigWidget - CoverFlow look - Tipo CoverFlow + Tipo CoverFlow - How to show covers: - Cómo mostrar las portadas: + Cómo mostrar las portadas: - Stripe look - Tipo tira + Tipo tira - Overlapped Stripe look - Tipo tira solapada + Tipo tira solapada YACReaderGLFlowConfigWidget - Zoom - Zoom + Ampliaci?n - Light - Luz + Luz - Show advanced settings - Opciones avanzadas + Opciones avanzadas - Roulette look - Tipo ruleta + Tipo ruleta - Cover Angle - Ángulo de las portadas + Ángulo de las portadas - Stripe look - Tipo tira + Tipo tira - Position - Posición + Posición - Z offset - Desplazamiento en Z + Desplazamiento en Z - Y offset - Desplazamiento en Y + Desplazamiento en Y - Central gap - Hueco central + Hueco central - Presets: - Predefinidos: + Predefinidos: - Overlapped Stripe look - Tipo tira solapada + Tipo tira solapada - Modern look - Tipo moderno + Tipo moderno - View angle - Ángulo de vista + Ángulo de vista - Max angle - Ángulo máximo + Ángulo máximo - Custom: - Personalizado: + Personalizado: - Classic look - Tipo clásico + Tipo clásico - Cover gap - Hueco entre portadas + Hueco entre portadas - High Performance - Alto rendimiento + Alto rendimiento - Performance: - Rendimiento: + Rendimiento: - Use VSync (improve the image quality in fullscreen mode, worse performance) - Utilizar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + Utilizar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) - Visibility - Visibilidad + Visibilidad - Low Performance - Rendimiento bajo + Rendimiento bajo YACReaderOptionsDialog - + Save Guardar - Use hardware acceleration (restart needed) - Utilizar aceleración por hardware (necesario reiniciar) + Utilizar aceleración por hardware (necesario reiniciar) - + Cancel Cancelar - + Edit shortcuts Editar accesos directos - + Shortcuts Accesos directos + + YACReaderSearchLineEdit + + + type to search + escribe para buscar + + YACReaderSlider Reset - Reset + Restablecer YACReaderTranslator - + clear limpiar - + Service not available Servicio no disponible - - + + Translation Traducción - + YACReader translator Traductor YACReader diff --git a/YACReader/yacreader_files.qrc b/YACReader/yacreader_files.qrc deleted file mode 100644 index b75403122..000000000 --- a/YACReader/yacreader_files.qrc +++ /dev/null @@ -1,12 +0,0 @@ - - - ../files/about.html - ../files/helpYACReader.html - ../files/shortcuts.html - - - - ../files/about_es_ES.html - ../files/helpYACReader_es_ES.html - - diff --git a/YACReader/yacreader_fr.ts b/YACReader/yacreader_fr.ts index 967308c28..45f7bdf05 100644 --- a/YACReader/yacreader_fr.ts +++ b/YACReader/yacreader_fr.ts @@ -9,6 +9,196 @@ Rien + + AddLabelDialog + + + Label name: + Nom de l'étiquette : + + + + Choose a color: + Choisissez une couleur: + + + + accept + accepter + + + + cancel + Annuler + + + + AddLibraryDialog + + + Comics folder : + Dossier des bandes dessinées : + + + + Library name : + Nom de la librairie : + + + + Add + Ajouter + + + + Cancel + Annuler + + + + Add an existing library + Ajouter une librairie existante + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Avant de pouvoir vous connecter à Comic Vine, vous avez besoin de votre propre clé API. Veuillez en obtenir une gratuitement ici: <a href="http://www.comicvine.com/api/"></a> + + + + Paste here your Comic Vine API key + Collez ici votre clé API Comic Vine + + + + Accept + Accepter + + + + Cancel + Annuler + + + + AppearanceTabWidget + + + Color scheme + Jeu de couleurs + + + + System + Système + + + + Light + Lumière + + + + Dark + Sombre + + + + Custom + Coutume + + + + Remove + Retirer + + + + Remove this user-imported theme + Supprimer ce thème importé par l'utilisateur + + + + Light: + Lumière: + + + + Dark: + Sombre: + + + + Custom: + Personnalisation: + + + + Import theme... + Importer le thème... + + + + Theme + Thème + + + + Theme editor + Éditeur de thème + + + + Open Theme Editor... + Ouvrir l'éditeur de thème... + + + + Theme editor error + Erreur de l'éditeur de thème + + + + The current theme JSON could not be loaded. + Le thème actuel JSON n'a pas pu être chargé. + + + + Import theme + Importer un thème + + + + JSON files (*.json);;All files (*) + Fichiers JSON (*.json);;Tous les fichiers (*) + + + + Could not import theme from: +%1 + Impossible d'importer le thème depuis : +%1 + + + + Could not import theme from: +%1 + +%2 + Impossible d'importer le thème depuis : +%1 + +%2 + + + + Import failed + Échec de l'importation + + BookmarksDialog @@ -33,12 +223,206 @@ Aller à la dernière page + + ClassicComicsView + + + Hide comic flow + Masquer Comic Flow + + + + ComicModel + + + yes + oui + + + + no + non + + + + Title + Titre + + + + File Name + Nom du fichier + + + + Pages + Feuilles + + + + Size + Taille + + + + Read + Lu + + + + Current Page + Page en cours + + + + Publication Date + Date de publication + + + + Rating + Note + + + + Series + Série + + + + Volume + Tome + + + + Story Arc + Arc d'histoire + + + + ComicVineDialog + + + skip + passer + + + + back + retour + + + + next + suivant + + + + search + chercher + + + + close + fermer + + + + + comic %1 of %2 - %3 + bande dessinée %1 sur %2 - %3 + + + + + + Looking for volume... + Vous cherchez du volume... + + + + %1 comics selected + %1 bande(s) dessinnée(s) sélectionnée(s) + + + + Error connecting to ComicVine + Erreur de connexion à Comic Vine + + + + + Retrieving tags for : %1 + Retrouver les infomartions de: %1 + + + + Retrieving volume info... + Récupération des informations sur le volume... + + + + Looking for comic... + Vous cherchez une bande dessinée ... + + + + ContinuousPageWidget + + + Loading page %1 + Chargement de la page %1 + + + + CreateLibraryDialog + + + Comics folder : + Dossier des bandes dessinées : + + + + Library Name : + Nom de la librairie : + + + + Create + Créer + + + + Cancel + Annuler + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et continuer plus tard. + + + + Create new library + Créer une nouvelle librairie + + + + Path not found + Chemin introuvable + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Le chemin sélectionné n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + + EditShortcutsDialog - + Shortcut in use - Raccourci en cours d'utilisation + Raccourci en cours d'utilisation @@ -51,9 +435,9 @@ Paramètres de raccourcis - - The shortcut "%1" is already assigned to other function - Le raccourci "%1" est déjà affecté à une autre fonction + + The shortcut "%1" is already assigned to other function + Le raccourci "%1" est déjà affecté à une autre fonction @@ -61,6 +445,124 @@ Pour modifier un raccourci, double-cliquez sur la combinaison de touches et tapez les nouvelles clés. + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Ce dossier ne contient pas encore de bandes dessinées + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Ce dossier ne contient pas encore de bandes dessinées + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Cette liste de lecture ne contient aucune bande dessinée + + + + EmptySpecialListWidget + + + No favorites + Pas de favoris + + + + You are not reading anything yet, come on!! + Vous ne lisez rien encore, allez !! + + + + There are no recent comics! + Il n'y a pas de BD récente ! + + + + ExportComicsInfoDialog + + + Output file : + Fichier de sortie : + + + + Create + Créer + + + + Cancel + Annuler + + + + Export comics info + Exporter les infos des bandes dessinées + + + + Destination database name + Nom de la base de données de destination + + + + Problem found while writing + Problème durant l'écriture + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + + + + ExportLibraryDialog + + + Output folder : + Dossier de sortie : + + + + Create + Créer + + + + Cancel + Annuler + + + + Create covers package + Créer un pack de couvertures + + + + Problem found while writing + Problème durant l'écriture + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + + + + Destination directory + Répertoire de destination + + FileComic @@ -76,12 +578,12 @@ Unknown error opening the file - Erreur inconnue lors de l'ouverture du fichier + Erreur inconnue lors de l'ouverture du fichier CRC error on page (%1): some of the pages will not be displayed correctly - Erreur CRC sur la page (%1): certaines pages ne s'afficheront pas correctement + Erreur CRC sur la page (%1): certaines pages ne s'afficheront pas correctement @@ -92,1282 +594,3420 @@ Aller à - - Go to... - Aller à... + + Go to... + Aller à... + + + + + Total pages : + Nombre de pages : + + + + Cancel + Annuler + + + + Page : + Feuille : + + + + GoToFlowToolBar + + + Page : + Feuille : + + + + GridComicsView + + + Show info + Afficher les informations + + + + HelpAboutDialog + + + Help + Aide + + + + System info + Informations système + + + + About + A propos + + + + ImportComicsInfoDialog + + + Import comics info + Importer les infos des bandes dessinées + + + + Info database location : + Emplacement des infos: + + + + Import + Importer + + + + Cancel + Annuler + + + + Comics info file (*.ydb) + Fichier infos BD (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nom de la librairie : + + + + Package location : + Emplacement : + + + + Destination folder : + Dossier de destination : + + + + Unpack + Désarchiver + + + + Cancel + Annuler + + + + Extract a catalog + Extraire un catalogue + + + + Compresed library covers (*.clc) + Couvertures de bibliothèque compressées (*.clc) + + + + ImportWidget + + + stop + Arrêter + + + + Some of the comics being added... + Ajout de bande dessinée... + + + + Importing comics + Importation de bande dessinée + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary est en train de créer une nouvelle librairie.</p><p>La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et poursuivre plus tard.</p> + + + + Updating the library + Mise à jour de la librairie + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Mise à jour de la librairie. Pour plus de rapidité lors de la mise à jour, veuillez effectuer cette dernière régulièrement.</p><p>Vous pouvez arrêter le processus et poursuivre plus tard.</p> + + + + Upgrading the library + Mise à niveau de la bibliothèque + + + + <p>The current library is being upgraded, please wait.</p> + <p>La bibliothèque actuelle est en cours de mise à niveau, veuillez patienter.</p> + + + + Scanning the library + Scanner la bibliothèque + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>La bibliothèque actuelle est en cours d'analyse pour rechercher des informations sur les métadonnées XML héritées.</p><p>Ceci n'est nécessaire qu'une seule fois, et uniquement si la bibliothèque a été créée avec YACReaderLibrary 9.8.2 ou une version antérieure.</p> + + + + LibraryWindow + + + YACReader Library + Librairie de YACReader + + + + + + comic + comique + + + + + + manga + mangas + + + + + + western manga (left to right) + manga occidental (de gauche à droite) + + + + + + web comic + bande dessinée Web + + + + + + 4koma (top to botom) + 4koma (de haut en bas) + + + + + + + Set type + Définir le type + + + + Library + Librairie + + + + Folder + Dossier + + + + Comic + Bande dessinée + + + + Upgrade failed + La mise à niveau a échoué + + + + There were errors during library upgrade in: + Des erreurs se sont produites lors de la mise à niveau de la bibliothèque dans : + + + + Update needed + Mise à jour requise + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Cette librairie a été créée avec une ancienne version de YACReaderLibrary. Mise à jour necessaire. Mettre à jour? + + + + Download new version + Téléchrger la nouvelle version + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Cette librairie a été créée avec une version plus récente de YACReaderLibrary. Télécharger la nouvelle version? + + + + Library not available + Librairie non disponible + + + + Library '%1' is no longer available. Do you want to remove it? + La librarie '%1' n'est plus disponible. Voulez-vous la supprimer? + + + + Old library + Ancienne librairie + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La librarie '%1' a été créée avec une ancienne version de YACReaderLibrary. Elle doit être re-créée. Voulez-vous créer la librairie? + + + + + Copying comics... + Copier la bande dessinée... + + + + + Moving comics... + Déplacer la bande dessinée... + + + + Add new folder + Ajouter un nouveau dossier + + + + Folder name: + Nom du dossier : + + + + No folder selected + Aucun dossier sélectionné + + + + Please, select a folder first + Veuillez d'abord sélectionner un dossier + + + + Error in path + Erreur dans le chemin + + + + There was an error accessing the folder's path + Une erreur s'est produite lors de l'accès au chemin du dossier + + + + Delete folder + Supprimer le dossier + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Le dossier sélectionné et tout son contenu seront supprimés de votre disque. Es-tu sûr? + + + + + Unable to delete + Impossible de supprimer + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Un problème est survenu lors de la tentative de suppression des dossiers sélectionnés. Veuillez vérifier les autorisations d'écriture et assurez-vous que toutes les applications utilisent ces dossiers ou l'un des fichiers contenus. + + + + Add new reading lists + Ajouter de nouvelles listes de lecture + + + + + List name: + Nom de la liste : + + + + Delete list/label + Supprimer la liste/l'étiquette + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + L'élément sélectionné sera supprimé, vos bandes dessinées ou dossiers ne seront pas supprimés de votre disque. Êtes-vous sûr? + + + + Rename list name + Renommer le nom de la liste + + + + Open folder... + Ouvrir le dossier... + + + + Update folder + Mettre à jour le dossier + + + + Rescan library for XML info + Réanalyser la bibliothèque pour les informations XML + + + + Set as uncompleted + Marquer comme incomplet + + + + Set as completed + Marquer comme complet + + + + Set as read + Marquer comme lu + + + + + Set as unread + Marquer comme non-lu + + + + Set custom cover + Définir une couverture personnalisée + + + + Delete custom cover + Supprimer la couverture personnalisée + + + + Save covers + Enregistrer les couvertures + + + + You are adding too many libraries. + Vous ajoutez trop de bibliothèques. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Vous ajoutez trop de bibliothèques. + +Vous n'avez probablement besoin que d'une bibliothèque dans votre dossier BD de niveau supérieur, vous pouvez parcourir les sous-dossiers en utilisant la section des dossiers dans la barre latérale gauche. + +YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais vous devriez garder le nombre de bibliothèques bas. + + + + + YACReader not found + YACReader introuvable + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader introuvable. YACReader doit être installé dans le même dossier que YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader introuvable. Il se peut qu'il y ait un problème avec votre installation de YACReader. + + + + Error + Erreur + + + + Error opening comic with third party reader. + Erreur lors de l'ouverture de la bande dessinée avec un lecteur tiers. + + + + Library not found + Librairie introuvable + + + + The selected folder doesn't contain any library. + Le dossier sélectionné ne contient aucune librairie. + + + + Are you sure? + Êtes-vous sûr? + + + + Do you want remove + Voulez-vous supprimer + + + + library? + la librairie? + + + + Remove and delete metadata + Supprimer les métadata + + + + Library info + Informations sur la bibliothèque + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Un problème est survenu lors de la tentative de suppression des bandes dessinées sélectionnées. Veuillez vérifier les autorisations d'écriture dans les fichiers sélectionnés ou le dossier contenant. + + + + Assign comics numbers + Attribuer des numéros de bandes dessinées + + + + Assign numbers starting in: + Attribuez des numéros commençant par : + + + + Invalid image + Image invalide + + + + The selected file is not a valid image. + Le fichier sélectionné n'est pas une image valide. + + + + Error saving cover + Erreur lors de l'enregistrement de la couverture + + + + There was an error saving the cover image. + Une erreur s'est produite lors de l'enregistrement de l'image de couverture. + + + + Error creating the library + Erreur lors de la création de la librairie + + + + Error updating the library + Erreur lors de la mise à jour de la librairie + + + + Error opening the library + Erreur lors de l'ouverture de la librairie + + + + Delete comics + Supprimer les comics + + + + All the selected comics will be deleted from your disk. Are you sure? + Tous les comics sélectionnés vont être supprimés de votre disque. Êtes-vous sûr? + + + + Remove comics + Supprimer les bandes dessinées + + + + Comics will only be deleted from the current label/list. Are you sure? + Les bandes dessinées seront uniquement supprimées du label/liste actuelle. Es-tu sûr? + + + + Library name already exists + Le nom de la librairie existe déjà + + + + There is another library with the name '%1'. + Une autre librairie a le nom '%1'. + + + + LibraryWindowActions + + + Create a new library + Créer une nouvelle librairie + + + + Open an existing library + Ouvrir une librairie existante + + + + + Export comics info + Exporter les infos des bandes dessinées + + + + + Import comics info + Importer les infos des bandes dessinées + + + + Pack covers + Archiver les couvertures + + + + Pack the covers of the selected library + Archiver les couvertures de la librairie sélectionnée + + + + Unpack covers + Désarchiver les couvertures + + + + Unpack a catalog + Désarchiver un catalogue + + + + Update library + Mettre la librairie à jour + + + + Update current library + Mettre à jour la librairie actuelle + + + + Rename library + Renommer la librairie + + + + Rename current library + Renommer la librairie actuelle + + + + Remove library + Supprimer la librairie + + + + Remove current library from your collection + Enlever cette librairie de votre collection + + + + Rescan library for XML info + Réanalyser la bibliothèque pour les informations XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Essaie de trouver des informations XML intégrées dans des fichiers de bandes dessinées. Vous ne devez le faire que si la bibliothèque a été créée avec la version 9.8.2 ou des versions antérieures ou si vous utilisez un logiciel tiers pour intégrer des informations XML dans les fichiers. + + + + Show library info + Afficher les informations sur la bibliothèque + + + + Show information about the current library + Afficher des informations sur la bibliothèque actuelle + + + + Open current comic + Ouvrir cette bande dessinée + + + + Open current comic on YACReader + Ouvrir cette bande dessinée dans YACReader + + + + Save selected covers to... + Exporter la couverture vers... + + + + Save covers of the selected comics as JPG files + Enregistrer les couvertures des bandes dessinées sélectionnées en tant que fichiers JPG + + + + + Set as read + Marquer comme lu + + + + Set comic as read + Marquer cette bande dessinée comme lu + + + + + Set as unread + Marquer comme non-lu + + + + Set comic as unread + Marquer cette bande dessinée comme non-lu + + + + + manga + mangas + + + + Set issue as manga + Définir le problème comme manga + + + + + comic + comique + + + + Set issue as normal + Définir le problème comme d'habitude + + + + western manga + manga occidental + + + + Set issue as western manga + Définir le problème comme un manga occidental + + + + + web comic + bande dessinée Web + + + + Set issue as web comic + Définir le problème comme bande dessinée Web + + + + + yonkoma + Yonkoma + + + + Set issue as yonkoma + Définir le problème comme Yonkoma + + + + Show/Hide marks + Afficher/Cacher les marqueurs + + + + Show or hide read marks + Afficher ou masquer les marques de lecture + + + + Show/Hide recent indicator + Afficher/Masquer l'indicateur récent + + + + Show or hide recent indicator + Afficher ou masquer l'indicateur récent + + + + + Fullscreen mode on/off + Mode plein écran activé/désactivé + + + + Help, About YACReader + Aide, à propos de YACReader + + + + Add new folder + Ajouter un nouveau dossier + + + + Add new folder to the current library + Ajouter un nouveau dossier à la bibliothèque actuelle + + + + Delete folder + Supprimer le dossier + + + + Delete current folder from disk + Supprimer le dossier actuel du disque + + + + Select root node + Allerà la racine + + + + Expand all nodes + Afficher tous les noeuds + + + + Collapse all nodes + Réduire tous les nœuds + + + + Show options dialog + Ouvrir la boite de dialogue + + + + Show comics server options dialog + Ouvrir la boite de dialogue du serveur + + + + + Change between comics views + Changement entre les vues de bandes dessinées + + + + Open folder... + Ouvrir le dossier... + + + + Set as uncompleted + Marquer comme incomplet + + + + Set as completed + Marquer comme complet + + + + Set custom cover + Définir une couverture personnalisée + + + + Delete custom cover + Supprimer la couverture personnalisée + + + + western manga (left to right) + manga occidental (de gauche à droite) + + + + Open containing folder... + Ouvrir le dossier... + + + + Reset comic rating + Supprimer la note d'évaluation + + + + Select all comics + Sélectionner toutes les bandes dessinées + + + + Edit + Editer + + + + Assign current order to comics + Assigner l'ordre actuel aux bandes dessinées + + + + Update cover + Mise à jour des couvertures + + + + Delete selected comics + Supprimer la bande dessinée sélectionnée + + + + Delete metadata from selected comics + Supprimer les métadonnées des bandes dessinées sélectionnées + + + + Download tags from Comic Vine + Télécharger les informations de Comic Vine + + + + Focus search line + Ligne de recherche ciblée + + + + Focus comics view + Focus sur la vue des bandes dessinées + + + + Edit shortcuts + Modifier les raccourcis + + + + &Quit + &Quitter + + + + Update folder + Mettre à jour le dossier + + + + Update current folder + Mettre à jour ce dossier + + + + Scan legacy XML metadata + Analyser les métadonnées XML héritées + + + + Add new reading list + Ajouter une nouvelle liste de lecture + + + + Add a new reading list to the current library + Ajouter une nouvelle liste de lecture à la bibliothèque actuelle + + + + Remove reading list + Supprimer la liste de lecture + + + + Remove current reading list from the library + Supprimer la liste de lecture actuelle de la bibliothèque + + + + Add new label + Ajouter une nouvelle étiquette + + + + Add a new label to this library + Ajouter une nouvelle étiquette à cette bibliothèque + + + + Rename selected list + Renommer la liste sélectionnée + + + + Rename any selected labels or lists + Renommer toutes les étiquettes ou listes sélectionnées + + + + Add to... + Ajouter à... + + + + Favorites + Favoris + + + + Add selected comics to favorites list + Ajouter la bande dessinée sélectionnée à la liste des favoris + + + + LocalComicListModel + + + file name + nom de fichier + + + + MainWindowViewer + + Go + Aller + + + Edit + Editer + + + File + Fichier + + + Help + Aide + + + Save + Sauvegarder + + + View + Vue + + + &File + &Fichier + + + &Next + &Suivant + + + &Open + &Ouvrir + + + Close + Fermer + + + Open Comic + Ouvrir la bande dessinée + + + Go To + Aller à + + + Zoom+ + Agrandir + + + Zoom- + R?duire + + + Open image folder + Ouvrir un dossier d'images + + + Size down magnifying glass + Réduire la taille de la loupe + + + Zoom out magnifying glass + Dézoomer + + + Open latest comic + Ouvrir la dernière bande dessinée + + + Autoscroll up + Défilement automatique vers le haut + + + Set bookmark + Placer un marque-page + + + page_%1.jpg + feuille_%1.jpg + + + Autoscroll forward, vertical first + Défilement automatique en avant, vertical + + + Switch to double page mode + Passer en mode double page + + + Save current page + Sauvegarder la page actuelle + + + Size up magnifying glass + Augmenter la taille de la loupe + + + Double page mode + Mode double page + + + Move up + Monter + + + Switch Magnifying glass + Utiliser la loupe + + + Open Folder + Ouvrir un dossier + + + Comics + Bandes dessinées + + + Fit Height + Ajuster la hauteur + + + Autoscroll backward, vertical first + Défilement automatique en arrière, verticak + + + Comic files + Bande dessinée + + + Not now + Pas maintenant + + + Go to the first page + Aller à la première page + + + Go to previous page + Aller à la page précédente + + + Window + Fenêtre + + + Open the latest comic opened in the previous reading session + Ouvrir la dernière bande dessinée ouverte lors de la session de lecture précédente + + + Open a comic + Ouvrir une bande dessinée + + + Image files (*.jpg) + Image(*.jpg) + + + Next Comic + Bande dessinée suivante + + + Fit Width + Ajuster la largeur + + + Options + Possibilités + + + Show Info + Voir les infos + + + Open folder + Ouvirir le dossier + + + Go to page ... + Aller à la page ... + + + Magnifiying glass + Loupe + + + Fit image to width + Ajuster l'image à la largeur + + + Toggle fullscreen mode + Basculer en mode plein écran + + + Toggle between fit to width and fit to height + Basculer entre adapter à la largeur et adapter à la hauteur + + + Move right + Déplacer à droite + + + Zoom in magnifying glass + Zoomer + + + Open recent + Ouvrir récent + + + Reading + Lecture + + + &Previous + &Précédent + + + Autoscroll forward, horizontal first + Défilement automatique en avant, horizontal + + + Go to next page + Aller à la page suivante + + + Show keyboard shortcuts + Voir les raccourcis + + + Double page manga mode + Mode manga en double page + + + There is a new version available + Une nouvelle version est disponible + + + Autoscroll down + Défilement automatique vers le bas + + + Open next comic + Ouvrir la bande dessinée suivante + + + Remind me in 14 days + Rappelez-moi dans 14 jours + + + Fit to page + Ajuster à la page + + + Show bookmarks + Voir les marque-pages + + + Open previous comic + Ouvrir la bande dessiné précédente + + + Rotate image to the left + Rotation à gauche + + + Fit image to height + Ajuster l'image à la hauteur + + + Reset zoom + Réinitialiser le zoom + + + Show the bookmarks of the current comic + Voir les marque-pages de cette bande dessinée + + + Show Dictionary + Dictionnaire + + + Move down + Descendre + + + Move left + Déplacer à gauche + + + Reverse reading order in double page mode + Ordre de lecture inversée en mode double page + + + YACReader options + Options de YACReader + + + Clear open recent list + Vider la liste d'ouverture récente + + + Help, About YACReader + Aide, à propos de YACReader + + + Show go to flow + Afficher "Aller à Comic Flow" + + + Previous Comic + Bande dessinée précédente + + + Show full size + Plein écran + + + Hide/show toolbar + Masquer / afficher la barre d'outils + + + Magnifying glass + Loupe + + + Edit shortcuts + Modifier les raccourcis + + + General + Général + + + Set a bookmark on the current page + Placer un marque-page sur la page actuelle + + + Page adjustement + Ajustement de la page + + + Show zoom slider + Afficher le curseur de zoom + + + Go to the last page + Aller à la dernière page + + + Do you want to download the new version? + Voulez-vous télécharger la nouvelle version? + + + Rotate image to the right + Rotation à droite + + + Always on top + Toujours au dessus + + + Autoscroll backward, horizontal first + Défilement automatique en arrière horizontal + + + + NoLibrariesWidget + + + You don't have any libraries yet + Vous n'avez pas encore de librairie + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Vous pouvez creer une librairie dans n'importe quel dossierr, YACReaderLibrary importera les dossiers et les bandes dessinées contenus dans ce dossier. Si vous avez déjà crer des librairies, vous pouvez les ouvrir.</p><p>N'oubliez pas que vous pouvez utiliser YACReader en tant que stand alone pour lire vos bandes dessinées sur votre ordinateur.</p> + + + + create your first library + Créez votre première librairie + + + + add an existing one + Ajouter une librairie existante + + + + NoSearchResultsWidget + + + No results + Aucun résultat + + + + OptionsDialog + + + Gamma + Valeur gamma + + + + Reset + Remise à zéro + + + + My comics path + Chemin de mes bandes dessinées + + + + Image adjustment + Ajustement de l'image + + + + "Go to flow" size + Taille de "Aller à Comic Flow" + + + + Choose + Choisir + + + + Image options + Option de l'image + + + + Contrast + Contraste + + + + + Libraries + Bibliothèques + + + + Comic Flow + Comic Flow + + + + Grid view + Vue grille + + + + + Appearance + Apparence + + + + + Options + Possibilités + + + + + Language + Langue + + + + + Application language + Langue de l'application + + + + + System default + Par défaut du système + + + + Tray icon settings (experimental) + Paramètres de l'icône de la barre d'état (expérimental) + + + + Close to tray + Près du plateau + + + + Start into the system tray + Commencez dans la barre d'état système + + + + Edit Comic Vine API key + Modifier la clé API Comic Vine + + + + Comic Vine API key + Clé API Comic Vine + + + + ComicInfo.xml legacy support + Prise en charge héritée de ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importer des métadonnées depuis ComicInfo.xml lors de l'ajout de nouvelles bandes dessinées + + + + Consider 'recent' items added or updated since X days ago + Considérez les éléments « récents » ajoutés ou mis à jour depuis X jours + + + + Third party reader + Lecteur tiers + + + + Write {comic_file_path} where the path should go in the command + Écrivez {comic_file_path} où le chemin doit aller dans la commande + + + + + Clear + Clair + + + + Update libraries at startup + Mettre à jour les bibliothèques au démarrage + + + + Try to detect changes automatically + Essayez de détecter automatiquement les changements + + + + Update libraries periodically + Mettre à jour les bibliothèques périodiquement + + + + Interval: + Intervalle: + + + + 30 minutes + 30 min + + + + 1 hour + 1 heure + + + + 2 hours + 2 heures + + + + 4 hours + 4 heures + + + + 8 hours + 8 heures + + + + 12 hours + 12 heures + + + + daily + tous les jours + + + + Update libraries at certain time + Mettre à jour les bibliothèques à un certain moment + + + + Time: + Temps: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + AVERTISSEMENT! Lors des mises à jour de la bibliothèque, les écritures dans la base de données sont désactivées ! +Ne planifiez pas de mises à jour pendant que vous utilisez activement l'application. +Lors des mises à jour automatiques, l'application bloquera certaines actions jusqu'à ce que la mise à jour soit terminée. +Pour arrêter une mise à jour automatique, appuyez sur l'indicateur de chargement à côté du titre Bibliothèques. + + + + Modifications detection + Détection des modifications + + + + Compare the modified date of files when updating a library (not recommended) + Comparer la date de modification des fichiers lors de la mise à jour d'une bibliothèque (déconseillé) + + + + Enable background image + Activer l'image d'arrière-plan + + + + Opacity level + Niveau d'opacité + + + + Blur level + Niveau de flou + + + + Use selected comic cover as background + Utiliser la couverture de bande dessinée sélectionnée comme arrière-plan + + + + Restore defautls + Restaurer les valeurs par défaut + + + + Background + Arrière-plan + + + + Display continue reading banner + Afficher la bannière de lecture continue + + + + Display current comic banner + Afficher la bannière de bande dessinée actuelle + + + + Continue reading + Continuer la lecture + + + + Comics directory + Répertoire des bandes dessinées + + + + Quick Navigation Mode + Mode navigation rapide + + + + Display + Afficher + + + + Show time in current page information label + Afficher l'heure dans l'étiquette d'information de la page actuelle + + + + Background color + Couleur d'arrière plan + + + + Scroll behaviour + Comportement de défilement + + + + Disable scroll animations and smooth scrolling + Désactiver les animations de défilement et le défilement fluide + + + + Do not turn page using scroll + Ne tournez pas la page en utilisant le défilement + + + + Use single scroll step to turn page + Utilisez une seule étape de défilement pour tourner la page + + + + Mouse mode + Mode souris + + + + Only Back/Forward buttons can turn pages + Seuls les boutons Précédent/Avant peuvent tourner les pages + + + + Use the Left/Right buttons to turn pages. + Utilisez les boutons Gauche/Droite pour tourner les pages. + + + + Click left or right half of the screen to turn pages. + Cliquez sur la moitié gauche ou droite de l'écran pour tourner les pages. + + + + Disable mouse over activation + Désactiver la souris sur l'activation + + + + Scaling + Mise à l'échelle + + + + Scaling method + Méthode de mise à l'échelle + + + + Nearest (fast, low quality) + Le plus proche (rapide, mauvaise qualité) + + + + Bilinear + Bilinéaire + + + + Lanczos (better quality) + Lanczos (meilleure qualité) + + + + Page Flow + Flux des pages + + + + + General + Général + + + + Brightness + Luminosité + + + + + Restart is needed + Redémarrage nécessaire + + + + Fit options + Options d'ajustement + + + + Enlarge images to fit width/height + Agrandir les images pour les adapter à la largeur/hauteur + + + + Double Page options + Options de double page + + + + Show covers as single page + Afficher les couvertures sur une seule page + + + + PropertiesDialog + + + General info + Infos générales + + + + Plot + Intrigue + + + + Authors + Auteurs + + + + Publishing + Publication + + + + Notes + Remarques + + + + Cover page + Couverture + + + + Load previous page as cover + Charger la page précédente comme couverture + + + + Load next page as cover + Charger la page suivante comme couverture + + + + Reset cover to the default image + Réinitialiser la couverture à l'image par défaut + + + + Load custom cover image + Charger une image de couverture personnalisée + + + + Series: + Série: + + + + Title: + Titre: + + + + + + of: + sur: - - - Total pages : - Nombre de pages : + + Issue number: + Numéro: - - Cancel - Annuler + + Volume: + Tome : - - Page : - Page : + + Arc number: + Arc numéro: - - - GoToFlowToolBar - - Page : - Page : + + Story arc: + Arc narratif: - - - HelpAboutDialog - - Help - Aide + + alt. number: + alt. nombre: - - System info - + + Alternate series: + Série alternative : - - About - A propos + + Series Group: + Groupe de séries : - - - LogWindow - - Log window - + + Genre: + Genre : - - &Pause - + + Size: + Taille: - - &Save - + + Writer(s): + Scénariste(s): - - C&lear - + + Penciller(s): + Dessinateur(s): - - &Copy - + + Inker(s): + Encreur(s): - - Level: - + + Colorist(s): + Coloriste(s): - - &Auto scroll - + + Letterer(s): + Lettreur(s): - - - MainWindowViewer - Go - Aller + + Cover Artist(s): + Artiste(s) de couverture: - Edit - Editer + + Editor(s): + Editeur(s) : - File - Fichier + + Imprint: + Imprimer: - Help - Aide + + Day: + Jour: - Save - Sauvegarder + + Month: + Mois: - View - Vue + + Year: + Année: - &File - &Fichier + + Publisher: + Editeur: - &Next - &Suivant + + Format: + Format : - &Open - &Ouvrir + + Color/BW: + Couleur/Noir et blanc: - Close - Fermer + + Age rating: + Limite d'âge: - Open Comic - Ouvrir la bande dessinée + + Type: + Taper: - Go To - Aller à + + Language (ISO): + Langue (ISO) : - Zoom+ - Zoom+ + + Synopsis: + Synopsis : - Zoom- - Zoom- + + Characters: + Personnages: - Open image folder - Ouvrir un dossier d'images + + Teams: + Équipes : - Size down magnifying glass - Réduire la taille de la loupe + + Locations: + Emplacements : - Zoom out magnifying glass - Dézoomer + + Main character or team: + Personnage principal ou équipe : - Open latest comic - Ouvrir la dernière bande dessinée + + Review: + Revoir: - Autoscroll up - Défilement automatique vers le haut + + Notes: + Remarques : - Set bookmark - Placer un marque-page + + Tags: + Balises : - page_%1.jpg - page_%1.jpg + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Lien Comic Vine : <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> vue </a> - Autoscroll forward, vertical first - Défilement automatique en avant, vertical + + Not found + Introuvable - Switch to double page mode - Passer en mode double page + + Comic not found. You should update your library. + Comic introuvable. Vous devriez mettre à jour votre librairie. - Save current page - Sauvegarder la page actuelle + + Edit comic information + Editer les informations du comic - Size up magnifying glass - Augmenter la taille de la loupe + + Edit selected comics information + Editer les informations du comic sélectionné - Double page mode - Mode double page + + Invalid cover + Couverture invalide - Move up - Monter + + The image is invalid. + L'image n'est pas valide. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer est la version sans tête (sans interface graphique) de YACReaderLibrary. + +Cette application prend en charge les paramètres persistants, pour les configurer, modifiez ce fichier %1 +Pour en savoir plus sur les paramètres disponibles, veuillez consulter la documentation sur https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + QObject - Switch Magnifying glass - Utiliser la loupe + + 7z lib not found + lib 7z introuvable - Open Folder - Ouvrir un dossier + + unable to load 7z lib from ./utils + impossible de charger 7z depuis ./utils - Comics - Bandes dessinées + + Trace + Tracer - Fit Height - Ajuster la hauteur + + Debug + Déboguer - Autoscroll backward, vertical first - Défilement automatique en arrière, verticak + + Info + Informations - Comic files - Bande dessinée + + Warning + Avertissement - Not now - Pas maintenant + + Error + Erreur - Go to the first page - Aller à la première page + + Fatal + Critique - Go to previous page - Aller à la page précédente + + Select custom cover + Sélectionnez une couverture personnalisée - Window - Fenêtre + + Images (%1) + Illustrations (%1) - Open the latest comic opened in the previous reading session - Ouvrir la dernière bande dessinée ouverte lors de la session de lecture précédente + + The file could not be read or is not valid JSON. + Le fichier n'a pas pu être lu ou n'est pas un JSON valide. - Open a comic - Ouvrir une bande dessinée + + This theme is for %1, not %2. + Ce thème est pour %1, pas pour %2. - Image files (*.jpg) - Image(*.jpg) + + Libraries + Bibliothèques - Next Comic - Bande dessinée suivante + + Folders + Dossiers - Fit Width - Ajuster la largeur + + Reading Lists + Listes de lecture + + + RenameLibraryDialog - Options - Options + + New Library Name : + Nouveau nom de librairie: - Show Info - Voir les infos + + Rename + Renommer - Open folder - Ouvirir le dossier + + Cancel + Annuler - Go to page ... - Aller à la page ... + + Rename current library + Renommer la librairie actuelle + + + ScraperResultsPaginator - Magnifiying glass - Loupe + + Number of volumes found : %1 + Nombre de volumes trouvés : %1 - Fit image to width - Ajuster l'image à la largeur + + + page %1 of %2 + page %1 de %2 - Toggle fullscreen mode - Basculer en mode plein écran + + Number of %1 found : %2 + Nombre de %1 trouvés : %2 + + + SearchSingleComic - Toggle between fit to width and fit to height - Basculer entre adapter à la largeur et adapter à la hauteur + + Please provide some additional information for this comic. + Veuillez fournir des informations supplémentaires pour cette bande dessinée. - Move right - Déplacer à droite + + Series: + Série: - Zoom in magnifying glass - Zoomer + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Utilisez la recherche de correspondance exacte. Désactivez-la si vous souhaitez rechercher des volumes correspondant à certains mots du nom. + + + SearchVolume - Open recent - Ouvrir récent + + Please provide some additional information. + Veuillez fournir quelques informations supplémentaires. - Reading - Lecture + + Series: + Série: - &Previous - &Précédent + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Utilisez la recherche de correspondance exacte. Désactivez-la si vous souhaitez rechercher des volumes correspondant à certains mots du nom. + + + SelectComic - Autoscroll forward, horizontal first - Défilement automatique en avant, horizontal + + Please, select the right comic info. + Veuillez sélectionner les bonnes informations sur la bande dessinée. - Go to next page - Aller à la page suivante + + comics + bandes dessinées - Show keyboard shortcuts - Voir les raccourcis + + loading cover + couvercle de chargement - Double page manga mode - Mode manga en double page + + loading description + description du chargement - There is a new version available - Une nouvelle version est disponible + + comic description unavailable + description de la bande dessinée indisponible + + + SelectVolume - Autoscroll down - Défilement automatique vers le bas + + Please, select the right series for your comic. + Veuillez sélectionner la bonne série pour votre bande dessinée. - Open next comic - Ouvrir la bande dessinée suivante + + Filter: + Filtre: - Remind me in 14 days - Rappelez-moi dans 14 jours + + volumes + tomes - Fit to page - Ajuster à la page + + Nothing found, clear the filter if any. + Rien trouvé, effacez le filtre le cas échéant. - Show bookmarks - Voir les marque-pages + + loading cover + couvercle de chargement - Open previous comic - Ouvrir la bande dessiné précédente + + loading description + description du chargement - Rotate image to the left - Rotation à gauche + + volume description unavailable + description du volume indisponible + + + SeriesQuestion - Fit image to height - Ajuster l'image à la hauteur + + You are trying to get information for various comics at once, are they part of the same series? + Vous essayez d’obtenir des informations sur plusieurs bandes dessinées à la fois, font-elles partie de la même série ? - Reset zoom - Réinitialiser le zoom + + yes + oui - Show the bookmarks of the current comic - Voir les marque-pages de cette bande dessinée + + no + non + + + ServerConfigDialog - Show Dictionary - Dictionnaire + + set port + Configurer le port - Move down - Descendre + + Server connectivity information + Informations sur la connectivité du serveur - Move left - Déplacer à gauche + + Scan it! + Scannez-le ! - Reverse reading order in double page mode - Ordre de lecture inversée en mode double page + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader est disponible pour les appareils iOS et Android.<br/>Découvrez-le pour <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> ou <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - YACReader options - Options de YACReader + + Choose an IP address + Choisissez une adresse IP - Clear open recent list - Vider la liste d'ouverture récente + + Port + Port r?seau - Help, About YACReader - Aide, à propos de YACReader + + enable the server + Autoriser le serveur + + + + ShortcutsDialog + + Close + Fermer - Show go to flow - Afficher le flux + YACReader keyboard shortcuts + Raccourcis clavier de YACReader - Previous Comic - Bande dessinée précédente + Keyboard Shortcuts + Raccourcis clavier + + + SortVolumeComics - Show full size - Plein écran + + Please, sort the list of comics on the left until it matches the comics' information. + Veuillez trier la liste des bandes dessinées sur la gauche jusqu'à ce qu'elle corresponde aux informations des bandes dessinées. - Hide/show toolbar - Masquer / afficher la barre d'outils + + sort comics to match comic information + trier les bandes dessinées pour qu'elles correspondent aux informations sur les bandes dessinées - Magnifying glass - Loupe + + issues + problèmes - Edit shortcuts - Modifier les raccourcis + + remove selected comics + supprimer les bandes dessinées sélectionnées - General - Général + + restore all removed comics + restaurer toutes les bandes dessinées supprimées + + + ThemeEditorDialog - Set a bookmark on the current page - Placer un marque-page sur la page actuelle + + Theme Editor + Éditeur de thème - Page adjustement - Ajustement de la page + + + + + - Show zoom slider - Afficher le curseur de zoom + + - + - - Go to the last page - Aller à la dernière page + + i + je - Do you want to download the new version? - Voulez-vous télécharger la nouvelle version? + + Expand all + Tout développer - Rotate image to the right - Rotation à droite + + Collapse all + Tout réduire - Always on top - Toujours au dessus + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Maintenez enfoncé pour faire clignoter la valeur sélectionnée dans l'interface utilisateur (magenta / basculé / 0↔10). Les versions restaurent l'original. - Autoscroll backward, horizontal first - Défilement automatique en arrière horizontal + + Search… + Rechercher… - - - OptionsDialog - - Gamma - Gamma + + Light + Lumière - - Reset - Remise à zéro + + Dark + Sombre - - My comics path - Chemin de mes bandes dessinées + + ID: + IDENTIFIANT: - - Image adjustment - Ajustement de l'image + + Display name: + Nom d'affichage : - - "Go to flow" size - Taille du flux + + Variant: + Variante: - - Choose - Choisir + + Theme info + Informations sur le thème - - Image options - Option de l'image + + Parameter + Paramètre - - Contrast - Contraste + + Value + Valeur - - Options - Options + + Save and apply + Enregistrer et postuler - - Comics directory - Répertoire des bandes dessinées + + Export to file... + Exporter vers un fichier... - - Quick Navigation Mode - Mode navigation rapide + + Load from file... + Charger à partir du fichier... - - Display - + + Close + Fermer - - Show time in current page information label - + + Double-click to edit color + Double-cliquez pour modifier la couleur - - Background color - Couleur d'arrière plan + + + + + + + true + vrai - - Scroll behaviour - + + + + + false + FAUX - - Disable scroll animations and smooth scrolling - + + Double-click to toggle + Double-cliquez pour basculer - - Do not turn page using scroll - + + Double-click to edit value + Double-cliquez pour modifier la valeur - - Use single scroll step to turn page - + + + + Edit: %1 + Modifier : %1 - - Mouse mode - + + Save theme + Enregistrer le thème - - Only Back/Forward buttons can turn pages - + + + JSON files (*.json);;All files (*) + Fichiers JSON (*.json);;Tous les fichiers (*) - - Use the Left/Right buttons to turn pages. - + + Save failed + Échec de l'enregistrement - - Click left or right half of the screen to turn pages. - + + Could not open file for writing: +%1 + Impossible d'ouvrir le fichier en écriture : +%1 - - Disable mouse over activation - Désactiver la souris sur l'activation + + Load theme + Charger le thème - - Page Flow - Flux des pages + + + + Load failed + Échec du chargement - - General - Général + + Could not open file: +%1 + Impossible d'ouvrir le fichier : +%1 - - Brightness - Luminosité + + Invalid JSON: +%1 + JSON invalide : +%1 - - Restart is needed - Redémarrage nécessaire + + Expected a JSON object. + Attendu un objet JSON. + + + TitleHeader - - Fit options - + + SEARCH + RECHERCHE + + + UpdateLibraryDialog - - Enlarge images to fit width/height - + + Updating.... + Mise à jour... - - Double Page options - + + Cancel + Annuler - - Show covers as single page - + + Update library + Mettre la librairie à jour - QObject + Viewer - - 7z lib not found - lib 7z introuvable + + Page not available! + Page non disponible ! - - unable to load 7z lib from ./utils - impossible de charger 7z depuis ./utils + + + Press 'O' to open comic. + Appuyez sur "O" pour ouvrir une bande dessinée. - - Trace - + + Error opening comic + Erreur d'ouverture de la bande dessinée - - Debug - + + Cover! + Couverture! - - Info - + + CRC Error + Erreur CRC - - Warning - + + Comic not found + Bande dessinée introuvable - - Error - + + Not found + Introuvable - - Fatal - + + Last page! + Dernière page! - - Select custom cover - + + Loading...please wait! + Chargement... Patientez + + + VolumeComicsModel - - Images (%1) - + + title + titre - QsLogging::LogWindowModel + VolumesModel - - Time - + + year + année - - Level - + + issues + problèmes - - Message - + + publisher + éditeur - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - + + Presets: + Réglages: - - &Resume - + + Classic look + Vue classique - - Save log - + + Stripe look + Vue alignée - - Log file (*.log) - + + Overlapped Stripe look + Vue superposée - - - ShortcutsDialog - Close - Fermer + + Modern look + Vue moderne - YACReader keyboard shortcuts - Raccourcis clavier de YACReader + + Roulette look + Vue roulette - Keyboard Shortcuts - Raccourcis clavier + + Show advanced settings + Voir les paramètres avancés - - - Viewer - - Page not available! - Page non disponible ! + + Custom: + Personnalisation: - - - Press 'O' to open comic. - Appuyez sur "O" pour ouvrir une bande dessinée. + + View angle + Angle de vue - - Error opening comic - Erreur d'ouverture de la bande dessinée + + Position + Positionnement - - Cover! - Couverture! + + Cover gap + Espace entre les couvertures - - CRC Error - Erreur CRC + + Central gap + Espace couverture centrale - - Comic not found - Bande dessinée introuvable + + Zoom + Agrandissement - - Not found - Introuvable + + Y offset + Axe Y - - Last page! - Dernière page! + + Z offset + Axe Z - - Loading...please wait! - Chargement... Patientez + + Cover Angle + Angle des couvertures + + + + Visibility + Visibilité + + + + Light + Lumière + + + + Max angle + Angle Maximum + + + + Low Performance + Faible performance + + + + High Performance + Haute performance + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Utiliser VSync (Améliore la qualité d'image en mode plein écran, ralentit la performance) + + + + Performance: + Performance : YACReader::MainWindowViewer - + &Open - &Ouvrir + &Ouvrir - + Open a comic - Ouvrir une bande dessinée + Ouvrir une bande dessinée - + New instance - + Nouvelle instance - + Open Folder - Ouvrir un dossier + Ouvrir un dossier - + Open image folder - Ouvrir un dossier d'images + Ouvrir un dossier d'images - + Open latest comic - Ouvrir la dernière bande dessinée + Ouvrir la dernière bande dessinée - + Open the latest comic opened in the previous reading session - Ouvrir la dernière bande dessinée ouverte lors de la session de lecture précédente + Ouvrir la dernière bande dessinée ouverte lors de la session de lecture précédente - + Clear - + Clair - + Clear open recent list - Vider la liste d'ouverture récente + Vider la liste d'ouverture récente - + Save - Sauvegarder + Sauvegarder - + Save current page - Sauvegarder la page actuelle + Sauvegarder la page actuelle Previous Comic - Bande dessinée précédente + Bande dessinée précédente - - - + + + Open previous comic - Ouvrir la bande dessiné précédente + Ouvrir la bande dessiné précédente - + Next Comic - Bande dessinée suivante + Bande dessinée suivante - - - + + + Open next comic - Ouvrir la bande dessinée suivante + Ouvrir la bande dessinée suivante - + &Previous - &Précédent + &Précédent - - - + + + Go to previous page - Aller à la page précédente + Aller à la page précédente - + &Next - &Suivant + &Suivant - - - + + + Go to next page - Aller à la page suivante + Aller à la page suivante - + Fit Height - Ajuster la hauteur + Ajuster la hauteur - + Fit image to height - Ajuster l'image à la hauteur + Ajuster l'image à la hauteur - + Fit Width - Ajuster la largeur + Ajuster la largeur - + Fit image to width - Ajuster l'image à la largeur + Ajuster l'image à la largeur - + Show full size - Plein écran + Plein écran - + Fit to page - Ajuster à la page + Ajuster à la page + + + + Continuous scroll + Défilement continu + + + + Switch to continuous scroll mode + Passer en mode défilement continu - + Reset zoom - Réinitialiser le zoom + Réinitialiser le zoom - + Show zoom slider - Afficher le curseur de zoom + Afficher le curseur de zoom - + Zoom+ - Zoom+ + Agrandir - + Zoom- - Zoom- + R?duire - + Rotate image to the left - Rotation à gauche + Rotation à gauche - + Rotate image to the right - Rotation à droite + Rotation à droite - + Double page mode - Mode double page + Mode double page - + Switch to double page mode - Passer en mode double page + Passer en mode double page - + Double page manga mode - Mode manga en double page + Mode manga en double page - + Reverse reading order in double page mode - Ordre de lecture inversée en mode double page + Ordre de lecture inversée en mode double page - + Go To - Aller à + Aller à - + Go to page ... - Aller à la page ... + Aller à la page ... - + Options - Options + Possibilités - + YACReader options - Options de YACReader + Options de YACReader - - + + Help - Aide + Aide - + Help, About YACReader - Aide, à propos de YACReader + Aide, à propos de YACReader - + Magnifying glass - Loupe + Loupe - + Switch Magnifying glass - Utiliser la loupe + Utiliser la loupe - + Set bookmark - Placer un marque-page + Placer un marque-page - + Set a bookmark on the current page - Placer un marque-page sur la page actuelle + Placer un marque-page sur la page actuelle - + Show bookmarks - Voir les marque-pages + Voir les marque-pages - + Show the bookmarks of the current comic - Voir les marque-pages de cette bande dessinée + Voir les marque-pages de cette bande dessinée - + Show keyboard shortcuts - Voir les raccourcis + Voir les raccourcis - + Show Info - Voir les infos + Voir les infos - + Close - Fermer + Fermer - + Show Dictionary - Dictionnaire + Dictionnaire - + Show go to flow - Afficher le flux + Afficher "Aller à Comic Flow" - + Edit shortcuts - Modifier les raccourcis + Modifier les raccourcis - + &File - &Fichier + &Fichier - - + + Open recent - Ouvrir récent + Ouvrir récent - + File - Fichier + Fichier - + Edit - Editer + Editer - + View - Vue + Vue - + Go - Aller + Aller - + Window - Fenêtre + Fenêtre - - - + + + Open Comic - Ouvrir la bande dessinée + Ouvrir la bande dessinée - - - + + + Comic files - Bande dessinée + Bande dessinée - + Open folder - Ouvirir le dossier + Ouvirir le dossier - + page_%1.jpg - page_%1.jpg + feuille_%1.jpg - + Image files (*.jpg) - Image(*.jpg) + Image(*.jpg) + Comics - Bandes dessinées + Bandes dessinées Toggle fullscreen mode - Basculer en mode plein écran + Basculer en mode plein écran Hide/show toolbar - Masquer / afficher la barre d'outils + Masquer / afficher la barre d'outils + General - Général + Général Size up magnifying glass - Augmenter la taille de la loupe + Augmenter la taille de la loupe Size down magnifying glass - Réduire la taille de la loupe + Réduire la taille de la loupe Zoom in magnifying glass - Zoomer + Zoomer Zoom out magnifying glass - Dézoomer + Dézoomer Reset magnifying glass - + Réinitialiser la loupe + Magnifiying glass - Loupe + Loupe Toggle between fit to width and fit to height - Basculer entre adapter à la largeur et adapter à la hauteur + Basculer entre adapter à la largeur et adapter à la hauteur + Page adjustement - Ajustement de la page + Ajustement de la page - + Autoscroll down - Défilement automatique vers le bas + Défilement automatique vers le bas - + Autoscroll up - Défilement automatique vers le haut + Défilement automatique vers le haut - + Autoscroll forward, horizontal first - Défilement automatique en avant, horizontal + Défilement automatique en avant, horizontal - + Autoscroll backward, horizontal first - Défilement automatique en arrière horizontal + Défilement automatique en arrière horizontal - + Autoscroll forward, vertical first - Défilement automatique en avant, vertical + Défilement automatique en avant, vertical - + Autoscroll backward, vertical first - Défilement automatique en arrière, verticak + Défilement automatique en arrière, verticak - + Move down - Descendre + Descendre - + Move up - Monter + Monter - + Move left - Déplacer à gauche + Déplacer à gauche - + Move right - Déplacer à droite + Déplacer à droite - + Go to the first page - Aller à la première page + Aller à la première page - + Go to the last page - Aller à la dernière page + Aller à la dernière page - + Offset double page to the left - + Double page décalée vers la gauche - + Offset double page to the right - + Double page décalée à droite - + + Reading - Lecture + Lecture - + There is a new version available - Une nouvelle version est disponible + Une nouvelle version est disponible - + Do you want to download the new version? - Voulez-vous télécharger la nouvelle version? + Voulez-vous télécharger la nouvelle version? - + Remind me in 14 days - Rappelez-moi dans 14 jours + Rappelez-moi dans 14 jours - + Not now - Pas maintenant + Pas maintenant + + + + YACReader::TrayIconController + + + &Restore + &Restaurer + + + + Systray + Zone de notification + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuera à fonctionner dans la barre d'état système. Pour terminer le programme, choisissez <b>Quitter</b> dans le menu contextuel de l'icône de la barre d'état système. YACReader::WhatsNewDialog - Close - Fermer + Fermer @@ -1403,172 +4043,152 @@ YACReaderFlowConfigWidget - CoverFlow look - Vue CoverFlow + Vue CoverFlow - How to show covers: - Comment voir les couvertures: + Comment voir les couvertures: - Stripe look - Vue alignée + Vue alignée - Overlapped Stripe look - Vue superposée + Vue superposée YACReaderGLFlowConfigWidget - Zoom - Zoom + Agrandissement - Light - Lumière + Lumière - Show advanced settings - Voir les paramètres avancés + Voir les paramètres avancés - Roulette look - Vue roulette + Vue roulette - Cover Angle - Angle des couvertures + Angle des couvertures - Stripe look - Vue alignée + Vue alignée - Position - Position + Positionnement - Z offset - Axe Z + Axe Z - Y offset - Axe Y + Axe Y - Central gap - Espace couverture centrale + Espace couverture centrale - Presets: - Réglages: + Réglages: - Overlapped Stripe look - Vue superposée + Vue superposée - Modern look - Vue moderne + Vue moderne - View angle - Angle de vue + Angle de vue - Max angle - Angle Maximum + Angle Maximum - Custom: - Personnalisation: + Personnalisation: - Classic look - Vue classique + Vue classique - Cover gap - Espace entre les couvertures + Espace entre les couvertures - High Performance - Haute performance + Haute performance - Performance: - Performance: + Performance : - Use VSync (improve the image quality in fullscreen mode, worse performance) - Utiliser VSync (Améliore la qualité d'image en mode plein écran, ralentit la performance) + Utiliser VSync (Améliore la qualité d'image en mode plein écran, ralentit la performance) - Visibility - Visibilité + Visibilité - Low Performance - Faible performance + Faible performance YACReaderOptionsDialog - + Save Sauvegarder - Use hardware acceleration (restart needed) - Utiliser accélération hardware (redémarrage nécessaire) + Utiliser accélération hardware (redémarrage nécessaire) - + Cancel Annuler - + Shortcuts Raccourcis - + Edit shortcuts Modifier les raccourcis + + YACReaderSearchLineEdit + + + type to search + tapez pour rechercher + + YACReaderSlider @@ -1580,23 +4200,23 @@ YACReaderTranslator - + clear effacer - + Service not available Service non disponible - - + + Translation Traduction - + YACReader translator Traducteur YACReader diff --git a/YACReader/yacreader_images.qrc b/YACReader/yacreader_images.qrc deleted file mode 100644 index 8d94645f2..000000000 --- a/YACReader/yacreader_images.qrc +++ /dev/null @@ -1,91 +0,0 @@ - - - ../images/icon-new.svg - ../images/goto.png - ../images/find_folder.png - ../images/flow1.png - ../images/flow2.png - ../images/flow3.png - ../images/flow4.png - ../images/flow5.png - ../images/notCover.png - ../images/close.svg - ../images/up.png - ../images/down.png - ../images/imgCenterSlide.png - ../images/imgGoToSlide.png - ../images/imgCenterSlidePressed.png - ../images/imgGoToSlidePressed.png - ../images/defaultCover.png - ../images/fromTo.png - ../images/dropDownArrow.png - ../images/translatorSearch.png - ../images/speaker.png - ../images/clear_shortcut.svg - ../images/accept_shortcut.svg - ../images/shortcuts_group_comics.svg - ../images/shortcuts_group_folders.svg - ../images/shortcuts_group_general.svg - ../images/shortcuts_group_libraries.svg - ../images/shortcuts_group_mglass.svg - ../images/shortcuts_group_page.svg - ../images/shortcuts_group_reading.svg - ../images/shortcuts_group_visualization.svg - ../images/custom_dialog/custom_close_button.svg - ../images/whats_new/whatsnew_header.svg - ../images/viewer_toolbar/bookmark.svg - ../images/viewer_toolbar/close.svg - ../images/viewer_toolbar/doublePage.svg - ../images/viewer_toolbar/doubleMangaPage.svg - ../images/viewer_toolbar/fitToPage.svg - ../images/viewer_toolbar/flow.svg - ../images/viewer_toolbar/full.svg - ../images/viewer_toolbar/goto.svg - ../images/viewer_toolbar/help.svg - ../images/viewer_toolbar/info.svg - ../images/viewer_toolbar/magnifyingGlass.svg - ../images/viewer_toolbar/next.svg - ../images/viewer_toolbar/open.svg - ../images/viewer_toolbar/openFolder.svg - ../images/viewer_toolbar/openNext.svg - ../images/viewer_toolbar/openPrevious.svg - ../images/viewer_toolbar/options.svg - ../images/viewer_toolbar/previous.svg - ../images/viewer_toolbar/rotateL.svg - ../images/viewer_toolbar/rotateR.svg - ../images/viewer_toolbar/save.svg - ../images/viewer_toolbar/shortcuts.svg - ../images/viewer_toolbar/showBookmarks.svg - ../images/viewer_toolbar/toHeight.svg - ../images/viewer_toolbar/toWidth.svg - ../images/viewer_toolbar/translator.svg - ../images/viewer_toolbar/zoom.svg - ../images/viewer_toolbar/bookmark_18x18.svg - ../images/viewer_toolbar/close_18x18.svg - ../images/viewer_toolbar/doublePage_18x18.svg - ../images/viewer_toolbar/doubleMangaPage_18x18.svg - ../images/viewer_toolbar/fitToPage_18x18.svg - ../images/viewer_toolbar/flow_18x18.svg - ../images/viewer_toolbar/full_18x18.svg - ../images/viewer_toolbar/goto_18x18.svg - ../images/viewer_toolbar/help_18x18.svg - ../images/viewer_toolbar/info_18x18.svg - ../images/viewer_toolbar/magnifyingGlass_18x18.svg - ../images/viewer_toolbar/next_18x18.svg - ../images/viewer_toolbar/open_18x18.svg - ../images/viewer_toolbar/openFolder_18x18.svg - ../images/viewer_toolbar/openNext_18x18.svg - ../images/viewer_toolbar/openPrevious_18x18.svg - ../images/viewer_toolbar/options_18x18.svg - ../images/viewer_toolbar/previous_18x18.svg - ../images/viewer_toolbar/rotateL_18x18.svg - ../images/viewer_toolbar/rotateR_18x18.svg - ../images/viewer_toolbar/save_18x18.svg - ../images/viewer_toolbar/shortcuts_18x18.svg - ../images/viewer_toolbar/showBookmarks_18x18.svg - ../images/viewer_toolbar/toHeight_18x18.svg - ../images/viewer_toolbar/toWidth_18x18.svg - ../images/viewer_toolbar/translator_18x18.svg - ../images/viewer_toolbar/zoom_18x18.svg - - diff --git a/YACReader/yacreader_it.ts b/YACReader/yacreader_it.ts index 902b65ff0..5297c8025 100644 --- a/YACReader/yacreader_it.ts +++ b/YACReader/yacreader_it.ts @@ -9,6 +9,196 @@ Nessuno + + AddLabelDialog + + + Label name: + Nome etichetta: + + + + Choose a color: + Seleziona un colore: + + + + accept + Accetta + + + + cancel + Cancella + + + + AddLibraryDialog + + + Comics folder : + Cartella fumetti: + + + + Library name : + Nome della biblioteca: + + + + Add + Aggiungi + + + + Cancel + Annulla + + + + Add an existing library + Aggiungi ad una libreria esistente + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Prima di conneterti a "Comic Vine" devi avere la tua chiave API. Per favore recuperane una da <a href="http://www.comicvine.com/api/">QUI</a + + + + Paste here your Comic Vine API key + Incolla qui la tua chiave API di "Comic Vine" + + + + Accept + Accetta + + + + Cancel + Annulla + + + + AppearanceTabWidget + + + Color scheme + Combinazione di colori + + + + System + Sistema + + + + Light + Luce + + + + Dark + Buio + + + + Custom + Costume + + + + Remove + Rimuovere + + + + Remove this user-imported theme + Rimuovi questo tema importato dall'utente + + + + Light: + Leggero: + + + + Dark: + Buio: + + + + Custom: + Personalizzazione: + + + + Import theme... + Importa tema... + + + + Theme + Tema + + + + Theme editor + Redattore del tema + + + + Open Theme Editor... + Apri l'editor del tema... + + + + Theme editor error + Errore nell'editor del tema + + + + The current theme JSON could not be loaded. + Impossibile caricare il tema corrente JSON. + + + + Import theme + Importa tema + + + + JSON files (*.json);;All files (*) + File JSON (*.json);;Tutti i file (*) + + + + Could not import theme from: +%1 + Impossibile importare il tema da: +%1 + + + + Could not import theme from: +%1 + +%2 + Impossibile importare il tema da: +%1 + +%2 + + + + Import failed + Importazione non riuscita + + BookmarksDialog @@ -25,7 +215,7 @@ Click on any image to go to the bookmark - Click su qualsiasi immagine per andare al bookmark + Clicca su qualsiasi immagine per andare al segnalibro @@ -33,10 +223,204 @@ Ultima Pagina + + ClassicComicsView + + + Hide comic flow + Nascondi Comic Flow + + + + ComicModel + + + yes + Si + + + + no + No + + + + Title + Titolo + + + + File Name + Nome file + + + + Pages + Pagine + + + + Size + Dimensione + + + + Read + Leggi + + + + Current Page + Pagina corrente + + + + Publication Date + Data di pubblicazione + + + + Rating + Valutazione + + + + Series + Serie + + + + Volume + Tomo + + + + Story Arc + Arco narrativo + + + + ComicVineDialog + + + skip + Salta + + + + back + Indietro + + + + next + Prossimo + + + + search + Cerca + + + + close + Chiudi + + + + + comic %1 of %2 - %3 + Fumetto %1 di %2 - %3 + + + + + + Looking for volume... + Sto cercando il fumetto... + + + + %1 comics selected + Fumetto %1 selezionato + + + + Error connecting to ComicVine + Errore durante la connessione a ComicVine + + + + + Retrieving tags for : %1 + Ricezione tag per: %1 + + + + Retrieving volume info... + Sto ricevendo le informazioni per l'abum... + + + + Looking for comic... + Sto cercando il fumetto... + + + + ContinuousPageWidget + + + Loading page %1 + Caricamento pagina %1 + + + + CreateLibraryDialog + + + Comics folder : + Cartella fumetti: + + + + Library Name : + Nome libreria: + + + + Create + Crea + + + + Cancel + Annulla + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Creare una Libreria può aver bisogno di alcuni minuti. Puoi fermare il processo ed aggiornare la libreria più tardi. + + + + Create new library + Crea una nuova libreria + + + + Path not found + Percorso non trovato + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Il percorso selezionato non esiste oppure non è valido. Controlla di avere i permessi di scrittura per questa cartella + + EditShortcutsDialog - + Shortcut in use Scorciatoia in uso @@ -51,9 +435,9 @@ impostazione scorciatoie - - The shortcut "%1" is already assigned to other function - La scorciatoia "%1" è già assegnata ad un'altra funzione + + The shortcut "%1" is already assigned to other function + La scorciatoia "%1" è già assegnata ad un'altra funzione @@ -61,6 +445,124 @@ Per cambiare una scorciatoia doppio click sulla combinazione tasti e digita la nuova combinazione. + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Questa cartella non contiene ancora fumetti + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Per ora questa etichetta non contiene fumetti + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Per ora questa lista non contiene fumetti + + + + EmptySpecialListWidget + + + No favorites + Nessun Favorito + + + + You are not reading anything yet, come on!! + Non stai ancora leggendo nulla, Forza!! + + + + There are no recent comics! + Non ci sono fumetti recenti! + + + + ExportComicsInfoDialog + + + Output file : + File di Output: + + + + Create + Crea + + + + Cancel + Annulla + + + + Export comics info + Esporta informazioni fumetto + + + + Destination database name + Nome database di destinazione + + + + Problem found while writing + Trovato problema durante la scrittura + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Il percorso selezionato per il file di Output non esiste oppure non è valido. Controlla di avere i permessi di scrittura per questa cartella + + + + ExportLibraryDialog + + + Output folder : + Cartella di Output: + + + + Create + Crea + + + + Cancel + Annulla + + + + Create covers package + Crea pacchetto delle copertine + + + + Problem found while writing + Trovato problema durante la scrittura + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Il percorso selezionato per il file di Output non esiste oppure non è valido. Controlla di avere i permessi di scrittura per questa cartella + + + + Destination directory + Cartella di destinazione + + FileComic @@ -112,1266 +614,3404 @@ Page : Pagina: - - - GoToFlowToolBar + + + GoToFlowToolBar + + + Page : + Pagina: + + + + GridComicsView + + + Show info + Mostra informazioni + + + + HelpAboutDialog + + + Help + Aiuto + + + + System info + Informazioni di sistema + + + + About + Informazioni + + + + ImportComicsInfoDialog + + + Import comics info + Importa informazioni fumetto + + + + Info database location : + Informazioni posizione database: + + + + Import + Importa + + + + Cancel + Annulla + + + + Comics info file (*.ydb) + File informazioni fumetto (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nome libreria: + + + + Package location : + Posizione PAcchetto: + + + + Destination folder : + Cartella di destinazione: + + + + Unpack + Decomprimi + + + + Cancel + Annulla + + + + Extract a catalog + Estrai un catalogo + + + + Compresed library covers (*.clc) + Libreria di copertine compresse (*.clc) + + + + ImportWidget + + + stop + Ferma + + + + Some of the comics being added... + Alcuni fumetti che sto aggiungendo... + + + + Importing comics + Sto importando i fumetti + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YacReader sta creando una nuova libreria.</p><p>La creazione di una libreria può durare diversi minuti. Puoi fermare l'attività ed aggiornare la libreria più tardi, completando l'attività</p> + + + + Updating the library + Sto aggiornando la Libreria + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Quest alibreria si sta aggiornando. Per aggiornamenti più veloci aggiorna la tua libreria di frequente.</p><p>Puoi fermare il processo ed aggiornare la libreria più tardi.</p> + + + + Upgrading the library + Aggiornamento della biblioteca + + + + <p>The current library is being upgraded, please wait.</p> + <p>È in corso l'aggiornamento della libreria corrente, attendi.</p> + + + + Scanning the library + Scansione della libreria + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Scansione della libreria corrente per informazioni sui metadati XML legacy.</p><p>Questa operazione è necessaria solo una volta e solo se la libreria è stata creata con YACReaderLibrary 9.8.2 o versioni precedenti.</p> + + + + LibraryWindow + + + YACReader Library + Libreria YACReader + + + + + + comic + comico + + + + + + manga + Manga + + + + + + western manga (left to right) + manga occidentale (da sinistra a destra) + + + + + + web comic + fumetto web + + + + + + 4koma (top to botom) + 4koma (dall'alto verso il basso) + + + + + + + Set type + Imposta il tipo + + + + Library + Libreria + + + + Folder + Cartella + + + + Comic + Fumetto + + + + Upgrade failed + Aggiornamento non riuscito + + + + There were errors during library upgrade in: + Si sono verificati errori durante l'aggiornamento della libreria in: + + + + Update needed + Devi aggiornarmi + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Questa libreria è stata creata con una versione precedente di YACREaderLibrary. Deve essere aggiornata. Aggiorno ora? + + + + Download new version + Scarica la nuova versione + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Questa libreria è stata creata con una verisone più recente di YACReaderLibrary. Scarico la versione aggiornata ora? + + + + Library not available + Libreria non disponibile + + + + Library '%1' is no longer available. Do you want to remove it? + La libreria '%1' non è più disponibile, la vuoi cancellare? + + + + Old library + Vecchia libreria + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La libreria '%1' è stata creata con una versione precedente di YACREaderLibrary. Deve essere ricreata. Lo vuoi fare ora? + + + + + Copying comics... + Sto copiando i fumetti... + + + + + Moving comics... + Sto muovendo i fumetti... + + + + Add new folder + Aggiungi una nuova cartella + + + + Folder name: + Nome della cartella: + + + + No folder selected + Nessuna cartella selezionata + + + + Please, select a folder first + Per cortesia prima seleziona una cartella + + + + Error in path + Errore nel percorso + + + + There was an error accessing the folder's path + C'è stato un errore nell'accesso al percorso della cartella + + + + Delete folder + Cancella Cartella + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + La cartella seleziona e tutto il suo contenuto verranno cancellati dal tuo disco. Sei sicuro? + + + + + Unable to delete + Non posso cancellare + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + C'è stato un problema cancellando le cartelle selezionate. Per favore controlla i tuoi permessi di scrittura e sii sicuro che non ci siano altre applicazioni che usano le stesse cartelle. + + + + Add new reading lists + Aggiungi una lista di lettura + + + + + List name: + Nome lista: + + + + Delete list/label + Cancella Lista/Etichetta + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Gli elementi selezionati verranno cancellati, i tuoi fumetti o cartella NON verranno cancellati dal tuo disco. Sei sicuro? + + + + Rename list name + Rinomina la lista + + + + Open folder... + Apri Cartella... + + + + Update folder + Aggiorna Cartella + + + + Rescan library for XML info + Eseguire nuovamente la scansione della libreria per informazioni XML + + + + Set as uncompleted + Segna come non completo + + + + Set as completed + Segna come completo + + + + Set as read + Setta come letto + + + + + Set as unread + Setta come non letto + + + + Set custom cover + Imposta la copertina personalizzata + + + + Delete custom cover + Elimina la copertina personalizzata + + + + Save covers + Salva Copertine + + + + You are adding too many libraries. + Stai aggiungendto troppe librerie. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Stai aggiungendo troppe Libreire + +Hai probabilemnte bisogno di una sola Libreria al livello superiore, puoi poi navigare qualsiasi sotto cartella usando la selezione delle cartella a sinistra + +YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il numero di librerie basso. + + + + + YACReader not found + YACReader non trovato + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader non trovato. YACReader deve essere installato nella stessa cartella di YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader non trovato. Potrebbe esserci un problema con l'installazione di YACReader. + + + + Error + Errore + + + + Error opening comic with third party reader. + Errore nell'apertura del fumetto con un lettore di terze parti. + + + + Library not found + Libreria non trovata + + + + The selected folder doesn't contain any library. + La cartella selezionata non contiene nessuna Libreria. + + + + Are you sure? + Sei sicuro? + + + + Do you want remove + Vuoi rimuovere + + + + library? + Libreria? + + + + Remove and delete metadata + Rimuovi e cancella i Metadati + + + + Library info + Informazioni sulla biblioteca + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + C'è un problema nel cancellare i fumetti selezionati. Per favore controlla i tuoi permessi di scrittura sui file o sulla cartella. + + + + Assign comics numbers + Assegna un numero ai fumetti + + + + Assign numbers starting in: + Assegna numeri partendo da: + + + + Invalid image + Immagine non valida + + + + The selected file is not a valid image. + Il file selezionato non è un'immagine valida. + + + + Error saving cover + Errore durante il salvataggio della copertina + + + + There was an error saving the cover image. + Si è verificato un errore durante il salvataggio dell'immagine di copertina. + + + + Error creating the library + Errore creando la libreria + + + + Error updating the library + Errore aggiornando la libreria + + + + Error opening the library + Errore nell'apertura della libreria + + + + Delete comics + Cancella i fumetti + + + + All the selected comics will be deleted from your disk. Are you sure? + Tutti i fumetti selezionati saranno cancellati dal tuo disco. Sei sicuro? + + + + Remove comics + Rimuovi i fumetti + + + + Comics will only be deleted from the current label/list. Are you sure? + I fumetti verranno cancellati dall'etichetta/lista corrente. Sei sicuro? + + + + Library name already exists + Esiste già una libreria con lo stesso nome + + + + There is another library with the name '%1'. + Esiste già una libreria con il nome '%1'. + + + + LibraryWindowActions + + + Create a new library + Crea una nuova libreria + + + + Open an existing library + Apri una libreria esistente + + + + + Export comics info + Esporta informazioni fumetto + + + + + Import comics info + Importa informazioni fumetto + + + + Pack covers + Compatta Copertine + + + + Pack the covers of the selected library + Compatta le copertine della libreria selezionata + + + + Unpack covers + Scompatta le Copertine + + + + Unpack a catalog + Scompatta un catalogo + + + + Update library + Aggiorna Libreria + + + + Update current library + Aggiorna la Libreria corrente + + + + Rename library + Rinomina la libreria + + + + Rename current library + Rinomina la libreria corrente + + + + Remove library + Rimuovi la libreria + + + + Remove current library from your collection + Rimuovi la libreria corrente dalla tua collezione + + + + Rescan library for XML info + Eseguire nuovamente la scansione della libreria per informazioni XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Cerca di trovare informazioni XML incorporate nei file dei fumetti. Devi farlo solo se la libreria è stata creata con la versione 9.8.2 o precedente o se utilizzi software di terze parti per incorporare informazioni XML nei file. + + + + Show library info + Mostra informazioni sulla biblioteca + + + + Show information about the current library + Mostra informazioni sulla libreria corrente + + + + Open current comic + Apri il fumetto corrente + + + + Open current comic on YACReader + Apri il fumetto corrente con YACReader + + + + Save selected covers to... + Salva le copertine selezionate in... + + + + Save covers of the selected comics as JPG files + Salva le copertine dei fumetti selezionati come file JPG + + + + + Set as read + Setta come letto + + + + Set comic as read + Setta il fumetto come letto + + + + + Set as unread + Setta come non letto + + + + Set comic as unread + Setta il fumetto come non letto + + + + + manga + Manga + + + + Set issue as manga + Imposta il problema come manga + + + + + comic + comico + + + + Set issue as normal + Imposta il problema come normale + + + + western manga + manga occidentali + + + + Set issue as western manga + Imposta il problema come manga occidentale + + + + + web comic + fumetto web + + + + Set issue as web comic + Imposta il problema come fumetto web + + + + + yonkoma + Yonkoma + + + + Set issue as yonkoma + Imposta il problema come Yonkoma + + + + Show/Hide marks + Mostra/Nascondi + + + + Show or hide read marks + Mostra o nascondi lo stato di lettura + + + + Show/Hide recent indicator + Mostra/Nascondi l'indicatore recente + + + + Show or hide recent indicator + Mostra o nascondi l'indicatore recente + + + + + Fullscreen mode on/off + Modalità a schermo interno on/off + + + + Help, About YACReader + Aiuto, crediti YACReader + + + + Add new folder + Aggiungi una nuova cartella + + + + Add new folder to the current library + Aggiungi una nuova cartella alla libreria corrente + + + + Delete folder + Cancella Cartella + + + + Delete current folder from disk + Cancella la cartella corrente dal disco + + + + Select root node + Seleziona il nodo principale + + + + Expand all nodes + Espandi tutti i nodi + + + + Collapse all nodes + Compatta tutti i nodi + + + + Show options dialog + Mostra le opzioni + + + + Show comics server options dialog + Mostra le opzioni per il server dei fumetti + + + + + Change between comics views + Cambia tra i modi di visualizzazione dei fumetti + + + + Open folder... + Apri Cartella... + + + + Set as uncompleted + Segna come non completo + + + + Set as completed + Segna come completo + + + + Set custom cover + Imposta la copertina personalizzata + + + + Delete custom cover + Elimina la copertina personalizzata + + + + western manga (left to right) + manga occidentale (da sinistra a destra) + + + + Open containing folder... + Apri la cartella dei contenuti... + + + + Reset comic rating + Resetta la valutazione dei fumetti + + + + Select all comics + Seleziona tutti i fumetti + + + + Edit + Edita + + + + Assign current order to comics + Assegna l'ordinamento corrente ai fumetti + + + + Update cover + Aggiorna copertina + + + + Delete selected comics + Cancella i fumetti selezionati + + + + Delete metadata from selected comics + Elimina i metadati dai fumetti selezionati + + + + Download tags from Comic Vine + Scarica i Tag da Comic Vine + + + + Focus search line + Mettere a fuoco la linea di ricerca + + + + Focus comics view + Focus sulla visualizzazione dei fumetti + + + + Edit shortcuts + Edita scorciatoie + + + + &Quit + &Esci + + + + Update folder + Aggiorna Cartella + + + + Update current folder + Aggiorna la cartella corrente + + + + Scan legacy XML metadata + Scansione dei metadati XML legacy + + + + Add new reading list + Aggiorna la lista di lettura + + + + Add a new reading list to the current library + Aggiungi una lista di lettura alla libreria corrente + + + + Remove reading list + Rimuovi la lista di lettura + + + + Remove current reading list from the library + Rimuovi la lista di lettura dalla libreria + + + + Add new label + Aggiungi una nuova etichetta + + + + Add a new label to this library + Aggiungi una nuova etichetta a questa libreria + + + + Rename selected list + Rinomina la lista selezionata + + + + Rename any selected labels or lists + Rinomina qualsiasi etichetta o lista selezionata + + + + Add to... + Aggiungi a... + + + + Favorites + Favoriti + + + + Add selected comics to favorites list + Aggiungi i fumetti selezionati alla lista dei favoriti + + + + LocalComicListModel + + + file name + Nome file + + + + MainWindowViewer + + Go + Vai + + + Edit + Edita + + + File + Documento + + + Help + Aiuto + + + Save + Salva + + + View + Mostra + + + &File + &Documento + + + &Next + &Prossimo + + + &Open + &Apri + + + Clear + Cancella + + + Close + Chiudi + + + Open Comic + Apri Fumetto + + + Go To + Vai a + + + Zoom+ + Aumenta + + + Zoom- + Riduci + + + Open image folder + Apri la crettal immagini + + + Size down magnifying glass + Riduci lente ingrandimento + + + Zoom out magnifying glass + Riduci in lente di ingrandimento + + + Open latest comic + Apri l'ultimo fumetto + + + Autoscroll up + Autoscorri Sù + + + Set bookmark + Imposta Segnalibro + + + page_%1.jpg + Pagina_%1.jpg + + + Autoscroll forward, vertical first + Autoscorri avanti, priorità Verticale + + + Switch to double page mode + Passa alla modalità doppia pagina + + + Save current page + Salva la pagina corrente + + + Size up magnifying glass + Ingrandisci lente ingrandimento + + + Double page mode + Modalita doppia pagina + + + Move up + Muovi Sù + + + Switch Magnifying glass + Passa a lente ingrandimento + + + Open Folder + Apri una cartella + + + Comics + Fumetto + + + Fit Height + Adatta altezza + + + Autoscroll backward, vertical first + Autoscorri indietro, priorità Verticale + + + Comic files + File Fumetto + + + Not now + Non ora + + + Go to the first page + Vai alla pagina iniziale + + + Go to previous page + Vai alla pagina precedente + + + Window + Finestra + + + Open the latest comic opened in the previous reading session + Apri l'ultimo fumetto aperto nella sessione precedente + + + Open a comic + Apri un Fumetto + + + Image files (*.jpg) + File immagine (*.jpg) + + + Next Comic + Prossimo fumetto + + + Fit Width + Adatta Larghezza + + + Options + Opzioni + + + Show Info + Mostra info + + + Open folder + Apri cartella + + + Go to page ... + Vai a Pagina ... + + + Magnifiying glass + Lente ingrandimento + + + Fit image to width + Adatta immagine in larghezza + + + Toggle fullscreen mode + Attiva/Disattiva schermo intero + + + Toggle between fit to width and fit to height + Passa tra adatta in larghezza ad altezza + + + Move right + Muovi Destra + + + Zoom in magnifying glass + Ingrandisci in lente di ingrandimento + + + Open recent + Apri i recenti + + + Reading + Leggi + + + &Previous + &Precedente + + + Autoscroll forward, horizontal first + Autoscorri avanti, priorità Orizzontale + + + Go to next page + Vai alla prossima Pagina + + + Show keyboard shortcuts + Mostra scorciatoie da tastiera + + + Double page manga mode + Modalità doppia pagina Manga + + + There is a new version available + Nuova versione disponibile + + + Autoscroll down + Autoscorri Giù + + + Open next comic + Apri il prossimo fumetto + + + Remind me in 14 days + Ricordamelo in 14 giorni + + + Fit to page + Adatta alla pagina + + + Show bookmarks + Mostra segnalibro + + + Open previous comic + Apri il fumetto precendente + + + Rotate image to the left + Ruota immagine a sinistra + + + Fit image to height + Adatta immagine all'altezza + + + Reset zoom + Resetta Zoom + + + Show the bookmarks of the current comic + Mostra il segnalibro del fumetto corrente + + + Show Dictionary + Mostra dizionario + + + Move down + Muovi Giù + + + Move left + Muovi Sinistra + + + Reverse reading order in double page mode + Ordine lettura inverso in modo doppia pagina + + + YACReader options + Opzioni YACReader + + + Clear open recent list + Svuota la lista degli aperti + + + Help, About YACReader + Aiuto, crediti YACReader + + + Show go to flow + Mostra "Vai a Comic Flow" + + + Previous Comic + Fumetto precendente + + + Show full size + Mostra dimesioni reali + + + Hide/show toolbar + Mostra/Nascondi Barra strumenti + + + Magnifying glass + Lente ingrandimento + + + Edit shortcuts + Edita scorciatoie + + + General + Generale + + + Set a bookmark on the current page + Imposta segnalibro a pagina corrente + + + Page adjustement + Correzioni di pagna + + + Show zoom slider + Mostra cursore di zoom + + + Go to the last page + Vai all'ultima pagina + + + Do you want to download the new version? + Vuoi scaricare la nuova versione? + + + Rotate image to the right + Ruota immagine a destra + + + Always on top + Sempre in primo piano + + + Autoscroll backward, horizontal first + Autoscorri indietro, priorità Orizzontale + + + + NoLibrariesWidget + + + You don't have any libraries yet + Per ora non hai ancora nessuna libreria + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Puoi creare una libreria in qualsiasi cartella, YACReader importerà tutti i fumetti e struttura da questa certella. Se hai creato una qualsiasia libreria nel passato la puoi aprire. </p><p>Non dimenticare che puoi usare YACReader come applicazione stand alone per leggere i fumetti sul tuo PC.</p> + + + + create your first library + Crea la tua prima libreria + + + + add an existing one + Aggiungine una esistente + + + + NoSearchResultsWidget + + + No results + Nessun risultato + + + + OptionsDialog + + + Gamma + Valore gamma + + + + Reset + Resetta + + + + My comics path + Percorso dei miei fumetti + + + + Image adjustment + Correzioni immagine + + + + "Go to flow" size + Dimensione di "Vai a Comic Flow" + + + + Choose + Scegli + + + + Image options + Opzione immagine + + + + Contrast + Contrasto + + + + + Libraries + Librerie + + + + Comic Flow + Comic Flow + + + + Grid view + Vista a Griglia + + + + + Appearance + Aspetto + + + + + Options + Opzioni + + + + + Language + Lingua + + + + + Application language + Lingua dell'applicazione + + + + + System default + Predefinita del sistema + + + + Tray icon settings (experimental) + Impostazioni dell'icona nella barra delle applicazioni (sperimentale) + + + + Close to tray + Vicino al vassoio + + + + Start into the system tray + Inizia nella barra delle applicazioni + + + + Edit Comic Vine API key + Edita l'API di ComicVine + + + + Comic Vine API key + API di ComicVine + + + + ComicInfo.xml legacy support + Supporto legacy ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importa metadati da ComicInfo.xml quando aggiungi nuovi fumetti + + + + Consider 'recent' items added or updated since X days ago + Considera gli elementi "recenti" aggiunti o aggiornati da X giorni fa + + + + Third party reader + Lettore di terze parti + + + + Write {comic_file_path} where the path should go in the command + Scrivi {comic_file_path} dove dovrebbe andare il percorso nel comando + + + + + Clear + Cancella + + + + Update libraries at startup + Aggiorna le librerie all'avvio + + + + Try to detect changes automatically + Prova a rilevare automaticamente le modifiche + + + + Update libraries periodically + Aggiorna periodicamente le librerie + + + + Interval: + Intervallo: + + + + 30 minutes + 30 minuti + + + + 1 hour + 1 ora + + + + 2 hours + 2 ore + + + + 4 hours + 4 ore + + + + 8 hours + 8 ore + + + + 12 hours + 12 ore + + + + daily + quotidiano + + + + Update libraries at certain time + Aggiorna le librerie in determinati orari + + + + Time: + Tempo: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + AVVERTIMENTO! Durante gli aggiornamenti della libreria le scritture sul database sono disabilitate! +Non pianificare gli aggiornamenti mentre potresti utilizzare l'app attivamente. +Durante gli aggiornamenti automatici l'app bloccherà alcune azioni fino al termine dell'aggiornamento. +Per interrompere un aggiornamento automatico, tocca l'indicatore di caricamento accanto al titolo Librerie. + + + + Modifications detection + Rilevamento delle modifiche + + + + Compare the modified date of files when updating a library (not recommended) + Confronta la data di modifica dei file durante l'aggiornamento di una libreria (non consigliato) + + + + Enable background image + Abilita l'immagine di sfondo + + + + Opacity level + Livello di opacità + + + + Blur level + Livello di sfumatura + + + + Use selected comic cover as background + Usa la cover del fumetto selezionato come sfondo + + + + Restore defautls + Resetta al Default + + + + Background + Sfondo + + + + Display continue reading banner + Visualizza il banner continua a leggere + + + + Display current comic banner + Visualizza il banner del fumetto corrente + + + + Continue reading + Continua a leggere + + + + Comics directory + Cartella Fumetti + + + + Quick Navigation Mode + Modo navigazione rapida + + + + Display + Visualizzazione + + + + Show time in current page information label + Mostra l'ora nell'etichetta delle informazioni della pagina corrente + + + + Background color + Colore di sfondo + + + + Scroll behaviour + Comportamento di scorrimento + + + + Disable scroll animations and smooth scrolling + Disabilita le animazioni di scorrimento e lo scorrimento fluido + + + + Do not turn page using scroll + Non voltare pagina utilizzando lo scorrimento + + + + Use single scroll step to turn page + Utilizzare un singolo passaggio di scorrimento per voltare pagina + + + + Mouse mode + Modalità mouse + + + + Only Back/Forward buttons can turn pages + Solo i pulsanti Indietro/Avanti possono girare le pagine + + + + Use the Left/Right buttons to turn pages. + Utilizzare i pulsanti Sinistra/Destra per girare le pagine. + + + + Click left or right half of the screen to turn pages. + Fare clic sulla metà sinistra o destra dello schermo per girare le pagine. + + + + Disable mouse over activation + Disabilita il mouse all'attivazione + + + + Scaling + Ridimensionamento + + + + Scaling method + Metodo di scala + + + + Nearest (fast, low quality) + Più vicino (veloce, bassa qualità) + + + + Bilinear + Bilineare + + + + Lanczos (better quality) + Lanczos (qualità migliore) + + + + Page Flow + Flusso pagine + + + + + General + Generale + + + + Brightness + Luminosità + + + + + Restart is needed + Riavvio Necessario + + + + Fit options + Opzioni di adattamento + + + + Enlarge images to fit width/height + Ingrandisci le immagini per adattarle alla larghezza/altezza + + + + Double Page options + Opzioni doppia pagina + + + + Show covers as single page + Mostra le copertine come pagina singola + + + + PropertiesDialog + + + General info + Informazioni generali + + + + Plot + Trama + + + + Authors + Autori + + + + Publishing + Pubblicazione + + + + Notes + Note + + + + Cover page + Pagina Copertina + + + + Load previous page as cover + Carica la pagina precedente come copertina + + + + Load next page as cover + Carica la pagina successiva come copertina + + + + Reset cover to the default image + Ripristina la copertina sull'immagine predefinita + + + + Load custom cover image + Carica l'immagine di copertina personalizzata + + + + Series: + Serie: + + + + Title: + Titolo: + + + + + + of: + Di: + + + + Issue number: + Numeri emessi: + + + + Volume: + Album: + - - Page : - Pagina: + + Arc number: + Numero dell'arco: - - - HelpAboutDialog - - Help - Aiuto + + Story arc: + Arco Narrativo: - - System info - + + alt. number: + alt. numero: - - About - About + + Alternate series: + Serie alternative: - - - LogWindow - - Log window - + + Series Group: + Gruppo di serie: - - &Pause - + + Genre: + Genere: - - &Save - + + Size: + Dimesioni: - - C&lear - + + Writer(s): + Scrittore(i): - - &Copy - + + Penciller(s): + Mine: - - Level: - + + Inker(s): + Inchiostratore(i): - - &Auto scroll - + + Colorist(s): + Colorista(i): - - - MainWindowViewer - Go - Vai + + Letterer(s): + Letterista(i): - Edit - Edit + + Cover Artist(s): + Artista(i) copertina: - File - File + + Editor(s): + Redattore(i): - Help - Aiuto + + Imprint: + Impronta: - Save - Salva + + Day: + Giorno: - View - Mostra + + Month: + Mese: - &File - &File + + Year: + Anno: - &Next - &Prossimo + + Publisher: + Editore: - &Open - &Apri + + Format: + Formato: - Clear - Cancella + + Color/BW: + Colore o B/N: - Close - Chiudi + + Age rating: + Valutazione età: - Open Comic - Apri Fumetto + + Type: + Tipo: - Go To - Vai a + + Language (ISO): + Lingua (ISO): - Zoom+ - Zoom+ + + Synopsis: + Sinossi: - Zoom- - Zoom- + + Characters: + Personaggi: - Open image folder - Apri la crettal immagini + + Teams: + Squadre: - Size down magnifying glass - Riduci lente ingrandimento + + Locations: + Posizioni: - Zoom out magnifying glass - Riduci in lente di ingrandimento + + Main character or team: + Personaggio principale o squadra: - Open latest comic - Apri l'ultimo fumetto + + Review: + Revisione: - Autoscroll up - Autoscorri Sù + + Notes: + Note: - Set bookmark - Imposta Segnalibro + + Tags: + tag: - page_%1.jpg - Pagina_%1.jpg + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Vai </a> - Autoscroll forward, vertical first - Autoscorri avanti, priorità Verticale + + Not found + Non trovato - Switch to double page mode - Passa alla modalità doppia pagina + + Comic not found. You should update your library. + Fumetto non trovato, dovresti aggiornare la Libreria. - Save current page - Salva la pagina corrente + + Edit comic information + Edita le informazioni del fumetto - Size up magnifying glass - Ingrandisci lente ingrandimento + + Edit selected comics information + Edita le informazioni del fumetto selezionato - Double page mode - Modalita doppia pagina + + Invalid cover + Copertina non valida - Move up - Muovi Sù + + The image is invalid. + L'immagine non è valida. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer è la versione headless (senza GUI) di YACReaderLibrary. + +Questa applicazione supporta le impostazioni persistenti, per configurarle modifica questo file %1 +Per conoscere le impostazioni disponibili, consultare la documentazione su https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + QObject - Switch Magnifying glass - Passa a lente ingrandimento + + 7z lib not found + Libreria 7z non trovata - Open Folder - Apri una cartella + + unable to load 7z lib from ./utils + Impossibile caricare 7z da ./utils - Comics - Fumetto + + Trace + Traccia - Fit Height - Adatta altezza + + Debug + Diagnostica - Autoscroll backward, vertical first - Autoscorri indietro, priorità Verticale + + Info + Informazioni - Comic files - File Fumetto + + Warning + Avvertimento - Not now - Non ora + + Error + Errore - Go to the first page - Vai alla pagina iniziale + + Fatal + Fatale - Go to previous page - Vai alla pagina precedente + + Select custom cover + Seleziona la copertina personalizzata - Window - Finestra + + Images (%1) + Immagini (%1) - Open the latest comic opened in the previous reading session - Apri l'ultimo fumetto aperto nella sessione precedente + + The file could not be read or is not valid JSON. + Impossibile leggere il file o non è un JSON valido. - Open a comic - Apri un Fumetto + + This theme is for %1, not %2. + Questo tema è per %1, non %2. - Image files (*.jpg) - File immagine (*.jpg) + + Libraries + Librerie - Next Comic - Prossimo fumetto + + Folders + Cartelle - Fit Width - Adatta Larghezza + + Reading Lists + Lista di lettura + + + RenameLibraryDialog - Options - Opzioni + + New Library Name : + Nome della nuova libreria: - Show Info - Mostra info + + Rename + Rinomina - Open folder - Apri cartella + + Cancel + Annulla - Go to page ... - Vai a Pagina ... + + Rename current library + Rinomina la libreria corrente + + + ScraperResultsPaginator - Magnifiying glass - Lente ingrandimento + + Number of volumes found : %1 + Numero di volumi trovati: %1 - Fit image to width - Adatta immagine in larghezza + + + page %1 of %2 + pagina %1 di %2 - Toggle fullscreen mode - Attiva/Disattiva schermo intero + + Number of %1 found : %2 + Numero di %1 trovati; %2 + + + SearchSingleComic - Toggle between fit to width and fit to height - Passa tra adatta in larghezza ad altezza + + Please provide some additional information for this comic. + Per favore aggiugi informazioni addizionali. - Move right - Muovi Destra + + Series: + Serie: - Zoom in magnifying glass - Ingrandisci in lente di ingrandimento + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Utilizza la ricerca con corrispondenza esatta. Disabilitare se si desidera trovare volumi che corrispondono ad alcune delle parole nel nome. + + + SearchVolume - Open recent - Apri i recenti + + Please provide some additional information. + Per favore aggiugi informazioni addizionali. - Reading - Leggi + + Series: + Serie: - &Previous - &Precedente + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Utilizza la ricerca con corrispondenza esatta. Disabilitare se si desidera trovare volumi che corrispondono ad alcune delle parole nel nome. + + + SelectComic - Autoscroll forward, horizontal first - Autoscorri avanti, priorità Orizzontale + + Please, select the right comic info. + Per favore seleziona le informazioni corrette per il fumetto. - Go to next page - Vai alla prossima Pagina + + comics + Fumetti - Show keyboard shortcuts - Mostra scorciatoie da tastiera + + loading cover + Caricamento copertine - Double page manga mode - Modalità doppia pagina Manga + + loading description + Caricamento descrizione - There is a new version available - Nuova versione disponibile + + comic description unavailable + descrizione del fumetto non disponibile + + + SelectVolume - Autoscroll down - Autoscorri Giù + + Please, select the right series for your comic. + Per favore seleziona la serie corretta per il fumetto. - Open next comic - Apri il prossimo fumetto + + Filter: + Filtro: - Remind me in 14 days - Ricordamelo in 14 giorni + + volumes + Volumi - Fit to page - Adatta alla pagina + + Nothing found, clear the filter if any. + Non è stato trovato nulla, cancella il filtro se presente. - Show bookmarks - Mostra segnalibro + + loading cover + Caricamento copertine - Open previous comic - Apri il fumetto precendente + + loading description + Caricamento descrizione - Rotate image to the left - Ruota immagine a sinistra + + volume description unavailable + descrizione del volume non disponibile + + + SeriesQuestion - Fit image to height - Adatta immagine all'altezza + + You are trying to get information for various comics at once, are they part of the same series? + Stai cercando di recuperare informazioni per diversi fumetti in una sola volta, sono parte della stessa serie? - Reset zoom - Resetta Zoom + + yes + Si - Show the bookmarks of the current comic - Mostra il segnalibro del fumetto corrente + + no + No + + + ServerConfigDialog - Show Dictionary - Mostra dizionario + + set port + Configura porta - Move down - Muovi Giù + + Server connectivity information + Informazioni sulla connettività del server - Move left - Muovi Sinistra + + Scan it! + Scansiona! - Reverse reading order in double page mode - Ordine lettura inverso in modo doppia pagina + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader è disponibile per dispositivi iOS e Android.<br/>Scoprilo per <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> o <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - YACReader options - Opzioni YACReader + + Choose an IP address + Scegli un indirizzo IP - Clear open recent list - Svuota la lista degli aperti + + Port + Porta - Help, About YACReader - Aiuto, crediti YACReader + + enable the server + Abilita il server + + + ShortcutsDialog - Show go to flow - Mostra vai all'elenco + Close + Chiudi - Previous Comic - Fumetto precendente + YACReader keyboard shortcuts + Scorciatoie da tastiera di YACReader - Show full size - Mostra dimesioni reali + Keyboard Shortcuts + Scorciatoia da tastiera + + + SortVolumeComics - Hide/show toolbar - Mostra/Nascondi Barra strumenti + + Please, sort the list of comics on the left until it matches the comics' information. + Per favore ordina la lista dei fumetti a sinistra sino a che corrisponde alle informazioni dei fumetti. - Magnifying glass - Lente ingrandimento + + sort comics to match comic information + Ordina i fumetti per far corrispondere le informazioni - Edit shortcuts - Edita scorciatoie + + issues + Emissione - General - Generale + + remove selected comics + Rimuovi i fumetti selezionati - Set a bookmark on the current page - Imposta segnalibro a pagina corrente + + restore all removed comics + Ripristina tutti i fumetti rimossi + + + ThemeEditorDialog - Page adjustement - Correzioni di pagna + + Theme Editor + Redattore del tema - Show zoom slider - Mostra cursore di zoom + + + + + - Go to the last page - Vai all'ultima pagina + + - + - - Do you want to download the new version? - Vuoi scaricare la nuova versione? + + i + io - Rotate image to the right - Ruota immagine a destra + + Expand all + Espandi tutto - Always on top - Sempre in primo piano + + Collapse all + Comprimi tutto - Autoscroll backward, horizontal first - Autoscorri indietro, priorità Orizzontale + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Tieni premuto per far lampeggiare il valore selezionato nell'interfaccia utente (magenta / alternato / 0↔10). Le versioni ripristinano l'originale. - - - OptionsDialog - - Gamma - Gamma + + Search… + Ricerca… - - Reset - Reset + + Light + Luce - - My comics path - Percorso dei miei fumetti + + Dark + Buio - - Image adjustment - Correzioni immagine + + ID: + Identificativo: - - "Go to flow" size - Dimensione "Vai all'elenco" + + Display name: + Nome da visualizzare: - - Choose - Scegli + + Variant: + Variante: - - Image options - Opzione immagine + + Theme info + Informazioni sul tema - - Contrast - Contrasto + + Parameter + Parametro - - Options - Opzioni + + Value + Valore - - Comics directory - Cartella Fumetti + + Save and apply + Salva e applica - - Quick Navigation Mode - Modo navigazione rapida + + Export to file... + Esporta su file... - - Display - + + Load from file... + Carica da file... - - Show time in current page information label - + + Close + Chiudi - - Background color - Colore di sfondo + + Double-click to edit color + Fare doppio clic per modificare il colore - - Scroll behaviour - + + + + + + + true + VERO - - Disable scroll animations and smooth scrolling - + + + + + false + falso - - Do not turn page using scroll - + + Double-click to toggle + Fare doppio clic per attivare/disattivare - - Use single scroll step to turn page - + + Double-click to edit value + Fare doppio clic per modificare il valore - - Mouse mode - + + + + Edit: %1 + Modifica: %1 - - Only Back/Forward buttons can turn pages - + + Save theme + Salva tema - - Use the Left/Right buttons to turn pages. - + + + JSON files (*.json);;All files (*) + File JSON (*.json);;Tutti i file (*) - - Click left or right half of the screen to turn pages. - + + Save failed + Salvataggio non riuscito - - Disable mouse over activation - Disabilita il mouse all'attivazione + + Could not open file for writing: +%1 + Impossibile aprire il file per la scrittura: +%1 - - Page Flow - Flusso pagine + + Load theme + Carica tema - - General - Generale + + + + Load failed + Caricamento non riuscito - - Brightness - Luminosità + + Could not open file: +%1 + Impossibile aprire il file: +%1 - - Restart is needed - Riavvio Necessario + + Invalid JSON: +%1 + JSON non valido: +%1 - - Fit options - + + Expected a JSON object. + Era previsto un oggetto JSON. + + + + TitleHeader + + + SEARCH + CERCA + + + UpdateLibraryDialog - - Enlarge images to fit width/height - + + Updating.... + Aggiornamento... - - Double Page options - + + Cancel + Annulla - - Show covers as single page - + + Update library + Aggiorna Libreria - QObject + Viewer - - 7z lib not found - Libreria 7z non trovata + + Page not available! + Pagina non disponibile! - - unable to load 7z lib from ./utils - Impossibile caricare 7z da ./utils + + + Press 'O' to open comic. + Premi "O" per aprire il fumettto. - - Trace - + + Error opening comic + Errore nell'apertura - - Debug - + + Cover! + Copertina! - - Info - + + CRC Error + Errore CRC - - Warning - + + Comic not found + Fumetto non trovato - - Error - + + Not found + Non trovato - - Fatal - + + Last page! + Ultima pagina! - - Select custom cover - + + Loading...please wait! + In caricamento...Attendi! + + + VolumeComicsModel - - Images (%1) - + + title + Titolo - QsLogging::LogWindowModel + VolumesModel - - Time - + + year + Anno - - Level - + + issues + Emissione - - Message - + + publisher + Pubblicato da - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - + + Presets: + Preselezioni: - - &Resume - + + Classic look + Aspetto Classico - - Save log - + + Stripe look + Aspetto a strisce - - Log file (*.log) - + + Overlapped Stripe look + Aspetto a strisce sovrapposto - - - ShortcutsDialog - Close - Chiudi + + Modern look + Aspetto moderno - YACReader keyboard shortcuts - Scorciatoie da tastiera di YACReader + + Roulette look + Aspetto Roulette - Keyboard Shortcuts - Scorciatoia da tastiera + + Show advanced settings + Mostra opzioni avanzate - - - Viewer - - Page not available! - Pagina non disponibile! + + Custom: + Personalizzazione: - - - Press 'O' to open comic. - Premi "O" per aprire il fumettto. + + View angle + Angolo di vista - - Error opening comic - Errore nell'apertura + + Position + Posizione - - Cover! - Copertina! + + Cover gap + Distanza Copertine - - CRC Error - Errore CRC + + Central gap + Distanza centrale - - Comic not found - Fumetto non trovato + + Zoom + Ingrandimento - - Not found - Non trovato + + Y offset + Compensazione Y - - Last page! - Ultima pagina! + + Z offset + Compensazione Z - - Loading...please wait! - In caricamento...Attendi! + + Cover Angle + Angolo copertine + + + + Visibility + Visibilità + + + + Light + Luce + + + + Max angle + Angolo massimo + + + + Low Performance + Prestazioni Basse + + + + High Performance + Prestazioni Alte + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Usa VSync (migliora la qualtà a tutto schermo, peggiora le prestazioni) + + + + Performance: + Prestazioni: YACReader::MainWindowViewer - + &Open - &Apri + &Apri - + Open a comic - Apri un Fumetto + Apri un Fumetto - + New instance - + Nuova istanza - + Open Folder - Apri una cartella + Apri una cartella - + Open image folder - Apri la crettal immagini + Apri la crettal immagini - + Open latest comic - Apri l'ultimo fumetto + Apri l'ultimo fumetto - + Open the latest comic opened in the previous reading session - Apri l'ultimo fumetto aperto nella sessione precedente + Apri l'ultimo fumetto aperto nella sessione precedente - + Clear - Cancella + Cancella - + Clear open recent list - Svuota la lista degli aperti + Svuota la lista degli aperti - + Save - Salva + Salva - + Save current page - Salva la pagina corrente + Salva la pagina corrente Previous Comic - Fumetto precendente + Fumetto precendente - - - + + + Open previous comic - Apri il fumetto precendente + Apri il fumetto precendente - + Next Comic - Prossimo fumetto + Prossimo fumetto - - - + + + Open next comic - Apri il prossimo fumetto + Apri il prossimo fumetto - + &Previous - &Precedente + &Precedente - - - + + + Go to previous page - Vai alla pagina precedente + Vai alla pagina precedente - + &Next - &Prossimo + &Prossimo - - - + + + Go to next page - Vai alla prossima Pagina + Vai alla prossima Pagina - + Fit Height - Adatta altezza + Adatta altezza - + Fit image to height - Adatta immagine all'altezza + Adatta immagine all'altezza - + Fit Width - Adatta Larghezza + Adatta Larghezza - + Fit image to width - Adatta immagine in larghezza + Adatta immagine in larghezza - + Show full size - Mostra dimesioni reali + Mostra dimesioni reali - + Fit to page - Adatta alla pagina + Adatta alla pagina + + + + Continuous scroll + Scorrimento continuo + + + + Switch to continuous scroll mode + Passa alla modalità di scorrimento continuo - + Reset zoom - Resetta Zoom + Resetta Zoom - + Show zoom slider - Mostra cursore di zoom + Mostra cursore di zoom - + Zoom+ - Zoom+ + Aumenta - + Zoom- - Zoom- + Riduci - + Rotate image to the left - Ruota immagine a sinistra + Ruota immagine a sinistra - + Rotate image to the right - Ruota immagine a destra + Ruota immagine a destra - + Double page mode - Modalita doppia pagina + Modalita doppia pagina - + Switch to double page mode - Passa alla modalità doppia pagina + Passa alla modalità doppia pagina - + Double page manga mode - Modalità doppia pagina Manga + Modalità doppia pagina Manga - + Reverse reading order in double page mode - Ordine lettura inverso in modo doppia pagina + Ordine lettura inverso in modo doppia pagina - + Go To - Vai a + Vai a - + Go to page ... - Vai a Pagina ... + Vai a Pagina ... - + Options - Opzioni + Opzioni - + YACReader options - Opzioni YACReader + Opzioni YACReader - - + + Help - Aiuto + Aiuto - + Help, About YACReader - Aiuto, crediti YACReader + Aiuto, crediti YACReader - + Magnifying glass - Lente ingrandimento + Lente ingrandimento - + Switch Magnifying glass - Passa a lente ingrandimento + Passa a lente ingrandimento - + Set bookmark - Imposta Segnalibro + Imposta Segnalibro - + Set a bookmark on the current page - Imposta segnalibro a pagina corrente + Imposta segnalibro a pagina corrente - + Show bookmarks - Mostra segnalibro + Mostra segnalibro - + Show the bookmarks of the current comic - Mostra il segnalibro del fumetto corrente + Mostra il segnalibro del fumetto corrente - + Show keyboard shortcuts - Mostra scorciatoie da tastiera + Mostra scorciatoie da tastiera - + Show Info - Mostra info + Mostra info - + Close - Chiudi + Chiudi - + Show Dictionary - Mostra dizionario + Mostra dizionario - + Show go to flow - Mostra vai all'elenco + Mostra "Vai a Comic Flow" - + Edit shortcuts - + Edita scorciatoie - + &File - &File + &Documento - - + + Open recent - Apri i recenti + Apri i recenti - + File - File + Documento - + Edit - Edit + Edita - + View - Mostra + Mostra - + Go - Vai + Vai - + Window - Finestra + Finestra - - - + + + Open Comic - Apri Fumetto + Apri Fumetto - - - + + + Comic files - File Fumetto + File Fumetto - + Open folder - Apri cartella + Apri cartella - + page_%1.jpg - Pagina_%1.jpg + Pagina_%1.jpg - + Image files (*.jpg) - File immagine (*.jpg) + File immagine (*.jpg) + Comics - Fumetto + Fumetto Toggle fullscreen mode - Attiva/Disattiva schermo intero + Attiva/Disattiva schermo intero Hide/show toolbar - Mostra/Nascondi Barra strumenti + Mostra/Nascondi Barra strumenti + General - Generale + Generale Size up magnifying glass - Ingrandisci lente ingrandimento + Ingrandisci lente ingrandimento Size down magnifying glass - Riduci lente ingrandimento + Riduci lente ingrandimento Zoom in magnifying glass - Ingrandisci in lente di ingrandimento + Ingrandisci in lente di ingrandimento Zoom out magnifying glass - Riduci in lente di ingrandimento + Riduci in lente di ingrandimento Reset magnifying glass - + Reimposta la lente d'ingrandimento + Magnifiying glass - Lente ingrandimento + Lente ingrandimento Toggle between fit to width and fit to height - Passa tra adatta in larghezza ad altezza + Passa tra adatta in larghezza ad altezza + Page adjustement - Correzioni di pagna + Correzioni di pagna - + Autoscroll down - Autoscorri Giù + Autoscorri Giù - + Autoscroll up - Autoscorri Sù + Autoscorri Sù - + Autoscroll forward, horizontal first - Autoscorri avanti, priorità Orizzontale + Autoscorri avanti, priorità Orizzontale - + Autoscroll backward, horizontal first - Autoscorri indietro, priorità Orizzontale + Autoscorri indietro, priorità Orizzontale - + Autoscroll forward, vertical first - Autoscorri avanti, priorità Verticale + Autoscorri avanti, priorità Verticale - + Autoscroll backward, vertical first - Autoscorri indietro, priorità Verticale + Autoscorri indietro, priorità Verticale - + Move down - Muovi Giù + Muovi Giù - + Move up - Muovi Sù + Muovi Sù - + Move left - Muovi Sinistra + Muovi Sinistra - + Move right - Muovi Destra + Muovi Destra - + Go to the first page - Vai alla pagina iniziale + Vai alla pagina iniziale - + Go to the last page - Vai all'ultima pagina + Vai all'ultima pagina - + Offset double page to the left - + Doppia pagina spostata a sinistra - + Offset double page to the right - + Doppia pagina spostata a destra - + + Reading - Leggi + Leggi - + There is a new version available - Nuova versione disponibile + Nuova versione disponibile - + Do you want to download the new version? - Vuoi scaricare la nuova versione? + Vuoi scaricare la nuova versione? - + Remind me in 14 days - Ricordamelo in 14 giorni + Ricordamelo in 14 giorni - + Not now - Non ora + Non ora + + + + YACReader::TrayIconController + + + &Restore + &Ripristina + + + + Systray + Area di notifica + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuerà a essere eseguito nella barra delle applicazioni. Per terminare il programma, scegli <b>Esci</b> nel menu contestuale dell'icona nella barra delle applicazioni. YACReader::WhatsNewDialog - Close - Chiudi + Chiudi @@ -1385,7 +4025,7 @@ Click to overwrite - Click per sovrascrivere + Clicca per sovrascrivere @@ -1401,178 +4041,158 @@ Click to overwrite - Click per sovrascrivere + Clicca per sovrascrivere YACReaderFlowConfigWidget - CoverFlow look - Aspetto flusso Copertine + Aspetto flusso Copertine - How to show covers: - Come mostrare le copertine: + Come mostrare le copertine: - Stripe look - Aspetto a strisce + Aspetto a strisce - Overlapped Stripe look - Aspetto a strisce sovrapposto + Aspetto a strisce sovrapposto YACReaderGLFlowConfigWidget - Zoom - Zoom + Ingrandimento - Light - Luce + Luce - Show advanced settings - Mostra opzioni avanzate + Mostra opzioni avanzate - Roulette look - Aspetto Roulette + Aspetto Roulette - Cover Angle - Angolo copertine + Angolo copertine - Stripe look - Aspetto a strisce + Aspetto a strisce - Position - Posizione + Posizione - Z offset - Compensazione Z + Compensazione Z - Y offset - Compensazione Y + Compensazione Y - Central gap - Distanza centrale + Distanza centrale - Presets: - Preselezioni: + Preselezioni: - Overlapped Stripe look - Aspetto a strisce sovrapposto + Aspetto a strisce sovrapposto - Modern look - Aspetto moderno + Aspetto moderno - View angle - Angolo di vista + Angolo di vista - Max angle - Angolo massimo + Angolo massimo - Custom: - Personalizzazione: + Personalizzazione: - Classic look - Aspetto Classico + Aspetto Classico - Cover gap - Distanza Copertine + Distanza Copertine - High Performance - Prestazioni Alte + Prestazioni Alte - Performance: - Prestazioni: + Prestazioni: - Use VSync (improve the image quality in fullscreen mode, worse performance) - Usa VSync (migliora la qualtà a tutto schermo, peggiora le prestazioni) + Usa VSync (migliora la qualtà a tutto schermo, peggiora le prestazioni) - Visibility - Visibilità + Visibilità - Low Performance - Prestazioni Basse + Prestazioni Basse YACReaderOptionsDialog - + Save Salva - Use hardware acceleration (restart needed) - Usa accelerazione Hardware (necessita restart) + Usa accelerazione Hardware (necessita restart) - + Cancel Cancella - + Shortcuts Scorciatoia - + Edit shortcuts Edita Scorciatoia + + YACReaderSearchLineEdit + + + type to search + Digita per cercare + + YACReaderSlider @@ -1584,23 +4204,23 @@ YACReaderTranslator - + clear Cancella - + Service not available Servizio non disponibile - - + + Translation Traduzione - + YACReader translator Traduttore YACReader diff --git a/YACReader/yacreader_local_client.cpp b/YACReader/yacreader_local_client.cpp index d845d67e4..6cb6cb922 100644 --- a/YACReader/yacreader_local_client.cpp +++ b/YACReader/yacreader_local_client.cpp @@ -1,11 +1,11 @@ #include "yacreader_local_client.h" + +#include "QsLog.h" #include "comic_db.h" #include "yacreader_global.h" #include -#include "QsLog.h" - using namespace YACReader; YACReaderLocalClient::YACReaderLocalClient(QObject *parent) diff --git a/YACReader/yacreader_local_client.h b/YACReader/yacreader_local_client.h index b683d6946..d4472b0b9 100644 --- a/YACReader/yacreader_local_client.h +++ b/YACReader/yacreader_local_client.h @@ -1,8 +1,8 @@ #ifndef YACREADER_LOCAL_CLIENT_H #define YACREADER_LOCAL_CLIENT_H -#include "yacreader_global.h" #include "comic_db.h" +#include "yacreader_global.h" #include diff --git a/YACReader/yacreader_nl.ts b/YACReader/yacreader_nl.ts index 30db16399..038540d1e 100644 --- a/YACReader/yacreader_nl.ts +++ b/YACReader/yacreader_nl.ts @@ -6,1196 +6,3836 @@ None - + Geen - BookmarksDialog + AddLabelDialog - - Close - Sluiten + + Label name: + Labelnaam: - - - Loading... - Inladen... + + Choose a color: + Kies een kleur: - - Click on any image to go to the bookmark - Klik op een afbeelding om naar de bladwijzer te gaan + + accept + accepteren - - Lastest Page - Laatste Pagina + + cancel + annuleren - EditShortcutsDialog + AddLibraryDialog - - Restore defaults - + + Comics folder : + Strips map: - - To change a shortcut, double click in the key combination and type the new keys. - + + Library name : + Bibliotheek Naam : - - Shortcuts settings - + + Add + Toevoegen - - Shortcut in use - + + Cancel + Annuleren - - The shortcut "%1" is already assigned to other function - + + Add an existing library + Voeg een bestaand bibliotheek toe - FileComic + ApiKeyDialog - - 7z not found - 7Z Archiefbestand niet gevonden + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Voordat je verbinding kunt maken met Comic Vine, heb je een eigen API-sleutel nodig. Vraag er <a href="http://www.comicvine.com/api/">hier</a> één gratis aan - - CRC error on page (%1): some of the pages will not be displayed correctly - + + Paste here your Comic Vine API key + Plak hier uw Comic Vine API-sleutel - - Unknown error opening the file - + + Accept + Accepteren - - Format not supported - + + Cancel + Annuleren - GoToDialog + AppearanceTabWidget - - Go To - Ga Naar + + Color scheme + Kleurenschema - - Go to... - Ga naar... + + System + Systeem - - - Total pages : - Totaal aantal pagina's : + + Light + Licht - - Cancel - Annuleren + + Dark + Donker - - Page : - Pagina : + + Custom + Aangepast - - - GoToFlowToolBar - - Page : - Pagina : + + Remove + Verwijderen + + + + Remove this user-imported theme + Verwijder dit door de gebruiker geïmporteerde thema + + + + Light: + Licht: + + + + Dark: + Donker: + + + + Custom: + Aangepast: + + + + Import theme... + Thema importeren... + + + + Theme + Thema + + + + Theme editor + Thema-editor + + + + Open Theme Editor... + Thema-editor openen... + + + + Theme editor error + Fout in de thema-editor + + + + The current theme JSON could not be loaded. + De huidige thema-JSON kan niet worden geladen. + + + + Import theme + Thema importeren + + + + JSON files (*.json);;All files (*) + JSON-bestanden (*.json);;Alle bestanden (*) + + + + Could not import theme from: +%1 + Kan thema niet importeren uit: +%1 + + + + Could not import theme from: +%1 + +%2 + Kan thema niet importeren uit: +%1 + +%2 + + + + Import failed + Importeren is mislukt - HelpAboutDialog + BookmarksDialog - - Help - Help + + Close + Sluiten - - System info - + + + Loading... + Inladen... - - About - Over + + Click on any image to go to the bookmark + Klik op een afbeelding om naar de bladwijzer te gaan + + + + Lastest Page + Laatste Pagina - LogWindow + ClassicComicsView + + + Hide comic flow + Comic Flow verbergen + + + + ComicModel + + + yes + Ja + + + + no + neen + + + + Title + Titel + + + + File Name + Bestandsnaam + + + + Pages + Pagina's + + + + Size + Grootte(MB) + - - Log window - + + Read + Gelezen - - &Pause - + + Current Page + Huidige pagina - - &Save - + + Publication Date + Publicatiedatum - - C&lear - + + Rating + Beoordeling - - &Copy - + + Series + Serie - - Level: - + + Volume + Deel - - &Auto scroll - + + Story Arc + Verhaalboog - MainWindowViewer + ComicVineDialog - Help - Help + + skip + overslaan - Save - Bewaar + + back + rug - &File - &Bestand + + next + volgende - &Next - &Volgende + + search + zoekopdracht - &Open - &Open + + close + dichtbij - Close - Sluiten + + + comic %1 of %2 - %3 + strip %1 van %2 - %3 - Open Comic - Open een Strip + + + + Looking for volume... + Op zoek naar volumes... - Go To - Ga Naar + + %1 comics selected + %1 strips geselecteerd - Open image folder - Open afbeeldings map + + Error connecting to ComicVine + Fout bij verbinden met ComicVine - Set bookmark - Bladwijzer instellen + + + Retrieving tags for : %1 + Tags ophalen voor: %1 - page_%1.jpg - pagina_%1.jpg + + Retrieving volume info... + Volume-informatie ophalen... - Switch to double page mode - Naar dubbele bladzijde modus + + Looking for comic... + Op zoek naar komische... + + + ContinuousPageWidget - Save current page - Bewaren huidige pagina + + Loading page %1 + Pagina laden %1 + + + CreateLibraryDialog - Double page mode - Dubbele bladzijde modus + + Comics folder : + Strips map: - Switch Magnifying glass - Overschakelen naar Vergrootglas + + Library Name : + Bibliotheek Naam : - Open Folder - Map Openen + + Create + Aanmaken - Comic files - Strip bestanden + + Cancel + Annuleren - Go to previous page - Ga naar de vorige pagina + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Een bibliotheek aanmaken kan enkele minuten duren. U kunt het proces stoppen en de bibliotheek later voltooien. - Open a comic - Open een strip + + Create new library + Een nieuwe Bibliotheek aanmaken - Image files (*.jpg) - Afbeelding bestanden (*.jpg) + + Path not found + Pad niet gevonden - Next Comic - Volgende Strip + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + De geselecteerde pad bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map + + + EditShortcutsDialog - Fit Width - Vensterbreedte aanpassen + + Restore defaults + Standaardwaarden herstellen - Options - Opties + + To change a shortcut, double click in the key combination and type the new keys. + Om een ​​snelkoppeling te wijzigen, dubbelklikt u op de toetsencombinatie en typt u de nieuwe toetsen. - Show Info - Info tonen + + Shortcuts settings + Instellingen voor snelkoppelingen - Open folder - Open een Map + + Shortcut in use + Snelkoppeling in gebruik - Go to page ... - Ga naar bladzijde ... + + The shortcut "%1" is already assigned to other function + De sneltoets "%1" is al aan een andere functie toegewezen + + + EmptyFolderWidget - Fit image to width - Afbeelding aanpassen aan breedte + + This folder doesn't contain comics yet + Deze map bevat nog geen strips + + + EmptyLabelWidget - &Previous - &Vorige + + This label doesn't contain comics yet + Dit label bevat nog geen strips + + + EmptyReadingListWidget - Go to next page - Ga naar de volgende pagina + + This reading list does not contain any comics yet + Deze leeslijst bevat nog geen strips + + + EmptySpecialListWidget - Show keyboard shortcuts - Toon de sneltoetsen + + No favorites + Geen favorieten - There is a new version available - Er is een nieuwe versie beschikbaar + + You are not reading anything yet, come on!! + Je leest nog niets, kom op!! - Open next comic - Open volgende strip + + There are no recent comics! + Er zijn geen recente strips! + + + ExportComicsInfoDialog - Show bookmarks - Bladwijzers weergeven + + Output file : + Uitvoerbestand: - Open previous comic - Open de vorige strip + + Create + Aanmaken - Rotate image to the left - Links omdraaien + + Cancel + Annuleren - Fit image to height - Afbeelding aanpassen aan hoogte + + Export comics info + Strip info exporteren - Show the bookmarks of the current comic - Toon de bladwijzers van de huidige strip + + Destination database name + Bestemmingsdatabase naam - Show Dictionary - Woordenlijst weergeven + + Problem found while writing + Probleem bij het schrijven - YACReader options - YACReader opties + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Het gekozen pad voor het uitvoerbestand bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map + + + ExportLibraryDialog - Help, About YACReader - Help, Over YACReader + + Output folder : + Uitvoermap : - Show go to flow - Toon ga naar de Omslagbrowser + + Create + Aanmaken - Previous Comic - Vorige Strip + + Cancel + Annuleren - Show full size - Volledig Scherm + + Create covers package + Aanmaken omslag pakket - Magnifying glass - Vergrootglas + + Problem found while writing + Probleem bij het schrijven - General - Algemeen + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Het gekozen pad voor het uitvoerbestand bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map + + + + Destination directory + Doeldirectory + + + + FileComic + + + 7z not found + 7Z Archiefbestand niet gevonden + + + + CRC error on page (%1): some of the pages will not be displayed correctly + CRC-fout op pagina (%1): sommige pagina's worden niet correct weergegeven + + + + Unknown error opening the file + Onbekende fout bij het openen van het bestand + + + + Format not supported + Formaat niet ondersteund + + + + GoToDialog + + + Go To + Ga Naar + + + + Go to... + Ga naar... + + + + + Total pages : + Totaal aantal pagina's : + + + + Cancel + Annuleren + + + + Page : + Pagina : + + + + GoToFlowToolBar + + + Page : + Pagina : + + + + GridComicsView + + + Show info + Toon informatie + + + + HelpAboutDialog + + + Help + Hulp + + + + System info + Systeeminformatie + + + + About + Over + + + + ImportComicsInfoDialog + + + Import comics info + Strip info Importeren + + + + Info database location : + Info database locatie : + + + + Import + Importeren + + + + Cancel + Annuleren + + + + Comics info file (*.ydb) + Strips info bestand ( * .ydb) + + + + ImportLibraryDialog + + + Library Name : + Bibliotheek Naam : + + + + Package location : + Arrangement locatie : + + + + Destination folder : + Doelmap: + + + + Unpack + Uitpakken + + + + Cancel + Annuleren + + + + Extract a catalog + Een catalogus uitpakken + + + + Compresed library covers (*.clc) + Compresed omslag- bibliotheek ( * .clc) + + + + ImportWidget + + + stop + Stoppen + + + + Some of the comics being added... + Enkele strips zijn toegevoegd ... + + + + Importing comics + Strips importeren + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <P>YACReaderLibrary maak nu een nieuwe bibliotheek. < /p> <p>Een bibliotheek aanmaken kan enkele minuten duren. U kunt het proces stoppen en de bibliotheek later voltooien. < /p> + + + + Updating the library + Actualisering van de bibliotheek + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <P>De huidige bibliotheek wordt bijgewerkt. Voor snellere updates, update uw bibliotheken regelmatig. < /p> <p>u kunt het proces stoppen om later bij te werken. < /p> + + + + Upgrading the library + Het upgraden van de bibliotheek + + + + <p>The current library is being upgraded, please wait.</p> + <p>De huidige bibliotheek wordt geüpgraded. Een ogenblik geduld.</p> + + + + Scanning the library + De bibliotheek scannen + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>De huidige bibliotheek wordt gescand op oudere XML-metadata-informatie.</p><p>Dit is slechts één keer nodig en alleen als de bibliotheek is ingepakt met YACReaderLibrary 9.8.2 of eerder.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Bibliotheek + + + + + + comic + grappig + + + + + + manga + Manga + + + + + + western manga (left to right) + westerse manga (van links naar rechts) + + + + + + web comic + web-strip + + + + + + 4koma (top to botom) + 4koma (van boven naar beneden) + + + + + + + Set type + Soort instellen + + + + Library + Bibliotheek + + + + Folder + Map + + + + Comic + Grappig + + + + Upgrade failed + Upgrade mislukt + + + + There were errors during library upgrade in: + Er zijn fouten opgetreden tijdens de bibliotheekupgrade in: + + + + Update needed + Bijwerken is nodig + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Deze bibliotheek is gemaakt met een vorige versie van YACReaderLibrary. Het moet worden bijgewerkt. Nu bijwerken? + + + + Download new version + Nieuwe versie ophalen + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Deze bibliotheek is gemaakt met een nieuwere versie van YACReaderLibrary. Download de nieuwe versie? + + + + Library not available + Bibliotheek niet beschikbaar + + + + Library '%1' is no longer available. Do you want to remove it? + Bibliotheek ' %1' is niet langer beschikbaar. Wilt u het verwijderen? + + + + Old library + Oude Bibliotheek + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Bibliotheek ' %1' is gemaakt met een oudere versie van YACReaderLibrary. Zij moet opnieuw worden aangemaakt. Wilt u de bibliotheek nu aanmaken? + + + + + Copying comics... + Strips kopiëren... + + + + + Moving comics... + Strips verplaatsen... + + + + Add new folder + Nieuwe map toevoegen + + + + Folder name: + Mapnaam: + + + + No folder selected + Geen map geselecteerd + + + + Please, select a folder first + Selecteer eerst een map + + + + Error in path + Fout in pad + + + + There was an error accessing the folder's path + Er is een fout opgetreden bij het verkrijgen van toegang tot het pad van de map + + + + Delete folder + Map verwijderen + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + De geselecteerde map en de volledige inhoud ervan worden van uw schijf verwijderd. Weet je het zeker? + + + + + Unable to delete + Kan niet verwijderen + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Er is een probleem opgetreden bij het verwijderen van de geselecteerde mappen. Controleer of er schrijfrechten zijn en zorg ervoor dat alle toepassingen deze mappen of een van de daarin opgenomen bestanden gebruiken. + + + + Add new reading lists + Voeg nieuwe leeslijsten toe + + + + + List name: + Lijstnaam: + + + + Delete list/label + Lijst/label verwijderen + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Het geselecteerde item wordt verwijderd, uw strips of mappen worden NIET van uw schijf verwijderd. Weet je het zeker? + + + + Rename list name + Hernoem de lijstnaam + + + + Open folder... + Map openen ... + + + + Update folder + Map bijwerken + + + + Rescan library for XML info + Bibliotheek opnieuw scannen op XML-info + + + + Set as uncompleted + Ingesteld als onvoltooid + + + + Set as completed + Instellen als voltooid + + + + Set as read + Instellen als gelezen + + + + + Set as unread + Instellen als ongelezen + + + + Set custom cover + Aangepaste omslag instellen + + + + Delete custom cover + Aangepaste omslag verwijderen + + + + Save covers + Bewaar hoesjes + + + + You are adding too many libraries. + U voegt te veel bibliotheken toe. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + U voegt te veel bibliotheken toe. + +Je hebt waarschijnlijk maar één bibliotheek nodig in je stripmap op het hoogste niveau. Je kunt door alle submappen bladeren met behulp van het mappengedeelte in de linkerzijbalk. + +YACReaderLibrary zal u er niet van weerhouden om meer bibliotheken te creëren, maar u moet het aantal bibliotheken laag houden. + + + + + YACReader not found + YACReader niet gevonden + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader niet gevonden. YACReader moet in dezelfde map worden geïnstalleerd als YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader niet gevonden. Er is mogelijk een probleem met uw YACReader-installatie. + + + + Error + Fout + + + + Error opening comic with third party reader. + Fout bij het openen van een strip met een lezer van een derde partij. + + + + Library not found + Bibliotheek niet gevonden + + + + The selected folder doesn't contain any library. + De geselecteerde map bevat geen bibliotheek. + + + + Are you sure? + Weet u het zeker? + + + + Do you want remove + Wilt u verwijderen + + + + library? + Bibliotheek? + + + + Remove and delete metadata + Verwijder metagegevens + + + + Library info + Bibliotheekinformatie + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Er is een probleem opgetreden bij het verwijderen van de geselecteerde strips. Controleer of er schrijfrechten zijn voor de geselecteerde bestanden of de map waarin deze zich bevinden. + + + + Assign comics numbers + Wijs stripnummers toe + + + + Assign numbers starting in: + Nummers toewijzen beginnend met: + + + + Invalid image + Ongeldige afbeelding + + + + The selected file is not a valid image. + Het geselecteerde bestand is geen geldige afbeelding. + + + + Error saving cover + Fout bij opslaan van dekking + + + + There was an error saving the cover image. + Er is een fout opgetreden bij het opslaan van de omslagafbeelding. + + + + Error creating the library + Fout bij aanmaken Bibliotheek + + + + Error updating the library + Fout bij bijwerken Bibliotheek + + + + Error opening the library + Fout bij openen Bibliotheek + + + + Delete comics + Strips verwijderen + + + + All the selected comics will be deleted from your disk. Are you sure? + Alle geselecteerde strips worden verwijderd van uw schijf. Weet u het zeker? + + + + Remove comics + Verwijder strips + + + + Comics will only be deleted from the current label/list. Are you sure? + Strips worden alleen verwijderd van het huidige label/de huidige lijst. Weet je het zeker? + + + + Library name already exists + Bibliotheek naam bestaat al + + + + There is another library with the name '%1'. + Er is al een bibliotheek met de naam ' %1 '. + + + + LibraryWindowActions + + + Create a new library + Maak een nieuwe Bibliotheek + + + + Open an existing library + Open een bestaande Bibliotheek + + + + + Export comics info + Strip info exporteren + + + + + Import comics info + Strip info Importeren + + + + Pack covers + Inpakken strip voorbladen + + + + Pack the covers of the selected library + Inpakken alle strip voorbladen van de geselecteerde Bibliotheek + + + + Unpack covers + Uitpakken voorbladen + + + + Unpack a catalog + Uitpaken van een catalogus + + + + Update library + Bibliotheek bijwerken + + + + Update current library + Huidige Bibliotheek bijwerken + + + + Rename library + Bibliotheek hernoemen + + + + Rename current library + Huidige Bibliotheek hernoemen + + + + Remove library + Bibliotheek verwijderen + + + + Remove current library from your collection + De huidige Bibliotheek verwijderen uit uw verzameling + + + + Rescan library for XML info + Bibliotheek opnieuw scannen op XML-info + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Probeert XML-informatie te vinden die is ingebed in stripbestanden. U hoeft dit alleen te doen als de bibliotheek is gemaakt met versie 9.8.2 of eerdere versies of als u software van derden gebruikt om XML-informatie in de bestanden in te sluiten. + + + + Show library info + Bibliotheekinfo tonen + + + + Show information about the current library + Toon informatie over de huidige bibliotheek + + + + Open current comic + Huidige strip openen + + + + Open current comic on YACReader + Huidige strip openen in YACReader + + + + Save selected covers to... + Geselecteerde omslagen opslaan in... + + + + Save covers of the selected comics as JPG files + Sla covers van de geselecteerde strips op als JPG-bestanden + + + + + Set as read + Instellen als gelezen + + + + Set comic as read + Strip Instellen als gelezen + + + + + Set as unread + Instellen als ongelezen + + + + Set comic as unread + Strip Instellen als ongelezen + + + + + manga + Manga + + + + Set issue as manga + Stel het probleem in als manga + + + + + comic + grappig + + + + Set issue as normal + Stel het probleem in als normaal + + + + western manga + westerse manga + + + + Set issue as western manga + Stel het probleem in als westerse manga + + + + + web comic + web-strip + + + + Set issue as web comic + Stel het probleem in als webstrip + + + + + yonkoma + yokoma + + + + Set issue as yonkoma + Stel het probleem in als yonkoma + + + + Show/Hide marks + Toon/Verberg markeringen + + + + Show or hide read marks + Toon of verberg leesmarkeringen + + + + Show/Hide recent indicator + Recente indicator tonen/verbergen + + + + Show or hide recent indicator + Toon of verberg recente indicator + + + + + Fullscreen mode on/off + Volledig scherm modus aan/of + + + + Help, About YACReader + Help, Over YACReader + + + + Add new folder + Nieuwe map toevoegen + + + + Add new folder to the current library + Voeg een nieuwe map toe aan de huidige bibliotheek + + + + Delete folder + Map verwijderen + + + + Delete current folder from disk + Verwijder de huidige map van schijf + + + + Select root node + Selecteer de hoofd categorie + + + + Expand all nodes + Alle categorieën uitklappen + + + + Collapse all nodes + Vouw alle knooppunten samen + + + + Show options dialog + Toon opties dialoog + + + + Show comics server options dialog + Toon strips-server opties dialoog + + + + + Change between comics views + Wisselen tussen stripweergaven + + + + Open folder... + Map openen ... + + + + Set as uncompleted + Ingesteld als onvoltooid + + + + Set as completed + Instellen als voltooid + + + + Set custom cover + Aangepaste omslag instellen + + + + Delete custom cover + Aangepaste omslag verwijderen + + + + western manga (left to right) + westerse manga (van links naar rechts) + + + + Open containing folder... + Open map ... + + + + Reset comic rating + Stripbeoordeling opnieuw instellen + + + + Select all comics + Selecteer alle strips + + + + Edit + Bewerken + + + + Assign current order to comics + Wijs de huidige volgorde toe aan strips + + + + Update cover + Strip omslagen bijwerken + + + + Delete selected comics + Geselecteerde strips verwijderen + + + + Delete metadata from selected comics + Verwijder metadata uit geselecteerde strips + + + + Download tags from Comic Vine + Tags downloaden van Comic Vine + + + + Focus search line + Focus zoeklijn + + + + Focus comics view + Focus stripweergave + + + + Edit shortcuts + Snelkoppelingen bewerken + + + + &Quit + &Afsluiten + + + + Update folder + Map bijwerken + + + + Update current folder + Werk de huidige map bij + + + + Scan legacy XML metadata + Scan oudere XML-metagegevens + + + + Add new reading list + Nieuwe leeslijst toevoegen + + + + Add a new reading list to the current library + Voeg een nieuwe leeslijst toe aan de huidige bibliotheek + + + + Remove reading list + Leeslijst verwijderen + + + + Remove current reading list from the library + Verwijder de huidige leeslijst uit de bibliotheek + + + + Add new label + Nieuw etiket toevoegen + + + + Add a new label to this library + Voeg een nieuw label toe aan deze bibliotheek + + + + Rename selected list + Hernoem de geselecteerde lijst + + + + Rename any selected labels or lists + Hernoem alle geselecteerde labels of lijsten + + + + Add to... + Toevoegen aan... + + + + Favorites + Favorieten + + + + Add selected comics to favorites list + Voeg geselecteerde strips toe aan de favorietenlijst + + + + LocalComicListModel + + + file name + bestandsnaam + + + + MainWindowViewer + + Help + Hulp + + + Save + Bewaar + + + &File + &Bestand + + + &Next + &Volgende + + + &Open + &Openen + + + Close + Sluiten + + + Open Comic + Open een Strip + + + Go To + Ga Naar + + + Open image folder + Open afbeeldings map + + + Set bookmark + Bladwijzer instellen + + + page_%1.jpg + pagina_%1.jpg + + + Switch to double page mode + Naar dubbele bladzijde modus + + + Save current page + Bewaren huidige pagina + + + Double page mode + Dubbele bladzijde modus + + + Switch Magnifying glass + Overschakelen naar Vergrootglas + + + Open Folder + Map Openen + + + Comic files + Strip bestanden + + + Go to previous page + Ga naar de vorige pagina + + + Open a comic + Open een strip + + + Image files (*.jpg) + Afbeelding bestanden (*.jpg) + + + Next Comic + Volgende Strip + + + Fit Width + Vensterbreedte aanpassen + + + Options + Opties + + + Show Info + Info tonen + + + Open folder + Open een Map + + + Go to page ... + Ga naar bladzijde ... + + + Fit image to width + Afbeelding aanpassen aan breedte + + + &Previous + &Vorige + + + Go to next page + Ga naar de volgende pagina + + + Show keyboard shortcuts + Toon de sneltoetsen + + + There is a new version available + Er is een nieuwe versie beschikbaar + + + Open next comic + Open volgende strip + + + Show bookmarks + Bladwijzers weergeven + + + Open previous comic + Open de vorige strip + + + Rotate image to the left + Links omdraaien + + + Fit image to height + Afbeelding aanpassen aan hoogte + + + Show the bookmarks of the current comic + Toon de bladwijzers van de huidige strip + + + Show Dictionary + Woordenlijst weergeven + + + YACReader options + YACReader opties + + + Help, About YACReader + Help, Over YACReader + + + Show go to flow + "Ga naar Comic Flow" tonen + + + Previous Comic + Vorige Strip + + + Show full size + Volledig Scherm + + + Magnifying glass + Vergrootglas + + + General + Algemeen + + + Set a bookmark on the current page + Een bladwijzer toevoegen aan de huidige pagina + + + Do you want to download the new version? + Wilt u de nieuwe versie downloaden? + + + Rotate image to the right + Rechts omdraaien + + + Always on top + Altijd op voorgrond + + + + NoLibrariesWidget + + + You don't have any libraries yet + Je hebt geen nog libraries + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <P>u kunt een bibliotheek maken in een willekeurige map, YACReaderLibrary importeert alle strips en mappen uit deze map. Alle bibliotheek aangemaakt in het verleden kan je openen. < /p> <p>vergeet niet dat u YACReader kan gebruiken als stand-alone applicatie voor het lezen van de strips op de computer. < /p> + + + + create your first library + Maak uw eerste bibliotheek + + + + add an existing one + voeg een bestaande bibliotheek toe + + + + NoSearchResultsWidget + + + No results + Geen resultaten + + + + OptionsDialog + + + Gamma + Gammawaarde + + + + Reset + Standaardwaarden terugzetten + + + + My comics path + Pad naar mijn strips + + + + Scaling + Schalen + + + + Scaling method + Schaalmethode + + + + Nearest (fast, low quality) + Dichtstbijzijnde (snel, lage kwaliteit) + + + + Bilinear + Bilineair + + + + Lanczos (better quality) + Lanczos (betere kwaliteit) + + + + Image adjustment + Beeldaanpassing + + + + "Go to flow" size + Grootte van "Ga naar Comic Flow" + + + + Choose + Kies + + + + Image options + Afbeelding opties + + + + Contrast + Contrastwaarde + + + + + Libraries + Bibliotheken + + + + Comic Flow + Comic Flow + + + + Grid view + Rasterweergave + + + + + Appearance + Verschijning + + + + + Options + Opties + + + + + Language + Taal + + + + + Application language + Applicatietaal + + + + + System default + Standaard van het systeem + + + + Tray icon settings (experimental) + Instellingen voor ladepictogram (experimenteel) + + + + Close to tray + Dicht bij lade + + + + Start into the system tray + Begin in het systeemvak + + + + Edit Comic Vine API key + Bewerk de Comic Vine API-sleutel + + + + Comic Vine API key + Comic Vine API-sleutel + + + + ComicInfo.xml legacy support + ComicInfo.xml verouderde ondersteuning + + + + Import metadata from ComicInfo.xml when adding new comics + Importeer metagegevens uit ComicInfo.xml wanneer u nieuwe strips toevoegt + + + + Consider 'recent' items added or updated since X days ago + Overweeg 'recente' items die sinds X dagen geleden zijn toegevoegd of bijgewerkt + + + + Third party reader + Lezer van derden + + + + Write {comic_file_path} where the path should go in the command + Schrijf {comic_file_path} waar het pad naartoe moet in de opdracht + + + + + Clear + Duidelijk + + + + Update libraries at startup + Update bibliotheken bij het opstarten + + + + Try to detect changes automatically + Probeer wijzigingen automatisch te detecteren + + + + Update libraries periodically + Update bibliotheken regelmatig + + + + Interval: + Tijdsinterval: + + + + 30 minutes + 30 minuten + + + + 1 hour + 1 uur + + + + 2 hours + 2 uur + + + + 4 hours + 4 uur + + + + 8 hours + 8 uur + + + + 12 hours + 12 uur + + + + daily + dagelijks + + + + Update libraries at certain time + Update bibliotheken op een bepaald tijdstip + + + + Time: + Tijd: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + WAARSCHUWING! Tijdens bibliotheekupdates is schrijven naar de database uitgeschakeld! +Plan geen updates terwijl u de app mogelijk actief gebruikt. +During automatic updates the app will block some of the actions until the update is finished. +Om een ​​automatische update te stoppen, tikt u op de laadindicator naast de titel van Bibliotheken. + + + + Modifications detection + Detectie van wijzigingen + + + + Compare the modified date of files when updating a library (not recommended) + Vergelijk de wijzigingsdatum van bestanden bij het updaten van een bibliotheek (niet aanbevolen) + + + + Enable background image + Achtergrondafbeelding inschakelen + + + + Opacity level + Dekkingsniveau + + + + Blur level + Vervagingsniveau + + + + Use selected comic cover as background + Gebruik geselecteerde stripomslag als achtergrond + + + + Restore defautls + Standaardwaarden herstellen + + + + Background + Achtergrond + + + + Display continue reading banner + Toon de banner voor verder lezen + + + + Display current comic banner + Toon huidige stripbanner + + + + Continue reading + Lees verder + + + + Comics directory + Strips map + + + + Background color + Achtergrondkleur + + + + Page Flow + Omslagbrowser + + + + + General + Algemeen + + + + Brightness + Helderheid + + + + + Restart is needed + Herstart is nodig + + + + Quick Navigation Mode + Snelle navigatiemodus + + + + Display + Weergave + + + + Show time in current page information label + Toon de tijd in het informatielabel van de huidige pagina + + + + Scroll behaviour + Scrollgedrag + + + + Disable scroll animations and smooth scrolling + Schakel scrollanimaties en soepel scrollen uit + + + + Do not turn page using scroll + Sla de pagina niet om met scrollen + + + + Use single scroll step to turn page + Gebruik een enkele scrollstap om de pagina om te slaan + + + + Mouse mode + Muismodus + + + + Only Back/Forward buttons can turn pages + Alleen de knoppen Terug/Vooruit kunnen pagina's omslaan + + + + Use the Left/Right buttons to turn pages. + Gebruik de knoppen Links/Rechts om pagina's om te slaan. + + + + Click left or right half of the screen to turn pages. + Klik op de linker- of rechterhelft van het scherm om pagina's om te slaan. + + + + Disable mouse over activation + Schakel muis-over-activering uit + + + + Fit options + Pas opties + + + + Enlarge images to fit width/height + Vergroot afbeeldingen zodat ze in de breedte/hoogte passen + + + + Double Page options + Opties voor dubbele pagina's + + + + Show covers as single page + Toon omslagen als enkele pagina + + + + PropertiesDialog + + + General info + Algemene Info + + + + Plot + Verhaal + + + + Authors + Auteurs + + + + Publishing + Uitgever + + + + Notes + Opmerkingen + + + + Cover page + Omslag + + + + Load previous page as cover + Laad de vorige pagina als omslag + + + + Load next page as cover + Laad de volgende pagina als omslag + + + + Reset cover to the default image + Zet de omslag terug naar de standaardafbeelding + + + + Load custom cover image + Aangepaste omslagafbeelding laden + + + + Series: + Serie: + + + + Title: + Titel: + + + + + + of: + van: + + + + Issue number: + Ids: + + + + Volume: + Inhoud: + + + + Arc number: + Boognummer: + + + + Story arc: + Verhaallijn: + + + + alt. number: + alt. nummer: + + + + Alternate series: + Alternatieve serie: + + + + Series Group: + Seriegroep: + + + + Genre: + Genretype: + + + + Size: + Grootte(MB): + + + + Writer(s): + Schrijver(s): + + + + Penciller(s): + Tekenaar(s): + + + + Inker(s): + Inkt(en): + + + + Colorist(s): + Inkleurder(s): + + + + Letterer(s): + Letterzetter(s): + + + + Cover Artist(s): + Omslag ontwikkelaar(s): + + + + Editor(s): + Redacteur(en): + + + + Imprint: + Opdruk: + + + + Day: + Dag: + + + + Month: + Maand: + + + + Year: + Jaar: + + + + Publisher: + Uitgever: + + + + Format: + Formaat: + + + + Color/BW: + Kleur/ZW: + + + + Age rating: + Leeftijdsbeperking: + + + + Type: + Soort: + + + + Language (ISO): + Taal (ISO): + + + + Synopsis: + Samenvatting: + + + + Characters: + Personages: + + + + Teams: + Ploegen: + + + + Locations: + Locaties: + + + + Main character or team: + Hoofdpersoon of team: + + + + Review: + Beoordeling: + + + + Notes: + Opmerkingen: + + + + Tags: + Labels: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine-link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> bekijken </a> + + + + Not found + Niet gevonden + + + + Comic not found. You should update your library. + Strip niet gevonden. U moet uw bibliotheek.bijwerken. + + + + Edit comic information + Strip informatie bijwerken + + + + Edit selected comics information + Geselecteerde strip informatie bijwerken + + + + Invalid cover + Ongeldige dekking + + + + The image is invalid. + De afbeelding is ongeldig. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer is de headless (geen gui) versie van YACReaderLibrary. + +Deze applicatie ondersteunt permanente instellingen. Om ze in te stellen, bewerk dit bestand %1 +Voor meer informatie over de beschikbare instellingen kunt u de documentatie raadplegen op https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + 7z lib not found + 7z-lib niet gevonden + + + + unable to load 7z lib from ./utils + kan 7z lib niet laden vanuit ./utils + + + + Trace + Spoor + + + + Debug + Foutopsporing + + + + Info + Informatie + + + + Warning + Waarschuwing + + + + Error + Fout + + + + Fatal + Fataal + + + + Select custom cover + Selecteer een aangepaste omslag + + + + Images (%1) + Afbeeldingen (%1) + + + + The file could not be read or is not valid JSON. + Het bestand kan niet worden gelezen of is geen geldige JSON. + + + + This theme is for %1, not %2. + Dit thema is voor %1, niet voor %2. + + + + Libraries + Bibliotheken + + + + Folders + Mappen + + + + Reading Lists + Leeslijsten + + + + RenameLibraryDialog + + + New Library Name : + Nieuwe Bibliotheek Naam : + + + + Rename + Hernoem + + + + Cancel + Annuleren + + + + Rename current library + Huidige Bibliotheek hernoemen + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Aantal gevonden volumes: %1 + + + + + page %1 of %2 + pagina %1 van %2 + + + + Number of %1 found : %2 + Aantal %1 gevonden: %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Geef wat aanvullende informatie op voor deze strip. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Gebruik exacte matchzoekopdrachten. Schakel dit uit als u volumes wilt vinden die overeenkomen met enkele woorden in de naam. + + + + SearchVolume + + + Please provide some additional information. + Geef alstublieft wat aanvullende informatie op. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Gebruik exacte matchzoekopdrachten. Schakel dit uit als u volumes wilt vinden die overeenkomen met enkele woorden in de naam. + + + + SelectComic + + + Please, select the right comic info. + Selecteer de juiste stripinformatie. + + + + comics + strips + + + + loading cover + laaddeksel + + + + loading description + beschrijving laden + + + + comic description unavailable + komische beschrijving niet beschikbaar + + + + SelectVolume + + + Please, select the right series for your comic. + Selecteer de juiste serie voor jouw strip. + + + + Filter: + Selectiefilter: + + + + volumes + delen + + + + Nothing found, clear the filter if any. + Niets gevonden. Wis eventueel het filter. + + + + loading cover + laaddeksel + + + + loading description + beschrijving laden + + + + volume description unavailable + volumebeschrijving niet beschikbaar + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Je probeert informatie voor verschillende strips tegelijk te krijgen. Maken ze deel uit van dezelfde serie? + + + + yes + Ja + + + + no + neen + + + + ServerConfigDialog + + + set port + Poort instellen + + + + Server connectivity information + Informatie over serverconnectiviteit + + + + Scan it! + Scan het! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader is beschikbaar voor iOS- en Android-apparaten.<br/>Ontdek het voor <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> of <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Kies een IP-adres + + + + Port + Poort + + + + enable the server + De server instellen + + + + ShortcutsDialog + + Close + Sluiten + + + YACReader keyboard shortcuts + YACReader sneltoetsen + + + Keyboard Shortcuts + Sneltoetsen + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Sorteer de lijst met strips aan de linkerkant totdat deze overeenkomt met de informatie over de strips. + + + + sort comics to match comic information + sorteer strips zodat ze overeenkomen met stripinformatie + + + + issues + problemen + + + + remove selected comics + verwijder geselecteerde strips + + + + restore all removed comics + herstel alle verwijderde strips + + + + ThemeEditorDialog + + + Theme Editor + Thema-editor + + + + + + + + + + + - + - + + + + i + ? - Set a bookmark on the current page - Een bladwijzer toevoegen aan de huidige pagina + + Expand all + Alles uitvouwen - Do you want to download the new version? - Wilt u de nieuwe versie downloaden? + + Collapse all + Alles samenvouwen - Rotate image to the right - Rechts omdraaien + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Houd ingedrukt om de geselecteerde waarde in de gebruikersinterface te laten knipperen (magenta / geschakeld / 0↔10). Loslaten herstelt het origineel. - Always on top - Altijd op voorgrond + + Search… + Zoekopdracht… - - - OptionsDialog - - Gamma - Gamma + + Light + Licht - - Reset - Standaardwaarden terugzetten + + Dark + Donker - - My comics path - Pad naar mijn strips + + ID: + Identiteitskaart: - - Image adjustment - Beeldaanpassing + + Display name: + Weergavenaam: - - "Go to flow" size - "Naar Omslagbrowser" afmetingen + + Variant: + Variatie: - - Choose - Kies + + Theme info + Thema-informatie - - Image options - Afbeelding opties + + Parameter + Instelwaarde - - Contrast - Contrast + + Value + Waarde - - Options - Opties + + Save and apply + Opslaan en toepassen - - Comics directory - Strips map + + Export to file... + Exporteren naar bestand... - - Background color - Achtergrondkleur + + Load from file... + Laden uit bestand... - - Page Flow - Omslagbrowser + + Close + Sluiten - - General - Algemeen + + Double-click to edit color + Dubbelklik om de kleur te bewerken - - Brightness - Helderheid + + + + + + + true + WAAR - - Restart is needed - Herstart is nodig + + + + + false + vals - - Quick Navigation Mode - + + Double-click to toggle + Dubbelklik om te schakelen - - Display - + + Double-click to edit value + Dubbelklik om de waarde te bewerken - - Show time in current page information label - + + + + Edit: %1 + Bewerken: %1 - - Scroll behaviour - + + Save theme + Thema opslaan - - Disable scroll animations and smooth scrolling - + + + JSON files (*.json);;All files (*) + JSON-bestanden (*.json);;Alle bestanden (*) - - Do not turn page using scroll - + + Save failed + Opslaan mislukt - - Use single scroll step to turn page - + + Could not open file for writing: +%1 + Kan bestand niet openen om te schrijven: +%1 - - Mouse mode - + + Load theme + Thema laden - - Only Back/Forward buttons can turn pages - + + + + Load failed + Laden mislukt - - Use the Left/Right buttons to turn pages. - + + Could not open file: +%1 + Kan bestand niet openen: +%1 - - Click left or right half of the screen to turn pages. - + + Invalid JSON: +%1 + Ongeldige JSON: +%1 - - Disable mouse over activation - + + Expected a JSON object. + Er werd een JSON-object verwacht. + + + TitleHeader - - Fit options - + + SEARCH + ZOEKOPDRACHT + + + UpdateLibraryDialog - - Enlarge images to fit width/height - + + Updating.... + Bijwerken.... - - Double Page options - + + Cancel + Annuleren - - Show covers as single page - + + Update library + Bibliotheek bijwerken - QObject + Viewer - - 7z lib not found - + + + Press 'O' to open comic. + Druk 'O' om een strip te openen. - - unable to load 7z lib from ./utils - + + Cover! + Omslag! - - Trace - + + Comic not found + Strip niet gevonden - - Debug - + + Not found + Niet gevonden - - Info - + + Last page! + Laatste pagina! - - Warning - + + Loading...please wait! + Inladen...even wachten! - - Error - + + Error opening comic + Fout bij openen strip - - Fatal - + + CRC Error + CRC-fout - - Select custom cover - + + Page not available! + Pagina niet beschikbaar! + + + VolumeComicsModel - - Images (%1) - + + title + titel - QsLogging::LogWindowModel + VolumesModel - - Time - + + year + jaar - - Level - + + issues + problemen - - Message - + + publisher + uitgever - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - + + Presets: + Voorinstellingen: - - &Resume - + + Classic look + Klassiek - - Save log - + + Stripe look + Brede band - - Log file (*.log) - + + Overlapped Stripe look + Overlappende band - - - ShortcutsDialog - Close - Sluiten + + Modern look + Modern - YACReader keyboard shortcuts - YACReader sneltoetsen + + Roulette look + Roulette - Keyboard Shortcuts - Sneltoetsen + + Show advanced settings + Toon geavanceerde instellingen - - - Viewer - - - Press 'O' to open comic. - Druk 'O' om een strip te openen. + + Custom: + Aangepast: - - Cover! - Omslag! + + View angle + Kijkhoek - - Comic not found - Strip niet gevonden + + Position + Positie - - Not found - Niet gevonden + + Cover gap + Ruimte tss Omslag - - Last page! - Laatste pagina! + + Central gap + Centrale ruimte - - Loading...please wait! - Inladen...even wachten! + + Zoom + Vergroting - - Error opening comic - + + Y offset + Y-positie - - CRC Error - + + Z offset + Z- positie - - Page not available! - + + Cover Angle + Omslag hoek + + + + Visibility + Zichtbaarheid + + + + Light + Licht + + + + Max angle + Maximale hoek + + + + Low Performance + Lage Prestaties + + + + High Performance + Hoge Prestaties + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) + + + + Performance: + Prestatie: YACReader::MainWindowViewer - + &Open - &Open + &Openen - + Open a comic - Open een strip + Open een strip - + New instance - + Nieuw exemplaar - + Open Folder - Map Openen + Map Openen - + Open image folder - Open afbeeldings map + Open afbeeldings map - + Open latest comic - + Open de nieuwste strip - + Open the latest comic opened in the previous reading session - + Open de nieuwste strip die in de vorige leessessie is geopend - + Clear - + Duidelijk - + Clear open recent list - + Wis geopende recente lijst - + Save - Bewaar + Bewaar - + Save current page - Bewaren huidige pagina + Bewaren huidige pagina Previous Comic - Vorige Strip + Vorige Strip - - - + + + Open previous comic - Open de vorige strip + Open de vorige strip - + Next Comic - Volgende Strip + Volgende Strip - - - + + + Open next comic - Open volgende strip + Open volgende strip - + &Previous - &Vorige + &Vorige - - - + + + Go to previous page - Ga naar de vorige pagina + Ga naar de vorige pagina - + &Next - &Volgende + &Volgende - - - + + + Go to next page - Ga naar de volgende pagina + Ga naar de volgende pagina - + Fit Height - + Geschikte hoogte - + Fit image to height - Afbeelding aanpassen aan hoogte + Afbeelding aanpassen aan hoogte - + Fit Width - Vensterbreedte aanpassen + Vensterbreedte aanpassen - + Fit image to width - Afbeelding aanpassen aan breedte + Afbeelding aanpassen aan breedte - + Show full size - Volledig Scherm + Volledig Scherm - + Fit to page - + Aanpassen aan pagina + + + + Continuous scroll + Continu scrollen + + + + Switch to continuous scroll mode + Schakel over naar de continue scrollmodus - + Reset zoom - + Zoom opnieuw instellen - + Show zoom slider - + Zoomschuifregelaar tonen - + Zoom+ - + Inzoomen - + Zoom- - + Uitzoomen - + Rotate image to the left - Links omdraaien + Links omdraaien - + Rotate image to the right - Rechts omdraaien + Rechts omdraaien - + Double page mode - Dubbele bladzijde modus + Dubbele bladzijde modus - + Switch to double page mode - Naar dubbele bladzijde modus + Naar dubbele bladzijde modus - + Double page manga mode - + Manga-modus met dubbele pagina - + Reverse reading order in double page mode - + Omgekeerde leesvolgorde in dubbele paginamodus - + Go To - Ga Naar + Ga Naar - + Go to page ... - Ga naar bladzijde ... + Ga naar bladzijde ... - + Options - Opties + Opties - + YACReader options - YACReader opties + YACReader opties - - + + Help - Help + Hulp - + Help, About YACReader - Help, Over YACReader + Help, Over YACReader - + Magnifying glass - Vergrootglas + Vergrootglas - + Switch Magnifying glass - Overschakelen naar Vergrootglas + Overschakelen naar Vergrootglas - + Set bookmark - Bladwijzer instellen + Bladwijzer instellen - + Set a bookmark on the current page - Een bladwijzer toevoegen aan de huidige pagina + Een bladwijzer toevoegen aan de huidige pagina - + Show bookmarks - Bladwijzers weergeven + Bladwijzers weergeven - + Show the bookmarks of the current comic - Toon de bladwijzers van de huidige strip + Toon de bladwijzers van de huidige strip - + Show keyboard shortcuts - Toon de sneltoetsen + Toon de sneltoetsen - + Show Info - Info tonen + Info tonen - + Close - Sluiten + Sluiten - + Show Dictionary - Woordenlijst weergeven + Woordenlijst weergeven - + Show go to flow - Toon ga naar de Omslagbrowser + "Ga naar Comic Flow" tonen - + Edit shortcuts - + Snelkoppelingen bewerken - + &File - &Bestand + &Bestand - - + + Open recent - + Recent geopend - + File - + Bestand - + Edit - + Bewerken - + View - + Weergave - + Go - + Gaan - + Window - + Raam - - - + + + Open Comic - Open een Strip + Open een Strip - - - + + + Comic files - Strip bestanden + Strip bestanden - + Open folder - Open een Map + Open een Map - + page_%1.jpg - pagina_%1.jpg + pagina_%1.jpg - + Image files (*.jpg) - Afbeelding bestanden (*.jpg) + Afbeelding bestanden (*.jpg) + Comics - + Strips Toggle fullscreen mode - + Schakel de modus Volledig scherm in Hide/show toolbar - + Werkbalk verbergen/tonen + General - Algemeen + Algemeen Size up magnifying glass - + Vergrootglas vergroten Size down magnifying glass - + Vergrootglas kleiner maken Zoom in magnifying glass - + Zoom in vergrootglas Zoom out magnifying glass - + Uitzoomen vergrootglas Reset magnifying glass - + Vergrootglas opnieuw instellen + Magnifiying glass - + Vergrootglas Toggle between fit to width and fit to height - + Schakel tussen Aanpassen aan breedte en Aanpassen aan hoogte + Page adjustement - + Pagina-aanpassing - + Autoscroll down - + Automatisch naar beneden scrollen - + Autoscroll up - + Automatisch omhoog scrollen - + Autoscroll forward, horizontal first - + Automatisch vooruit scrollen, eerst horizontaal - + Autoscroll backward, horizontal first - + Automatisch achteruit scrollen, eerst horizontaal - + Autoscroll forward, vertical first - + Automatisch vooruit scrollen, eerst verticaal - + Autoscroll backward, vertical first - + Automatisch achteruit scrollen, eerst verticaal - + Move down - + Ga naar beneden - + Move up - + Ga omhoog - + Move left - + Ga naar links - + Move right - + Ga naar rechts - + Go to the first page - + Ga naar de eerste pagina - + Go to the last page - + Ga naar de laatste pagina - + Offset double page to the left - + Dubbele pagina naar links verschoven - + Offset double page to the right - + Offset dubbele pagina naar rechts - + + Reading - + Lezing - + There is a new version available - Er is een nieuwe versie beschikbaar + Er is een nieuwe versie beschikbaar - + Do you want to download the new version? - Wilt u de nieuwe versie downloaden? + Wilt u de nieuwe versie downloaden? - + Remind me in 14 days - + Herinner mij er over 14 dagen aan - + Not now - + Niet nu + + + + YACReader::TrayIconController + + + &Restore + &Herstellen + + + + Systray + Systeemvak + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary blijft actief in het systeemvak. Om het programma te beëindigen, kiest u <b>Afsluiten</b> in het contextmenu van het systeemvakpictogram. YACReader::WhatsNewDialog - Close - Sluiten + Sluiten @@ -1231,170 +3871,150 @@ YACReaderFlowConfigWidget - CoverFlow look - Omslagbrowser uiterlijk + Omslagbrowser uiterlijk - How to show covers: - Omslagbladen bekijken: + Omslagbladen bekijken: - Stripe look - Brede band + Brede band - Overlapped Stripe look - Overlappende band + Overlappende band YACReaderGLFlowConfigWidget - Zoom - Zoom + Vergroting - Light - Licht + Licht - Show advanced settings - Toon geavanceerde instellingen + Toon geavanceerde instellingen - Roulette look - Roulette + Roulette - Cover Angle - Omslag hoek + Omslag hoek - Stripe look - Brede band + Brede band - Position - Positie + Positie - Z offset - Z- positie + Z- positie - Y offset - Y-positie + Y-positie - Central gap - Centrale ruimte + Centrale ruimte - Presets: - Voorinstellingen: + Voorinstellingen: - Overlapped Stripe look - Overlappende band + Overlappende band - Modern look - Modern + Modern - View angle - Kijkhoek + Kijkhoek - Max angle - Maximale hoek + Maximale hoek - Custom: - Aangepast: + Aangepast: - Classic look - Klassiek + Klassiek - Cover gap - Ruimte tss Omslag + Ruimte tss Omslag - High Performance - Hoge Prestaties + Hoge Prestaties - Performance: - Prestatie: + Prestatie: - Use VSync (improve the image quality in fullscreen mode, worse performance) - Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) + Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) - Visibility - Zichtbaarheid + Zichtbaarheid - Low Performance - Lage Prestaties + Lage Prestaties YACReaderOptionsDialog - + Save Bewaar - Use hardware acceleration (restart needed) - Gebruik hardware versnelling (opnieuw opstarten vereist) + Gebruik hardware versnelling (opnieuw opstarten vereist) - + Cancel Annuleren - + Edit shortcuts - + Snelkoppelingen bewerken - + Shortcuts - + Snelkoppelingen + + + + YACReaderSearchLineEdit + + + type to search + typ om te zoeken @@ -1408,25 +4028,25 @@ YACReaderTranslator - + YACReader translator - + YACReader-vertaler - - + + Translation - + Vertaling - + clear - + duidelijk - + Service not available - + Dienst niet beschikbaar diff --git a/YACReader/yacreader_pt.ts b/YACReader/yacreader_pt.ts index fce9c111e..c72198e98 100644 --- a/YACReader/yacreader_pt.ts +++ b/YACReader/yacreader_pt.ts @@ -6,7 +6,197 @@ None - + Nenhum + + + + AddLabelDialog + + + Label name: + Nome da etiqueta: + + + + Choose a color: + Escolha uma cor: + + + + accept + aceitar + + + + cancel + cancelar + + + + AddLibraryDialog + + + Comics folder : + Pasta dos quadrinhos : + + + + Library name : + Nome da Biblioteca : + + + + Add + Adicionar + + + + Cancel + Cancelar + + + + Add an existing library + Adicionar uma biblioteca existente + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Antes de se conectar ao Comic Vine, você precisa de sua própria chave de API. Por favor, ganhe um <a href="http://www.comicvine.com/api/">aqui</a> grátis + + + + Paste here your Comic Vine API key + Cole aqui sua chave API do Comic Vine + + + + Accept + Aceitar + + + + Cancel + Cancelar + + + + AppearanceTabWidget + + + Color scheme + Esquema de cores + + + + System + Sistema + + + + Light + Luz + + + + Dark + Escuro + + + + Custom + Personalizado + + + + Remove + Remover + + + + Remove this user-imported theme + Remova este tema importado pelo usuário + + + + Light: + Luz: + + + + Dark: + Escuro: + + + + Custom: + Personalizado: + + + + Import theme... + Importar tema... + + + + Theme + Tema + + + + Theme editor + Editor de tema + + + + Open Theme Editor... + Abra o Editor de Tema... + + + + Theme editor error + Erro no editor de tema + + + + The current theme JSON could not be loaded. + O tema atual JSON não pôde ser carregado. + + + + Import theme + Importar tema + + + + JSON files (*.json);;All files (*) + Arquivos JSON (*.json);;Todos os arquivos (*) + + + + Could not import theme from: +%1 + Não foi possível importar o tema de: +%1 + + + + Could not import theme from: +%1 + +%2 + Não foi possível importar o tema de: +%1 + +%2 + + + + Import failed + Falha na importação @@ -34,1124 +224,3574 @@ - EditShortcutsDialog + ClassicComicsView - - Restore defaults - + + Hide comic flow + Ocultar Comic Flow + + + ComicModel - - To change a shortcut, double click in the key combination and type the new keys. - + + yes + sim - - Shortcuts settings - + + no + não - - Shortcut in use - + + Title + Título - - The shortcut "%1" is already assigned to other function - + + File Name + Nome do arquivo - - - FileComic - - 7z not found - 7z não encontrado + + Pages + Páginas - - CRC error on page (%1): some of the pages will not be displayed correctly - + + Size + Tamanho - - Unknown error opening the file - + + Read + Ler - - Format not supported - + + Current Page + Página atual - - - GoToDialog - - Go To - Ir Para + + Publication Date + Data de publicação - - Go to... - Ir para... + + Rating + Avaliação - - - Total pages : - Total de páginas : + + Series + Série - - Cancel - Cancelar + + Volume + Tomo - - Page : - Página : + + Story Arc + Arco de história - GoToFlowToolBar + ComicVineDialog - - Page : - Página : + + skip + pular - - - HelpAboutDialog - - Help - Ajuda + + back + voltar - - System info - + + next + próximo - - About - + + search + procurar + + + + close + fechar - - - LogWindow - - Log window - + + + comic %1 of %2 - %3 + história em quadrinhos %1 de %2 - %3 - - &Pause - + + + + Looking for volume... + Procurando volume... - - &Save - + + %1 comics selected + %1 quadrinhos selecionados - - C&lear - + + Error connecting to ComicVine + Erro ao conectar-se ao ComicVine - - &Copy - + + + Retrieving tags for : %1 + Recuperando tags para: %1 - - Level: - + + Retrieving volume info... + Recuperando informações de volume... - - &Auto scroll - + + Looking for comic... + Procurando quadrinhos... - MainWindowViewer + ContinuousPageWidget - Help - Ajuda + + Loading page %1 + Carregando página %1 + + + CreateLibraryDialog - Save - Salvar + + Comics folder : + Pasta dos quadrinhos : - &File - &Arquivo + + Library Name : + Nome da Biblioteca : - &Next - &Próxima + + Create + Criar - &Open - &Abrir + + Cancel + Cancelar - Close - Fechar + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Criar uma biblioteca pode levar vários minutos. Você pode interromper o processo e atualizar a biblioteca posteriormente para concluir a tarefa. - Open Comic - Abrir Quadrinho + + Create new library + Criar uma nova biblioteca - Go To - Ir Para + + Path not found + Caminho não encontrado - Set bookmark - Definir marcador + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + O caminho selecionado não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta + + + EditShortcutsDialog - Switch to double page mode - Alternar para o modo dupla página + + Restore defaults + Restaurar padrões - Save current page - Salvar página atual + + To change a shortcut, double click in the key combination and type the new keys. + Para alterar um atalho, clique duas vezes na combinação de teclas e digite as novas teclas. - Double page mode - Modo dupla página + + Shortcuts settings + Configurações de atalhos - Switch Magnifying glass - Alternar Lupa + + Shortcut in use + Atalho em uso - Open Folder - Abrir Pasta + + The shortcut "%1" is already assigned to other function + O atalho "%1" já está atribuído a outra função + + + EmptyFolderWidget - Go to previous page - Ir para a página anterior + + This folder doesn't contain comics yet + Esta pasta ainda não contém quadrinhos + + + EmptyLabelWidget - Open a comic - Abrir um quadrinho + + This label doesn't contain comics yet + Este rótulo ainda não contém quadrinhos + + + EmptyReadingListWidget - Image files (*.jpg) - Arquivos de imagem (*.jpg) + + This reading list does not contain any comics yet + Esta lista de leitura ainda não contém quadrinhos + + + EmptySpecialListWidget - Next Comic - Próximo Quadrinho + + No favorites + Sem favoritos - Fit Width - Ajustar à Largura + + You are not reading anything yet, come on!! + Você ainda não está lendo nada, vamos lá!! - Options - Opções + + There are no recent comics! + Não há quadrinhos recentes! + + + ExportComicsInfoDialog - Show Info - Mostrar Informações + + Output file : + Arquivo de saída: - Open folder - Abrir pasta + + Create + Criar - Go to page ... - Ir para a página... + + Cancel + Cancelar - &Previous - A&nterior + + Export comics info + Exportar informações de quadrinhos - Go to next page - Ir para a próxima página + + Destination database name + Nome do banco de dados de destino - Show keyboard shortcuts - Mostrar teclas de atalhos + + Problem found while writing + Problema encontrado ao escrever - There is a new version available - Há uma nova versão disponível + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + O caminho selecionado para o arquivo de saída não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta + + + ExportLibraryDialog - Open next comic - Abrir próximo quadrinho + + Output folder : + Pasta de saída : - Show bookmarks - Mostrar marcadores + + Create + Criar - Open previous comic - Abrir quadrinho anterior + + Cancel + Cancelar - Rotate image to the left - Girar imagem à esquerda + + Create covers package + Criar pacote de capas - Show the bookmarks of the current comic - Mostrar os marcadores do quadrinho atual + + Problem found while writing + Problema encontrado ao escrever - YACReader options - Opções do YACReader + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + O caminho selecionado para o arquivo de saída não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta - Help, About YACReader - Ajuda, Sobre o YACReader + + Destination directory + Diretório de destino + + + FileComic - Previous Comic - Quadrinho Anterior + + 7z not found + 7z não encontrado - Magnifying glass - Lupa + + CRC error on page (%1): some of the pages will not be displayed correctly + Erro CRC na página (%1): algumas páginas não serão exibidas corretamente - Set a bookmark on the current page - Definir um marcador na página atual + + Unknown error opening the file + Erro desconhecido ao abrir o arquivo - Do you want to download the new version? - Você deseja baixar a nova versão? + + Format not supported + Formato não suportado + + + + GoToDialog + + + Go To + Ir Para + + + + Go to... + Ir para... + + + + + Total pages : + Total de páginas : + + + + Cancel + Cancelar + + + + Page : + Página : + + + + GoToFlowToolBar + + + Page : + Página : + + + + GridComicsView + + + Show info + Mostrar informações + + + + HelpAboutDialog + + + Help + Ajuda + + + + System info + Informações do sistema + + + + About + Sobre + + + + ImportComicsInfoDialog + + + Import comics info + Importar informações de quadrinhos + + + + Info database location : + Localização do banco de dados de informações: + + + + Import + Importar + + + + Cancel + Cancelar + + + + Comics info file (*.ydb) + Arquivo de informações de quadrinhos (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nome da Biblioteca : + + + + Package location : + Local do pacote : + + + + Destination folder : + Pasta de destino : + + + + Unpack + Desempacotar + + + + Cancel + Cancelar + + + + Extract a catalog + Extrair um catálogo + + + + Compresed library covers (*.clc) + Capas da biblioteca compactada (*.clc) + + + + ImportWidget + + + stop + parar + + + + Some of the comics being added... + Alguns dos quadrinhos sendo adicionados... + + + + Importing comics + Importando quadrinhos + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary está criando uma nova biblioteca.</p><p>A criação de uma biblioteca pode levar vários minutos. Você pode interromper o processo e atualizar a biblioteca posteriormente para concluir a tarefa.</p> + + + + Updating the library + Atualizando a biblioteca + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>A biblioteca atual está sendo atualizada. Para atualizações mais rápidas, atualize suas bibliotecas com frequência.</p><p>Você pode interromper o processo e continuar atualizando esta biblioteca mais tarde.</p> + + + + Upgrading the library + Atualizando a biblioteca + + + + <p>The current library is being upgraded, please wait.</p> + <p>A biblioteca atual está sendo atualizada. Aguarde.</p> + + + + Scanning the library + Digitalizando a biblioteca + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>A biblioteca atual está sendo verificada em busca de informações de metadados XML legados.</p><p>Isso só será necessário uma vez e somente se a biblioteca tiver sido criada com YACReaderLibrary 9.8.2 ou anterior.</p> + + + + LibraryWindow + + + YACReader Library + Biblioteca YACReader + + + + + + comic + cômico + + + + + + manga + mangá + + + + + + western manga (left to right) + mangá ocidental (da esquerda para a direita) + + + + + + web comic + quadrinhos da web + + + + + + 4koma (top to botom) + 4koma (de cima para baixo) + + + + + + + Set type + Definir tipo + + + + Library + Biblioteca + + + + Folder + Pasta + + + + Comic + Quadrinhos + + + + Upgrade failed + Falha na atualização + + + + There were errors during library upgrade in: + Ocorreram erros durante a atualização da biblioteca em: + + + + Update needed + Atualização necessária + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Esta biblioteca foi criada com uma versão anterior do YACReaderLibrary. Ele precisa ser atualizado. Atualizar agora? + + + + Download new version + Baixe a nova versão + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Esta biblioteca foi criada com uma versão mais recente do YACReaderLibrary. Baixe a nova versão agora? + + + + Library not available + Biblioteca não disponível + + + + Library '%1' is no longer available. Do you want to remove it? + A biblioteca '%1' não está mais disponível. Você quer removê-lo? + + + + Old library + Biblioteca antiga + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + A biblioteca '%1' foi criada com uma versão mais antiga do YACReaderLibrary. Deve ser criado novamente. Deseja criar a biblioteca agora? + + + + + Copying comics... + Copiando quadrinhos... + + + + + Moving comics... + Quadrinhos em movimento... + + + + Add new folder + Adicionar nova pasta + + + + Folder name: + Nome da pasta: + + + + No folder selected + Nenhuma pasta selecionada + + + + Please, select a folder first + Por favor, selecione uma pasta primeiro + + + + Error in path + Erro no caminho + + + + There was an error accessing the folder's path + Ocorreu um erro ao acessar o caminho da pasta + + + + Delete folder + Excluir pasta + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + A pasta selecionada e todo o seu conteúdo serão excluídos do disco. Tem certeza? + + + + + Unable to delete + Não foi possível excluir + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Ocorreu um problema ao tentar excluir as pastas selecionadas. Por favor, verifique as permissões de gravação e certifique-se de que algum aplicativo esteja usando essas pastas ou qualquer um dos arquivos contidos. + + + + Add new reading lists + Adicione novas listas de leitura + + + + + List name: + Nome da lista: + + + + Delete list/label + Excluir lista/rótulo + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + O item selecionado será excluído, seus quadrinhos ou pastas NÃO serão excluídos do disco. Tem certeza? + + + + Rename list name + Renomear nome da lista + + + + Open folder... + Abrir pasta... + + + + Update folder + Atualizar pasta + + + + Rescan library for XML info + Digitalizar novamente a biblioteca em busca de informações XML + + + + Set as uncompleted + Definir como incompleto + + + + Set as completed + Definir como concluído + + + + Set as read + Definir como lido + + + + + Set as unread + Definir como não lido + + + + Set custom cover + Definir capa personalizada + + + + Delete custom cover + Excluir capa personalizada + + + + Save covers + Salvar capas + + + + You are adding too many libraries. + Você está adicionando muitas bibliotecas. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Você está adicionando muitas bibliotecas. + +Você provavelmente só precisa de uma biblioteca em sua pasta de quadrinhos de nível superior. Você pode navegar em qualquer subpasta usando a seção de pastas na barra lateral esquerda. + +YACReaderLibrary não impedirá você de criar mais bibliotecas, mas você deve manter o número de bibliotecas baixo. + + + + + YACReader not found + YACReader não encontrado + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader não encontrado. YACReader deve ser instalado na mesma pasta que YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader não encontrado. Pode haver um problema com a instalação do YACReader. + + + + Error + Erro + + + + Error opening comic with third party reader. + Erro ao abrir o quadrinho com leitor de terceiros. + + + + Library not found + Biblioteca não encontrada + + + + The selected folder doesn't contain any library. + A pasta selecionada não contém nenhuma biblioteca. + + + + Are you sure? + Você tem certeza? + + + + Do you want remove + Você deseja remover + + + + library? + biblioteca? + + + + Remove and delete metadata + Remover e excluir metadados + + + + Library info + Informações da biblioteca + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Ocorreu um problema ao tentar excluir os quadrinhos selecionados. Por favor, verifique as permissões de gravação nos arquivos selecionados ou na pasta que os contém. + + + + Assign comics numbers + Atribuir números de quadrinhos + + + + Assign numbers starting in: + Atribua números começando em: + + + + Invalid image + Imagem inválida + + + + The selected file is not a valid image. + O arquivo selecionado não é uma imagem válida. + + + + Error saving cover + Erro ao salvar a capa + + + + There was an error saving the cover image. + Ocorreu um erro ao salvar a imagem da capa. + + + + Error creating the library + Erro ao criar a biblioteca + + + + Error updating the library + Erro ao atualizar a biblioteca + + + + Error opening the library + Erro ao abrir a biblioteca + + + + Delete comics + Excluir quadrinhos + + + + All the selected comics will be deleted from your disk. Are you sure? + Todos os quadrinhos selecionados serão excluídos do seu disco. Tem certeza? + + + + Remove comics + Remover quadrinhos + + + + Comics will only be deleted from the current label/list. Are you sure? + Os quadrinhos serão excluídos apenas do rótulo/lista atual. Tem certeza? + + + + Library name already exists + O nome da biblioteca já existe + + + + There is another library with the name '%1'. + Existe outra biblioteca com o nome '%1'. + + + + LibraryWindowActions + + + Create a new library + Criar uma nova biblioteca + + + + Open an existing library + Abrir uma biblioteca existente + + + + + Export comics info + Exportar informações de quadrinhos + + + + + Import comics info + Importar informações de quadrinhos + + + + Pack covers + Capas de pacote + + + + Pack the covers of the selected library + Pacote de capas da biblioteca selecionada + + + + Unpack covers + Desembale as capas + + + + Unpack a catalog + Desempacotar um catálogo + + + + Update library + Atualizar biblioteca + + + + Update current library + Atualizar biblioteca atual + + + + Rename library + Renomear biblioteca + + + + Rename current library + Renomear biblioteca atual + + + + Remove library + Remover biblioteca + + + + Remove current library from your collection + Remover biblioteca atual da sua coleção + + + + Rescan library for XML info + Digitalizar novamente a biblioteca em busca de informações XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Tenta encontrar informações XML incorporadas em arquivos de quadrinhos. Você só precisa fazer isso se a biblioteca foi criada com versões 9.8.2 ou anteriores ou se você estiver usando software de terceiros para incorporar informações XML nos arquivos. + + + + Show library info + Mostrar informações da biblioteca + + + + Show information about the current library + Mostrar informações sobre a biblioteca atual + + + + Open current comic + Abrir quadrinho atual + + + + Open current comic on YACReader + Abrir quadrinho atual no YACReader + + + + Save selected covers to... + Salvar capas selecionadas em... + + + + Save covers of the selected comics as JPG files + Salve as capas dos quadrinhos selecionados como arquivos JPG + + + + + Set as read + Definir como lido + + + + Set comic as read + Definir quadrinhos como lidos + + + + + Set as unread + Definir como não lido + + + + Set comic as unread + Definir quadrinhos como não lidos + + + + + manga + mangá + + + + Set issue as manga + Definir problema como mangá + + + + + comic + cômico + + + + Set issue as normal + Defina o problema como normal + + + + western manga + mangá ocidental + + + + Set issue as western manga + Definir problema como mangá ocidental + + + + + web comic + quadrinhos da web + + + + Set issue as web comic + Definir o problema como web comic + + + + + yonkoma + tira yonkoma + + + + Set issue as yonkoma + Definir problema como yonkoma + + + + Show/Hide marks + Mostrar/ocultar marcas + + + + Show or hide read marks + Mostrar ou ocultar marcas de leitura + + + + Show/Hide recent indicator + Mostrar/ocultar indicador recente + + + + Show or hide recent indicator + Mostrar ou ocultar indicador recente + + + + + Fullscreen mode on/off + Modo tela cheia ativado/desativado + + + + Help, About YACReader + Ajuda, Sobre o YACReader + + + + Add new folder + Adicionar nova pasta + + + + Add new folder to the current library + Adicionar nova pasta à biblioteca atual + + + + Delete folder + Excluir pasta + + + + Delete current folder from disk + Exclua a pasta atual do disco + + + + Select root node + Selecionar raiz + + + + Expand all nodes + Expandir todos + + + + Collapse all nodes + Recolher todos os nós + + + + Show options dialog + Mostrar opções + + + + Show comics server options dialog + Mostrar caixa de diálogo de opções do servidor de quadrinhos + + + + + Change between comics views + Alterar entre visualizações de quadrinhos + + + + Open folder... + Abrir pasta... + + + + Set as uncompleted + Definir como incompleto + + + + Set as completed + Definir como concluído + + + + Set custom cover + Definir capa personalizada + + + + Delete custom cover + Excluir capa personalizada + + + + western manga (left to right) + mangá ocidental (da esquerda para a direita) + + + + Open containing folder... + Abrir a pasta contendo... + + + + Reset comic rating + Redefinir classificação de quadrinhos + + + + Select all comics + Selecione todos os quadrinhos + + + + Edit + Editar + + + + Assign current order to comics + Atribuir ordem atual aos quadrinhos + + + + Update cover + Atualizar capa + + + + Delete selected comics + Excluir quadrinhos selecionados + + + + Delete metadata from selected comics + Excluir metadados dos quadrinhos selecionados + + + + Download tags from Comic Vine + Baixe tags do Comic Vine + + + + Focus search line + Linha de pesquisa de foco + + + + Focus comics view + Visualização de quadrinhos em foco + + + + Edit shortcuts + Editar atalhos + + + + &Quit + &Qfato + + + + Update folder + Atualizar pasta + + + + Update current folder + Atualizar pasta atual + + + + Scan legacy XML metadata + Digitalize metadados XML legados + + + + Add new reading list + Adicionar nova lista de leitura + + + + Add a new reading list to the current library + Adicione uma nova lista de leitura à biblioteca atual + + + + Remove reading list + Remover lista de leitura + + + + Remove current reading list from the library + Remover lista de leitura atual da biblioteca + + + + Add new label + Adicionar novo rótulo + + + + Add a new label to this library + Adicione um novo rótulo a esta biblioteca + + + + Rename selected list + Renomear lista selecionada + + + + Rename any selected labels or lists + Renomeie quaisquer rótulos ou listas selecionados + + + + Add to... + Adicionar à... + + + + Favorites + Favoritos + + + + Add selected comics to favorites list + Adicione quadrinhos selecionados à lista de favoritos + + + + LocalComicListModel + + + file name + nome do arquivo + + + + MainWindowViewer + + Help + Ajuda + + + Save + Salvar + + + &File + &Arquivo + + + &Next + &Próxima + + + &Open + &Abrir + + + Close + Fechar + + + Open Comic + Abrir Quadrinho + + + Go To + Ir Para + + + Set bookmark + Definir marcador + + + Switch to double page mode + Alternar para o modo dupla página + + + Save current page + Salvar página atual + + + Double page mode + Modo dupla página + + + Switch Magnifying glass + Alternar Lupa + + + Open Folder + Abrir Pasta + + + Go to previous page + Ir para a página anterior + + + Open a comic + Abrir um quadrinho + + + Image files (*.jpg) + Arquivos de imagem (*.jpg) + + + Next Comic + Próximo Quadrinho + + + Fit Width + Ajustar à Largura + + + Options + Opções + + + Show Info + Mostrar Informações + + + Open folder + Abrir pasta + + + Go to page ... + Ir para a página... + + + &Previous + A&nterior + + + Go to next page + Ir para a próxima página + + + Show keyboard shortcuts + Mostrar teclas de atalhos + + + There is a new version available + Há uma nova versão disponível + + + Open next comic + Abrir próximo quadrinho + + + Show bookmarks + Mostrar marcadores + + + Open previous comic + Abrir quadrinho anterior + + + Rotate image to the left + Girar imagem à esquerda + + + Show the bookmarks of the current comic + Mostrar os marcadores do quadrinho atual + + + YACReader options + Opções do YACReader + + + Help, About YACReader + Ajuda, Sobre o YACReader + + + Previous Comic + Quadrinho Anterior + + + Magnifying glass + Lupa + + + Set a bookmark on the current page + Definir um marcador na página atual + + + Do you want to download the new version? + Você deseja baixar a nova versão? + + + Rotate image to the right + Girar imagem à direita + + + + NoLibrariesWidget + + + You don't have any libraries yet + Você ainda não tem nenhuma biblioteca + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Você pode criar uma biblioteca em qualquer pasta, YACReaderLibrary importará todos os quadrinhos e pastas desta pasta. Se você já criou alguma biblioteca, poderá abri-la.</p><p>Não se esqueça de que você pode usar o YACReader como um aplicativo independente para ler quadrinhos em seu computador.</p> + + + + create your first library + crie sua primeira biblioteca + + + + add an existing one + adicione um existente + + + + NoSearchResultsWidget + + + No results + Nenhum resultado + + + + OptionsDialog + + + My comics path + Meu caminho de quadrinhos + + + + "Go to flow" size + Tamanho de "Ir para Comic Flow" + + + + + Libraries + Bibliotecas + + + + Comic Flow + Comic Flow + + + + Grid view + Visualização em grade + + + + + Appearance + Aparência + + + + + Options + Opções + + + + + Language + Idioma + + + + + Application language + Idioma do aplicativo + + + + + System default + Padrão do sistema + + + + Tray icon settings (experimental) + Configurações do ícone da bandeja (experimental) + + + + Close to tray + Perto da bandeja + + + + Start into the system tray + Comece na bandeja do sistema + + + + Edit Comic Vine API key + Editar chave da API Comic Vine + + + + Comic Vine API key + Chave de API do Comic Vine + + + + ComicInfo.xml legacy support + Suporte legado ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importe metadados de ComicInfo.xml ao adicionar novos quadrinhos + + + + Consider 'recent' items added or updated since X days ago + Considere itens 'recentes' adicionados ou atualizados há X dias + + + + Third party reader + Leitor de terceiros + + + + Write {comic_file_path} where the path should go in the command + Escreva {comic_file_path} onde o caminho deve ir no comando + + + + + Clear + Claro + + + + Update libraries at startup + Atualizar bibliotecas na inicialização + + + + Try to detect changes automatically + Tente detectar alterações automaticamente + + + + Update libraries periodically + Atualize bibliotecas periodicamente + + + + Interval: + Intervalo: + + + + 30 minutes + 30 minutos + + + + 1 hour + 1 hora + + + + 2 hours + 2 horas + + + + 4 hours + 4 horas + + + + 8 hours + 8 horas + + + + 12 hours + 12 horas + + + + daily + diário + + + + Update libraries at certain time + Atualizar bibliotecas em determinado momento + + + + Time: + Tempo: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + AVISO! Durante as atualizações da biblioteca, as gravações no banco de dados são desativadas! +Não agende atualizações enquanto estiver usando o aplicativo ativamente. +Durante as atualizações automáticas, o aplicativo bloqueará algumas ações até que a atualização seja concluída. +Para interromper uma atualização automática, toque no indicador de carregamento próximo ao título Bibliotecas. + + + + Modifications detection + Detecção de modificações + + + + Compare the modified date of files when updating a library (not recommended) + Compare a data de modificação dos arquivos ao atualizar uma biblioteca (não recomendado) + + + + Enable background image + Ativar imagem de fundo + + + + Opacity level + Nível de opacidade + + + + Blur level + Nível de desfoque + + + + Use selected comic cover as background + Use a capa de quadrinhos selecionada como plano de fundo + + + + Restore defautls + Restaurar padrões + + + + Background + Fundo + + + + Display continue reading banner + Exibir banner para continuar lendo + + + + Display current comic banner + Exibir banner de quadrinhos atual + + + + Continue reading + Continuar lendo + + + + Comics directory + Diretório de quadrinhos + + + + + Restart is needed + Reiniciar é necessário + + + + Display + Mostrar + + + + Show time in current page information label + Mostrar hora no rótulo de informações da página atual + + + + Background color + Cor de fundo + + + + Choose + Escolher + + + + Scroll behaviour + Comportamento de rolagem + + + + Disable scroll animations and smooth scrolling + Desative animações de rolagem e rolagem suave + + + + Do not turn page using scroll + Não vire a página usando scroll + + + + Use single scroll step to turn page + Use uma única etapa de rolagem para virar a página + + + + Mouse mode + Modo mouse + + + + Only Back/Forward buttons can turn pages + Apenas os botões Voltar/Avançar podem virar páginas + + + + Use the Left/Right buttons to turn pages. + Use os botões Esquerda/Direita para virar as páginas. + + + + Click left or right half of the screen to turn pages. + Clique na metade esquerda ou direita da tela para virar as páginas. + + + + Quick Navigation Mode + Modo de navegação rápida + + + + Disable mouse over activation + Desativar ativação do mouse sobre + + + + Brightness + Brilho + + + + Contrast + Contraste + + + + Gamma + Gama + + + + Reset + Reiniciar + + + + Image options + Opções de imagem + + + + Fit options + Opções de ajuste + + + + Enlarge images to fit width/height + Amplie as imagens para caber na largura/altura + + + + Double Page options + Opções de página dupla + + + + Show covers as single page + Mostrar capas como página única + + + + Scaling + Dimensionamento + + + + Scaling method + Método de dimensionamento + + + + Nearest (fast, low quality) + Mais próximo (rápido, baixa qualidade) + + + + Bilinear + Interpola??o bilinear + + + + Lanczos (better quality) + Lanczos (melhor qualidade) + + + + + General + Em geral + + + + Page Flow + Fluxo de página + + + + Image adjustment + Ajuste de imagem + + + + PropertiesDialog + + + General info + Informações gerais + + + + Plot + Trama + + + + Authors + Autores + + + + Publishing + Publicação + + + + Notes + Notas + + + + Cover page + Página de rosto + + + + Load previous page as cover + Carregar página anterior como capa + + + + Load next page as cover + Carregar a próxima página como capa + + + + Reset cover to the default image + Redefinir a capa para a imagem padrão + + + + Load custom cover image + Carregar imagem de capa personalizada + + + + Series: + Série: + + + + Title: + Título: + + + + + + of: + de: + + + + Issue number: + Número de emissão: + + + + Volume: + Tomo: + + + + Arc number: + Número do arco: + + + + Story arc: + Arco da história: + + + + alt. number: + alt. número: + + + + Alternate series: + Série alternativa: + + + + Series Group: + Grupo de séries: + + + + Genre: + Gênero: + + + + Size: + Tamanho: + + + + Writer(s): + Escritor(es): + + + + Penciller(s): + Desenhador(es): + + + + Inker(s): + Tinteiro(s): + + + + Colorist(s): + Colorista(s): + + + + Letterer(s): + Letrista(s): + + + + Cover Artist(s): + Artista(s) da capa: + + + + Editor(s): + Editor(es): + + + + Imprint: + Imprimir: + + + + Day: + Dia: + + + + Month: + Mês: + + + + Year: + Ano: + + + + Publisher: + Editor: + + + + Format: + Formatar: + + + + Color/BW: + Cor/PB: + + + + Age rating: + Classificação etária: + + + + Type: + Tipo: + + + + Language (ISO): + Idioma (ISO): + + + + Synopsis: + Sinopse: + + + + Characters: + Personagens: + + + + Teams: + Equipes: + + + + Locations: + Locais: + + + + Main character or team: + Personagem principal ou equipe: + + + + Review: + Análise: + + + + Notes: + Notas: + + + + Tags: + Etiquetas: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Link do Comic Vine: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> visualizar </a> + + + + Not found + Não encontrado + + + + Comic not found. You should update your library. + Quadrinho não encontrado. Você deve atualizar sua biblioteca. + + + + Edit comic information + Editar informações dos quadrinhos + + + + Edit selected comics information + Edite as informações dos quadrinhos selecionados + + + + Invalid cover + Capa inválida + + + + The image is invalid. + A imagem é inválida. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer é a versão sem cabeça (sem interface gráfica) do YACReaderLibrary. + +Este aplicativo suporta configurações persistentes, para configurá-las edite este arquivo %1 +Para saber mais sobre as configurações disponíveis, verifique a documentação em https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + 7z lib not found + Biblioteca 7z não encontrada + + + + unable to load 7z lib from ./utils + não é possível carregar 7z lib de ./utils + + + + Trace + Rastreamento + + + + Debug + Depurar + + + + Info + Informações + + + + Warning + Aviso + + + + Error + Erro + + + + Fatal + Cr?tico + + + + Select custom cover + Selecione a capa personalizada + + + + Images (%1) + Imagens (%1) + + + + The file could not be read or is not valid JSON. + O arquivo não pôde ser lido ou não é JSON válido. + + + + This theme is for %1, not %2. + Este tema é para %1, não %2. + + + + Libraries + Bibliotecas + + + + Folders + Pastas + + + + Reading Lists + Listas de leitura + + + + RenameLibraryDialog + + + New Library Name : + Novo nome da biblioteca : + + + + Rename + Renomear + + + + Cancel + Cancelar + + + + Rename current library + Renomear biblioteca atual + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Número de volumes encontrados: %1 + + + + + page %1 of %2 + página %1 de %2 + + + + Number of %1 found : %2 + Número de %1 encontrado: %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Forneça algumas informações adicionais para esta história em quadrinhos. + + + + Series: + Série: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Use a pesquisa de correspondência exata. Desative se quiser encontrar volumes que correspondam a algumas das palavras do nome. + + + + SearchVolume + + + Please provide some additional information. + Forneça algumas informações adicionais. + + + + Series: + Série: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Use a pesquisa de correspondência exata. Desative se quiser encontrar volumes que correspondam a algumas das palavras do nome. + + + + SelectComic + + + Please, select the right comic info. + Por favor, selecione as informações corretas dos quadrinhos. + + + + comics + quadrinhos + + + + loading cover + tampa de carregamento + + + + loading description + descrição de carregamento + + + + comic description unavailable + descrição do quadrinho indisponível + + + + SelectVolume + + + Please, select the right series for your comic. + Por favor, selecione a série certa para o seu quadrinho. + + + + Filter: + Filtro: + + + + volumes + tomos + + + + Nothing found, clear the filter if any. + Nada encontrado, limpe o filtro, se houver. + + + + loading cover + tampa de carregamento + + + + loading description + descrição de carregamento + + + + volume description unavailable + descrição do volume indisponível + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Você está tentando obter informações sobre vários quadrinhos ao mesmo tempo. Eles fazem parte da mesma série? + + + + yes + sim + + + + no + não + + + + ServerConfigDialog + + + set port + definir porta + + + + Server connectivity information + Informações de conectividade do servidor + + + + Scan it! + Digitalize! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + O YACReader está disponível para dispositivos iOS e Android.<br/>Descubra-o para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> ou <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Escolha um endereço IP + + + + Port + Porta + + + + enable the server + habilitar o servidor + + + + ShortcutsDialog + + Close + Fechar + + + YACReader keyboard shortcuts + Teclas de atalhos do YACReader + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Por favor, classifique a lista de quadrinhos à esquerda até que corresponda às informações dos quadrinhos. + + + + sort comics to match comic information + classifique os quadrinhos para corresponder às informações dos quadrinhos + + + + issues + problemas + + + + remove selected comics + remover quadrinhos selecionados + + + + restore all removed comics + restaurar todos os quadrinhos removidos + + + + ThemeEditorDialog + + + Theme Editor + Editor de Tema + + + + + + + + + + + - + - + + + + i + eu + + + + Expand all + Expandir tudo + + + + Collapse all + Recolher tudo + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Segure para piscar o valor selecionado na UI (magenta/alternado/0↔10). Os lançamentos restauram o original. - Rotate image to the right - Girar imagem à direita + + Search… + Procurar… - - - OptionsDialog - - My comics path - Meu caminho de quadrinhos + + Light + Luz - - "Go to flow" size - Tamanho do "Ir para cheia" + + Dark + Escuro - - Options - Opções + + ID: + EU IA: - - Comics directory - Diretório de quadrinhos + + Display name: + Nome de exibição: - - Restart is needed - Reiniciar é necessário + + Variant: + Variante: - - Display - + + Theme info + Informações do tema - - Show time in current page information label - + + Parameter + Parâmetro - - Background color - + + Value + Valor - - Choose - + + Save and apply + Salvar e aplicar - - Scroll behaviour - + + Export to file... + Exportar para arquivo... - - Disable scroll animations and smooth scrolling - + + Load from file... + Carregar do arquivo... - - Do not turn page using scroll - + + Close + Fechar - - Use single scroll step to turn page - + + Double-click to edit color + Clique duas vezes para editar a cor - - Mouse mode - + + + + + + + true + verdadeiro - - Only Back/Forward buttons can turn pages - + + + + + false + falso - - Use the Left/Right buttons to turn pages. - + + Double-click to toggle + Clique duas vezes para alternar - - Click left or right half of the screen to turn pages. - + + Double-click to edit value + Clique duas vezes para editar o valor - - Quick Navigation Mode - + + + + Edit: %1 + Editar: %1 - - Disable mouse over activation - + + Save theme + Salvar tema - - Brightness - + + + JSON files (*.json);;All files (*) + Arquivos JSON (*.json);;Todos os arquivos (*) - - Contrast - + + Save failed + Falha ao salvar - - Gamma - + + Could not open file for writing: +%1 + Não foi possível abrir o arquivo para gravação: +%1 - - Reset - + + Load theme + Carregar tema - - Image options - + + + + Load failed + Falha no carregamento - - Fit options - + + Could not open file: +%1 + Não foi possível abrir o arquivo: +%1 - - Enlarge images to fit width/height - + + Invalid JSON: +%1 + JSON inválido: +%1 - - Double Page options - + + Expected a JSON object. + Esperava um objeto JSON. + + + TitleHeader - - Show covers as single page - + + SEARCH + PROCURAR + + + UpdateLibraryDialog - - General - + + Updating.... + Atualizando.... - - Page Flow - + + Cancel + Cancelar - - Image adjustment - + + Update library + Atualizar biblioteca - QObject + Viewer - - 7z lib not found - + + + Press 'O' to open comic. + Pressione 'O' para abrir um quadrinho. - - unable to load 7z lib from ./utils - + + Loading...please wait! + Carregando... por favor, aguarde! - - Trace - + + Not found + Não encontrado - - Debug - + + Comic not found + Quadrinho não encontrado - - Info - + + Error opening comic + Erro ao abrir quadrinho - - Warning - + + CRC Error + Erro CRC - - Error - + + Page not available! + Página não disponível! - - Fatal - + + Cover! + Cobrir! - - Select custom cover - + + Last page! + Última página! + + + VolumeComicsModel - - Images (%1) - + + title + título - QsLogging::LogWindowModel + VolumesModel - - Time - + + year + ano - - Level - + + issues + problemas - - Message - + + publisher + editor - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - + + Presets: + Predefinições: - - &Resume - + + Classic look + Aparência clássica - - Save log - + + Stripe look + Olhar lista - - Log file (*.log) - + + Overlapped Stripe look + Olhar lista sobreposta - - - ShortcutsDialog - Close - Fechar + + Modern look + Aparência moderna - YACReader keyboard shortcuts - Teclas de atalhos do YACReader + + Roulette look + Aparência de roleta - - - Viewer - - - Press 'O' to open comic. - Pressione 'O' para abrir um quadrinho. + + Show advanced settings + Mostrar configurações avançadas - - Loading...please wait! - Carregando... por favor, aguarde! + + Custom: + Personalizado: - - Not found - + + View angle + Ângulo de visão - - Comic not found - + + Position + Posição - - Error opening comic - + + Cover gap + Cubra a lacuna - - CRC Error - + + Central gap + Lacuna central - - Page not available! - + + Zoom + Amplia??o - - Cover! - + + Y offset + Deslocamento Y - - Last page! - + + Z offset + Deslocamento Z + + + + Cover Angle + Ângulo de cobertura + + + + Visibility + Visibilidade + + + + Light + Luz + + + + Max angle + Ângulo máximo + + + + Low Performance + Baixo desempenho + + + + High Performance + Alto desempenho + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Use VSync (melhora a qualidade da imagem em modo tela cheia, pior desempenho) + + + + Performance: + Desempenho: YACReader::MainWindowViewer - + &Open - &Abrir + &Abrir - + Open a comic - Abrir um quadrinho + Abrir um quadrinho - + New instance - + Nova instância - + Open Folder - Abrir Pasta + Abrir Pasta - + Open image folder - + Abra a pasta de imagens - + Open latest comic - + Abra o último quadrinho - + Open the latest comic opened in the previous reading session - + Abra o último quadrinho aberto na sessão de leitura anterior - + Clear - + Claro - + Clear open recent list - + Limpar lista recente aberta - + Save - Salvar + Salvar - + Save current page - Salvar página atual + Salvar página atual Previous Comic - Quadrinho Anterior + Quadrinho Anterior - - - + + + Open previous comic - Abrir quadrinho anterior + Abrir quadrinho anterior - + Next Comic - Próximo Quadrinho + Próximo Quadrinho - - - + + + Open next comic - Abrir próximo quadrinho + Abrir próximo quadrinho - + &Previous - A&nterior + A&nterior - - - + + + Go to previous page - Ir para a página anterior + Ir para a página anterior - + &Next - &Próxima + &Próxima - - - + + + Go to next page - Ir para a próxima página + Ir para a próxima página - + Fit Height - + Ajustar Altura - + Fit image to height - + Ajustar imagem à altura - + Fit Width - Ajustar à Largura + Ajustar à Largura - + Fit image to width - + Ajustar imagem à largura - + Show full size - + Mostrar tamanho grande - + Fit to page - + Ajustar à página + + + + Continuous scroll + Rolagem contínua + + + + Switch to continuous scroll mode + Mudar para o modo de rolagem contínua - + Reset zoom - + Redefinir zoom - + Show zoom slider - + Mostrar controle deslizante de zoom - + Zoom+ - + Ampliar - + Zoom- - + Reduzir - + Rotate image to the left - Girar imagem à esquerda + Girar imagem à esquerda - + Rotate image to the right - Girar imagem à direita + Girar imagem à direita - + Double page mode - Modo dupla página + Modo dupla página - + Switch to double page mode - Alternar para o modo dupla página + Alternar para o modo dupla página - + Double page manga mode - + Modo mangá de página dupla - + Reverse reading order in double page mode - + Ordem de leitura inversa no modo de página dupla - + Go To - Ir Para + Ir Para - + Go to page ... - Ir para a página... + Ir para a página... - + Options - Opções + Opções - + YACReader options - Opções do YACReader + Opções do YACReader - - + + Help - Ajuda + Ajuda - + Help, About YACReader - Ajuda, Sobre o YACReader + Ajuda, Sobre o YACReader - + Magnifying glass - Lupa + Lupa - + Switch Magnifying glass - Alternar Lupa + Alternar Lupa - + Set bookmark - Definir marcador + Definir marcador - + Set a bookmark on the current page - Definir um marcador na página atual + Definir um marcador na página atual - + Show bookmarks - Mostrar marcadores + Mostrar marcadores - + Show the bookmarks of the current comic - Mostrar os marcadores do quadrinho atual + Mostrar os marcadores do quadrinho atual - + Show keyboard shortcuts - Mostrar teclas de atalhos + Mostrar teclas de atalhos - + Show Info - Mostrar Informações + Mostrar Informações - + Close - Fechar + Fechar - + Show Dictionary - + Mostrar dicionário - + Show go to flow - + Mostrar "Ir para Comic Flow" - + Edit shortcuts - + Editar atalhos - + &File - &Arquivo + &Arquivo - - + + Open recent - + Abrir recente - + File - + Arquivo - + Edit - + Editar - + View - + Visualizar - + Go - + Ir - + Window - + Janela - - - + + + Open Comic - Abrir Quadrinho + Abrir Quadrinho - - - + + + Comic files - + Arquivos de quadrinhos - + Open folder - Abrir pasta + Abrir pasta - + page_%1.jpg - + página_%1.jpg - + Image files (*.jpg) - Arquivos de imagem (*.jpg) + Arquivos de imagem (*.jpg) + Comics - + Quadrinhos Toggle fullscreen mode - + Alternar modo de tela cheia Hide/show toolbar - + Ocultar/mostrar barra de ferramentas + General - + Em geral Size up magnifying glass - + Dimensione a lupa Size down magnifying glass - + Diminuir o tamanho da lupa Zoom in magnifying glass - + Zoom na lupa Zoom out magnifying glass - + Diminuir o zoom da lupa Reset magnifying glass - + Redefinir lupa + Magnifiying glass - + Lupa Toggle between fit to width and fit to height - + Alternar entre ajustar à largura e ajustar à altura + Page adjustement - + Ajuste de página - + Autoscroll down - + Rolagem automática para baixo - + Autoscroll up - + Rolagem automática para cima - + Autoscroll forward, horizontal first - + Rolagem automática para frente, horizontal primeiro - + Autoscroll backward, horizontal first - + Rolagem automática para trás, horizontal primeiro - + Autoscroll forward, vertical first - + Rolagem automática para frente, vertical primeiro - + Autoscroll backward, vertical first - + Rolagem automática para trás, vertical primeiro - + Move down - + Mover para baixo - + Move up - + Subir - + Move left - + Mover para a esquerda - + Move right - + Mover para a direita - + Go to the first page - + Vá para a primeira página - + Go to the last page - + Ir para a última página - + Offset double page to the left - + Deslocar página dupla para a esquerda - + Offset double page to the right - + Deslocar página dupla para a direita - + + Reading - + Leitura - + There is a new version available - Há uma nova versão disponível + Há uma nova versão disponível - + Do you want to download the new version? - Você deseja baixar a nova versão? + Você deseja baixar a nova versão? - + Remind me in 14 days - + Lembre-me em 14 dias - + Not now - + Agora não + + + + YACReader::TrayIconController + + + &Restore + &Rloja + + + + Systray + Bandeja do sistema + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuará em execução na bandeja do sistema. Para encerrar o programa, escolha <b>Sair</b> no menu de contexto do ícone da bandeja do sistema. YACReader::WhatsNewDialog - Close - Fechar + Fechar @@ -1160,12 +3800,12 @@ Click to overwrite - + Clique para substituir Restore to default - + Restaurar para o padrão @@ -1176,181 +3816,69 @@ Click to overwrite - + Clique para substituir Restore to default - + Restaurar para o padrão YACReaderFlowConfigWidget - CoverFlow look - Olhar capa cheia + Olhar capa cheia - Stripe look - Olhar lista + Olhar lista - Overlapped Stripe look - Olhar lista sobreposta - - - - How to show covers: - + Olhar lista sobreposta YACReaderGLFlowConfigWidget - Stripe look - Olhar lista + Olhar lista - Overlapped Stripe look - Olhar lista sobreposta - - - - Presets: - - - - - Classic look - - - - - Modern look - - - - - Roulette look - - - - - Show advanced settings - - - - - Custom: - - - - - View angle - - - - - Position - - - - - Cover gap - - - - - Central gap - - - - - Zoom - - - - - Y offset - - - - - Z offset - - - - - Cover Angle - - - - - Visibility - - - - - Light - - - - - Max angle - - - - - Low Performance - - - - - High Performance - - - - - Use VSync (improve the image quality in fullscreen mode, worse performance) - - - - - Performance: - + Olhar lista sobreposta YACReaderOptionsDialog - + Save Salvar - + Cancel Cancelar - + Edit shortcuts - + Editar atalhos - + Shortcuts - + Atalhos + + + YACReaderSearchLineEdit - - Use hardware acceleration (restart needed) - + + type to search + digite para pesquisar @@ -1358,31 +3886,31 @@ Reset - + Reiniciar YACReaderTranslator - + YACReader translator - + Tradutor YACReader - - + + Translation - + Tradução - + clear - + claro - + Service not available - + Serviço não disponível diff --git a/YACReader/yacreader_ru.ts b/YACReader/yacreader_ru.ts index 875b78020..3cd42b98e 100644 --- a/YACReader/yacreader_ru.ts +++ b/YACReader/yacreader_ru.ts @@ -6,7 +6,197 @@ None - + Никто + + + + AddLabelDialog + + + Label name: + Название ярлыка: + + + + Choose a color: + Выбрать цвет: + + + + accept + добавить + + + + cancel + отменить + + + + AddLibraryDialog + + + Comics folder : + Папка комиксов : + + + + Library name : + Имя библиотеки : + + + + Add + Добавить + + + + Cancel + Отмена + + + + Add an existing library + Добавить в существующую библиотеку + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Для подключения к Comic Vine вам потребуется ваш личный API ключ. Приобретите его бесплатно вот <a href="http://www.comicvine.com/api/">здесь</a> + + + + Paste here your Comic Vine API key + Вставьте сюда ваш Comic Vine API ключ + + + + Accept + Принять + + + + Cancel + Отмена + + + + AppearanceTabWidget + + + Color scheme + Цветовая гамма + + + + System + Система + + + + Light + Осветить + + + + Dark + Темный + + + + Custom + Обычай + + + + Remove + Удалять + + + + Remove this user-imported theme + Удалить эту импортированную пользователем тему + + + + Light: + Свет: + + + + Dark: + Темный: + + + + Custom: + Пользовательский: + + + + Import theme... + Импортировать тему... + + + + Theme + Тема + + + + Theme editor + Редактор тем + + + + Open Theme Editor... + Открыть редактор тем... + + + + Theme editor error + Ошибка редактора темы + + + + The current theme JSON could not be loaded. + Не удалось загрузить JSON текущей темы. + + + + Import theme + Импортировать тему + + + + JSON files (*.json);;All files (*) + Файлы JSON (*.json);;Все файлы (*) + + + + Could not import theme from: +%1 + Не удалось импортировать тему из: +%1 + + + + Could not import theme from: +%1 + +%2 + Не удалось импортировать тему из: +%1 + +%2 + + + + Import failed + Импорт не удался @@ -33,10 +223,204 @@ Последняя страница + + ClassicComicsView + + + Hide comic flow + Скрыть Comic Flow + + + + ComicModel + + + yes + да + + + + no + нет + + + + Title + Заголовок + + + + File Name + Имя файла + + + + Pages + Всего страниц + + + + Size + Размер + + + + Read + Прочитано + + + + Current Page + Текущая страница + + + + Publication Date + Дата публикации + + + + Rating + Рейтинг + + + + Series + Ряд + + + + Volume + Объем + + + + Story Arc + Сюжетная арка + + + + ComicVineDialog + + + skip + пропустить + + + + back + назад + + + + next + дальше + + + + search + искать + + + + close + закрыть + + + + + comic %1 of %2 - %3 + комикс %1 of %2 - %3 + + + + + + Looking for volume... + Поиск информации... + + + + %1 comics selected + %1 было выбрано + + + + Error connecting to ComicVine + Ошибка поключения к ComicVine + + + + + Retrieving tags for : %1 + Получение тегов для : %1 + + + + Retrieving volume info... + Получение информации... + + + + Looking for comic... + Поиск комикса... + + + + ContinuousPageWidget + + + Loading page %1 + Загрузка страницы %1 + + + + CreateLibraryDialog + + + Comics folder : + Папка комиксов : + + + + Library Name : + Имя библиотеки: + + + + Create + Создать + + + + Cancel + Отмена + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Создание библиотеки может занять несколько минут. Вы можете остановить процесс и обновить библиотеку позже для завершения задачи. + + + + Create new library + Создать новую библиотеку + + + + Path not found + Путь не найден + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Выбранный путь отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке + + EditShortcutsDialog - + Shortcut in use Горячая клавиша уже занята @@ -51,9 +435,9 @@ Горячие клавиши - - The shortcut "%1" is already assigned to other function - Сочетание клавиш "%1" уже назначено для другой функции + + The shortcut "%1" is already assigned to other function + Сочетание клавиш "%1" уже назначено для другой функции @@ -61,6 +445,124 @@ Чтобы изменить горячую клавишу дважды щелкните по выбранной комбинации клавиш и введите новые сочетания клавиш. + + EmptyFolderWidget + + + This folder doesn't contain comics yet + В этой папке еще нет комиксов + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Этот ярлык пока ничего не содержит + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Этот список чтения пока ничего не содержит + + + + EmptySpecialListWidget + + + No favorites + Нет избранного + + + + You are not reading anything yet, come on!! + Вы пока ничего не читаете. Может самое время почитать? + + + + There are no recent comics! + Свежих комиксов нет! + + + + ExportComicsInfoDialog + + + Output file : + Выходной файл (*.ydb) : + + + + Create + Создать + + + + Cancel + Отмена + + + + Export comics info + Экспортировать информацию комикса + + + + Destination database name + Имя этой базы данных + + + + Problem found while writing + Обнаружена Ошибка записи + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Выбранный путь для импортируемого файла отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке + + + + ExportLibraryDialog + + + Output folder : + Папка вывода : + + + + Create + Создать + + + + Cancel + Отмена + + + + Create covers package + Создать комплект обложек + + + + Problem found while writing + Обнаружена Ошибка записи + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Выбранный путь для импортируемого файла отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке + + + + Destination directory + Назначенная директория + + FileComic @@ -116,1262 +618,3400 @@ GoToFlowToolBar - + Page : Страница : + + GridComicsView + + + Show info + Показать информацию + + HelpAboutDialog - + Help Справка - + System info - + Информация о системе - + About О программе - LogWindow + ImportComicsInfoDialog + + + Import comics info + Импортировать информацию комикса + + + + Info database location : + Путь к файлу (*.ydb) : + + + + Import + Импортировать + + + + Cancel + Отмена + + + + Comics info file (*.ydb) + Инфо файл комикса (*.ydb) + + + + ImportLibraryDialog - - Log window - + + Library Name : + Имя библиотеки: - - &Pause - + + Package location : + Местоположение комплекта : - - &Save - + + Destination folder : + Папка назначения : - - C&lear - + + Unpack + Распаковать - - &Copy - + + Cancel + Отмена - - Level: - + + Extract a catalog + Извлечь каталог - - &Auto scroll - + + Compresed library covers (*.clc) + Сжатая библиотека обложек (*.clc) - MainWindowViewer + ImportWidget + + + stop + Остановить + + + + Some of the comics being added... + Поиск новых комиксов... + + + + Importing comics + Импорт комиксов + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary сейчас создает библиотеку.</p><p> Создание библиотеки может занять несколько минут. Вы можете остановить процесс и обновить библиотеку позже для завершения задачи.</p> + + + + Updating the library + Обновление библиотеки + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Текущая библиотека обновляется. Для более быстрого обновления в дальнейшем старайтесь почаще обновлять вашу библиотеку после добавления новых комиксов.</p><p>Вы можете остановить этот процесс и продолжить обновление этой библиотеки позже.</p> + + + + Upgrading the library + Обновление библиотеки + + + + <p>The current library is being upgraded, please wait.</p> + <p>Текущая библиотека обновляется, подождите.</p> + + + + Scanning the library + Сканирование библиотеки + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Текущая библиотека сканируется на предмет устаревших метаданных XML.</p><p>Это необходимо только один раз и только в том случае, если библиотека была создана с помощью YACReaderLibrary 9.8.2 или более ранней версии.</p> + + + + LibraryWindow + + + YACReader Library + Библиотека YACReader + + + + + + comic + комикс + + + + + + manga + манга + + + + + + western manga (left to right) + западная манга (слева направо) + + + + + + web comic + веб-комикс + + + + + + 4koma (top to botom) + 4кома (сверху вниз) + + + + + + + Set type + Тип установки + + + + Library + Библиотека + + + + Folder + Папка + + + + Comic + Комикс + + + + Upgrade failed + Обновление не удалось + + + + There were errors during library upgrade in: + При обновлении библиотеки возникли ошибки: + + + + Update needed + Необходимо обновление + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Эта библиотека была создана с предыдущей версией YACReaderLibrary. Она должна быть обновлена. Обновить сейчас? + + + + Download new version + Загрузить новую версию + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Эта библиотека была создана новой версией YACReaderLibrary. Скачать новую версию сейчас? + + + + Library not available + Библиотека не доступна + + + + Library '%1' is no longer available. Do you want to remove it? + Библиотека '%1' больше не доступна. Вы хотите удалить ее? + + + + Old library + Библиотека из старой версии YACreader + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Библиотека '%1' была создана старой версией YACReaderLibrary. Она должна быть вновь создана. Вы хотите создать библиотеку сейчас? + + + + + Copying comics... + Скопировать комиксы... + + + + + Moving comics... + Переместить комиксы... + + + + Add new folder + Добавить новую папку + + + + Folder name: + Имя папки: + + + + No folder selected + Ни одна папка не была выбрана + + + + Please, select a folder first + Пожалуйста, сначала выберите папку + + + + Error in path + Ошибка в пути + + + + There was an error accessing the folder's path + Ошибка доступа к пути папки + + + + Delete folder + Удалить папку + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Выбранная папка и все ее содержимое будет удалено с вашего жёсткого диска. Вы уверены? + + + + + Unable to delete + Не удалось удалить + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Возникла проблема при удалении выбранных папок. Пожалуйста, проверьте права на запись и убедитесь что другие приложения не используют эти папки или файлы. + + + + Add new reading lists + Добавить новый список чтения + + + + + List name: + Имя списка: + + + + Delete list/label + Удалить список/ярлык + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Выбранные элементы будут удалены, ваши комиксы или папки НЕ БУДУТ удалены с вашего жёсткого диска. Вы уверены? + + + + Rename list name + Изменить имя списка + + + + Open folder... + Открыть папку... + + + + Update folder + Обновить папку + + + + Rescan library for XML info + Повторное сканирование библиотеки для получения информации XML + + + + Set as uncompleted + Отметить как не завершено + + + + Set as completed + Отметить как завершено + + + + Set as read + Отметить как прочитано + + + + + Set as unread + Отметить как не прочитано + + + + Set custom cover + Установить собственную обложку + + + + Delete custom cover + Удалить пользовательскую обложку + + + + Save covers + Сохранить обложки + + + + You are adding too many libraries. + Вы добавляете слишком много библиотек. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Вы добавляете слишком много библиотек. + +Вероятно, вам нужна только одна библиотека в папке комиксов верхнего уровня, вы можете просматривать любые подпапки, используя раздел папок на левой боковой панели. + +YACReaderLibrary не помешает вам создать больше библиотек, но вы должны иметь не большое количество библиотек. + + + + + YACReader not found + YACReader не найден + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader не найден. YACReader должен быть установлен в ту же папку, что и YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader не найден. Возможно, возникла проблема с установкой YACReader. + + + + Error + Ошибка + + + + Error opening comic with third party reader. + Ошибка при открытии комикса с помощью сторонней программы чтения. + + + + Library not found + Библиотека не найдена + + + + The selected folder doesn't contain any library. + Выбранная папка не содержит ни одной библиотеки. + + + + Are you sure? + Вы уверены? + + + + Do you want remove + Вы хотите удалить библиотеку + + + + library? + ? + + + + Remove and delete metadata + Удаление метаданных + + + + Library info + Информация о библиотеке + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Возникла проблема при удалении выбранных комиксов. Пожалуйста, проверьте права на запись для выбранных файлов или содержащую их папку. + + + + Assign comics numbers + Порядковый номер + + + + Assign numbers starting in: + Назначить порядковый номер начиная с: + + + + Invalid image + Неверное изображение + + + + The selected file is not a valid image. + Выбранный файл не является допустимым изображением. + + + + Error saving cover + Не удалось сохранить обложку. + + + + There was an error saving the cover image. + Не удалось сохранить изображение обложки. + + + + Error creating the library + Ошибка создания библиотеки + + + + Error updating the library + Ошибка обновления библиотеки + + + + Error opening the library + Ошибка открытия библиотеки + + + + Delete comics + Удалить комиксы + + + + All the selected comics will be deleted from your disk. Are you sure? + Все выбранные комиксы будут удалены с вашего жёсткого диска. Вы уверены? + + + + Remove comics + Убрать комиксы + + + + Comics will only be deleted from the current label/list. Are you sure? + Комиксы будут удалены только из выбранного списка/ярлыка. Вы уверены? + + + + Library name already exists + Имя папки уже используется + + + + There is another library with the name '%1'. + Уже существует другая папка с именем '%1'. + + + + LibraryWindowActions + + + Create a new library + Создать новую библиотеку + + + + Open an existing library + Открыть существующую библиотеку + + + + + Export comics info + Экспортировать информацию комикса + + + + + Import comics info + Импортировать информацию комикса + + + + Pack covers + Запаковать обложки + + + + Pack the covers of the selected library + Запаковать обложки выбранной библиотеки + + + + Unpack covers + Распаковать обложки + + + + Unpack a catalog + Распаковать каталог + + + + Update library + Обновить библиотеку + + + + Update current library + Обновить эту библиотеку + + + + Rename library + Переименовать библиотеку + + + + Rename current library + Переименовать эту библиотеку + + + + Remove library + Удалить библиотеку + + + + Remove current library from your collection + Удалить эту библиотеку из своей коллекции + + + + Rescan library for XML info + Повторное сканирование библиотеки для получения информации XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Пытается найти информацию XML, встроенную в файлы комиксов. Это необходимо делать только в том случае, если библиотека была создана с помощью версии 9.8.2 или более ранней, или если вы используете стороннее программное обеспечение для встраивания информации XML в файлы. + + + + Show library info + Показать информацию о библиотеке + + + + Show information about the current library + Показать информацию о текущей библиотеке + + + + Open current comic + Открыть выбранный комикс + + + + Open current comic on YACReader + Открыть комикс в YACReader + + + + Save selected covers to... + Сохранить выбранные обложки в... + + + + Save covers of the selected comics as JPG files + Сохранить обложки выбранных комиксов как JPG файлы + + + + + Set as read + Отметить как прочитано + + + + Set comic as read + Отметить комикс как прочитано + + + + + Set as unread + Отметить как не прочитано + + + + Set comic as unread + Отметить комикс как не прочитано + + + + + manga + манга + + + + Set issue as manga + Установить выпуск как мангу + + + + + comic + комикс + + + + Set issue as normal + Установите проблему как обычно + + + + western manga + вестерн манга + + + + Set issue as western manga + Установить выпуск как западную мангу + + + + + web comic + веб-комикс + + + + Set issue as web comic + Установить выпуск как веб-комикс + + + + + yonkoma + йонкома + + + + Set issue as yonkoma + Установить проблему как йонкома + + + + Show/Hide marks + Показать/Спрятать пометки + + + + Show or hide read marks + Показать или спрятать отметку прочтено + + + + Show/Hide recent indicator + Показать/скрыть индикатор последних событий + + + + Show or hide recent indicator + Показать или скрыть недавний индикатор + + + + + Fullscreen mode on/off + Полноэкранный режим включить/выключить + + + + Help, About YACReader + Справка + + + + Add new folder + Добавить новую папку + + + + Add new folder to the current library + Добавить новую папку в текущую библиотеку + + + + Delete folder + Удалить папку + + + + Delete current folder from disk + Удалить выбранную папку с жёсткого диска + + + + Select root node + Домашняя папка + + + + Expand all nodes + Раскрыть все папки + + + + Collapse all nodes + Свернуть все папки + + + + Show options dialog + Настройки + + + + Show comics server options dialog + Настройки сервера YACReader + + + + + Change between comics views + Изменение внешнего вида потока комиксов + + + + Open folder... + Открыть папку... + + + + Set as uncompleted + Отметить как не завершено + + + + Set as completed + Отметить как завершено + + + + Set custom cover + Установить собственную обложку + + + + Delete custom cover + Удалить пользовательскую обложку + + + + western manga (left to right) + западная манга (слева направо) + + + + Open containing folder... + Открыть выбранную папку... + + + + Reset comic rating + Сбросить рейтинг комикса + + + + Select all comics + Выбрать все комиксы + + + + Edit + Редактировать + + + + Assign current order to comics + Назначить порядковый номер + + + + Update cover + Обновить обложки + + + + Delete selected comics + Удалить выбранное + + + + Delete metadata from selected comics + Удалить метаданные из выбранных комиксов + + + + Download tags from Comic Vine + Скачать теги из Comic Vine + + + + Focus search line + Строка поиска фокуса + + + + Focus comics view + Просмотр комиксов в фокусе + + + + Edit shortcuts + Редактировать горячие клавиши + + + + &Quit + &Qкостюм + + + + Update folder + Обновить папку + + + + Update current folder + Обновить выбранную папку + + + + Scan legacy XML metadata + Сканировать устаревшие метаданные XML + + + + Add new reading list + Создать новый список чтения + + + + Add a new reading list to the current library + Создать новый список чтения + + + + Remove reading list + Удалить список чтения + + + + Remove current reading list from the library + Удалить выбранный ярлык/список чтения + + + + Add new label + Создать новый ярлык + + + + Add a new label to this library + Создать новый ярлык + + + + Rename selected list + Переименовать выбранный список + + + + Rename any selected labels or lists + Переименовать выбранный ярлык/список чтения + + + + Add to... + Добавить в... + + + + Favorites + Избранное + + + + Add selected comics to favorites list + Добавить выбранные комиксы в список избранного + + + + LocalComicListModel + + + file name + имя файла + + + + MainWindowViewer + + Go + Перейти + + + Edit + Редактировать + + + File + Файл + + + Help + Справка + + + Save + Сохранить + + + View + Посмотреть + + + &File + &Отображать панель инструментов + + + &Next + &Следующий + + + &Open + &Открыть + + + Clear + Очистить + + + Close + Закрыть + + + Open Comic + Открыть комикс + + + Go To + Перейти к странице... + + + Zoom+ + Увеличить масштаб + + + Zoom- + Уменьшить масштаб + + + Open image folder + Открыть папку с изображениями + + + Size down magnifying glass + Уменьшение размера окошка увеличительного стекла + + + Zoom out magnifying glass + Уменьшить + + + Open latest comic + Открыть последний комикс + + + Autoscroll up + Автопрокрутка вверх + + + Set bookmark + Установить закладку + + + page_%1.jpg + страница_%1.jpg + + + Autoscroll forward, vertical first + Автопрокрутка вперед, вертикальная + + + Switch to double page mode + Двухстраничный режим + + + Save current page + Сохранить текущию страницу + + + Size up magnifying glass + Увеличение размера окошка увеличительного стекла + + + Double page mode + Двухстраничный режим + + + Move up + Переместить вверх + + + Switch Magnifying glass + Увеличительное стекло + + + Open Folder + Открыть папку + + + Comics + Комикс + + + Fit Height + Подогнать по высоте + + + Autoscroll backward, vertical first + Автопрокрутка назад, вертикальная + + + Comic files + Файлы комикса + + + Not now + Не сейчас + + + Go to the first page + Перейти к первой странице + + + Go to previous page + Перейти к предыдущей странице + + + Window + Окно + + + Open the latest comic opened in the previous reading session + Открыть комикс открытый в предыдущем сеансе чтения + + + Open a comic + Открыть комикс + + + Image files (*.jpg) + Файлы изображений (*.jpg) + + + Next Comic + Следующий комикс + + + Fit Width + Подогнать по ширине + + + Options + Настройки + + + Show Info + Показать/скрыть номер страницы и текущее время + + + Open folder + Открыть папку + + + Go to page ... + Перейти к странице... + + + Magnifiying glass + Увеличительное стекло + + + Fit image to width + Подогнать по ширине + + + Toggle fullscreen mode + Полноэкранный режим включить/выключить + + + Toggle between fit to width and fit to height + Переключение режима подгонки страницы по ширине/высоте + + + Move right + Переместить вправо + + + Zoom in magnifying glass + Увеличить + + + Open recent + Открыть недавние + + + Reading + Чтение + + + &Previous + &Предыдущий + + + Autoscroll forward, horizontal first + Автопрокрутка вперед, горизонтальная + + + Go to next page + Перейти к следующей странице + + + Show keyboard shortcuts + Показать горячие клавиши + + + Double page manga mode + Двухстраничный режим манги + + + There is a new version available + Доступна новая версия + + + Autoscroll down + Автопрокрутка вниз + + + Open next comic + Открыть следующий комикс + + + Remind me in 14 days + Напомнить через 14 дней + + + Fit to page + Подогнать под размер страницы + + + Show bookmarks + Показать закладки + + + Open previous comic + Открыть предыдуший комикс + + + Rotate image to the left + Повернуть изображение против часовой стрелки + + + Fit image to height + Подогнать по высоте + + + Reset zoom + Сбросить масштаб + + + Show the bookmarks of the current comic + Показать закладки в текущем комиксе + + + Show Dictionary + Переводчик YACreader + + + Move down + Переместить вниз + + + Move left + Переместить влево + + + Reverse reading order in double page mode + Двухстраничный режим манги + + + YACReader options + Настройки + + + Clear open recent list + Очистить список недавно открытых файлов + + + Help, About YACReader + Справка + + + Show go to flow + Показать "Перейти к Comic Flow" + + + Previous Comic + Предыдущий комикс + + + Show full size + Показать в полном размере + + + Hide/show toolbar + Показать/скрыть панель инструментов + + + Magnifying glass + Увеличительное стекло + + + Edit shortcuts + Редактировать горячие клавиши + + + General + Общие + + + Set a bookmark on the current page + Установить закладку на текущей странице + + + Page adjustement + Настройка страницы + + + Show zoom slider + Показать ползунок масштабирования + + + Go to the last page + Перейти к последней странице + + + Do you want to download the new version? + Хотите загрузить новую версию ? + + + Rotate image to the right + Повернуть изображение по часовой стрелке + + + Always on top + Всегда сверху + + + Autoscroll backward, horizontal first + Автопрокрутка назад, горизонтальная + + + + NoLibrariesWidget + + + You don't have any libraries yet + У вас нет ни одной библиотеки + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Вы можете создать библиотеку в любой папке, YACReaderLibrary будет импортировать все комиксы и папки из этой папки. Если вы уже ранее создавали библиотеки, их можно будет открыть.< / p > <p>Не забывайте, что Вы можете использовать YACReader в качестве отдельного приложения для чтения комиксов на вашем компьютере.</п> + + + + create your first library + создайте свою первую библиотеку + + + + add an existing one + добавить уже существующую + + + + NoSearchResultsWidget + + + No results + Нет результатов + + + + OptionsDialog + + + Gamma + Гамма + + + + Reset + Вернуть к первоначальным значениям + + + + My comics path + Папка комиксов + + + + Image adjustment + Настройка изображения + + + + "Go to flow" size + Размер "Перейти к Comic Flow" + + + + Choose + Выбрать + + + + Image options + Настройки изображения + + + + Contrast + Контраст + + + + + Libraries + Библиотеки + + + + Comic Flow + Comic Flow + + + + Grid view + Фоновое изображение + + + + + Appearance + Появление + + + + + Options + Настройки + + + + + Language + Язык + + + + + Application language + Язык приложения + + + + + System default + Системный по умолчанию + + + + Tray icon settings (experimental) + Настройки значков в трее (экспериментально) + + + + Close to tray + Рядом с лотком + + + + Start into the system tray + Запустите в системном трее + + + + Edit Comic Vine API key + Редактировать Comic Vine API ключ + + + + Comic Vine API key + Comic Vine API ключ + + + + ComicInfo.xml legacy support + Поддержка устаревших версий ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Импортируйте метаданные из ComicInfo.xml при добавлении новых комиксов. + + + + Consider 'recent' items added or updated since X days ago + Учитывайте «недавние» элементы, добавленные или обновленные X дней назад. + + + + Third party reader + Сторонний читатель + + + + Write {comic_file_path} where the path should go in the command + Напишите {comic_file_path}, где должен идти путь в команде. + + + + + Clear + Очистить + + + + Update libraries at startup + Обновлять библиотеки при запуске + + + + Try to detect changes automatically + Попробуйте обнаружить изменения автоматически + + + + Update libraries periodically + Периодически обновляйте библиотеки + + + + Interval: + Интервал: + + + + 30 minutes + 30 минут + + + + 1 hour + 1 час + + + + 2 hours + 2 часа + + + + 4 hours + 4 часа + + + + 8 hours + 8 часов + + + + 12 hours + 12 часов + + + + daily + ежедневно + + + + Update libraries at certain time + Обновлять библиотеки в определенное время + + + + Time: + Время: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + ПРЕДУПРЕЖДЕНИЕ! Во время обновления библиотеки запись в базу данных отключена! +Не планируйте обновления, пока вы активно используете приложение. +Во время автоматического обновления приложение будет блокировать некоторые действия до завершения обновления. +Чтобы остановить автоматическое обновление, нажмите на индикатор загрузки рядом с названием «Библиотеки». + + + + Modifications detection + Обнаружение модификаций + + + + Compare the modified date of files when updating a library (not recommended) + Сравните дату изменения файлов при обновлении библиотеки (не рекомендуется) + + + + Enable background image + Включить фоновое изображение + + + + Opacity level + Уровень непрозрачности + + + + Blur level + Уровень размытия + + + + Use selected comic cover as background + Обложка комикса фоновое изображение + + + + Restore defautls + Вернуть к первоначальным значениям + + + + Background + Фоновое изображение + + + + Display continue reading banner + Отображение баннера продолжения чтения + + + + Display current comic banner + Отображать текущий комикс-баннер + + + + Continue reading + Продолжить чтение + + + + Comics directory + Папка комиксов + + + + Quick Navigation Mode + Ползунок для быстрой навигации по страницам + + + + Display + Отображать + + + + Show time in current page information label + Показывать время в информационной метке текущей страницы + + + + Background color + Фоновый цвет + + + + Scroll behaviour + Поведение прокрутки + + + + Disable scroll animations and smooth scrolling + Отключить анимацию прокрутки и плавную прокрутку + + + + Do not turn page using scroll + Не переворачивайте страницу с помощью прокрутки + + + + Use single scroll step to turn page + Используйте один шаг прокрутки, чтобы перевернуть страницу + + + + Mouse mode + Режим мыши + + + + Only Back/Forward buttons can turn pages + Только кнопки «Назад/Вперед» могут перелистывать страницы. + + + + Use the Left/Right buttons to turn pages. + Используйте кнопки «Влево/Вправо», чтобы перелистывать страницы. + + + + Click left or right half of the screen to turn pages. + Нажмите левую или правую половину экрана, чтобы перелистывать страницы. + + + + Disable mouse over activation + Отключить активацию потока при наведении мыши + + + + Scaling + Масштабирование + + + + Scaling method + Метод масштабирования + + + + Nearest (fast, low quality) + Ближайший (быстро, низкое качество) + + + + Bilinear + Билинейный + + + + Lanczos (better quality) + Ланцос (лучшее качество) + + + + Page Flow + Поток Страниц + + + + + General + Общие + + + + Brightness + Яркость + + + + + Restart is needed + Требуется перезагрузка + + + + Fit options + Варианты подгонки + + + + Enlarge images to fit width/height + Увеличьте изображения по ширине/высоте + + + + Double Page options + Параметры двойной страницы + + + + Show covers as single page + Показывать обложки на одной странице + + + + PropertiesDialog + + + General info + Общая информация + + + + Plot + Сюжет + + + + Authors + Авторы + + + + Publishing + Издатели + + + + Notes + Примечания + + + + Cover page + Страница обложки + + + + Load previous page as cover + Загрузить предыдущую страницу в качестве обложки + + + + Load next page as cover + Загрузить следующую страницу в качестве обложки + + + + Reset cover to the default image + Сбросить обложку к изображению по умолчанию + + + + Load custom cover image + Загрузить собственное изображение обложки + + + + Series: + Серия: + + + + Title: + Заголовок: + + + + + + of: + из: + + + + Issue number: + Номер выпуска + + + + Volume: + Объём : + + + + Arc number: + Номер дуги: + + + + Story arc: + Сюжетная арка: + + + + alt. number: + альт. число: + + + + Alternate series: + Альтернативный сериал: + + + + Series Group: + Группа серий: + + + + Genre: + Жанр: + + + + Size: + Размер: + + + + Writer(s): + Писатель(и): + + + + Penciller(s): + Художник(и): + + + + Inker(s): + Контуровщик(и): + + + + Colorist(s): + Колорист(ы): + + + + Letterer(s): + Гравёр-шрифтовик(и): + - Go - Перейти + + Cover Artist(s): + Художник(и) Обложки: - Edit - Редактировать + + Editor(s): + Редактор(ы): - File - Файл + + Imprint: + Выходные данные: - Help - Справка + + Day: + День: - Save - Сохранить + + Month: + Месяц: - View - Посмотреть + + Year: + Год: - &File - &Отображать панель инструментов + + Publisher: + Издатель: - &Next - &Следующий + + Format: + Формат: - &Open - &Открыть + + Color/BW: + Цвет/BW: - Clear - Очистить + + Age rating: + Возрастной рейтинг: - Close - Закрыть + + Type: + Тип: - Open Comic - Открыть комикс + + Language (ISO): + Язык (ISO): - Go To - Перейти к странице... + + Synopsis: + Описание: - Zoom+ - Увеличить масштаб + + Characters: + Персонажи: - Zoom- - Уменьшить масштаб + + Teams: + Команды: - Open image folder - Открыть папку с изображениями + + Locations: + Местоположение: - Size down magnifying glass - Уменьшение размера окошка увеличительного стекла + + Main character or team: + Главный герой или команда: - Zoom out magnifying glass - Уменьшить + + Review: + Обзор: - Open latest comic - Открыть последний комикс + + Notes: + Заметки: - Autoscroll up - Автопрокрутка вверх + + Tags: + Теги: - Set bookmark - Установить закладку + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + <a style='color: ##666666; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Открыть страницу этого комикса на сайте Comic Vine </a> - page_%1.jpg - страница_%1.jpg + + Not found + Не найдено - Autoscroll forward, vertical first - Автопрокрутка вперед, вертикальная + + Comic not found. You should update your library. + Комикс не найден. Обновите вашу библиотеку. - Switch to double page mode - Двухстраничный режим + + Edit comic information + Редактировать информацию комикса - Save current page - Сохранить текущию страницу + + Edit selected comics information + Редактировать информацию выбранного комикса - Size up magnifying glass - Увеличение размера окошка увеличительного стекла + + Invalid cover + Неверное покрытие - Double page mode - Двухстраничный режим + + The image is invalid. + Изображение недействительно. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer — это безголовая (без графического интерфейса) версия YACReaderLibrary. + +Это приложение поддерживает постоянные настройки. Чтобы настроить их, отредактируйте этот файл %1. +Чтобы узнать о доступных настройках, ознакомьтесь с документацией по адресу https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md. + + + QObject - Move up - Переместить вверх + + 7z lib not found + Библиотека распаковщика 7z не найдена - Switch Magnifying glass - Увеличительное стекло + + unable to load 7z lib from ./utils + не удается загрузить 7z lib из ./ utils - Open Folder - Открыть папку + + Trace + След - Comics - Комикс + + Debug + Отлаживать - Fit Height - Подогнать по высоте + + Info + Информация - Autoscroll backward, vertical first - Автопрокрутка назад, вертикальная + + Warning + Предупреждение - Comic files - Файлы комикса + + Error + Ошибка - Not now - Не сейчас + + Fatal + Фатальный - Go to the first page - Перейти к первой странице + + Select custom cover + Выбрать индивидуальную обложку - Go to previous page - Перейти к предыдущей странице + + Images (%1) + Изображения (%1) - Window - Окно + + The file could not be read or is not valid JSON. + Файл не может быть прочитан или имеет недопустимый формат JSON. - Open the latest comic opened in the previous reading session - Открыть комикс открытый в предыдущем сеансе чтения + + This theme is for %1, not %2. + Эта тема предназначена для %1, а не для %2. - Open a comic - Открыть комикс + + Libraries + Библиотеки - Image files (*.jpg) - Файлы изображений (*.jpg) + + Folders + Папки - Next Comic - Следующий комикс + + Reading Lists + Списки чтения + + + RenameLibraryDialog - Fit Width - Подогнать по ширине + + New Library Name : + Новое имя библиотеки: - Options - Настройки + + Rename + Переименовать - Show Info - Показать/скрыть номер страницы и текущее время + + Cancel + Отмена - Open folder - Открыть папку + + Rename current library + Переименовать эту библиотеку + + + ScraperResultsPaginator - Go to page ... - Перейти к странице... + + Number of volumes found : %1 + Количество найденных томов : %1 - Magnifiying glass - Увеличительное стекло + + + page %1 of %2 + страница %1 из %2 - Fit image to width - Подогнать по ширине + + Number of %1 found : %2 + Количество из %1 найдено : %2 + + + SearchSingleComic - Toggle fullscreen mode - Полноэкранный режим включить/выключить + + Please provide some additional information for this comic. + Пожалуйста, введите инфомарцию для поиска. - Toggle between fit to width and fit to height - Переключение режима подгонки страницы по ширине/высоте + + Series: + Серия: - Move right - Переместить вправо + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Используйте поиск по точному совпадению. Отключите, если хотите найти тома, соответствующие некоторым словам в названии. + + + SearchVolume - Zoom in magnifying glass - Увеличить + + Please provide some additional information. + Пожалуйста, введите инфомарцию для поиска. - Open recent - Открыть недавние + + Series: + Серия: - Reading - Чтение + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Используйте поиск по точному совпадению. Отключите, если хотите найти тома, соответствующие некоторым словам в названии. + + + SelectComic - &Previous - &Предыдущий + + Please, select the right comic info. + Пожалуйста, выберите правильную информацию об комиксе. - Autoscroll forward, horizontal first - Автопрокрутка вперед, горизонтальная + + comics + комиксы - Go to next page - Перейти к следующей странице + + loading cover + загрузка обложки - Show keyboard shortcuts - Показать горячие клавиши + + loading description + загрузка описания - Double page manga mode - Двухстраничный режим манги + + comic description unavailable + Описание комикса недоступно + + + SelectVolume - There is a new version available - Доступна новая версия + + Please, select the right series for your comic. + Пожалуйста, выберите правильную серию для вашего комикса. - Autoscroll down - Автопрокрутка вниз + + Filter: + Фильтр: - Open next comic - Открыть следующий комикс + + volumes + тома - Remind me in 14 days - Напомнить через 14 дней + + Nothing found, clear the filter if any. + Ничего не найдено, очистите фильтр, если есть. - Fit to page - Подогнать под размер страницы + + loading cover + загрузка обложки - Show bookmarks - Показать закладки + + loading description + загрузка описания - Open previous comic - Открыть предыдуший комикс + + volume description unavailable + описание тома недоступно + + + SeriesQuestion - Rotate image to the left - Повернуть изображение против часовой стрелки + + You are trying to get information for various comics at once, are they part of the same series? + Вы пытаетесь получить информацию для нескольких комиксов одновременно, являются ли они все частью одной серии? - Fit image to height - Подогнать по высоте + + yes + да - Reset zoom - Сбросить масштаб + + no + нет + + + ServerConfigDialog - Show the bookmarks of the current comic - Показать закладки в текущем комиксе + + set port + указать порт - Show Dictionary - Переводчик YACreader + + Server connectivity information + Информация о подключении - Move down - Переместить вниз + + Scan it! + Сканируйте! - Move left - Переместить влево + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader доступен для устройств iOS и Android.<br/>Найдите его для <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> или <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - Reverse reading order in double page mode - Двухстраничный режим манги + + Choose an IP address + Выбрать IP адрес - YACReader options - Настройки + + Port + Порт - Clear open recent list - Очистить список недавно открытых файлов + + enable the server + активировать сервер + + + ShortcutsDialog - Help, About YACReader - Справка + Close + Закрыть - Show go to flow - Показать поток страниц + YACReader keyboard shortcuts + Клавиатурные комбинации YACReader - Previous Comic - Предыдущий комикс + Keyboard Shortcuts + Клавиатурные комбинации + + + SortVolumeComics - Show full size - Показать в полном размере + + Please, sort the list of comics on the left until it matches the comics' information. + Пожалуйста, отсортируйте список комиксов слева, пока он не будет соответствовать информации комикса. - Hide/show toolbar - Показать/скрыть панель инструментов + + sort comics to match comic information + сортировать комиксы, чтобы соответствовать информации комиксов - Magnifying glass - Увеличительное стекло + + issues + выпуск - Edit shortcuts - Редактировать горячие клавиши + + remove selected comics + удалить выбранные комиксы - General - Общие + + restore all removed comics + восстановить все удаленные комиксы + + + ThemeEditorDialog - Set a bookmark on the current page - Установить закладку на текущей странице + + Theme Editor + Редактор тем - Page adjustement - Настройка страницы + + + + + - Show zoom slider - Показать ползунок масштабирования + + - + - - Go to the last page - Перейти к последней странице + + i + я - Do you want to download the new version? - Хотите загрузить новую версию ? + + Expand all + Развернуть все - Rotate image to the right - Повернуть изображение по часовой стрелке + + Collapse all + Свернуть все - Always on top - Всегда сверху + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Удерживайте, чтобы выбранное значение мигало в пользовательском интерфейсе (пурпурный / переключено / 0↔10). Релизы восстанавливают оригинал. - Autoscroll backward, horizontal first - Автопрокрутка назад, горизонтальная + + Search… + Поиск… - - - OptionsDialog - - Gamma - Гамма + + Light + Осветить - - Reset - Вернуть к первоначальным значениям + + Dark + Темный - - My comics path - Папка комиксов + + ID: + ИДЕНТИФИКАТОР: - - Image adjustment - Настройка изображения + + Display name: + Отображаемое имя: - - "Go to flow" size - Размер потока страниц + + Variant: + Вариант: - - Choose - Выбрать + + Theme info + Информация о теме - - Image options - Настройки изображения + + Parameter + Параметр - - Contrast - Контраст + + Value + Ценить - - Options - Настройки + + Save and apply + Сохраните и примените - - Comics directory - Папка комиксов + + Export to file... + Экспортировать в файл... - - Quick Navigation Mode - Ползунок для быстрой навигации по страницам + + Load from file... + Загрузить из файла... - - Display - + + Close + Закрыть - - Show time in current page information label - + + Double-click to edit color + Дважды щелкните, чтобы изменить цвет - - Background color - Фоновый цвет + + + + + + + true + истинный - - Scroll behaviour - + + + + + false + ЛОЖЬ - - Disable scroll animations and smooth scrolling - + + Double-click to toggle + Дважды щелкните, чтобы переключиться - - Do not turn page using scroll - + + Double-click to edit value + Дважды щелкните, чтобы изменить значение - - Use single scroll step to turn page - + + + + Edit: %1 + Изменить: %1 - - Mouse mode - + + Save theme + Сохранить тему - - Only Back/Forward buttons can turn pages - + + + JSON files (*.json);;All files (*) + Файлы JSON (*.json);;Все файлы (*) - - Use the Left/Right buttons to turn pages. - + + Save failed + Сохранить не удалось - - Click left or right half of the screen to turn pages. - + + Could not open file for writing: +%1 + Не удалось открыть файл для записи: +%1 - - Disable mouse over activation - Отключить активацию потока при наведении мыши + + Load theme + Загрузить тему - - Page Flow - Поток Страниц + + + + Load failed + Загрузка не удалась - - General - Общие + + Could not open file: +%1 + Не удалось открыть файл: +%1 - - Brightness - Яркость + + Invalid JSON: +%1 + Неверный JSON: +%1 - - Restart is needed - + + Expected a JSON object. + Ожидается объект JSON. + + + TitleHeader - - Fit options - + + SEARCH + ПОИСК + + + UpdateLibraryDialog - - Enlarge images to fit width/height - + + Updating.... + Обновление... - - Double Page options - + + Cancel + Отмена - - Show covers as single page - + + Update library + Обновить библиотеку - QObject + Viewer - - 7z lib not found - Библиотека распаковщика 7z не найдена + + Page not available! + Страница недоступна! - - unable to load 7z lib from ./utils - не удается загрузить 7z lib из ./ utils + + + Press 'O' to open comic. + Нажмите "O" чтобы открыть комикс. - - Trace - + + Error opening comic + Ошибка открытия комикса - - Debug - + + Cover! + Начало! - - Info - + + CRC Error + Ошибка CRC - - Warning - + + Comic not found + Комикс не найден - - Error - + + Not found + Не найдено - - Fatal - + + Last page! + Конец! - - Select custom cover - + + Loading...please wait! + Загрузка... Пожалуйста подождите! + + + VolumeComicsModel - - Images (%1) - + + title + название - QsLogging::LogWindowModel + VolumesModel - - Time - + + year + год - - Level - + + issues + выпуск - - Message - + + publisher + издатель - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - + + Presets: + Предустановки: - - &Resume - + + Classic look + Классический вид - - Save log - + + Stripe look + Вид полосами - - Log file (*.log) - + + Overlapped Stripe look + Вид перекрывающимися полосами - - - ShortcutsDialog - Close - Закрыть + + Modern look + Современный вид - YACReader keyboard shortcuts - Клавиатурные комбинации YACReader + + Roulette look + Вид рулеткой - Keyboard Shortcuts - Клавиатурные комбинации + + Show advanced settings + Показать дополнительные настройки - - - Viewer - - Page not available! - Страница недоступна! + + Custom: + Пользовательский: - - - Press 'O' to open comic. - Нажмите "O" чтобы открыть комикс. + + View angle + Угол зрения - - Error opening comic - Ошибка открытия комикса + + Position + Позиция - - Cover! - Начало! + + Cover gap + Осветить разрыв - - CRC Error - Ошибка CRC + + Central gap + Сфокусировать разрыв - - Comic not found - Комикс не найден + + Zoom + Масштабировать - - Not found - Не найдено + + Y offset + Смещение по Y - - Last page! - Конец! + + Z offset + Смещение по Z - - Loading...please wait! - Загрузка... Пожалуйста подождите! + + Cover Angle + Охватить угол + + + + Visibility + Прозрачность + + + + Light + Осветить + + + + Max angle + Максимальный угол + + + + Low Performance + Минимальная производительность + + + + High Performance + Максимальная производительность + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Использовать VSync (повысить формат изображения в полноэкранном режиме , хуже производительность) + + + + Performance: + Производительность: YACReader::MainWindowViewer - + &Open - &Открыть + &Открыть - + Open a comic - Открыть комикс + Открыть комикс - + New instance - + Новый экземпляр - + Open Folder - Открыть папку + Открыть папку - + Open image folder - Открыть папку с изображениями + Открыть папку с изображениями - + Open latest comic - Открыть последний комикс + Открыть последний комикс - + Open the latest comic opened in the previous reading session - Открыть комикс открытый в предыдущем сеансе чтения + Открыть комикс открытый в предыдущем сеансе чтения - + Clear - Очистить + Очистить - + Clear open recent list - Очистить список недавно открытых файлов + Очистить список недавно открытых файлов - + Save - Сохранить + Сохранить - + Save current page - Сохранить текущию страницу + Сохранить текущию страницу Previous Comic - Предыдущий комикс + Предыдущий комикс - - - + + + Open previous comic - Открыть предыдуший комикс + Открыть предыдуший комикс - + Next Comic - Следующий комикс + Следующий комикс - - - + + + Open next comic - Открыть следующий комикс + Открыть следующий комикс - + &Previous - &Предыдущий + &Предыдущий - - - + + + Go to previous page - Перейти к предыдущей странице + Перейти к предыдущей странице - + &Next - &Следующий + &Следующий - - - + + + Go to next page - Перейти к следующей странице + Перейти к следующей странице - + Fit Height - Подогнать по высоте + Подогнать по высоте - + Fit image to height - Подогнать по высоте + Подогнать по высоте - + Fit Width - Подогнать по ширине + Подогнать по ширине - + Fit image to width - Подогнать по ширине + Подогнать по ширине - + Show full size - Показать в полном размере + Показать в полном размере - + Fit to page - Подогнать под размер страницы + Подогнать под размер страницы + + + + Continuous scroll + Непрерывная прокрутка + + + + Switch to continuous scroll mode + Переключиться в режим непрерывной прокрутки - + Reset zoom - Сбросить масштаб + Сбросить масштаб - + Show zoom slider - Показать ползунок масштабирования + Показать ползунок масштабирования - + Zoom+ - Увеличить масштаб + Увеличить масштаб - + Zoom- - Уменьшить масштаб + Уменьшить масштаб - + Rotate image to the left - Повернуть изображение против часовой стрелки + Повернуть изображение против часовой стрелки - + Rotate image to the right - Повернуть изображение по часовой стрелке + Повернуть изображение по часовой стрелке - + Double page mode - Двухстраничный режим + Двухстраничный режим - + Switch to double page mode - Двухстраничный режим + Двухстраничный режим - + Double page manga mode - Двухстраничный режим манги + Двухстраничный режим манги - + Reverse reading order in double page mode - Двухстраничный режим манги + Двухстраничный режим манги - + Go To - Перейти к странице... + Перейти к странице... - + Go to page ... - Перейти к странице... + Перейти к странице... - + Options - Настройки + Настройки - + YACReader options - Настройки + Настройки - - + + Help - Справка + Справка - + Help, About YACReader - Справка + Справка - + Magnifying glass - Увеличительное стекло + Увеличительное стекло - + Switch Magnifying glass - Увеличительное стекло + Увеличительное стекло - + Set bookmark - Установить закладку + Установить закладку - + Set a bookmark on the current page - Установить закладку на текущей странице + Установить закладку на текущей странице - + Show bookmarks - Показать закладки + Показать закладки - + Show the bookmarks of the current comic - Показать закладки в текущем комиксе + Показать закладки в текущем комиксе - + Show keyboard shortcuts - Показать горячие клавиши + Показать горячие клавиши - + Show Info - Показать/скрыть номер страницы и текущее время + Показать/скрыть номер страницы и текущее время - + Close - Закрыть + Закрыть - + Show Dictionary - Переводчик YACreader + Переводчик YACreader - + Show go to flow - Показать поток страниц + Показать "Перейти к Comic Flow" - + Edit shortcuts - Редактировать горячие клавиши + Редактировать горячие клавиши - + &File - &Отображать панель инструментов + &Отображать панель инструментов - - + + Open recent - Открыть недавние + Открыть недавние - + File - Файл + Файл - + Edit - Редактировать + Редактировать - + View - Посмотреть + Посмотреть - + Go - Перейти + Перейти - + Window - Окно + Окно - - - + + + Open Comic - Открыть комикс + Открыть комикс - - - + + + Comic files - Файлы комикса + Файлы комикса - + Open folder - Открыть папку + Открыть папку - + page_%1.jpg - страница_%1.jpg + страница_%1.jpg - + Image files (*.jpg) - Файлы изображений (*.jpg) + Файлы изображений (*.jpg) + Comics - Комикс + Комикс Toggle fullscreen mode - Полноэкранный режим включить/выключить + Полноэкранный режим включить/выключить Hide/show toolbar - Показать/скрыть панель инструментов + Показать/скрыть панель инструментов + General - Общие + Общие Size up magnifying glass - Увеличение размера окошка увеличительного стекла + Увеличение размера окошка увеличительного стекла Size down magnifying glass - Уменьшение размера окошка увеличительного стекла + Уменьшение размера окошка увеличительного стекла Zoom in magnifying glass - Увеличить + Увеличить Zoom out magnifying glass - Уменьшить + Уменьшить Reset magnifying glass - + Сбросить увеличительное стекло + Magnifiying glass - Увеличительное стекло + Увеличительное стекло Toggle between fit to width and fit to height - Переключение режима подгонки страницы по ширине/высоте + Переключение режима подгонки страницы по ширине/высоте + Page adjustement - Настройка страницы + Настройка страницы - + Autoscroll down - Автопрокрутка вниз + Автопрокрутка вниз - + Autoscroll up - Автопрокрутка вверх + Автопрокрутка вверх - + Autoscroll forward, horizontal first - Автопрокрутка вперед, горизонтальная + Автопрокрутка вперед, горизонтальная - + Autoscroll backward, horizontal first - Автопрокрутка назад, горизонтальная + Автопрокрутка назад, горизонтальная - + Autoscroll forward, vertical first - Автопрокрутка вперед, вертикальная + Автопрокрутка вперед, вертикальная - + Autoscroll backward, vertical first - Автопрокрутка назад, вертикальная + Автопрокрутка назад, вертикальная - + Move down - Переместить вниз + Переместить вниз - + Move up - Переместить вверх + Переместить вверх - + Move left - Переместить влево + Переместить влево - + Move right - Переместить вправо + Переместить вправо - + Go to the first page - Перейти к первой странице + Перейти к первой странице - + Go to the last page - Перейти к последней странице + Перейти к последней странице - + Offset double page to the left - + Смещение разворота влево - + Offset double page to the right - + Смещение разворота вправо - + + Reading - Чтение + Чтение - + There is a new version available - Доступна новая версия + Доступна новая версия - + Do you want to download the new version? - Хотите загрузить новую версию ? + Хотите загрузить новую версию ? - + Remind me in 14 days - Напомнить через 14 дней + Напомнить через 14 дней - + Not now - Не сейчас + Не сейчас + + + + YACReader::TrayIconController + + + &Restore + &Rмагазин + + + + Systray + Систрей + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary продолжит работать в системном трее. Чтобы завершить работу программы, выберите <b>Выход</b> в контекстном меню значка на панели задач. YACReader::WhatsNewDialog - Close - Закрыть + Закрыть @@ -1407,172 +4047,152 @@ YACReaderFlowConfigWidget - CoverFlow look - Вид рулеткой + Вид рулеткой - How to show covers: - Как отображать обложки: + Как отображать обложки: - Stripe look - Вид полосами + Вид полосами - Overlapped Stripe look - Вид перекрывающимися полосами + Вид перекрывающимися полосами YACReaderGLFlowConfigWidget - Zoom - Масштабировать + Масштабировать - Light - Осветить + Осветить - Show advanced settings - Показать дополнительные настройки + Показать дополнительные настройки - Roulette look - Вид рулеткой + Вид рулеткой - Cover Angle - Охватить угол + Охватить угол - Stripe look - Вид полосами + Вид полосами - Position - Позиция + Позиция - Z offset - Смещение по Z + Смещение по Z - Y offset - Смещение по Y + Смещение по Y - Central gap - Сфокусировать разрыв + Сфокусировать разрыв - Presets: - Предустановки: + Предустановки: - Overlapped Stripe look - Вид перекрывающимися полосами + Вид перекрывающимися полосами - Modern look - Современный вид + Современный вид - View angle - Угол зрения + Угол зрения - Max angle - Максимальный угол + Максимальный угол - Custom: - Пользовательский: + Пользовательский: - Classic look - Классический вид + Классический вид - Cover gap - Осветить разрыв + Осветить разрыв - High Performance - Максимальная производительность + Максимальная производительность - Performance: - Производительность: + Производительность: - Use VSync (improve the image quality in fullscreen mode, worse performance) - Использовать VSync (повысить формат изображения в полноэкранном режиме , хуже производительность) + Использовать VSync (повысить формат изображения в полноэкранном режиме , хуже производительность) - Visibility - Прозрачность + Прозрачность - Low Performance - Минимальная производительность + Минимальная производительность YACReaderOptionsDialog - + Save Сохранить - Use hardware acceleration (restart needed) - Использовать аппаратное ускорение (Требуется перезагрузка) + Использовать аппаратное ускорение (Требуется перезагрузка) - + Cancel Отмена - + Shortcuts Горячие клавиши - + Edit shortcuts Редактировать горячие клавиши + + YACReaderSearchLineEdit + + + type to search + Начать поиск + + YACReaderSlider @@ -1584,23 +4204,23 @@ YACReaderTranslator - + clear очистить - + Service not available Сервис недоступен - - + + Translation Перевод - + YACReader translator Переводчик YACReader diff --git a/YACReader/yacreader_tr.ts b/YACReader/yacreader_tr.ts index 105ce7f30..8353996e7 100644 --- a/YACReader/yacreader_tr.ts +++ b/YACReader/yacreader_tr.ts @@ -10,1372 +10,4074 @@ - BookmarksDialog + AddLabelDialog - - Close - Kapat + + Label name: + Etiket adı: - - - Loading... - Yükleniyor... + + Choose a color: + Renk seçiniz: - - Click on any image to go to the bookmark - Yer imine git + + accept + kabul et - - Lastest Page - Son Sayfa + + cancel + vazgeç - EditShortcutsDialog + AddLibraryDialog - - Restore defaults - Varsayılarları geri yükle + + Comics folder : + Çizgi roman klasörü : - - To change a shortcut, double click in the key combination and type the new keys. - Bir kısayolu değiştirmek için tuş kombinasyonuna çift tıklayın ve yeni tuşları girin. + + Library name : + Kütüphane adı : - - Shortcuts settings - Kısayol oyarları + + Add + Ekle - - Shortcut in use - Kısayol kullanımda + + Cancel + Vazgeç - - The shortcut "%1" is already assigned to other function - "%1" kısayolu bir başka işleve zaten atanmış + + Add an existing library + Kütüphaneye ekle - FileComic + ApiKeyDialog - - 7z not found - 7z bulunamadı + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Comic Vine'a bağlanmadan önce kendi API anahtarınıza ihtiyacınız var. Lütfen <a href="http://www.comicvine.com/api/">buradan</a> ücretsiz bir tane edinin - - CRC error on page (%1): some of the pages will not be displayed correctly - (%1). sayfada CRC hatası : bazı sayfalar düzgün görüntülenmeyecek + + Paste here your Comic Vine API key + Comic Vine API anahtarınızı buraya yapıştırın - - Unknown error opening the file - Dosya açılırken bilinmeyen hata + + Accept + Kabul et - - Format not supported - Biçim desteklenmiyor + + Cancel + Vazgeç - GoToDialog + AppearanceTabWidget - - Go To - Git + + Color scheme + Renk şeması - - Go to... - Git... + + System + Sistem - - - Total pages : - Toplam sayfa: + + Light + Işık - - Cancel - Vazgeç + + Dark + Karanlık - - Page : - Sayfa : + + Custom + Gelenek - - - GoToFlowToolBar - - Page : - Sayfa : + + Remove + Kaldırmak - - - HelpAboutDialog - - Help - Yardım + + Remove this user-imported theme + Kullanıcı tarafından içe aktarılan bu temayı kaldır - - System info - + + Light: + Işık: - - About - Hakkında + + Dark: + Karanlık: - - - LogWindow - - Log window - Günlük penceresi + + Custom: + Kişisel: - - &Pause - &Duraklat + + Import theme... + Temayı içe aktar... - - &Save - &Kaydet + + Theme + Tema - - C&lear - &Temizle + + Theme editor + Tema düzenleyici - - &Copy - &Kopyala + + Open Theme Editor... + Tema Düzenleyiciyi Aç... - - Level: - + + Theme editor error + Tema düzenleyici hatası - - &Auto scroll - &Otomatik kaydır + + The current theme JSON could not be loaded. + Geçerli tema JSON yüklenemedi. - - - MainWindowViewer - Help - Yardım + + Import theme + Temayı içe aktar - Save - Kaydet + + JSON files (*.json);;All files (*) + JSON dosyaları (*.json);;Tüm dosyalar (*) - &File - &Dosya + + Could not import theme from: +%1 + Tema şu kaynaktan içe aktarılamadı: +%1 - &Next - &İleri + + Could not import theme from: +%1 + +%2 + Tema şu kaynaktan içe aktarılamadı: +%1 + +%2 - &Open - &Aç + + Import failed + İçe aktarma başarısız oldu + + + BookmarksDialog + Close - Kapat + Kapat - Open Comic - Çizgi Romanı Aç + + + Loading... + Yükleniyor... - Go To - Git + + Click on any image to go to the bookmark + Yer imine git - Open image folder - Resim dosyasınıaç + + Lastest Page + Son Sayfa + + + ClassicComicsView - Set bookmark - Yer imi yap + + Hide comic flow + Comic Flow'u gizle + + + ComicModel - page_%1.jpg - sayfa_%1.jpg + + yes + evet - Switch to double page mode - Çift sayfa moduna geç + + no + hayır - Save current page - Geçerli sayfayı kaydet + + Title + Başlık - Double page mode - Çift sayfa modu + + File Name + Dosya Adı - Switch Magnifying glass - Büyüteç + + Pages + Sayfalar - Open Folder - Dosyayı Aç + + Size + Boyut - Comic files - Çizgi Roman Dosyaları + + Read + Oku - Go to previous page - Önceki sayfaya dön + + Current Page + Geçreli Sayfa - Open a comic - Çizgi romanı aç + + Publication Date + Yayın Tarihi - Image files (*.jpg) - Resim dosyaları (*.jpg) + + Rating + Reyting - Next Comic - Sırada ki çizgi roman + + Series + Seri - Fit Width - Uygun Genişlik + + Volume + Hacim - Options - Ayarlar + + Story Arc + Hikaye Arkı + + + ComicVineDialog - Show Info - Bilgiyi göster + + skip + geç - Open folder - Dosyayı aç + + back + geri - Go to page ... - Sayfata git... + + next + sonraki - Fit image to width - Görüntüyü sığdır + + search + ara - &Previous - &Geri + + close + kapat - Go to next page - Sonra ki sayfaya geç + + + comic %1 of %2 - %3 + çizgi roman %1 / %2 - %3 - Show keyboard shortcuts - Klavye kısayollarını göster + + + + Looking for volume... + Sayılar aranıyor... - There is a new version available - Yeni versiyon mevcut + + %1 comics selected + %1 çizgi roman seçildi - Open next comic - Sıradaki çizgi romanı aç + + Error connecting to ComicVine + ComicVine sitesine bağlanılırken hata - Show bookmarks - Yer imlerini göster + + + Retrieving tags for : %1 + %1 için etiketler alınıyor - Open previous comic - Önceki çizgi romanı aç + + Retrieving volume info... + Sayı bilgileri alınıyor... - Rotate image to the left - Sayfayı sola yatır + + Looking for comic... + Çizgi romanlar aranıyor... + + + ContinuousPageWidget - Fit image to height - Uygun yüksekliğe getir + + Loading page %1 + %1 sayfası yükleniyor + + + CreateLibraryDialog - Show the bookmarks of the current comic - Bu çizgi romanın yer imlerini göster + + Comics folder : + Çizgi roman klasörü : - Show Dictionary - Sözlüğü göster + + Library Name : + Kütüphane Adı : - YACReader options - YACReader ayarları + + Create + Oluştur - Help, About YACReader - YACReader hakkında yardım ve bilgi + + Cancel + Vazgeç - Show go to flow - Akışı göster + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Yeni kütüphanenin oluşturulması birkaç dakika sürecek. - Previous Comic - Önce ki çizgi roman + + Create new library + Yeni kütüphane oluştur - Show full size - Tam erken + + Path not found + Dizin bulunamadı - Magnifying glass - Büyüteç + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol + + + EditShortcutsDialog - General - Genel + + Restore defaults + Varsayılarları geri yükle - Set a bookmark on the current page - Sayfayı yer imi olarak ayarla + + To change a shortcut, double click in the key combination and type the new keys. + Bir kısayolu değiştirmek için tuş kombinasyonuna çift tıklayın ve yeni tuşları girin. - Do you want to download the new version? - Yeni versiyonu indirmek ister misin ? + + Shortcuts settings + Kısayol oyarları - Rotate image to the right - Sayfayı sağa yator + + Shortcut in use + Kısayol kullanımda - Always on top - Her zaman üstte + + The shortcut "%1" is already assigned to other function + "%1" kısayolu bir başka işleve zaten atanmış + + + EmptyFolderWidget - New instance - Yeni örnek + + This folder doesn't contain comics yet + Bu klasör henüz çizgi roman içermiyor + + + EmptyLabelWidget - Open latest comic - En son çizgi romanı aç + + This label doesn't contain comics yet + Bu etiket henüz çizgi roman içermiyor + + + EmptyReadingListWidget - Open the latest comic opened in the previous reading session - Önceki okuma oturumunda açılan en son çizgi romanı aç + + This reading list does not contain any comics yet + Bu okuma listesi henüz çizgi roman içermiyor + + + EmptySpecialListWidget - Clear - Temizle + + No favorites + Favoriler boş - Clear open recent list - Son açılanlar listesini temizle + + You are not reading anything yet, come on!! + Henüz bir şey okumuyorsun, hadi ama! - Fit Height - Yüksekliğe Sığdır + + There are no recent comics! + Yeni çizgi roman yok! + + + ExportComicsInfoDialog - Fit to page - Sayfaya sığdır + + Output file : + Çıkış dosyası : - Reset zoom - Yakınlaştırmayı sıfırla + + Create + Oluştur - Show zoom slider - Yakınlaştırma çubuğunu göster + + Cancel + Vazgeç + + + + Export comics info + Çizgi roman bilgilerini göster + + + + Destination database name + Hedef adı + + + + Problem found while writing + Yazma sırasında bir problem oldu + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol + + + + ExportLibraryDialog + + + Output folder : + Çıktı klasörü : + + + + Create + Oluştur + + + + Cancel + Vazgeç + + + + Create covers package + Kapak paketi oluştur + + + + Problem found while writing + Yazma sırasında bir problem oldu + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol + + + + Destination directory + Hedef dizin + + + + FileComic + + + 7z not found + 7z bulunamadı + + + + CRC error on page (%1): some of the pages will not be displayed correctly + (%1). sayfada CRC hatası : bazı sayfalar düzgün görüntülenmeyecek + + + + Unknown error opening the file + Dosya açılırken bilinmeyen hata + + + + Format not supported + Biçim desteklenmiyor + + + + GoToDialog + + + Go To + Git + + + + Go to... + Git... + + + + + Total pages : + Toplam sayfa: + + + + Cancel + Vazgeç + + + + Page : + Sayfa : + + + + GoToFlowToolBar + + + Page : + Sayfa : + + + + GridComicsView + + + Show info + Bilgi göster + + + + HelpAboutDialog + + + Help + Yardım + + + + System info + Sistem bilgisi + + + + About + Hakkında + + + + ImportComicsInfoDialog + + + Import comics info + Çizgi roman bilgilerini çıkart + + + + Info database location : + Bilgi veritabanı konumu : + + + + Import + Çıkart + + + + Cancel + Vazgeç + + + + Comics info file (*.ydb) + Çizgi roman bilgi dosyası (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Kütüphane Adı : + + + + Package location : + Paket konumu : + + + + Destination folder : + Hedef klasör : + + + + Unpack + Paketten çıkar + + + + Cancel + Vazgeç + + + + Extract a catalog + Katalog ayıkla + + + + Compresed library covers (*.clc) + Sıkıştırılmış kütüphane kapakları (*.clc) + + + + ImportWidget + + + stop + dur + + + + Some of the comics being added... + Bazı çizgi romanlar önceden eklenmiş... + + + + Importing comics + önemli çizgi romanlar + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderKütüphane şu anda yeni bir kütüphane oluşturuyor</p><p>Kütüphanenin oluşturulması birkaç dakika alacak.</p> + + + + Updating the library + Kütüphaneyi güncelle + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Kütüphane güncelleniyor</p><p>Güncellemeyi daha sonra iptal edebilirsin.</p> + + + + Upgrading the library + Kütüphane güncelleniyor + + + + <p>The current library is being upgraded, please wait.</p> + <p>Mevcut kütüphane güncelleniyor, lütfen bekleyin.</p> + + + + Scanning the library + Kütüphaneyi taramak + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Geçerli kitaplık, eski XML meta veri bilgileri için taranıyor.</p><p>Bu yalnızca bir kez gereklidir ve yalnızca kitaplığın YACReaderLibrary 9.8.2 veya daha eski bir sürümle oluşturulmuş olması durumunda gereklidir.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Kütüphane + + + + + + comic + komik + + + + + + manga + manga t?r? + + + + + + western manga (left to right) + Batı mangası (soldan sağa) + + + + + + web comic + web çizgi romanı + + + + + + 4koma (top to botom) + 4koma (yukarıdan aşağıya) + + + + + + + Set type + Türü ayarla + + + + Library + Kütüphane + + + + Folder + Klasör + + + + Comic + Çizgi roman + + + + Upgrade failed + Yükseltme başarısız oldu + + + + There were errors during library upgrade in: + Kütüphane yükseltmesi sırasında hatalar oluştu: + + + + Update needed + Güncelleme gerekli + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Bu kütüphane YACReaderKütüphabenin bir önceki versiyonun oluşturulmuş, güncellemeye ihtiyacın var. Şimdi güncellemek ister misin ? + + + + Download new version + Yeni versiyonu indir + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Bu kütüphane YACRKütüphanenin üst bir versiyonunda oluşturulmu. Yeni versiyonu indirmek ister misiniz ? + + + + + Library not available + Kütüphane ulaşılabilir değil + + + + Library '%1' is no longer available. Do you want to remove it? + Kütüphane '%1'ulaşılabilir değil. Kaldırmak ister misin? + + + + Old library + Eski kütüphane + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Kütüphane '%1 YACRKütüphanenin eski bir sürümünde oluşturulmuş, Kütüphaneyi yeniden oluşturmak ister misin? + + + + + Copying comics... + Çizgi romanlar kopyalanıyor... + + + + + Moving comics... + Çizgi romanlar taşınıyor... + + + + Add new folder + Yeni klasör ekle + + + + Folder name: + Klasör adı: + + + + No folder selected + Hiçbir klasör seçilmedi + + + + Please, select a folder first + Lütfen, önce bir klasör seçiniz + + + + Error in path + Yolda hata + + + + There was an error accessing the folder's path + Klasörün yoluna erişilirken hata oluştu + + + + Delete folder + Klasörü sil + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Seçilen klasör ve tüm içeriği diskinizden silinecek. Emin misin? + + + + + Unable to delete + Silinemedi + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Seçili klasörleri silmeye çalışırken bir sorun oluştu. Lütfen yazma izinlerini kontrol edin ve herhangi bir uygulamanın bu klasörleri veya içerdiği dosyalardan herhangi birini kullandığından emin olun. + + + + Add new reading lists + Yeni okuma listeleri ekle + + + + + List name: + Liste adı: + + + + Delete list/label + Listeyi/Etiketi sil + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Seçilen öğe silinecek, çizgi romanlarınız veya klasörleriniz diskinizden SİLİNMEYECEKTİR. Emin misin? + + + + Rename list name + Listeyi yeniden adlandır + + + + Open folder... + Dosyayı aç... + + + + Update folder + Klasörü güncelle + + + + Rescan library for XML info + XML bilgisi için kitaplığı yeniden tarayın + + + + Set as uncompleted + Tamamlanmamış olarak ayarla + + + + Set as completed + Tamamlanmış olarak ayarla + + + + Set as read + Okundu olarak işaretle + + + + + Set as unread + Hepsini okunmadı işaretle + + + + Set custom cover + Özel kapak ayarla + + + + Delete custom cover + Özel kapağı sil + + + + Save covers + Kapakları kaydet + + + + You are adding too many libraries. + Çok fazla kütüphane ekliyorsunuz. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Çok fazla kütüphane ekliyorsunuz. + +Muhtemelen üst düzey çizgi roman klasörünüzde yalnızca bir kütüphaneye ihtiyacınız vardır, sol kenar çubuğundaki klasörler bölümünü kullanarak herhangi bir alt klasöre göz atabilirsiniz. + +YACReaderLibrary daha fazla kütüphane oluşturmanıza engel olmaz ancak kütüphane sayısını düşük tutmalısınız. + + + + + YACReader not found + YACReader bulunamadı + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader bulunamadı. YACReader, YACReaderLibrary ile aynı klasöre kurulmalıdır. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader bulunamadı. YACReader kurulumunuzda bir sorun olabilir. + + + + Error + Hata + + + + Error opening comic with third party reader. + Çizgi roman üçüncü taraf okuyucuyla açılırken hata oluştu. + + + + Library not found + Kütüphane bulunamadı + + + + The selected folder doesn't contain any library. + Seçilen dosya kütüphanede yok. + + + + Are you sure? + Emin misin? + + + + Do you want remove + Kaldırmak ister misin + + + + library? + kütüphane? + + + + Remove and delete metadata + Metadata'yı kaldır ve sil + + + + Library info + Kütüphane bilgisi + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Seçilen çizgi romanlar silinmeye çalışılırken bir sorun oluştu. Lütfen seçilen dosyalarda veya klasörleri içeren yazma izinlerini kontrol edin. + + + + Assign comics numbers + Çizgi roman numaraları ata + + + + Assign numbers starting in: + Şunlardan başlayarak numaralar ata: + + + + Invalid image + Geçersiz resim + + + + The selected file is not a valid image. + Seçilen dosya geçerli bir resim değil. + + + + Error saving cover + Kapak kaydedilirken hata oluştu + + + + There was an error saving the cover image. + Kapak resmi kaydedilirken bir hata oluştu. + + + + Error creating the library + Kütüphane oluşturma sorunu + + + + Error updating the library + Kütüphane güncelleme sorunu + + + + Error opening the library + Haa kütüphanesini aç + + + + Delete comics + Çizgi romanları sil + + + + All the selected comics will be deleted from your disk. Are you sure? + Seçilen tüm çizgi romanlar diskten silinecek emin misin ? + + + + Remove comics + Çizgi romanları kaldır + + + + Comics will only be deleted from the current label/list. Are you sure? + Çizgi romanlar yalnızca mevcut etiketten/listeden silinecektir. Emin misin? + + + + Library name already exists + Kütüphane ismi zaten alınmış + + + + There is another library with the name '%1'. + Bu başka bir kütüphanenin adı '%1'. + + + + LibraryWindowActions + + + Create a new library + Yeni kütüphane oluştur + + + + Open an existing library + Çıkış kütüphanesini aç + + + + + Export comics info + Çizgi roman bilgilerini göster + + + + + Import comics info + Çizgi roman bilgilerini çıkart + + + + Pack covers + Paket kapakları + + + + Pack the covers of the selected library + Kütüphanede ki kapakları paketle + + + + Unpack covers + Kapakları aç + + + + Unpack a catalog + Kataloğu çkart + + + + Update library + Kütüphaneyi güncelle + + + + Update current library + Kütüphaneyi güncelle + + + + Rename library + Kütüphaneyi yeniden adlandır + + + + Rename current library + Kütüphaneyi adlandır + + + + Remove library + Kütüphaneyi sil + + + + Remove current library from your collection + Kütüphaneyi koleksiyonundan kaldır + + + + Rescan library for XML info + XML bilgisi için kitaplığı yeniden tarayın + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Komik dosyalara gömülü XML bilgilerini bulmaya çalışır. Bunu yalnızca kitaplık 9.8.2 veya önceki sürümlerle oluşturulmuşsa veya XML bilgilerini dosyalara eklemek için üçüncü taraf yazılım kullanıyorsanız yapmanız gerekir. + + + + Show library info + Kitaplık bilgilerini göster + + + + Show information about the current library + Geçerli kitaplık hakkındaki bilgileri göster + + + + Open current comic + Seçili çizgi romanı aç + + + + Open current comic on YACReader + YACReader'ı geçerli çizgi roman okuyucsu seç + + + + Save selected covers to... + Seçilen kapakları şuraya kaydet... + + + + Save covers of the selected comics as JPG files + Seçilen çizgi romanların kapaklarını JPG dosyaları olarak kaydet + + + + + Set as read + Okundu olarak işaretle + + + + Set comic as read + Çizgi romanı okundu olarak işaretle + + + + + Set as unread + Hepsini okunmadı işaretle + + + + Set comic as unread + Çizgi Romanı okunmadı olarak seç + + + + + manga + manga t?r? + + + + Set issue as manga + Sayıyı manga olarak ayarla + + + + + comic + komik + + + + Set issue as normal + Sayıyı normal olarak ayarla + + + + western manga + batı mangası + + + + Set issue as western manga + Konuyu western mangası olarak ayarla + + + + + web comic + web çizgi romanı + + + + Set issue as web comic + Sorunu web çizgi romanı olarak ayarla + + + + + yonkoma + d?rt panelli + + + + Set issue as yonkoma + Sorunu yonkoma olarak ayarla + + + + Show/Hide marks + Altçizgileri aç/kapa + + + + Show or hide read marks + Okundu işaretlerini göster yada gizle + + + + Show/Hide recent indicator + Son göstergeyi Göster/Gizle + + + + Show or hide recent indicator + Son göstergeyi göster veya gizle + + + + + Fullscreen mode on/off + Tam ekran modu açık/kapalı + + + + Help, About YACReader + YACReader hakkında yardım ve bilgi + + + + Add new folder + Yeni klasör ekle + + + + Add new folder to the current library + Geçerli kitaplığa yeni klasör ekle + + + + Delete folder + Klasörü sil + + + + Delete current folder from disk + Geçerli klasörü diskten sil + + + + Select root node + Kökü seçin + + + + Expand all nodes + Tüm düğümleri büyüt + + + + Collapse all nodes + Tüm düğümleri kapat + + + + Show options dialog + Ayarları göster + + + + Show comics server options dialog + Çizgi romanların server ayarlarını göster + + + + + Change between comics views + Çizgi roman görünümleri arasında değiştir + + + + Open folder... + Dosyayı aç... + + + + Set as uncompleted + Tamamlanmamış olarak ayarla + + + + Set as completed + Tamamlanmış olarak ayarla + + + + Set custom cover + Özel kapak ayarla + + + + Delete custom cover + Özel kapağı sil + + + + western manga (left to right) + Batı mangası (soldan sağa) + + + + Open containing folder... + Klasör açılıyor... + + + + Reset comic rating + Çizgi roman reytingini sıfırla + + + + Select all comics + Tüm çizgi romanları seç + + + + Edit + Düzen + + + + Assign current order to comics + Geçerli sırayı çizgi romanlara ata + + + + Update cover + Kapağı güncelle + + + + Delete selected comics + Seçili çizgi romanları sil + + + + Delete metadata from selected comics + Seçilen çizgi romanlardan meta verileri sil + + + + Download tags from Comic Vine + Etiketleri Comic Vine sitesinden indir + + + + Focus search line + Arama satırına odaklan + + + + Focus comics view + Çizgi roman görünümüne odaklanın + + + + Edit shortcuts + Kısayolları düzenle + + + + &Quit + &Çıkış + + + + Update folder + Klasörü güncelle + + + + Update current folder + Geçerli klasörü güncelle + + + + Scan legacy XML metadata + Eski XML meta verilerini tarayın + + + + Add new reading list + Yeni okuma listesi ekle + + + + Add a new reading list to the current library + Geçerli kitaplığa yeni bir okuma listesi ekle + + + + Remove reading list + Okuma listesini kaldır + + + + Remove current reading list from the library + Geçerli okuma listesini kütüphaneden kaldır + + + + Add new label + Yeni etiket ekle + + + + Add a new label to this library + Bu kitaplığa yeni bir etiket ekle + + + + Rename selected list + Seçilen listeyi yeniden adlandır + + + + Rename any selected labels or lists + Seçilen etiketleri ya da listeleri yeniden adlandır + + + + Add to... + Şuraya ekle... + + + + Favorites + Favoriler + + + + Add selected comics to favorites list + Seçilen çizgi romanları favoriler listesine ekle + + + + LocalComicListModel + + + file name + dosya adı + + + + LogWindow + + Log window + Günlük penceresi + + + &Pause + &Duraklat + + + &Save + &Kaydet + + + C&lear + &Temizle + + + &Copy + &Kopyala + + + &Auto scroll + &Otomatik kaydır + + + + MainWindowViewer + + Help + Yardım + + + Save + Kaydet + + + &File + &Dosya + + + &Next + &İleri + + + &Open + &Aç + + + Close + Kapat + + + Open Comic + Çizgi Romanı Aç + + + Go To + Git + + + Open image folder + Resim dosyasınıaç + + + Set bookmark + Yer imi yap + + + page_%1.jpg + sayfa_%1.jpg + + + Switch to double page mode + Çift sayfa moduna geç + + + Save current page + Geçerli sayfayı kaydet + + + Double page mode + Çift sayfa modu + + + Switch Magnifying glass + Büyüteç + + + Open Folder + Dosyayı Aç + + + Comic files + Çizgi Roman Dosyaları + + + Go to previous page + Önceki sayfaya dön + + + Open a comic + Çizgi romanı aç + + + Image files (*.jpg) + Resim dosyaları (*.jpg) + + + Next Comic + Sırada ki çizgi roman + + + Fit Width + Uygun Genişlik + + + Options + Ayarlar + + + Show Info + Bilgiyi göster + + + Open folder + Dosyayı aç + + + Go to page ... + Sayfata git... + + + Fit image to width + Görüntüyü sığdır + + + &Previous + &Geri + + + Go to next page + Sonra ki sayfaya geç + + + Show keyboard shortcuts + Klavye kısayollarını göster + + + There is a new version available + Yeni versiyon mevcut + + + Open next comic + Sıradaki çizgi romanı aç + + + Show bookmarks + Yer imlerini göster + + + Open previous comic + Önceki çizgi romanı aç + + + Rotate image to the left + Sayfayı sola yatır + + + Fit image to height + Uygun yüksekliğe getir + + + Show the bookmarks of the current comic + Bu çizgi romanın yer imlerini göster + + + Show Dictionary + Sözlüğü göster + + + YACReader options + YACReader ayarları + + + Help, About YACReader + YACReader hakkında yardım ve bilgi + + + Show go to flow + "Comic Flow'a git"i göster + + + Previous Comic + Önce ki çizgi roman + + + Show full size + Tam erken + + + Magnifying glass + Büyüteç + + + General + Genel + + + Set a bookmark on the current page + Sayfayı yer imi olarak ayarla + + + Do you want to download the new version? + Yeni versiyonu indirmek ister misin ? + + + Rotate image to the right + Sayfayı sağa yator + + + Always on top + Her zaman üstte + + + New instance + Yeni örnek + + + Open latest comic + En son çizgi romanı aç + + + Open the latest comic opened in the previous reading session + Önceki okuma oturumunda açılan en son çizgi romanı aç + + + Clear + Temizle + + + Clear open recent list + Son açılanlar listesini temizle + + + Fit Height + Yüksekliğe Sığdır + + + Fit to page + Sayfaya sığdır + + + Reset zoom + Yakınlaştırmayı sıfırla + + + Show zoom slider + Yakınlaştırma çubuğunu göster Zoom+ Yakınlaştır - Zoom- - Uzaklaştır + Zoom- + Uzaklaştır + + + Double page manga mode + Çift sayfa manga kipi + + + Reverse reading order in double page mode + Çift sayfa kipinde ters okuma sırası + + + Edit shortcuts + Kısayolları düzenle + + + Open recent + Son dosyaları aç + + + File + Dosya + + + Edit + Düzen + + + View + Görünüm + + + Go + Git + + + Window + Pencere + + + Comics + Çizgi Roman + + + Toggle fullscreen mode + Tam ekran kipini aç/kapat + + + Hide/show toolbar + Araç çubuğunu göster/gizle + + + Size up magnifying glass + Büyüteci büyüt + + + Size down magnifying glass + Büyüteci küçült + + + Zoom in magnifying glass + Büyüteci yakınlaştır + + + Zoom out magnifying glass + Büyüteci uzaklaştır + + + Magnifiying glass + Büyüteç + + + Toggle between fit to width and fit to height + Genişliğe sığdır ile yüksekliğe sığdır arasında geçiş yap + + + Page adjustement + Sayfa ayarı + + + Autoscroll down + Otomatik aşağı kaydır + + + Autoscroll up + Otomatik yukarı kaydır + + + Autoscroll forward, horizontal first + Otomatik ileri kaydır, önce yatay + + + Autoscroll backward, horizontal first + Otomatik geri kaydır, önce yatay + + + Autoscroll forward, vertical first + Otomatik ileri kaydır, önce dikey + + + Autoscroll backward, vertical first + Otomatik geri kaydır, önce dikey + + + Move down + Aşağı git + + + Move up + Yukarı git + + + Move left + Sola git + + + Move right + Sağa git + + + Go to the first page + İlk sayfaya git + + + Go to the last page + En son sayfaya git + + + Reading + Okuma + + + Remind me in 14 days + 14 gün içinde hatırlat + + + Not now + Şimdi değil + + + + NoLibrariesWidget + + + You don't have any libraries yet + Henüz bir kütüphaneye sahip değilsin + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Yeni bir kütüphane oluşturabilmeniçin kütüphane</p><p>No olvides que puedes usar YACReader como una aplicación independiente para leer los cómics en tu ordenador.</p> + + + + create your first library + İlk kütüphaneni oluştur + + + + add an existing one + Var olan bir tane ekle + + + + NoSearchResultsWidget + + + No results + Sonuç yok + + + + OptionsDialog + + + Gamma + Gama + + + + Reset + Yeniden başlat + + + + My comics path + Çizgi Romanlarım + + + + Scaling + Ölçeklendirme + + + + Scaling method + Ölçeklendirme yöntemi + + + + Nearest (fast, low quality) + En yakın (hızlı, düşük kalite) + + + + Bilinear + Çift doğrusal + + + + Lanczos (better quality) + Lanczos (daha kaliteli) + + + + Image adjustment + Resim ayarları + + + + "Go to flow" size + "Comic Flow'a git" boyutu + + + + Choose + Seç + + + + Image options + Sayfa ayarları + + + + Contrast + Kontrast + + + + + Libraries + Kütüphaneler + + + + Comic Flow + Comic Flow + + + + Grid view + Izgara görünümü + + + + + Appearance + Dış görünüş + + + + + Options + Ayarlar + + + + + Language + Dil + + + + + Application language + Uygulama dili + + + + + System default + Sistem varsayılanı + + + + Tray icon settings (experimental) + Tepsi simgesi ayarları (deneysel) + + + + Close to tray + Tepsiyi kapat + + + + Start into the system tray + Sistem tepsisinde başlat + + + + Edit Comic Vine API key + Comic Vine API anahtarını düzenle + + + + Comic Vine API key + Comic Vine API anahtarı + + + + ComicInfo.xml legacy support + ComicInfo.xml eski desteği + + + + Import metadata from ComicInfo.xml when adding new comics + Yeni çizgi roman eklerken meta verileri ComicInfo.xml'den içe aktarın + + + + Consider 'recent' items added or updated since X days ago + X gün öncesinden bu yana eklenen veya güncellenen 'en son' öğeleri göz önünde bulundurun + + + + Third party reader + Üçüncü taraf okuyucu + + + + Write {comic_file_path} where the path should go in the command + Komutta yolun gitmesi gereken yere {comic_file_path} yazın + + + + + Clear + Temizle + + + + Update libraries at startup + Başlangıçta kitaplıkları güncelleyin + + + + Try to detect changes automatically + Değişiklikleri otomatik olarak algılamayı deneyin + + + + Update libraries periodically + Kitaplıkları düzenli aralıklarla güncelleyin + + + + Interval: + Aralık: + + + + 30 minutes + 30 dakika + + + + 1 hour + 1 saat + + + + 2 hours + 2 saat + + + + 4 hours + 4 saat + + + + 8 hours + 8 saat + + + + 12 hours + 12 saat + + + + daily + günlük + + + + Update libraries at certain time + Kitaplıkları belirli bir zamanda güncelle + + + + Time: + Zaman: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + UYARI! Kütüphane güncellemeleri sırasında veritabanına yazma işlemi devre dışı bırakılır! +Uygulamayı aktif olarak kullanırken güncelleme planlamayın. +Otomatik güncellemeler sırasında uygulama, güncelleme bitene kadar bazı eylemleri engelleyecektir. +Otomatik güncellemeyi durdurmak için Kitaplıklar başlığının yanındaki yükleme göstergesine dokunun. + + + + Modifications detection + Değişiklik tespiti + + + + Compare the modified date of files when updating a library (not recommended) + Kitaplığı güncellerken dosyaların değiştirilme tarihini karşılaştırın (önerilmez) + + + + Enable background image + Arka plan resmini etkinleştir + + + + Opacity level + Matlık düzeyi + + + + Blur level + Bulanıklık düzeyi + + + + Use selected comic cover as background + Seçilen çizgi roman kapanığı arka plan olarak kullan + + + + Restore defautls + Varsayılanları geri yükle + + + + Background + Arka plan + + + + Display continue reading banner + Okuma devam et bannerını göster + + + + Display current comic banner + Mevcut çizgi roman banner'ını görüntüle + + + + Continue reading + Okumaya devam et + + + + Comics directory + Çizgi roman konumu + + + + Background color + Arka plan rengi + + + + Page Flow + Sayfa akışı + + + + + General + Genel + + + + Brightness + Parlaklık + + + + + Restart is needed + Yeniden başlatılmalı + + + + Quick Navigation Mode + Hızlı Gezinti Kipi + + + + Display + Görüntülemek + + + + Show time in current page information label + Geçerli sayfa bilgisi etiketinde zamanı göster + + + + Scroll behaviour + Kaydırma davranışı + + + + Disable scroll animations and smooth scrolling + Kaydırma animasyonlarını ve düzgün kaydırmayı devre dışı bırakın + + + + Do not turn page using scroll + Kaydırmayı kullanarak sayfayı çevirmeyin + + + + Use single scroll step to turn page + Sayfayı çevirmek için tek kaydırma adımını kullanın + + + + Mouse mode + Fare modu + + + + Only Back/Forward buttons can turn pages + Yalnızca Geri/İleri düğmeleri sayfaları çevirebilir + + + + Use the Left/Right buttons to turn pages. + Sayfaları çevirmek için Sol/Sağ tuşlarını kullanın. + + + + Click left or right half of the screen to turn pages. + Sayfaları çevirmek için ekranın sol veya sağ yarısına tıklayın. + + + + Disable mouse over activation + Etkinleştirme üzerinde fareyi devre dışı bırak + + + + Fit options + Sığdırma seçenekleri + + + + Enlarge images to fit width/height + Genişliğe/yüksekliği sığmaları için resimleri genişlet + + + + Double Page options + Çift Sayfa seçenekleri + + + + Show covers as single page + Kapakları tek sayfa olarak göster + + + + PropertiesDialog + + + General info + Genel bilgi + + + + Plot + Argumento + + + + Authors + Yazarlar + + + + Publishing + Yayın + + + + Notes + Notlar + + + + Cover page + Kapak sayfası + + + + Load previous page as cover + Önceki sayfayı kapak olarak yükle + + + + Load next page as cover + Sonraki sayfayı kapak olarak yükle + + + + Reset cover to the default image + Kapağı varsayılan görüntüye sıfırla + + + + Load custom cover image + Özel kapak resmini yükle + + + + Series: + Seriler: + + + + Title: + Başlık: + + + + + + of: + ile ilgili: + + + + Issue number: + Yayın numarası: + + + + Volume: + Cilt: + + + + Arc number: + Ark numarası: + + + + Story arc: + Hiakye: + + + + alt. number: + alternatif sayı: + + + + Alternate series: + Alternatif seri: + + + + Series Group: + Seri Grubu: + + + + Genre: + Tür: + + + + Size: + Boyut: + + + + Writer(s): + Yazarlar: + + + + Penciller(s): + Çizenler: + + + + Inker(s): + Mürekkep(ler): + + + + Colorist(s): + Renklendiren: + + + + Letterer(s): + Mesaj(lar): + + + + Cover Artist(s): + Kapak artisti: + + + + Editor(s): + Editör(ler): + + + + Imprint: + Künye: + + + + Day: + Gün: + + + + Month: + Ay: + + + + Year: + Yıl: + + + + Publisher: + Yayıncı: + + + + Format: + Formato: + + + + Color/BW: + Renk/BW: + + + + Age rating: + Yaş sınırı: + + + + Type: + Tip: + + + + Language (ISO): + Dil (ISO): + + + + Synopsis: + Özet: + + + + Characters: + Karakterler: + + + + Teams: + Takımlar: + + + + Locations: + Konumlar: + + + + Main character or team: + Ana karakter veya takım: + + + + Review: + Gözden geçirmek: + + + + Notes: + Notlar: + + + + Tags: + Etiketler: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine bağlantısı: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> görüntüle </a> + + + + Not found + Bulunamadı + + + + Comic not found. You should update your library. + Çizgi roman bulunamadı. Kütüphaneyi güncellemelisin. + + + + Edit comic information + Çizgi roman bilgisini düzenle - Double page manga mode - Çift sayfa manga kipi + + Edit selected comics information + Seçilen çizgi roman bilgilerini düzenle - Reverse reading order in double page mode - Çift sayfa kipinde ters okuma sırası + + Invalid cover + Geçersiz kapak - Edit shortcuts - Kısayolları düzenle + + The image is invalid. + Resim geçersiz. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer, YACReaderLibrary'nin başsız (gui yok) sürümüdür. + +Bu uygulama kalıcı ayarları destekler, bunları ayarlamak için bu dosyayı düzenleyin %1 +Mevcut ayarlar hakkında bilgi edinmek için lütfen https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md adresindeki belgelere bakın. + + + QObject - Open recent - Son dosyaları aç + + 7z lib not found + 7z lib bulunamadı - File - Dosya + + unable to load 7z lib from ./utils + ./utils içinden 7z lib yüklenemedi - Edit - Düzen + + Trace + İz - View - Görünüm + + Debug + Hata ayıkla - Go - Git + + Info + Bilgi - Window - Pencere + + Warning + Uyarı - Comics - Çizgi Roman + + Error + Hata - Toggle fullscreen mode - Tam ekran kipini aç/kapat + + Fatal + Ölümcül - Hide/show toolbar - Araç çubuğunu göster/gizle + + Select custom cover + Özel kapak seçin - Size up magnifying glass - Büyüteci büyüt + + Images (%1) + Resimler (%1) - Size down magnifying glass - Büyüteci küçült + + The file could not be read or is not valid JSON. + Dosya okunamadı veya geçerli bir JSON değil. - Zoom in magnifying glass - Büyüteci yakınlaştır + + This theme is for %1, not %2. + Bu tema %2 için değil, %1 içindir. - Zoom out magnifying glass - Büyüteci uzaklaştır + + Libraries + Kütüphaneler - Magnifiying glass - Büyüteç + + Folders + Klasör - Toggle between fit to width and fit to height - Genişliğe sığdır ile yüksekliğe sığdır arasında geçiş yap + + Reading Lists + Okuma Listeleri + + + QsLogging::LogWindowModel - Page adjustement - Sayfa ayarı + Time + Süre - Autoscroll down - Otomatik aşağı kaydır + Level + Düzey - Autoscroll up - Otomatik yukarı kaydır + Message + Mesaj + + + QsLogging::Window - Autoscroll forward, horizontal first - Otomatik ileri kaydır, önce yatay + &Pause + &Duraklat - Autoscroll backward, horizontal first - Otomatik geri kaydır, önce yatay + &Resume + &Sürdür - Autoscroll forward, vertical first - Otomatik ileri kaydır, önce dikey + Save log + Günlük kaydet - Autoscroll backward, vertical first - Otomatik geri kaydır, önce dikey + Log file (*.log) + Günlük dosyası (*.log) + + + RenameLibraryDialog - Move down - Aşağı git + + New Library Name : + Yeni Kütüphane Adı : - Move up - Yukarı git + + Rename + Yeniden adlandır - Move left - Sola git + + Cancel + Vazgeç - Move right - Sağa git + + Rename current library + Kütüphaneyi adlandır + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Bulunan bölüm sayısı: %1 - Go to the first page - İlk sayfaya git + + + page %1 of %2 + sayfa %1 / %2 - Go to the last page - En son sayfaya git + + Number of %1 found : %2 + Sayı %1, bulunan : %2 + + + SearchSingleComic - Reading - Okuma + + Please provide some additional information for this comic. + Lütfen bazı ek bilgiler sağlayın. - Remind me in 14 days - 14 gün içinde hatırlat + + Series: + Seriler: - Not now - Şimdi değil + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Tam eşleme aramasını kullanın. Addaki bazı sözcüklerle eşleşen ciltleri bulmak istiyorsanız devre dışı bırakın. - OptionsDialog + SearchVolume - - Gamma - Gama + + Please provide some additional information. + Lütfen bazı ek bilgiler sağlayın. - - Reset - Yeniden başlat + + Series: + Seriler: - - My comics path - Çizgi Romanlarım + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Tam eşleme aramasını kullanın. Addaki bazı sözcüklerle eşleşen ciltleri bulmak istiyorsanız devre dışı bırakın. + + + SelectComic - - Image adjustment - Resim ayarları + + Please, select the right comic info. + Lütfen, doğru çizgi roman bilgisini seçin. - - "Go to flow" size - Akış görünümüne git + + comics + çizgi roman - - Choose - Seç + + loading cover + kapak yükleniyor - - Image options - Sayfa ayarları + + loading description + açıklama yükleniyor - - Contrast - Kontrast + + comic description unavailable + çizgi roman açıklaması mevcut değil + + + + SelectVolume + + + Please, select the right series for your comic. + Çizgi romanınız için doğru seriyi seçin. - - Options - Ayarlar + + Filter: + Filtre: - - Comics directory - Çizgi roman konumu + + volumes + sayı - - Background color - Arka plan rengi + + Nothing found, clear the filter if any. + Hiçbir şey bulunamadı, varsa filtreyi temizleyin. - - Page Flow - Sayfa akışı + + loading cover + kapak yükleniyor + + + + loading description + açıklama yükleniyor + + + + volume description unavailable + cilt açıklaması kullanılamıyor + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Aynı anda çeşitli çizgi romanlar için bilgi almaya çalışıyorsunuz, bunlar aynı serinin parçası mı? + + + + yes + evet + + + + no + hayır + + + + ServerConfigDialog + + + set port + Port Ayarla + + + + Server connectivity information + Sunucu bağlantı bilgileri + + + + Scan it! + Tara! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader, iOS ve Android cihazlarda kullanılabilir.<br/>Bunu <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> veya <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a> için keşfedin. + + + + Choose an IP address + IP adresi seçin + + + + Port + Liman + + + + enable the server + erişilebilir server + + + + ShortcutsDialog + + Close + Kapat + + + YACReader keyboard shortcuts + YACReader klavye kısayolları + + + Keyboard Shortcuts + Klavye Kısayolları + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Lütfen, çizgi romanların bilgileriyle eşleşene kadar soldaki çizgi roman listesini sıralayın. + + + + sort comics to match comic information + çizgi roman bilgilerini eşleştirmek için çizgi romanları sıralayın + + + + issues + sayı + + + + remove selected comics + seçilen çizgi romanları kaldır + + + + restore all removed comics + tüm seçilen çizgi romanları geri yükle + + + + ThemeEditorDialog + + + Theme Editor + Tema Düzenleyici + + + + + + + + + + + - + - + + + + i + Ben + + + + Expand all + Tümünü genişlet + + + + Collapse all + Tümünü daralt + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Kullanıcı arayüzünde seçilen değeri (macenta / geçişli / 0↔10) yanıp sönmek için basılı tutun. Sürümler orijinali geri yükler. + + + + Search… + Aramak… + + + + Light + Işık + + + + Dark + Karanlık + + + + ID: + İD: + + + + Display name: + Ekran adı: + + + + Variant: + Varyant: + + + + Theme info + Tema bilgisi + + + + Parameter + Parametre + + + + Value + Değer + + + + Save and apply + Kaydet ve uygula + + + + Export to file... + Dosyaya aktar... + + + + Load from file... + Dosyadan yükle... + + + + Close + Kapat - - General - Genel + + Double-click to edit color + Rengi düzenlemek için çift tıklayın - - Brightness - Parlaklık + + + + + + + true + doğru - - Restart is needed - Yeniden başlatılmalı + + + + + false + YANLIŞ - - Quick Navigation Mode - Hızlı Gezinti Kipi + + Double-click to toggle + Geçiş yapmak için çift tıklayın - - Display - + + Double-click to edit value + Değeri düzenlemek için çift tıklayın - - Show time in current page information label - + + + + Edit: %1 + Düzenleme: %1 - - Scroll behaviour - + + Save theme + Temayı kaydet - - Disable scroll animations and smooth scrolling - + + + JSON files (*.json);;All files (*) + JSON dosyaları (*.json);;Tüm dosyalar (*) - - Do not turn page using scroll - + + Save failed + Kaydetme başarısız oldu - - Use single scroll step to turn page - + + Could not open file for writing: +%1 + Dosya yazmak için açılamadı: +%1 - - Mouse mode - + + Load theme + Temayı yükle - - Only Back/Forward buttons can turn pages - + + + + Load failed + Yükleme başarısız oldu - - Use the Left/Right buttons to turn pages. - + + Could not open file: +%1 + Dosya açılamadı: +%1 - - Click left or right half of the screen to turn pages. - + + Invalid JSON: +%1 + Geçersiz JSON: +%1 - - Disable mouse over activation - Etkinleştirme üzerinde fareyi devre dışı bırak + + Expected a JSON object. + Bir JSON nesnesi bekleniyordu. + + + TitleHeader - - Fit options - Sığdırma seçenekleri + + SEARCH + ARA + + + UpdateLibraryDialog - - Enlarge images to fit width/height - Genişliğe/yüksekliği sığmaları için resimleri genişlet + + Updating.... + Güncelleniyor... - - Double Page options - Çift Sayfa seçenekleri + + Cancel + Vazgeç - - Show covers as single page - Kapakları tek sayfa olarak göster + + Update library + Kütüphaneyi güncelle - QObject + Viewer - - 7z lib not found - 7z lib bulunamadı + + + Press 'O' to open comic. + 'O'ya basarak aç. - - unable to load 7z lib from ./utils - ./utils içinden 7z lib yüklenemedi + + Cover! + Kapak! - - Trace - İz + + Comic not found + Çizgi roman bulunamadı - - Debug - Hata ayıkla + + Not found + Bulunamadı - - Info - Bilgi + + Last page! + Son sayfa! - - Warning - Uyarı + + Loading...please wait! + Yükleniyor... lütfen bekleyin! - - Error - Hata + + Error opening comic + Çizgi roman açılırken hata - - Fatal - Ölümcül + + CRC Error + CRC Hatası - - Select custom cover - + + Page not available! + Sayfa bulunamadı! + + + VolumeComicsModel - - Images (%1) - + + title + başlık - QsLogging::LogWindowModel + VolumesModel - - Time - Süre + + year + yıl - - Level - Düzey + + issues + sayı - - Message - Mesaj + + publisher + yayıncı - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - &Duraklat + + Presets: + Hazırlayan: - - &Resume - &Sürdür + + Classic look + Klasik görünüm - - Save log - Günlük kaydet + + Stripe look + Şerit görünüm - - Log file (*.log) - Günlük dosyası (*.log) + + Overlapped Stripe look + Çakışan şerit görünüm - - - ShortcutsDialog - Close - Kapat + + Modern look + Modern görünüm - YACReader keyboard shortcuts - YACReader klavye kısayolları + + Roulette look + Rulet görünüm - Keyboard Shortcuts - Klavye Kısayolları + + Show advanced settings + Daha fazla ayar göster - - - Viewer - - - Press 'O' to open comic. - 'O'ya basarak aç. + + Custom: + Kişisel: - - Cover! - Kapak! + + View angle + Bakış açısı - - Comic not found - Çizgi roman bulunamadı + + Position + Pozisyon - - Not found - Bulunamadı + + Cover gap + Kapak boşluğu - - Last page! - Son sayfa! + + Central gap + Boş merkaz - - Loading...please wait! - Yükleniyor... lütfen bekleyin! + + Zoom + Yakınlaş - - Error opening comic - Çizgi roman açılırken hata + + Y offset + Y dengesi - - CRC Error - CRC Hatası + + Z offset + Z dengesi - - Page not available! - Sayfa bulunamadı! + + Cover Angle + Kapak Açısı + + + + Visibility + Görünülebilirlik + + + + Light + Işık + + + + Max angle + Maksimum açı + + + + Low Performance + Düşük Performans + + + + High Performance + Yüksek performans + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + VSync kullan + + + + Performance: + Performans: YACReader::MainWindowViewer - + &Open - &Aç + &Aç - + Open a comic - Çizgi romanı aç + Çizgi romanı aç - + New instance - Yeni örnek + Yeni örnek - + Open Folder - Dosyayı Aç + Dosyayı Aç - + Open image folder - Resim dosyasınıaç + Resim dosyasınıaç - + Open latest comic - En son çizgi romanı aç + En son çizgi romanı aç - + Open the latest comic opened in the previous reading session - Önceki okuma oturumunda açılan en son çizgi romanı aç + Önceki okuma oturumunda açılan en son çizgi romanı aç - + Clear - Temizle + Temizle - + Clear open recent list - Son açılanlar listesini temizle + Son açılanlar listesini temizle - + Save - Kaydet + Kaydet - + Save current page - Geçerli sayfayı kaydet + Geçerli sayfayı kaydet Previous Comic - Önce ki çizgi roman + Önce ki çizgi roman - - - + + + Open previous comic - Önceki çizgi romanı aç + Önceki çizgi romanı aç - + Next Comic - Sırada ki çizgi roman + Sırada ki çizgi roman - - - + + + Open next comic - Sıradaki çizgi romanı aç + Sıradaki çizgi romanı aç - + &Previous - &Geri + &Geri - - - + + + Go to previous page - Önceki sayfaya dön + Önceki sayfaya dön - + &Next - &İleri + &İleri - - - + + + Go to next page - Sonra ki sayfaya geç + Sonra ki sayfaya geç - + Fit Height - Yüksekliğe Sığdır + Yüksekliğe Sığdır - + Fit image to height - Uygun yüksekliğe getir + Uygun yüksekliğe getir - + Fit Width - Uygun Genişlik + Uygun Genişlik - + Fit image to width - Görüntüyü sığdır + Görüntüyü sığdır - + Show full size - Tam erken + Tam erken - + Fit to page - Sayfaya sığdır + Sayfaya sığdır + + + + Continuous scroll + Sürekli kaydırma + + + + Switch to continuous scroll mode + Sürekli kaydırma moduna geç - + Reset zoom - Yakınlaştırmayı sıfırla + Yakınlaştırmayı sıfırla - + Show zoom slider - Yakınlaştırma çubuğunu göster + Yakınlaştırma çubuğunu göster - + Zoom+ - Yakınlaştır + Yakınlaştır - + Zoom- - Uzaklaştır + Uzaklaştır - + Rotate image to the left - Sayfayı sola yatır + Sayfayı sola yatır - + Rotate image to the right - Sayfayı sağa yator + Sayfayı sağa yator - + Double page mode - Çift sayfa modu + Çift sayfa modu - + Switch to double page mode - Çift sayfa moduna geç + Çift sayfa moduna geç - + Double page manga mode - Çift sayfa manga kipi + Çift sayfa manga kipi - + Reverse reading order in double page mode - Çift sayfa kipinde ters okuma sırası + Çift sayfa kipinde ters okuma sırası - + Go To - Git + Git - + Go to page ... - Sayfata git... + Sayfata git... - + Options - Ayarlar + Ayarlar - + YACReader options - YACReader ayarları + YACReader ayarları - - + + Help - Yardım + Yardım - + Help, About YACReader - YACReader hakkında yardım ve bilgi + YACReader hakkında yardım ve bilgi - + Magnifying glass - Büyüteç + Büyüteç - + Switch Magnifying glass - Büyüteç + Büyüteç - + Set bookmark - Yer imi yap + Yer imi yap - + Set a bookmark on the current page - Sayfayı yer imi olarak ayarla + Sayfayı yer imi olarak ayarla - + Show bookmarks - Yer imlerini göster + Yer imlerini göster - + Show the bookmarks of the current comic - Bu çizgi romanın yer imlerini göster + Bu çizgi romanın yer imlerini göster - + Show keyboard shortcuts - Klavye kısayollarını göster + Klavye kısayollarını göster - + Show Info - Bilgiyi göster + Bilgiyi göster - + Close - Kapat + Kapat - + Show Dictionary - Sözlüğü göster + Sözlüğü göster - + Show go to flow - Akışı göster + "Comic Flow'a git"i göster - + Edit shortcuts - Kısayolları düzenle + Kısayolları düzenle - + &File - &Dosya + &Dosya - - + + Open recent - Son dosyaları aç + Son dosyaları aç - + File - Dosya + Dosya - + Edit - Düzen + Düzen - + View - Görünüm + Görünüm - + Go - Git + Git - + Window - Pencere + Pencere - - - + + + Open Comic - Çizgi Romanı Aç + Çizgi Romanı Aç - - - + + + Comic files - Çizgi Roman Dosyaları + Çizgi Roman Dosyaları - + Open folder - Dosyayı aç + Dosyayı aç - + page_%1.jpg - sayfa_%1.jpg + sayfa_%1.jpg - + Image files (*.jpg) - Resim dosyaları (*.jpg) + Resim dosyaları (*.jpg) + Comics - Çizgi Roman + Çizgi Roman Toggle fullscreen mode - Tam ekran kipini aç/kapat + Tam ekran kipini aç/kapat Hide/show toolbar - Araç çubuğunu göster/gizle + Araç çubuğunu göster/gizle + General - Genel + Genel Size up magnifying glass - Büyüteci büyüt + Büyüteci büyüt Size down magnifying glass - Büyüteci küçült + Büyüteci küçült Zoom in magnifying glass - Büyüteci yakınlaştır + Büyüteci yakınlaştır Zoom out magnifying glass - Büyüteci uzaklaştır + Büyüteci uzaklaştır Reset magnifying glass - + Büyüteci sıfırla + Magnifiying glass - Büyüteç + Büyüteç Toggle between fit to width and fit to height - Genişliğe sığdır ile yüksekliğe sığdır arasında geçiş yap + Genişliğe sığdır ile yüksekliğe sığdır arasında geçiş yap + Page adjustement - Sayfa ayarı + Sayfa ayarı - + Autoscroll down - Otomatik aşağı kaydır + Otomatik aşağı kaydır - + Autoscroll up - Otomatik yukarı kaydır + Otomatik yukarı kaydır - + Autoscroll forward, horizontal first - Otomatik ileri kaydır, önce yatay + Otomatik ileri kaydır, önce yatay - + Autoscroll backward, horizontal first - Otomatik geri kaydır, önce yatay + Otomatik geri kaydır, önce yatay - + Autoscroll forward, vertical first - Otomatik ileri kaydır, önce dikey + Otomatik ileri kaydır, önce dikey - + Autoscroll backward, vertical first - Otomatik geri kaydır, önce dikey + Otomatik geri kaydır, önce dikey - + Move down - Aşağı git + Aşağı git - + Move up - Yukarı git + Yukarı git - + Move left - Sola git + Sola git - + Move right - Sağa git + Sağa git - + Go to the first page - İlk sayfaya git + İlk sayfaya git - + Go to the last page - En son sayfaya git + En son sayfaya git - + Offset double page to the left - + Çift sayfayı sola kaydır - + Offset double page to the right - + Çift sayfayı sağa kaydır - + + Reading - Okuma + Okuma - + There is a new version available - Yeni versiyon mevcut + Yeni versiyon mevcut - + Do you want to download the new version? - Yeni versiyonu indirmek ister misin ? + Yeni versiyonu indirmek ister misin ? - + Remind me in 14 days - 14 gün içinde hatırlat + 14 gün içinde hatırlat - + Not now - Şimdi değil + Şimdi değil + + + + YACReader::TrayIconController + + + &Restore + &Geri Yükle + + + + Systray + Sistem tepsisi + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary sistem tepsisinde çalışmaya devam edecektir. Programı sonlandırmak için sistem tepsisi simgesinin bağlam menüsünden <b>Çık</b>'ı seçin. YACReader::WhatsNewDialog - Close - Kapat + Kapat @@ -1411,172 +4113,152 @@ YACReaderFlowConfigWidget - CoverFlow look - Kapak akışı görünümü + Kapak akışı görünümü - How to show covers: - Kapaklar nasıl gözüksün: + Kapaklar nasıl gözüksün: - Stripe look - Şerit görünüm + Şerit görünüm - Overlapped Stripe look - Çakışan şerit görünüm + Çakışan şerit görünüm YACReaderGLFlowConfigWidget - Zoom - Yakınlaş + Yakınlaş - Light - Işık + Işık - Show advanced settings - Daha fazla ayar göster + Daha fazla ayar göster - Roulette look - Rulet görünüm + Rulet görünüm - Cover Angle - Kapak Açısı + Kapak Açısı - Stripe look - Strip görünüm + Strip görünüm - Position - Pozisyon + Pozisyon - Z offset - Z dengesi + Z dengesi - Y offset - Y dengesi + Y dengesi - Central gap - Boş merkaz + Boş merkaz - Presets: - Hazırlayan: + Hazırlayan: - Overlapped Stripe look - Çakışan şerit görünüm + Çakışan şerit görünüm - Modern look - Modern görünüm + Modern görünüm - View angle - Bakış açısı + Bakış açısı - Max angle - Maksimum açı + Maksimum açı - Custom: - Kişisel: + Kişisel: - Classic look - Klasik görünüm + Klasik görünüm - Cover gap - Kapak boşluğu + Kapak boşluğu - High Performance - Yüksek performans + Yüksek performans - Performance: - Performans: + Performans: - Use VSync (improve the image quality in fullscreen mode, worse performance) - VSync kullan + VSync kullan - Visibility - Görünülebilirlik + Görünülebilirlik - Low Performance - Düşük Performans + Düşük Performans YACReaderOptionsDialog - + Save Kaydet - Use hardware acceleration (restart needed) - Yüksek donanımlı kullan (yeniden başlatmak gerekli) + Yüksek donanımlı kullan (yeniden başlatmak gerekli) - + Cancel Vazgeç - + Edit shortcuts Kısayolları düzenle - + Shortcuts Kısayollar + + YACReaderSearchLineEdit + + + type to search + aramak için yazınız + + YACReaderSlider @@ -1588,23 +4270,23 @@ YACReaderTranslator - + YACReader translator YACReader çevirmeni - - + + Translation Çeviri - + clear temizle - + Service not available Servis kullanılamıyor diff --git a/YACReader/yacreader_zh_CN.ts b/YACReader/yacreader_zh_CN.ts index 713495301..e190f38cd 100644 --- a/YACReader/yacreader_zh_CN.ts +++ b/YACReader/yacreader_zh_CN.ts @@ -9,6 +9,196 @@ + + AddLabelDialog + + + Label name: + 标签名称: + + + + Choose a color: + 选择标签颜色: + + + + accept + 接受 + + + + cancel + 取消 + + + + AddLibraryDialog + + + Comics folder : + 漫画文件夹: + + + + Library name : + 库名: + + + + Add + 添加 + + + + Cancel + 取消 + + + + Add an existing library + 添加一个现有库 + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要拥有自己的API密钥才能够连接Comic Vine. 你可以通过这个链接获得一个免费的<a href="http://www.comicvine.com/api/">API</a>密钥 + + + + Paste here your Comic Vine API key + 在此粘贴你的Comic Vine API + + + + Accept + 接受 + + + + Cancel + 取消 + + + + AppearanceTabWidget + + + Color scheme + 配色方案 + + + + System + 系统 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 风俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 删除此用户导入的主题 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定义: + + + + Import theme... + 导入主题... + + + + Theme + 主题 + + + + Theme editor + 主题编辑器 + + + + Open Theme Editor... + 打开主题编辑器... + + + + Theme editor error + 主题编辑器错误 + + + + The current theme JSON could not be loaded. + 无法加载当前主题 JSON。 + + + + Import theme + 导入主题 + + + + JSON files (*.json);;All files (*) + JSON 文件 (*.json);;所有文件 (*) + + + + Could not import theme from: +%1 + 无法从以下位置导入主题: +%1 + + + + Could not import theme from: +%1 + +%2 + 无法从以下位置导入主题: +%1 + +%2 + + + + Import failed + 导入失败 + + BookmarksDialog @@ -33,10 +223,204 @@ 尾页 + + ClassicComicsView + + + Hide comic flow + 隐藏 Comic Flow + + + + ComicModel + + + yes + + + + + no + + + + + Title + 标题 + + + + File Name + 文件名 + + + + Pages + 页数 + + + + Size + 大小 + + + + Read + 阅读 + + + + Current Page + 当前页 + + + + Publication Date + 出版日期 + + + + Rating + 评分 + + + + Series + 系列 + + + + Volume + + + + + Story Arc + 故事线 + + + + ComicVineDialog + + + skip + 忽略 + + + + back + 返回 + + + + next + 下一步 + + + + search + 搜索 + + + + close + 关闭 + + + + + comic %1 of %2 - %3 + 第 %1 本 共 %2 本 - %3 + + + + + + Looking for volume... + 搜索卷... + + + + %1 comics selected + 已选择 %1 本漫画 + + + + Error connecting to ComicVine + ComicVine 连接时出错 + + + + + Retrieving tags for : %1 + 正在检索标签: %1 + + + + Retrieving volume info... + 正在接收卷信息... + + + + Looking for comic... + 搜索漫画中... + + + + ContinuousPageWidget + + + Loading page %1 + 正在加载页面 %1 + + + + CreateLibraryDialog + + + Comics folder : + 漫画文件夹: + + + + Library Name : + 库名: + + + + Create + 创建 + + + + Cancel + 取消 + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + 创建一个新的库可能需要几分钟时间,您可以先停止该进程,稍后可以通过更新库选项来更新数据。 + + + + Create new library + 创建新的漫画库 + + + + Path not found + 未找到路径 + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + 所选路径不存在或不是有效路径. 确保您具有此文件夹的写入权限 + + EditShortcutsDialog - + Shortcut in use 快捷键被占用 @@ -51,9 +435,9 @@ 快捷键设置 - - The shortcut "%1" is already assigned to other function - 快捷键 "%1" 已被映射至其他功能 + + The shortcut "%1" is already assigned to other function + 快捷键 "%1" 已被映射至其他功能 @@ -61,6 +445,124 @@ 更改快捷键: 双击按键组合并输入新的映射. + + EmptyFolderWidget + + + This folder doesn't contain comics yet + 该文件夹还没有漫画 + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + 此标签尚未包含漫画 + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + 此阅读列表尚未包含任何漫画 + + + + EmptySpecialListWidget + + + No favorites + 没有收藏 + + + + You are not reading anything yet, come on!! + 你还没有阅读任何东西,加油!! + + + + There are no recent comics! + 没有最近的漫画! + + + + ExportComicsInfoDialog + + + Output file : + 输出文件: + + + + Create + 创建 + + + + Cancel + 取消 + + + + Export comics info + 导出漫画信息 + + + + Destination database name + 目标数据库名称 + + + + Problem found while writing + 写入时出现问题 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 选定的输出文件路径不存在或路径无效. 确保您具有此文件夹的写入权限 + + + + ExportLibraryDialog + + + Output folder : + 输出文件夹: + + + + Create + 创建 + + + + Cancel + 取消 + + + + Create covers package + 创建封面包 + + + + Problem found while writing + 写入时出现问题 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 选定的输出文件路径不存在或路径无效. 确保您具有此文件夹的写入权限 + + + + Destination directory + 目标目录 + + FileComic @@ -116,450 +618,2621 @@ GoToFlowToolBar - + Page : 页码 : + + GridComicsView + + + Show info + 显示信息 + + HelpAboutDialog - + Help 帮助 - + About 关于 - + System info 系统信息 - LogWindow + ImportComicsInfoDialog - - &Copy - 复制(&C) + + Import comics info + 导入漫画信息 - - &Save - 保存(&S) + + Info database location : + 数据库地址: - - &Pause - 中止(&P) + + Import + 导入 - - C&lear - 清空(&l) + + Cancel + 取消 - - Level: - 等级: + + Comics info file (*.ydb) + 漫画信息文件(*.ydb) + + + + ImportLibraryDialog + + + Library Name : + 库名: - - &Auto scroll - 自动滚动(&A) + + Package location : + 打包地址: - - Log window - 日志窗口 + + Destination folder : + 目标文件夹: - - - OptionsDialog - - Gamma - Gamma值 + + Unpack + 解压 - - Reset - 重置 + + Cancel + 取消 + + + + Extract a catalog + 提取目录 + + + + Compresed library covers (*.clc) + 已压缩的库封面 (*.clc) + + + + ImportWidget + + + stop + 停止 + + + + Some of the comics being added... + 正在添加漫画... + + + + Importing comics + 正在导入漫画 + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary现在正在创建一个新库。</p><p>这可能需要几分钟时间,您可以先停止该进程,稍后可以通过更新库选项来更新数据。</p> + + + + Updating the library + 正在更新库 + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>正在更新当前库。要获得更快的更新,请经常更新您的库。</p><p>您可以停止该进程,稍后继续更新操作。</p> + + + + Upgrading the library + 正在更新库 + + + + <p>The current library is being upgraded, please wait.</p> + <p>正在更新当前漫画库, 请稍候.</p> + + + + Scanning the library + 正在扫描库 + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>正在扫描当前库的旧版 XML metadata 信息。</p><p>这只需要执行一次,且只有当创建库的 YACReaderLibrary 版本低于 9.8.2 时。</p> + + + + LibraryWindow + + + YACReader Library + YACReader 库 + + + + + + comic + 漫画 + + + + + + manga + 日本漫画 + + + + + + western manga (left to right) + 欧美漫画(从左到右) + + + + + + web comic + 网络漫画 + + + + + + 4koma (top to botom) + 四格漫画(从上到下) + + + + + + + Set type + 设置类型 + + + + Library + + + + + Folder + 文件夹 + + + + Comic + 漫画 + + + + Upgrade failed + 更新失败 + + + + There were errors during library upgrade in: + 漫画库更新时出现错误: + + + + Update needed + 需要更新 + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + 此库是使用旧版本的YACReaderLibrary创建的. 它需要更新. 现在更新? + + + + Download new version + 下载新版本 + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + 此库是使用较新版本的YACReaderLibrary创建的。 立即下载新版本? + + + + Library not available + 库不可用 + + + + Library '%1' is no longer available. Do you want to remove it? + 库 '%1' 不再可用。 你想删除它吗? + + + + Old library + 旧的库 + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 库 '%1' 是通过旧版本的YACReaderLibrary创建的。 必须再次创建。 你想现在创建吗? + + + + + Copying comics... + 复制漫画中... + + + + + Moving comics... + 移动漫画中... + + + + Add new folder + 添加新的文件夹 + + + + Folder name: + 文件夹名称: + + + + No folder selected + 没有选中的文件夹 + + + + Please, select a folder first + 请先选择一个文件夹 + + + + Error in path + 路径错误 + + + + There was an error accessing the folder's path + 访问文件夹的路径时出错 + + + + Delete folder + 删除文件夹 + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + 所选文件夹及其所有内容将从磁盘中删除。 你确定吗? + + + + + Unable to delete + 无法删除 + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + 尝试删除所选文件夹时出现问题。 请检查写入权限,并确保没有其他应用程序在使用这些文件夹或文件。 + + + + Add new reading lists + 添加新的阅读列表 + + + + + List name: + 列表名称: + + + + Delete list/label + 删除 列表/标签 + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + 所选项目将被删除,您的漫画或文件夹将不会从您的磁盘中删除。 你确定吗? + + + + Rename list name + 重命名列表 + + + + Open folder... + 打开文件夹... + + + + Update folder + 更新文件夹 + + + + Rescan library for XML info + 重新扫描库的 XML 信息 + + + + Set as uncompleted + 设为未完成 + + + + Set as completed + 设为已完成 + + + + Set as read + 设为已读 + + + + + Set as unread + 设为未读 + + + + Set custom cover + 设置自定义封面 + + + + Delete custom cover + 删除自定义封面 + + + + Save covers + 保存封面 + + + + You are adding too many libraries. + 您添加的库太多了。 + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + 您添加的库太多了。 + +一般情况只需要一个顶级的库,您可以使用左侧边栏中的文件夹功能来进行分类管理。 + +YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低的库数量来提升性能。 + + + + + YACReader not found + YACReader 未找到 + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + 未找到YACReader. YACReader应安装在与YACReaderLibrary相同的文件夹中. + + + + YACReader not found. There might be a problem with your YACReader installation. + 未找到YACReader. YACReader的安装可能有问题. + + + + Error + 错误 + + + + Error opening comic with third party reader. + 使用第三方阅读器打开漫画时出错。 + + + + Library not found + 未找到库 + + + + The selected folder doesn't contain any library. + 所选文件夹不包含任何库。 + + + + Are you sure? + 你确定吗? + + + + Do you want remove + 你想要删除 + + + + library? + 库? + + + + Remove and delete metadata + 移除并删除元数据 + + + + Library info + 图书馆信息 + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + 尝试删除所选漫画时出现问题。 请检查所选文件或包含文件夹中的写入权限。 + + + + Assign comics numbers + 分配漫画编号 + + + + Assign numbers starting in: + 从以下位置开始分配编号: + + + + Invalid image + 图片无效 + + + + The selected file is not a valid image. + 所选文件不是有效图像。 + + + + Error saving cover + 保存封面时出错 + + + + There was an error saving the cover image. + 保存封面图像时出错。 + + + + Error creating the library + 创建库时出错 + + + + Error updating the library + 更新库时出错 + + + + Error opening the library + 打开库时出错 + + + + Delete comics + 删除漫画 + + + + All the selected comics will be deleted from your disk. Are you sure? + 所有选定的漫画都将从您的磁盘中删除。你确定吗? + + + + Remove comics + 移除漫画 + + + + Comics will only be deleted from the current label/list. Are you sure? + 漫画只会从当前标签/列表中删除。 你确定吗? + + + + Library name already exists + 库名已存在 + + + + There is another library with the name '%1'. + 已存在另一个名为'%1'的库。 + + + + LibraryWindowActions + + + Create a new library + 创建一个新的库 + + + + Open an existing library + 打开现有的库 + + + + + Export comics info + 导出漫画信息 + + + + + Import comics info + 导入漫画信息 + + + + Pack covers + 打包封面 + + + + Pack the covers of the selected library + 打包所选库的封面 + + + + Unpack covers + 解压封面 + + + + Unpack a catalog + 解压目录 + + + + Update library + 更新库 + + + + Update current library + 更新当前库 + + + + Rename library + 重命名库 + + + + Rename current library + 重命名当前库 + + + + Remove library + 移除库 + + + + Remove current library from your collection + 从您的集合中移除当前库 + + + + Rescan library for XML info + 重新扫描库的 XML 信息 + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + 尝试查找漫画文件内嵌的 XML 信息。只有当创建库的 YACReaderLibrary 版本低于 9.8.2 或者使用第三方软件嵌入 XML 信息时,才需要执行该操作。 + + + + Show library info + 显示图书馆信息 + + + + Show information about the current library + 显示当前库的信息 + + + + Open current comic + 打开当前漫画 + + + + Open current comic on YACReader + 用YACReader打开漫画 + + + + Save selected covers to... + 选中的封面保存到... + + + + Save covers of the selected comics as JPG files + 保存所选的封面为jpg + + + + + Set as read + 设为已读 + + + + Set comic as read + 漫画设为已读 + + + + + Set as unread + 设为未读 + + + + Set comic as unread + 漫画设为未读 + + + + + manga + 日本漫画 + + + + Set issue as manga + 将问题设置为漫画 + + + + + comic + 漫画 + + + + Set issue as normal + 设置漫画为 + + + + western manga + 欧美漫画 + + + + Set issue as western manga + 设置为欧美漫画 + + + + + web comic + 网络漫画 + + + + Set issue as web comic + 设置为网络漫画 + + + + + yonkoma + 四格漫画 + + + + Set issue as yonkoma + 设置为四格漫画 + + + + Show/Hide marks + 显示/隐藏标记 + + + + Show or hide read marks + 显示或隐藏阅读标记 + + + + Show/Hide recent indicator + 显示/隐藏最近的指示标志 + + + + Show or hide recent indicator + 显示或隐藏最近的指示标志 + + + + + Fullscreen mode on/off + 全屏模式 开/关 + + + + Help, About YACReader + 帮助, 关于 YACReader + + + + Add new folder + 添加新的文件夹 + + + + Add new folder to the current library + 在当前库下添加新的文件夹 + + + + Delete folder + 删除文件夹 + + + + Delete current folder from disk + 从磁盘上删除当前文件夹 + + + + Select root node + 选择根节点 + + + + Expand all nodes + 展开所有节点 + + + + Collapse all nodes + 折叠所有节点 + + + + Show options dialog + 显示选项对话框 + + + + Show comics server options dialog + 显示漫画服务器选项对话框 + + + + + Change between comics views + 漫画视图之间的变化 + + + + Open folder... + 打开文件夹... + + + + Set as uncompleted + 设为未完成 + + + + Set as completed + 设为已完成 + + + + Set custom cover + 设置自定义封面 + + + + Delete custom cover + 删除自定义封面 + + + + western manga (left to right) + 欧美漫画(从左到右) + + + + Open containing folder... + 打开包含文件夹... + + + + Reset comic rating + 重置漫画评分 + + + + Select all comics + 全选漫画 + + + + Edit + 编辑 + + + + Assign current order to comics + 将当前序号分配给漫画 + + + + Update cover + 更新封面 + + + + Delete selected comics + 删除所选的漫画 + + + + Delete metadata from selected comics + 从选定的漫画中删除元数据 + + + + Download tags from Comic Vine + 从 Comic Vine 下载标签 + + + + Focus search line + 聚焦于搜索行 + + + + Focus comics view + 聚焦于漫画视图 + + + + Edit shortcuts + 编辑快捷键 + + + + &Quit + 退出(&Q) + + + + Update folder + 更新文件夹 + + + + Update current folder + 更新当前文件夹 + + + + Scan legacy XML metadata + 扫描旧版 XML 元数据 + + + + Add new reading list + 添加新的阅读列表 + + + + Add a new reading list to the current library + 在当前库添加新的阅读列表 + + + + Remove reading list + 移除阅读列表 + + + + Remove current reading list from the library + 从当前库移除阅读列表 + + + + Add new label + 添加新标签 + + + + Add a new label to this library + 在当前库添加标签 + + + + Rename selected list + 重命名列表 + + + + Rename any selected labels or lists + 重命名任何选定的标签或列表 + + + + Add to... + 添加到... + + + + Favorites + 收藏夹 + + + + Add selected comics to favorites list + 将所选漫画添加到收藏夹列表 + + + + LocalComicListModel + + + file name + 文件名 + + + + LogWindow + + &Copy + 复制(&C) + + + &Save + 保存(&S) + + + &Pause + 中止(&P) + + + C&lear + 清空(&l) + + + Level: + 等级: + + + &Auto scroll + 自动滚动(&A) + + + Log window + 日志窗口 + + + + NoLibrariesWidget + + + You don't have any libraries yet + 你还没有库 + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>您可以在任何文件夹中创建库,YACReaderLibrary将导入此文件夹中的所有漫画和文件夹。如果已有库,则可以打开它们。</p><p>您可以把YACReader当成独立应用来阅读电脑上的漫画。</p> + + + + create your first library + 创建你的第一个库 + + + + add an existing one + 添加一个现有库 + + + + NoSearchResultsWidget + + + No results + 没有结果 + + + + OptionsDialog + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Enlarge images to fit width/height + 放大图片以适应宽度/高度 + + + + Disable scroll animations and smooth scrolling + 禁用滚动动画和平滑滚动 + + + + Use single scroll step to turn page + 使用单滚动步骤翻页 + + + + My comics path + 我的漫画路径 + + + + Image adjustment + 图像调整 + + + + "Go to flow" size + “转到 Comic Flow”大小 + + + + Choose + 选择 + + + + Show covers as single page + 显示封面为单页 + + + + Do not turn page using scroll + 滚动时不翻页 + + + + Fit options + 适应项 + + + + Image options + 图片选项 + + + + Display + 展示 + + + + Show time in current page information label + 在当前页面信息标签中显示时间 + + + + Mouse mode + 鼠标模式 + + + + Only Back/Forward buttons can turn pages + 只有后退/前进按钮可以翻页 + + + + Use the Left/Right buttons to turn pages. + 使用向左/向右按钮翻页。 + + + + Click left or right half of the screen to turn pages. + 单击屏幕的左半部分或右半部分即可翻页。 + + + + Contrast + 对比度 + + + + + Libraries + + + + + Comic Flow + Comic Flow + + + + Grid view + 网格视图 + + + + + Appearance + 外貌 + + + + + Options + 选项 + + + + + Language + 语言 + + + + + Application language + 应用程序语言 + + + + + System default + 系统默认 + + + + Tray icon settings (experimental) + 托盘图标设置 (实验特性) + + + + Close to tray + 关闭至托盘 + + + + Start into the system tray + 启动至系统托盘 + + + + Edit Comic Vine API key + 编辑Comic Vine API 密匙 + + + + Comic Vine API key + Comic Vine API 密匙 + + + + ComicInfo.xml legacy support + ComicInfo.xml 旧版支持 + + + + Import metadata from ComicInfo.xml when adding new comics + 添加新漫画时从 ComicInfo.xml 导入元数据 + + + + Consider 'recent' items added or updated since X days ago + 参考自 X 天前添加或更新的“最近”项目 + + + + Third party reader + 第三方阅读器 + + + + Write {comic_file_path} where the path should go in the command + 在命令中应将路径写入 {comic_file_path} + + + + + Clear + 清空 + + + + Update libraries at startup + 启动时更新库 + + + + Try to detect changes automatically + 尝试自动检测变化 + + + + Update libraries periodically + 定期更新库 + + + + Interval: + 间隔: + + + + 30 minutes + 30分钟 + + + + 1 hour + 1小时 + + + + 2 hours + 2小时 + + + + 4 hours + 4小时 + + + + 8 hours + 8小时 + + + + 12 hours + 12小时 + + + + daily + 每天 + + + + Update libraries at certain time + 定时更新库 + + + + Time: + 时间: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + 警告! 在库更新期间,将禁用对数据库的写入! +当您可能正在积极使用该应用程序时,请勿安排更新。 +在自动更新期间,应用程序将阻止某些操作,直到更新完成。 +要停止自动更新,请点击库标题旁边的加载指示器。 + + + + Modifications detection + 修改检测 + + + + Compare the modified date of files when updating a library (not recommended) + 更新库时比较文件的修改日期(不推荐) + + + + Enable background image + 启用背景图片 + + + + Opacity level + 透明度 + + + + Blur level + 模糊 + + + + Use selected comic cover as background + 使用选定的漫画封面做背景 + + + + Restore defautls + 恢复默认值 + + + + Background + 背景 + + + + Display continue reading banner + 显示继续阅读横幅 + + + + Display current comic banner + 显示当前漫画横幅 + + + + Continue reading + 继续阅读 + + + + Comics directory + 漫画目录 + + + + Quick Navigation Mode + 快速导航模式 + + + + Background color + 背景颜色 + + + + Double Page options + 双页选项 + + + + Scroll behaviour + 滚动效果 + + + + Disable mouse over activation + 禁用鼠标激活 + + + + Scaling + 缩放 + + + + Scaling method + 缩放方法 + + + + Nearest (fast, low quality) + 最近(快速,低质量) + + + + Bilinear + 双线性 + + + + Lanczos (better quality) + Lanczos(质量更好) + + + + Page Flow + 页面流 + + + + + General + 常规 + + + + Brightness + 亮度 + + + + + Restart is needed + 需要重启 + + + + PropertiesDialog + + + General info + 基本信息 + + + + Plot + 情节 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Notes + 笔记 + + + + Cover page + 封面 + + + + Load previous page as cover + 加载上一页作为封面 + + + + Load next page as cover + 加载下一页作为封面 + + + + Reset cover to the default image + 将封面重置为默认图像 + + + + Load custom cover image + 加载自定义封面图片 + + + + Series: + 系列: + + + + Title: + 标题: + + + + + + of: + 的: + + + + Issue number: + 发行刊号: + + + + Volume: + 卷: + + + + Arc number: + 世界线数量: + + + + Story arc: + 故事线: + + + + alt. number: + 备选编号: + + + + Alternate series: + 备用系列: + + + + Series Group: + 系列组: + + + + Genre: + 类型: + + + + Size: + 大小: + + + + Writer(s): + 作者: + + + + Penciller(s): + 线稿师: + + + + Inker(s): + 上墨师: + + + + Colorist(s): + 上色师: + + + + Letterer(s): + 嵌字师: + + + + Cover Artist(s): + 封面设计: + + + + Editor(s): + 编辑: + + + + Imprint: + 印记: + + + + Day: + 日: + + + + Month: + 月: + + + + Year: + 年: + + + + Publisher: + 出版商: + + + + Format: + 格式: + + + + Color/BW: + 彩色/黑白: + + + + Age rating: + 年龄分级: + + + + Type: + 类型: + + + + Language (ISO): + 语言(ISO): + + + + Synopsis: + 简介: + + + + Characters: + 角色: + + + + Teams: + 团队: + + + + Locations: + 地点: + + + + Main character or team: + 主要角色或团队: + + + + Review: + 审查: + + + + Notes: + 笔记: + + + + Tags: + 标签: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 连接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + + + + Not found + 未找到 + + + + Comic not found. You should update your library. + 未找到漫画,请先更新您的库. + + + + Edit comic information + 编辑漫画信息 + + + + Edit selected comics information + 编辑选中的漫画信息 + + + + Invalid cover + 封面无效 + + + + The image is invalid. + 该图像无效。 + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的无头(无 GUI)版本。 + +此应用程序支持持久设置,要设置它们,请编辑此文件 %1 +要了解可用设置,请查看文档:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Info + 信息 + + + + Debug + 除错 + + + + Fatal + 严重错误 + + + + Error + 错误 + + + + Trace + 追踪 + + + + 7z lib not found + 未找到 7z 库文件 + + + + unable to load 7z lib from ./utils + 无法从 ./utils 载入 7z 库文件 + + + + Warning + 警告 + + + + Select custom cover + 选择自定义封面 + + + + Images (%1) + 图片 (%1) + + + + The file could not be read or is not valid JSON. + 无法读取该文件或者该文件不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主题适用于 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 文件夹 + + + + Reading Lists + 阅读列表 + + + + QsLogging::LogWindowModel + + Time + 时间 + + + Level + 等级 + + + Message + 信息 + + + + QsLogging::Window + + &Pause + 中止(&P) + + + Save log + 保存日志 + + + &Resume + 恢复(&R) + + + Log file (*.log) + 日志文件 (*.log) + + + + RenameLibraryDialog + + + New Library Name : + 新库名: + + + + Rename + 重命名 + + + + Cancel + 取消 + + + + Rename current library + 重命名当前库 + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + 搜索结果: %1 + + + + + page %1 of %2 + 第 %1 页 共 %2 页 + + + + Number of %1 found : %2 + 第 %1 页 共: %2 条 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + 请提供附加信息. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精确匹配搜索。如果您想要查找与名称中某些单词匹配的卷,请禁用。 + + + + SearchVolume + + + Please provide some additional information. + 请提供附加信息. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精确匹配搜索。如果您想要查找与名称中某些单词匹配的卷,请禁用。 + + + + SelectComic + + + Please, select the right comic info. + 请正确选择漫画信息. + + + + comics + 漫画 + + + + loading cover + 加载封面 + + + + loading description + 加载描述 + + + + comic description unavailable + 漫画描述不可用 + + + + SelectVolume + + + Please, select the right series for your comic. + 请选择正确的漫画系列。 + + + + Filter: + 筛选: + + + + volumes + + + + + Nothing found, clear the filter if any. + 未找到任何内容,如果有,请清除筛选器。 + + + + loading cover + 加载封面 + + + + loading description + 加载描述 + + + + volume description unavailable + 卷描述不可用 + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + 您正在尝试同时获取各种漫画的信息,它们是同一系列的吗? + + + + yes + + + + + no + + + + + ServerConfigDialog + + + set port + 设置端口 + + + + Server connectivity information + 服务器连接信息 + + + + Scan it! + 扫一扫! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 适用于 iOS 和 Android 设备。<br/>搜索 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + 选择IP地址 + + + + Port + 端口 + + + + enable the server + 启用服务器 + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + 请在左侧对漫画列表进行排序,直到它与漫画的信息相符。 + + + + sort comics to match comic information + 排序漫画以匹配漫画信息 + + + + issues + 发行 + + + + remove selected comics + 移除所选漫画 + + + + restore all removed comics + 恢复所有移除的漫画 + + + + ThemeEditorDialog + + + Theme Editor + 主题编辑器 + + + + + + + + + + + - + - + + + + i + + + + + Expand all + 全部展开 + + + + Collapse all + 全部折叠 + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中闪烁所选值(洋红色/切换/0↔10)。发布后恢复原样。 + + + + Search… + 搜索… + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + ID: + ID: + + + + Display name: + 显示名称: + + + + Variant: + 变体: + + + + Theme info + 主题信息 + + + + Parameter + 范围 + + + + Value + 价值 + + + + Save and apply + 保存并应用 + + + + Export to file... + 导出到文件... + + + + Load from file... + 从文件加载... + + + + Close + 关闭 - - Enlarge images to fit width/height - 放大图片以适应宽度/高度 + + Double-click to edit color + 双击编辑颜色 - - Disable scroll animations and smooth scrolling - 禁用滚动动画和平滑滚动 + + + + + + + true + 真的 - - Use single scroll step to turn page - 使用单滚动步骤翻页 + + + + + false + 错误的 - - My comics path - 我的漫画路径 + + Double-click to toggle + 双击切换 - - Image adjustment - 图像调整 + + Double-click to edit value + 双击编辑值 - - "Go to flow" size - 页面流尺寸 + + + + Edit: %1 + 编辑:%1 - - Choose - 选择 + + Save theme + 保存主题 - - Show covers as single page - 显示封面为单页 + + + JSON files (*.json);;All files (*) + JSON 文件 (*.json);;所有文件 (*) - - Do not turn page using scroll - 滚动时不翻页 + + Save failed + 保存失败 - - Fit options - 适应项 + + Could not open file for writing: +%1 + 无法打开文件进行写入: +%1 - - Image options - 图片选项 + + Load theme + 加载主题 - - Display - + + + + Load failed + 加载失败 - - Show time in current page information label - + + Could not open file: +%1 + 无法打开文件: +%1 - - Mouse mode - + + Invalid JSON: +%1 + 无效的 JSON: +%1 - - Only Back/Forward buttons can turn pages - + + Expected a JSON object. + 需要一个 JSON 对象。 + + + TitleHeader - - Use the Left/Right buttons to turn pages. - + + SEARCH + 搜索 + + + UpdateLibraryDialog - - Click left or right half of the screen to turn pages. - + + Updating.... + 更新中... - - Contrast - 对比度 + + Cancel + 取消 - - Options - 选项 + + Update library + 更新库 + + + Viewer - - Comics directory - 漫画目录 + + Page not available! + 页面不可用! - - Quick Navigation Mode - 快速导航模式 + + + Press 'O' to open comic. + 按下 'O' 以打开漫画. - - Background color - 背景颜色 + + Error opening comic + 打开漫画时发生错误 - - Double Page options - 双页选项 + + Cover! + 封面! - - Scroll behaviour - 滚动效果 + + CRC Error + CRC 校验失败 - - Disable mouse over activation - 禁用鼠标激活 + + Comic not found + 未找到漫画 - - Page Flow - 页面流 + + Not found + 未找到 - - General - 常规 + + Last page! + 尾页! - - Brightness - 亮度 + + Loading...please wait! + 载入中... 请稍候! + + + VolumeComicsModel - - Restart is needed - 需要重启 + + title + 标题 - QObject + VolumesModel - - Info - 信息 + + year + - - Debug - 除错 + + issues + 发行 - - Fatal - 严重错误 + + publisher + 出版者 + + + YACReader3DFlowConfigWidget - - Error - 错误 + + Presets: + 预设: - - Trace - 追踪 + + Classic look + 经典 - - 7z lib not found - 未找到 7z 库文件 + + Stripe look + 条状 - - unable to load 7z lib from ./utils - 无法从 ./utils 载入 7z 库文件 + + Overlapped Stripe look + 重叠条状 - - Warning - 警告 + + Modern look + 现代 - - Select custom cover - + + Roulette look + 轮盘 - - Images (%1) - + + Show advanced settings + 显示高级选项 - - - QsLogging::LogWindowModel - - Time - 时间 + + Custom: + 自定义: - - Level - 等级 + + View angle + 视角 - - Message - 信息 + + Position + 位置 - - - QsLogging::Window - - &Pause - 中止(&P) + + Cover gap + 封面间距 - - Save log - 保存日志 + + Central gap + 中心间距 - - &Resume - 恢复(&R) + + Zoom + 缩放 - - Log file (*.log) - 日志文件 (*.log) + + Y offset + Y位移 - - - Viewer - - Page not available! - 页面不可用! + + Z offset + Z位移 - - - Press 'O' to open comic. - 按下 'O' 以打开漫画. + + Cover Angle + 封面角度 - - Error opening comic - 打开漫画时发生错误 + + Visibility + 透明度 - - Cover! - 封面! + + Light + 亮度 - - CRC Error - CRC 校验失败 + + Max angle + 最大角度 - - Comic not found - 未找到漫画 + + Low Performance + 低性能 - - Not found - 未找到 + + High Performance + 高性能 - - Last page! - 尾页! + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高图像质量, 性能更差) - - Loading...please wait! - 载入中... 请稍候! + + Performance: + 性能: YACReader::MainWindowViewer - + Go 转到 - + Edit 编辑 - + File 文件 - - + + Help 帮助 - + Save 保存 - + View 查看 - + &File 文件(&F) - + &Next 下一页(&N) - + &Open 打开(&O) - + Clear 清空 - + Close 关闭 - - - + + + Open Comic 打开漫画 - + Go To 跳转 - + Zoom+ 放大 - + Zoom- 缩小 - + Open image folder 打开图片文件夹 @@ -574,43 +3247,43 @@ 减小缩放级别 - + New instance 新建实例 - + Open latest comic 打开最近的漫画 - + Autoscroll up 向上自动滚动 - + Set bookmark 设置书签 - + page_%1.jpg - page_%1.jpg + 页_%1.jpg - + Autoscroll forward, vertical first 向前自动滚动,垂直优先 - + Switch to double page mode 切换至双页模式 - + Save current page 保存当前页面 @@ -620,126 +3293,128 @@ 增大放大镜尺寸 - + Double page mode 双页模式 - + Move up 向上移动 - + Switch Magnifying glass 切换放大镜 - + Open Folder 打开文件夹 + Comics 漫画 - + Offset double page to the right 双页向右偏移 - + Fit Height 适应高度 - + Autoscroll backward, vertical first 向后自动滚动,垂直优先 - - - + + + Comic files 漫画文件 - + Not now 现在不 - + Go to the first page 转到第一页 - - - + + + Go to previous page 转至上一页 - + Window 窗口 - + Open the latest comic opened in the previous reading session 打开最近阅读漫画 - + Open a comic 打开漫画 - + Image files (*.jpg) 图像文件 (*.jpg) - + Next Comic 下一个漫画 - + Fit Width 适合宽度 - + Options 选项 - + Show Info 显示信息 - + Open folder 打开文件夹 - + Go to page ... 跳转至页面 ... + Magnifiying glass 放大镜 - + Fit image to width 缩放图片以适应宽度 @@ -751,10 +3426,10 @@ Toggle between fit to width and fit to height - 切换显示为"适应宽度"或"适应高度" + 切换显示为"适应宽度"或"适应高度" - + Move right 向右移动 @@ -764,151 +3439,162 @@ 增大缩放级别 - - + + Open recent 最近打开的文件 - + Offset double page to the left 双页向左偏移 - + + Reading 阅读 - + &Previous 上一页(&P) - + Autoscroll forward, horizontal first 向前自动滚动,水平优先 - - - + + + Go to next page 转至下一页 - + Show keyboard shortcuts 显示键盘快捷键 - + Double page manga mode 双页漫画模式 - + There is a new version available 有新版本可用 - + Autoscroll down 向下自动滚动 - - - + + + Open next comic 打开下一个漫画 - + Remind me in 14 days 14天后提醒我 - + Fit to page 适应页面 - + Show bookmarks 显示书签 - - - + + + Open previous comic 打开上一个漫画 - + Rotate image to the left 向左旋转图片 - + Fit image to height 缩放图片以适应高度 - + + Continuous scroll + 连续滚动 + + + + Switch to continuous scroll mode + 切换到连续滚动模式 + + + Reset zoom 重置缩放 - + Show the bookmarks of the current comic 显示当前漫画的书签 - + Show Dictionary 显示字典 Reset magnifying glass - + 重置放大镜 - + Move down 向下移动 - + Move left 向左移动 - + Reverse reading order in double page mode 双页模式 (逆序阅读) - + YACReader options YACReader 选项 - + Clear open recent list 清空最近访问列表 - + Help, About YACReader 帮助, 关于 YACReader - + Show go to flow - 显示页面流 + 显示“转到 Comic Flow” @@ -916,7 +3602,7 @@ 上一个漫画 - + Show full size 显示全尺寸 @@ -926,62 +3612,81 @@ 隐藏/显示 工具栏 - + Magnifying glass 放大镜 - + Edit shortcuts 编辑快捷键 + General 常规 - + Set a bookmark on the current page 在当前页面设置书签 + Page adjustement 页面调整 - + Show zoom slider 显示缩放滑块 - + Go to the last page 转到最后一页 - + Do you want to download the new version? 你要下载新版本吗? - + Rotate image to the right 向右旋转图片 - + Autoscroll backward, horizontal first 向后自动滚动,水平优先 + + YACReader::TrayIconController + + + &Restore + 复位(&R) + + + + Systray + 系统托盘 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 将继续在系统托盘中运行. 想要终止程序, 请在系统托盘图标的上下文菜单中选择<b>退出</b>. + + YACReader::WhatsNewDialog - Close - 关闭 + 关闭 @@ -1017,172 +3722,152 @@ YACReaderFlowConfigWidget - CoverFlow look - 封面流 + 封面流 - How to show covers: - 封面显示方式: + 封面显示方式: - Stripe look - 条状 + 条状 - Overlapped Stripe look - 重叠条状 + 重叠条状 YACReaderGLFlowConfigWidget - Zoom - 缩放 + 缩放 - Light - 亮度 + 亮度 - Show advanced settings - 显示高级选项 + 显示高级选项 - Roulette look - 轮盘 + 轮盘 - Cover Angle - 封面角度 + 封面角度 - Stripe look - 条状 + 条状 - Position - 位置 + 位置 - Z offset - Z位移 + Z位移 - Y offset - Y位移 + Y位移 - Central gap - 中心间距 + 中心间距 - Presets: - 预设: + 预设: - Overlapped Stripe look - 重叠条状 + 重叠条状 - Modern look - 现代 + 现代 - View angle - 视角 + 视角 - Max angle - 最大角度 + 最大角度 - Custom: - 自定义: + 自定义: - Classic look - 经典 + 经典 - Cover gap - 封面间距 + 封面间距 - High Performance - 高性能 + 高性能 - Performance: - 性能: + 性能: - Use VSync (improve the image quality in fullscreen mode, worse performance) - 使用VSync (在全屏模式下提高图像质量, 性能更差) + 使用VSync (在全屏模式下提高图像质量, 性能更差) - Visibility - 透明度 + 透明度 - Low Performance - 低性能 + 低性能 YACReaderOptionsDialog - + Save 保存 - Use hardware acceleration (restart needed) - 使用硬件加速 (需要重启) + 使用硬件加速 (需要重启) - + Cancel 取消 - + Shortcuts 快捷键 - + Edit shortcuts 编辑快捷键 + + YACReaderSearchLineEdit + + + type to search + 搜索类型 + + YACReaderSlider @@ -1194,23 +3879,23 @@ YACReaderTranslator - + clear 清空 - + Service not available 服务不可用 - - + + Translation 翻译 - + YACReader translator YACReader 翻译 diff --git a/YACReader/yacreader_zh_HK.ts b/YACReader/yacreader_zh_HK.ts index fc14d3407..1988e5cf7 100644 --- a/YACReader/yacreader_zh_HK.ts +++ b/YACReader/yacreader_zh_HK.ts @@ -9,6 +9,196 @@ + + AddLabelDialog + + + Label name: + 標籤名稱: + + + + Choose a color: + 選擇標籤顏色: + + + + accept + 接受 + + + + cancel + 取消 + + + + AddLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library name : + 庫名: + + + + Add + 添加 + + + + Cancel + 取消 + + + + Add an existing library + 添加一個現有庫 + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 + + + + Paste here your Comic Vine API key + 在此粘貼你的Comic Vine API + + + + Accept + 接受 + + + + Cancel + 取消 + + + + AppearanceTabWidget + + + Color scheme + 配色方案 + + + + System + 系統 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 風俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 刪除此使用者匯入的主題 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定義: + + + + Import theme... + 導入主題... + + + + Theme + 主題 + + + + Theme editor + 主題編輯器 + + + + Open Theme Editor... + 開啟主題編輯器... + + + + Theme editor error + 主題編輯器錯誤 + + + + The current theme JSON could not be loaded. + 無法載入目前主題 JSON。 + + + + Import theme + 導入主題 + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Could not import theme from: +%1 + 無法從以下位置匯入主題: +%1 + + + + Could not import theme from: +%1 + +%2 + 無法從以下位置匯入主題: +%1 + +%2 + + + + Import failed + 導入失敗 + + BookmarksDialog @@ -33,6 +223,200 @@ 載入中... + + ClassicComicsView + + + Hide comic flow + 隱藏 Comic Flow + + + + ComicModel + + + yes + + + + + no + + + + + Title + 標題 + + + + File Name + 檔案名 + + + + Pages + 頁數 + + + + Size + 大小 + + + + Read + 閱讀 + + + + Current Page + 當前頁 + + + + Publication Date + 發行日期 + + + + Rating + 評分 + + + + Series + 系列 + + + + Volume + 體積 + + + + Story Arc + 故事線 + + + + ComicVineDialog + + + skip + 忽略 + + + + back + 返回 + + + + next + 下一步 + + + + search + 搜索 + + + + close + 關閉 + + + + + comic %1 of %2 - %3 + 第 %1 本 共 %2 本 - %3 + + + + + + Looking for volume... + 搜索卷... + + + + %1 comics selected + 已選擇 %1 本漫畫 + + + + Error connecting to ComicVine + ComicVine 連接時出錯 + + + + + Retrieving tags for : %1 + 正在檢索標籤: %1 + + + + Retrieving volume info... + 正在接收卷資訊... + + + + Looking for comic... + 搜索漫畫中... + + + + ContinuousPageWidget + + + Loading page %1 + 正在載入頁面 %1 + + + + CreateLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library Name : + 庫名: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + 創建一個新的庫可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。 + + + + Create new library + 創建新的漫畫庫 + + + + Path not found + 未找到路徑 + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + 所選路徑不存在或不是有效路徑. 確保您具有此檔夾的寫入許可權 + + EditShortcutsDialog @@ -51,14 +435,132 @@ 快捷鍵設置 - + Shortcut in use 快捷鍵被佔用 - - The shortcut "%1" is already assigned to other function - 快捷鍵 "%1" 已被映射至其他功能 + + The shortcut "%1" is already assigned to other function + 快捷鍵 "%1" 已被映射至其他功能 + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + 該資料夾還沒有漫畫 + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + 此標籤尚未包含漫畫 + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + 此閱讀列表尚未包含任何漫畫 + + + + EmptySpecialListWidget + + + No favorites + 沒有收藏 + + + + You are not reading anything yet, come on!! + 你還沒有閱讀任何東西,加油!! + + + + There are no recent comics! + 沒有最近的漫畫! + + + + ExportComicsInfoDialog + + + Output file : + 輸出檔: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Export comics info + 導出漫畫資訊 + + + + Destination database name + 目標資料庫名稱 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + ExportLibraryDialog + + + Output folder : + 輸出檔夾: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create covers package + 創建封面包 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + Destination directory + 目標目錄 @@ -116,438 +618,2609 @@ GoToFlowToolBar - + Page : 頁碼 : + + GridComicsView + + + Show info + 顯示資訊 + + HelpAboutDialog - + About 關於 - + Help 幫助 - + System info 系統資訊 - LogWindow + ImportComicsInfoDialog - - Log window - 日誌窗口 + + Import comics info + 導入漫畫資訊 - - &Pause - 中止(&P) + + Info database location : + 資料庫地址: - - &Save - 保存(&S) + + Import + 導入 - - C&lear - 清空(&l) + + Cancel + 取消 - - &Copy - 複製(&C) + + Comics info file (*.ydb) + 漫畫資訊檔(*.ydb) + + + ImportLibraryDialog - - Level: - 等級: + + Library Name : + 庫名: - - &Auto scroll - 自動滾動(&A) + + Package location : + 打包地址: - - - OptionsDialog - - "Go to flow" size - 頁面流尺寸 + + Destination folder : + 目標檔夾: - - My comics path - 我的漫畫路徑 + + Unpack + 解壓 - - Background color - 背景顏色 + + Cancel + 取消 - - Choose - 選擇 + + Extract a catalog + 提取目錄 - - Quick Navigation Mode - 快速導航模式 + + Compresed library covers (*.clc) + 已壓縮的庫封面 (*.clc) - - + + + ImportWidget + + + stop + 停止 + + + + Some of the comics being added... + 正在添加漫畫... + + + + Importing comics + 正在導入漫畫 + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary現在正在創建一個新庫。</p><p>這可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。</p> + + + + Updating the library + 正在更新庫 + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>正在更新當前庫。要獲得更快的更新,請經常更新您的庫。</p><p>您可以停止該進程,稍後繼續更新操作。</p> + + + + Upgrading the library + 正在更新庫 + + + + <p>The current library is being upgraded, please wait.</p> + <p>正在更新當前漫畫庫, 請稍候.</p> + + + + Scanning the library + 正在掃描庫 + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>正在掃描當前庫的舊版 XML metadata 資訊。</p><p>這只需要執行一次,且只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 時。</p> + + + + LibraryWindow + + + YACReader Library + YACReader 庫 + + + + + + comic + 漫畫 + + + + + + manga + 漫畫 + + + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + + + web comic + 網路漫畫 + + + + + + 4koma (top to botom) + 4koma(由上至下) + + + + + + + Set type + 套裝類型 + + + + Library + + + + + Folder + 檔夾 + + + + Comic + 漫畫 + + + + Upgrade failed + 更新失敗 + + + + There were errors during library upgrade in: + 漫畫庫更新時出現錯誤: + + + + Update needed + 需要更新 + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + 此庫是使用舊版本的YACReaderLibrary創建的. 它需要更新. 現在更新? + + + + Download new version + 下載新版本 + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + 此庫是使用較新版本的YACReaderLibrary創建的。 立即下載新版本? + + + + Library not available + 庫不可用 + + + + Library '%1' is no longer available. Do you want to remove it? + 庫 '%1' 不再可用。 你想刪除它嗎? + + + + Old library + 舊的庫 + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? + + + + + Copying comics... + 複製漫畫中... + + + + + Moving comics... + 移動漫畫中... + + + + Add new folder + 添加新的檔夾 + + + + Folder name: + 檔夾名稱: + + + + No folder selected + 沒有選中的檔夾 + + + + Please, select a folder first + 請先選擇一個檔夾 + + + + Error in path + 路徑錯誤 + + + + There was an error accessing the folder's path + 訪問檔夾的路徑時出錯 + + + + Delete folder + 刪除檔夾 + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + 所選檔夾及其所有內容將從磁片中刪除。 你確定嗎? + + + + + Unable to delete + 無法刪除 + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + 嘗試刪除所選檔夾時出現問題。 請檢查寫入許可權,並確保沒有其他應用程式在使用這些檔夾或檔。 + + + + Add new reading lists + 添加新的閱讀列表 + + + + + List name: + 列表名稱: + + + + Delete list/label + 刪除 列表/標籤 + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + 所選項目將被刪除,您的漫畫或檔夾將不會從您的磁片中刪除。 你確定嗎? + + + + Rename list name + 重命名列表 + + + + Open folder... + 打開檔夾... + + + + Update folder + 更新檔夾 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set as read + 設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + Save covers + 保存封面 + + + + You are adding too many libraries. + 您添加的庫太多了。 + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + 您添加的庫太多了。 + +一般情況只需要一個頂級的庫,您可以使用左側邊欄中的檔夾功能來進行分類管理。 + +YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低的庫數量來提升性能。 + + + + + YACReader not found + YACReader 未找到 + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + 未找到YACReader. YACReader應安裝在與YACReaderLibrary相同的檔夾中. + + + + YACReader not found. There might be a problem with your YACReader installation. + 未找到YACReader. YACReader的安裝可能有問題. + + + + Error + 錯誤 + + + + Error opening comic with third party reader. + 使用第三方閱讀器開啟漫畫時出錯。 + + + + Library not found + 未找到庫 + + + + The selected folder doesn't contain any library. + 所選檔夾不包含任何庫。 + + + + Are you sure? + 你確定嗎? + + + + Do you want remove + 你想要刪除 + + + + library? + 庫? + + + + Remove and delete metadata + 移除並刪除元數據 + + + + Library info + 圖書館資訊 + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + 嘗試刪除所選漫畫時出現問題。 請檢查所選檔或包含檔夾中的寫入許可權。 + + + + Assign comics numbers + 分配漫畫編號 + + + + Assign numbers starting in: + 從以下位置開始分配編號: + + + + Invalid image + 圖片無效 + + + + The selected file is not a valid image. + 所選檔案不是有效影像。 + + + + Error saving cover + 儲存封面時發生錯誤 + + + + There was an error saving the cover image. + 儲存封面圖片時發生錯誤。 + + + + Error creating the library + 創建庫時出錯 + + + + Error updating the library + 更新庫時出錯 + + + + Error opening the library + 打開庫時出錯 + + + + Delete comics + 刪除漫畫 + + + + All the selected comics will be deleted from your disk. Are you sure? + 所有選定的漫畫都將從您的磁片中刪除。你確定嗎? + + + + Remove comics + 移除漫畫 + + + + Comics will only be deleted from the current label/list. Are you sure? + 漫畫只會從當前標籤/列表中刪除。 你確定嗎? + + + + Library name already exists + 庫名已存在 + + + + There is another library with the name '%1'. + 已存在另一個名為'%1'的庫。 + + + + LibraryWindowActions + + + Create a new library + 創建一個新的庫 + + + + Open an existing library + 打開現有的庫 + + + + + Export comics info + 導出漫畫資訊 + + + + + Import comics info + 導入漫畫資訊 + + + + Pack covers + 打包封面 + + + + Pack the covers of the selected library + 打包所選庫的封面 + + + + Unpack covers + 解壓封面 + + + + Unpack a catalog + 解壓目錄 + + + + Update library + 更新庫 + + + + Update current library + 更新當前庫 + + + + Rename library + 重命名庫 + + + + Rename current library + 重命名當前庫 + + + + Remove library + 移除庫 + + + + Remove current library from your collection + 從您的集合中移除當前庫 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 + + + + Show library info + 顯示圖書館資訊 + + + + Show information about the current library + 顯示當前庫的信息 + + + + Open current comic + 打開當前漫畫 + + + + Open current comic on YACReader + 用YACReader打開漫畫 + + + + Save selected covers to... + 選中的封面保存到... + + + + Save covers of the selected comics as JPG files + 保存所選的封面為jpg + + + + + Set as read + 設為已讀 + + + + Set comic as read + 漫畫設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set comic as unread + 漫畫設為未讀 + + + + + manga + 漫畫 + + + + Set issue as manga + 將問題設定為漫畫 + + + + + comic + 漫畫 + + + + Set issue as normal + 設置發行狀態為正常發行 + + + + western manga + 西方漫畫 + + + + Set issue as western manga + 將問題設定為西方漫畫 + + + + + web comic + 網路漫畫 + + + + Set issue as web comic + 將問題設定為網路漫畫 + + + + + yonkoma + 四科馬 + + + + Set issue as yonkoma + 將問題設定為 yonkoma + + + + Show/Hide marks + 顯示/隱藏標記 + + + + Show or hide read marks + 顯示或隱藏閱讀標記 + + + + Show/Hide recent indicator + 顯示/隱藏最近的指標 + + + + Show or hide recent indicator + 顯示或隱藏最近的指示器 + + + + + Fullscreen mode on/off + 全屏模式 開/關 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Add new folder + 添加新的檔夾 + + + + Add new folder to the current library + 在當前庫下添加新的檔夾 + + + + Delete folder + 刪除檔夾 + + + + Delete current folder from disk + 從磁片上刪除當前檔夾 + + + + Select root node + 選擇根節點 + + + + Expand all nodes + 展開所有節點 + + + + Collapse all nodes + 折疊所有節點 + + + + Show options dialog + 顯示選項對話框 + + + + Show comics server options dialog + 顯示漫畫伺服器選項對話框 + + + + + Change between comics views + 漫畫視圖之間的變化 + + + + Open folder... + 打開檔夾... + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + Open containing folder... + 打開包含檔夾... + + + + Reset comic rating + 重置漫畫評分 + + + + Select all comics + 全選漫畫 + + + + Edit + 編輯 + + + + Assign current order to comics + 將當前序號分配給漫畫 + + + + Update cover + 更新封面 + + + + Delete selected comics + 刪除所選的漫畫 + + + + Delete metadata from selected comics + 從選定的漫畫中刪除元數據 + + + + Download tags from Comic Vine + 從 Comic Vine 下載標籤 + + + + Focus search line + 聚焦於搜索行 + + + + Focus comics view + 聚焦於漫畫視圖 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &Quit + 退出(&Q) + + + + Update folder + 更新檔夾 + + + + Update current folder + 更新當前檔夾 + + + + Scan legacy XML metadata + 掃描舊版 XML 元數據 + + + + Add new reading list + 添加新的閱讀列表 + + + + Add a new reading list to the current library + 在當前庫添加新的閱讀列表 + + + + Remove reading list + 移除閱讀列表 + + + + Remove current reading list from the library + 從當前庫移除閱讀列表 + + + + Add new label + 添加新標籤 + + + + Add a new label to this library + 在當前庫添加標籤 + + + + Rename selected list + 重命名列表 + + + + Rename any selected labels or lists + 重命名任何選定的標籤或列表 + + + + Add to... + 添加到... + + + + Favorites + 收藏夾 + + + + Add selected comics to favorites list + 將所選漫畫添加到收藏夾列表 + + + + LocalComicListModel + + + file name + 檔案名 + + + + LogWindow + + Log window + 日誌窗口 + + + &Pause + 中止(&P) + + + &Save + 保存(&S) + + + C&lear + 清空(&l) + + + &Copy + 複製(&C) + + + Level: + 等級: + + + &Auto scroll + 自動滾動(&A) + + + + NoLibrariesWidget + + + You don't have any libraries yet + 你還沒有庫 + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>您可以在任何檔夾中創建庫,YACReaderLibrary將導入此檔夾中的所有漫畫和文件夾。如果已有庫,則可以打開它們。</p><p>您可以把YACReader當成獨立應用來閱讀電腦上的漫畫。</p> + + + + create your first library + 創建你的第一個庫 + + + + add an existing one + 添加一個現有庫 + + + + NoSearchResultsWidget + + + No results + 沒有結果 + + + + OptionsDialog + + + "Go to flow" size + 「前往 Comic Flow」大小 + + + + My comics path + 我的漫畫路徑 + + + + Background color + 背景顏色 + + + + Choose + 選擇 + + + + Quick Navigation Mode + 快速導航模式 + + + Disable mouse over activation 禁用滑鼠啟動 - - Restart is needed - 需要重啟 + + Scaling + 縮放 + + + + Scaling method + 縮放方法 + + + + Nearest (fast, low quality) + 最近(快速,低品質) + + + + Bilinear + 雙線性 + + + + Lanczos (better quality) + Lanczos(品質更好) + + + + + Restart is needed + 需要重啟 + + + + Brightness + 亮度 + + + + Display + 展示 + + + + Show time in current page information label + 在目前頁面資訊標籤中顯示時間 + + + + Scroll behaviour + 滾動效果 + + + + Disable scroll animations and smooth scrolling + 停用滾動動畫和平滑滾動 + + + + Do not turn page using scroll + 滾動時不翻頁 + + + + Use single scroll step to turn page + 使用單滾動步驟翻頁 + + + + Mouse mode + 滑鼠模式 + + + + Only Back/Forward buttons can turn pages + 只有後退/前進按鈕可以翻頁 + + + + Use the Left/Right buttons to turn pages. + 使用向左/向右按鈕翻頁。 + + + + Click left or right half of the screen to turn pages. + 點擊螢幕的左半部或右半部即可翻頁。 + + + + Contrast + 對比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 圖片選項 + + + + Fit options + 適應項 + + + + Enlarge images to fit width/height + 放大圖片以適應寬度/高度 + + + + Double Page options + 雙頁選項 + + + + Show covers as single page + 顯示封面為單頁 + + + + + General + 常規 + + + + + Libraries + + + + + Comic Flow + Comic Flow + + + + Grid view + 網格視圖 + + + + + Appearance + 外貌 + + + + + Language + 語言 + + + + + Application language + 應用程式語言 + + + + + System default + 系統預設 + + + + Tray icon settings (experimental) + 託盤圖示設置 (實驗特性) + + + + Close to tray + 關閉至託盤 + + + + Start into the system tray + 啟動至系統託盤 + + + + Edit Comic Vine API key + 編輯Comic Vine API 密匙 + + + + Comic Vine API key + Comic Vine API 密匙 + + + + ComicInfo.xml legacy support + ComicInfo.xml 遺留支持 + + + + Import metadata from ComicInfo.xml when adding new comics + 新增漫畫時從 ComicInfo.xml 匯入元數據 + + + + Consider 'recent' items added or updated since X days ago + 考慮自 X 天前新增或更新的「最近」項目 + + + + Third party reader + 第三方閱讀器 + + + + Write {comic_file_path} where the path should go in the command + 在命令中應將路徑寫入 {comic_file_path} + + + + + Clear + 清空 + + + + Update libraries at startup + 啟動時更新庫 + + + + Try to detect changes automatically + 嘗試自動偵測變化 + + + + Update libraries periodically + 定期更新庫 + + + + Interval: + 間隔: + + + + 30 minutes + 30分鐘 + + + + 1 hour + 1小時 + + + + 2 hours + 2小時 + + + + 4 hours + 4小時 + + + + 8 hours + 8小時 + + + + 12 hours + 12小時 + + + + daily + 日常的 + + + + Update libraries at certain time + 定時更新庫 + + + + Time: + 時間: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + 警告!在庫更新期間,將停用對資料庫的寫入! +當您可能正在積極使用應用程式時,請勿安排更新。 +在自動更新期間,應用程式將阻止某些操作,直到更新完成。 +若要停止自動更新,請點選庫標題旁的載入指示器。 + + + + Modifications detection + 修改檢測 + + + + Compare the modified date of files when updating a library (not recommended) + 更新庫時比較文件的修改日期(不建議) + + + + Enable background image + 啟用背景圖片 + + + + Opacity level + 透明度 + + + + Blur level + 模糊 + + + + Use selected comic cover as background + 使用選定的漫畫封面做背景 + + + + Restore defautls + 恢復默認值 + + + + Background + 背景 + + + + Display continue reading banner + 顯示繼續閱讀橫幅 + + + + Display current comic banner + 顯示目前漫畫橫幅 + + + + Continue reading + 繼續閱讀 + + + + Page Flow + 頁面流 + + + + Image adjustment + 圖像調整 + + + + + Options + 選項 + + + + Comics directory + 漫畫目錄 + + + + PropertiesDialog + + + General info + 基本資訊 + + + + Plot + 情節 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Notes + 筆記 + + + + Cover page + 封面 + + + + Load previous page as cover + 載入上一頁作為封面 + + + + Load next page as cover + 載入下一頁作為封面 + + + + Reset cover to the default image + 將封面重設為預設圖片 + + + + Load custom cover image + 載入自訂封面圖片 + + + + Series: + 系列: + + + + Title: + 標題: + + + + + + of: + 的: + + + + Issue number: + 發行數量: + + + + Volume: + 卷: + + + + Arc number: + 世界線數量: + + + + Story arc: + 故事線: + + + + alt. number: + 替代。數字: + + + + Alternate series: + 替代系列: + + + + Series Group: + 系列組: + + + + Genre: + 類型: + + + + Size: + 大小: + + + + Writer(s): + 作者: + + + + Penciller(s): + 線稿: + + + + Inker(s): + 墨稿: + + + + Colorist(s): + 上色: + + + + Letterer(s): + 文本: + + + + Cover Artist(s): + 封面設計: + + + + Editor(s): + 編輯: + + + + Imprint: + 印記: + + + + Day: + 日: + + + + Month: + 月: + + + + Year: + 年: + + + + Publisher: + 出版者: + + + + Format: + 格式: + + + + Color/BW: + 彩色/黑白: + + + + Age rating: + 年齡等級: + + + + Type: + 類型: + + + + Language (ISO): + 語言(ISO): + + + + Synopsis: + 概要: + + + + Characters: + 角色: + + + + Teams: + 團隊: + + + + Locations: + 地點: + + + + Main character or team: + 主要角色或團隊: + + + + Review: + 審查: + + + + Notes: + 筆記: + + + + Tags: + 標籤: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + + + + Not found + 未找到 + + + + Comic not found. You should update your library. + 未找到漫畫,請先更新您的庫. - - Brightness + + Edit comic information + 編輯漫畫資訊 + + + + Edit selected comics information + 編輯選中的漫畫資訊 + + + + Invalid cover + 封面無效 + + + + The image is invalid. + 該圖像無效。 + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的無頭(無 GUI)版本。 + +此應用程式支援持久性設置,要設定它們,請編輯此文件 %1 +若要了解可用設置,請查看文件:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + 7z lib not found + 未找到 7z 庫檔 + + + + unable to load 7z lib from ./utils + 無法從 ./utils 載入 7z 庫檔 + + + + Trace + 追蹤 + + + + Debug + 除錯 + + + + Info + 資訊 + + + + Warning + 警告 + + + + Error + 錯誤 + + + + Fatal + 嚴重錯誤 + + + + Select custom cover + 選擇自訂封面 + + + + Images (%1) + 圖片 (%1) + + + + The file could not be read or is not valid JSON. + 無法讀取該檔案或該檔案不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主題適用於 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 檔夾 + + + + Reading Lists + 閱讀列表 + + + + QsLogging::LogWindowModel + + Time + 時間 + + + Level + 等級 + + + Message + 資訊 + + + + QsLogging::Window + + &Pause + 中止(&P) + + + &Resume + 恢復(&R) + + + Save log + 保存日誌 + + + Log file (*.log) + 日誌檔 (*.log) + + + + RenameLibraryDialog + + + New Library Name : + 新庫名: + + + + Rename + 重命名 + + + + Cancel + 取消 + + + + Rename current library + 重命名當前庫 + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + 搜索結果: %1 + + + + + page %1 of %2 + 第 %1 頁 共 %2 頁 + + + + Number of %1 found : %2 + 第 %1 頁 共: %2 條 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SearchVolume + + + Please provide some additional information. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SelectComic + + + Please, select the right comic info. + 請正確選擇漫畫資訊. + + + + comics + 漫畫 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + comic description unavailable + 漫畫描述不可用 + + + + SelectVolume + + + Please, select the right series for your comic. + 請選擇正確的漫畫系列。 + + + + Filter: + 篩選: + + + + volumes + + + + + Nothing found, clear the filter if any. + 未找到任何內容,如果有,請清除過濾器。 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + volume description unavailable + 卷描述不可用 + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + 您正在嘗試同時獲取各種漫畫的資訊,它們是同一系列的嗎? + + + + yes + + + + + no + + + + + ServerConfigDialog + + + set port + 設置端口 + + + + Server connectivity information + 伺服器連接資訊 + + + + Scan it! + 掃一掃! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 適用於 iOS 和 Android 裝置。 <br/>發現它適用於 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> 或 <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>。 + + + + Choose an IP address + 選擇IP地址 + + + + Port + 端口 + + + + enable the server + 啟用伺服器 + + + + ShortcutsDialog + + YACReader keyboard shortcuts + YACReader 鍵盤快捷鍵 + + + Close + 關閉 + + + Keyboard Shortcuts + 鍵盤快捷鍵 + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + 請在左側對漫畫列表進行排序,直到它與漫畫的資訊相符。 + + + + sort comics to match comic information + 排序漫畫以匹配漫畫資訊 + + + + issues + 發行 + + + + remove selected comics + 移除所選漫畫 + + + + restore all removed comics + 恢復所有移除的漫畫 + + + + ThemeEditorDialog + + + Theme Editor + 主題編輯器 + + + + + + + + + + + - + - + + + + i + + + + + Expand all + 全部展開 + + + + Collapse all + 全部折疊 + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中閃爍所選值(洋紅色/切換/0↔10)。發布後恢復原樣。 + + + + Search… + 搜尋… + + + + Light 亮度 - - Display - + + Dark + 黑暗的 - - Show time in current page information label - + + ID: + ID: - - Scroll behaviour - 滾動效果 + + Display name: + 顯示名稱: - - Disable scroll animations and smooth scrolling - + + Variant: + 變體: + + + + Theme info + 主題訊息 + + + + Parameter + 範圍 + + + + Value + 價值 + + + + Save and apply + 儲存並應用 + + + + Export to file... + 匯出到文件... + + + + Load from file... + 從檔案載入... + + + + Close + 關閉 - - Do not turn page using scroll - 滾動時不翻頁 + + Double-click to edit color + 雙擊編輯顏色 - - Use single scroll step to turn page - 使用單滾動步驟翻頁 + + + + + + + true + 真的 - - Mouse mode - + + + + + false + 錯誤的 - - Only Back/Forward buttons can turn pages - + + Double-click to toggle + 按兩下切換 - - Use the Left/Right buttons to turn pages. - + + Double-click to edit value + 雙擊編輯值 - - Click left or right half of the screen to turn pages. - + + + + Edit: %1 + 編輯:%1 - - Contrast - 對比度 + + Save theme + 儲存主題 - - Gamma - Gamma值 + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) - - Reset - 重置 + + Save failed + 保存失敗 - - Image options - 圖片選項 + + Could not open file for writing: +%1 + 無法開啟文件進行寫入: +%1 - - Fit options - 適應項 + + Load theme + 載入主題 - - Enlarge images to fit width/height - 放大圖片以適應寬度/高度 + + + + Load failed + 載入失敗 - - Double Page options - 雙頁選項 + + Could not open file: +%1 + 無法開啟檔案: +%1 - - Show covers as single page - 顯示封面為單頁 + + Invalid JSON: +%1 + 無效的 JSON: +%1 - - General - 常規 + + Expected a JSON object. + 需要一個 JSON 物件。 + + + TitleHeader - - Page Flow - 頁面流 + + SEARCH + 搜索 + + + UpdateLibraryDialog - - Image adjustment - 圖像調整 + + Updating.... + 更新中... - - Options - 選項 + + Cancel + 取消 - - Comics directory - 漫畫目錄 + + Update library + 更新庫 - QObject + Viewer - - 7z lib not found - 未找到 7z 庫檔 + + + Press 'O' to open comic. + 按下 'O' 以打開漫畫. - - unable to load 7z lib from ./utils - 無法從 ./utils 載入 7z 庫檔 + + Not found + 未找到 - - Trace - 追蹤 + + Comic not found + 未找到漫畫 - - Debug - 除錯 + + Error opening comic + 打開漫畫時發生錯誤 - - Info - 資訊 + + CRC Error + CRC 校驗失敗 - - Warning - 警告 + + Loading...please wait! + 載入中... 請稍候! - - Error - 錯誤 + + Page not available! + 頁面不可用! - - Fatal - 嚴重錯誤 + + Cover! + 封面! - - Select custom cover - + + Last page! + 尾頁! + + + VolumeComicsModel - - Images (%1) - + + title + 標題 - QsLogging::LogWindowModel + VolumesModel - - Time - 時間 + + year + - - Level - 等級 + + issues + 發行 - - Message - 資訊 + + publisher + 出版者 - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - 中止(&P) + + Presets: + 預設: - - &Resume - 恢復(&R) + + Classic look + 經典 - - Save log - 保存日誌 + + Stripe look + 條狀 - - Log file (*.log) - 日誌檔 (*.log) + + Overlapped Stripe look + 重疊條狀 - - - ShortcutsDialog - YACReader keyboard shortcuts - YACReader 鍵盤快捷鍵 + + Modern look + 現代 - Close - 關閉 + + Roulette look + 輪盤 - Keyboard Shortcuts - 鍵盤快捷鍵 + + Show advanced settings + 顯示高級選項 + + + + Custom: + 自定義: - - - Viewer - - - Press 'O' to open comic. - 按下 'O' 以打開漫畫. + + View angle + 視角 - - Not found - 未找到 + + Position + 位置 - - Comic not found - 未找到漫畫 + + Cover gap + 封面間距 - - Error opening comic - 打開漫畫時發生錯誤 + + Central gap + 中心間距 - - CRC Error - CRC 校驗失敗 + + Zoom + 縮放 - - Loading...please wait! - 載入中... 請稍候! + + Y offset + Y位移 - - Page not available! - 頁面不可用! + + Z offset + Z位移 - - Cover! - 封面! + + Cover Angle + 封面角度 - - Last page! - 尾頁! + + Visibility + 透明度 + + + + Light + 亮度 + + + + Max angle + 最大角度 + + + + Low Performance + 低性能 + + + + High Performance + 高性能 + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) + + + + Performance: + 性能: YACReader::MainWindowViewer - + &Open 打開(&O) - + Open a comic 打開漫畫 - + New instance 新建實例 - + Open Folder 打開檔夾 - + Open image folder 打開圖片檔夾 - + Open latest comic 打開最近的漫畫 - + Open the latest comic opened in the previous reading session 打開最近閱讀漫畫 - + Clear 清空 - + Clear open recent list 清空最近訪問列表 - + Save 保存 - + Save current page 保存當前頁面 @@ -557,285 +3230,296 @@ 上一個漫畫 - - - + + + Open previous comic 打開上一個漫畫 - + Next Comic 下一個漫畫 - - - + + + Open next comic 打開下一個漫畫 - + &Previous 上一頁(&P) - - - + + + Go to previous page 轉至上一頁 - + &Next 下一頁(&N) - - - + + + Go to next page 轉至下一頁 - + Fit Height 適應高度 - + Fit image to height 縮放圖片以適應高度 - + Fit Width 適合寬度 - + Fit image to width 縮放圖片以適應寬度 - + Show full size 顯示全尺寸 - + Fit to page 適應頁面 - + + Continuous scroll + 連續滾動 + + + + Switch to continuous scroll mode + 切換到連續滾動模式 + + + Reset zoom 重置縮放 - + Show zoom slider 顯示縮放滑塊 - + Zoom+ 放大 - + Zoom- 縮小 - + Rotate image to the left 向左旋轉圖片 - + Rotate image to the right 向右旋轉圖片 - + Double page mode 雙頁模式 - + Switch to double page mode 切換至雙頁模式 - + Double page manga mode 雙頁漫畫模式 - + Reverse reading order in double page mode 雙頁模式 (逆序閱讀) - + Go To 跳轉 - + Go to page ... 跳轉至頁面 ... - + Options 選項 - + YACReader options YACReader 選項 - - + + Help 幫助 - + Help, About YACReader 幫助, 關於 YACReader - + Magnifying glass 放大鏡 - + Switch Magnifying glass 切換放大鏡 - + Set bookmark 設置書簽 - + Set a bookmark on the current page 在當前頁面設置書簽 - + Show bookmarks 顯示書簽 - + Show the bookmarks of the current comic 顯示當前漫畫的書簽 - + Show keyboard shortcuts 顯示鍵盤快捷鍵 - + Show Info 顯示資訊 - + Close 關閉 - + Show Dictionary 顯示字典 - + Show go to flow - 顯示頁面流 + 顯示「前往 Comic Flow」 - + Edit shortcuts 編輯快捷鍵 - + &File 檔(&F) - - + + Open recent 最近打開的檔 - + File - + Edit 編輯 - + View 查看 - + Go 轉到 - + Window 窗口 - - - + + + Open Comic 打開漫畫 - - - + + + Comic files 漫畫檔 - + Open folder 打開檔夾 - + page_%1.jpg - page_%1.jpg + 頁_%1.jpg - + Image files (*.jpg) 圖像檔 (*.jpg) + Comics 漫畫 @@ -851,6 +3535,7 @@ 隱藏/顯示 工具欄 + General 常規 @@ -878,9 +3563,10 @@ Reset magnifying glass - + 重置放大鏡 + Magnifiying glass 放大鏡 @@ -888,115 +3574,134 @@ Toggle between fit to width and fit to height - 切換顯示為"適應寬度"或"適應高度" + 切換顯示為"適應寬度"或"適應高度" + Page adjustement 頁面調整 - + Autoscroll down 向下自動滾動 - + Autoscroll up 向上自動滾動 - + Autoscroll forward, horizontal first 向前自動滾動,水準優先 - + Autoscroll backward, horizontal first 向後自動滾動,水準優先 - + Autoscroll forward, vertical first 向前自動滾動,垂直優先 - + Autoscroll backward, vertical first 向後自動滾動,垂直優先 - + Move down 向下移動 - + Move up 向上移動 - + Move left 向左移動 - + Move right 向右移動 - + Go to the first page 轉到第一頁 - + Go to the last page 轉到最後一頁 - + Offset double page to the left - + 雙頁向左偏移 - + Offset double page to the right - + 雙頁向右偏移 - + + Reading 閱讀 - + There is a new version available 有新版本可用 - + Do you want to download the new version? 你要下載新版本嗎? - + Remind me in 14 days 14天後提醒我 - + Not now 現在不 + + YACReader::TrayIconController + + + &Restore + 複位(&R) + + + + Systray + 系統託盤 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + YACReader::WhatsNewDialog - Close - 關閉 + 關閉 @@ -1032,170 +3737,150 @@ YACReaderFlowConfigWidget - How to show covers: - 封面顯示方式: + 封面顯示方式: - CoverFlow look - 封面流 + 封面流 - Stripe look - 條狀 + 條狀 - Overlapped Stripe look - 重疊條狀 + 重疊條狀 YACReaderGLFlowConfigWidget - Presets: - 預設: + 預設: - Classic look - 經典 + 經典 - Stripe look - 條狀 + 條狀 - Overlapped Stripe look - 重疊條狀 + 重疊條狀 - Modern look - 現代 + 現代 - Roulette look - 輪盤 + 輪盤 - Show advanced settings - 顯示高級選項 + 顯示高級選項 - Custom: - 自定義: + 自定義: - View angle - 視角 + 視角 - Position - 位置 + 位置 - Cover gap - 封面間距 + 封面間距 - Central gap - 中心間距 + 中心間距 - Zoom - 縮放 + 縮放 - Y offset - Y位移 + Y位移 - Z offset - Z位移 + Z位移 - Cover Angle - 封面角度 + 封面角度 - Visibility - 透明度 + 透明度 - Light - 亮度 + 亮度 - Max angle - 最大角度 + 最大角度 - Low Performance - 低性能 + 低性能 - High Performance - 高性能 + 高性能 - Use VSync (improve the image quality in fullscreen mode, worse performance) - 使用VSync (在全屏模式下提高圖像品質, 性能更差) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) - Performance: - 性能: + 性能: YACReaderOptionsDialog - + Save 保存 - + Cancel 取消 - + Edit shortcuts 編輯快捷鍵 - + Shortcuts 快捷鍵 - Use hardware acceleration (restart needed) - 使用硬體加速 (需要重啟) + 使用硬體加速 (需要重啟) + + + + YACReaderSearchLineEdit + + + type to search + 搜索類型 @@ -1209,23 +3894,23 @@ YACReaderTranslator - + YACReader translator YACReader 翻譯 - - + + Translation 翻譯 - + clear 清空 - + Service not available 服務不可用 diff --git a/YACReader/yacreader_zh_TW.ts b/YACReader/yacreader_zh_TW.ts index 4745cbaff..58c26acf9 100644 --- a/YACReader/yacreader_zh_TW.ts +++ b/YACReader/yacreader_zh_TW.ts @@ -9,6 +9,196 @@ + + AddLabelDialog + + + Label name: + 標籤名稱: + + + + Choose a color: + 選擇標籤顏色: + + + + accept + 接受 + + + + cancel + 取消 + + + + AddLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library name : + 庫名: + + + + Add + 添加 + + + + Cancel + 取消 + + + + Add an existing library + 添加一個現有庫 + + + + ApiKeyDialog + + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 + + + + Paste here your Comic Vine API key + 在此粘貼你的Comic Vine API + + + + Accept + 接受 + + + + Cancel + 取消 + + + + AppearanceTabWidget + + + Color scheme + 配色方案 + + + + System + 系統 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 風俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 刪除此使用者匯入的主題 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定義: + + + + Import theme... + 導入主題... + + + + Theme + 主題 + + + + Theme editor + 主題編輯器 + + + + Open Theme Editor... + 開啟主題編輯器... + + + + Theme editor error + 主題編輯器錯誤 + + + + The current theme JSON could not be loaded. + 無法載入目前主題 JSON。 + + + + Import theme + 導入主題 + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Could not import theme from: +%1 + 無法從以下位置匯入主題: +%1 + + + + Could not import theme from: +%1 + +%2 + 無法從以下位置匯入主題: +%1 + +%2 + + + + Import failed + 導入失敗 + + BookmarksDialog @@ -33,6 +223,200 @@ 載入中... + + ClassicComicsView + + + Hide comic flow + 隱藏 Comic Flow + + + + ComicModel + + + yes + + + + + no + + + + + Title + 標題 + + + + File Name + 檔案名 + + + + Pages + 頁數 + + + + Size + 大小 + + + + Read + 閱讀 + + + + Current Page + 當前頁 + + + + Publication Date + 發行日期 + + + + Rating + 評分 + + + + Series + 系列 + + + + Volume + 體積 + + + + Story Arc + 故事線 + + + + ComicVineDialog + + + skip + 忽略 + + + + back + 返回 + + + + next + 下一步 + + + + search + 搜索 + + + + close + 關閉 + + + + + comic %1 of %2 - %3 + 第 %1 本 共 %2 本 - %3 + + + + + + Looking for volume... + 搜索卷... + + + + %1 comics selected + 已選擇 %1 本漫畫 + + + + Error connecting to ComicVine + ComicVine 連接時出錯 + + + + + Retrieving tags for : %1 + 正在檢索標籤: %1 + + + + Retrieving volume info... + 正在接收卷資訊... + + + + Looking for comic... + 搜索漫畫中... + + + + ContinuousPageWidget + + + Loading page %1 + 正在載入頁面 %1 + + + + CreateLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library Name : + 庫名: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + 創建一個新的庫可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。 + + + + Create new library + 創建新的漫畫庫 + + + + Path not found + 未找到路徑 + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + 所選路徑不存在或不是有效路徑. 確保您具有此檔夾的寫入許可權 + + EditShortcutsDialog @@ -51,14 +435,132 @@ 快捷鍵設置 - + Shortcut in use 快捷鍵被佔用 - - The shortcut "%1" is already assigned to other function - 快捷鍵 "%1" 已被映射至其他功能 + + The shortcut "%1" is already assigned to other function + 快捷鍵 "%1" 已被映射至其他功能 + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + 該資料夾還沒有漫畫 + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + 此標籤尚未包含漫畫 + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + 此閱讀列表尚未包含任何漫畫 + + + + EmptySpecialListWidget + + + No favorites + 沒有收藏 + + + + You are not reading anything yet, come on!! + 你還沒有閱讀任何東西,加油!! + + + + There are no recent comics! + 沒有最近的漫畫! + + + + ExportComicsInfoDialog + + + Output file : + 輸出檔: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Export comics info + 導出漫畫資訊 + + + + Destination database name + 目標資料庫名稱 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + ExportLibraryDialog + + + Output folder : + 輸出檔夾: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create covers package + 創建封面包 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + Destination directory + 目標目錄 @@ -116,438 +618,2609 @@ GoToFlowToolBar - + Page : 頁碼 : + + GridComicsView + + + Show info + 顯示資訊 + + HelpAboutDialog - + About 關於 - + Help 幫助 - + System info 系統資訊 - LogWindow + ImportComicsInfoDialog - - Log window - 日誌窗口 + + Import comics info + 導入漫畫資訊 - - &Pause - 中止(&P) + + Info database location : + 資料庫地址: - - &Save - 保存(&S) + + Import + 導入 - - C&lear - 清空(&l) + + Cancel + 取消 - - &Copy - 複製(&C) + + Comics info file (*.ydb) + 漫畫資訊檔(*.ydb) + + + ImportLibraryDialog - - Level: - 等級: + + Library Name : + 庫名: - - &Auto scroll - 自動滾動(&A) + + Package location : + 打包地址: - - - OptionsDialog - - "Go to flow" size - 頁面流尺寸 + + Destination folder : + 目標檔夾: - - My comics path - 我的漫畫路徑 + + Unpack + 解壓 - - Background color - 背景顏色 + + Cancel + 取消 - - Choose - 選擇 + + Extract a catalog + 提取目錄 - - Quick Navigation Mode - 快速導航模式 + + Compresed library covers (*.clc) + 已壓縮的庫封面 (*.clc) - - + + + ImportWidget + + + stop + 停止 + + + + Some of the comics being added... + 正在添加漫畫... + + + + Importing comics + 正在導入漫畫 + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary現在正在創建一個新庫。</p><p>這可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。</p> + + + + Updating the library + 正在更新庫 + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>正在更新當前庫。要獲得更快的更新,請經常更新您的庫。</p><p>您可以停止該進程,稍後繼續更新操作。</p> + + + + Upgrading the library + 正在更新庫 + + + + <p>The current library is being upgraded, please wait.</p> + <p>正在更新當前漫畫庫, 請稍候.</p> + + + + Scanning the library + 正在掃描庫 + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>正在掃描當前庫的舊版 XML metadata 資訊。</p><p>這只需要執行一次,且只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 時。</p> + + + + LibraryWindow + + + YACReader Library + YACReader 庫 + + + + + + comic + 漫畫 + + + + + + manga + 漫畫 + + + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + + + web comic + 網路漫畫 + + + + + + 4koma (top to botom) + 4koma(由上至下) + + + + + + + Set type + 套裝類型 + + + + Library + + + + + Folder + 檔夾 + + + + Comic + 漫畫 + + + + Upgrade failed + 更新失敗 + + + + There were errors during library upgrade in: + 漫畫庫更新時出現錯誤: + + + + Update needed + 需要更新 + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + 此庫是使用舊版本的YACReaderLibrary創建的. 它需要更新. 現在更新? + + + + Download new version + 下載新版本 + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + 此庫是使用較新版本的YACReaderLibrary創建的。 立即下載新版本? + + + + Library not available + 庫不可用 + + + + Library '%1' is no longer available. Do you want to remove it? + 庫 '%1' 不再可用。 你想刪除它嗎? + + + + Old library + 舊的庫 + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? + + + + + Copying comics... + 複製漫畫中... + + + + + Moving comics... + 移動漫畫中... + + + + Add new folder + 添加新的檔夾 + + + + Folder name: + 檔夾名稱: + + + + No folder selected + 沒有選中的檔夾 + + + + Please, select a folder first + 請先選擇一個檔夾 + + + + Error in path + 路徑錯誤 + + + + There was an error accessing the folder's path + 訪問檔夾的路徑時出錯 + + + + Delete folder + 刪除檔夾 + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + 所選檔夾及其所有內容將從磁片中刪除。 你確定嗎? + + + + + Unable to delete + 無法刪除 + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + 嘗試刪除所選檔夾時出現問題。 請檢查寫入許可權,並確保沒有其他應用程式在使用這些檔夾或檔。 + + + + Add new reading lists + 添加新的閱讀列表 + + + + + List name: + 列表名稱: + + + + Delete list/label + 刪除 列表/標籤 + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + 所選項目將被刪除,您的漫畫或檔夾將不會從您的磁片中刪除。 你確定嗎? + + + + Rename list name + 重命名列表 + + + + Open folder... + 打開檔夾... + + + + Update folder + 更新檔夾 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set as read + 設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + Save covers + 保存封面 + + + + You are adding too many libraries. + 您添加的庫太多了。 + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + 您添加的庫太多了。 + +一般情況只需要一個頂級的庫,您可以使用左側邊欄中的檔夾功能來進行分類管理。 + +YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低的庫數量來提升性能。 + + + + + YACReader not found + YACReader 未找到 + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + 未找到YACReader. YACReader應安裝在與YACReaderLibrary相同的檔夾中. + + + + YACReader not found. There might be a problem with your YACReader installation. + 未找到YACReader. YACReader的安裝可能有問題. + + + + Error + 錯誤 + + + + Error opening comic with third party reader. + 使用第三方閱讀器開啟漫畫時出錯。 + + + + Library not found + 未找到庫 + + + + The selected folder doesn't contain any library. + 所選檔夾不包含任何庫。 + + + + Are you sure? + 你確定嗎? + + + + Do you want remove + 你想要刪除 + + + + library? + 庫? + + + + Remove and delete metadata + 移除並刪除元數據 + + + + Library info + 圖書館資訊 + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + 嘗試刪除所選漫畫時出現問題。 請檢查所選檔或包含檔夾中的寫入許可權。 + + + + Assign comics numbers + 分配漫畫編號 + + + + Assign numbers starting in: + 從以下位置開始分配編號: + + + + Invalid image + 圖片無效 + + + + The selected file is not a valid image. + 所選檔案不是有效影像。 + + + + Error saving cover + 儲存封面時發生錯誤 + + + + There was an error saving the cover image. + 儲存封面圖片時發生錯誤。 + + + + Error creating the library + 創建庫時出錯 + + + + Error updating the library + 更新庫時出錯 + + + + Error opening the library + 打開庫時出錯 + + + + Delete comics + 刪除漫畫 + + + + All the selected comics will be deleted from your disk. Are you sure? + 所有選定的漫畫都將從您的磁片中刪除。你確定嗎? + + + + Remove comics + 移除漫畫 + + + + Comics will only be deleted from the current label/list. Are you sure? + 漫畫只會從當前標籤/列表中刪除。 你確定嗎? + + + + Library name already exists + 庫名已存在 + + + + There is another library with the name '%1'. + 已存在另一個名為'%1'的庫。 + + + + LibraryWindowActions + + + Create a new library + 創建一個新的庫 + + + + Open an existing library + 打開現有的庫 + + + + + Export comics info + 導出漫畫資訊 + + + + + Import comics info + 導入漫畫資訊 + + + + Pack covers + 打包封面 + + + + Pack the covers of the selected library + 打包所選庫的封面 + + + + Unpack covers + 解壓封面 + + + + Unpack a catalog + 解壓目錄 + + + + Update library + 更新庫 + + + + Update current library + 更新當前庫 + + + + Rename library + 重命名庫 + + + + Rename current library + 重命名當前庫 + + + + Remove library + 移除庫 + + + + Remove current library from your collection + 從您的集合中移除當前庫 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 + + + + Show library info + 顯示圖書館資訊 + + + + Show information about the current library + 顯示當前庫的信息 + + + + Open current comic + 打開當前漫畫 + + + + Open current comic on YACReader + 用YACReader打開漫畫 + + + + Save selected covers to... + 選中的封面保存到... + + + + Save covers of the selected comics as JPG files + 保存所選的封面為jpg + + + + + Set as read + 設為已讀 + + + + Set comic as read + 漫畫設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set comic as unread + 漫畫設為未讀 + + + + + manga + 漫畫 + + + + Set issue as manga + 將問題設定為漫畫 + + + + + comic + 漫畫 + + + + Set issue as normal + 設置發行狀態為正常發行 + + + + western manga + 西方漫畫 + + + + Set issue as western manga + 將問題設定為西方漫畫 + + + + + web comic + 網路漫畫 + + + + Set issue as web comic + 將問題設定為網路漫畫 + + + + + yonkoma + 四科馬 + + + + Set issue as yonkoma + 將問題設定為 yonkoma + + + + Show/Hide marks + 顯示/隱藏標記 + + + + Show or hide read marks + 顯示或隱藏閱讀標記 + + + + Show/Hide recent indicator + 顯示/隱藏最近的指標 + + + + Show or hide recent indicator + 顯示或隱藏最近的指示器 + + + + + Fullscreen mode on/off + 全屏模式 開/關 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Add new folder + 添加新的檔夾 + + + + Add new folder to the current library + 在當前庫下添加新的檔夾 + + + + Delete folder + 刪除檔夾 + + + + Delete current folder from disk + 從磁片上刪除當前檔夾 + + + + Select root node + 選擇根節點 + + + + Expand all nodes + 展開所有節點 + + + + Collapse all nodes + 折疊所有節點 + + + + Show options dialog + 顯示選項對話框 + + + + Show comics server options dialog + 顯示漫畫伺服器選項對話框 + + + + + Change between comics views + 漫畫視圖之間的變化 + + + + Open folder... + 打開檔夾... + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + Open containing folder... + 打開包含檔夾... + + + + Reset comic rating + 重置漫畫評分 + + + + Select all comics + 全選漫畫 + + + + Edit + 編輯 + + + + Assign current order to comics + 將當前序號分配給漫畫 + + + + Update cover + 更新封面 + + + + Delete selected comics + 刪除所選的漫畫 + + + + Delete metadata from selected comics + 從選定的漫畫中刪除元數據 + + + + Download tags from Comic Vine + 從 Comic Vine 下載標籤 + + + + Focus search line + 聚焦於搜索行 + + + + Focus comics view + 聚焦於漫畫視圖 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &Quit + 退出(&Q) + + + + Update folder + 更新檔夾 + + + + Update current folder + 更新當前檔夾 + + + + Scan legacy XML metadata + 掃描舊版 XML 元數據 + + + + Add new reading list + 添加新的閱讀列表 + + + + Add a new reading list to the current library + 在當前庫添加新的閱讀列表 + + + + Remove reading list + 移除閱讀列表 + + + + Remove current reading list from the library + 從當前庫移除閱讀列表 + + + + Add new label + 添加新標籤 + + + + Add a new label to this library + 在當前庫添加標籤 + + + + Rename selected list + 重命名列表 + + + + Rename any selected labels or lists + 重命名任何選定的標籤或列表 + + + + Add to... + 添加到... + + + + Favorites + 收藏夾 + + + + Add selected comics to favorites list + 將所選漫畫添加到收藏夾列表 + + + + LocalComicListModel + + + file name + 檔案名 + + + + LogWindow + + Log window + 日誌窗口 + + + &Pause + 中止(&P) + + + &Save + 保存(&S) + + + C&lear + 清空(&l) + + + &Copy + 複製(&C) + + + Level: + 等級: + + + &Auto scroll + 自動滾動(&A) + + + + NoLibrariesWidget + + + You don't have any libraries yet + 你還沒有庫 + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>您可以在任何檔夾中創建庫,YACReaderLibrary將導入此檔夾中的所有漫畫和文件夾。如果已有庫,則可以打開它們。</p><p>您可以把YACReader當成獨立應用來閱讀電腦上的漫畫。</p> + + + + create your first library + 創建你的第一個庫 + + + + add an existing one + 添加一個現有庫 + + + + NoSearchResultsWidget + + + No results + 沒有結果 + + + + OptionsDialog + + + "Go to flow" size + 「前往 Comic Flow」大小 + + + + My comics path + 我的漫畫路徑 + + + + Background color + 背景顏色 + + + + Choose + 選擇 + + + + Quick Navigation Mode + 快速導航模式 + + + Disable mouse over activation 禁用滑鼠啟動 - - Restart is needed - 需要重啟 + + Scaling + 縮放 + + + + Scaling method + 縮放方法 + + + + Nearest (fast, low quality) + 最近(快速,低品質) + + + + Bilinear + 雙線性 + + + + Lanczos (better quality) + Lanczos(品質更好) + + + + + Restart is needed + 需要重啟 + + + + Brightness + 亮度 + + + + Display + 展示 + + + + Show time in current page information label + 在目前頁面資訊標籤中顯示時間 + + + + Scroll behaviour + 滾動效果 + + + + Disable scroll animations and smooth scrolling + 停用滾動動畫和平滑滾動 + + + + Do not turn page using scroll + 滾動時不翻頁 + + + + Use single scroll step to turn page + 使用單滾動步驟翻頁 + + + + Mouse mode + 滑鼠模式 + + + + Only Back/Forward buttons can turn pages + 只有後退/前進按鈕可以翻頁 + + + + Use the Left/Right buttons to turn pages. + 使用向左/向右按鈕翻頁。 + + + + Click left or right half of the screen to turn pages. + 點擊螢幕的左半部或右半部即可翻頁。 + + + + Contrast + 對比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 圖片選項 + + + + Fit options + 適應項 + + + + Enlarge images to fit width/height + 放大圖片以適應寬度/高度 + + + + Double Page options + 雙頁選項 + + + + Show covers as single page + 顯示封面為單頁 + + + + + General + 常規 + + + + + Libraries + + + + + Comic Flow + Comic Flow + + + + Grid view + 網格視圖 + + + + + Appearance + 外貌 + + + + + Language + 語言 + + + + + Application language + 應用程式語言 + + + + + System default + 系統預設 + + + + Tray icon settings (experimental) + 託盤圖示設置 (實驗特性) + + + + Close to tray + 關閉至託盤 + + + + Start into the system tray + 啟動至系統託盤 + + + + Edit Comic Vine API key + 編輯Comic Vine API 密匙 + + + + Comic Vine API key + Comic Vine API 密匙 + + + + ComicInfo.xml legacy support + ComicInfo.xml 遺留支持 + + + + Import metadata from ComicInfo.xml when adding new comics + 新增漫畫時從 ComicInfo.xml 匯入元數據 + + + + Consider 'recent' items added or updated since X days ago + 考慮自 X 天前新增或更新的「最近」項目 + + + + Third party reader + 第三方閱讀器 + + + + Write {comic_file_path} where the path should go in the command + 在命令中應將路徑寫入 {comic_file_path} + + + + + Clear + 清空 + + + + Update libraries at startup + 啟動時更新庫 + + + + Try to detect changes automatically + 嘗試自動偵測變化 + + + + Update libraries periodically + 定期更新庫 + + + + Interval: + 間隔: + + + + 30 minutes + 30分鐘 + + + + 1 hour + 1小時 + + + + 2 hours + 2小時 + + + + 4 hours + 4小時 + + + + 8 hours + 8小時 + + + + 12 hours + 12小時 + + + + daily + 日常的 + + + + Update libraries at certain time + 定時更新庫 + + + + Time: + 時間: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + 警告!在庫更新期間,將停用對資料庫的寫入! +當您可能正在積極使用應用程式時,請勿安排更新。 +在自動更新期間,應用程式將阻止某些操作,直到更新完成。 +若要停止自動更新,請點選庫標題旁的載入指示器。 + + + + Modifications detection + 修改檢測 + + + + Compare the modified date of files when updating a library (not recommended) + 更新庫時比較文件的修改日期(不建議) + + + + Enable background image + 啟用背景圖片 + + + + Opacity level + 透明度 + + + + Blur level + 模糊 + + + + Use selected comic cover as background + 使用選定的漫畫封面做背景 + + + + Restore defautls + 恢復默認值 + + + + Background + 背景 + + + + Display continue reading banner + 顯示繼續閱讀橫幅 + + + + Display current comic banner + 顯示目前漫畫橫幅 + + + + Continue reading + 繼續閱讀 + + + + Page Flow + 頁面流 + + + + Image adjustment + 圖像調整 + + + + + Options + 選項 + + + + Comics directory + 漫畫目錄 + + + + PropertiesDialog + + + General info + 基本資訊 + + + + Plot + 情節 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Notes + 筆記 + + + + Cover page + 封面 + + + + Load previous page as cover + 載入上一頁作為封面 + + + + Load next page as cover + 載入下一頁作為封面 + + + + Reset cover to the default image + 將封面重設為預設圖片 + + + + Load custom cover image + 載入自訂封面圖片 + + + + Series: + 系列: + + + + Title: + 標題: + + + + + + of: + 的: + + + + Issue number: + 發行數量: + + + + Volume: + 卷: + + + + Arc number: + 世界線數量: + + + + Story arc: + 故事線: + + + + alt. number: + 替代。數字: + + + + Alternate series: + 替代系列: + + + + Series Group: + 系列組: + + + + Genre: + 類型: + + + + Size: + 大小: + + + + Writer(s): + 作者: + + + + Penciller(s): + 線稿: + + + + Inker(s): + 墨稿: + + + + Colorist(s): + 上色: + + + + Letterer(s): + 文本: + + + + Cover Artist(s): + 封面設計: + + + + Editor(s): + 編輯: + + + + Imprint: + 印記: + + + + Day: + 日: + + + + Month: + 月: + + + + Year: + 年: + + + + Publisher: + 出版者: + + + + Format: + 格式: + + + + Color/BW: + 彩色/黑白: + + + + Age rating: + 年齡等級: + + + + Type: + 類型: + + + + Language (ISO): + 語言(ISO): + + + + Synopsis: + 概要: + + + + Characters: + 角色: + + + + Teams: + 團隊: + + + + Locations: + 地點: + + + + Main character or team: + 主要角色或團隊: + + + + Review: + 審查: + + + + Notes: + 筆記: + + + + Tags: + 標籤: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + + + + Not found + 未找到 + + + + Comic not found. You should update your library. + 未找到漫畫,請先更新您的庫. - - Brightness + + Edit comic information + 編輯漫畫資訊 + + + + Edit selected comics information + 編輯選中的漫畫資訊 + + + + Invalid cover + 封面無效 + + + + The image is invalid. + 該圖像無效。 + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的無頭(無 GUI)版本。 + +此應用程式支援持久性設置,要設定它們,請編輯此文件 %1 +若要了解可用設置,請查看文件:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + 7z lib not found + 未找到 7z 庫檔 + + + + unable to load 7z lib from ./utils + 無法從 ./utils 載入 7z 庫檔 + + + + Trace + 追蹤 + + + + Debug + 除錯 + + + + Info + 資訊 + + + + Warning + 警告 + + + + Error + 錯誤 + + + + Fatal + 嚴重錯誤 + + + + Select custom cover + 選擇自訂封面 + + + + Images (%1) + 圖片 (%1) + + + + The file could not be read or is not valid JSON. + 無法讀取該檔案或該檔案不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主題適用於 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 檔夾 + + + + Reading Lists + 閱讀列表 + + + + QsLogging::LogWindowModel + + Time + 時間 + + + Level + 等級 + + + Message + 資訊 + + + + QsLogging::Window + + &Pause + 中止(&P) + + + &Resume + 恢復(&R) + + + Save log + 保存日誌 + + + Log file (*.log) + 日誌檔 (*.log) + + + + RenameLibraryDialog + + + New Library Name : + 新庫名: + + + + Rename + 重命名 + + + + Cancel + 取消 + + + + Rename current library + 重命名當前庫 + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + 搜索結果: %1 + + + + + page %1 of %2 + 第 %1 頁 共 %2 頁 + + + + Number of %1 found : %2 + 第 %1 頁 共: %2 條 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SearchVolume + + + Please provide some additional information. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SelectComic + + + Please, select the right comic info. + 請正確選擇漫畫資訊. + + + + comics + 漫畫 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + comic description unavailable + 漫畫描述不可用 + + + + SelectVolume + + + Please, select the right series for your comic. + 請選擇正確的漫畫系列。 + + + + Filter: + 篩選: + + + + volumes + + + + + Nothing found, clear the filter if any. + 未找到任何內容,如果有,請清除過濾器。 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + volume description unavailable + 卷描述不可用 + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + 您正在嘗試同時獲取各種漫畫的資訊,它們是同一系列的嗎? + + + + yes + + + + + no + + + + + ServerConfigDialog + + + set port + 設置端口 + + + + Server connectivity information + 伺服器連接資訊 + + + + Scan it! + 掃一掃! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 適用於 iOS 和 Android 裝置。 <br/>發現它適用於 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> 或 <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>。 + + + + Choose an IP address + 選擇IP地址 + + + + Port + 端口 + + + + enable the server + 啟用伺服器 + + + + ShortcutsDialog + + YACReader keyboard shortcuts + YACReader 鍵盤快捷鍵 + + + Close + 關閉 + + + Keyboard Shortcuts + 鍵盤快捷鍵 + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + 請在左側對漫畫列表進行排序,直到它與漫畫的資訊相符。 + + + + sort comics to match comic information + 排序漫畫以匹配漫畫資訊 + + + + issues + 發行 + + + + remove selected comics + 移除所選漫畫 + + + + restore all removed comics + 恢復所有移除的漫畫 + + + + ThemeEditorDialog + + + Theme Editor + 主題編輯器 + + + + + + + + + + + - + - + + + + i + + + + + Expand all + 全部展開 + + + + Collapse all + 全部折疊 + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中閃爍所選值(洋紅色/切換/0↔10)。發布後恢復原樣。 + + + + Search… + 搜尋… + + + + Light 亮度 - - Display - + + Dark + 黑暗的 - - Show time in current page information label - + + ID: + ID: - - Scroll behaviour - 滾動效果 + + Display name: + 顯示名稱: - - Disable scroll animations and smooth scrolling - + + Variant: + 變體: + + + + Theme info + 主題訊息 + + + + Parameter + 範圍 + + + + Value + 價值 + + + + Save and apply + 儲存並應用 + + + + Export to file... + 匯出到文件... + + + + Load from file... + 從檔案載入... + + + + Close + 關閉 - - Do not turn page using scroll - 滾動時不翻頁 + + Double-click to edit color + 雙擊編輯顏色 - - Use single scroll step to turn page - 使用單滾動步驟翻頁 + + + + + + + true + 真的 - - Mouse mode - + + + + + false + 錯誤的 - - Only Back/Forward buttons can turn pages - + + Double-click to toggle + 按兩下切換 - - Use the Left/Right buttons to turn pages. - + + Double-click to edit value + 雙擊編輯值 - - Click left or right half of the screen to turn pages. - + + + + Edit: %1 + 編輯:%1 - - Contrast - 對比度 + + Save theme + 儲存主題 - - Gamma - Gamma值 + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) - - Reset - 重置 + + Save failed + 保存失敗 - - Image options - 圖片選項 + + Could not open file for writing: +%1 + 無法開啟文件進行寫入: +%1 - - Fit options - 適應項 + + Load theme + 載入主題 - - Enlarge images to fit width/height - 放大圖片以適應寬度/高度 + + + + Load failed + 載入失敗 - - Double Page options - 雙頁選項 + + Could not open file: +%1 + 無法開啟檔案: +%1 - - Show covers as single page - 顯示封面為單頁 + + Invalid JSON: +%1 + 無效的 JSON: +%1 - - General - 常規 + + Expected a JSON object. + 需要一個 JSON 物件。 + + + TitleHeader - - Page Flow - 頁面流 + + SEARCH + 搜索 + + + UpdateLibraryDialog - - Image adjustment - 圖像調整 + + Updating.... + 更新中... - - Options - 選項 + + Cancel + 取消 - - Comics directory - 漫畫目錄 + + Update library + 更新庫 - QObject + Viewer - - 7z lib not found - 未找到 7z 庫檔 + + + Press 'O' to open comic. + 按下 'O' 以打開漫畫. - - unable to load 7z lib from ./utils - 無法從 ./utils 載入 7z 庫檔 + + Not found + 未找到 - - Trace - 追蹤 + + Comic not found + 未找到漫畫 - - Debug - 除錯 + + Error opening comic + 打開漫畫時發生錯誤 - - Info - 資訊 + + CRC Error + CRC 校驗失敗 - - Warning - 警告 + + Loading...please wait! + 載入中... 請稍候! - - Error - 錯誤 + + Page not available! + 頁面不可用! - - Fatal - 嚴重錯誤 + + Cover! + 封面! - - Select custom cover - + + Last page! + 尾頁! + + + VolumeComicsModel - - Images (%1) - + + title + 標題 - QsLogging::LogWindowModel + VolumesModel - - Time - 時間 + + year + - - Level - 等級 + + issues + 發行 - - Message - 資訊 + + publisher + 出版者 - QsLogging::Window + YACReader3DFlowConfigWidget - - &Pause - 中止(&P) + + Presets: + 預設: - - &Resume - 恢復(&R) + + Classic look + 經典 - - Save log - 保存日誌 + + Stripe look + 條狀 - - Log file (*.log) - 日誌檔 (*.log) + + Overlapped Stripe look + 重疊條狀 - - - ShortcutsDialog - YACReader keyboard shortcuts - YACReader 鍵盤快捷鍵 + + Modern look + 現代 - Close - 關閉 + + Roulette look + 輪盤 - Keyboard Shortcuts - 鍵盤快捷鍵 + + Show advanced settings + 顯示高級選項 + + + + Custom: + 自定義: - - - Viewer - - - Press 'O' to open comic. - 按下 'O' 以打開漫畫. + + View angle + 視角 - - Not found - 未找到 + + Position + 位置 - - Comic not found - 未找到漫畫 + + Cover gap + 封面間距 - - Error opening comic - 打開漫畫時發生錯誤 + + Central gap + 中心間距 - - CRC Error - CRC 校驗失敗 + + Zoom + 縮放 - - Loading...please wait! - 載入中... 請稍候! + + Y offset + Y位移 - - Page not available! - 頁面不可用! + + Z offset + Z位移 - - Cover! - 封面! + + Cover Angle + 封面角度 - - Last page! - 尾頁! + + Visibility + 透明度 + + + + Light + 亮度 + + + + Max angle + 最大角度 + + + + Low Performance + 低性能 + + + + High Performance + 高性能 + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) + + + + Performance: + 性能: YACReader::MainWindowViewer - + &Open 打開(&O) - + Open a comic 打開漫畫 - + New instance 新建實例 - + Open Folder 打開檔夾 - + Open image folder 打開圖片檔夾 - + Open latest comic 打開最近的漫畫 - + Open the latest comic opened in the previous reading session 打開最近閱讀漫畫 - + Clear 清空 - + Clear open recent list 清空最近訪問列表 - + Save 保存 - + Save current page 保存當前頁面 @@ -557,285 +3230,296 @@ 上一個漫畫 - - - + + + Open previous comic 打開上一個漫畫 - + Next Comic 下一個漫畫 - - - + + + Open next comic 打開下一個漫畫 - + &Previous 上一頁(&P) - - - + + + Go to previous page 轉至上一頁 - + &Next 下一頁(&N) - - - + + + Go to next page 轉至下一頁 - + Fit Height 適應高度 - + Fit image to height 縮放圖片以適應高度 - + Fit Width 適合寬度 - + Fit image to width 縮放圖片以適應寬度 - + Show full size 顯示全尺寸 - + Fit to page 適應頁面 - + + Continuous scroll + 連續滾動 + + + + Switch to continuous scroll mode + 切換到連續滾動模式 + + + Reset zoom 重置縮放 - + Show zoom slider 顯示縮放滑塊 - + Zoom+ 放大 - + Zoom- 縮小 - + Rotate image to the left 向左旋轉圖片 - + Rotate image to the right 向右旋轉圖片 - + Double page mode 雙頁模式 - + Switch to double page mode 切換至雙頁模式 - + Double page manga mode 雙頁漫畫模式 - + Reverse reading order in double page mode 雙頁模式 (逆序閱讀) - + Go To 跳轉 - + Go to page ... 跳轉至頁面 ... - + Options 選項 - + YACReader options YACReader 選項 - - + + Help 幫助 - + Help, About YACReader 幫助, 關於 YACReader - + Magnifying glass 放大鏡 - + Switch Magnifying glass 切換放大鏡 - + Set bookmark 設置書簽 - + Set a bookmark on the current page 在當前頁面設置書簽 - + Show bookmarks 顯示書簽 - + Show the bookmarks of the current comic 顯示當前漫畫的書簽 - + Show keyboard shortcuts 顯示鍵盤快捷鍵 - + Show Info 顯示資訊 - + Close 關閉 - + Show Dictionary 顯示字典 - + Show go to flow - 顯示頁面流 + 顯示「前往 Comic Flow」 - + Edit shortcuts 編輯快捷鍵 - + &File 檔(&F) - - + + Open recent 最近打開的檔 - + File - + Edit 編輯 - + View 查看 - + Go 轉到 - + Window 窗口 - - - + + + Open Comic 打開漫畫 - - - + + + Comic files 漫畫檔 - + Open folder 打開檔夾 - + page_%1.jpg - page_%1.jpg + 頁_%1.jpg - + Image files (*.jpg) 圖像檔 (*.jpg) + Comics 漫畫 @@ -851,6 +3535,7 @@ 隱藏/顯示 工具欄 + General 常規 @@ -878,9 +3563,10 @@ Reset magnifying glass - + 重置放大鏡 + Magnifiying glass 放大鏡 @@ -888,115 +3574,134 @@ Toggle between fit to width and fit to height - 切換顯示為"適應寬度"或"適應高度" + 切換顯示為"適應寬度"或"適應高度" + Page adjustement 頁面調整 - + Autoscroll down 向下自動滾動 - + Autoscroll up 向上自動滾動 - + Autoscroll forward, horizontal first 向前自動滾動,水準優先 - + Autoscroll backward, horizontal first 向後自動滾動,水準優先 - + Autoscroll forward, vertical first 向前自動滾動,垂直優先 - + Autoscroll backward, vertical first 向後自動滾動,垂直優先 - + Move down 向下移動 - + Move up 向上移動 - + Move left 向左移動 - + Move right 向右移動 - + Go to the first page 轉到第一頁 - + Go to the last page 轉到最後一頁 - + Offset double page to the left - + 雙頁向左偏移 - + Offset double page to the right - + 雙頁向右偏移 - + + Reading 閱讀 - + There is a new version available 有新版本可用 - + Do you want to download the new version? 你要下載新版本嗎? - + Remind me in 14 days 14天後提醒我 - + Not now 現在不 + + YACReader::TrayIconController + + + &Restore + 複位(&R) + + + + Systray + 系統託盤 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + YACReader::WhatsNewDialog - Close - 關閉 + 關閉 @@ -1032,170 +3737,150 @@ YACReaderFlowConfigWidget - How to show covers: - 封面顯示方式: + 封面顯示方式: - CoverFlow look - 封面流 + 封面流 - Stripe look - 條狀 + 條狀 - Overlapped Stripe look - 重疊條狀 + 重疊條狀 YACReaderGLFlowConfigWidget - Presets: - 預設: + 預設: - Classic look - 經典 + 經典 - Stripe look - 條狀 + 條狀 - Overlapped Stripe look - 重疊條狀 + 重疊條狀 - Modern look - 現代 + 現代 - Roulette look - 輪盤 + 輪盤 - Show advanced settings - 顯示高級選項 + 顯示高級選項 - Custom: - 自定義: + 自定義: - View angle - 視角 + 視角 - Position - 位置 + 位置 - Cover gap - 封面間距 + 封面間距 - Central gap - 中心間距 + 中心間距 - Zoom - 縮放 + 縮放 - Y offset - Y位移 + Y位移 - Z offset - Z位移 + Z位移 - Cover Angle - 封面角度 + 封面角度 - Visibility - 透明度 + 透明度 - Light - 亮度 + 亮度 - Max angle - 最大角度 + 最大角度 - Low Performance - 低性能 + 低性能 - High Performance - 高性能 + 高性能 - Use VSync (improve the image quality in fullscreen mode, worse performance) - 使用VSync (在全屏模式下提高圖像品質, 性能更差) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) - Performance: - 性能: + 性能: YACReaderOptionsDialog - + Save 保存 - + Cancel 取消 - + Edit shortcuts 編輯快捷鍵 - + Shortcuts 快捷鍵 - Use hardware acceleration (restart needed) - 使用硬體加速 (需要重啟) + 使用硬體加速 (需要重啟) + + + + YACReaderSearchLineEdit + + + type to search + 搜索類型 @@ -1209,23 +3894,23 @@ YACReaderTranslator - + YACReader translator YACReader 翻譯 - - + + Translation 翻譯 - + clear 清空 - + Service not available 服務不可用 diff --git a/YACReaderLibrary/CMakeLists.txt b/YACReaderLibrary/CMakeLists.txt new file mode 100644 index 000000000..38faf04c8 --- /dev/null +++ b/YACReaderLibrary/CMakeLists.txt @@ -0,0 +1,558 @@ +# YACReaderLibrary - Comic Library Manager + +# --- library_common (shared with YACReaderLibraryServer) --- +add_library(library_common STATIC + library_creator.h + library_creator.cpp + package_manager.h + package_manager.cpp + bundle_creator.h + bundle_creator.cpp + initial_comic_info_extractor.h + initial_comic_info_extractor.cpp + xml_info_parser.h + xml_info_parser.cpp + xml_info_library_scanner.h + xml_info_library_scanner.cpp + yacreader_local_server.h + yacreader_local_server.cpp + comics_remover.h + comics_remover.cpp + yacreader_libraries.h + yacreader_libraries.cpp + comic_files_manager.h + comic_files_manager.cpp + ip_config_helper.h + ip_config_helper.cpp + libraries_update_coordinator.h + libraries_update_coordinator.cpp +) +target_include_directories(library_common PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/db +) +yacreader_apply_build_options(library_common) +target_link_libraries(library_common PUBLIC + Qt6::Core + Qt6::Core5Compat + Qt6::Network + Qt6::Sql + common_all + comic_backend + cbx_backend + db_helper + QsLog +) + +# --- db_helper (database layer, shared with YACReaderLibraryServer) --- +add_library(db_helper STATIC + db_helper.h + db_helper.cpp + db/data_base_management.h + db/data_base_management.cpp + db/reading_list.h + db/reading_list.cpp + db/query_lexer.h + db/query_lexer.cpp + db/query_parser.h + db/query_parser.cpp + db/search_query.h + db/search_query.cpp +) +target_include_directories(db_helper PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/db +) +yacreader_apply_build_options(db_helper) +target_link_libraries(db_helper PUBLIC + Qt6::Core + Qt6::Sql + common_all + QsLog +) + +# When BUILD_SERVER_STANDALONE=ON, only library_common and db_helper are built. +# The full YACReaderLibrary GUI app requires Qt6::Widgets and other full-build components. +if(NOT BUILD_SERVER_STANDALONE) + +# --- YACReaderLibrary executable --- +qt_add_executable(YACReaderLibrary WIN32 + main.cpp + library_window.h + library_window.cpp + library_window_actions.h + library_window_actions.cpp + create_library_dialog.h + create_library_dialog.cpp + add_library_dialog.h + add_library_dialog.cpp + rename_library_dialog.h + rename_library_dialog.cpp + properties_dialog.h + properties_dialog.cpp + options_dialog.h + options_dialog.cpp + export_library_dialog.h + export_library_dialog.cpp + import_library_dialog.h + import_library_dialog.cpp + export_comics_info_dialog.h + export_comics_info_dialog.cpp + import_comics_info_dialog.h + import_comics_info_dialog.cpp + server_config_dialog.h + server_config_dialog.cpp + comic_flow_widget.h + comic_flow_widget.cpp + no_libraries_widget.h + no_libraries_widget.cpp + import_widget.h + import_widget.cpp + trayicon_controller.h + trayicon_controller.cpp + yacreader_content_views_manager.h + yacreader_content_views_manager.cpp + yacreader_main_toolbar.h + yacreader_main_toolbar.cpp + comics_view.h + comics_view.cpp + comics_view_transition.h + comics_view_transition.cpp + classic_comics_view.h + classic_comics_view.cpp + grid_comics_view.h + grid_comics_view.cpp + no_search_results_widget.h + no_search_results_widget.cpp + folder_content_view.h + folder_content_view.cpp + recent_visibility_coordinator.h + recent_visibility_coordinator.cpp + library_comic_opener.h + library_comic_opener.cpp + db/comic_query_result_processor.h + db/comic_query_result_processor.cpp + db/folder_query_result_processor.h + db/folder_query_result_processor.cpp + db/folder_item.h + db/folder_item.cpp + db/folder_model.h + db/folder_model.cpp + db/comic_model.h + db/comic_model.cpp + db/comic_item.h + db/comic_item.cpp + db/reading_list_model.h + db/reading_list_model.cpp + db/reading_list_item.h + db/reading_list_item.cpp + yacreader_folders_view.h + yacreader_folders_view.cpp + yacreader_reading_lists_view.h + yacreader_reading_lists_view.cpp + add_label_dialog.h + add_label_dialog.cpp + yacreader_history_controller.h + yacreader_history_controller.cpp + yacreader_navigation_controller.h + yacreader_navigation_controller.cpp + empty_label_widget.h + empty_label_widget.cpp + empty_folder_widget.h + empty_folder_widget.cpp + empty_container_info.h + empty_container_info.cpp + empty_special_list.h + empty_special_list.cpp + empty_reading_list_widget.h + empty_reading_list_widget.cpp + info_comics_view.h + info_comics_view.cpp + yacreader_comics_selection_helper.h + yacreader_comics_selection_helper.cpp + yacreader_comic_info_helper.h + yacreader_comic_info_helper.cpp + current_comic_view_helper.h + current_comic_view_helper.cpp + # App-specific themes + shared theme_manager (depends on app theme.h) + themes/theme.h + themes/theme_factory.h + themes/theme_factory.cpp + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.h + ${PROJECT_SOURCE_DIR}/common/themes/theme_manager.cpp +) +yacreader_apply_build_options(YACReaderLibrary) + +# macOS-specific sources +if(APPLE) + target_sources(YACReaderLibrary PRIVATE + trayhandler.h + trayhandler.mm + ) +endif() + +target_include_directories(YACReaderLibrary PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/db + ${CMAKE_CURRENT_SOURCE_DIR}/themes +) + +target_compile_definitions(YACReaderLibrary PRIVATE + SERVER_RELEASE + YACREADER_LIBRARY +) + +# Resources +set(yacreaderlibrary_image_files + ${PROJECT_SOURCE_DIR}/images/shortcuts/accept_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/clear_shortcut.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/downArrow.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/nextPage.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/previousPage.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/radioChecked.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/radioUnchecked.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/rowDown.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/rowUp.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/upArrow.svg + ${PROJECT_SOURCE_DIR}/images/comic_vine/checkBoxTick.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/asignNumber.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/big_size_grid_zoom.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/editComic.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/getInfo.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/hideComicFlow.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/openInYACReader.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/selectAll.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setReadButton.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setUnread.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/showMarks.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/small_size_grid_zoom.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/trash.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/show_comic_info.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setManga.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/setNormal.svg + ${PROJECT_SOURCE_DIR}/images/comics_view_toolbar/showRecentIndicator.svg + ${PROJECT_SOURCE_DIR}/images/defaultCover.png + ${PROJECT_SOURCE_DIR}/images/library_dialogs/edit.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_current_readings.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_favorites.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_folder.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_label.svg + ${PROJECT_SOURCE_DIR}/images/empty_container/empty_reading_list.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/exportComicsInfo.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/exportLibrary.svg + ${PROJECT_SOURCE_DIR}/images/find_folder.svg + ${PROJECT_SOURCE_DIR}/images/flow1.png + ${PROJECT_SOURCE_DIR}/images/flow2.png + ${PROJECT_SOURCE_DIR}/images/flow3.png + ${PROJECT_SOURCE_DIR}/images/flow4.png + ${PROJECT_SOURCE_DIR}/images/flow5.png + ${PROJECT_SOURCE_DIR}/images/glowLine.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/loadCustomCover.svg + ${PROJECT_SOURCE_DIR}/images/import/coversToggle.svg + ${PROJECT_SOURCE_DIR}/images/icon-new.svg + ${PROJECT_SOURCE_DIR}/images/iconLibrary.png + ${PROJECT_SOURCE_DIR}/images/import/importBottomCoversDecoration.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/importComicsInfo.svg + ${PROJECT_SOURCE_DIR}/images/import/importingIcon.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/importLibrary.svg + ${PROJECT_SOURCE_DIR}/images/import/importTopCoversDecoration.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/back.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/forward.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/settings.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/server.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/help.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/fullscreen.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/flow.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/grid.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/info.svg + ${PROJECT_SOURCE_DIR}/images/main_toolbar/divider.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/editIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/exportComicsInfoIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/exportLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/importComicsInfoIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/importLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/removeLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/updateLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/open_containing_folder.svg + ${PROJECT_SOURCE_DIR}/images/menus_icons/update_current_folder.svg + ${PROJECT_SOURCE_DIR}/images/library_dialogs/new.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/nextCoverPage.svg + ${PROJECT_SOURCE_DIR}/images/noLibrariesIcon.svg + ${PROJECT_SOURCE_DIR}/images/noLibrariesLine.svg + ${PROJECT_SOURCE_DIR}/images/notCover.png + ${PROJECT_SOURCE_DIR}/images/library_dialogs/openLibrary.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/previousCoverPage.svg + ${PROJECT_SOURCE_DIR}/images/readingRibbon.svg + ${PROJECT_SOURCE_DIR}/images/readRibbon.svg + ${PROJECT_SOURCE_DIR}/images/metadata_dialog/resetCover.svg + ${PROJECT_SOURCE_DIR}/images/search_result.svg + ${PROJECT_SOURCE_DIR}/images/serverConfigBackground.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_comics.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_folders.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_general.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_libraries.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_mglass.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_page.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_reading.svg + ${PROJECT_SOURCE_DIR}/images/shortcuts/shortcuts_group_visualization.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/libraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/setRoot.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/expand.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/colapse.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/newLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/openLibraryIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/addNew_sidebar.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/delete_sidebar.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/addLabelIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/renameListIcon.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/branch-closed.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/branch-open.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/folder.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/folder_finished.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/folder_read_overlay.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/libraryIconSelected.svg + ${PROJECT_SOURCE_DIR}/images/sidebar/libraryOptions.svg + ${PROJECT_SOURCE_DIR}/images/import/updatingIcon.svg + ${PROJECT_SOURCE_DIR}/images/custom_dialog/custom_close_button.svg + ${PROJECT_SOURCE_DIR}/images/whats_new/whatsnew_header.svg + ${PROJECT_SOURCE_DIR}/images/lists/default_0.svg + ${PROJECT_SOURCE_DIR}/images/lists/default_1.svg + ${PROJECT_SOURCE_DIR}/images/lists/default_2.svg + ${PROJECT_SOURCE_DIR}/images/lists/label_template.svg + ${PROJECT_SOURCE_DIR}/images/lists/list.svg + ${PROJECT_SOURCE_DIR}/images/clearSearchNew.svg + ${PROJECT_SOURCE_DIR}/images/iconSearchNew.svg +) +set(yacreaderlibrary_file_files + ${PROJECT_SOURCE_DIR}/files/about.html + ${PROJECT_SOURCE_DIR}/files/helpYACReaderLibrary.html +) +set(yacreaderlibrary_file_files_es + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + ${PROJECT_SOURCE_DIR}/files/helpYACReaderLibrary_es_ES.html +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/about_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "about.html" +) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/files/helpYACReaderLibrary_es_ES.html + PROPERTIES QT_RESOURCE_ALIAS "helpYACReaderLibrary.html" +) +set(yacreaderlibrary_qml_files + ${CMAKE_CURRENT_SOURCE_DIR}/qml/GridComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FolderContentView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FlowView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoTick.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoFavorites.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoRating.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/tick.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/reading.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/star.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/page.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-indicator.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-shadow.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-top-shadow.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/ComicInfoView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-favorites.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-rating.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-tag.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/info-tick.svg + ${CMAKE_CURRENT_SOURCE_DIR}/qml/prerendered_cover_shadow.png +) +set(yacreaderlibrary_qml_translation_files + ${CMAKE_CURRENT_SOURCE_DIR}/qml/GridComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FolderContentView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/FlowView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoTick.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoFavorites.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoRating.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/InfoComicsView.qml + ${CMAKE_CURRENT_SOURCE_DIR}/qml/ComicInfoView.qml +) +set(yacreaderlibrary_theme_files + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_classic.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light4.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_light5.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark1.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark2.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark3.json + ${CMAKE_CURRENT_SOURCE_DIR}/themes/builtin_dark4.json +) +set(yacreaderlibrary_common_theme_image_files + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-system.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-light.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-dark.svg + ${PROJECT_SOURCE_DIR}/images/appearance_config/theme-mode-custom.svg +) + +qt_add_resources(YACReaderLibrary "yacreaderlibrary_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_image_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_files" + PREFIX "/files" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreaderlibrary_file_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_files_es" + PREFIX "/files" + LANG "es_ES" + BASE "${PROJECT_SOURCE_DIR}/files" + FILES + ${yacreaderlibrary_file_files_es} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_qml" + PREFIX "/" + BASE "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_qml_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_themes" + PREFIX "/themes" + BASE "${CMAKE_CURRENT_SOURCE_DIR}/themes" + FILES + ${yacreaderlibrary_theme_files} +) +qt_add_resources(YACReaderLibrary "yacreaderlibrary_common_theme_images" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_common_theme_image_files} +) +if(WIN32 OR (UNIX AND NOT APPLE)) + set(yacreaderlibrary_windows_resource_files + ${PROJECT_SOURCE_DIR}/images/viewer_toolbar/close.svg + ${CMAKE_CURRENT_SOURCE_DIR}/icon.ico + ) + set_source_files_properties( + ${CMAKE_CURRENT_SOURCE_DIR}/icon.ico + PROPERTIES QT_RESOURCE_ALIAS "icon.ico" + ) + qt_add_resources(YACReaderLibrary "yacreaderlibrary_windows_resources" + PREFIX "/" + BASE "${PROJECT_SOURCE_DIR}" + FILES + ${yacreaderlibrary_windows_resource_files} + ) +endif() +if(APPLE) + qt_add_resources(YACReaderLibrary "yacreaderlibrary_macos_resources" + PREFIX "/" + BASE "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/macostrayicon.svg + ) +endif() + +# Translations +qt_add_translations(YACReaderLibrary + SOURCE_TARGETS + YACReaderLibrary + # Keep full C++ extraction via SOURCE_TARGETS and add the QML files directly + # so qsTr() strings in QML are collected too. + TS_FILES + yacreaderlibrary_es.ts + yacreaderlibrary_ru.ts + yacreaderlibrary_pt.ts + yacreaderlibrary_fr.ts + yacreaderlibrary_nl.ts + yacreaderlibrary_tr.ts + yacreaderlibrary_de.ts + yacreaderlibrary_zh_CN.ts + yacreaderlibrary_zh_TW.ts + yacreaderlibrary_zh_HK.ts + yacreaderlibrary_it.ts + yacreaderlibrary_source.ts + yacreaderlibrary_en.ts + SOURCES + ${yacreaderlibrary_qml_translation_files} +) + +target_link_libraries(YACReaderLibrary PRIVATE + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Network + Qt6::Widgets + Qt6::Sql + Qt6::Svg + Qt6::Quick + Qt6::Qml + Qt6::QuickWidgets + Qt6::QuickControls2 + Qt6::Core5Compat + library_common + db_helper + comic_backend + common_gui + rhi_flow_library + custom_widgets_library + shortcuts_library + server + comic_vine + cbx_backend + concurrent_queue + worker + QsLog + QrCode + KDSignalThrottler +) + +# Platform-specific +if(WIN32) + target_sources(YACReaderLibrary PRIVATE icon.rc) + target_link_libraries(YACReaderLibrary PRIVATE oleaut32 ole32 shell32 user32) +endif() + +if(APPLE) + target_sources(YACReaderLibrary PRIVATE YACReaderLibrary.icns) + set_source_files_properties(YACReaderLibrary.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + set_target_properties(YACReaderLibrary PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist" + MACOSX_BUNDLE_GUI_IDENTIFIER "com.yacreader.YACReaderLibrary" + MACOSX_BUNDLE_BUNDLE_NAME "YACReaderLibrary" + ) + target_link_libraries(YACReaderLibrary PRIVATE + "-framework Foundation" + "-framework ApplicationServices" + "-framework AppKit" + ) +endif() + +# Linux install +if(UNIX AND NOT APPLE) + target_compile_definitions(YACReaderLibrary PRIVATE + "LIBDIR=\"${CMAKE_INSTALL_FULL_LIBDIR}\"" + "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"" + "BINDIR=\"${CMAKE_INSTALL_FULL_BINDIR}\"") + + install(TARGETS YACReaderLibrary RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReaderLibrary.1" + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReaderLibrary.desktop" + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install(FILES + "${PROJECT_SOURCE_DIR}/YACReaderLibrary.svg" + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps) + + # Server web files (for bundled server mode) + if(NOT BUILD_SERVER_STANDALONE) + install(DIRECTORY "${PROJECT_SOURCE_DIR}/release/server" + DESTINATION ${CMAKE_INSTALL_DATADIR}/yacreader) + endif() +endif() + +endif() # NOT BUILD_SERVER_STANDALONE (YACReaderLibrary executable) diff --git a/YACReaderLibrary/Info.plist b/YACReaderLibrary/Info.plist index 3c9f79f70..44a203e8c 100644 --- a/YACReaderLibrary/Info.plist +++ b/YACReaderLibrary/Info.plist @@ -12,8 +12,6 @@ ???? CFBundleExecutable YACReaderLibrary - NSRequiresAquaSystemAppearance - CFBundleIdentifier com.yacreader.YACReaderLibrary NOTE diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro deleted file mode 100644 index 2330a7825..000000000 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ /dev/null @@ -1,367 +0,0 @@ -TEMPLATE = app -TARGET = YACReaderLibrary - -QMAKE_TARGET_BUNDLE_PREFIX = "com.yacreader" - -DEPENDPATH += . -INCLUDEPATH += . \ - ../common \ - ./server \ - ./db \ - ../custom_widgets \ - ./comic_vine \ - ./comic_vine/model - -DEFINES += SERVER_RELEASE YACREADER_LIBRARY - -# load default build flags -include (../config.pri) -include (../dependencies/pdf_backend.pri) - -INCLUDEPATH += ../common/gl - -# there are two builds for Windows, Desktop OpenGL based and ANGLE OpenGL ES based -win32 { - CONFIG(force_angle) { - message("using ANGLE") - LIBS += -loleaut32 -lole32 -lshell32 -lopengl32 -luser32 - # linking extra libs are necesary for a successful compilation, a better approach should be - # to remove any OpenGL (desktop) dependencies - # the OpenGL stuff should be migrated to OpenGL ES - DEFINES += FORCE_ANGLE - } else { - LIBS += -loleaut32 -lole32 -lshell32 -lopengl32 -luser32 - } - - msvc { - QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT /GL - QMAKE_LFLAGS_RELEASE += /LTCG - } - CONFIG -= embed_manifest_exe -} - -CONFIG(force_angle) { - contains(QMAKE_TARGET.arch, x86_64) { - Release:DESTDIR = ../release64_angle - Debug:DESTDIR = ../debug64_angle - } else { - Release:DESTDIR = ../release_angle - Debug:DESTDIR = ../debug_angle - } -} else { - contains(QMAKE_TARGET.arch, x86_64) { - Release:DESTDIR = ../release64 - Debug:DESTDIR = ../debug64 - } else { - Release:DESTDIR = ../release - Debug:DESTDIR = ../debug - } -} - -macx { - LIBS += -framework Foundation -framework ApplicationServices -framework AppKit - CONFIG += objective_c - QT += gui-private - lessThan(QT_MAJOR_VERSION, 6): QT += macextras -} - -#CONFIG += release -CONFIG -= flat -QT += sql network widgets svg quickcontrols2 - -greaterThan(QT_MAJOR_VERSION, 5): QT += openglwidgets core5compat - -# Input -HEADERS += comic_flow.h \ - ../common/concurrent_queue.h \ - ../common/cover_utils.h \ - create_library_dialog.h \ - db/comic_query_result_processor.h \ - db/folder_query_result_processor.h \ - db/query_lexer.h \ - db/search_query.h \ - folder_content_view.h \ - initial_comic_info_extractor.h \ - libraries_update_coordinator.h \ - library_comic_opener.h \ - library_creator.h \ - library_window.h \ - add_library_dialog.h \ - library_window_actions.h \ - recent_visibility_coordinator.h \ - rename_library_dialog.h \ - properties_dialog.h \ - options_dialog.h \ - export_library_dialog.h \ - import_library_dialog.h \ - package_manager.h \ - bundle_creator.h \ - export_comics_info_dialog.h \ - import_comics_info_dialog.h \ - server_config_dialog.h \ - comic_flow_widget.h \ - db_helper.h \ - ./db/data_base_management.h \ - ./db/folder_item.h \ - ./db/folder_model.h \ - ./db/comic_model.h \ - ./db/comic_item.h \ - ../common/comic_db.h \ - ../common/folder.h \ - ../common/library_item.h \ - ../common/comic.h \ - ../common/bookmarks.h \ - ../common/pictureflow.h \ - ../common/release_acquire_atomic.h \ - ../common/worker_thread.h \ - ../common/custom_widgets.h \ - ../common/qnaturalsorting.h \ - ../common/yacreader_global.h \ - ../common/yacreader_global_gui.h \ - ../common/pdf_comic.h \ - no_libraries_widget.h \ - import_widget.h \ - trayicon_controller.h \ - xml_info_library_scanner.h \ - xml_info_parser.h \ - yacreader_content_views_manager.h \ - yacreader_local_server.h \ - yacreader_main_toolbar.h \ - comics_remover.h \ - ../common/http_worker.h \ - yacreader_libraries.h \ - ../common/exit_check.h \ - comics_view.h \ - classic_comics_view.h \ - empty_folder_widget.h \ - no_search_results_widget.h \ - comic_files_manager.h \ - db/reading_list_model.h \ - db/reading_list_item.h \ - yacreader_folders_view.h \ - yacreader_reading_lists_view.h \ - add_label_dialog.h \ - yacreader_history_controller.h \ - yacreader_navigation_controller.h \ - empty_label_widget.h \ - empty_container_info.h \ - empty_special_list.h \ - empty_reading_list_widget.h \ - ../common/scroll_management.h \ - ../common/opengl_checker.h \ - info_comics_view.h \ - yacreader_comics_selection_helper.h \ - yacreader_comic_info_helper.h \ - db/reading_list.h \ - db/query_parser.h \ - current_comic_view_helper.h \ - ip_config_helper.h \ - ../common/global_info_provider.h \ - -!CONFIG(no_opengl) { - HEADERS += ../common/gl/yacreader_flow_gl.h -} - -SOURCES += comic_flow.cpp \ - ../common/concurrent_queue.cpp \ - ../common/cover_utils.cpp \ - create_library_dialog.cpp \ - db/comic_query_result_processor.cpp \ - db/folder_query_result_processor.cpp \ - db/query_lexer.cpp \ - db/search_query.cpp \ - folder_content_view.cpp \ - initial_comic_info_extractor.cpp \ - libraries_update_coordinator.cpp \ - library_comic_opener.cpp \ - library_creator.cpp \ - library_window.cpp \ - library_window_actions.cpp \ - main.cpp \ - add_library_dialog.cpp \ - recent_visibility_coordinator.cpp \ - rename_library_dialog.cpp \ - properties_dialog.cpp \ - options_dialog.cpp \ - export_library_dialog.cpp \ - import_library_dialog.cpp \ - package_manager.cpp \ - bundle_creator.cpp \ - export_comics_info_dialog.cpp \ - import_comics_info_dialog.cpp \ - server_config_dialog.cpp \ - comic_flow_widget.cpp \ - db_helper.cpp \ - ./db/data_base_management.cpp \ - ./db/folder_item.cpp \ - ./db/folder_model.cpp \ - ./db/comic_model.cpp \ - ./db/comic_item.cpp \ - ../common/comic_db.cpp \ - ../common/folder.cpp \ - ../common/library_item.cpp \ - ../common/comic.cpp \ - ../common/bookmarks.cpp \ - ../common/pictureflow.cpp \ - ../common/custom_widgets.cpp \ - ../common/qnaturalsorting.cpp \ - no_libraries_widget.cpp \ - import_widget.cpp \ - trayicon_controller.cpp \ - xml_info_library_scanner.cpp \ - xml_info_parser.cpp \ - yacreader_content_views_manager.cpp \ - yacreader_local_server.cpp \ - yacreader_main_toolbar.cpp \ - comics_remover.cpp \ - ../common/http_worker.cpp \ - ../common/yacreader_global.cpp \ - ../common/yacreader_global_gui.cpp \ - yacreader_libraries.cpp \ - ../common/exit_check.cpp \ - comics_view.cpp \ - classic_comics_view.cpp \ - empty_folder_widget.cpp \ - no_search_results_widget.cpp \ - comic_files_manager.cpp \ - db/reading_list_model.cpp \ - db/reading_list_item.cpp \ - yacreader_folders_view.cpp \ - yacreader_reading_lists_view.cpp \ - add_label_dialog.cpp \ - yacreader_history_controller.cpp \ - yacreader_navigation_controller.cpp \ - empty_label_widget.cpp \ - empty_container_info.cpp \ - empty_special_list.cpp \ - empty_reading_list_widget.cpp \ - ../common/scroll_management.cpp \ - ../common/opengl_checker.cpp \ - info_comics_view.cpp \ - yacreader_comics_selection_helper.cpp \ - yacreader_comic_info_helper.cpp\ - db/reading_list.cpp \ - current_comic_view_helper.cpp \ - db/query_parser.cpp \ - ip_config_helper.cpp \ - ../common/global_info_provider.cpp \ - -!CONFIG(no_opengl) { - SOURCES += ../common/gl/yacreader_flow_gl.cpp -} - -macx { - HEADERS += trayhandler.h - OBJECTIVE_SOURCES += trayhandler.mm -} - -include(./server/server.pri) -include(../custom_widgets/custom_widgets_yacreaderlibrary.pri) - -CONFIG(7zip){ -include(../compressed_archive/wrapper.pri) -} else:CONFIG(unarr) { -include(../compressed_archive/unarr/unarr-wrapper.pri) -} else:CONFIG(libarchive) { -include(../compressed_archive/libarchive/libarchive-wrapper.pri) -} else { - error(No compression backend specified. Did you mess with the build system?) -} - -include(./comic_vine/comic_vine.pri) -include(../third_party/QsLog/QsLog.pri) -include(../shortcuts_management/shortcuts_management.pri) -include(../third_party/QrCode/QrCode.pri) -include(../third_party/KDToolBox/KDToolBox.pri) - -RESOURCES += images.qrc files.qrc -win32:RESOURCES += images_win.qrc -unix:!macx:RESOURCES += images_win.qrc -macx:RESOURCES += images_osx.qrc - -RC_FILE = icon.rc - -macx { - ICON = YACReaderLibrary.icns - QMAKE_INFO_PLIST = Info.plist -} - -TRANSLATIONS = yacreaderlibrary_es.ts \ - yacreaderlibrary_ru.ts \ - yacreaderlibrary_pt.ts \ - yacreaderlibrary_fr.ts \ - yacreaderlibrary_nl.ts \ - yacreaderlibrary_tr.ts \ - yacreaderlibrary_de.ts \ - yacreaderlibrary_zh_CN.ts \ - yacreaderlibrary_zh_TW.ts \ - yacreaderlibrary_zh_HK.ts \ - yacreaderlibrary_it.ts \ - yacreaderlibrary_en.ts - -CONFIG += lrelease - -win32 { - CONFIG(release, debug|release) { - SOURCE_QM_DIR = $$OUT_PWD/release/*.qm - } - CONFIG(debug, debug|release) { - SOURCE_QM_DIR = $$OUT_PWD/debug/*.qm - } - - DEPLOYMENT_OUT_QM_DIR = ../release/languages/ - OUT_QM_DIR = $${DESTDIR}/languages/ - - QMAKE_POST_LINK += $(MKDIR) $$shell_path($${OUT_QM_DIR}) 2> NULL & \ - $(COPY) $$shell_path($${SOURCE_QM_DIR}) $$shell_path($${OUT_QM_DIR}) & \ - $(MKDIR) $$shell_path($${DEPLOYMENT_OUT_QM_DIR}) 2> NULL & \ - $(COPY) $$shell_path($${SOURCE_QM_DIR}) $$shell_path($${DEPLOYMENT_OUT_QM_DIR}) -} else { - LRELEASE_DIR = ../release/languages/ - QM_FILES_INSTALL_PATH = $$DATADIR/yacreader/languages -} - -#QML/GridView -QT += quick qml quickwidgets - -HEADERS += grid_comics_view.h \ - comics_view_transition.h - -SOURCES += grid_comics_view.cpp \ - comics_view_transition.cpp - -greaterThan(QT_MAJOR_VERSION, 5) { - RESOURCES += qml6.qrc -} else { - RESOURCES += qml.qrc -} -win32:RESOURCES += qml_win.qrc -unix:!macx:RESOURCES += qml_win.qrc -macx:RESOURCES += qml_osx.qrc - -unix:!macx { - -DEFINES += "LIBDIR=\\\"$$LIBDIR\\\"" "DATADIR=\\\"$$DATADIR\\\"" "BINDIR=\\\"$$BINDIR\\\"" - -#MAKE INSTALL -INSTALLS += bin icon desktop server manpage - -bin.path = $$BINDIR -isEmpty(DESTDIR) { - bin.files = YACReaderLibrary -} else { - bin.files = $$DESTDIR/YACReaderLibrary -} - -server.path = $$DATADIR/yacreader -server.files = ../release/server - -icon.path = $$DATADIR/icons/hicolor/scalable/apps -icon.files = ../YACReaderLibrary.svg - -desktop.path = $$DATADIR/applications -desktop.files = ../YACReaderLibrary.desktop - -manpage.path = $$DATADIR/man/man1 -manpage.files = ../YACReaderLibrary.1 -} diff --git a/YACReaderLibrary/add_label_dialog.cpp b/YACReaderLibrary/add_label_dialog.cpp index 18f3f9ed7..b8399a847 100644 --- a/YACReaderLibrary/add_label_dialog.cpp +++ b/YACReaderLibrary/add_label_dialog.cpp @@ -1,5 +1,25 @@ #include "add_label_dialog.h" +#include +#include + +namespace { +const char *labelColorNames[] = { + QT_TR_NOOP("red"), + QT_TR_NOOP("orange"), + QT_TR_NOOP("yellow"), + QT_TR_NOOP("green"), + QT_TR_NOOP("cyan"), + QT_TR_NOOP("blue"), + QT_TR_NOOP("violet"), + QT_TR_NOOP("purple"), + QT_TR_NOOP("pink"), + QT_TR_NOOP("white"), + QT_TR_NOOP("light"), + QT_TR_NOOP("dark") +}; +} + AddLabelDialog::AddLabelDialog(QWidget *parent) : QDialog(parent) { @@ -11,21 +31,10 @@ AddLabelDialog::AddLabelDialog(QWidget *parent) layout->addWidget(new QLabel(tr("Choose a color:"))); layout->addWidget(list = new QListWidget()); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_red.svg"), tr("red"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_orange.svg"), tr("orange"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_yellow.svg"), tr("yellow"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_green.svg"), tr("green"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_cyan.svg"), tr("cyan"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_blue.svg"), tr("blue"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_violet.svg"), tr("violet"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_purple.svg"), tr("purple"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_pink.svg"), tr("pink"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_white.svg"), tr("white"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_light.svg"), tr("light"))); - list->addItem(new QListWidgetItem(QIcon(":/images/lists/label_dark.svg"), tr("dark"))); - - QColor backgroundColor = this->palette().window().color(); - list->setStyleSheet(QString("QListWidget {border : none; background-color: rgb(%1,%2,%3);}").arg(backgroundColor.red()).arg(backgroundColor.green()).arg(backgroundColor.blue())); + for (const auto &colorName : labelColorNames) { + list->addItem(new QListWidgetItem(tr(colorName))); + } + list->setMinimumHeight(225); setModal(true); @@ -50,6 +59,22 @@ AddLabelDialog::AddLabelDialog(QWidget *parent) connect(edit, &QLineEdit::textChanged, this, &AddLabelDialog::validateName); connect(cancelButton, &QAbstractButton::clicked, this, &QWidget::close); connect(acceptButton, &QAbstractButton::clicked, this, &QDialog::accept); + + initTheme(this); +} + +void AddLabelDialog::applyTheme(const Theme &theme) +{ + const auto &icons = theme.readingListIcons.labelIcons; + + for (int i = 0; i < list->count(); ++i) { + const QString colorName = labelColorNames[i]; + if (icons.contains(colorName)) { + list->item(i)->setIcon(icons[colorName]); + } + } + + list->setStyleSheet("QListWidget {border : none;}"); } YACReader::LabelColors AddLabelDialog::selectedColor() diff --git a/YACReaderLibrary/add_label_dialog.h b/YACReaderLibrary/add_label_dialog.h index f18351be8..54a64fe9a 100644 --- a/YACReaderLibrary/add_label_dialog.h +++ b/YACReaderLibrary/add_label_dialog.h @@ -1,11 +1,15 @@ #ifndef ADD_LABEL_DIALOG_H #define ADD_LABEL_DIALOG_H -#include - +#include "themable.h" #include "yacreader_global.h" -class AddLabelDialog : public QDialog +#include +#include +#include +#include + +class AddLabelDialog : public QDialog, protected Themable { Q_OBJECT public: @@ -21,6 +25,8 @@ protected slots: void validateName(const QString &name); protected: + void applyTheme(const Theme &theme) override; + QLineEdit *edit; QListWidget *list; diff --git a/YACReaderLibrary/add_library_dialog.cpp b/YACReaderLibrary/add_library_dialog.cpp index 80c2e8a1b..557cf5287 100644 --- a/YACReaderLibrary/add_library_dialog.cpp +++ b/YACReaderLibrary/add_library_dialog.cpp @@ -1,9 +1,9 @@ #include "add_library_dialog.h" -#include -#include #include #include +#include +#include AddLibraryDialog::AddLibraryDialog(QWidget *parent) : QDialog(parent) @@ -30,7 +30,7 @@ void AddLibraryDialog::setupUI() cancel = new QPushButton(tr("Cancel")); connect(cancel, &QPushButton::clicked, this, &AddLibraryDialog::close); - find = new QPushButton(QIcon(":/images/find_folder.png"), ""); + find = new QPushButton(""); connect(find, &QAbstractButton::clicked, this, &AddLibraryDialog::findPath); auto content = new QGridLayout; @@ -54,16 +54,22 @@ void AddLibraryDialog::setupUI() mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/openLibrary.png"); - imgLabel->setPixmap(p); - imgMainLayout->addWidget(imgLabel); //,0,Qt::AlignTop); + imgLabel = new QLabel(this); + imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); setLayout(imgMainLayout); setModal(true); setWindowTitle(tr("Add an existing library")); + + initTheme(this); +} + +void AddLibraryDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.openLibraryIcon); + find->setIcon(theme.dialogIcons.findFolderIcon); } void AddLibraryDialog::add() diff --git a/YACReaderLibrary/add_library_dialog.h b/YACReaderLibrary/add_library_dialog.h index 1176d9330..041c79911 100644 --- a/YACReaderLibrary/add_library_dialog.h +++ b/YACReaderLibrary/add_library_dialog.h @@ -1,19 +1,25 @@ #ifndef __ADD_LIBRARY_DIALOG_H #define __ADD_LIBRARY_DIALOG_H +#include "themable.h" + #include #include #include #include #include -class AddLibraryDialog : public QDialog +class AddLibraryDialog : public QDialog, protected Themable { Q_OBJECT public: AddLibraryDialog(QWidget *parent = nullptr); +protected: + void applyTheme(const Theme &theme) override; + private: + QLabel *imgLabel; QLabel *nameLabel; QLabel *textLabel; QLineEdit *path; diff --git a/YACReaderLibrary/bundle_creator.h b/YACReaderLibrary/bundle_creator.h index a5ed56f60..7fb05e710 100644 --- a/YACReaderLibrary/bundle_creator.h +++ b/YACReaderLibrary/bundle_creator.h @@ -1,7 +1,7 @@ #ifndef __BUNDLE_CREATOR_H #define __BUNDLE_CREATOR_H -#include +#include class BundleCreator : public QObject { diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index 66b602b9a..ba7c6a082 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -1,14 +1,19 @@ #include "classic_comics_view.h" -#include "yacreader_global.h" - -#include "QStackedWidget" - #include "comic_flow_widget.h" -#include "QsLog.h" #include "shortcuts_manager.h" +#include "yacreader_global.h" #include "yacreader_table_view.h" -#include "yacreader_tool_bar_stretch.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include ClassicComicsView::ClassicComicsView(QWidget *parent) : ComicsView(parent), searching(false) @@ -19,15 +24,7 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) settings->beginGroup("libraryConfig"); // FLOW----------------------------------------------------------------------- //--------------------------------------------------------------------------- -// FORCE_ANGLE is not used here, because ComicFlowWidgetGL will use OpenGL ES in the future -#ifndef NO_OPENGL - if ((settings->value(USE_OPEN_GL).toBool() == true)) - comicFlow = new ComicFlowWidgetGL(0); - else - comicFlow = new ComicFlowWidgetSW(0); -#else - comicFlow = new ComicFlowWidgetSW(0); -#endif + comicFlow = new ComicFlowWidget(0); comicFlow->updateConfig(settings); comicFlow->setFocusPolicy(Qt::StrongFocus); comicFlow->setShowMarks(true); @@ -95,11 +92,23 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) hideFlowViewAction->setText(tr("Hide comic flow")); hideFlowViewAction->setData(HIDE_COMIC_VIEW_ACTION_YL); hideFlowViewAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(HIDE_COMIC_VIEW_ACTION_YL)); - hideFlowViewAction->setIcon(QIcon(":/images/comics_view_toolbar/hideComicFlow.svg")); hideFlowViewAction->setCheckable(true); hideFlowViewAction->setChecked(false); connect(hideFlowViewAction, &QAction::toggled, this, &ClassicComicsView::hideComicFlow); + + initTheme(this); +} + +void ClassicComicsView::applyTheme(const Theme &theme) +{ + // Update searching icon background to match comic flow + searchingIcon->setStyleSheet(QString("QWidget {border: none; background-color: %1;}").arg(theme.comicFlow.backgroundColor.name())); + searchingIconLabel->setPixmap(theme.emptyContainer.searchingIcon); + + sVertical->setStyleSheet(theme.contentSplitter.verticalSplitterQSS); + + hideFlowViewAction->setIcon(theme.comicsViewToolbar.hideComicFlowIcon); } void ClassicComicsView::hideComicFlow(bool hide) @@ -414,15 +423,10 @@ void ClassicComicsView::setupSearchingIcon() auto h = new QHBoxLayout; - QPixmap p(":/images/searching_icon.png"); - QLabel *l = new QLabel(searchingIcon); - l->setPixmap(p); - l->setFixedSize(p.size()); - h->addWidget(l, 0, Qt::AlignCenter); + searchingIconLabel = new QLabel(searchingIcon); + h->addWidget(searchingIconLabel, 0, Qt::AlignCenter); searchingIcon->setLayout(h); - searchingIcon->setStyleSheet(QString("QWidget {border : none; background-color: #000000;}")); - hideSearchingIcon(); } diff --git a/YACReaderLibrary/classic_comics_view.h b/YACReaderLibrary/classic_comics_view.h index c492a033e..836dce9c1 100644 --- a/YACReaderLibrary/classic_comics_view.h +++ b/YACReaderLibrary/classic_comics_view.h @@ -2,9 +2,12 @@ #define CLASSIC_COMICS_VIEW_H #include "comics_view.h" +#include "themable.h" +#include #include #include +#include class QSplitter; class QStackedWidget; @@ -15,11 +18,14 @@ class ComicModel; class YACReaderTableView; class YACReaderToolBarStretch; -class ClassicComicsView : public ComicsView +class ClassicComicsView : public ComicsView, protected Themable { Q_OBJECT public: explicit ClassicComicsView(QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; void setToolBar(QToolBar *toolBar) override; void setModel(ComicModel *model) override; @@ -69,6 +75,7 @@ protected slots: QByteArray previousSplitterStatus; QWidget *searchingIcon; + QLabel *searchingIconLabel; bool searching; void setupSearchingIcon(); void showSearchingIcon(); diff --git a/YACReaderLibrary/comic_files_manager.cpp b/YACReaderLibrary/comic_files_manager.cpp index 091e36fa3..9512def19 100644 --- a/YACReaderLibrary/comic_files_manager.cpp +++ b/YACReaderLibrary/comic_files_manager.cpp @@ -1,12 +1,12 @@ #include "comic_files_manager.h" + +#include "comic.h" + +#include #include #include -#include - #include -#include "comic.h" - ComicFilesManager::ComicFilesManager(QObject *parent) : QObject(parent), canceled(false) { @@ -33,7 +33,7 @@ QList> ComicFilesManager::getDroppedFiles(const QList> dropedFiles; QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { currentPath = url.toLocalFile(); if (currentPath.endsWith('/')) currentPath = currentPath.remove(currentPath.length() - 1, 1); // QTBUG-35896 QUrl.toLocalFile inconsistency. @@ -44,7 +44,8 @@ QList> ComicFilesManager::getDroppedFiles(const QList source; - foreach (source, comics) { + const auto &comicSources = comics; + for (const auto &source : comicSources) { if (canceled) { if (successProcesingFiles) diff --git a/YACReaderLibrary/comic_files_manager.h b/YACReaderLibrary/comic_files_manager.h index ae39c23df..870f85a82 100644 --- a/YACReaderLibrary/comic_files_manager.h +++ b/YACReaderLibrary/comic_files_manager.h @@ -1,10 +1,10 @@ #ifndef COMIC_FILES_MANAGER_H #define COMIC_FILES_MANAGER_H -#include #include -#include #include +#include +#include // this class is intended to work in background, just use moveToThread and process to start working class ComicFilesManager : public QObject diff --git a/YACReaderLibrary/comic_flow.cpp b/YACReaderLibrary/comic_flow.cpp deleted file mode 100644 index a746ecd7f..000000000 --- a/YACReaderLibrary/comic_flow.cpp +++ /dev/null @@ -1,159 +0,0 @@ -#include "comic_flow.h" -#include "worker_thread.h" - -#include "yacreader_global.h" - -ComicFlow::ComicFlow(QWidget *parent, FlowType flowType) - : YACReaderFlow(parent, flowType), worker(new WorkerThread) -{ - resetWorkerIndex(); - connect(&updateTimer, &QTimer::timeout, this, &ComicFlow::updateImageData); - - connect(this, &PictureFlow::centerIndexChanged, this, &ComicFlow::preload); - connect(this, &PictureFlow::centerIndexChangedSilent, this, &ComicFlow::preload); - - setReflectionEffect(PlainReflection); -} - -ComicFlow::~ComicFlow() = default; - -void ComicFlow::setImagePaths(const QStringList &paths) -{ - clear(); - - imageFiles = paths; - imagesLoaded.clear(); - imagesLoaded.fill(false, imageFiles.size()); - numImagesLoaded = 0; - - imagesSetted.clear(); - imagesSetted.fill(false, imageFiles.size()); - - // populate with empty images - QImage img; // TODO remove - QString s; - for (int i = 0; i < (int)imageFiles.size(); i++) { - addSlide(img); - s = imageFiles.at(i); - s.remove(s.size() - 4, 4); - if (QFileInfo::exists(s + ".r")) - markSlide(i); - } - - setCenterIndex(0); - - resetWorkerIndex(); - preload(); -} - -void ComicFlow::preload() -{ - if (numImagesLoaded < imagesLoaded.size()) - updateTimer.start(30); // TODO comprobar rendimiento, originalmente era 70 -} - -void ComicFlow::updateImageData() -{ - // can't do anything, wait for the next possibility - if (worker->busy()) - return; - - // set image of last one - const int idx = workerIndex; - if (idx >= 0) { - const QImage result = worker->extractResult(); - if (!result.isNull() && !imagesSetted[idx]) { - setSlide(idx, result); - imagesSetted[idx] = true; - numImagesLoaded++; - imagesLoaded[idx] = true; - } - } - - // try to load only few images on the left and right side - // i.e. all visible ones plus some extra -#define COUNT 8 - int indexes[2 * COUNT + 1]; - int center = centerIndex(); - indexes[0] = center; - for (int j = 0; j < COUNT; j++) { - indexes[j * 2 + 1] = center + j + 1; - indexes[j * 2 + 2] = center - j - 1; - } - for (int c = 0; c < 2 * COUNT + 1; c++) { - int i = indexes[c]; - if ((i >= 0) && (i < slideCount())) - if (!imagesLoaded[i]) // slide(i).isNull()) - { - // schedule thumbnail generation - QString fname = imageFiles[i]; - - workerIndex = i; - worker->performTask([fname] { return QImage { fname }; }); - return; - } - } - - // no need to generate anything? stop polling... - updateTimer.stop(); -} - -void ComicFlow::keyPressEvent(QKeyEvent *event) -{ - PictureFlow::keyPressEvent(event); -} - -void ComicFlow::wheelEvent(QWheelEvent *event) -{ - if (event->angleDelta().y() < 0) - showNext(); - else - showPrevious(); - event->accept(); -} - -void ComicFlow::insertSlide(const QString &path, int index) -{ - imageFiles.insert(index, path); - imagesLoaded.insert(index, false); - imagesSetted.insert(index, false); - - YACReaderFlow::insertSlide(index); - - resetWorkerIndex(); - preload(); -} - -void ComicFlow::removeSlide(int cover) -{ - imageFiles.removeAt(cover); - if (imagesLoaded[cover]) - numImagesLoaded--; - imagesLoaded.remove(cover); - imagesSetted.remove(cover); - - YACReaderFlow::removeSlide(cover); - - resetWorkerIndex(); - preload(); -} - -void ComicFlow::resortCovers(QList newOrder) -{ - YACReaderFlow::resortCovers(newOrder); - - QStringList imageFilesNew; - QVector imagesLoadedNew; - QVector imagesSettedNew; - foreach (int index, newOrder) { - imageFilesNew << imageFiles.at(index); - imagesLoadedNew << imagesLoaded.at(index); - imagesSettedNew << imagesSetted.at(index); - } - - imageFiles = imageFilesNew; - imagesLoaded = imagesLoadedNew; - imagesSetted = imagesSettedNew; - - resetWorkerIndex(); -} diff --git a/YACReaderLibrary/comic_flow.h b/YACReaderLibrary/comic_flow.h deleted file mode 100644 index f8cc9a4d9..000000000 --- a/YACReaderLibrary/comic_flow.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef __COMICFLOW_H -#define __COMICFLOW_H - -#include "yacreader_flow.h" - -#include -#include -#include -#include -#include - -#include - -template -class WorkerThread; - -class ComicFlow : public YACReaderFlow -{ - Q_OBJECT -public: - ComicFlow(QWidget *parent = nullptr, FlowType flowType = CoverFlowLike); - ~ComicFlow() override; - - void setImagePaths(const QStringList &paths); - // bool eventFilter(QObject *target, QEvent *event); - void keyPressEvent(QKeyEvent *event) override; - void insertSlide(const QString &path, int index); - void removeSlide(int cover); - void resortCovers(QList newOrder); - -private slots: - void preload(); - void updateImageData(); - -private: - void resetWorkerIndex() { workerIndex = -1; } - - QStringList imageFiles; - QVector imagesLoaded; - QVector imagesSetted; - int numImagesLoaded; - int workerIndex; - QTimer updateTimer; - std::unique_ptr> worker; - virtual void wheelEvent(QWheelEvent *event) override; -}; - -#endif diff --git a/YACReaderLibrary/comic_flow_widget.cpp b/YACReaderLibrary/comic_flow_widget.cpp index 95515d913..0c2b603ed 100644 --- a/YACReaderLibrary/comic_flow_widget.cpp +++ b/YACReaderLibrary/comic_flow_widget.cpp @@ -1,276 +1,155 @@ #include "comic_flow_widget.h" + #include + ComicFlowWidget::ComicFlowWidget(QWidget *parent) : QWidget(parent) { -} + flow = new YACReaderComicFlow3D(this); -ComicFlowWidgetSW::ComicFlowWidgetSW(QWidget *parent) - : ComicFlowWidget(parent) -{ - flow = new ComicFlow(parent); - - connect(flow, &PictureFlow::centerIndexChanged, this, &ComicFlowWidget::centerIndexChanged); - connect(flow, &YACReaderFlow::selected, this, &ComicFlowWidget::selected); + connect(flow, &YACReaderComicFlow3D::centerIndexChanged, this, &ComicFlowWidget::centerIndexChanged); + connect(flow, &YACReaderComicFlow3D::selected, this, &ComicFlowWidget::selected); auto l = new QVBoxLayout; l->addWidget(flow); + l->setContentsMargins(0, 0, 0, 0); setLayout(l); - // TODO eleminar "padding" - QPalette Pal(palette()); - // set black background - Pal.setColor(QPalette::Window, Qt::black); setAutoFillBackground(true); - setPalette(Pal); - - // config - QTransform m; - m.rotate(-90); - m.scale(-1, 1); - QImage image(":/images/setRead.png"); - QImage imageTransformed = image.transformed(m, Qt::SmoothTransformation); - setMarkImage(imageTransformed); -} -QSize ComicFlowWidgetSW::minimumSizeHint() const -{ - return flow->minimumSizeHint(); -} -QSize ComicFlowWidgetSW::sizeHint() const -{ - return flow->sizeHint(); + initTheme(this); } -void ComicFlowWidgetSW::setShowMarks(bool value) -{ - flow->setShowMarks(value); -} -void ComicFlowWidgetSW::setMarks(QVector marks) -{ - flow->setMarks(marks); -} -void ComicFlowWidgetSW::setMarkImage(QImage &image) -{ - flow->setMarkImage(image); -} -void ComicFlowWidgetSW::markSlide(int index, YACReaderComicReadStatus status) -{ - flow->markSlide(index, status); -} -void ComicFlowWidgetSW::unmarkSlide(int index) -{ - flow->unmarkSlide(index); -} -void ComicFlowWidgetSW::setSlideSize(QSize size) +void ComicFlowWidget::applyTheme(const Theme &theme) { - flow->setSlideSize(size); -} -void ComicFlowWidgetSW::clear() -{ - flow->clear(); -} -void ComicFlowWidgetSW::setImagePaths(QStringList paths) -{ - flow->setImagePaths(paths); -} -void ComicFlowWidgetSW::setCenterIndex(int index) -{ - flow->setCenterIndex(index); -} -void ComicFlowWidgetSW::showSlide(int index) -{ - flow->showSlide(index); -} -int ComicFlowWidgetSW::centerIndex() -{ - return flow->centerIndex(); -} -void ComicFlowWidgetSW::updateMarks() -{ - flow->updateMarks(); -} -void ComicFlowWidgetSW::setFlowType(FlowType flowType) -{ - flow->setFlowType(flowType); -} -void ComicFlowWidgetSW::render() -{ - flow->render(); -} -void ComicFlowWidgetSW::keyPressEvent(QKeyEvent *event) -{ - flow->keyPressEvent(event); -} -void ComicFlowWidgetSW::paintEvent(QPaintEvent *event) -{ - ComicFlowWidget::paintEvent(event); -} -void ComicFlowWidgetSW::mousePressEvent(QMouseEvent *event) -{ - flow->mousePressEvent(event); -} -void ComicFlowWidgetSW::resizeEvent(QResizeEvent *event) -{ - flow->resizeEvent(event); -} -void ComicFlowWidgetSW::mouseDoubleClickEvent(QMouseEvent *event) -{ - flow->mouseDoubleClickEvent(event); -} -void ComicFlowWidgetSW::updateConfig(QSettings *settings) -{ - switch (settings->value(FLOW_TYPE_SW).toInt()) { - case CoverFlowLike: - flow->setFlowType(CoverFlowLike); - return; - case Strip: - flow->setFlowType(Strip); - return; - case StripOverlapped: - flow->setFlowType(StripOverlapped); - return; - } + setBackgroundColor(theme.comicFlow.backgroundColor); + setTextColor(theme.comicFlow.textColor); + flow->setRibbonImages(theme.comicFlow.readPixmap.toImage(), theme.comicFlow.readingPixmap.toImage()); } -void ComicFlowWidgetSW::add(const QString &path, int index) +void ComicFlowWidget::setBackgroundColor(const QColor &color) { - flow->insertSlide(path, index); + flow->setBackgroundColor(color); } -void ComicFlowWidgetSW::remove(int cover) +void ComicFlowWidget::setTextColor(const QColor &color) { - flow->removeSlide(cover); + flow->setTextColor(color); } -void ComicFlowWidgetSW::resortCovers(QList newOrder) -{ - flow->resortCovers(newOrder); -} - -#ifndef NO_OPENGL -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -/// OpenGL ComicFlow -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -ComicFlowWidgetGL::ComicFlowWidgetGL(QWidget *parent) - : ComicFlowWidget(parent) -{ - flow = new YACReaderComicFlowGL(parent); - - connect(flow, &YACReaderFlowGL::centerIndexChanged, this, &ComicFlowWidget::centerIndexChanged); - connect(flow, &YACReaderFlowGL::selected, this, &ComicFlowWidget::selected); - - auto l = new QVBoxLayout; - l->addWidget(flow); - l->setContentsMargins(0, 0, 0, 0); - setLayout(l); - - // TODO eleminar "padding" - QPalette Pal(palette()); - // set black background - Pal.setColor(QPalette::Window, Qt::black); - setAutoFillBackground(true); - setPalette(Pal); -} - -QSize ComicFlowWidgetGL::minimumSizeHint() const +QSize ComicFlowWidget::minimumSizeHint() const { return flow->minimumSizeHint(); } -QSize ComicFlowWidgetGL::sizeHint() const + +QSize ComicFlowWidget::sizeHint() const { return flow->sizeHint(); } -void ComicFlowWidgetGL::setShowMarks(bool value) +void ComicFlowWidget::setShowMarks(bool value) { flow->setShowMarks(value); } -void ComicFlowWidgetGL::setMarks(QVector marks) + +void ComicFlowWidget::setMarks(QVector marks) { flow->setMarks(marks); } -void ComicFlowWidgetGL::setMarkImage(QImage &image) + +void ComicFlowWidget::setMarkImage(QImage &image) { flow->setMarkImage(image); } -void ComicFlowWidgetGL::markSlide(int index, YACReaderComicReadStatus status) + +void ComicFlowWidget::markSlide(int index, YACReader::YACReaderComicReadStatus status) { flow->markSlide(index, status); } -void ComicFlowWidgetGL::unmarkSlide(int index) + +void ComicFlowWidget::unmarkSlide(int index) { flow->unmarkSlide(index); } -void ComicFlowWidgetGL::setSlideSize(QSize size) + +void ComicFlowWidget::setSlideSize(QSize size) { flow->setSlideSize(size); } -void ComicFlowWidgetGL::clear() + +void ComicFlowWidget::clear() { flow->clear(); } -void ComicFlowWidgetGL::setImagePaths(QStringList paths) + +void ComicFlowWidget::setImagePaths(QStringList paths) { flow->setImagePaths(paths); } -void ComicFlowWidgetGL::setCenterIndex(int index) + +void ComicFlowWidget::setCenterIndex(int index) { flow->setCenterIndex(index); } -void ComicFlowWidgetGL::showSlide(int index) + +void ComicFlowWidget::showSlide(int index) { flow->showSlide(index); } -int ComicFlowWidgetGL::centerIndex() + +int ComicFlowWidget::centerIndex() { return flow->centerIndex(); } -void ComicFlowWidgetGL::updateMarks() + +void ComicFlowWidget::updateMarks() { flow->updateMarks(); } -void ComicFlowWidgetGL::setFlowType(FlowType flowType) + +void ComicFlowWidget::setFlowType(YACReader::FlowType flowType) { - if (flowType == CoverFlowLike) + if (flowType == YACReader::CoverFlowLike) flow->setPreset(presetYACReaderFlowClassicConfig); - else if (flowType == Strip) + else if (flowType == YACReader::Strip) flow->setPreset(presetYACReaderFlowStripeConfig); - else if (flowType == StripOverlapped) + else if (flowType == YACReader::StripOverlapped) flow->setPreset(presetYACReaderFlowOverlappedStripeConfig); else flow->setPreset(defaultYACReaderFlowConfig); } -void ComicFlowWidgetGL::render() + +void ComicFlowWidget::render() { flow->render(); } -void ComicFlowWidgetGL::keyPressEvent(QKeyEvent *event) + +void ComicFlowWidget::keyPressEvent(QKeyEvent *event) { flow->keyPressEvent(event); } -void ComicFlowWidgetGL::paintEvent(QPaintEvent *event) + +void ComicFlowWidget::paintEvent(QPaintEvent *event) { - // flow->paintEvent(event); - ComicFlowWidget::paintEvent(event); + QWidget::paintEvent(event); } -void ComicFlowWidgetGL::mousePressEvent(QMouseEvent *event) + +void ComicFlowWidget::mousePressEvent(QMouseEvent *event) { flow->mousePressEvent(event); } -void ComicFlowWidgetGL::resizeEvent(QResizeEvent *event) + +void ComicFlowWidget::resizeEvent(QResizeEvent *event) { flow->resizeGL(event->size().width(), event->size().height()); } -void ComicFlowWidgetGL::mouseDoubleClickEvent(QMouseEvent *event) + +void ComicFlowWidget::mouseDoubleClickEvent(QMouseEvent *event) { flow->mouseDoubleClickEvent(event); } -void ComicFlowWidgetGL::updateConfig(QSettings *settings) +void ComicFlowWidget::updateConfig(QSettings *settings) { Performance performance = medium; @@ -314,7 +193,6 @@ void ComicFlowWidgetGL::updateConfig(QSettings *settings) } // custom config - flow->setCF_RX(settings->value(X_ROTATION).toInt()); flow->setCF_Y(settings->value(Y_POSITION).toInt()); flow->setX_Distance(settings->value(COVER_DISTANCE).toInt()); @@ -326,35 +204,19 @@ void ComicFlowWidgetGL::updateConfig(QSettings *settings) flow->setFadeOutDist(settings->value(FADE_OUT_DIST).toInt()); flow->setLightStrenght(settings->value(LIGHT_STRENGTH).toInt()); flow->setMaxAngle(settings->value(MAX_ANGLE).toInt()); - - /* flow->setVisibility(settings->value("visibilityDistance").toInt()); - flow->setLightStrenght(settings->value("lightStrength").toInt())*/ - ; } -void ComicFlowWidgetGL::add(const QString &path, int index) +void ComicFlowWidget::add(const QString &path, int index) { flow->add(path, index); } -void ComicFlowWidgetGL::remove(int cover) +void ComicFlowWidget::remove(int cover) { flow->remove(cover); } -void ComicFlowWidgetGL::resortCovers(QList newOrder) +void ComicFlowWidget::resortCovers(QList newOrder) { flow->resortCovers(newOrder); } -#endif -// void ComicFlowWidgetGL::setCF_RX(int value){ flow->setCF_RX(value);} -// void ComicFlowWidgetGL::setCF_RY(int value){ flow->setCF_RY(value);} -// void ComicFlowWidgetGL::setCF_RZ(int value){ flow->setCF_RZ(value);} -// void ComicFlowWidgetGL::setZoom(int zoom){ flow->setZoom(zoom);} -// void ComicFlowWidgetGL::setRotation(int angle){ flow->setRotation(angle);} -// void ComicFlowWidgetGL::setX_Distance(int distance){ flow->setX_Distance(distance);} -// void ComicFlowWidgetGL::setCenter_Distance(int distance){ flow->setCenter_Distance(distance);} -// void ComicFlowWidgetGL::setZ_Distance(int distance){ flow->setZ_Distance(distance);} -// void ComicFlowWidgetGL::setCF_Y(int value){ flow->setCF_Y(value);} -// void ComicFlowWidgetGL::setY_Distance(int value){ flow->setY_Distance(value);} -// void ComicFlowWidgetGL::setPreset(const Preset & p){ flow->setPreset(p);} diff --git a/YACReaderLibrary/comic_flow_widget.h b/YACReaderLibrary/comic_flow_widget.h index ace364884..175564967 100644 --- a/YACReaderLibrary/comic_flow_widget.h +++ b/YACReaderLibrary/comic_flow_widget.h @@ -1,72 +1,47 @@ #ifndef __COMIC_FLOW_WIDGET_H #define __COMIC_FLOW_WIDGET_H +#include "themable.h" +#include "yacreader_comic_flow_rhi.h" +#include "yacreader_global.h" +#include "yacreader_global_gui.h" + #include -#include "pictureflow.h" -#include "comic_flow.h" -#ifndef NO_OPENGL -#include "yacreader_flow_gl.h" -#endif -class ComicFlowWidget : public QWidget +class ComicFlowWidget : public QWidget, protected Themable { Q_OBJECT public: - ComicFlowWidget(QWidget *paret = nullptr); + ComicFlowWidget(QWidget *parent = nullptr); public slots: - virtual void setShowMarks(bool value) = 0; - virtual void setMarks(QVector marks) = 0; - virtual void setMarkImage(QImage &image) = 0; - virtual void markSlide(int index, YACReaderComicReadStatus status) = 0; - virtual void unmarkSlide(int index) = 0; - virtual void setSlideSize(QSize size) = 0; - virtual void clear() = 0; - virtual void setImagePaths(QStringList paths) = 0; - virtual void setCenterIndex(int index) = 0; - virtual void showSlide(int index) = 0; - virtual int centerIndex() = 0; - virtual void updateMarks() = 0; - virtual void setFlowType(FlowType flowType) = 0; - virtual void render() = 0; - virtual void updateConfig(QSettings *settings) = 0; - virtual void add(const QString &path, int index) = 0; - virtual void remove(int cover) = 0; - virtual void resortCovers(QList newOrder) = 0; + void setBackgroundColor(const QColor &color); + void setTextColor(const QColor &color); + void setShowMarks(bool value); + void setMarks(QVector marks); + void setMarkImage(QImage &image); + void markSlide(int index, YACReader::YACReaderComicReadStatus status); + void unmarkSlide(int index); + void setSlideSize(QSize size); + void clear(); + void setImagePaths(QStringList paths); + void setCenterIndex(int index); + void showSlide(int index); + int centerIndex(); + void updateMarks(); + void setFlowType(YACReader::FlowType flowType); + void render(); + void updateConfig(QSettings *settings); + void add(const QString &path, int index); + void remove(int cover); + void resortCovers(QList newOrder); + signals: void centerIndexChanged(int); void selected(unsigned int); -}; - -class ComicFlowWidgetSW : public ComicFlowWidget -{ - Q_OBJECT -private: - ComicFlow *flow; - -public: - ComicFlowWidgetSW(QWidget *parent = nullptr); - - void setShowMarks(bool value) override; - void setMarks(QVector marks) override; - void setMarkImage(QImage &image) override; - void markSlide(int index, YACReaderComicReadStatus status) override; - void unmarkSlide(int index) override; - void setSlideSize(QSize size) override; - void clear() override; - void setImagePaths(QStringList paths) override; - void setCenterIndex(int index) override; - void showSlide(int index) override; - int centerIndex() override; - void updateMarks() override; - void setFlowType(FlowType flowType) override; - void render() override; - void updateConfig(QSettings *settings) override; - void add(const QString &path, int index) override; - void remove(int cover) override; - void resortCovers(QList newOrder) override; protected: + void applyTheme(const Theme &theme) override; void keyPressEvent(QKeyEvent *event) override; void paintEvent(QPaintEvent *event) override; void mousePressEvent(QMouseEvent *event) override; @@ -74,64 +49,9 @@ class ComicFlowWidgetSW : public ComicFlowWidget void mouseDoubleClickEvent(QMouseEvent *event) override; QSize minimumSizeHint() const override; QSize sizeHint() const override; - QSize slideSizeW; - QSize slideSizeF; -}; -#ifndef NO_OPENGL -class ComicFlowWidgetGL : public ComicFlowWidget -{ - Q_OBJECT private: - YACReaderComicFlowGL *flow; - -public: - ComicFlowWidgetGL(QWidget *parent = nullptr); - - void setShowMarks(bool value) override; - void setMarks(QVector marks) override; - void setMarkImage(QImage &image) override; - void markSlide(int index, YACReaderComicReadStatus status) override; - void unmarkSlide(int index) override; - void setSlideSize(QSize size) override; - void clear() override; - void setImagePaths(QStringList paths) override; - void setCenterIndex(int index) override; - void showSlide(int index) override; - int centerIndex() override; - void updateMarks() override; - void setFlowType(FlowType flowType) override; - void render() override; - void updateConfig(QSettings *settings) override; - void add(const QString &path, int index) override; - void remove(int cover) override; - void resortCovers(QList newOrder) override; - // public slots: - // void setCF_RX(int value); - // //the Y Rotation of the Coverflow - // void setCF_RY(int value); - // //the Z Rotation of the Coverflow - // void setCF_RZ(int value); - // //perspective - // void setZoom(int zoom); - // void setRotation(int angle); - // //sets the distance between the covers - // void setX_Distance(int distance); - // //sets the distance between the centered and the non centered covers - // void setCenter_Distance(int distance); - // //sets the pushback amount - // void setZ_Distance(int distance); - // void setCF_Y(int value); - // void setY_Distance(int value); - // void setPreset(const Preset & p); -protected: - void keyPressEvent(QKeyEvent *event) override; - void paintEvent(QPaintEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - void resizeEvent(QResizeEvent *event) override; - void mouseDoubleClickEvent(QMouseEvent *event) override; - QSize minimumSizeHint() const override; - QSize sizeHint() const override; + YACReaderComicFlow3D *flow; }; -#endif + #endif diff --git a/YACReaderLibrary/comic_vine/CMakeLists.txt b/YACReaderLibrary/comic_vine/CMakeLists.txt new file mode 100644 index 000000000..382e3f0f9 --- /dev/null +++ b/YACReaderLibrary/comic_vine/CMakeLists.txt @@ -0,0 +1,72 @@ +# Comic Vine scraper for YACReaderLibrary + +add_library(comic_vine STATIC + comic_vine_json_parser.h + comic_vine_json_parser.cpp + comic_vine_all_volume_comics_retriever.h + comic_vine_all_volume_comics_retriever.cpp + scraper_checkbox.h + scraper_checkbox.cpp + comic_vine_dialog.h + comic_vine_dialog.cpp + comic_vine_client.h + comic_vine_client.cpp + scraper_lineedit.h + scraper_lineedit.cpp + title_header.h + title_header.cpp + series_question.h + series_question.cpp + search_single_comic.h + search_single_comic.cpp + search_volume.h + search_volume.cpp + select_comic.h + select_comic.cpp + select_volume.h + select_volume.cpp + scraper_tableview.h + scraper_tableview.cpp + sort_volume_comics.h + sort_volume_comics.cpp + scraper_scroll_label.h + scraper_scroll_label.cpp + scraper_results_paginator.h + scraper_results_paginator.cpp + api_key_dialog.h + api_key_dialog.cpp + model/volumes_model.h + model/volumes_model.cpp + model/comics_model.h + model/comics_model.cpp + model/json_model.h + model/json_model.cpp + model/response_parser.h + model/response_parser.cpp + model/local_comic_list_model.h + model/local_comic_list_model.cpp + model/volume_comics_model.h + model/volume_comics_model.cpp + model/selected_volume_info.h + model/volume_search_query.h +) +target_include_directories(comic_vine PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/model +) +yacreader_apply_build_options(comic_vine) +# App-specific theme.h needed for themable.h → theme_manager.h → theme.h chain +target_include_directories(comic_vine PRIVATE + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db +) +target_link_libraries(comic_vine PUBLIC + Qt6::Core + Qt6::Widgets + Qt6::Network + common_all + common_gui + custom_widgets_library + db_helper + QsLog +) diff --git a/YACReaderLibrary/comic_vine/api_key_dialog.cpp b/YACReaderLibrary/comic_vine/api_key_dialog.cpp index ae063da45..9aa581e7a 100644 --- a/YACReaderLibrary/comic_vine/api_key_dialog.cpp +++ b/YACReaderLibrary/comic_vine/api_key_dialog.cpp @@ -1,13 +1,13 @@ #include "api_key_dialog.h" -#include +#include "yacreader_global_gui.h" + #include #include #include #include #include - -#include "yacreader_global_gui.h" +#include ApiKeyDialog::ApiKeyDialog(QWidget *parent) : QDialog(parent) diff --git a/YACReaderLibrary/comic_vine/comic_vine.pri b/YACReaderLibrary/comic_vine/comic_vine.pri deleted file mode 100644 index 978360233..000000000 --- a/YACReaderLibrary/comic_vine/comic_vine.pri +++ /dev/null @@ -1,52 +0,0 @@ - -HEADERS += \ - $$PWD/comic_vine_json_parser.h \ - $$PWD/model/selected_volume_info.h \ - $$PWD/model/volume_search_query.h \ - $$PWD/scraper_checkbox.h \ - comic_vine/comic_vine_dialog.h \ - comic_vine/comic_vine_client.h \ - comic_vine/scraper_lineedit.h \ - comic_vine/title_header.h \ - comic_vine/series_question.h \ - comic_vine/search_single_comic.h \ - comic_vine/search_volume.h \ - comic_vine/select_comic.h \ - comic_vine/select_volume.h \ - comic_vine/model/volumes_model.h \ - comic_vine/model/comics_model.h \ - comic_vine/model/json_model.h \ - comic_vine/model/response_parser.h \ - comic_vine/scraper_tableview.h \ - comic_vine/sort_volume_comics.h \ - comic_vine/model/local_comic_list_model.h \ - comic_vine/model/volume_comics_model.h \ - comic_vine/scraper_scroll_label.h \ - comic_vine/scraper_results_paginator.h \ - comic_vine/api_key_dialog.h \ - $$PWD/comic_vine_all_volume_comics_retriever.h - -SOURCES += \ - $$PWD/comic_vine_json_parser.cpp \ - $$PWD/scraper_checkbox.cpp \ - comic_vine/comic_vine_dialog.cpp \ - comic_vine/comic_vine_client.cpp \ - comic_vine/scraper_lineedit.cpp \ - comic_vine/title_header.cpp \ - comic_vine/series_question.cpp \ - comic_vine/search_single_comic.cpp \ - comic_vine/search_volume.cpp \ - comic_vine/select_comic.cpp \ - comic_vine/select_volume.cpp \ - comic_vine/model/volumes_model.cpp \ - comic_vine/model/comics_model.cpp \ - comic_vine/model/json_model.cpp \ - comic_vine/model/response_parser.cpp \ - comic_vine/scraper_tableview.cpp \ - comic_vine/sort_volume_comics.cpp \ - comic_vine/model/local_comic_list_model.cpp \ - comic_vine/model/volume_comics_model.cpp \ - comic_vine/scraper_scroll_label.cpp \ - comic_vine/scraper_results_paginator.cpp \ - comic_vine/api_key_dialog.cpp \ - $$PWD/comic_vine_all_volume_comics_retriever.cpp diff --git a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp index 58afc5a47..6e5092d38 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp @@ -54,7 +54,7 @@ QString ComicVineAllVolumeComicsRetriever::consolidateJSON() QJsonObject consolidatedJSON; QJsonArray comicsInfo; - foreach (QByteArray json, jsonResponses) { + for (const auto &json : jsonResponses) { QJsonDocument doc = QJsonDocument::fromJson(json); if (doc.isNull() || !doc.isObject() || doc.isEmpty()) { @@ -72,8 +72,8 @@ QString ComicVineAllVolumeComicsRetriever::consolidateJSON() continue; } - QJsonArray resultsArray = results.toArray(); - foreach (const QJsonValue &v, resultsArray) + const auto resultsArray = results.toArray(); + for (const auto &v : resultsArray) comicsInfo.append(v); } } diff --git a/YACReaderLibrary/comic_vine/comic_vine_client.cpp b/YACReaderLibrary/comic_vine/comic_vine_client.cpp index 67ee031a1..888bfa487 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_client.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_client.cpp @@ -1,7 +1,7 @@ #include "comic_vine_client.h" -#include "yacreader_global_gui.h" #include "comic_vine_all_volume_comics_retriever.h" +#include "yacreader_global_gui.h" // this is the API key used by YACReader to access Comic Vine // please, do not use it in your own software, get one for free at Comic Vine diff --git a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp index 1faa0aae1..ff4910e32 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp @@ -1,33 +1,34 @@ #include "comic_vine_dialog.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "data_base_management.h" -#include -#include "yacreader_busy_widget.h" +#include "QsLog.h" #include "comic_vine_client.h" #include "comic_vine_json_parser.h" +#include "data_base_management.h" +#include "db_helper.h" +#include "response_parser.h" #include "scraper_lineedit.h" -#include "title_header.h" -#include "series_question.h" #include "search_single_comic.h" #include "search_volume.h" #include "select_comic.h" #include "select_volume.h" #include "selected_volume_info.h" +#include "series_question.h" #include "sort_volume_comics.h" -#include "db_helper.h" -#include "response_parser.h" +#include "title_header.h" +#include "yacreader_busy_widget.h" -#include "QsLog.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include ComicVineDialog::ComicVineDialog(QWidget *parent) : QDialog(parent) @@ -38,6 +39,8 @@ ComicVineDialog::ComicVineDialog(QWidget *parent) doLayout(); doStackedWidgets(); doConnections(); + + initTheme(this); } void ComicVineDialog::closeEvent(QCloseEvent *event) @@ -49,12 +52,6 @@ void ComicVineDialog::closeEvent(QCloseEvent *event) void ComicVineDialog::doLayout() { - setStyleSheet("" - "QDialog {background-color: #404040; }" - ""); - - QString dialogButtonsStyleSheet = "QPushButton {border: 1px solid #242424; background: #2e2e2e; color:white; padding: 5px 26px 5px 26px; font-size:12px;font-family:Arial; font-weight:bold;}"; - skipButton = new QPushButton(tr("skip")); backButton = new QPushButton(tr("back")); nextButton = new QPushButton(tr("next")); @@ -66,12 +63,6 @@ void ComicVineDialog::doLayout() closeButton->setDefault(false); closeButton->setAutoDefault(false); - skipButton->setStyleSheet(dialogButtonsStyleSheet); - backButton->setStyleSheet(dialogButtonsStyleSheet); - nextButton->setStyleSheet(dialogButtonsStyleSheet); - searchButton->setStyleSheet(dialogButtonsStyleSheet); - closeButton->setStyleSheet(dialogButtonsStyleSheet); - content = new QStackedWidget(this); auto mainLayout = new QVBoxLayout; @@ -156,22 +147,14 @@ void ComicVineDialog::goNext() QList> matchingInfo = sortVolumeComicsWidget->getMatchingInfo(); auto volumeInfo = selectVolumeWidget->getSelectedVolumeInfo(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QtConcurrent::run(&ComicVineDialog::getComicsInfo, this, matchingInfo, volumeInfo); -#else - QtConcurrent::run(this, &ComicVineDialog::getComicsInfo, matchingInfo, volumeInfo); -#endif } else if (content->currentWidget() == selectComicWidget) { showLoading(); QString comicId = selectComicWidget->getSelectedComicId(); auto volumeInfo = selectVolumeWidget->getSelectedVolumeInfo(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QtConcurrent::run(&ComicVineDialog::getComicInfo, this, comicId, volumeInfo); -#else - QtConcurrent::run(this, &ComicVineDialog::getComicInfo, comicId, volumeInfo); -#endif } } @@ -274,13 +257,11 @@ void ComicVineDialog::doLoading() QWidget *w = new QWidget; auto l = new QVBoxLayout; - auto bw = new YACReaderBusyWidget; + busyWidget = new YACReaderBusyWidget; loadingMessage = new QLabel; - loadingMessage->setStyleSheet("QLabel {color:white; font-size:12px;font-family:Arial;}"); - l->addStretch(); - l->addWidget(bw, 0, Qt::AlignHCenter); + l->addWidget(busyWidget, 0, Qt::AlignHCenter); l->addStretch(); l->addWidget(loadingMessage); @@ -461,23 +442,23 @@ void ComicVineDialog::queryTimeOut() void ComicVineDialog::getComicsInfo(QList> matchingInfo, const SelectedVolumeInfo &volumeInfo) { - QPair p; QList comics; - foreach (p, matchingInfo) { + const auto &matches = matchingInfo; + for (auto match : matches) { auto comicVineClient = new ComicVineClient; // connect(comicVineClient,SIGNAL(searchResult(QString)),this,SLOT(debugClientResults(QString))); // connect(comicVineClient,SIGNAL(timeOut()),this,SLOT(queryTimeOut())); // connect(comicVineClient,SIGNAL(finished()),comicVineClient,SLOT(deleteLater())); bool error; bool timeout; - QByteArray result = comicVineClient->getComicDetail(p.second, error, timeout); // TODO check timeOut or Connection error + QByteArray result = comicVineClient->getComicDetail(match.second, error, timeout); // TODO check timeOut or Connection error if (error || timeout) continue; // TODO - ComicDB comic = YACReader::parseCVJSONComicInfo(p.first, result, volumeInfo); // TODO check result error - comic.info.comicVineID = p.second; + ComicDB comic = YACReader::parseCVJSONComicInfo(match.first, result, volumeInfo); // TODO check result error + comic.info.comicVineID = match.second; comics.push_back(comic); - setLoadingMessage(tr("Retrieving tags for : %1").arg(p.first.getFileName())); + setLoadingMessage(tr("Retrieving tags for : %1").arg(match.first.getFileName())); } DBHelper::updateComicsInfo(comics, databasePath); @@ -666,3 +647,19 @@ void ComicVineDialog::launchSearchComic() // if(comicInfo.isEmpty() && comicNumber == -1) searchVolume({ volumeInfo, 1, exactMatch }); } + +void ComicVineDialog::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + setStyleSheet(metadataScraperDialogTheme.dialogQSS); + + skipButton->setStyleSheet(metadataScraperDialogTheme.dialogButtonsQSS); + backButton->setStyleSheet(metadataScraperDialogTheme.dialogButtonsQSS); + nextButton->setStyleSheet(metadataScraperDialogTheme.dialogButtonsQSS); + searchButton->setStyleSheet(metadataScraperDialogTheme.dialogButtonsQSS); + closeButton->setStyleSheet(metadataScraperDialogTheme.dialogButtonsQSS); + + loadingMessage->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + busyWidget->setColor(metadataScraperDialogTheme.busyIndicatorColor); +} diff --git a/YACReaderLibrary/comic_vine/comic_vine_dialog.h b/YACReaderLibrary/comic_vine/comic_vine_dialog.h index e6ccfc78a..ecd4485b6 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.h +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.h @@ -1,11 +1,12 @@ #ifndef COMIC_VINE_DIALOG_H #define COMIC_VINE_DIALOG_H -#include - #include "comic_db.h" +#include "themable.h" #include "volume_search_query.h" +#include + class QPushButton; class QStackedWidget; class QLabel; @@ -21,10 +22,11 @@ class SelectVolume; struct SelectedVolumeInfo; class SortVolumeComics; struct VolumeSearchQuery; +class YACReaderBusyWidget; // TODO this should use a QStateMachine //---------------------------------------- -class ComicVineDialog : public QDialog +class ComicVineDialog : public QDialog, protected Themable { Q_OBJECT public: @@ -107,6 +109,7 @@ protected slots: QWidget *singleComicBrowser; QLabel *loadingMessage; + YACReaderBusyWidget *busyWidget; void doLayout(); void doStackedWidgets(); @@ -124,6 +127,9 @@ protected slots: VolumeSearchQuery currentVolumeSearchQuery; QString currentVolumeId; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // COMIC_VINE_DIALOG_H diff --git a/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp b/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp index 90ac8244a..1b0c93462 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_json_parser.cpp @@ -142,8 +142,8 @@ QMultiMap getAuthors(const QVariant &json_authors) QString authorName = resultsValue.value("name").toString(); - QStringList roles = resultsValue.value("role").toString().split(","); - foreach (QString role, roles) { + const QStringList roles = resultsValue.value("role").toString().split(","); + for (const auto &role : roles) { if (role.trimmed() == "writer") authors.insert("writer", authorName); else if (role.trimmed() == "inker") diff --git a/YACReaderLibrary/comic_vine/model/local_comic_list_model.h b/YACReaderLibrary/comic_vine/model/local_comic_list_model.h index 14baff981..dd2cde968 100644 --- a/YACReaderLibrary/comic_vine/model/local_comic_list_model.h +++ b/YACReaderLibrary/comic_vine/model/local_comic_list_model.h @@ -1,10 +1,10 @@ #ifndef LOCAL_COMIC_LIST_MODEL_H #define LOCAL_COMIC_LIST_MODEL_H -#include - #include "comic_db.h" +#include + class LocalComicListModel : public QAbstractItemModel { Q_OBJECT diff --git a/YACReaderLibrary/comic_vine/model/response_parser.cpp b/YACReaderLibrary/comic_vine/model/response_parser.cpp index dd2582120..5c46f3c11 100644 --- a/YACReaderLibrary/comic_vine/model/response_parser.cpp +++ b/YACReaderLibrary/comic_vine/model/response_parser.cpp @@ -1,4 +1,5 @@ #include "response_parser.h" + #include #include #include diff --git a/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp b/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp index 908d7614d..579b6a642 100644 --- a/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp +++ b/YACReaderLibrary/comic_vine/model/volume_comics_model.cpp @@ -1,4 +1,5 @@ #include "volume_comics_model.h" + #include "qnaturalsorting.h" #include @@ -46,7 +47,7 @@ void VolumeComicsModel::load(const QString &json) /*void VolumeComicsModel::load(const QStringList &jsonList) { - foreach (QString json, jsonList) { + for (const auto &json : jsonList) { load(json); } }*/ diff --git a/YACReaderLibrary/comic_vine/scraper_checkbox.cpp b/YACReaderLibrary/comic_vine/scraper_checkbox.cpp index 9a5381217..e15b3ac98 100644 --- a/YACReaderLibrary/comic_vine/scraper_checkbox.cpp +++ b/YACReaderLibrary/comic_vine/scraper_checkbox.cpp @@ -1,27 +1,14 @@ #include "scraper_checkbox.h" -#include "qwidget.h" ScraperCheckBox::ScraperCheckBox(const QString &text, QWidget *parent) : QCheckBox(text, parent) { - setStyleSheet( - "QCheckBox {" - " color: white;" - " font-size: 12px;" - " font-family: Arial;" - " spacing: 10px;" - "}" - "QCheckBox::indicator {" - " width: 13px;" - " height: 13px;" - " border: 1px solid #242424;" - " background: #2e2e2e;" - "}" - "QCheckBox::indicator:checked {" - " image: url(:/images/comic_vine/checkBoxTick.svg);" - " background: #2e2e2e;" - "}" - "QCheckBox::indicator:unchecked {" - " background: #2e2e2e;" - "}"); + initTheme(this); +} + +void ScraperCheckBox::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + setStyleSheet(metadataScraperDialogTheme.checkBoxQSS); } diff --git a/YACReaderLibrary/comic_vine/scraper_checkbox.h b/YACReaderLibrary/comic_vine/scraper_checkbox.h index ad6846709..6c4081f0f 100644 --- a/YACReaderLibrary/comic_vine/scraper_checkbox.h +++ b/YACReaderLibrary/comic_vine/scraper_checkbox.h @@ -1,12 +1,17 @@ #ifndef SCRAPER_CHECKBOX_H #define SCRAPER_CHECKBOX_H +#include "themable.h" + #include -class ScraperCheckBox : public QCheckBox +class ScraperCheckBox : public QCheckBox, protected Themable { public: ScraperCheckBox(const QString &text, QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SCRAPER_CHECKBOX_H diff --git a/YACReaderLibrary/comic_vine/scraper_lineedit.cpp b/YACReaderLibrary/comic_vine/scraper_lineedit.cpp index d12270859..a67c80047 100644 --- a/YACReaderLibrary/comic_vine/scraper_lineedit.cpp +++ b/YACReaderLibrary/comic_vine/scraper_lineedit.cpp @@ -1,18 +1,15 @@ #include "scraper_lineedit.h" + #include ScraperLineEdit::ScraperLineEdit(const QString &title, QWidget *widget) : QLineEdit(widget) { titleLabel = new QLabel(title, this); - titleLabel->setStyleSheet("QLabel {color:white;}"); - - setStyleSheet(QString("QLineEdit {" - "border:none; background-color: #2E2E2E; color : white; padding-left: %1; padding-bottom: 1px; margin-bottom: 0px;" - "}") - .arg(titleLabel->sizeHint().width() + 6)); setFixedHeight(22); + + initTheme(this); } void ScraperLineEdit::resizeEvent(QResizeEvent *) @@ -20,3 +17,11 @@ void ScraperLineEdit::resizeEvent(QResizeEvent *) QSize szl = titleLabel->sizeHint(); titleLabel->move(6, (rect().bottom() + 1 - szl.height()) / 2); } + +void ScraperLineEdit::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + titleLabel->setStyleSheet(metadataScraperDialogTheme.scraperLineEditTitleLabelQSS); + setStyleSheet(metadataScraperDialogTheme.scraperLineEditQSS.arg(titleLabel->sizeHint().width() + 6)); +} diff --git a/YACReaderLibrary/comic_vine/scraper_lineedit.h b/YACReaderLibrary/comic_vine/scraper_lineedit.h index 8de8b45df..93d13823e 100644 --- a/YACReaderLibrary/comic_vine/scraper_lineedit.h +++ b/YACReaderLibrary/comic_vine/scraper_lineedit.h @@ -1,11 +1,13 @@ #ifndef SCRAPPER_LINEEDIT_H #define SCRAPPER_LINEEDIT_H +#include "themable.h" + #include class QLabel; -class ScraperLineEdit : public QLineEdit +class ScraperLineEdit : public QLineEdit, protected Themable { Q_OBJECT public: @@ -13,6 +15,7 @@ class ScraperLineEdit : public QLineEdit protected: void resizeEvent(QResizeEvent *) override; + void applyTheme(const Theme &theme) override; private: QLabel *titleLabel; diff --git a/YACReaderLibrary/comic_vine/scraper_results_paginator.cpp b/YACReaderLibrary/comic_vine/scraper_results_paginator.cpp index 6dd5f1637..cfffdecb7 100644 --- a/YACReaderLibrary/comic_vine/scraper_results_paginator.cpp +++ b/YACReaderLibrary/comic_vine/scraper_results_paginator.cpp @@ -1,4 +1,5 @@ #include "scraper_results_paginator.h" + #include "response_parser.h" #include @@ -10,27 +11,14 @@ ScraperResultsPaginator::ScraperResultsPaginator(QWidget *parent) { auto pagesButtonsLayout = new QHBoxLayout; - QString labelStylesheet = "QLabel {color:white; font-size:12px;font-family:Arial;}"; - nextPage = new QToolButton; - nextPage->setStyleSheet("QToolButton {border:none;}"); - QPixmap np(":/images/comic_vine/nextPage.png"); - nextPage->setIconSize(np.size()); - nextPage->setIcon(np); - previousPage = new QToolButton; - previousPage->setStyleSheet("QToolButton {border:none;}"); - QPixmap pp(":/images/comic_vine/previousPage.png"); - previousPage->setIconSize(pp.size()); - previousPage->setIcon(pp); connect(nextPage, &QAbstractButton::clicked, this, &ScraperResultsPaginator::loadNextPage); connect(previousPage, &QAbstractButton::clicked, this, &ScraperResultsPaginator::loadPreviousPage); numElements = new QLabel(tr("Number of volumes found : %1")); - numElements->setStyleSheet(labelStylesheet); numPages = new QLabel(tr("page %1 of %2")); - numPages->setStyleSheet(labelStylesheet); pagesButtonsLayout->addSpacing(15); pagesButtonsLayout->addWidget(numElements); @@ -43,6 +31,8 @@ ScraperResultsPaginator::ScraperResultsPaginator(QWidget *parent) pagesButtonsLayout->setContentsMargins(0, 0, 0, 0); setLayout(pagesButtonsLayout); + + initTheme(this); } void ScraperResultsPaginator::update(const QString &json) @@ -71,3 +61,19 @@ void ScraperResultsPaginator::setCustomLabel(const QString &label) { customLabel = label; } + +void ScraperResultsPaginator::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + numElements->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + numPages->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + + nextPage->setStyleSheet(metadataScraperDialogTheme.noBorderToolButtonQSS); + nextPage->setIconSize(metadataScraperDialogTheme.nextPageIcon.size); + nextPage->setIcon(metadataScraperDialogTheme.nextPageIcon.icon); + + previousPage->setStyleSheet(metadataScraperDialogTheme.noBorderToolButtonQSS); + previousPage->setIconSize(metadataScraperDialogTheme.previousPageIcon.size); + previousPage->setIcon(metadataScraperDialogTheme.previousPageIcon.icon); +} diff --git a/YACReaderLibrary/comic_vine/scraper_results_paginator.h b/YACReaderLibrary/comic_vine/scraper_results_paginator.h index 4395df4cd..ca7591f02 100644 --- a/YACReaderLibrary/comic_vine/scraper_results_paginator.h +++ b/YACReaderLibrary/comic_vine/scraper_results_paginator.h @@ -1,12 +1,14 @@ #ifndef SCRAPER_RESULTS_PAGINATOR_H #define SCRAPER_RESULTS_PAGINATOR_H +#include "themable.h" + #include class QToolButton; class QLabel; -class ScraperResultsPaginator : public QWidget +class ScraperResultsPaginator : public QWidget, protected Themable { Q_OBJECT public: @@ -14,12 +16,11 @@ class ScraperResultsPaginator : public QWidget void update(const QString &json); int getCurrentPage(); void setCustomLabel(const QString &label); + signals: void loadNextPage(); void loadPreviousPage(); -public slots: - private: QToolButton *nextPage; QToolButton *previousPage; @@ -29,6 +30,9 @@ public slots: int currentPage; QString customLabel; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SCRAPER_RESULTS_PAGINATOR_H diff --git a/YACReaderLibrary/comic_vine/scraper_scroll_label.cpp b/YACReaderLibrary/comic_vine/scraper_scroll_label.cpp index f067a4e08..751413543 100644 --- a/YACReaderLibrary/comic_vine/scraper_scroll_label.cpp +++ b/YACReaderLibrary/comic_vine/scraper_scroll_label.cpp @@ -1,35 +1,23 @@ #include "scraper_scroll_label.h" -#include #include +#include #include ScraperScrollLabel::ScraperScrollLabel(QWidget *parent) : QScrollArea(parent) { textLabel = new QLabel(this); - textLabel->setStyleSheet("QLabel {background-color: #2B2B2B; color:white; font-size:12px; font-family:Arial; }"); textLabel->setWordWrap(true); textLabel->setMinimumSize(168, 12); setWidget(textLabel); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setStyleSheet( - "QScrollArea {background-color:#2B2B2B; border:none;}" - "QScrollBar:vertical { border: none; background: #2B2B2B; width: 3px; margin: 0; }" - "QScrollBar:horizontal { border: none; background: #2B2B2B; height: 3px; margin: 0; }" - "QScrollBar::handle:vertical { background: #DDDDDD; width: 7px; min-height: 20px; }" - "QScrollBar::handle:horizontal { background: #DDDDDD; width: 7px; min-height: 20px; }" - "QScrollBar::add-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::sub-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::add-line:horizontal { border: none; background: #404040; width: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 0 3px 0;}" - "QScrollBar::sub-line:horizontal { border: none; background: #404040; width: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 0 3px 0;}" - "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" - "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" - "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {background: none; }"); connect(textLabel, &QLabel::linkActivated, this, &ScraperScrollLabel::openLink); + + initTheme(this); } void ScraperScrollLabel::setAltText(const QString &text) @@ -50,3 +38,11 @@ void ScraperScrollLabel::openLink(const QString &link) { QDesktopServices::openUrl(QUrl("http://www.comicvine.com" + link)); } + +void ScraperScrollLabel::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + textLabel->setStyleSheet(metadataScraperDialogTheme.scraperScrollLabelTextQSS); + setStyleSheet(metadataScraperDialogTheme.scraperScrollLabelScrollAreaQSS); +} diff --git a/YACReaderLibrary/comic_vine/scraper_scroll_label.h b/YACReaderLibrary/comic_vine/scraper_scroll_label.h index 6dc428dd4..0fe79baf2 100644 --- a/YACReaderLibrary/comic_vine/scraper_scroll_label.h +++ b/YACReaderLibrary/comic_vine/scraper_scroll_label.h @@ -1,18 +1,18 @@ #ifndef SCRAPER_SCROLL_LABEL_H #define SCRAPER_SCROLL_LABEL_H +#include "themable.h" + #include class QLabel; -class ScraperScrollLabel : public QScrollArea +class ScraperScrollLabel : public QScrollArea, protected Themable { Q_OBJECT public: explicit ScraperScrollLabel(QWidget *parent = nullptr); -signals: - public slots: void setText(const QString &text); void setAltText(const QString &text); @@ -21,6 +21,9 @@ public slots: private: QLabel *textLabel; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SCRAPER_SCROLL_LABEL_H diff --git a/YACReaderLibrary/comic_vine/scraper_tableview.cpp b/YACReaderLibrary/comic_vine/scraper_tableview.cpp index eec6da838..47efab2c8 100644 --- a/YACReaderLibrary/comic_vine/scraper_tableview.cpp +++ b/YACReaderLibrary/comic_vine/scraper_tableview.cpp @@ -5,47 +5,14 @@ ScraperTableView::ScraperTableView(QWidget *parent) : QTableView(parent) { - QString tableStylesheet = "QTableView {color:white; border:0px;alternate-background-color: #2E2E2E;background-color: #2B2B2B; outline: 0px;}" - "QTableView::item {outline: 0px; border: 0px; color:#FFFFFF;}" - "QTableView::item:selected {outline: 0px; background-color: #555555; }" - "QHeaderView::section:horizontal {background-color:#292929; border-bottom:1px solid #1F1F1F; border-right:1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #292929, stop: 1 #1F1F1F); border-left:none; border-top:none; padding:4px; color:#ebebeb;}" - "QHeaderView::section:vertical {border-bottom: 1px solid #DFDFDF;border-top: 1px solid #FEFEFE;}" - "QHeaderView::down-arrow {image: url(':/images/comic_vine/downArrow.png');}" - "QHeaderView::up-arrow {image: url(':/images/comic_vine/upArrow.png');}" - "QScrollBar:vertical { border: none; background: #2B2B2B; width: 3px; margin: 0; }" - "QScrollBar:horizontal { border: none; background: #2B2B2B; height: 3px; margin: 0; }" - "QScrollBar::handle:vertical { background: #DDDDDD; width: 7px; min-height: 20px; }" - "QScrollBar::handle:horizontal { background: #DDDDDD; width: 7px; min-height: 20px; }" - "QScrollBar::add-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::sub-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::add-line:horizontal { border: none; background: #404040; width: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 0 3px 0;}" - "QScrollBar::sub-line:horizontal { border: none; background: #404040; width: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 0 3px 0;}" - "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" - "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" - "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {background: none; }"; - - setStyleSheet(tableStylesheet); - setShowGrid(false); -#if QT_VERSION >= 0x050000 verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); -#else - verticalHeader()->setResizeMode(QHeaderView::Fixed); -#endif horizontalHeader()->setStretchLastSection(true); -#if QT_VERSION >= 0x050000 horizontalHeader()->setSectionsClickable(false); -#else - horizontalHeader()->setClickable(false); -#endif // comicView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); verticalHeader()->setDefaultSectionSize(24); -#if QT_VERSION >= 0x050000 verticalHeader()->setSectionsClickable(false); // TODO comportamiento anómalo -#else - verticalHeader()->setClickable(false); // TODO comportamiento anómalo -#endif setCornerButtonEnabled(false); @@ -59,4 +26,13 @@ ScraperTableView::ScraperTableView(QWidget *parent) verticalHeader()->hide(); setSelectionMode(QAbstractItemView::SingleSelection); + + initTheme(this); +} + +void ScraperTableView::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + setStyleSheet(metadataScraperDialogTheme.scraperTableViewQSS); } diff --git a/YACReaderLibrary/comic_vine/scraper_tableview.h b/YACReaderLibrary/comic_vine/scraper_tableview.h index 03eb0322e..9f8eaf74d 100644 --- a/YACReaderLibrary/comic_vine/scraper_tableview.h +++ b/YACReaderLibrary/comic_vine/scraper_tableview.h @@ -1,17 +1,18 @@ #ifndef SCRAPPER_TABLEVIEW_H #define SCRAPPER_TABLEVIEW_H +#include "themable.h" + #include -class ScraperTableView : public QTableView +class ScraperTableView : public QTableView, protected Themable { Q_OBJECT public: explicit ScraperTableView(QWidget *parent = nullptr); -signals: - -public slots: +protected: + void applyTheme(const Theme &theme) override; }; #endif // SCRAPPER_TABLEVIEW_H diff --git a/YACReaderLibrary/comic_vine/search_single_comic.cpp b/YACReaderLibrary/comic_vine/search_single_comic.cpp index 1d637990d..9af75d070 100644 --- a/YACReaderLibrary/comic_vine/search_single_comic.cpp +++ b/YACReaderLibrary/comic_vine/search_single_comic.cpp @@ -2,17 +2,16 @@ #include "scraper_lineedit.h" +#include #include #include -#include SearchSingleComic::SearchSingleComic(QWidget *parent) : QWidget(parent) { // QLabel * label = new QLabel(tr("Please provide some additional information. At least one field is needed.")); - QLabel *label = new QLabel(tr("Please provide some additional information for this comic.")); - label->setStyleSheet("QLabel {color:white; font-size:12px;font-family:Arial;}"); + label = new QLabel(tr("Please provide some additional information for this comic.")); // titleEdit = new ScraperLineEdit(tr("Title:")); // numberEdit = new ScraperLineEdit(tr("Number:")); @@ -39,6 +38,8 @@ SearchSingleComic::SearchSingleComic(QWidget *parent) l->setContentsMargins(0, 0, 0, 0); setLayout(l); setContentsMargins(0, 0, 0, 0); + + initTheme(this); } QString SearchSingleComic::getVolumeInfo() const @@ -70,3 +71,10 @@ void SearchSingleComic::clean() { volumeEdit->clear(); } + +void SearchSingleComic::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + label->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); +} diff --git a/YACReaderLibrary/comic_vine/search_single_comic.h b/YACReaderLibrary/comic_vine/search_single_comic.h index 7a8d7c107..7fa7151e7 100644 --- a/YACReaderLibrary/comic_vine/search_single_comic.h +++ b/YACReaderLibrary/comic_vine/search_single_comic.h @@ -1,13 +1,13 @@ #ifndef SEARCH_SINGLE_COMIC_H #define SEARCH_SINGLE_COMIC_H -#include - #include "scraper_checkbox.h" +#include "themable.h" class ScraperLineEdit; +class QLabel; -class SearchSingleComic : public QWidget +class SearchSingleComic : public QWidget, protected Themable { Q_OBJECT public: @@ -24,5 +24,9 @@ class SearchSingleComic : public QWidget // ScraperLineEdit *numberEdit; ScraperLineEdit *volumeEdit; ScraperCheckBox *exactMatchCheckBox; + QLabel *label; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SEARCH_SINGLE_COMIC_H diff --git a/YACReaderLibrary/comic_vine/search_volume.cpp b/YACReaderLibrary/comic_vine/search_volume.cpp index bace44252..ed42dd0ae 100644 --- a/YACReaderLibrary/comic_vine/search_volume.cpp +++ b/YACReaderLibrary/comic_vine/search_volume.cpp @@ -1,7 +1,7 @@ #include "search_volume.h" -#include "scraper_lineedit.h" #include "scraper_checkbox.h" +#include "scraper_lineedit.h" #include #include @@ -9,8 +9,7 @@ SearchVolume::SearchVolume(QWidget *parent) : QWidget(parent) { - QLabel *label = new QLabel(tr("Please provide some additional information.")); - label->setStyleSheet("QLabel {color:white; font-size:12px;font-family:Arial;}"); + label = new QLabel(tr("Please provide some additional information.")); volumeEdit = new ScraperLineEdit(tr("Series:")); volumeEdit->setClearButtonEnabled(true); @@ -29,6 +28,8 @@ SearchVolume::SearchVolume(QWidget *parent) l->setContentsMargins(0, 0, 0, 0); setLayout(l); setContentsMargins(0, 0, 0, 0); + + initTheme(this); } void SearchVolume::clean() @@ -45,3 +46,10 @@ QString SearchVolume::getVolumeInfo() const { return volumeEdit->text(); } + +void SearchVolume::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + label->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); +} diff --git a/YACReaderLibrary/comic_vine/search_volume.h b/YACReaderLibrary/comic_vine/search_volume.h index 4ad8db80d..c38fa7032 100644 --- a/YACReaderLibrary/comic_vine/search_volume.h +++ b/YACReaderLibrary/comic_vine/search_volume.h @@ -1,13 +1,16 @@ #ifndef SEARCH_VOLUME_H #define SEARCH_VOLUME_H -#include #include "scraper_checkbox.h" +#include "themable.h" + +#include +#include class ScraperLineEdit; class ScraperCheckBox; -class SearchVolume : public QWidget +class SearchVolume : public QWidget, protected Themable { Q_OBJECT public: @@ -20,6 +23,10 @@ class SearchVolume : public QWidget private: ScraperLineEdit *volumeEdit; ScraperCheckBox *exactMatchCheckBox; + QLabel *label; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SEARCH_VOLUME_H diff --git a/YACReaderLibrary/comic_vine/select_comic.cpp b/YACReaderLibrary/comic_vine/select_comic.cpp index 70b64359c..67dd1ac2e 100644 --- a/YACReaderLibrary/comic_vine/select_comic.cpp +++ b/YACReaderLibrary/comic_vine/select_comic.cpp @@ -13,10 +13,7 @@ SelectComic::SelectComic(QWidget *parent) : QWidget(parent), model(0) { - QString labelStylesheet = "QLabel {color:white; font-size:12px;font-family:Arial;}"; - - QLabel *label = new QLabel(tr("Please, select the right comic info.")); - label->setStyleSheet(labelStylesheet); + label = new QLabel(tr("Please, select the right comic info.")); auto l = new QVBoxLayout; QWidget *leftWidget = new QWidget; @@ -28,7 +25,6 @@ SelectComic::SelectComic(QWidget *parent) cover->setScaledContents(true); cover->setAlignment(Qt::AlignTop | Qt::AlignHCenter); cover->setMinimumSize(168, 168 * 5.0 / 3); - cover->setStyleSheet("QLabel {background-color: #2B2B2B; color:white; font-size:12px; font-family:Arial; }"); detailLabel = new ScraperScrollLabel(this); tableComics = new ScraperTableView(this); @@ -63,6 +59,8 @@ SelectComic::SelectComic(QWidget *parent) l->setContentsMargins(0, 0, 0, 0); setLayout(l); setContentsMargins(0, 0, 0, 0); + + initTheme(this); } void SelectComic::load(const QString &json, const QString &volumeId) @@ -164,3 +162,11 @@ QString SelectComic::getSelectedComicId() { return model->getComicId(tableComics->currentIndex()); } + +void SelectComic::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + label->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + cover->setStyleSheet(metadataScraperDialogTheme.coverLabelQSS); +} diff --git a/YACReaderLibrary/comic_vine/select_comic.h b/YACReaderLibrary/comic_vine/select_comic.h index 427c3e290..cf2b290c2 100644 --- a/YACReaderLibrary/comic_vine/select_comic.h +++ b/YACReaderLibrary/comic_vine/select_comic.h @@ -1,9 +1,8 @@ #ifndef SELECT_COMIC_H #define SELECT_COMIC_H -#include - #include "scraper_results_paginator.h" +#include "themable.h" class QLabel; class VolumeComicsModel; @@ -12,7 +11,7 @@ class QModelIndex; class ScraperScrollLabel; class ScraperTableView; -class SelectComic : public QWidget +class SelectComic : public QWidget, protected Themable { Q_OBJECT public: @@ -34,12 +33,16 @@ private slots: void loadPreviousPage(); private: + QLabel *label; QLabel *cover; ScraperScrollLabel *detailLabel; ScraperTableView *tableComics; VolumeComicsModel *model; QString currentVolumeId; ScraperResultsPaginator *paginator; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SELECT_COMIC_H diff --git a/YACReaderLibrary/comic_vine/select_volume.cpp b/YACReaderLibrary/comic_vine/select_volume.cpp index 86bd49ac6..2e778f323 100644 --- a/YACReaderLibrary/comic_vine/select_volume.cpp +++ b/YACReaderLibrary/comic_vine/select_volume.cpp @@ -1,5 +1,14 @@ #include "select_volume.h" +#include "comic_vine_client.h" +#include "scraper_lineedit.h" +#include "scraper_results_paginator.h" +#include "scraper_scroll_label.h" +#include "scraper_tableview.h" +#include "selected_volume_info.h" +#include "volumes_model.h" + +#include #include #include #include @@ -12,19 +21,6 @@ #include #include #include -#include - -#include "scraper_tableview.h" -#include "scraper_lineedit.h" - -#include "volumes_model.h" -#include "comic_vine_client.h" -#include "scraper_scroll_label.h" - -#include "response_parser.h" -#include "scraper_results_paginator.h" - -#include "selected_volume_info.h" SelectVolume::SelectVolume(QWidget *parent) : QWidget(parent), model(0) @@ -32,10 +28,7 @@ SelectVolume::SelectVolume(QWidget *parent) proxyModel = new QSortFilterProxyModel; proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); - QString labelStylesheet = "QLabel {color:white; font-size:12px;font-family:Arial;}"; - - QLabel *label = new QLabel(tr("Please, select the right series for your comic.")); - label->setStyleSheet(labelStylesheet); + label = new QLabel(tr("Please, select the right series for your comic.")); auto l = new QVBoxLayout; QWidget *leftWidget = new QWidget; @@ -48,7 +41,6 @@ SelectVolume::SelectVolume(QWidget *parent) cover->setScaledContents(true); cover->setAlignment(Qt::AlignTop | Qt::AlignHCenter); cover->setMinimumSize(168, 168 * 5.0 / 3); - cover->setStyleSheet("QLabel {background-color: #2B2B2B; color:white; font-size:12px; font-family:Arial; }"); detailLabel = new ScraperScrollLabel(); tableVolumes = new ScraperTableView(); @@ -94,6 +86,8 @@ SelectVolume::SelectVolume(QWidget *parent) l->setContentsMargins(0, 0, 0, 0); setLayout(l); setContentsMargins(0, 0, 0, 0); + + initTheme(this); } void SelectVolume::load(const QString &json, const VolumeSearchQuery &searchQuery) @@ -218,3 +212,11 @@ SelectedVolumeInfo SelectVolume::getSelectedVolumeInfo() return { volumeId, numIssues, publisher, selectedVolumeDescription }; } + +void SelectVolume::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + label->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + cover->setStyleSheet(metadataScraperDialogTheme.coverLabelQSS); +} diff --git a/YACReaderLibrary/comic_vine/select_volume.h b/YACReaderLibrary/comic_vine/select_volume.h index 944c833be..79852d5aa 100644 --- a/YACReaderLibrary/comic_vine/select_volume.h +++ b/YACReaderLibrary/comic_vine/select_volume.h @@ -1,10 +1,9 @@ #ifndef SELECT_VOLUME_H #define SELECT_VOLUME_H -#include - #include "scraper_results_paginator.h" #include "selected_volume_info.h" +#include "themable.h" #include "volume_search_query.h" class QLabel; @@ -17,7 +16,7 @@ class ScraperScrollLabel; class ScraperTableView; class ScraperLineEdit; -class SelectVolume : public QWidget +class SelectVolume : public QWidget, protected Themable { Q_OBJECT public: @@ -40,6 +39,7 @@ private slots: void loadPreviousPage(); private: + QLabel *label; QLabel *cover; ScraperScrollLabel *detailLabel; ScraperTableView *tableVolumes; @@ -49,6 +49,9 @@ private slots: QString selectedVolumeDescription; VolumeSearchQuery currentSearchQuery; ScraperResultsPaginator *paginator; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SELECT_VOLUME_H diff --git a/YACReaderLibrary/comic_vine/series_question.cpp b/YACReaderLibrary/comic_vine/series_question.cpp index d04fba677..31e0ede21 100644 --- a/YACReaderLibrary/comic_vine/series_question.cpp +++ b/YACReaderLibrary/comic_vine/series_question.cpp @@ -1,26 +1,18 @@ #include "series_question.h" +#include #include #include -#include SeriesQuestion::SeriesQuestion(QWidget *parent) : QWidget(parent) { auto l = new QVBoxLayout; - QLabel *questionLabel = new QLabel(tr("You are trying to get information for various comics at once, are they part of the same series?")); - questionLabel->setStyleSheet("QLabel {color:white; font-size:12px;font-family:Arial;}"); + questionLabel = new QLabel(tr("You are trying to get information for various comics at once, are they part of the same series?")); yes = new QRadioButton(tr("yes")); no = new QRadioButton(tr("no")); - QString rbStyle = "QRadioButton {margin-left:27px; margin-top:5px; color:white;font-size:12px;font-family:Arial;}" - "QRadioButton::indicator {width:11px;height:11px;}" - "QRadioButton::indicator::unchecked {image : url(:/images/comic_vine/radioUnchecked.png);}" - "QRadioButton::indicator::checked {image : url(:/images/comic_vine/radioChecked.png);}"; - yes->setStyleSheet(rbStyle); - no->setStyleSheet(rbStyle); - yes->setChecked(true); l->addSpacing(35); @@ -32,6 +24,8 @@ SeriesQuestion::SeriesQuestion(QWidget *parent) l->setContentsMargins(0, 0, 0, 0); setLayout(l); setContentsMargins(0, 0, 0, 0); + + initTheme(this); } bool SeriesQuestion::getYes() @@ -43,3 +37,12 @@ void SeriesQuestion::setYes(bool y) { yes->setChecked(y); } + +void SeriesQuestion::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + questionLabel->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + yes->setStyleSheet(metadataScraperDialogTheme.radioButtonQSS); + no->setStyleSheet(metadataScraperDialogTheme.radioButtonQSS); +} diff --git a/YACReaderLibrary/comic_vine/series_question.h b/YACReaderLibrary/comic_vine/series_question.h index a02654f84..26a140dae 100644 --- a/YACReaderLibrary/comic_vine/series_question.h +++ b/YACReaderLibrary/comic_vine/series_question.h @@ -1,11 +1,14 @@ #ifndef SERIES_QUESTION_H #define SERIES_QUESTION_H +#include "themable.h" + #include class QRadioButton; +class QLabel; -class SeriesQuestion : public QWidget +class SeriesQuestion : public QWidget, protected Themable { Q_OBJECT @@ -15,8 +18,12 @@ class SeriesQuestion : public QWidget void setYes(bool yes = true); private: + QLabel *questionLabel; QRadioButton *yes; QRadioButton *no; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SERIES_QUESTION_H diff --git a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp index fedd54a93..c6823bd75 100644 --- a/YACReaderLibrary/comic_vine/sort_volume_comics.cpp +++ b/YACReaderLibrary/comic_vine/sort_volume_comics.cpp @@ -1,31 +1,68 @@ #include "sort_volume_comics.h" -#include +#include "local_comic_list_model.h" +#include "scraper_tableview.h" +#include "theme_manager.h" +#include "volume_comics_model.h" + +#include #include +#include #include #include -#include -#include "scraper_tableview.h" -#include "local_comic_list_model.h" -#include "volume_comics_model.h" +ScrapperToolButton::ScrapperToolButton(ScrapperToolButton::Appearance appearance, QWidget *parent) + : QPushButton(parent), appearance(appearance) +{ + setFixedSize(18, 17); + initTheme(this); +} + +QWidget *ScrapperToolButton::getSeparator() +{ + QWidget *w = new QWidget; + w->setFixedWidth(1); + auto metadataScraperDialogTheme = ThemeManager::instance().getCurrentTheme().metadataScraperDialog; + w->setStyleSheet(metadataScraperDialogTheme.scraperToolButtonSeparatorQSS); + return w; +} + +void ScrapperToolButton::paintEvent(QPaintEvent *e) +{ + QPainter p(this); + + switch (appearance) { + case LEFT: + p.fillRect(16, 0, 2, 18, fillColor); + break; + case RIGHT: + p.fillRect(0, 0, 2, 18, fillColor); + break; + default: + break; + } + + QPushButton::paintEvent(e); +} + +void ScrapperToolButton::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + setStyleSheet(metadataScraperDialogTheme.scraperToolButtonQSS); + fillColor = metadataScraperDialogTheme.scraperToolButtonFillColor; + update(); +} SortVolumeComics::SortVolumeComics(QWidget *parent) : QWidget(parent) { - QString labelStylesheet = "QLabel {color:white; font-size:12px;font-family:Arial;}"; + label = new QLabel(tr("Please, sort the list of comics on the left until it matches the comics' information.")); - QLabel *label = new QLabel(tr("Please, sort the list of comics on the left until it matches the comics' information.")); - label->setStyleSheet(labelStylesheet); - - QLabel *sortLabel = new QLabel(tr("sort comics to match comic information")); - sortLabel->setStyleSheet(labelStylesheet); + sortLabel = new QLabel(tr("sort comics to match comic information")); moveUpButtonCL = new ScrapperToolButton(ScrapperToolButton::LEFT); - moveUpButtonCL->setIcon(QIcon(":/images/comic_vine/rowUp.png")); moveUpButtonCL->setAutoRepeat(true); moveDownButtonCL = new ScrapperToolButton(ScrapperToolButton::RIGHT); - moveDownButtonCL->setIcon(QIcon(":/images/comic_vine/rowDown.png")); moveDownButtonCL->setAutoRepeat(true); // moveUpButtonIL = new ScrapperToolButton(ScrapperToolButton::LEFT); // moveUpButtonIL->setIcon(QIcon(":/images/comic_vine/rowUp.png")); @@ -98,6 +135,8 @@ SortVolumeComics::SortVolumeComics(QWidget *parent) connect(removeItemFromList, &QAction::triggered, this, &SortVolumeComics::removeSelectedComics); connect(restoreAllItems, &QAction::triggered, this, &SortVolumeComics::restoreAllComics); // connect(restoreItems,SIGNAL(triggered()),this,SLOT(showRemovedComicsSelector())); + + initTheme(this); } void SortVolumeComics::setData(QList &comics, const QString &json, const QString &vID) @@ -208,13 +247,13 @@ void SortVolumeComics::showRemovedComicsSelector() QList> SortVolumeComics::getMatchingInfo() { - QList comicList = localComicsModel->getData(); + const auto comicList = localComicsModel->getData(); QList> l; int index = 0; QString id; - foreach (ComicDB c, comicList) { + for (const auto &c : comicList) { id = volumeComicsModel->getComicId(index); if (!c.getFileName().isEmpty() && !id.isEmpty()) // there is a valid comic, and valid comic ID { @@ -225,3 +264,16 @@ QList> SortVolumeComics::getMatchingInfo() return l; } + +void SortVolumeComics::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + label->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + sortLabel->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); + + moveUpButtonCL->setIconSize(metadataScraperDialogTheme.rowUpIcon.size); + moveUpButtonCL->setIcon(metadataScraperDialogTheme.rowUpIcon.icon); + moveDownButtonCL->setIconSize(metadataScraperDialogTheme.rowDownIcon.size); + moveDownButtonCL->setIcon(metadataScraperDialogTheme.rowDownIcon.icon); +} diff --git a/YACReaderLibrary/comic_vine/sort_volume_comics.h b/YACReaderLibrary/comic_vine/sort_volume_comics.h index 2a6003415..c57248687 100644 --- a/YACReaderLibrary/comic_vine/sort_volume_comics.h +++ b/YACReaderLibrary/comic_vine/sort_volume_comics.h @@ -1,19 +1,20 @@ #ifndef SORT_VOLUME_COMICS_H #define SORT_VOLUME_COMICS_H -#include -#include -#include -#include - #include "comic_db.h" #include "scraper_results_paginator.h" +#include "themable.h" + +#include +#include +#include class ScraperTableView; class LocalComicListModel; class VolumeComicsModel; +class QLabel; -class ScrapperToolButton : public QPushButton +class ScrapperToolButton : public QPushButton, protected Themable { Q_OBJECT public: @@ -23,47 +24,21 @@ class ScrapperToolButton : public QPushButton RIGHT }; - ScrapperToolButton(ScrapperToolButton::Appearance appearance = DEFAULT, QWidget *parent = nullptr) - : QPushButton(parent), appearance(appearance) - { - setStyleSheet("QPushButton {border: none; background: #2e2e2e; color:white; border-radius:2px;}" - "QPushButton::pressed {border: none; background: #282828; color:white; border-radius:2px;}"); - setFixedSize(18, 17); - } - static QWidget *getSeparator() - { - QWidget *w = new QWidget; - w->setFixedWidth(1); - w->setStyleSheet("QWidget {background:#282828;}"); - return w; - } + ScrapperToolButton(ScrapperToolButton::Appearance appearance = DEFAULT, QWidget *parent = nullptr); + static QWidget *getSeparator(); void setAppearance(ScrapperToolButton::Appearance appearance) { this->appearance = appearance; } virtual ~ScrapperToolButton() { } protected: - void paintEvent(QPaintEvent *e) override - { - QPainter p(this); - - switch (appearance) { - case LEFT: - p.fillRect(16, 0, 2, 18, QColor("#2E2E2E")); - break; - case RIGHT: - p.fillRect(0, 0, 2, 18, QColor("#2E2E2E")); - break; - default: - break; - } - - QPushButton::paintEvent(e); - } + void paintEvent(QPaintEvent *e) override; + void applyTheme(const Theme &theme) override; private: Appearance appearance; + QColor fillColor; }; -class SortVolumeComics : public QWidget +class SortVolumeComics : public QWidget, protected Themable { Q_OBJECT public: @@ -92,6 +67,8 @@ private slots: void loadPreviousPage(); private: + QLabel *label; + QLabel *sortLabel; ScraperTableView *tableFiles; ScraperTableView *tableVolumeComics; @@ -105,6 +82,9 @@ private slots: QString currentVolumeId; ScraperResultsPaginator *paginator; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // SORT_VOLUME_COMICS_H diff --git a/YACReaderLibrary/comic_vine/title_header.cpp b/YACReaderLibrary/comic_vine/title_header.cpp index 4dd4a2aa0..3a13905e6 100644 --- a/YACReaderLibrary/comic_vine/title_header.cpp +++ b/YACReaderLibrary/comic_vine/title_header.cpp @@ -1,7 +1,7 @@ #include "title_header.h" -#include #include +#include #include TitleHeader::TitleHeader(QWidget *parent) @@ -10,9 +10,6 @@ TitleHeader::TitleHeader(QWidget *parent) mainTitleLabel = new QLabel(); subTitleLabel = new QLabel(); - mainTitleLabel->setStyleSheet("QLabel {color:white; font-size:18px;font-family:Arial;}"); - subTitleLabel->setStyleSheet("QLabel {color:white; font-size:12px;font-family:Arial;}"); - auto titleLayout = new QHBoxLayout; auto titleLabelsLayout = new QVBoxLayout; @@ -28,6 +25,8 @@ TitleHeader::TitleHeader(QWidget *parent) setContentsMargins(0, 0, 0, 0); setTitle(tr("SEARCH")); + + initTheme(this); } void TitleHeader::setTitle(const QString &title) @@ -47,3 +46,11 @@ void TitleHeader::showButtons(bool show) } else { } } + +void TitleHeader::applyTheme(const Theme &theme) +{ + auto metadataScraperDialogTheme = theme.metadataScraperDialog; + + mainTitleLabel->setStyleSheet(metadataScraperDialogTheme.titleLabelQSS); + subTitleLabel->setStyleSheet(metadataScraperDialogTheme.defaultLabelQSS); +} diff --git a/YACReaderLibrary/comic_vine/title_header.h b/YACReaderLibrary/comic_vine/title_header.h index 4a359ede3..93df1e38b 100644 --- a/YACReaderLibrary/comic_vine/title_header.h +++ b/YACReaderLibrary/comic_vine/title_header.h @@ -1,15 +1,18 @@ #ifndef TITLE_HEADER_H #define TITLE_HEADER_H +#include "themable.h" + #include class QLabel; -class TitleHeader : public QWidget +class TitleHeader : public QWidget, protected Themable { Q_OBJECT public: TitleHeader(QWidget *parent = nullptr); + public slots: void setTitle(const QString &title); void setSubTitle(const QString &title); @@ -18,6 +21,9 @@ public slots: private: QLabel *mainTitleLabel; QLabel *subTitleLabel; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // TITLE_HEADER_H diff --git a/YACReaderLibrary/comics_remover.cpp b/YACReaderLibrary/comics_remover.cpp index 7d11e9282..fcc197f9f 100644 --- a/YACReaderLibrary/comics_remover.cpp +++ b/YACReaderLibrary/comics_remover.cpp @@ -1,10 +1,10 @@ #include "comics_remover.h" -#include -#include - #include "QsLog.h" +#include +#include + ComicsRemover::ComicsRemover(QModelIndexList &il, QList &ps, qulonglong parentId, QObject *parent) : QObject(parent), indexList(il), paths(ps), parentId(parentId) { diff --git a/YACReaderLibrary/comics_remover.h b/YACReaderLibrary/comics_remover.h index c46a4cbe5..9fed42567 100644 --- a/YACReaderLibrary/comics_remover.h +++ b/YACReaderLibrary/comics_remover.h @@ -1,10 +1,8 @@ #ifndef COMICS_REMOVER_H #define COMICS_REMOVER_H -#include - #include -#include +#include class ComicsRemover : public QObject { diff --git a/YACReaderLibrary/comics_view.cpp b/YACReaderLibrary/comics_view.cpp index b2cca088c..149b2057f 100644 --- a/YACReaderLibrary/comics_view.cpp +++ b/YACReaderLibrary/comics_view.cpp @@ -1,11 +1,11 @@ #include "comics_view.h" -#include "comic.h" -#include "comic_files_manager.h" -#include "comic_db.h" #include "QsLog.h" +#include "comic.h" +#include "comic_db.h" +#include "comic_files_manager.h" -#include +#include #include ComicsView::ComicsView(QWidget *parent) @@ -17,11 +17,6 @@ ComicsView::ComicsView(QWidget *parent) view = new QQuickWidget(); - // QQuickWidget requires rendering into OpenGL framebuffer objects -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - view->quickWindow()->setGraphicsApi(QSGRendererInterface::OpenGL); -#endif - view->setResizeMode(QQuickWidget::SizeRootObjectToView); connect( view, &QQuickWidget::statusChanged, this, @@ -86,12 +81,10 @@ void ComicsView::dragEnterEvent(QDragEnterEvent *event) event->acceptProposedAction(); else { QLOG_TRACE() << "dragEnterEvent"; - QList urlList; - if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) { - urlList = event->mimeData()->urls(); + const auto urlList = event->mimeData()->urls(); QString currentPath; - foreach (QUrl url, urlList) { + for (const auto &url : urlList) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) { diff --git a/YACReaderLibrary/comics_view.h b/YACReaderLibrary/comics_view.h index 484c73543..22ab71e38 100644 --- a/YACReaderLibrary/comics_view.h +++ b/YACReaderLibrary/comics_view.h @@ -1,10 +1,12 @@ #ifndef COMICS_VIEW_H #define COMICS_VIEW_H -#include - #include "comic_model.h" +#include +#include +#include + class YACReaderTableView; class QSplitter; class ComicFlowWidget; diff --git a/YACReaderLibrary/comics_view_transition.cpp b/YACReaderLibrary/comics_view_transition.cpp index bde188b3f..886292ac7 100644 --- a/YACReaderLibrary/comics_view_transition.cpp +++ b/YACReaderLibrary/comics_view_transition.cpp @@ -1,32 +1,21 @@ #include "comics_view_transition.h" -#include -#include -#include -#include -#include -#include #include -#include "yacreader_global.h" - ComicsViewTransition::ComicsViewTransition(QWidget *parent) : QWidget(parent) { -#ifdef Y_MAC_UI - setStyleSheet("QWidget {background:#FFFFFF}"); -#else - setStyleSheet("QWidget {background:#2A2A2A}"); -#endif + initTheme(this); +} + +void ComicsViewTransition::applyTheme(const Theme &theme) +{ + setStyleSheet(QString("QWidget {background:%1}").arg(theme.gridAndInfoView.backgroundColor.name())); + update(); } void ComicsViewTransition::paintEvent(QPaintEvent *) { QPainter painter(this); - -#ifdef Y_MAC_UI - painter.fillRect(0, 0, width(), height(), QColor("#FFFFFF")); -#else - painter.fillRect(0, 0, width(), height(), QColor("#2A2A2A")); -#endif + painter.fillRect(0, 0, width(), height(), theme.gridAndInfoView.backgroundColor); } diff --git a/YACReaderLibrary/comics_view_transition.h b/YACReaderLibrary/comics_view_transition.h index 78a08c3e3..26438dc9b 100644 --- a/YACReaderLibrary/comics_view_transition.h +++ b/YACReaderLibrary/comics_view_transition.h @@ -1,15 +1,18 @@ #ifndef COMICS_VIEW_TRANSITION_H #define COMICS_VIEW_TRANSITION_H +#include "themable.h" + #include -class ComicsViewTransition : public QWidget +class ComicsViewTransition : public QWidget, protected Themable { Q_OBJECT public: explicit ComicsViewTransition(QWidget *parent = nullptr); protected: + void applyTheme(const Theme &theme) override; void paintEvent(QPaintEvent *) override; }; diff --git a/YACReaderLibrary/create_library_dialog.cpp b/YACReaderLibrary/create_library_dialog.cpp index 8fbce0930..5c3a12788 100644 --- a/YACReaderLibrary/create_library_dialog.cpp +++ b/YACReaderLibrary/create_library_dialog.cpp @@ -1,11 +1,12 @@ #include "create_library_dialog.h" + #include "yacreader_global.h" -#include -#include #include -#include +#include #include +#include +#include using namespace YACReader; @@ -35,7 +36,7 @@ void CreateLibraryDialog::setupUI() connect(cancel, &QAbstractButton::clicked, this, &CreateLibraryDialog::cancelCreate); connect(cancel, &QAbstractButton::clicked, this, &CreateLibraryDialog::close); - find = new QPushButton(QIcon(":/images/find_folder.png"), ""); + find = new QPushButton(""); connect(find, &QAbstractButton::clicked, this, &CreateLibraryDialog::findPath); auto content = new QGridLayout; @@ -66,9 +67,7 @@ void CreateLibraryDialog::setupUI() mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/new.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(this); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); @@ -76,6 +75,14 @@ void CreateLibraryDialog::setupUI() setModal(true); setWindowTitle(tr("Create new library")); + + initTheme(this); +} + +void CreateLibraryDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.newLibraryIcon); + find->setIcon(theme.dialogIcons.findFolderIcon); } void CreateLibraryDialog::open(const YACReaderLibraries &libs) diff --git a/YACReaderLibrary/create_library_dialog.h b/YACReaderLibrary/create_library_dialog.h index 836580348..82412a0f2 100644 --- a/YACReaderLibrary/create_library_dialog.h +++ b/YACReaderLibrary/create_library_dialog.h @@ -1,22 +1,27 @@ #ifndef __CREATE_LIBRARY_DIALOG_H #define __CREATE_LIBRARY_DIALOG_H +#include "themable.h" #include "yacreader_libraries.h" #include #include #include +#include #include #include -#include -class CreateLibraryDialog : public QDialog +class CreateLibraryDialog : public QDialog, protected Themable { Q_OBJECT public: CreateLibraryDialog(QWidget *parent = nullptr); +protected: + void applyTheme(const Theme &theme) override; + private: + QLabel *imgLabel; QLabel *nameLabel; QLabel *textLabel; QLabel *message; diff --git a/YACReaderLibrary/current_comic_view_helper.cpp b/YACReaderLibrary/current_comic_view_helper.cpp index 988190787..025502945 100644 --- a/YACReaderLibrary/current_comic_view_helper.cpp +++ b/YACReaderLibrary/current_comic_view_helper.cpp @@ -4,9 +4,9 @@ ComicDB currentComicFromModel(ComicModel *model, bool &found) { - auto comics = model->getAllComics(); + const auto comics = model->getAllComics(); - foreach (auto comic, comics) { + for (const auto &comic : comics) { if (comic.info.read == false) { found = true; return comic; diff --git a/YACReaderLibrary/db/comic_item.cpp b/YACReaderLibrary/db/comic_item.cpp index 96cc0d800..d7abfd6ec 100644 --- a/YACReaderLibrary/db/comic_item.cpp +++ b/YACReaderLibrary/db/comic_item.cpp @@ -1,8 +1,8 @@ -#include - #include "comic_item.h" +#include + //! [0] ComicItem::ComicItem(const QList &data) diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index b0a401298..501d09520 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -1,16 +1,18 @@ -#include -#include -#include -#include +#include "comic_model.h" +#include "comic_db.h" #include "comic_item.h" -#include "comic_model.h" #include "data_base_management.h" -#include "qnaturalsorting.h" -#include "comic_db.h" #include "db_helper.h" +#include "qnaturalsorting.h" #include "reading_list_model.h" +#include "yacreader_global_gui.h" + +#include +#include +#include +#include #ifdef use_unarr #include @@ -72,17 +74,20 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int if (!data->formats().contains(YACReader::YACReaderLibrarComiscSelectionMimeDataFormat)) return false; - QList comicIds = YACReader::mimeDataToComicsIds(data); + const QList comicIds = YACReader::mimeDataToComicsIds(data); QList currentIndexes; int i; - foreach (qulonglong id, comicIds) { - i = 0; - foreach (ComicItem *item, _data) { - if (item->data(Id) == id) { - currentIndexes << i; - break; + { + const auto ¤tData = _data; + for (const auto id : comicIds) { + i = 0; + for (auto *item : currentData) { + if (item->data(Id) == id) { + currentIndexes << i; + break; + } + i++; } - i++; } } @@ -100,26 +105,30 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int QList newSorting; - i = 0; - foreach (ComicItem *item, _data) { - if (!currentIndexes.contains(i)) { - - if (item == destinationItem) { - foreach (int index, currentIndexes) { - resortedData << _data.at(index); - newSorting << index; + const auto ¤tIndexList = currentIndexes; + { + const auto ¤tData = _data; + i = 0; + for (auto *item : currentData) { + if (!currentIndexes.contains(i)) { + + if (item == destinationItem) { + for (const auto index : currentIndexList) { + resortedData << _data.at(index); + newSorting << index; + } } + + resortedData << item; + newSorting << i; } - resortedData << item; - newSorting << i; + i++; } - - i++; } if (destinationItem == 0) { - foreach (int index, currentIndexes) { + for (const auto index : currentIndexList) { resortedData << _data.at(index); newSorting << index; } @@ -132,9 +141,10 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int if (tempRow < 0) tempRow = _data.count(); - foreach (qulonglong id, comicIds) { + for (const auto id : comicIds) { int i = 0; - foreach (ComicItem *item, _data) { + const auto dataSnapshot = _data; + for (auto *item : dataSnapshot) { if (item->data(Id) == id) { beginMoveRows(parent, i, i, parent, tempRow); @@ -160,7 +170,8 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int // TODO fix selection QList allComicIds; - foreach (ComicItem *item, _data) { + const auto &allData = _data; + for (auto *item : allData) { allComicIds << item->data(Id).toULongLong(); } QString connectionName = ""; @@ -209,7 +220,7 @@ QMimeData *ComicModel::mimeData(const QModelIndexList &indexes) const // custom model data // application/yacreader-comics-ids + list of ids in a QByteArray QList ids; - foreach (QModelIndex index, indexes) { + for (const auto &index : indexes) { QLOG_DEBUG() << "dragging : " << index.data(IdRole).toULongLong(); ids << index.data(IdRole).toULongLong(); } @@ -378,7 +389,7 @@ QVariant ComicModel::data(const QModelIndex &index, int role) const Qt::ItemFlags ComicModel::flags(const QModelIndex &index) const { if (!index.isValid()) - return {}; + return { }; if (index.column() == ComicModel::Rating) return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; @@ -603,7 +614,8 @@ QList ComicModel::createReadingListData(unsigned long long parentRe enableResorting = ids.length() == 1; // only resorting if no sublists exist - foreach (qulonglong id, ids) { + const auto &readingListIds = ids; + for (const auto id : readingListIds) { QSqlQuery selectQuery(db); selectQuery.prepare("SELECT " COMIC_MODEL_QUERY_FIELDS " " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " @@ -994,10 +1006,11 @@ QList ComicModel::getComics(QList list) QVector ComicModel::setComicsRead(QList list, YACReaderComicReadStatus read) { QString connectionName = ""; + const auto &comicIndexes = list; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { if (read == YACReader::Read) { _data.value(mi.row())->setData(ComicModel::ReadColumn, QVariant(true)); bool found; @@ -1031,10 +1044,11 @@ QVector ComicModel::setComicsRead(QList l void ComicModel::setComicsType(QList list, FileType type) { QString connectionName = ""; + const auto &comicIndexes = list; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { bool found; ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ComicModel::Id).toULongLong(), db, found); c.info.type = QVariant::fromValue(type); @@ -1045,7 +1059,7 @@ void ComicModel::setComicsType(QList list, FileType type) } QSqlDatabase::removeDatabase(connectionName); - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { _data.value(mi.row())->setData(ComicModel::Type, QVariant::fromValue(type)); } @@ -1056,12 +1070,13 @@ qint64 ComicModel::asignNumbers(QList list, int startingNumber) { qint64 idFirst; QString connectionName = ""; + const auto &comicIndexes = list; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); idFirst = _data.value(list[0].row())->data(ComicModel::Id).toULongLong(); int i = 0; - foreach (QModelIndex mi, list) { + for (const auto &mi : comicIndexes) { bool found; ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ComicModel::Id).toULongLong(), db, found); c.info.number = startingNumber + i; @@ -1095,7 +1110,7 @@ QList ComicModel::getIndexesFromIds(const QList &comicI { QList comicsIndexes; - foreach (qulonglong id, comicIds) + for (const auto id : comicIds) comicsIndexes << getIndexFromId(id); return comicsIndexes; @@ -1178,7 +1193,8 @@ void ComicModel::reload(const ComicDB &comic) { int row = 0; bool found = false; - foreach (ComicItem *item, _data) { + const auto ¤tData = _data; + for (auto *item : currentData) { if (item->data(ComicModel::Id).toULongLong() == comic.id) { found = true; item->setData(ComicModel::ReadColumn, comic.info.read); diff --git a/YACReaderLibrary/db/comic_model.h b/YACReaderLibrary/db/comic_model.h index d82b8369a..9426ed57b 100644 --- a/YACReaderLibrary/db/comic_model.h +++ b/YACReaderLibrary/db/comic_model.h @@ -1,14 +1,14 @@ #ifndef TABLEMODEL_H #define TABLEMODEL_H +#include "yacreader_global.h" + #include #include -#include -#include #include +#include #include - -#include "yacreader_global_gui.h" +#include class ComicDB; diff --git a/YACReaderLibrary/db/comic_query_result_processor.cpp b/YACReaderLibrary/db/comic_query_result_processor.cpp index e1cf5e526..edfe35d5a 100644 --- a/YACReaderLibrary/db/comic_query_result_processor.cpp +++ b/YACReaderLibrary/db/comic_query_result_processor.cpp @@ -6,6 +6,8 @@ #include "qnaturalsorting.h" #include "search_query.h" +#include + YACReader::ComicQueryResultProcessor::ComicQueryResultProcessor() : querySearchQueue(1) { diff --git a/YACReaderLibrary/db/comic_query_result_processor.h b/YACReaderLibrary/db/comic_query_result_processor.h index 1a7359ee8..103b522e0 100644 --- a/YACReaderLibrary/db/comic_query_result_processor.h +++ b/YACReaderLibrary/db/comic_query_result_processor.h @@ -1,12 +1,11 @@ #ifndef COMIC_QUERY_RESULT_PROCESSOR_H #define COMIC_QUERY_RESULT_PROCESSOR_H -#include -#include - -#include "yacreader_global.h" #include "concurrent_queue.h" +#include +#include + class ComicItem; namespace YACReader { diff --git a/YACReaderLibrary/db/data_base_management.cpp b/YACReaderLibrary/db/data_base_management.cpp index 2a3ad18bd..767da97b4 100644 --- a/YACReaderLibrary/db/data_base_management.cpp +++ b/YACReaderLibrary/db/data_base_management.cpp @@ -1,12 +1,14 @@ #include "data_base_management.h" -#include -#include "initial_comic_info_extractor.h" -#include "check_new_version.h" +#include "QsLog.h" #include "db_helper.h" -#include "yacreader_libraries.h" +#include "initial_comic_info_extractor.h" -#include "QsLog.h" +#include +#include +#include +#include +#include using namespace YACReader; @@ -751,8 +753,7 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest) } destDB.commit(); - QString hash; - foreach (hash, hashes) { + for (const auto &hash : hashes) { QSqlQuery getComic(destDB); getComic.prepare("SELECT c.path,ci.coverPage FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) where ci.hash = :hash"); getComic.bindValue(":hash", hash); @@ -858,7 +859,7 @@ bool DataBaseManagement::addColumns(const QString &tableName, const QStringList QString sql = "ALTER TABLE %1 ADD COLUMN %2"; bool returnValue = true; - foreach (QString columnDef, columnDefs) { + for (const auto &columnDef : columnDefs) { QSqlQuery alterTable(db); alterTable.prepare(sql.arg(tableName).arg(columnDef)); // alterTableComicInfo.bindValue(":column_def",columnDef); @@ -923,10 +924,10 @@ int DataBaseManagement::compareVersions(const QString &v1, const QString v2) QList v1il; QList v2il; - foreach (QString s, v1l) + for (const auto &s : v1l) v1il.append(s.toInt()); - foreach (QString s, v2l) + for (const auto &s : v2l) v2il.append(s.toInt()); for (int i = 0; i < qMin(v1il.length(), v2il.length()); i++) { diff --git a/YACReaderLibrary/db/data_base_management.h b/YACReaderLibrary/db/data_base_management.h index ec4a5168a..1e170afd5 100644 --- a/YACReaderLibrary/db/data_base_management.h +++ b/YACReaderLibrary/db/data_base_management.h @@ -1,11 +1,8 @@ #ifndef __DATA_BASE_MANAGEMENT_H #define __DATA_BASE_MANAGEMENT_H -#include -#include #include - -#include "folder_model.h" +#include class ComicsInfoExporter : public QThread { diff --git a/YACReaderLibrary/db/folder_item.cpp b/YACReaderLibrary/db/folder_item.cpp index 3b54f13b2..8b539b4ab 100644 --- a/YACReaderLibrary/db/folder_item.cpp +++ b/YACReaderLibrary/db/folder_item.cpp @@ -1,8 +1,9 @@ -#include - #include "folder_item.h" + #include "qnaturalsorting.h" +#include + FolderItem::FolderItem(const QList &data, FolderItem *parent) { parentItem = parent; diff --git a/YACReaderLibrary/db/folder_item.h b/YACReaderLibrary/db/folder_item.h index ef77c4d9b..071e0a9b4 100644 --- a/YACReaderLibrary/db/folder_item.h +++ b/YACReaderLibrary/db/folder_item.h @@ -42,8 +42,8 @@ #define TREEITEM_H #include -#include #include +#include class FolderItem { diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index 74bb75c41..3048f60fd 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -1,57 +1,55 @@ #include "folder_model.h" -#include "folder_item.h" #include "data_base_management.h" -#include "folder.h" #include "db_helper.h" +#include "folder.h" +#include "folder_item.h" #include "qnaturalsorting.h" - #include "yacreader_global.h" -#include "yacreader_global_gui.h" -#include +#include +#include +#include #include using namespace YACReader; -#ifdef Y_MAC_UI -#include -QIcon finishedFolderIcon; -void drawMacOSXFinishedFolderIcon() +QIcon drawFinishedFolderIcon(const QPixmap &overlay) { + QIcon finishedIcon; QIcon ico = QFileIconProvider().icon(QFileIconProvider::Folder); QPixmap pixNormalOff = ico.pixmap(16, 16, QIcon::Normal, QIcon::Off); QPixmap pixNormalOn = ico.pixmap(16, 16, QIcon::Normal, QIcon::On); QPixmap pixSelectedOff = ico.pixmap(16, 16, QIcon::Selected, QIcon::Off); QPixmap pixSelectedOn = ico.pixmap(16, 16, QIcon::Selected, QIcon::On); - QPixmap tick(":/images/folder_finished_macosx.png"); { QPainter p(&pixNormalOff); - p.drawPixmap(4, 7, tick); + p.drawPixmap(4, 7, overlay); } - finishedFolderIcon.addPixmap(pixNormalOff, QIcon::Normal, QIcon::Off); + finishedIcon.addPixmap(pixNormalOff, QIcon::Normal, QIcon::Off); { QPainter p(&pixNormalOn); - p.drawPixmap(4, 7, tick); + p.drawPixmap(4, 7, overlay); } - finishedFolderIcon.addPixmap(pixNormalOn, QIcon::Normal, QIcon::On); + finishedIcon.addPixmap(pixNormalOn, QIcon::Normal, QIcon::On); { QPainter p(&pixSelectedOff); - p.drawPixmap(4, 7, tick); + p.drawPixmap(4, 7, overlay); } - finishedFolderIcon.addPixmap(pixSelectedOff, QIcon::Selected, QIcon::Off); + finishedIcon.addPixmap(pixSelectedOff, QIcon::Selected, QIcon::Off); { QPainter p(&pixSelectedOn); - p.drawPixmap(4, 7, tick); + p.drawPixmap(4, 7, overlay); } - finishedFolderIcon.addPixmap(pixSelectedOn, QIcon::Selected, QIcon::On); + finishedIcon.addPixmap(pixSelectedOn, QIcon::Selected, QIcon::On); + + return finishedIcon; } -#endif #define ROOT 1 @@ -132,8 +130,22 @@ FolderItem *createRoot(QSqlDatabase &db) } FolderModel::FolderModel(QObject *parent) - : QAbstractItemModel(parent), isSubfolder(false), rootItem(nullptr), folderIcon(YACReader::noHighlightedIcon(":/images/sidebar/folder.svg")), folderFinishedIcon(YACReader::noHighlightedIcon(":/images/sidebar/folder_finished.svg")), showRecent(false), recentDays(1) + : QAbstractItemModel(parent), isSubfolder(false), rootItem(nullptr), showRecent(false), recentDays(1) { + initTheme(this); +} + +void FolderModel::applyTheme(const Theme &theme) +{ + const auto &sidebarIcons = theme.sidebarIcons; + + if (sidebarIcons.useSystemFolderIcons) { + folderIcon = QFileIconProvider().icon(QFileIconProvider::Folder); + folderFinishedIcon = drawFinishedFolderIcon(sidebarIcons.folderReadOverlay); + } else { + folderIcon = theme.navigationTree.folderIcon; + folderFinishedIcon = theme.navigationTree.folderFinishedIcon; + } } FolderModel::~FolderModel() @@ -184,7 +196,7 @@ void FolderModel::reload() takeUpdatedChildrenInfo(rootItem, QModelIndex(), newModelData.rootItem); // copy items from newModelData to this model that are not in this model - foreach (auto key, newModelData.items.keys()) { + for (const auto key : newModelData.items.keys()) { if (!items.contains(key)) { items[key] = (newModelData.items[key]); } @@ -209,7 +221,7 @@ void FolderModel::reload() items = newModelData.items; // copy items from newModelData to this model that are not in this model - foreach (auto key, newModelData.items.keys()) { + for (const auto key : newModelData.items.keys()) { if (!items.contains(key)) { items[key] = (newModelData.items[key]); } @@ -368,22 +380,10 @@ QVariant FolderModel::data(const QModelIndex &index, int role) const } if (role == Qt::DecorationRole) { -#ifdef Y_MAC_UI - if (item->data(FolderModel::Finished).toBool()) { - if (finishedFolderIcon.isNull()) { - drawMacOSXFinishedFolderIcon(); - } - - return QVariant(finishedFolderIcon); - } else { - return QVariant(QFileIconProvider().icon(QFileIconProvider::Folder)); - } -#else if (item->data(FolderModel::Finished).toBool()) return QVariant(folderFinishedIcon); else return QVariant(folderIcon); -#endif } if (role == FolderModel::FolderNameRole) { @@ -433,7 +433,7 @@ QVariant FolderModel::data(const QModelIndex &index, int role) const Qt::ItemFlags FolderModel::flags(const QModelIndex &index) const { if (!index.isValid()) - return {}; + return { }; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled; } @@ -605,7 +605,7 @@ void FolderModel::updateFolderCompletedStatus(const QModelIndexList &list, bool { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : list) { auto item = static_cast(mi.internalPointer()); item->setData(FolderModel::Completed, status); @@ -629,7 +629,7 @@ void FolderModel::updateFolderFinishedStatus(const QModelIndexList &list, bool s { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : list) { auto item = static_cast(mi.internalPointer()); item->setData(FolderModel::Finished, status); @@ -653,7 +653,7 @@ void FolderModel::updateFolderType(const QModelIndexList &list, YACReader::FileT { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); db.transaction(); - foreach (QModelIndex mi, list) { + for (const auto &mi : list) { auto item = static_cast(mi.internalPointer()); std::function setType; diff --git a/YACReaderLibrary/db/folder_model.h b/YACReaderLibrary/db/folder_model.h index 85ccfa23d..f1cf381ba 100644 --- a/YACReaderLibrary/db/folder_model.h +++ b/YACReaderLibrary/db/folder_model.h @@ -1,18 +1,19 @@ #ifndef TREEMODEL_H #define TREEMODEL_H +#include "folder.h" +#include "folder_query_result_processor.h" +#include "themable.h" +#include "yacreader_global.h" + #include -#include +#include #include -#include -#include +#include #include +#include #include -#include - -#include "folder.h" -#include "folder_query_result_processor.h" -#include "yacreader_global.h" +#include class FolderItem; @@ -35,7 +36,7 @@ class FolderModelProxy : public QSortFilterProxyModel bool filterEnabled; }; -class FolderModel : public QAbstractItemModel +class FolderModel : public QAbstractItemModel, protected Themable { Q_OBJECT @@ -146,6 +147,9 @@ public slots: bool showRecent; qlonglong recentDays; + +protected: + void applyTheme(const Theme &theme) override; }; #endif diff --git a/YACReaderLibrary/db/folder_query_result_processor.cpp b/YACReaderLibrary/db/folder_query_result_processor.cpp index ec276a592..6ce4705c7 100644 --- a/YACReaderLibrary/db/folder_query_result_processor.cpp +++ b/YACReaderLibrary/db/folder_query_result_processor.cpp @@ -1,12 +1,13 @@ #include "folder_query_result_processor.h" +#include "data_base_management.h" #include "folder_item.h" #include "folder_model.h" -#include "data_base_management.h" #include "search_query.h" -#include #include +#include +#include // Copy/pasted from "folder_model.cpp" #define ROOT 1 diff --git a/YACReaderLibrary/db/folder_query_result_processor.h b/YACReaderLibrary/db/folder_query_result_processor.h index fd966aee8..5114e7d04 100644 --- a/YACReaderLibrary/db/folder_query_result_processor.h +++ b/YACReaderLibrary/db/folder_query_result_processor.h @@ -1,10 +1,10 @@ #ifndef FOLDER_QUERY_RESULT_PROCESSOR_H #define FOLDER_QUERY_RESULT_PROCESSOR_H -#include - #include "concurrent_queue.h" +#include + class FolderItem; class FolderModel; class QSqlQuery; diff --git a/YACReaderLibrary/db/query_lexer.h b/YACReaderLibrary/db/query_lexer.h index d3136d0b1..ece898e95 100644 --- a/YACReaderLibrary/db/query_lexer.h +++ b/YACReaderLibrary/db/query_lexer.h @@ -36,8 +36,8 @@ class Token } private: - Type _type {}; - std::string _lexeme {}; + Type _type { }; + std::string _lexeme { }; }; class QueryLexer diff --git a/YACReaderLibrary/db/query_parser.cpp b/YACReaderLibrary/db/query_parser.cpp index 35fd77e33..e79cde4f2 100644 --- a/YACReaderLibrary/db/query_parser.cpp +++ b/YACReaderLibrary/db/query_parser.cpp @@ -1,12 +1,11 @@ #include "query_parser.h" +#include #include -#include + #include #include -#include - const std::map> QueryParser::fieldNames { { FieldType::numeric, { "numpages", "count", "arccount", "alternateCount", "rating" } }, { FieldType::text, { "date", "number", "arcnumber", "title", "volume", "storyarc", "genere", "writer", "penciller", "inker", "colorist", "letterer", "coverartist", "publisher", "format", "agerating", "synopsis", "characters", "notes", "editor", "imprint", "teams", "locations", "series", "alternateSeries", "alternateNumber", "languageISO", "seriesGroup", "mainCharacterOrTeam", "review", "tags" } }, @@ -316,9 +315,9 @@ QueryParser::TreeNode QueryParser::expression() } auto right = token(true); - return TreeNode("expression", { TreeNode(toLower(left), {}), TreeNode(right, {}) }, expOperator); + return TreeNode("expression", { TreeNode(toLower(left), { }), TreeNode(right, { }) }, expOperator); } else { - return TreeNode("expression", { TreeNode("all", {}), TreeNode(left, {}) }); + return TreeNode("expression", { TreeNode("all", { }), TreeNode(left, { }) }); } } @@ -328,12 +327,12 @@ QueryParser::TreeNode QueryParser::expression() QueryParser::TreeNode QueryParser::baseToken() { if (tokenType() == Token::Type::quotedWord) { - return TreeNode("expression", { TreeNode("all", {}), TreeNode(token(true), {}) }); + return TreeNode("expression", { TreeNode("all", { }), TreeNode(token(true), { }) }); } if (tokenType() == Token::Type::word) { - return TreeNode("expression", { TreeNode("all", {}), TreeNode(token(true), {}) }); + return TreeNode("expression", { TreeNode("all", { }), TreeNode(token(true), { }) }); } - return TreeNode("expression", { TreeNode("all", {}), TreeNode(token(true), {}) }); + return TreeNode("expression", { TreeNode("all", { }), TreeNode(token(true), { }) }); } diff --git a/YACReaderLibrary/db/query_parser.h b/YACReaderLibrary/db/query_parser.h index 3e22c9dd1..1e1f5ee5d 100644 --- a/YACReaderLibrary/db/query_parser.h +++ b/YACReaderLibrary/db/query_parser.h @@ -3,11 +3,12 @@ #include "query_lexer.h" -#include #include + +#include +#include #include #include -#include #define SEARCH_FOLDERS_QUERY "SELECT DISTINCT f.* FROM folder f LEFT JOIN comic c ON (f.id = c.parentId) INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) WHERE " #define SEARCH_COMICS_QUERY "SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.currentPage,ci.rating,ci.hasBeenOpened,ci.date,ci.added,ci.type,ci.lastTimeOpened,ci.series,ci.volume,ci.storyArc FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) LEFT JOIN folder f ON (f.id == c.parentId) WHERE " diff --git a/YACReaderLibrary/db/reading_list_item.cpp b/YACReaderLibrary/db/reading_list_item.cpp index fc3c6a5d4..985fe4aad 100644 --- a/YACReaderLibrary/db/reading_list_item.cpp +++ b/YACReaderLibrary/db/reading_list_item.cpp @@ -1,10 +1,11 @@ #include "reading_list_item.h" + +#include "QsLog.h" #include "qnaturalsorting.h" +#include "theme_manager.h" #include -#include "QsLog.h" - ListItem::ListItem(const QList &data) : itemData(data) { @@ -35,8 +36,18 @@ SpecialListItem::SpecialListItem(const QList &data) QIcon SpecialListItem::getIcon() const { if (itemData.count() > Id) { - QString id = itemData.at(Id).toString(); - return YACReader::noHighlightedIcon(QString(":/images/lists/default_%1.svg").arg(id)); + int id = itemData.at(Id).toInt(); + const auto &icons = ThemeManager::instance().getCurrentTheme().readingListIcons; + switch (id) { + case 0: + return icons.readingListIcon; + case 1: + return icons.favoritesIcon; + case 2: + return icons.currentlyReadingIcon; + default: + break; + } } QLOG_WARN() << "Icon for SpecialListItem not available"; @@ -75,8 +86,11 @@ LabelItem::LabelItem(const QList &data) QIcon LabelItem::getIcon() const { if (itemData.count() > Color) { - QString color = itemData.at(Color).toString(); - return YACReader::noHighlightedIcon(QString(":/images/lists/label_%1.svg").arg(color).toLower()); + QString color = itemData.at(Color).toString().toLower(); + const auto &icons = ThemeManager::instance().getCurrentTheme().readingListIcons; + if (icons.labelIcons.contains(color)) { + return icons.labelIcons[color]; + } } QLOG_WARN() << "Icon for label item not available"; @@ -127,20 +141,19 @@ qulonglong LabelItem::getId() const //------------------------------------------------------ ReadingListItem::ReadingListItem(const QList &data, ReadingListItem *p) - : ListItem(data), parent(p), list(YACReader::noHighlightedIcon(":/images/lists/list.svg")), folder(YACReader::noHighlightedIcon(":/images/sidebar/folder.svg")) + : ListItem(data), parent(p) { } QIcon ReadingListItem::getIcon() const { + const auto &theme = ThemeManager::instance().getCurrentTheme(); if (parent->getId() == 0) - return list; // top level list - else -#ifdef Y_MAC_UI + return theme.readingListIcons.listIcon; // top level list + else if (theme.sidebarIcons.useSystemFolderIcons) return QFileIconProvider().icon(QFileIconProvider::Folder); -#else - return folder; // sublist -#endif + else + return theme.navigationTree.folderIcon; // sublist } int ReadingListItem::childCount() const diff --git a/YACReaderLibrary/db/reading_list_item.h b/YACReaderLibrary/db/reading_list_item.h index b7d06685a..61bfbf6e5 100644 --- a/YACReaderLibrary/db/reading_list_item.h +++ b/YACReaderLibrary/db/reading_list_item.h @@ -1,11 +1,10 @@ #ifndef READING_LIST_ITEM_H #define READING_LIST_ITEM_H +#include "reading_list_model.h" + #include #include - -#include "yacreader_global_gui.h" -#include "reading_list_model.h" // TODO add propper constructors, using QList is not safe class ListItem @@ -82,9 +81,6 @@ class ReadingListItem : public ListItem private: QList childItems; - QIcon list; - QIcon folder; - enum DataIndexes { Name, Id, diff --git a/YACReaderLibrary/db/reading_list_model.cpp b/YACReaderLibrary/db/reading_list_model.cpp index 856fa87b3..b3391658c 100644 --- a/YACReaderLibrary/db/reading_list_model.cpp +++ b/YACReaderLibrary/db/reading_list_model.cpp @@ -1,14 +1,13 @@ #include "reading_list_model.h" -#include "reading_list_item.h" - +#include "QsLog.h" #include "data_base_management.h" -#include "qnaturalsorting.h" #include "db_helper.h" +#include "qnaturalsorting.h" +#include "reading_list_item.h" +#include "yacreader_global_gui.h" -#include "QsLog.h" - -#include +#include ReadingListModel::ReadingListModel(QObject *parent) : QAbstractItemModel(parent), rootItem(0) @@ -101,11 +100,11 @@ QVariant ReadingListModel::data(const QModelIndex &index, int role) const Qt::ItemFlags ReadingListModel::flags(const QModelIndex &index) const { if (!index.isValid()) - return {}; + return { }; auto item = static_cast(index.internalPointer()); if (typeid(*item) == typeid(ReadingListSeparatorItem)) - return {}; + return { }; if (typeid(*item) == typeid(ReadingListItem) && static_cast(item)->parent->getId() != 0) return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled; // only sublists are dragable @@ -712,7 +711,7 @@ void ReadingListModel::reorderingChildren(QList children) { QList childrenIds; int i = 0; - foreach (ReadingListItem *item, children) { + for (auto *item : children) { item->setOrdering(i++); childrenIds << item->getId(); } diff --git a/YACReaderLibrary/db/reading_list_model.h b/YACReaderLibrary/db/reading_list_model.h index 2e0b73b2a..7f5efb515 100644 --- a/YACReaderLibrary/db/reading_list_model.h +++ b/YACReaderLibrary/db/reading_list_model.h @@ -1,14 +1,14 @@ #ifndef READING_LIST_MODEL_H #define READING_LIST_MODEL_H +#include "yacreader_global.h" + #include -#include #include -#include -#include +#include #include - -#include "yacreader_global.h" +#include +#include class LabelItem; class SpecialListItem; diff --git a/YACReaderLibrary/db/search_query.cpp b/YACReaderLibrary/db/search_query.cpp index bd1d6cd3d..0ede13fad 100644 --- a/YACReaderLibrary/db/search_query.cpp +++ b/YACReaderLibrary/db/search_query.cpp @@ -1,9 +1,10 @@ #include "search_query.h" + #include "query_parser.h" -#include #include +#include QSqlQuery foldersSearchQuery(QSqlDatabase &db, const QString &filter) { diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 42d1bf822..9e8afe145 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -1,31 +1,29 @@ #include "db_helper.h" -#include -#include -#include +#include "QsLog.h" +#include "comic_db.h" +#include "data_base_management.h" +#include "folder.h" +#include "library_item.h" +#include "qnaturalsorting.h" +#include "reading_list.h" +#include "yacreader_global.h" +#include "yacreader_libraries.h" + +#include #include #include #include -#include -#include +#include +#include #include -#include +#include #include +#include +#include +#include #include -#include - -#include "reading_list.h" -#include "library_item.h" -#include "comic_db.h" -#include "data_base_management.h" -#include "folder.h" -#include "yacreader_libraries.h" -#include "yacreader_global.h" - -#include "qnaturalsorting.h" - -#include "QsLog.h" using namespace YACReader; @@ -438,7 +436,8 @@ QList DBHelper::getReadingListFullContent(qulonglong libraryId, qulongl while (subfolders.next()) ids << subfolders.value(0).toULongLong(); - foreach (qulonglong id, ids) { + const auto &subfolderIds = ids; + for (const auto id : subfolderIds) { QSqlQuery selectQuery(db); QString params; @@ -548,7 +547,7 @@ void DBHelper::deleteComicsFromFavorites(const QList &comicsList, QSqlD QSqlQuery query(db); query.prepare("DELETE FROM comic_default_reading_list WHERE comic_id = :comic_id AND default_reading_list_id = 1"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.exec(); } @@ -580,7 +579,7 @@ void DBHelper::deleteComicsFromLabel(const QList &comicsList, qulonglon QSqlQuery query(db); query.prepare("DELETE FROM comic_label WHERE comic_id = :comic_id AND label_id = :label_id"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.bindValue(":label_id", labelId); query.exec(); @@ -600,7 +599,7 @@ void DBHelper::deleteComicsFromReadingList(const QList &comicsList, qul QSqlQuery query(db); query.prepare("DELETE FROM comic_reading_list WHERE comic_id = :comic_id AND reading_list_id = :reading_list_id"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.bindValue(":reading_list_id", readingListId); query.exec(); @@ -1088,7 +1087,8 @@ QMap> DBHelper::updateFromRemoteClient(const QMap> moreRecentComics; - foreach (qulonglong libraryId, comics.keys()) { + const auto libraryIds = comics.keys(); + for (const auto libraryId : libraryIds) { QList libraryMoreRecentComics; QString libraryPath = DBHelper::getLibraries().getPath(libraryId); @@ -1110,7 +1110,8 @@ QMap> DBHelper::updateFromRemoteClient(const QMap comicInfo.id contains comic id ComicDB comic = DBHelper::loadComic(comicInfo.id, db, found); @@ -1195,11 +1196,10 @@ QMap> DBHelper::updateFromRemoteClient(const QMap &comics) { - YACReaderLibraries libraries = DBHelper::getLibraries(); - - QStringList names = libraries.getNames(); + const YACReaderLibraries libraries = DBHelper::getLibraries(); + const QStringList names = libraries.getNames(); - foreach (QString name, names) { + for (const auto &name : names) { QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name)); QString connectionName = ""; { @@ -1216,7 +1216,7 @@ void DBHelper::updateFromRemoteClientWithHash(const QList &comics) "rating = :rating" " WHERE id = :id "); - foreach (ComicInfo comicInfo, comics) { + for (const auto &comicInfo : comics) { ComicInfo info = loadComicInfo(comicInfo.hash, db); if (!info.existOnDb) { @@ -1287,7 +1287,8 @@ void DBHelper::reasignOrderToSublists(QList ids, QSqlDatabase &db) "WHERE id = :id"); db.transaction(); int order = 0; - foreach (qulonglong id, ids) { + const auto &readingListIds = ids; + for (const auto id : readingListIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":id", id); updateOrdering.exec(); @@ -1304,7 +1305,8 @@ void DBHelper::reasignOrderToComicsInFavorites(QList comicIds, QSqlD "WHERE comic_id = :comic_id AND default_reading_list_id = 1"); db.transaction(); int order = 0; - foreach (qulonglong id, comicIds) { + const auto &favoriteComicIds = comicIds; + for (const auto id : favoriteComicIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":comic_id", id); updateOrdering.exec(); @@ -1321,7 +1323,8 @@ void DBHelper::reasignOrderToComicsInLabel(qulonglong labelId, QList "WHERE comic_id = :comic_id AND label_id = :label_id"); db.transaction(); int order = 0; - foreach (qulonglong id, comicIds) { + const auto &labelComicIds = comicIds; + for (const auto id : labelComicIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":comic_id", id); updateOrdering.bindValue(":label_id", labelId); @@ -1339,7 +1342,8 @@ void DBHelper::reasignOrderToComicsInReadingList(qulonglong readingListId, QList "WHERE comic_id = :comic_id AND reading_list_id = :reading_list_id"); db.transaction(); int order = 0; - foreach (qulonglong id, comicIds) { + const auto &readingListComicIds = comicIds; + for (const auto id : readingListComicIds) { updateOrdering.bindValue(":ordering", order++); updateOrdering.bindValue(":comic_id", id); updateOrdering.bindValue(":reading_list_id", readingListId); @@ -1357,7 +1361,8 @@ void DBHelper::updateComicsInfo(QList &comics, const QString &databaseP QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); db.open(); db.transaction(); - foreach (ComicDB comic, comics) { + const auto &comicsRef = comics; + for (auto comic : comicsRef) { DBHelper::update(&(comic.info), db); } db.commit(); @@ -1489,7 +1494,7 @@ void DBHelper::insertComicsInFavorites(const QList &comicsList, QSqlDat query.prepare("INSERT INTO comic_default_reading_list (default_reading_list_id, comic_id, ordering) " "VALUES (1, :comic_id, :ordering)"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":comic_id", comic.id); query.bindValue(":ordering", numComics++); query.exec(); @@ -1513,7 +1518,7 @@ void DBHelper::insertComicsInLabel(const QList &comicsList, qulonglong query.prepare("INSERT INTO comic_label (label_id, comic_id, ordering) " "VALUES (:label_id, :comic_id, :ordering)"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":label_id", labelId); query.bindValue(":comic_id", comic.id); query.bindValue(":ordering", numComics++); @@ -1538,7 +1543,7 @@ void DBHelper::insertComicsInReadingList(const QList &comicsList, qulon query.prepare("INSERT INTO comic_reading_list (reading_list_id, comic_id, ordering) " "VALUES (:reading_list_id, :comic_id, :ordering)"); - foreach (ComicDB comic, comicsList) { + for (const auto &comic : comicsList) { query.bindValue(":reading_list_id", readingListId); query.bindValue(":comic_id", comic.id); query.bindValue(":ordering", numComics++); diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 56d22670a..c67b38921 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -2,10 +2,11 @@ #define DB_HELPER_H class QString; -#include -#include #include "yacreader_global.h" +#include +#include + class ComicDB; class Folder; class LibraryItem; diff --git a/YACReaderLibrary/empty_container_info.cpp b/YACReaderLibrary/empty_container_info.cpp index 5fb1d514d..b6ee15db3 100644 --- a/YACReaderLibrary/empty_container_info.cpp +++ b/YACReaderLibrary/empty_container_info.cpp @@ -1,20 +1,14 @@ #include "empty_container_info.h" -#include "yacreader_global.h" +#include EmptyContainerInfo::EmptyContainerInfo(QWidget *parent) : QWidget(parent), iconLabel(new QLabel()), titleLabel(new QLabel()) { -#ifdef Y_MAC_UI - backgroundColor = "#FFFFFF"; - titleLabel->setStyleSheet("QLabel {color:#888888; font-size:24px;font-family:Arial;font-weight:bold;}"); -#else - backgroundColor = "#2A2A2A"; - titleLabel->setStyleSheet("QLabel {color:#CCCCCC; font-size:24px;font-family:Arial;font-weight:bold;}"); -#endif - iconLabel->setAlignment(Qt::AlignCenter); titleLabel->setAlignment(Qt::AlignCenter); + + initTheme(this); } void EmptyContainerInfo::setPixmap(const QPixmap &pixmap) @@ -45,5 +39,11 @@ QVBoxLayout *EmptyContainerInfo::setUpDefaultLayout(bool addStretch) void EmptyContainerInfo::paintEvent(QPaintEvent *) { QPainter painter(this); - painter.fillRect(0, 0, width(), height(), QColor(backgroundColor)); + painter.fillRect(0, 0, width(), height(), theme.emptyContainer.backgroundColor); +} + +void EmptyContainerInfo::applyTheme(const Theme &theme) +{ + titleLabel->setStyleSheet(theme.emptyContainer.titleLabelQSS); + update(); // Trigger repaint for background color } diff --git a/YACReaderLibrary/empty_container_info.h b/YACReaderLibrary/empty_container_info.h index 1a1b36321..a2c19be36 100644 --- a/YACReaderLibrary/empty_container_info.h +++ b/YACReaderLibrary/empty_container_info.h @@ -1,9 +1,16 @@ #ifndef EMPTY_CONTAINER_INFO_H #define EMPTY_CONTAINER_INFO_H -#include +#include "themable.h" -class EmptyContainerInfo : public QWidget +#include +#include +#include +#include +#include +#include + +class EmptyContainerInfo : public QWidget, protected Themable { Q_OBJECT public: @@ -17,10 +24,10 @@ public slots: protected: void paintEvent(QPaintEvent *) override; + void applyTheme(const Theme &theme) override; QLabel *iconLabel; QLabel *titleLabel; - QString backgroundColor; }; #endif // EMPTY_CONTAINER_INFO_H diff --git a/YACReaderLibrary/empty_folder_widget.cpp b/YACReaderLibrary/empty_folder_widget.cpp index a2bb1d137..421a501c6 100644 --- a/YACReaderLibrary/empty_folder_widget.cpp +++ b/YACReaderLibrary/empty_folder_widget.cpp @@ -1,190 +1,15 @@ #include "empty_folder_widget.h" -#include "yacreader_global.h" - -#include -#include -#include -#include -#include - -#include "comic.h" -#include "comic_files_manager.h" -#include "QsLog.h" - -void testListView(QListView *l) -{ - QStringListModel *slm = new QStringListModel(QStringList() << "Lorem ipsum" - << "Hailer skualer" - << "Mumbaluba X" - << "Finger layden" - << "Pacum tactus filer" - << "Aposum" - << "En" - << "Lorem ipsum" - << "Hailer skualer" - << "Mumbaluba X" - << "Finger layden" - << "Pacum tactus filer" - << "Aposum" - << "En"); - l->setModel(slm); -} - -class ListviewDelegate : public QStyledItemDelegate -{ -public: - ListviewDelegate() - : QStyledItemDelegate() { } - - virtual ~ListviewDelegate() { } - - void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const override - { - painter->save(); - - QFontMetrics fm(option.font); - QString text = qvariant_cast(index.data(Qt::DisplayRole)); - - QRect textRect = option.rect; - - textRect.setLeft(std::max(0, (option.rect.size().width() - fm.horizontalAdvance(text)) / 2)); - - painter->drawText(textRect, text); - - painter->restore(); - - // TODO add mouse hover style ?? - } - - QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const override - { - QFontMetrics fm(option.font); - QString text = qvariant_cast(index.data(Qt::DisplayRole)); - - return QSize(fm.horizontalAdvance(text), fm.height()); - } -}; - EmptyFolderWidget::EmptyFolderWidget(QWidget *parent) - : EmptyContainerInfo(parent), subfoldersModel(new QStringListModel()) + : EmptyContainerInfo(parent) { - QVBoxLayout *layout = setUpDefaultLayout(false); - - iconLabel->setPixmap(QPixmap(":/images/empty_folder.png")); - titleLabel->setText(tr("Subfolders in this folder")); - - foldersView = new QListView(); - foldersView->setAttribute(Qt::WA_MacShowFocusRect, false); - foldersView->setItemDelegate(new ListviewDelegate); -#ifdef Y_MAC_UI - foldersView->setStyleSheet("QListView {background-color:transparent; border: none; color:#959595; outline:0; font-size: 18px; show-decoration-selected: 0; margin:0}" - "QListView::item:selected {background-color: #EFEFEF; color:#CCCCCC;}" - "QListView::item:hover {background-color:#F4F4F8; color:#757575; }" - - "QScrollBar:vertical { border-radius:3px; background: #FFFFFF; width: 14px; margin: 0 10px 0 0; }" - "QScrollBar::handle:vertical { border: 1px solid #999999; background: #999999; width: 14px; min-height: 20px; border-radius: 2px; }" - "QScrollBar::add-line:vertical { border: none; background: #999999; height: 0px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" - - "QScrollBar::sub-line:vertical { border: none; background: #999999; height: 0px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" - "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" - - "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }" - "QScrollBar:horizontal{height:0px;}"); -#else - foldersView->setStyleSheet("QListView {background-color:transparent; border: none; color:#858585; outline:0; font-size: 18px; font:bold; show-decoration-selected: 0; margin:0}" - "QListView::item:selected {background-color: #212121; color:#CCCCCC;}" - "QListView::item:hover {background-color:#212121; color:#CCCCCC; }" - - "QScrollBar:vertical { border: none; background: #212121; width: 14px; margin: 0 10px 0 0; }" - "QScrollBar::handle:vertical { background: #858585; width: 14px; min-height: 20px; }" - "QScrollBar::add-line:vertical { border: none; background: #212121; height: 0px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" - - "QScrollBar::sub-line:vertical { border: none; background: #212121; height: 0px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" - "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" - - "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }" - "QScrollBar:horizontal{height:0px;}"); - -#endif - foldersView->setSizePolicy(QSizePolicy ::Expanding, QSizePolicy ::Expanding); - - layout->addSpacing(12); - layout->addWidget(foldersView, 1); - layout->addStretch(); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); - - setContentsMargins(0, 0, 0, 0); - - setStyleSheet(QString("QWidget {background:%1}").arg(backgroundColor)); - - setSizePolicy(QSizePolicy ::Expanding, QSizePolicy ::Expanding); - - setAcceptDrops(true); - - connect(foldersView, &QAbstractItemView::clicked, this, &EmptyFolderWidget::onItemClicked); -} - -void EmptyFolderWidget::setSubfolders(const QModelIndex &mi, const QStringList &foldersNames) -{ - parent = mi; - subfoldersModel->setStringList(foldersNames); - foldersView->setModel(subfoldersModel); - - if (foldersNames.isEmpty()) { - titleLabel->setText(tr("Empty folder") + QString("

%1

").arg(tr("Drag and drop folders and comics here"))); - } else { - titleLabel->setText(tr("Subfolders in this folder")); - } + setUpDefaultLayout(true); + setPixmap(theme.emptyContainer.emptyFolderIcon); + setText(tr("This folder doesn't contain comics yet")); } -void EmptyFolderWidget::onItemClicked(const QModelIndex &mi) +void EmptyFolderWidget::applyTheme(const Theme &theme) { - emit subfolderSelected(parent, mi.row()); -} - -// TODO remove repeated code in drag & drop support.... -void EmptyFolderWidget::dragEnterEvent(QDragEnterEvent *event) -{ - QList urlList; - - if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) { - urlList = event->mimeData()->urls(); - QString currentPath; - foreach (QUrl url, urlList) { - // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) - currentPath = url.toLocalFile(); - if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) { - event->acceptProposedAction(); - return; - } - } - } -} - -void EmptyFolderWidget::dropEvent(QDropEvent *event) -{ - QLOG_DEBUG() << "drop in emptyfolder" << event->dropAction(); - - bool validAction = event->dropAction() == Qt::CopyAction; // || event->dropAction() & Qt::MoveAction; TODO move - - if (validAction) { - - QList> droppedFiles = ComicFilesManager::getDroppedFiles(event->mimeData()->urls()); - - if (event->dropAction() == Qt::CopyAction) { - QLOG_DEBUG() << "copy in emptyfolder:" << droppedFiles; - emit copyComicsToCurrentFolder(droppedFiles); - } else if (event->dropAction() & Qt::MoveAction) { - QLOG_DEBUG() << "move in emptyfolder:" << droppedFiles; - emit moveComicsToCurrentFolder(droppedFiles); - } - - event->acceptProposedAction(); - } + EmptyContainerInfo::applyTheme(theme); + setPixmap(theme.emptyContainer.emptyFolderIcon); } diff --git a/YACReaderLibrary/empty_folder_widget.h b/YACReaderLibrary/empty_folder_widget.h index 948f354bc..1b8fdf695 100644 --- a/YACReaderLibrary/empty_folder_widget.h +++ b/YACReaderLibrary/empty_folder_widget.h @@ -2,33 +2,15 @@ #define EMPTY_FOLDER_WIDGET_H #include "empty_container_info.h" -#include class EmptyFolderWidget : public EmptyContainerInfo { Q_OBJECT public: explicit EmptyFolderWidget(QWidget *parent = nullptr); - void setSubfolders(const QModelIndex &mi, const QStringList &foldersNames); -signals: - void subfolderSelected(QModelIndex, int); - - // Drops - void copyComicsToCurrentFolder(QList>); - void moveComicsToCurrentFolder(QList>); - -public slots: - void onItemClicked(const QModelIndex &mi); protected: - QListView *foldersView; - QModelIndex parent; - QStringListModel *subfoldersModel; - QString backgroundColor; - - // Drop to import - void dragEnterEvent(QDragEnterEvent *event) override; - void dropEvent(QDropEvent *event) override; + void applyTheme(const Theme &theme) override; }; #endif // EMPTY_FOLDER_WIDGET_H diff --git a/YACReaderLibrary/empty_label_widget.cpp b/YACReaderLibrary/empty_label_widget.cpp index 0680dea8c..75c36c0b1 100644 --- a/YACReaderLibrary/empty_label_widget.cpp +++ b/YACReaderLibrary/empty_label_widget.cpp @@ -4,18 +4,20 @@ EmptyLabelWidget::EmptyLabelWidget(QWidget *parent) : EmptyContainerInfo(parent) { setUpDefaultLayout(true); - - iconLabel->setPixmap(QPixmap(":/images/empty_label.png")); - - // titleLabel->setText(tr("This label doesn't contain comics yet") + QString("

%1

").arg(tr("Drag and drop folders and comics here"))); titleLabel->setText(tr("This label doesn't contain comics yet")); } void EmptyLabelWidget::setColor(YACReader::LabelColors color) { - QPixmap p(":/images/empty_label.png"); - QImage img = p.toImage().convertToFormat(QImage::Format_ARGB32); - QColor destColor(YACReader::labelColorToRGBString(color)); - YACReader::colorize(img, destColor); - iconLabel->setPixmap(QPixmap::fromImage(img)); + currentColor = color; + auto it = theme.emptyContainer.emptyLabelIcons.find(static_cast(color)); + if (it != theme.emptyContainer.emptyLabelIcons.end()) { + setPixmap(it.value()); + } +} + +void EmptyLabelWidget::applyTheme(const Theme &theme) +{ + EmptyContainerInfo::applyTheme(theme); + setColor(currentColor); } diff --git a/YACReaderLibrary/empty_label_widget.h b/YACReaderLibrary/empty_label_widget.h index 850b6fd9f..c17dfd55f 100644 --- a/YACReaderLibrary/empty_label_widget.h +++ b/YACReaderLibrary/empty_label_widget.h @@ -1,9 +1,8 @@ #ifndef EMPTY_LABEL_WIDGET_H #define EMPTY_LABEL_WIDGET_H -#include #include "empty_container_info.h" -#include "yacreader_global_gui.h" +#include "yacreader_global.h" class EmptyLabelWidget : public EmptyContainerInfo { @@ -12,11 +11,11 @@ class EmptyLabelWidget : public EmptyContainerInfo explicit EmptyLabelWidget(QWidget *parent = nullptr); void setColor(YACReader::LabelColors color); -signals: - -public slots: - protected: + void applyTheme(const Theme &theme) override; + +private: + YACReader::LabelColors currentColor = YACReader::YRed; }; #endif // EMPTY_LABEL_WIDGET_H diff --git a/YACReaderLibrary/empty_reading_list_widget.cpp b/YACReaderLibrary/empty_reading_list_widget.cpp index 1e79943a3..59b3e3297 100644 --- a/YACReaderLibrary/empty_reading_list_widget.cpp +++ b/YACReaderLibrary/empty_reading_list_widget.cpp @@ -4,6 +4,12 @@ EmptyReadingListWidget::EmptyReadingListWidget(QWidget *parent) : EmptyContainerInfo(parent) { setUpDefaultLayout(true); - setPixmap(QPixmap(":/images/empty_reading_list")); + setPixmap(theme.emptyContainer.emptyReadingListIcon); setText(tr("This reading list does not contain any comics yet")); } + +void EmptyReadingListWidget::applyTheme(const Theme &theme) +{ + EmptyContainerInfo::applyTheme(theme); + setPixmap(theme.emptyContainer.emptyReadingListIcon); +} diff --git a/YACReaderLibrary/empty_reading_list_widget.h b/YACReaderLibrary/empty_reading_list_widget.h index 4fa7fa257..7abd2760e 100644 --- a/YACReaderLibrary/empty_reading_list_widget.h +++ b/YACReaderLibrary/empty_reading_list_widget.h @@ -1,13 +1,15 @@ #ifndef EMPTY_READING_LIST_WIDGET_H #define EMPTY_READING_LIST_WIDGET_H -#include #include "empty_container_info.h" class EmptyReadingListWidget : public EmptyContainerInfo { public: EmptyReadingListWidget(QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; }; #endif // EMPTY_READING_LIST_WIDGET_H diff --git a/YACReaderLibrary/empty_special_list.cpp b/YACReaderLibrary/empty_special_list.cpp index 44a428d3f..8f0b9d1a6 100644 --- a/YACReaderLibrary/empty_special_list.cpp +++ b/YACReaderLibrary/empty_special_list.cpp @@ -5,3 +5,45 @@ EmptySpecialListWidget::EmptySpecialListWidget(QWidget *parent) { setUpDefaultLayout(true); } + +void EmptySpecialListWidget::showFavorites() +{ + currentType = Favorites; + setPixmap(theme.emptyContainer.emptyFavoritesIcon); + setText(tr("No favorites")); +} + +void EmptySpecialListWidget::showReading() +{ + currentType = Reading; + setPixmap(theme.emptyContainer.emptyCurrentReadingsIcon); + setText(tr("You are not reading anything yet, come on!!")); +} + +void EmptySpecialListWidget::showRecent() +{ + currentType = Recent; + setPixmap(QPixmap()); + setText(tr("There are no recent comics!")); +} + +void EmptySpecialListWidget::applyTheme(const Theme &theme) +{ + EmptyContainerInfo::applyTheme(theme); + updateIcon(); +} + +void EmptySpecialListWidget::updateIcon() +{ + switch (currentType) { + case Favorites: + setPixmap(theme.emptyContainer.emptyFavoritesIcon); + break; + case Reading: + setPixmap(theme.emptyContainer.emptyCurrentReadingsIcon); + break; + case Recent: + case None: + break; + } +} diff --git a/YACReaderLibrary/empty_special_list.h b/YACReaderLibrary/empty_special_list.h index 481bd9e7a..87967c9ce 100644 --- a/YACReaderLibrary/empty_special_list.h +++ b/YACReaderLibrary/empty_special_list.h @@ -1,13 +1,30 @@ #ifndef EMPTY_SPECIAL_LIST_H #define EMPTY_SPECIAL_LIST_H -#include #include "empty_container_info.h" class EmptySpecialListWidget : public EmptyContainerInfo { public: + enum SpecialListType { + None, + Favorites, + Reading, + Recent + }; + EmptySpecialListWidget(QWidget *parent = nullptr); + + void showFavorites(); + void showReading(); + void showRecent(); + +protected: + void applyTheme(const Theme &theme) override; + +private: + void updateIcon(); + SpecialListType currentType = None; }; #endif // EMPTY_SPECIAL_LIST_H diff --git a/YACReaderLibrary/export_comics_info_dialog.cpp b/YACReaderLibrary/export_comics_info_dialog.cpp index 1cd9c7fa3..9b06cd43b 100644 --- a/YACReaderLibrary/export_comics_info_dialog.cpp +++ b/YACReaderLibrary/export_comics_info_dialog.cpp @@ -1,12 +1,12 @@ #include "export_comics_info_dialog.h" -#include -#include -#include +#include "data_base_management.h" + #include +#include +#include #include - -#include "data_base_management.h" +#include ExportComicsInfoDialog::ExportComicsInfoDialog(QWidget *parent) : QDialog(parent) @@ -23,7 +23,7 @@ ExportComicsInfoDialog::ExportComicsInfoDialog(QWidget *parent) connect(cancel, &QAbstractButton::clicked, this, &ExportComicsInfoDialog::close); connect(cancel, &QAbstractButton::clicked, this, &QDialog::rejected); - find = new QPushButton(QIcon(":/images/find_folder.png"), ""); + find = new QPushButton(""); connect(find, &QAbstractButton::clicked, this, &ExportComicsInfoDialog::findPath); auto libraryLayout = new QHBoxLayout; @@ -45,9 +45,7 @@ ExportComicsInfoDialog::ExportComicsInfoDialog(QWidget *parent) mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/exportComicsInfo.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(this); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); @@ -55,6 +53,14 @@ ExportComicsInfoDialog::ExportComicsInfoDialog(QWidget *parent) setModal(true); setWindowTitle(tr("Export comics info")); + + initTheme(this); +} + +void ExportComicsInfoDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.exportComicsInfoIcon); + find->setIcon(theme.dialogIcons.findFolderIcon); } ExportComicsInfoDialog::~ExportComicsInfoDialog() diff --git a/YACReaderLibrary/export_comics_info_dialog.h b/YACReaderLibrary/export_comics_info_dialog.h index f5a8e82fc..fb679c380 100644 --- a/YACReaderLibrary/export_comics_info_dialog.h +++ b/YACReaderLibrary/export_comics_info_dialog.h @@ -1,12 +1,14 @@ #ifndef EXPORT_COMICS_INFO_DIALOG_H #define EXPORT_COMICS_INFO_DIALOG_H +#include "themable.h" + #include #include #include #include -class ExportComicsInfoDialog : public QDialog +class ExportComicsInfoDialog : public QDialog, protected Themable { Q_OBJECT @@ -15,12 +17,16 @@ class ExportComicsInfoDialog : public QDialog ~ExportComicsInfoDialog() override; QString source; +protected: + void applyTheme(const Theme &theme) override; + public slots: void findPath(); void exportComicsInfo(); void close(); private: + QLabel *imgLabel; QLabel *progress; QLabel *textLabel; QLineEdit *path; diff --git a/YACReaderLibrary/export_library_dialog.cpp b/YACReaderLibrary/export_library_dialog.cpp index 971ca9af1..0548b5019 100644 --- a/YACReaderLibrary/export_library_dialog.cpp +++ b/YACReaderLibrary/export_library_dialog.cpp @@ -1,9 +1,10 @@ #include "export_library_dialog.h" -#include -#include + +#include #include +#include #include -#include +#include ExportLibraryDialog::ExportLibraryDialog(QWidget *parent) : QDialog(parent), progressCount(0) @@ -20,7 +21,7 @@ ExportLibraryDialog::ExportLibraryDialog(QWidget *parent) connect(cancel, &QAbstractButton::clicked, this, &ExportLibraryDialog::close); connect(cancel, &QAbstractButton::clicked, this, &QDialog::rejected); - find = new QPushButton(QIcon(":/images/find_folder.png"), ""); + find = new QPushButton(""); connect(find, &QAbstractButton::clicked, this, &ExportLibraryDialog::findPath); auto libraryLayout = new QHBoxLayout; @@ -48,9 +49,7 @@ ExportLibraryDialog::ExportLibraryDialog(QWidget *parent) mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/exportLibrary.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(this); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); @@ -58,6 +57,14 @@ ExportLibraryDialog::ExportLibraryDialog(QWidget *parent) setModal(true); setWindowTitle(tr("Create covers package")); + + initTheme(this); +} + +void ExportLibraryDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.exportLibraryIcon); + find->setIcon(theme.dialogIcons.findFolderIcon); } void ExportLibraryDialog::exportLibrary() diff --git a/YACReaderLibrary/export_library_dialog.h b/YACReaderLibrary/export_library_dialog.h index 1c3e8025d..32a9c847b 100644 --- a/YACReaderLibrary/export_library_dialog.h +++ b/YACReaderLibrary/export_library_dialog.h @@ -1,26 +1,33 @@ #ifndef EXPORT_LIBRARY_DIALOG_H #define EXPORT_LIBRARY_DIALOG_H +#include "themable.h" + #include #include #include +#include #include #include #include #include -#include -class ExportLibraryDialog : public QDialog +class ExportLibraryDialog : public QDialog, protected Themable { Q_OBJECT public: ExportLibraryDialog(QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; + public slots: void exportLibrary(); void findPath(); void close(); private: + QLabel *imgLabel; int progressCount; QProgressBar *progressBar; QLabel *textLabel; diff --git a/YACReaderLibrary/files.qrc b/YACReaderLibrary/files.qrc deleted file mode 100644 index 7a37b2ec1..000000000 --- a/YACReaderLibrary/files.qrc +++ /dev/null @@ -1,12 +0,0 @@ - - - ../files/about.html - ../files/helpYACReaderLibrary.html - - - - ../files/about_es_ES.html - ../files/helpYACReaderLibrary_es_ES.html - - - diff --git a/YACReaderLibrary/folder_content_view.cpp b/YACReaderLibrary/folder_content_view.cpp index 679e8f2d2..b14e51871 100644 --- a/YACReaderLibrary/folder_content_view.cpp +++ b/YACReaderLibrary/folder_content_view.cpp @@ -1,23 +1,25 @@ #include "folder_content_view.h" +#include "QsLog.h" +#include "comic.h" +#include "comic_files_manager.h" #include "folder_model.h" #include "grid_comics_view.h" -#include "yacreader_global.h" #include "yacreader_global_gui.h" #include "yacreader_tool_bar_stretch.h" -#include "comic.h" -#include "comic_files_manager.h" - -#include "QsLog.h" +#include +#include #include #include #include +#include +#include using namespace YACReader; FolderContentView::FolderContentView(QAction *toogleRecentVisibilityAction, QWidget *parent) - : QWidget { parent }, parent(QModelIndex()), comicModel(new ComicModel()), folderModel(new FolderModel()) + : QWidget { parent }, parent(QModelIndex()), comicModel(new ComicModel()), folderModel(new FolderModel()), smallZoomLabel(nullptr), bigZoomLabel(nullptr) { qmlRegisterType("com.yacreader.FolderModel", 1, 0, "FolderModel"); @@ -26,11 +28,6 @@ FolderContentView::FolderContentView(QAction *toogleRecentVisibilityAction, QWid view = new QQuickWidget(); - // QQuickWidget requires rendering into OpenGL framebuffer objects -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - view->quickWindow()->setGraphicsApi(QSGRendererInterface::OpenGL); -#endif - view->setResizeMode(QQuickWidget::SizeRootObjectToView); connect( view, &QQuickWidget::statusChanged, this, @@ -46,14 +43,16 @@ FolderContentView::FolderContentView(QAction *toogleRecentVisibilityAction, QWid coverSizeSlider->setOrientation(Qt::Horizontal); coverSizeSlider->setRange(YACREADER_MIN_GRID_ZOOM_WIDTH, YACREADER_MAX_GRID_ZOOM_WIDTH); + const auto &comicsToolbar = theme.comicsViewToolbar; + auto horizontalLayout = new QHBoxLayout(); - QLabel *smallLabel = new QLabel(); - smallLabel->setPixmap(hdpiPixmap(":/images/comics_view_toolbar/small_size_grid_zoom.svg", QSize(18, 18))); - horizontalLayout->addWidget(smallLabel); + smallZoomLabel = new QLabel(); + smallZoomLabel->setPixmap(comicsToolbar.smallGridZoomIcon.pixmap(18, 18)); + horizontalLayout->addWidget(smallZoomLabel); horizontalLayout->addWidget(coverSizeSlider, 0, Qt::AlignVCenter); - QLabel *bigLabel = new QLabel(); - bigLabel->setPixmap(hdpiPixmap(":/images/comics_view_toolbar/big_size_grid_zoom.svg", QSize(18, 18))); - horizontalLayout->addWidget(bigLabel); + bigZoomLabel = new QLabel(); + bigZoomLabel->setPixmap(comicsToolbar.bigGridZoomIcon.pixmap(18, 18)); + horizontalLayout->addWidget(bigZoomLabel); horizontalLayout->addSpacing(10); horizontalLayout->setContentsMargins(0, 0, 0, 0); @@ -62,10 +61,6 @@ FolderContentView::FolderContentView(QAction *toogleRecentVisibilityAction, QWid connect(coverSizeSlider, &QAbstractSlider::valueChanged, this, &FolderContentView::setCoversSize); toolbar = new QToolBar(); - toolbar->setStyleSheet(R"( - QToolBar { border: none; } - QToolButton:checked { background-color: #cccccc; } - )"); toolbar->setIconSize(QSize(18, 18)); toolbar->addWidget(new YACReaderToolBarStretch); toolbar->addAction(toogleRecentVisibilityAction); @@ -82,84 +77,16 @@ FolderContentView::FolderContentView(QAction *toogleRecentVisibilityAction, QWid QQmlContext *ctxt = view->rootContext(); - LibraryUITheme theme; -#ifdef Y_MAC_UI - theme = Light; -#else - theme = Dark; -#endif - - if (theme == Light) { - ctxt->setContextProperty("continueReadingBackgroundColor", "#E8E8E8"); - ctxt->setContextProperty("continueReadingColor", "#000000"); - - ctxt->setContextProperty("backgroundColor", "#F6F6F6"); - ctxt->setContextProperty("cellColor", "#FFFFFF"); - ctxt->setContextProperty("selectedColor", "#FFFFFF"); - ctxt->setContextProperty("selectedBorderColor", "#007AFF"); - ctxt->setContextProperty("borderColor", "#DBDBDB"); - ctxt->setContextProperty("titleColor", "#121212"); - ctxt->setContextProperty("textColor", "#636363"); - // fonts settings - ctxt->setContextProperty("fontSize", 11); - ctxt->setContextProperty("fontFamily", QApplication::font().family()); - ctxt->setContextProperty("fontSpacing", 0.5); - - // info - copy/pasted from info_comics_view TODO create helpers for setting the UI config - ctxt->setContextProperty("infoBackgroundColor", "#FFFFFF"); - ctxt->setContextProperty("topShadow", QUrl()); - ctxt->setContextProperty("infoShadow", "info-shadow-light.png"); - ctxt->setContextProperty("infoIndicator", "info-indicator-light.png"); - - ctxt->setContextProperty("infoTextColor", "#404040"); - ctxt->setContextProperty("infoTitleColor", "#2E2E2E"); - - ctxt->setContextProperty("ratingUnselectedColor", "#DEDEDE"); - ctxt->setContextProperty("ratingSelectedColor", "#2B2B2B"); - - ctxt->setContextProperty("favUncheckedColor", "#DEDEDE"); - ctxt->setContextProperty("favCheckedColor", "#E84852"); - - ctxt->setContextProperty("readTickUncheckedColor", "#DEDEDE"); - ctxt->setContextProperty("readTickCheckedColor", "#E84852"); - } else { - ctxt->setContextProperty("continueReadingBackgroundColor", "#88000000"); - ctxt->setContextProperty("continueReadingColor", "#FFFFFF"); - - ctxt->setContextProperty("backgroundColor", "#2A2A2A"); - ctxt->setContextProperty("cellColor", "#212121"); - ctxt->setContextProperty("selectedColor", "#121212"); - ctxt->setContextProperty("selectedBorderColor", "#121212"); - ctxt->setContextProperty("borderColor", "#121212"); - ctxt->setContextProperty("titleColor", "#FFFFFF"); - ctxt->setContextProperty("textColor", "#A8A8A8"); - ctxt->setContextProperty("dropShadow", QVariant(false)); - // fonts settings - int fontSize = QApplication::font().pointSize(); - if (fontSize == -1) - fontSize = QApplication::font().pixelSize(); - ctxt->setContextProperty("fontSize", fontSize); - ctxt->setContextProperty("fontFamily", QApplication::font().family()); - ctxt->setContextProperty("fontSpacing", 0.5); - - // info - copy/pasted from info_comics_view TODO create helpers for setting the UI config - ctxt->setContextProperty("infoBackgroundColor", "#2E2E2E"); - ctxt->setContextProperty("topShadow", "info-top-shadow.png"); - ctxt->setContextProperty("infoShadow", "info-shadow.png"); - ctxt->setContextProperty("infoIndicator", "info-indicator.png"); - - ctxt->setContextProperty("infoTextColor", "#B0B0B0"); - ctxt->setContextProperty("infoTitleColor", "#FFFFFF"); - - ctxt->setContextProperty("ratingUnselectedColor", "#1C1C1C"); - ctxt->setContextProperty("ratingSelectedColor", "#FFFFFF"); - - ctxt->setContextProperty("favUncheckedColor", "#1C1C1C"); - ctxt->setContextProperty("favCheckedColor", "#E84852"); - - ctxt->setContextProperty("readTickUncheckedColor", "#1C1C1C"); - ctxt->setContextProperty("readTickCheckedColor", "#E84852"); - } + // fonts settings (not theme-dependent) + int fontSize = QApplication::font().pointSize(); + if (fontSize == -1) + fontSize = QApplication::font().pixelSize(); + ctxt->setContextProperty("fontSize", fontSize); + ctxt->setContextProperty("fontFamily", QApplication::font().family()); + ctxt->setContextProperty("fontSpacing", 0.5); + + // Apply theme colors + initTheme(this); updateCoversSizeInContext(YACREADER_MIN_COVER_WIDTH, ctxt); @@ -309,7 +236,7 @@ bool FolderContentView::canDropUrls(const QList &urls, Qt::DropAction acti { if (action == Qt::CopyAction) { QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) @@ -333,3 +260,57 @@ void FolderContentView::droppedFiles(const QList &urls, Qt::DropAction act emit copyComicsToCurrentFolder(droppedFiles); } } + +void FolderContentView::applyTheme(const Theme &theme) +{ + QQmlContext *ctxt = view->rootContext(); + const auto &giv = theme.gridAndInfoView; + + toolbar->setStyleSheet(theme.comicsViewToolbar.toolbarQSS); + + // Continue reading section colors + ctxt->setContextProperty("continueReadingBackgroundColor", giv.continueReadingBackgroundColor); + ctxt->setContextProperty("continueReadingTextColor", giv.continueReadingTextColor); + + // Grid colors + ctxt->setContextProperty("backgroundColor", giv.backgroundColor); + ctxt->setContextProperty("cellColor", giv.cellColor); + ctxt->setContextProperty("cellSelectedColor", giv.cellSelectedColor); + ctxt->setContextProperty("cellSelectedBorderColor", giv.cellSelectedBorderColor); + ctxt->setContextProperty("borderColor", giv.borderColor); + ctxt->setContextProperty("itemTitleColor", giv.itemTitleColor); + ctxt->setContextProperty("itemDetailsColor", giv.itemDetailsColor); + ctxt->setContextProperty("dropShadow", QVariant(giv.showDropShadow)); + + // Info panel colors + ctxt->setContextProperty("infoBackgroundColor", giv.infoBackgroundColor); + ctxt->setContextProperty("infoMetadataTextColor", giv.infoMetadataTextColor); + ctxt->setContextProperty("infoTextColor", giv.infoTextColor); + + // Rating and favorite colors + ctxt->setContextProperty("ratingUnselectedColor", giv.ratingUnselectedColor); + ctxt->setContextProperty("ratingSelectedColor", giv.ratingSelectedColor); + ctxt->setContextProperty("favUncheckedColor", giv.favUncheckedColor); + ctxt->setContextProperty("favCheckedColor", giv.favCheckedColor); + ctxt->setContextProperty("readTickUncheckedColor", giv.readTickUncheckedColor); + ctxt->setContextProperty("readTickCheckedColor", giv.readTickCheckedColor); + + // New item indicator, cover borders, placeholder pages, scrollbar + ctxt->setContextProperty("newItemColor", giv.newItemColor); + ctxt->setContextProperty("scrollbarColor", giv.scrollbarColor); + ctxt->setContextProperty("scrollbarBorderColor", giv.scrollbarBorderColor); + ctxt->setContextProperty("comicCoverBorderColor", giv.comicCoverBorderColor); + ctxt->setContextProperty("folderCoverBorderColor", giv.folderCoverBorderColor); + ctxt->setContextProperty("placeholderFolder1Color", giv.placeholderFolder1Color); + ctxt->setContextProperty("placeholderFolder1BorderColor", giv.placeholderFolder1BorderColor); + ctxt->setContextProperty("placeholderFolder2Color", giv.placeholderFolder2Color); + ctxt->setContextProperty("placeholderFolder2BorderColor", giv.placeholderFolder2BorderColor); + + // Update zoom slider icons + if (smallZoomLabel) { + smallZoomLabel->setPixmap(theme.comicsViewToolbar.smallGridZoomIcon.pixmap(18, 18)); + } + if (bigZoomLabel) { + bigZoomLabel->setPixmap(theme.comicsViewToolbar.bigGridZoomIcon.pixmap(18, 18)); + } +} diff --git a/YACReaderLibrary/folder_content_view.h b/YACReaderLibrary/folder_content_view.h index f199491b2..22d124779 100644 --- a/YACReaderLibrary/folder_content_view.h +++ b/YACReaderLibrary/folder_content_view.h @@ -1,12 +1,15 @@ #ifndef FOLDERCONTENTVIEW_H #define FOLDERCONTENTVIEW_H -#include - +#include "comic_db.h" #include "comic_model.h" - #include "folder.h" -#include "comic_db.h" +#include "themable.h" + +#include +#include +#include +#include class FolderModel; class ComicModel; @@ -15,7 +18,7 @@ class YACReaderToolBarStretch; class QQuickWidget; class QQmlContext; -class FolderContentView : public QWidget +class FolderContentView : public QWidget, protected Themable { Q_OBJECT public: @@ -28,6 +31,7 @@ class FolderContentView : public QWidget void setRecentRange(int days); FolderModel *currentFolderModel() { return folderModel; } + public slots: void updateSettings(); @@ -62,6 +66,8 @@ protected slots: std::unique_ptr comicModel; FolderModel *folderModel; + void applyTheme(const Theme &theme) override; + private: QSettings *settings; QToolBar *toolbar; @@ -72,6 +78,10 @@ protected slots: QAction *coverSizeSliderAction; QAction *showInfoAction; QAction *showInfoSeparatorAction; + + // Zoom slider labels (for theming) + QLabel *smallZoomLabel; + QLabel *bigZoomLabel; }; #endif // FOLDERCONTENTVIEW_H diff --git a/YACReaderLibrary/grid_comics_view.cpp b/YACReaderLibrary/grid_comics_view.cpp index 485128636..26fd4aaf4 100644 --- a/YACReaderLibrary/grid_comics_view.cpp +++ b/YACReaderLibrary/grid_comics_view.cpp @@ -1,21 +1,26 @@ #include "grid_comics_view.h" -#include -#include -#include - -#include "comic.h" -#include "comic_files_manager.h" #include "QsLog.h" -#include "yacreader_global.h" -#include "yacreader_tool_bar_stretch.h" +#include "comic.h" #include "comic_db.h" -#include "yacreader_comics_selection_helper.h" -#include "yacreader_comic_info_helper.h" +#include "comic_files_manager.h" #include "current_comic_view_helper.h" +#include "yacreader_comic_info_helper.h" +#include "yacreader_comics_selection_helper.h" +#include "yacreader_global_gui.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include GridComicsView::GridComicsView(QWidget *parent) - : ComicsView(parent), filterEnabled(false) + : ComicsView(parent), filterEnabled(false), smallZoomLabel(nullptr), bigZoomLabel(nullptr) { settings = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat, this); settings->beginGroup("libraryConfig"); @@ -29,83 +34,13 @@ GridComicsView::GridComicsView(QWidget *parent) QQmlContext *ctxt = view->rootContext(); - LibraryUITheme theme; -#ifdef Y_MAC_UI - theme = Light; -#else - theme = Dark; -#endif - - if (theme == Light) { - ctxt->setContextProperty("backgroundColor", "#F6F6F6"); - ctxt->setContextProperty("cellColor", "#FFFFFF"); - ctxt->setContextProperty("selectedColor", "#FFFFFF"); - ctxt->setContextProperty("selectedBorderColor", "#007AFF"); - ctxt->setContextProperty("borderColor", "#DBDBDB"); - ctxt->setContextProperty("titleColor", "#121212"); - ctxt->setContextProperty("textColor", "#636363"); - ctxt->setContextProperty("showDropShadow", QVariant(false)); - // fonts settings - ctxt->setContextProperty("fontSize", 11); - ctxt->setContextProperty("fontFamily", QApplication::font().family()); - ctxt->setContextProperty("fontSpacing", 0.5); - - // info - copy/pasted from info_comics_view TODO create helpers for setting the UI config - ctxt->setContextProperty("infoBackgroundColor", "#FFFFFF"); - ctxt->setContextProperty("topShadow", QUrl()); - ctxt->setContextProperty("infoShadow", "info-shadow-light.png"); - ctxt->setContextProperty("infoIndicator", "info-indicator-light.png"); - - ctxt->setContextProperty("infoTextColor", "#404040"); - ctxt->setContextProperty("infoTitleColor", "#2E2E2E"); - - ctxt->setContextProperty("ratingUnselectedColor", "#DEDEDE"); - ctxt->setContextProperty("ratingSelectedColor", "#2B2B2B"); - - ctxt->setContextProperty("favUncheckedColor", "#DEDEDE"); - ctxt->setContextProperty("favCheckedColor", "#E84852"); - - ctxt->setContextProperty("readTickUncheckedColor", "#DEDEDE"); - ctxt->setContextProperty("readTickCheckedColor", "#E84852"); - - ctxt->setContextProperty("currentComicBackgroundColor", "#88FFFFFF"); - } else { - ctxt->setContextProperty("backgroundColor", "#2A2A2A"); - ctxt->setContextProperty("cellColor", "#212121"); - ctxt->setContextProperty("selectedColor", "#121212"); - ctxt->setContextProperty("selectedBorderColor", "#FFCC00"); - ctxt->setContextProperty("borderColor", "#121212"); - ctxt->setContextProperty("titleColor", "#FFFFFF"); - ctxt->setContextProperty("textColor", "#A8A8A8"); - ctxt->setContextProperty("showDropShadow", QVariant(true)); - // fonts settings - int fontSize = QApplication::font().pointSize(); - if (fontSize == -1) - fontSize = QApplication::font().pixelSize(); - ctxt->setContextProperty("fontSize", fontSize); - ctxt->setContextProperty("fontFamily", QApplication::font().family()); - ctxt->setContextProperty("fontSpacing", 0.5); - - // info - copy/pasted from info_comics_view TODO create helpers for setting the UI config - ctxt->setContextProperty("infoBackgroundColor", "#2E2E2E"); - ctxt->setContextProperty("topShadow", "info-top-shadow.png"); - ctxt->setContextProperty("infoShadow", "info-shadow.png"); - ctxt->setContextProperty("infoIndicator", "info-indicator.png"); - - ctxt->setContextProperty("infoTextColor", "#B0B0B0"); - ctxt->setContextProperty("infoTitleColor", "#FFFFFF"); - - ctxt->setContextProperty("ratingUnselectedColor", "#1C1C1C"); - ctxt->setContextProperty("ratingSelectedColor", "#FFFFFF"); - - ctxt->setContextProperty("favUncheckedColor", "#1C1C1C"); - ctxt->setContextProperty("favCheckedColor", "#E84852"); - - ctxt->setContextProperty("readTickUncheckedColor", "#1C1C1C"); - ctxt->setContextProperty("readTickCheckedColor", "#E84852"); - - ctxt->setContextProperty("currentComicBackgroundColor", "#88000000"); - } + // fonts settings (not theme-dependent) + int fontSize = QApplication::font().pointSize(); + if (fontSize == -1) + fontSize = QApplication::font().pixelSize(); + ctxt->setContextProperty("fontSize", fontSize); + ctxt->setContextProperty("fontFamily", QApplication::font().family()); + ctxt->setContextProperty("fontSpacing", 0.5); ctxt->setContextProperty("backgroundImage", QUrl()); ctxt->setContextProperty("backgroundBlurOpacity", 0.0); @@ -144,11 +79,13 @@ GridComicsView::GridComicsView(QWidget *parent) QQmlProperty(infoContainer, "width").write(settings->value(COMICS_GRID_INFO_WIDTH, 350)); showInfoAction = new QAction(tr("Show info"), this); - showInfoAction->setIcon(QIcon(":/images/comics_view_toolbar/show_comic_info.svg")); showInfoAction->setCheckable(true); showInfoAction->setChecked(showInfo); connect(showInfoAction, &QAction::toggled, this, &GridComicsView::showInfo); + // Apply theme colors (must be after showInfoAction is created) + initTheme(this); + setShowMarks(true); // TODO save this in settings auto l = new QVBoxLayout; @@ -175,14 +112,16 @@ void GridComicsView::createCoverSizeSliderWidget() coverSizeSlider->setOrientation(Qt::Horizontal); coverSizeSlider->setRange(YACREADER_MIN_GRID_ZOOM_WIDTH, YACREADER_MAX_GRID_ZOOM_WIDTH); + const auto &comicsToolbar = theme.comicsViewToolbar; + auto horizontalLayout = new QHBoxLayout(); - QLabel *smallLabel = new QLabel(); - smallLabel->setPixmap(hdpiPixmap(":/images/comics_view_toolbar/small_size_grid_zoom.svg", QSize(18, 18))); - horizontalLayout->addWidget(smallLabel); + smallZoomLabel = new QLabel(); + smallZoomLabel->setPixmap(comicsToolbar.smallGridZoomIcon.pixmap(18, 18)); + horizontalLayout->addWidget(smallZoomLabel); horizontalLayout->addWidget(coverSizeSlider, 0, Qt::AlignVCenter); - QLabel *bigLabel = new QLabel(); - bigLabel->setPixmap(hdpiPixmap(":/images/comics_view_toolbar/big_size_grid_zoom.svg", QSize(18, 18))); - horizontalLayout->addWidget(bigLabel); + bigZoomLabel = new QLabel(); + bigZoomLabel->setPixmap(comicsToolbar.bigGridZoomIcon.pixmap(18, 18)); + horizontalLayout->addWidget(bigZoomLabel); horizontalLayout->addSpacing(10); horizontalLayout->setContentsMargins(0, 0, 0, 0); @@ -283,13 +222,11 @@ void GridComicsView::updateBackgroundConfig() ctxt->setContextProperty("backgroundBlurVisible", QVariant(false)); } -#ifdef Y_MAC_UI - ctxt->setContextProperty("cellColor", useBackgroundImage ? "#99FFFFFF" : "#FFFFFF"); - ctxt->setContextProperty("selectedColor", "#FFFFFF"); -#else - ctxt->setContextProperty("cellColor", useBackgroundImage ? "#99212121" : "#212121"); - ctxt->setContextProperty("selectedColor", "#121212"); -#endif + // Use theme colors for cell and selected colors + const auto &giv = theme.gridAndInfoView; + ctxt->setContextProperty("backgroundColor", useBackgroundImage ? giv.backgroundBlurOverlayColor : giv.backgroundColor); + ctxt->setContextProperty("cellColor", useBackgroundImage ? giv.cellColorWithBackground : giv.cellColor); + ctxt->setContextProperty("cellSelectedColor", giv.cellSelectedColor); } void GridComicsView::showInfo() @@ -515,7 +452,7 @@ bool GridComicsView::canDropUrls(const QList &urls, Qt::DropAction action) { if (action == Qt::CopyAction) { QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) @@ -552,6 +489,66 @@ void GridComicsView::selectedItem(int index) emit selected(index); } +void GridComicsView::applyTheme(const Theme &theme) +{ + QQmlContext *ctxt = view->rootContext(); + const auto &giv = theme.gridAndInfoView; + + // Grid colors + ctxt->setContextProperty("backgroundColor", giv.backgroundColor); + ctxt->setContextProperty("backgroundBlurOverlayColor", giv.backgroundBlurOverlayColor); + ctxt->setContextProperty("cellColor", giv.cellColor); + ctxt->setContextProperty("cellSelectedColor", giv.cellSelectedColor); + ctxt->setContextProperty("cellSelectedBorderColor", giv.cellSelectedBorderColor); + ctxt->setContextProperty("borderColor", giv.borderColor); + ctxt->setContextProperty("itemTitleColor", giv.itemTitleColor); + ctxt->setContextProperty("itemDetailsColor", giv.itemDetailsColor); + ctxt->setContextProperty("showDropShadow", QVariant(giv.showDropShadow)); + + // Info panel colors + ctxt->setContextProperty("infoBackgroundColor", giv.infoBackgroundColor); + ctxt->setContextProperty("infoMetadataTextColor", giv.infoMetadataTextColor); + ctxt->setContextProperty("infoTextColor", giv.infoTextColor); + + // Rating and favorite colors + ctxt->setContextProperty("ratingUnselectedColor", giv.ratingUnselectedColor); + ctxt->setContextProperty("ratingSelectedColor", giv.ratingSelectedColor); + ctxt->setContextProperty("favUncheckedColor", giv.favUncheckedColor); + ctxt->setContextProperty("favCheckedColor", giv.favCheckedColor); + ctxt->setContextProperty("readTickUncheckedColor", giv.readTickUncheckedColor); + ctxt->setContextProperty("readTickCheckedColor", giv.readTickCheckedColor); + + // Current comic banner + ctxt->setContextProperty("currentComicBackgroundColor", giv.currentComicBackgroundColor); + + // New item indicator, button colors, links, scrollbars, cover borders, shadows + ctxt->setContextProperty("newItemColor", giv.newItemColor); + ctxt->setContextProperty("buttonColor", giv.buttonColor); + ctxt->setContextProperty("buttonTextColor", giv.buttonTextColor); + ctxt->setContextProperty("themeLinkColor", giv.linkColor); + ctxt->setContextProperty("themeLinkColorStr", giv.linkColor.name()); + ctxt->setContextProperty("scrollbarColor", giv.scrollbarColor); + ctxt->setContextProperty("scrollbarBorderColor", giv.scrollbarBorderColor); + ctxt->setContextProperty("infoScrollbarColor", giv.infoScrollbarColor); + ctxt->setContextProperty("comicCoverBorderColor", giv.comicCoverBorderColor); + ctxt->setContextProperty("currentComicCoverShadowColor", giv.currentComicCoverShadowColor); + ctxt->setContextProperty("buttonShadowColor", giv.buttonShadowColor); + + // Update background config to apply theme cell colors + updateBackgroundConfig(); + + // Update show info action icon + showInfoAction->setIcon(theme.comicsViewToolbar.showComicInfoIcon); + + // Update zoom slider icons (if they exist - created in setToolBar) + if (smallZoomLabel) { + smallZoomLabel->setPixmap(theme.comicsViewToolbar.smallGridZoomIcon.pixmap(18, 18)); + } + if (bigZoomLabel) { + bigZoomLabel->setPixmap(theme.comicsViewToolbar.bigGridZoomIcon.pixmap(18, 18)); + } +} + void GridComicsView::setShowMarks(bool show) { QQmlContext *ctxt = view->rootContext(); diff --git a/YACReaderLibrary/grid_comics_view.h b/YACReaderLibrary/grid_comics_view.h index 50d3c03c5..b3b674fff 100644 --- a/YACReaderLibrary/grid_comics_view.h +++ b/YACReaderLibrary/grid_comics_view.h @@ -1,12 +1,13 @@ #ifndef GRID_COMICS_VIEW_H #define GRID_COMICS_VIEW_H +#include "comic_db.h" #include "comics_view.h" +#include "themable.h" +#include #include -#include "comic_db.h" - class QAbstractListModel; class QItemSelectionModel; class QQuickWidget; @@ -32,11 +33,14 @@ const unsigned int YACREADER_MIN_COVER_WIDTH = YACREADER_MIN_GRID_ZOOM_WIDTH; const unsigned int YACREADER_MIN_ITEM_HEIGHT = YACREADER_MAX_COVER_HEIGHT + 51; // 51 is the height of the bottom rectangle used for title and other info const unsigned int YACREADER_MIN_ITEM_WIDTH = YACREADER_MIN_COVER_WIDTH; -class GridComicsView : public ComicsView +class GridComicsView : public ComicsView, protected Themable { Q_OBJECT public: explicit GridComicsView(QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; ~GridComicsView() override; void setToolBar(QToolBar *toolBar) override; void setModel(ComicModel *model) override; @@ -114,6 +118,10 @@ protected slots: bool dummy; void closeEvent(QCloseEvent *event) override; void createCoverSizeSliderWidget(); + + // Zoom slider labels (for theming) + QLabel *smallZoomLabel; + QLabel *bigZoomLabel; }; #endif // GRID_COMICS_VIEW_H diff --git a/YACReaderLibrary/images.qrc b/YACReaderLibrary/images.qrc deleted file mode 100644 index 56e90257a..000000000 --- a/YACReaderLibrary/images.qrc +++ /dev/null @@ -1,118 +0,0 @@ - - - ../images/accept_shortcut.svg - ../images/clear_shortcut.svg - ../images/comic_vine/downArrow.png - ../images/comic_vine/nextPage.png - ../images/comic_vine/previousPage.png - ../images/comic_vine/radioChecked.png - ../images/comic_vine/radioUnchecked.png - ../images/comic_vine/rowDown.png - ../images/comic_vine/rowUp.png - ../images/comic_vine/upArrow.png - ../images/comic_vine/checkBoxTick.svg - ../images/comics_view_toolbar/asignNumber.svg - ../images/comics_view_toolbar/big_size_grid_zoom.svg - ../images/comics_view_toolbar/editComic.svg - ../images/comics_view_toolbar/getInfo.svg - ../images/comics_view_toolbar/hideComicFlow.svg - ../images/comics_view_toolbar/openInYACReader.svg - ../images/comics_view_toolbar/selectAll.svg - ../images/comics_view_toolbar/setReadButton.svg - ../images/comics_view_toolbar/setUnread.svg - ../images/comics_view_toolbar/showMarks.svg - ../images/comics_view_toolbar/small_size_grid_zoom.svg - ../images/comics_view_toolbar/trash.svg - ../images/comics_view_toolbar/show_comic_info.svg - ../images/comics_view_toolbar/setManga.svg - ../images/comics_view_toolbar/setNormal.svg - ../images/comics_view_toolbar/showRecentIndicator.svg - ../images/defaultCover.png - ../images/edit.png - ../images/empty_current_readings.png - ../images/empty_favorites.png - ../images/empty_label.png - ../images/exportComicsInfo.png - ../images/exportLibrary.png - ../images/f_overlayed.png - ../images/f_overlayed_retina.png - ../images/find_folder.png - ../images/flow1.png - ../images/flow2.png - ../images/flow3.png - ../images/flow4.png - ../images/flow5.png - ../images/glowLine.png - ../images/loadCustomCover.svg - ../images/hiddenCovers.png - ../images/icon-new.svg - ../images/iconLibrary.png - ../images/importBottomCoversDecoration.png - ../images/importComicsInfo.png - ../images/importingIcon.png - ../images/importLibrary.png - ../images/importTopCoversDecoration.png - ../images/main_toolbar/divider.svg - ../images/menus_icons/editIcon.svg - ../images/menus_icons/exportComicsInfoIcon.svg - ../images/menus_icons/exportLibraryIcon.svg - ../images/menus_icons/importComicsInfoIcon.svg - ../images/menus_icons/importLibraryIcon.svg - ../images/menus_icons/removeLibraryIcon.svg - ../images/menus_icons/updateLibraryIcon.svg - ../images/menus_icons/open_containing_folder.svg - ../images/menus_icons/update_current_folder.svg - ../images/new.png - ../images/nextCoverPage.png - ../images/noLibrariesIcon.png - ../images/noLibrariesLine.png - ../images/notCover.png - ../images/openLibrary.png - ../images/previousCoverPage.png - ../images/readingRibbon.png - ../images/readRibbon.png - ../images/resetCover.svg - ../images/searching_icon.png - ../images/serverConfigBackground.png - ../images/shortcuts_group_comics.svg - ../images/shortcuts_group_folders.svg - ../images/shortcuts_group_general.svg - ../images/shortcuts_group_libraries.svg - ../images/shortcuts_group_mglass.svg - ../images/shortcuts_group_page.svg - ../images/shortcuts_group_reading.svg - ../images/shortcuts_group_visualization.svg - ../images/shownCovers.png - ../images/sidebar/branch-closed.svg - ../images/sidebar/branch-open.svg - ../images/sidebar/collapsed_branch_osx.png - ../images/sidebar/collapsed_branch_selected.png - ../images/sidebar/expanded_branch_osx.png - ../images/sidebar/expanded_branch_selected.png - ../images/sidebar/folder.svg - ../images/sidebar/folder_finished.svg - ../images/sidebar/libraryIconSelected.svg - ../images/sidebar/libraryOptions.svg - ../images/updatingIcon.png - ../images/custom_dialog/custom_close_button.svg - ../images/whats_new/whatsnew_header.svg - - ../images/lists/default_0.svg - ../images/lists/default_1.svg - ../images/lists/default_2.svg - - ../images/lists/label_blue.svg - ../images/lists/label_cyan.svg - ../images/lists/label_dark.svg - ../images/lists/label_green.svg - ../images/lists/label_light.svg - ../images/lists/label_orange.svg - ../images/lists/label_pink.svg - ../images/lists/label_purple.svg - ../images/lists/label_red.svg - ../images/lists/label_violet.svg - ../images/lists/label_white.svg - ../images/lists/label_yellow.svg - ../images/lists/list.svg - - diff --git a/YACReaderLibrary/images_osx.qrc b/YACReaderLibrary/images_osx.qrc deleted file mode 100644 index b9f5f34aa..000000000 --- a/YACReaderLibrary/images_osx.qrc +++ /dev/null @@ -1,50 +0,0 @@ - - - ../images/folder_finished_macosx.png - ../images/main_toolbar/back_osx.png - ../images/main_toolbar/back_osx@2x.png - ../images/main_toolbar/forward_osx.png - ../images/main_toolbar/forward_osx@2x.png - ../images/main_toolbar/settings_osx.png - ../images/main_toolbar/settings_osx@2x.png - ../images/main_toolbar/server_osx.png - ../images/main_toolbar/server_osx@2x.png - ../images/main_toolbar/help_osx.png - ../images/main_toolbar/help_osx@2x.png - ../images/main_toolbar/flow_osx.png - ../images/main_toolbar/flow_osx@2x.png - ../images/main_toolbar/grid_osx.png - ../images/main_toolbar/grid_osx@2x.png - ../images/main_toolbar/info_osx.png - ../images/main_toolbar/info_osx@2x.png - ../images/empty_folder_osx.png - ../images/empty_search_osx.png - ../images/iconSearch.png - ../images/iconSearch@2x.png - ../images/clearSearch.png - ../images/clearSearch@2x.png - ../images/empty_reading_list_osx.png - ../images/sidebar/libraryIcon_osx.png - ../images/sidebar/setRoot_osx.png - ../images/sidebar/expand_osx.png - ../images/sidebar/colapse_osx.png - ../images/sidebar/newLibraryIcon_osx.png - ../images/sidebar/openLibraryIcon_osx.png - ../images/sidebar/addNew_sidebar_osx.png - ../images/sidebar/delete_sidebar_osx.png - ../images/sidebar/addLabelIcon_osx.png - ../images/sidebar/renameListIcon_osx.png - ../images/sidebar/setRoot_osx@2x.png - ../images/sidebar/expand_osx@2x.png - ../images/sidebar/colapse_osx@2x.png - ../images/sidebar/newLibraryIcon_osx@2x.png - ../images/sidebar/openLibraryIcon_osx@2x.png - ../images/sidebar/addNew_sidebar_osx@2x.png - ../images/sidebar/delete_sidebar_osx@2x.png - ../images/sidebar/addLabelIcon_osx@2x.png - ../images/sidebar/renameListIcon_osx@2x.png - ../images/viewer_toolbar/close_osx.png - ../images/viewer_toolbar/close_osx@2x.png - macostrayicon.svg - - diff --git a/YACReaderLibrary/images_win.qrc b/YACReaderLibrary/images_win.qrc deleted file mode 100644 index 3fa00b2fe..000000000 --- a/YACReaderLibrary/images_win.qrc +++ /dev/null @@ -1,32 +0,0 @@ - - - ../images/main_toolbar/back.svg - ../images/main_toolbar/back_disabled.png - ../images/main_toolbar/forward.svg - ../images/main_toolbar/forward_disabled.png - ../images/main_toolbar/settings.svg - ../images/main_toolbar/server.svg - ../images/main_toolbar/help.svg - ../images/main_toolbar/fullscreen.svg - ../images/main_toolbar/flow.svg - ../images/main_toolbar/grid.svg - ../images/main_toolbar/info.svg - ../images/sidebar/libraryIcon.svg - ../images/sidebar/setRoot.svg - ../images/sidebar/expand.svg - ../images/sidebar/colapse.svg - ../images/sidebar/newLibraryIcon.svg - ../images/sidebar/openLibraryIcon.svg - ../images/sidebar/addNew_sidebar.svg - ../images/sidebar/delete_sidebar.svg - ../images/sidebar/addLabelIcon.svg - ../images/sidebar/renameListIcon.svg - ../images/empty_folder.png - ../images/empty_search.png - ../images/iconSearchNew.svg - ../images/clearSearchNew.svg - ../images/empty_reading_list.png - ../images/viewer_toolbar/close.svg - icon.ico - - diff --git a/YACReaderLibrary/import_comics_info_dialog.cpp b/YACReaderLibrary/import_comics_info_dialog.cpp index 2ed5fd569..0f7c7f793 100644 --- a/YACReaderLibrary/import_comics_info_dialog.cpp +++ b/YACReaderLibrary/import_comics_info_dialog.cpp @@ -1,11 +1,11 @@ #include "import_comics_info_dialog.h" -#include -#include +#include "data_base_management.h" + #include +#include #include - -#include "data_base_management.h" +#include ImportComicsInfoDialog::ImportComicsInfoDialog(QWidget *parent) : QDialog(parent) @@ -25,7 +25,7 @@ ImportComicsInfoDialog::ImportComicsInfoDialog(QWidget *parent) connect(cancel, &QAbstractButton::clicked, this, &ImportComicsInfoDialog::close); // connect(cancel,SIGNAL(clicked()),this,SIGNAL(rejected())); - find = new QPushButton(QIcon(":/images/find_folder.png"), ""); + find = new QPushButton(""); connect(find, &QAbstractButton::clicked, this, &ImportComicsInfoDialog::findPath); auto libraryLayout = new QHBoxLayout; @@ -54,15 +54,21 @@ ImportComicsInfoDialog::ImportComicsInfoDialog(QWidget *parent) mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/importComicsInfo.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(this); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); setLayout(imgMainLayout); setModal(true); + + initTheme(this); +} + +void ImportComicsInfoDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.importComicsInfoIcon); + find->setIcon(theme.dialogIcons.findFolderIcon); } ImportComicsInfoDialog::~ImportComicsInfoDialog() diff --git a/YACReaderLibrary/import_comics_info_dialog.h b/YACReaderLibrary/import_comics_info_dialog.h index 01ea022f1..c0cf42221 100644 --- a/YACReaderLibrary/import_comics_info_dialog.h +++ b/YACReaderLibrary/import_comics_info_dialog.h @@ -1,12 +1,13 @@ #ifndef IMPORT_COMICS_INFO_DIALOG_H #define IMPORT_COMICS_INFO_DIALOG_H -#include +#include "themable.h" + #include #include #include -#include #include +#include #include class Importer : public QThread @@ -19,7 +20,7 @@ class Importer : public QThread void run() override; }; -class ImportComicsInfoDialog : public QDialog +class ImportComicsInfoDialog : public QDialog, protected Themable { Q_OBJECT @@ -28,7 +29,11 @@ class ImportComicsInfoDialog : public QDialog ~ImportComicsInfoDialog(); QString dest; +protected: + void applyTheme(const Theme &theme) override; + private: + QLabel *imgLabel; QLabel *nameLabel; QLabel *textLabel; QLabel *destLabel; diff --git a/YACReaderLibrary/import_library_dialog.cpp b/YACReaderLibrary/import_library_dialog.cpp index 2a065bd61..944cbb283 100644 --- a/YACReaderLibrary/import_library_dialog.cpp +++ b/YACReaderLibrary/import_library_dialog.cpp @@ -1,10 +1,10 @@ #include "import_library_dialog.h" -#include -#include +#include #include #include -#include +#include +#include ImportLibraryDialog::ImportLibraryDialog(QWidget *parent) : QDialog(parent), progressCount(0) @@ -35,10 +35,10 @@ void ImportLibraryDialog::setupUI() connect(cancel, &QAbstractButton::clicked, this, &ImportLibraryDialog::close); // connect(cancel,SIGNAL(clicked()),this,SIGNAL(rejected())); - find = new QPushButton(QIcon(":/images/find_folder.png"), ""); + find = new QPushButton(""); connect(find, &QAbstractButton::clicked, this, &ImportLibraryDialog::findPath); - findDest = new QPushButton(QIcon(":/images/find_folder.png"), ""); + findDest = new QPushButton(""); connect(findDest, &QAbstractButton::clicked, this, &ImportLibraryDialog::findDestination); auto content = new QGridLayout; @@ -75,9 +75,7 @@ void ImportLibraryDialog::setupUI() mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/importLibrary.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(this); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); @@ -85,6 +83,15 @@ void ImportLibraryDialog::setupUI() setModal(true); setWindowTitle(tr("Extract a catalog")); + + initTheme(this); +} + +void ImportLibraryDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.importLibraryIcon); + find->setIcon(theme.dialogIcons.findFolderIcon); + findDest->setIcon(theme.dialogIcons.findFolderIcon); } void ImportLibraryDialog::open(const YACReaderLibraries &libs) { diff --git a/YACReaderLibrary/import_library_dialog.h b/YACReaderLibrary/import_library_dialog.h index 632ea5474..87462aa70 100644 --- a/YACReaderLibrary/import_library_dialog.h +++ b/YACReaderLibrary/import_library_dialog.h @@ -1,21 +1,26 @@ #ifndef IMPORT_LIBRARY_DIALOG_H #define IMPORT_LIBRARY_DIALOG_H +#include "themable.h" #include "yacreader_libraries.h" #include #include #include +#include #include #include -#include -class ImportLibraryDialog : public QDialog +class ImportLibraryDialog : public QDialog, protected Themable { Q_OBJECT public: ImportLibraryDialog(QWidget *parent = nullptr); +protected: + void applyTheme(const Theme &theme) override; + private: + QLabel *imgLabel; QLabel *nameLabel; QLabel *textLabel; QLabel *destLabel; diff --git a/YACReaderLibrary/import_widget.cpp b/YACReaderLibrary/import_widget.cpp index 7d721b48e..522e46568 100644 --- a/YACReaderLibrary/import_widget.cpp +++ b/YACReaderLibrary/import_widget.cpp @@ -1,29 +1,30 @@ #include "import_widget.h" -#include -#include +#include +#include +#include +#include #include +#include #include -#include -#include -#include #include -#include #include +#include // TODO: is QGLWidget needed here??? // #include -#include #include -#include -#include - -#include #include +#include +#include +#include +#include class YACReaderActivityIndicatorWidget : public QWidget { public: YACReaderActivityIndicatorWidget(QWidget *parent = 0); + void setPixmaps(const QPixmap &normalLine, const QPixmap &glowLine); + public slots: private: @@ -32,16 +33,11 @@ public slots: }; YACReaderActivityIndicatorWidget::YACReaderActivityIndicatorWidget(QWidget *parent) - : QWidget(parent) + : QWidget(parent), normal(nullptr), glow(nullptr) { - QPixmap line(":/images/noLibrariesLine.png"); - QPixmap glowLine(":/images/glowLine.png"); normal = new QLabel(this); glow = new QLabel(this); - normal->setPixmap(line); - glow->setPixmap(glowLine); - auto layout = new QHBoxLayout(); layout->addWidget(normal, 0, Qt::AlignVCenter); @@ -51,11 +47,6 @@ YACReaderActivityIndicatorWidget::YACReaderActivityIndicatorWidget(QWidget *pare layout->setContentsMargins(4, 4, 4, 4); layout->setSpacing(0); - // setFixedHeight(3); - // resize(579,3); - glow->setGeometry(4, 4, glowLine.width(), glowLine.height()); - // normal->setGeometry(0,1,579,1); - auto effect = new QGraphicsOpacityEffect(); // effect->setOpacity(1.0); @@ -81,32 +72,28 @@ YACReaderActivityIndicatorWidget::YACReaderActivityIndicatorWidget(QWidget *pare animation->start(); } +void YACReaderActivityIndicatorWidget::setPixmaps(const QPixmap &normalLine, const QPixmap &glowLine) +{ + normal->setPixmap(normalLine); + glow->setPixmap(glowLine); + glow->setGeometry(4, 4, glowLine.width(), glowLine.height()); +} + ImportWidget::ImportWidget(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - QPalette p(palette()); - p.setColor(QPalette::Window, QColor(250, 250, 250)); setAutoFillBackground(true); - setPalette(p); - QPixmap icon(":/images/importingIcon.png"); iconLabel = new QLabel(); - iconLabel->setPixmap(icon); - /*QPixmap line(":/images/noLibrariesLine.png"); - QLabel * lineLabel = new QLabel(); - lineLabel->setPixmap(line);*/ + activityIndicator = new YACReaderActivityIndicatorWidget(); - auto activityIndicator = new YACReaderActivityIndicatorWidget(); - - text = new QLabel(); //""+tr("Importing comics")+""); - text->setStyleSheet("QLabel {font-size:25px;font-weight:bold;}"); - textDescription = new QLabel(); //""+tr("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")+""); + text = new QLabel(); + textDescription = new QLabel(); textDescription->setWordWrap(true); textDescription->setMaximumWidth(330); - currentComicLabel = new QLabel("..."); + currentComicLabel = new QLabel("..."); coversViewContainer = new QWidget(this); auto coversViewLayout = new QVBoxLayout; @@ -115,11 +102,9 @@ ImportWidget::ImportWidget(QWidget *parent) coversViewContainer->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum); coversView = new QGraphicsView(); - // coversView->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); coversView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); coversView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); coversView->setMaximumHeight(300); - coversView->setStyleSheet("QGraphicsView {background-color: #E6E6E6;border:none;}"); coversScene = new QGraphicsScene(); coversView->setAlignment(Qt::AlignLeft); @@ -130,16 +115,10 @@ ImportWidget::ImportWidget(QWidget *parent) scrollAnimation = new QPropertyAnimation(coversView->horizontalScrollBar(), "value"); - QLabel *topDecorator = new QLabel(); - QLabel *bottomDecorator = new QLabel(); - QPixmap top(":/images/importTopCoversDecoration.png"); - QPixmap bottom(":/images/importBottomCoversDecoration.png"); - topDecorator->setPixmap(top); - bottomDecorator->setPixmap(bottom); + topDecorator = new QLabel(); + bottomDecorator = new QLabel(); topDecorator->setScaledContents(true); bottomDecorator->setScaledContents(true); - topDecorator->setFixedHeight(top.height()); - bottomDecorator->setFixedHeight(bottom.height()); coversViewLayout->addWidget(topDecorator, 0); coversViewLayout->addWidget(coversView, 1); @@ -187,12 +166,13 @@ ImportWidget::ImportWidget(QWidget *parent) layout->addLayout(buttonLayout, 0); layout->addSpacing(10); layout->addStretch(); - coversLabel = new QLabel("" + tr("Some of the comics being added...") + ""); + coversLabel = new QLabel(tr("Some of the comics being added...")); hideButton = new QToolButton(this); hideButton->setFixedSize(25, 18); - hideButton->setStyleSheet("QToolButton {background: url(\":/images/shownCovers.png\"); border:none;}" - " QToolButton:checked {background:url(\":/images/hiddenCovers.png\"); border:none;}"); + hideButton->setStyleSheet("QToolButton { border: none; padding: 0px; }" + "QToolButton:pressed { border: none; padding: 0px; }" + "QToolButton:checked { border: none; padding: 0px; }"); hideButton->setCheckable(true); connect(hideButton, &QAbstractButton::toggled, this, &ImportWidget::showCovers); @@ -210,6 +190,8 @@ ImportWidget::ImportWidget(QWidget *parent) updatingCovers = false; elapsedTimer = new QElapsedTimer(); elapsedTimer->start(); + + initTheme(this); } void ImportWidget::newComic(const QString &path, const QString &coverPath) @@ -217,7 +199,7 @@ void ImportWidget::newComic(const QString &path, const QString &coverPath) if (!this->isVisible()) return; - currentComicLabel->setText("" + path + ""); + currentComicLabel->setText(path); if (((elapsedTimer->elapsed() >= 1100) || ((previousWidth < coversView->width()) && (elapsedTimer->elapsed() >= 500))) && scrollAnimation->state() != QAbstractAnimation::Running) // todo elapsed time { @@ -233,7 +215,7 @@ void ImportWidget::newComic(const QString &path, const QString &coverPath) previousWidth += 10 + p.width(); - foreach (QGraphicsItem *itemToRemove, coversScene->items()) { + for (auto *itemToRemove : coversScene->items()) { auto last = dynamic_cast(itemToRemove); if ((last->pos().x() + last->pixmap().width()) < coversView->horizontalScrollBar()->value()) // TODO check this @@ -281,7 +263,7 @@ void ImportWidget::addCoverTest() } else j++; - foreach (QGraphicsItem *itemToMove, coversScene->items()) { + for (auto *itemToMove : coversScene->items()) { auto timer = new QTimeLine(/*350*/ 1000); timer->setFrameRange(0, 60); @@ -323,16 +305,16 @@ void ImportWidget::clear() updatingCovers = false; - currentComicLabel->setText("..."); + currentComicLabel->setText("..."); this->i = 0; } void ImportWidget::setImportLook() { - iconLabel->setPixmap(QPixmap(":/images/importingIcon.png")); - text->setText("" + tr("Importing comics") + ""); - textDescription->setText("" + tr("

YACReaderLibrary is now creating a new library.

Create a library could take several minutes. You can stop the process and update the library later for completing the task.

") + "
"); + iconLabel->setPixmap(theme.importWidget.importingIcon); + text->setText(tr("Importing comics")); + textDescription->setText(tr("

YACReaderLibrary is now creating a new library.

Create a library could take several minutes. You can stop the process and update the library later for completing the task.

")); stopButton->setVisible(true); coversLabel->setVisible(true); @@ -342,9 +324,9 @@ void ImportWidget::setImportLook() void ImportWidget::setUpdateLook() { - iconLabel->setPixmap(QPixmap(":/images/updatingIcon.png")); - text->setText("" + tr("Updating the library") + ""); - textDescription->setText("" + tr("

The current library is being updated. For faster updates, please, update your libraries frequently.

You can stop the process and continue updating this library later.

") + "
"); + iconLabel->setPixmap(theme.importWidget.updatingIcon); + text->setText(tr("Updating the library")); + textDescription->setText(tr("

The current library is being updated. For faster updates, please, update your libraries frequently.

You can stop the process and continue updating this library later.

")); stopButton->setVisible(true); coversLabel->setVisible(true); @@ -354,9 +336,9 @@ void ImportWidget::setUpdateLook() void ImportWidget::setUpgradeLook() { - iconLabel->setPixmap(QPixmap(":/images/updatingIcon.png")); - text->setText("" + tr("Upgrading the library") + ""); - textDescription->setText("" + tr("

The current library is being upgraded, please wait.

") + "
"); + iconLabel->setPixmap(theme.importWidget.updatingIcon); + text->setText(tr("Upgrading the library")); + textDescription->setText(tr("

The current library is being upgraded, please wait.

")); stopButton->setVisible(false); coversLabel->setVisible(false); @@ -366,9 +348,9 @@ void ImportWidget::setUpgradeLook() void ImportWidget::setXMLScanLook() { - iconLabel->setPixmap(QPixmap(":/images/updatingIcon.png")); - text->setText("" + tr("Scanning the library") + ""); - textDescription->setText("" + tr("

Current library is being scanned for legacy XML metadata information.

This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.

") + "
"); + iconLabel->setPixmap(theme.importWidget.updatingIcon); + text->setText(tr("Scanning the library")); + textDescription->setText(tr("

Current library is being scanned for legacy XML metadata information.

This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.

")); stopButton->setVisible(true); coversLabel->setVisible(false); @@ -392,3 +374,56 @@ void ImportWidget::resizeEvent(QResizeEvent *event) QWidget::resizeEvent(event); } + +void ImportWidget::applyTheme(const Theme &theme) +{ + const auto &importTheme = theme.importWidget; + + // Covers toggle button + hideButton->setIcon(importTheme.coversToggleIcon); + hideButton->setIconSize(hideButton->size()); + + // Background + QPalette p(palette()); + p.setColor(QPalette::Window, importTheme.backgroundColor); + setPalette(p); + + // Covers view background + coversView->setStyleSheet(QString("QGraphicsView {background-color: %1; border:none;}") + .arg(importTheme.coversViewBackgroundColor.name())); + + // Covers decorations + topDecorator->setPixmap(importTheme.topCoversDecoration); + topDecorator->setFixedHeight(importTheme.topCoversDecoration.height()); + bottomDecorator->setPixmap(importTheme.bottomCoversDecoration); + bottomDecorator->setFixedHeight(importTheme.bottomCoversDecoration.height()); + + const auto &noLibrariesWidget = theme.noLibrariesWidget; + activityIndicator->setPixmaps(noLibrariesWidget.noLibrariesLinePixmap, importTheme.glowLinePixmap); + + // Apply text colors + updateTextColors(); +} + +void ImportWidget::updateTextColors() +{ + const auto &importTheme = theme.importWidget; + + // Title text + text->setStyleSheet(importTheme.titleLabelQSS); + + // Description text + QPalette descPalette = textDescription->palette(); + descPalette.setColor(QPalette::WindowText, importTheme.descriptionTextColor); + textDescription->setPalette(descPalette); + + // Current comic label + QPalette comicPalette = currentComicLabel->palette(); + comicPalette.setColor(QPalette::WindowText, importTheme.currentComicTextColor); + currentComicLabel->setPalette(comicPalette); + + // Covers label + QPalette coversLabelPalette = coversLabel->palette(); + coversLabelPalette.setColor(QPalette::WindowText, importTheme.coversLabelColor); + coversLabel->setPalette(coversLabelPalette); +} diff --git a/YACReaderLibrary/import_widget.h b/YACReaderLibrary/import_widget.h index 21d4c7555..9da45b84f 100644 --- a/YACReaderLibrary/import_widget.h +++ b/YACReaderLibrary/import_widget.h @@ -1,14 +1,30 @@ #ifndef IMPORT_WIDGET_H #define IMPORT_WIDGET_H -#include +#include "themable.h" -class ImportWidget : public QWidget +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class YACReaderActivityIndicatorWidget; + +class ImportWidget : public QWidget, protected Themable { Q_OBJECT public: explicit ImportWidget(QWidget *parent = 0); +protected: + void applyTheme(const Theme &theme) override; + signals: void stop(); public slots: @@ -41,8 +57,12 @@ public slots: quint64 i; QToolButton *hideButton; + QLabel *topDecorator; + QLabel *bottomDecorator; + YACReaderActivityIndicatorWidget *activityIndicator; void resizeEvent(QResizeEvent *event) override; + void updateTextColors(); }; #endif // IMPORT_WIDGET_H diff --git a/YACReaderLibrary/info_comics_view.cpp b/YACReaderLibrary/info_comics_view.cpp index 0bd687641..f86327d52 100644 --- a/YACReaderLibrary/info_comics_view.cpp +++ b/YACReaderLibrary/info_comics_view.cpp @@ -1,18 +1,17 @@ #include "info_comics_view.h" -#include "yacreader_global.h" - -#include -#include - +#include "QsLog.h" #include "comic.h" #include "comic_files_manager.h" #include "comic_model.h" -#include "comic_db.h" #include "yacreader_comic_info_helper.h" #include "yacreader_comics_selection_helper.h" -#include "QsLog.h" +#include +#include +#include +#include +#include InfoComicsView::InfoComicsView(QWidget *parent) : ComicsView(parent), flow(nullptr), list(nullptr) @@ -22,52 +21,8 @@ InfoComicsView::InfoComicsView(QWidget *parent) QQmlContext *ctxt = view->rootContext(); - LibraryUITheme theme; -#ifdef Y_MAC_UI - theme = Light; -#else - theme = Dark; -#endif - - if (theme == Light) { - ctxt->setContextProperty("infoBackgroundColor", "#FFFFFF"); - ctxt->setContextProperty("topShadow", QUrl()); - ctxt->setContextProperty("infoShadow", "info-shadow-light.png"); - ctxt->setContextProperty("infoIndicator", "info-indicator-light.png"); - - ctxt->setContextProperty("infoTextColor", "#404040"); - ctxt->setContextProperty("infoTitleColor", "#2E2E2E"); - - ctxt->setContextProperty("ratingUnselectedColor", "#DEDEDE"); - ctxt->setContextProperty("ratingSelectedColor", "#2B2B2B"); - - ctxt->setContextProperty("favUncheckedColor", "#DEDEDE"); - ctxt->setContextProperty("favCheckedColor", "#E84852"); - - ctxt->setContextProperty("readTickUncheckedColor", "#DEDEDE"); - ctxt->setContextProperty("readTickCheckedColor", "#E84852"); - - ctxt->setContextProperty("showDropShadow", QVariant(false)); - } else { - ctxt->setContextProperty("infoBackgroundColor", "#2E2E2E"); - ctxt->setContextProperty("topShadow", "info-top-shadow.png"); - ctxt->setContextProperty("infoShadow", "info-shadow.png"); - ctxt->setContextProperty("infoIndicator", "info-indicator.png"); - - ctxt->setContextProperty("infoTextColor", "#B0B0B0"); - ctxt->setContextProperty("infoTitleColor", "#FFFFFF"); - - ctxt->setContextProperty("ratingUnselectedColor", "#1C1C1C"); - ctxt->setContextProperty("ratingSelectedColor", "#FFFFFF"); - - ctxt->setContextProperty("favUncheckedColor", "#1C1C1C"); - ctxt->setContextProperty("favCheckedColor", "#E84852"); - - ctxt->setContextProperty("readTickUncheckedColor", "#1C1C1C"); - ctxt->setContextProperty("readTickCheckedColor", "#E84852"); - - ctxt->setContextProperty("showDropShadow", QVariant(true)); - } + // Apply theme colors + initTheme(this); ctxt->setContextProperty("backgroundImage", QUrl()); ctxt->setContextProperty("comicsList", new ComicModel()); @@ -234,7 +189,7 @@ bool InfoComicsView::canDropUrls(const QList &urls, Qt::DropAction action) { if (action == Qt::CopyAction) { QString currentPath; - foreach (QUrl url, urls) { + for (const auto &url : urls) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) @@ -263,3 +218,42 @@ void InfoComicsView::selectedItem(int index) { emit selected(index); } + +void InfoComicsView::applyTheme(const Theme &theme) +{ + QQmlContext *ctxt = view->rootContext(); + const auto &giv = theme.gridAndInfoView; + + // Info panel colors + // Cache-bust the SVG file URLs so QML's image cache doesn't serve stale + // files when the theme is updated (the same file path is rewritten each time). + const QString bust = QString::number(QDateTime::currentMSecsSinceEpoch()); + auto svgUrl = [&bust](const QString &path) { + QUrl url = QUrl::fromLocalFile(path); + url.setQuery(bust); + return url; + }; + ctxt->setContextProperty("infoBackgroundColor", giv.infoBackgroundColor); + ctxt->setContextProperty("topShadow", svgUrl(giv.topShadow)); + ctxt->setContextProperty("infoShadow", svgUrl(giv.infoShadow)); + ctxt->setContextProperty("infoIndicator", svgUrl(giv.infoIndicator)); + ctxt->setContextProperty("infoMetadataTextColor", giv.infoMetadataTextColor); + ctxt->setContextProperty("infoTextColor", giv.infoTextColor); + + // Rating and favorite colors + ctxt->setContextProperty("ratingUnselectedColor", giv.ratingUnselectedColor); + ctxt->setContextProperty("ratingSelectedColor", giv.ratingSelectedColor); + ctxt->setContextProperty("favUncheckedColor", giv.favUncheckedColor); + ctxt->setContextProperty("favCheckedColor", giv.favCheckedColor); + ctxt->setContextProperty("readTickUncheckedColor", giv.readTickUncheckedColor); + ctxt->setContextProperty("readTickCheckedColor", giv.readTickCheckedColor); + + ctxt->setContextProperty("showDropShadow", QVariant(giv.showDropShadow)); + ctxt->setContextProperty("backgroundBlurOverlayColor", giv.backgroundBlurOverlayColor); + + // Info panel scrollbar, comic cover border, links + ctxt->setContextProperty("infoScrollbarColor", giv.infoScrollbarColor); + ctxt->setContextProperty("comicCoverBorderColor", giv.comicCoverBorderColor); + ctxt->setContextProperty("themeLinkColor", giv.linkColor); + ctxt->setContextProperty("themeLinkColorStr", giv.linkColor.name()); +} diff --git a/YACReaderLibrary/info_comics_view.h b/YACReaderLibrary/info_comics_view.h index 3cc925c86..d898cee4e 100644 --- a/YACReaderLibrary/info_comics_view.h +++ b/YACReaderLibrary/info_comics_view.h @@ -2,17 +2,23 @@ #define INFOCOMICSVIEW_H #include "comics_view.h" +#include "themable.h" + +#include class QQuickView; class YACReaderComicsSelectionHelper; class YACReaderComicInfoHelper; -class InfoComicsView : public ComicsView +class InfoComicsView : public ComicsView, protected Themable { Q_OBJECT public: explicit InfoComicsView(QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; ~InfoComicsView() override; void setToolBar(QToolBar *toolBar) override; void setModel(ComicModel *model) override; diff --git a/YACReaderLibrary/initial_comic_info_extractor.cpp b/YACReaderLibrary/initial_comic_info_extractor.cpp index 15528eded..9cdef9189 100644 --- a/YACReaderLibrary/initial_comic_info_extractor.cpp +++ b/YACReaderLibrary/initial_comic_info_extractor.cpp @@ -1,11 +1,12 @@ #include "initial_comic_info_extractor.h" -#include -#include "pdf_comic.h" #include "comic.h" #include "compressed_archive.h" -#include "qnaturalsorting.h" #include "cover_utils.h" +#include "pdf_comic.h" +#include "qnaturalsorting.h" + +#include using namespace YACReader; @@ -41,12 +42,7 @@ void InitialComicInfoExtractor::extract() return; } #else -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto pdfComic = Poppler::Document::load(_fileSource); -#else - auto _pdfComic = Poppler::Document::load(_fileSource); - auto pdfComic = std::unique_ptr(_pdfComic); -#endif #endif if (!pdfComic) { QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; diff --git a/YACReaderLibrary/initial_comic_info_extractor.h b/YACReaderLibrary/initial_comic_info_extractor.h index 5382d81f3..3e8f99cea 100644 --- a/YACReaderLibrary/initial_comic_info_extractor.h +++ b/YACReaderLibrary/initial_comic_info_extractor.h @@ -1,7 +1,11 @@ #ifndef INITIALCOMICINFOEXTRACTOR_H #define INITIALCOMICINFOEXTRACTOR_H -#include +#include +#include +#include +#include +#include namespace YACReader { class InitialComicInfoExtractor : public QObject diff --git a/YACReaderLibrary/ip_config_helper.cpp b/YACReaderLibrary/ip_config_helper.cpp index 38c58188c..8f33e4779 100644 --- a/YACReaderLibrary/ip_config_helper.cpp +++ b/YACReaderLibrary/ip_config_helper.cpp @@ -1,7 +1,9 @@ -#include #include "ip_config_helper.h" + #include "qnaturalsorting.h" +#include + // 192.168 (most comon local subnet for ips are always put first) // IPs are sorted using natoral sorting diff --git a/YACReaderLibrary/ip_config_helper.h b/YACReaderLibrary/ip_config_helper.h index 8cabe1d34..b5fac6edd 100644 --- a/YACReaderLibrary/ip_config_helper.h +++ b/YACReaderLibrary/ip_config_helper.h @@ -1,4 +1,8 @@ #ifndef YR_IP_CONFIG_HELPER #define YR_IP_CONFIG_HELPER + +#include +#include + QList getIpAddresses(); #endif diff --git a/YACReaderLibrary/libraries_update_coordinator.cpp b/YACReaderLibrary/libraries_update_coordinator.cpp index 703b5d963..9743aef3e 100644 --- a/YACReaderLibrary/libraries_update_coordinator.cpp +++ b/YACReaderLibrary/libraries_update_coordinator.cpp @@ -2,8 +2,8 @@ #include "libraries_update_coordinator.h" #include "library_creator.h" -#include "yacreader_libraries.h" #include "yacreader_global.h" +#include "yacreader_libraries.h" using namespace YACReader; diff --git a/YACReaderLibrary/library_comic_opener.cpp b/YACReaderLibrary/library_comic_opener.cpp index ede63f33b..026d677ca 100644 --- a/YACReaderLibrary/library_comic_opener.cpp +++ b/YACReaderLibrary/library_comic_opener.cpp @@ -3,7 +3,6 @@ #include "comic_db.h" #include -#include bool YACReader::openComic(const ComicDB &comic, unsigned long long libraryId, diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index eaa035b32..3b55c3af3 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -1,23 +1,22 @@ #include "library_creator.h" -#include -#include -#include -#include -#include -#include - +#include "QsLog.h" +#include "comic.h" #include "data_base_management.h" -#include "qnaturalsorting.h" #include "db_helper.h" - #include "initial_comic_info_extractor.h" -#include "xml_info_parser.h" -#include "comic.h" #include "pdf_comic.h" +#include "qnaturalsorting.h" +#include "xml_info_parser.h" #include "yacreader_global.h" -#include "QsLog.h" +#include +#include +#include +#include +#include +#include +#include #include @@ -65,11 +64,11 @@ void LibraryCreator::updateLibrary(const QString &source, const QString &target) _mode = UPDATER; } -void LibraryCreator::updateFolder(const QString &source, const QString &target, const QString &sourceFolder, const QModelIndex &dest) +void LibraryCreator::updateFolder(const QString &source, const QString &target, const QString &sourceFolder, qulonglong folderId) { checkModifiedDatesOnUpdate = settings->value(COMPARE_MODIFIED_DATE_ON_LIBRARY_UPDATES, false).toBool(); partialUpdate = true; - folderDestinationModelIndex = dest; + _folderDestinationId = folderId; _currentPathFolders.clear(); @@ -101,7 +100,7 @@ void LibraryCreator::updateFolder(const QString &source, const QString &target, _currentPathFolders.append(rootFolder(db)); - foreach (QString folderName, folders) { + for (const auto &folderName : folders) { if (folderName.isEmpty()) { break; } @@ -222,7 +221,7 @@ void LibraryCreator::run() if (!canceled) { if (partialUpdate) { - auto folder = DBHelper::updateChildrenInfo(folderDestinationModelIndex.data(FolderModel::IdRole).toULongLong(), _database); + auto folder = DBHelper::updateChildrenInfo(_folderDestinationId, _database); DBHelper::propagateFolderUpdatesToParent(folder, _database); } else { DBHelper::updateChildrenInfo(_database); @@ -248,7 +247,7 @@ void LibraryCreator::run() } if (partialUpdate) { - emit updatedCurrentFolder(folderDestinationModelIndex); + emit updatedCurrentFolder(_folderDestinationId); } creation = false; @@ -473,7 +472,7 @@ void LibraryCreator::update(QDir dirS) listS.append(listSFolders); listS.append(listSFiles); // QLOG_DEBUG() << "---------------------------------------------------------"; - // foreach(QFileInfo info,listS) + // for (const QFileInfo &info : listS) // QLOG_DEBUG() << info.fileName(); // QLOG_TRACE() << "END Getting info from dir" << dirS.absolutePath(); @@ -489,7 +488,7 @@ void LibraryCreator::update(QDir dirS) listD.append(folders); listD.append(comics); // QLOG_DEBUG() << "---------------------------------------------------------"; - // foreach(LibraryItem * info,listD) + // for (auto *info : listD) // QLOG_DEBUG() << info->name; // QLOG_DEBUG() << "---------------------------------------------------------"; int lenghtS = listS.size(); diff --git a/YACReaderLibrary/library_creator.h b/YACReaderLibrary/library_creator.h index f7b8a6e69..cdba5aece 100644 --- a/YACReaderLibrary/library_creator.h +++ b/YACReaderLibrary/library_creator.h @@ -1,22 +1,20 @@ #ifndef __LIBRARY_CREATOR_H #define __LIBRARY_CREATOR_H -#include -#include +#include "comic_db.h" +#include "folder.h" + +#include #include #include -#include -#include -#include -#include -#include #include -#include +#include +#include +#include #include -#include - -#include "folder.h" -#include "comic_db.h" +#include +#include +#include class LibraryCreator : public QThread { @@ -25,7 +23,7 @@ class LibraryCreator : public QThread LibraryCreator(QSettings *settings); void createLibrary(const QString &source, const QString &target); void updateLibrary(const QString &source, const QString &target); - void updateFolder(const QString &source, const QString &target, const QString &folder, const QModelIndex &dest); + void updateFolder(const QString &source, const QString &target, const QString &folder, qulonglong folderId); void stop(); // used to stop the process and keep the changes void cancel(); // cancels this run and changes in the DB are rolled back @@ -56,7 +54,7 @@ class LibraryCreator : public QThread // LibraryCreator está en modo creación si creation == true; bool creation; bool partialUpdate; - QModelIndex folderDestinationModelIndex; + qulonglong _folderDestinationId; QSettings *settings; bool checkModifiedDatesOnUpdate; void cleanup(QSqlDatabase &db, const QString &target); @@ -69,7 +67,7 @@ class LibraryCreator : public QThread void created(); void failedCreatingDB(QString); void failedOpeningDB(QString); - void updatedCurrentFolder(QModelIndex); + void updatedCurrentFolder(qulonglong folderId); }; #endif diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 78ac4f3ad..f7ceb3743 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -3,99 +3,89 @@ #include "yacreader_global.h" #include "yacreader_global_gui.h" -#include -#include -#include +#include +#include #include -#include -#include -#include #include -#include #include -#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include "folder_item.h" -#include "data_base_management.h" -#include "no_libraries_widget.h" -#include "import_widget.h" +#ifdef Q_OS_WIN +#include -#include "yacreader_search_line_edit.h" +#include +#endif + +#include "QsLog.h" +#include "add_label_dialog.h" +#include "add_library_dialog.h" +#include "api_key_dialog.h" #include "comic_db.h" -#include "library_creator.h" -#include "package_manager.h" -#include "xml_info_library_scanner.h" +#include "comic_files_manager.h" +#include "comic_model.h" +#include "comic_vine_dialog.h" +#include "comics_remover.h" +#include "comics_view.h" +#include "cover_utils.h" #include "create_library_dialog.h" -#include "rename_library_dialog.h" -#include "properties_dialog.h" -#include "export_library_dialog.h" -#include "import_library_dialog.h" +#include "data_base_management.h" +#include "db_helper.h" +#include "edit_shortcuts_dialog.h" #include "export_comics_info_dialog.h" +#include "export_library_dialog.h" +#include "folder_content_view.h" +#include "folder_item.h" +#include "help_about_dialog.h" #include "import_comics_info_dialog.h" -#include "add_library_dialog.h" +#include "import_library_dialog.h" +#include "import_widget.h" +#include "library_comic_opener.h" +#include "library_creator.h" +#include "no_libraries_widget.h" #include "options_dialog.h" -#include "help_about_dialog.h" +#include "package_manager.h" +#include "properties_dialog.h" +#include "reading_list_item.h" +#include "reading_list_model.h" +#include "recent_visibility_coordinator.h" +#include "rename_library_dialog.h" #include "server_config_dialog.h" -#include "comic_model.h" -#include "yacreader_tool_bar_stretch.h" - -#include "yacreader_titled_toolbar.h" -#include "yacreader_main_toolbar.h" - -#include "yacreader_sidebar.h" - -#include "comics_remover.h" -#include "yacreader_library_list_widget.h" -#include "yacreader_folders_view.h" - -#include "comic_vine_dialog.h" -#include "api_key_dialog.h" -// #include "yacreader_social_dialog.h" - -#include "comics_view.h" - -#include "edit_shortcuts_dialog.h" #include "shortcuts_manager.h" - -#include "comic_files_manager.h" - -#include "reading_list_model.h" -#include "yacreader_reading_lists_view.h" -#include "add_label_dialog.h" - -#include "yacreader_history_controller.h" -#include "db_helper.h" - -#include "reading_list_item.h" -#include "opengl_checker.h" - -#include "yacreader_content_views_manager.h" -#include "folder_content_view.h" - #include "trayicon_controller.h" - #include "whats_new_controller.h" - -#include "library_comic_opener.h" - -#include "recent_visibility_coordinator.h" - -#include "cover_utils.h" - -#include "QsLog.h" - +#include "xml_info_library_scanner.h" +#include "yacreader_content_views_manager.h" +#include "yacreader_folders_view.h" +#include "yacreader_history_controller.h" #include "yacreader_http_server.h" +#include "yacreader_library_list_widget.h" +#include "yacreader_main_toolbar.h" +#include "yacreader_reading_lists_view.h" +#include "yacreader_search_line_edit.h" +#include "yacreader_sidebar.h" +#include "yacreader_titled_toolbar.h" +#include "yacreader_tool_bar_stretch.h" extern YACReaderHttpServer *httpServer; -#ifdef Q_OS_WIN -#include -#include -#endif - #include namespace { @@ -169,13 +159,11 @@ bool LibraryWindow::eventFilter(QObject *object, QEvent *event) return QMainWindow::eventFilter(object, event); } -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto keyCombination = keySequence[0]; if (keyCombination.keyboardModifiers() != Qt::NoModifier) { return QMainWindow::eventFilter(object, event); } -#endif auto string = keySequence.toString(); @@ -198,26 +186,8 @@ void LibraryWindow::createSettings() settings->beginGroup("libraryConfig"); } -void LibraryWindow::setupOpenglSetting() -{ -#ifndef NO_OPENGL - // FLOW----------------------------------------------------------------------- - //--------------------------------------------------------------------------- - - OpenGLChecker openGLChecker; - bool openGLAvailable = openGLChecker.hasCompatibleOpenGLVersion(); - - if (openGLAvailable && !settings->contains(USE_OPEN_GL)) - settings->setValue(USE_OPEN_GL, 2); - else if (!openGLAvailable) - settings->setValue(USE_OPEN_GL, 0); -#endif -} - void LibraryWindow::setupUI() { - setupOpenglSetting(); - setUnifiedTitleAndToolBarOnMac(true); libraryCreator = new LibraryCreator(settings); @@ -252,25 +222,28 @@ void LibraryWindow::setupUI() showMaximized(); trayIconController = new TrayIconController(settings, this); + + initTheme(this); +} + +void LibraryWindow::applyTheme(const Theme &theme) +{ + editInfoToolBar->setStyleSheet(theme.comicsViewToolbar.toolbarQSS); + mainSplitter->setStyleSheet(theme.contentSplitter.horizontalSplitterQSS); + + // Update main toolbar and comics view toolbar icons + actions.updateTheme(theme); } void LibraryWindow::doLayout() { // LAYOUT ELEMENTS------------------------------------------------------------ - auto sHorizontal = new QSplitter(Qt::Horizontal); // spliter principal -#ifdef Y_MAC_UI - sHorizontal->setStyleSheet("QSplitter::handle{image:none;background-color:#B8B8B8;} QSplitter::handle:vertical {height:1px;}"); -#else - sHorizontal->setStyleSheet("QSplitter::handle:vertical {height:4px;}"); -#endif + mainSplitter = new QSplitter(Qt::Horizontal); // spliter principal + auto sHorizontal = mainSplitter; // Keep local alias for existing code // TOOLBARS------------------------------------------------------------------- //--------------------------------------------------------------------------- editInfoToolBar = new QToolBar(); - editInfoToolBar->setStyleSheet(R"( - QToolBar { border: none; } - QToolButton:checked { background-color: #cccccc; } - )"); #ifdef Y_MAC_UI libraryToolBar = new YACReaderMacOSXToolbar(this); @@ -722,7 +695,9 @@ void LibraryWindow::createConnections() connect(libraryCreator, &LibraryCreator::finished, this, &LibraryWindow::showRootWidget); connect(libraryCreator, &LibraryCreator::updated, this, &LibraryWindow::reloadCurrentLibrary); connect(libraryCreator, &LibraryCreator::created, this, &LibraryWindow::openLastCreated); - connect(libraryCreator, &LibraryCreator::updatedCurrentFolder, this, &LibraryWindow::reloadAfterCopyMove); + connect(libraryCreator, &LibraryCreator::updatedCurrentFolder, this, [this](qulonglong folderId) { + reloadAfterCopyMove(foldersModel->getIndexFromFolderId(folderId)); + }); connect(libraryCreator, &LibraryCreator::comicAdded, importWidget, &ImportWidget::newComic); // libraryCreator errors connect(libraryCreator, &LibraryCreator::failedCreatingDB, this, &LibraryWindow::manageCreatingError); @@ -787,11 +762,7 @@ void LibraryWindow::createConnections() // Search filter #ifdef Y_MAC_UI -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) connect(libraryToolBar, &YACReaderMacOSXToolbar::filterChanged, searchDebouncer, &KDToolBox::KDStringSignalDebouncer::throttle); -#else - connect(searchEdit, &YACReaderMacOSXSearchLineEdit::filterChanged, searchDebouncer, &KDToolBox::KDStringSignalDebouncer::throttle); -#endif connect(searchDebouncer, &KDToolBox::KDStringSignalDebouncer::triggered, this, [=](QString filter) { setSearchFilter(filter); }); @@ -1093,7 +1064,7 @@ void LibraryWindow::updateFolder(const QModelIndex &miFolder) QString currentLibrary = selectedLibrary->currentText(); QString path = QDir::cleanPath(libraries.getPath(currentLibrary)); _lastAdded = currentLibrary; - libraryCreator->updateFolder(path, LibraryPaths::libraryDataPath(path), QDir::cleanPath(currentPath() + foldersModel->getFolderPath(miFolder)), miFolder); + libraryCreator->updateFolder(path, LibraryPaths::libraryDataPath(path), QDir::cleanPath(currentPath() + foldersModel->getFolderPath(miFolder)), miFolder.data(FolderModel::IdRole).toULongLong()); libraryCreator->start(); } @@ -1421,12 +1392,14 @@ void LibraryWindow::showGridFoldersContextMenu(QPoint point, Folder folder) { QMenu menu; + const auto &menuIcons = theme.menuIcons; + auto openContainingFolderAction = new QAction(); openContainingFolderAction->setText(tr("Open folder...")); - openContainingFolderAction->setIcon(QIcon(":/images/menus_icons/open_containing_folder.svg")); + openContainingFolderAction->setIcon(menuIcons.openContainingFolderIcon); auto updateFolderAction = new QAction(tr("Update folder"), this); - updateFolderAction->setIcon(QIcon(":/images/menus_icons/update_current_folder.svg")); + updateFolderAction->setIcon(menuIcons.updateCurrentFolderIcon); auto rescanLibraryForXMLInfoAction = new QAction(tr("Rescan library for XML info"), this); @@ -1582,7 +1555,7 @@ void LibraryWindow::showContinueReadingContextMenu(QPoint point, ComicDB comic) auto setAsUnReadAction = new QAction(); setAsUnReadAction->setText(tr("Set as unread")); - setAsUnReadAction->setIcon(QIcon(":/images/comics_view_toolbar/setUnread.svg")); + setAsUnReadAction->setIcon(theme.comicsViewToolbar.setAsUnreadIcon); menu.addAction(setAsUnReadAction); @@ -1609,7 +1582,7 @@ void LibraryWindow::setupAddToSubmenu(QMenu &menu) const QList labels = listsModel->getLabels(); if (labels.count() > 0) menu.addSeparator(); - foreach (LabelItem *label, labels) { + for (auto *label : labels) { auto action = new QAction(this); action->setIcon(label->getIcon()); action->setText(label->name()); @@ -1648,8 +1621,8 @@ void LibraryWindow::saveSelectedCoversTo() QFileDialog saveDialog; QString folderPath = saveDialog.getExistingDirectory(this, tr("Save covers"), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); if (!folderPath.isEmpty()) { - QModelIndexList comics = getSelectedComics(); - foreach (QModelIndex comic, comics) { + const auto comics = getSelectedComics(); + for (const auto &comic : comics) { QString origin = comic.data(ComicModel::CoverPathRole).toString().remove("file:///").remove("file:"); QString destination = QDir(folderPath).filePath(comic.data(ComicModel::FileNameRole).toString() + ".jpg"); @@ -1830,7 +1803,8 @@ void LibraryWindow::openLibrary(QString path, QString name) void LibraryWindow::loadLibraries() { libraries.load(); - foreach (QString name, libraries.getNames()) + const auto libraryNames = libraries.getNames(); + for (const auto &name : libraryNames) selectedLibrary->addItem(name, libraries.getPath(name)); } @@ -1875,9 +1849,12 @@ void LibraryWindow::deleteCurrentLibrary() void LibraryWindow::removeLibrary() { QString currentLibrary = selectedLibrary->currentText(); - QMessageBox *messageBox = new QMessageBox(tr("Are you sure?"), tr("Do you want remove ") + currentLibrary + tr(" library?"), QMessageBox::Question, QMessageBox::Yes, QMessageBox::YesToAll, QMessageBox::No); + QMessageBox *messageBox = new QMessageBox(QMessageBox::Question, + tr("Are you sure?"), + tr("Do you want remove ") + currentLibrary + tr(" library?"), + QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No, + this); messageBox->button(QMessageBox::YesToAll)->setText(tr("Remove and delete metadata")); - messageBox->setParent(this); messageBox->setWindowModality(Qt::WindowModal); int ret = messageBox->exec(); if (ret == QMessageBox::Yes) { @@ -2168,7 +2145,7 @@ void LibraryWindow::showComicVineScraper() if (s.contains(COMIC_VINE_API_KEY)) { QModelIndexList indexList = getSelectedComics(); - QList comics = comicsModel->getComics(indexList); + const auto comics = comicsModel->getComics(indexList); ComicDB c = comics[0]; _comicIdEdited = c.id; // static_cast(indexList[0].internalPointer())->data(4).toULongLong(); @@ -2534,7 +2511,7 @@ void LibraryWindow::deleteComicsFromDisk() QList paths; QString libraryPath = currentPath(); - foreach (ComicDB comic, comics) { + for (const auto &comic : comics) { paths.append(libraryPath + comic.path); QLOG_TRACE() << comic.path; QLOG_TRACE() << comic.id; @@ -2661,19 +2638,6 @@ void LibraryWindow::showFoldersContextMenu(const QPoint &point) menu.exec(foldersView->mapToGlobal(point)); } -/* -void LibraryWindow::showSocial() -{ - socialDialog->move(this->mapToGlobal(QPoint(width()-socialDialog->width()-10, centralWidget()->pos().y()+10))); - - QModelIndexList indexList = getSelectedComics(); - - ComicDB comic = dmCV->getComic(indexList.at(0)); - - socialDialog->setComic(comic,currentPath()); - socialDialog->setHidden(false); -}*/ - void LibraryWindow::libraryAlreadyExists(const QString &name) { QMessageBox::information(this, tr("Library name already exists"), tr("There is another library with the name '%1'.").arg(name)); diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index b78a149ce..ec25b09c6 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -1,24 +1,22 @@ #ifndef __LIBRARYWINDOW_H #define __LIBRARYWINDOW_H -#include -#include -#include -#include - +#include "comic_db.h" +#include "comic_model.h" +#include "comic_query_result_processor.h" +#include "folder.h" +#include "folder_query_result_processor.h" +#include "libraries_update_coordinator.h" #include "library_window_actions.h" +#include "themable.h" #include "yacreader_global.h" -#include "yacreader_global_gui.h" #include "yacreader_libraries.h" -#include "libraries_update_coordinator.h" - #include "yacreader_navigation_controller.h" -#include "comic_query_result_processor.h" -#include "folder_query_result_processor.h" -#include "comic_model.h" -#include "comic_db.h" -#include "folder.h" +#include +#include +#include +#include #include #include @@ -72,7 +70,6 @@ class ComicsView; class ClassicComicsView; class GridComicsView; class ComicsViewTransition; -class EmptyFolderWidget; class NoSearchResultsWidget; class EditShortcutsDialog; class ComicFilesManager; @@ -95,13 +92,14 @@ class XMLInfoLibraryScanner; using namespace YACReader; -class LibraryWindow : public QMainWindow +class LibraryWindow : public QMainWindow, protected Themable { friend class YACReaderNavigationController; Q_OBJECT public: YACReaderSideBar *sideBar; + QSplitter *mainSplitter; CreateLibraryDialog *createLibraryDialog; ExportLibraryDialog *exportLibraryDialog; @@ -116,7 +114,6 @@ class LibraryWindow : public QMainWindow PropertiesDialog *propertiesDialog; ComicVineDialog *comicVineDialog; EditShortcutsDialog *editShortcutsDialog; - // YACReaderSocialDialog * socialDialog; bool fullscreen; bool importedCovers; // if true, the library is read only (not updates,open comic or properties) bool fromMaximized; @@ -189,7 +186,6 @@ class LibraryWindow : public QMainWindow NavigationStatus status; void createSettings(); - void setupOpenglSetting(); void setupUI(); void createToolBars(); void createMenus(); @@ -217,6 +213,7 @@ class LibraryWindow : public QMainWindow protected: virtual void closeEvent(QCloseEvent *event) override; + void applyTheme(const Theme &theme) override; public: LibraryWindow(); @@ -292,7 +289,6 @@ public slots: void deleteComics(); void deleteComicsFromDisk(); void deleteComicsFromList(); - // void showSocial(); void showFoldersContextMenu(const QPoint &point); void showGridFoldersContextMenu(QPoint point, Folder folder); void showContinueReadingContextMenu(QPoint point, ComicDB comic); diff --git a/YACReaderLibrary/library_window_actions.cpp b/YACReaderLibrary/library_window_actions.cpp index ad49d1e7b..76957dcbd 100644 --- a/YACReaderLibrary/library_window_actions.cpp +++ b/YACReaderLibrary/library_window_actions.cpp @@ -1,20 +1,19 @@ #include "library_window_actions.h" #include "edit_shortcuts_dialog.h" +#include "export_library_dialog.h" +#include "help_about_dialog.h" #include "library_window.h" -#include "shortcuts_manager.h" -#include "yacreader_history_controller.h" #include "recent_visibility_coordinator.h" - -#include "help_about_dialog.h" -#include "export_library_dialog.h" -#include "yacreader_content_views_manager.h" #include "server_config_dialog.h" +#include "shortcuts_manager.h" +#include "theme_manager.h" +#include "yacreader_content_views_manager.h" #include "yacreader_folders_view.h" +#include "yacreader_history_controller.h" #include "yacreader_options_dialog.h" #include -#include LibraryWindowActions::LibraryWindowActions() { @@ -22,79 +21,62 @@ LibraryWindowActions::LibraryWindowActions() void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *settings) { - auto tr = [](const char *text) { return QObject::tr(text); }; + auto tr = [](const char *text) { return QCoreApplication::translate("LibraryWindowActions", text); }; backAction = new QAction(window); - QIcon icoBackButton; - icoBackButton.addFile(addExtensionToIconPath(":/images/main_toolbar/back"), QSize(), QIcon::Normal); - // icoBackButton.addPixmap(QPixmap(":/images/main_toolbar/back_disabled.png"), QIcon::Disabled); backAction->setData(BACK_ACTION_YL); backAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(BACK_ACTION_YL)); - backAction->setIcon(icoBackButton); backAction->setDisabled(true); forwardAction = new QAction(window); - QIcon icoFordwardButton; - icoFordwardButton.addFile(addExtensionToIconPath(":/images/main_toolbar/forward"), QSize(), QIcon::Normal); - // icoFordwardButton.addPixmap(QPixmap(":/images/main_toolbar/forward_disabled.png"), QIcon::Disabled); forwardAction->setData(FORWARD_ACTION_YL); forwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(FORWARD_ACTION_YL)); - forwardAction->setIcon(icoFordwardButton); forwardAction->setDisabled(true); createLibraryAction = new QAction(window); createLibraryAction->setToolTip(tr("Create a new library")); createLibraryAction->setData(CREATE_LIBRARY_ACTION_YL); createLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(CREATE_LIBRARY_ACTION_YL)); - createLibraryAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/newLibraryIcon"))); openLibraryAction = new QAction(window); openLibraryAction->setToolTip(tr("Open an existing library")); openLibraryAction->setData(OPEN_LIBRARY_ACTION_YL); openLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_LIBRARY_ACTION_YL)); - openLibraryAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/openLibraryIcon"))); exportComicsInfoAction = new QAction(tr("Export comics info"), window); exportComicsInfoAction->setToolTip(tr("Export comics info")); exportComicsInfoAction->setData(EXPORT_COMICS_INFO_ACTION_YL); exportComicsInfoAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(EXPORT_COMICS_INFO_ACTION_YL)); - exportComicsInfoAction->setIcon(QIcon(":/images/menus_icons/exportComicsInfoIcon.svg")); importComicsInfoAction = new QAction(tr("Import comics info"), window); importComicsInfoAction->setToolTip(tr("Import comics info")); importComicsInfoAction->setData(IMPORT_COMICS_INFO_ACTION_YL); importComicsInfoAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(IMPORT_COMICS_INFO_ACTION_YL)); - importComicsInfoAction->setIcon(QIcon(":/images/menus_icons/importComicsInfoIcon.svg")); exportLibraryAction = new QAction(tr("Pack covers"), window); exportLibraryAction->setToolTip(tr("Pack the covers of the selected library")); exportLibraryAction->setData(EXPORT_LIBRARY_ACTION_YL); exportLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(EXPORT_LIBRARY_ACTION_YL)); - exportLibraryAction->setIcon(QIcon(":/images/menus_icons/exportLibraryIcon.svg")); importLibraryAction = new QAction(tr("Unpack covers"), window); importLibraryAction->setToolTip(tr("Unpack a catalog")); importLibraryAction->setData(IMPORT_LIBRARY_ACTION_YL); importLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(IMPORT_LIBRARY_ACTION_YL)); - importLibraryAction->setIcon(QIcon(":/images/menus_icons/importLibraryIcon.svg")); updateLibraryAction = new QAction(tr("Update library"), window); updateLibraryAction->setToolTip(tr("Update current library")); updateLibraryAction->setData(UPDATE_LIBRARY_ACTION_YL); updateLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(UPDATE_LIBRARY_ACTION_YL)); - updateLibraryAction->setIcon(QIcon(":/images/menus_icons/updateLibraryIcon.svg")); renameLibraryAction = new QAction(tr("Rename library"), window); renameLibraryAction->setToolTip(tr("Rename current library")); renameLibraryAction->setData(RENAME_LIBRARY_ACTION_YL); renameLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(RENAME_LIBRARY_ACTION_YL)); - renameLibraryAction->setIcon(QIcon(":/images/menus_icons/editIcon.svg")); removeLibraryAction = new QAction(tr("Remove library"), window); removeLibraryAction->setToolTip(tr("Remove current library from your collection")); removeLibraryAction->setData(REMOVE_LIBRARY_ACTION_YL); removeLibraryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(REMOVE_LIBRARY_ACTION_YL)); - removeLibraryAction->setIcon(QIcon(":/images/menus_icons/removeLibraryIcon.svg")); rescanLibraryForXMLInfoAction = new QAction(tr("Rescan library for XML info"), window); rescanLibraryForXMLInfoAction->setToolTip(tr("Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files.")); @@ -110,7 +92,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti openComicAction->setToolTip(tr("Open current comic on YACReader")); openComicAction->setData(OPEN_COMIC_ACTION_YL); openComicAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_COMIC_ACTION_YL)); - openComicAction->setIcon(QIcon(":/images/comics_view_toolbar/openInYACReader.svg")); saveCoversToAction = new QAction(tr("Save selected covers to..."), window); saveCoversToAction->setToolTip(tr("Save covers of the selected comics as JPG files")); @@ -121,25 +102,21 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti setAsReadAction->setToolTip(tr("Set comic as read")); setAsReadAction->setData(SET_AS_READ_ACTION_YL); setAsReadAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_AS_READ_ACTION_YL)); - setAsReadAction->setIcon(QIcon(":/images/comics_view_toolbar/setReadButton.svg")); setAsNonReadAction = new QAction(tr("Set as unread"), window); setAsNonReadAction->setToolTip(tr("Set comic as unread")); setAsNonReadAction->setData(SET_AS_NON_READ_ACTION_YL); setAsNonReadAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_AS_NON_READ_ACTION_YL)); - setAsNonReadAction->setIcon(QIcon(":/images/comics_view_toolbar/setUnread.svg")); setMangaAction = new QAction(tr("manga"), window); setMangaAction->setToolTip(tr("Set issue as manga")); setMangaAction->setData(SET_AS_MANGA_ACTION_YL); setMangaAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_AS_MANGA_ACTION_YL)); - setMangaAction->setIcon(QIcon(":/images/comics_view_toolbar/setManga.svg")); setNormalAction = new QAction(tr("comic"), window); setNormalAction->setToolTip(tr("Set issue as normal")); setNormalAction->setData(SET_AS_NORMAL_ACTION_YL); setNormalAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_AS_NORMAL_ACTION_YL)); - setNormalAction->setIcon(QIcon(":/images/comics_view_toolbar/setNormal.svg")); setWesternMangaAction = new QAction(tr("western manga"), window); setWesternMangaAction->setToolTip(tr("Set issue as western manga")); @@ -163,7 +140,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti showHideMarksAction->setData(SHOW_HIDE_MARKS_ACTION_YL); showHideMarksAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_HIDE_MARKS_ACTION_YL)); showHideMarksAction->setCheckable(true); - showHideMarksAction->setIcon(QIcon(":/images/comics_view_toolbar/showMarks.svg")); showHideMarksAction->setChecked(true); toogleShowRecentIndicatorAction = new QAction(tr("Show/Hide recent indicator"), window); @@ -171,7 +147,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti toogleShowRecentIndicatorAction->setData(SHOW_HIDE_RECENT_INDICATOR_ACTION_YL); toogleShowRecentIndicatorAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_HIDE_RECENT_INDICATOR_ACTION_YL)); toogleShowRecentIndicatorAction->setCheckable(true); - toogleShowRecentIndicatorAction->setIcon(QIcon(":/images/comics_view_toolbar/showRecentIndicator.svg")); toogleShowRecentIndicatorAction->setChecked(settings->value(DISPLAY_RECENTLY_INDICATOR, true).toBool()); #ifndef Q_OS_MACOS @@ -179,79 +154,52 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti toggleFullScreenAction->setToolTip(tr("Fullscreen mode on/off")); toggleFullScreenAction->setData(TOGGLE_FULL_SCREEN_ACTION_YL); toggleFullScreenAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(TOGGLE_FULL_SCREEN_ACTION_YL)); - QIcon icoFullscreenButton; - icoFullscreenButton.addFile(addExtensionToIconPath(":/images/main_toolbar/fullscreen"), QSize(), QIcon::Normal); - toggleFullScreenAction->setIcon(icoFullscreenButton); #endif helpAboutAction = new QAction(window); helpAboutAction->setToolTip(tr("Help, About YACReader")); helpAboutAction->setData(HELP_ABOUT_ACTION_YL); helpAboutAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(HELP_ABOUT_ACTION_YL)); - QIcon icoHelpButton; - icoHelpButton.addFile(addExtensionToIconPath(":/images/main_toolbar/help"), QSize(), QIcon::Normal); - helpAboutAction->setIcon(icoHelpButton); addFolderAction = new QAction(tr("Add new folder"), window); addFolderAction->setData(ADD_FOLDER_ACTION_YL); addFolderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADD_FOLDER_ACTION_YL)); addFolderAction->setToolTip(tr("Add new folder to the current library")); - addFolderAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/addNew_sidebar"))); deleteFolderAction = new QAction(tr("Delete folder"), window); deleteFolderAction->setData(REMOVE_FOLDER_ACTION_YL); deleteFolderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(REMOVE_FOLDER_ACTION_YL)); deleteFolderAction->setToolTip(tr("Delete current folder from disk")); - deleteFolderAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/delete_sidebar"))); setRootIndexAction = new QAction(window); setRootIndexAction->setData(SET_ROOT_INDEX_ACTION_YL); setRootIndexAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_ROOT_INDEX_ACTION_YL)); setRootIndexAction->setToolTip(tr("Select root node")); - setRootIndexAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/setRoot"))); expandAllNodesAction = new QAction(window); expandAllNodesAction->setToolTip(tr("Expand all nodes")); expandAllNodesAction->setData(EXPAND_ALL_NODES_ACTION_YL); expandAllNodesAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(EXPAND_ALL_NODES_ACTION_YL)); - expandAllNodesAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/expand"))); colapseAllNodesAction = new QAction(window); colapseAllNodesAction->setToolTip(tr("Collapse all nodes")); colapseAllNodesAction->setData(COLAPSE_ALL_NODES_ACTION_YL); colapseAllNodesAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(COLAPSE_ALL_NODES_ACTION_YL)); - colapseAllNodesAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/colapse"))); optionsAction = new QAction(window); optionsAction->setToolTip(tr("Show options dialog")); optionsAction->setData(OPTIONS_ACTION_YL); optionsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPTIONS_ACTION_YL)); - QIcon icoSettingsButton; - icoSettingsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/settings"), QSize(), QIcon::Normal); - optionsAction->setIcon(icoSettingsButton); serverConfigAction = new QAction(window); serverConfigAction->setToolTip(tr("Show comics server options dialog")); serverConfigAction->setData(SERVER_CONFIG_ACTION_YL); serverConfigAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SERVER_CONFIG_ACTION_YL)); - QIcon icoServerButton; - icoServerButton.addFile(addExtensionToIconPath(":/images/main_toolbar/server"), QSize(), QIcon::Normal); - serverConfigAction->setIcon(icoServerButton); toggleComicsViewAction = new QAction(tr("Change between comics views"), window); toggleComicsViewAction->setToolTip(tr("Change between comics views")); - QIcon icoViewsButton; - - if (!settings->contains(COMICS_VIEW_STATUS) || settings->value(COMICS_VIEW_STATUS) == Flow) - icoViewsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/grid"), QSize(), QIcon::Normal); - else if (settings->value(COMICS_VIEW_STATUS) == Grid) - icoViewsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/info"), QSize(), QIcon::Normal); - else - icoViewsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/flow"), QSize(), QIcon::Normal); toggleComicsViewAction->setData(TOGGLE_COMICS_VIEW_ACTION_YL); toggleComicsViewAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(TOGGLE_COMICS_VIEW_ACTION_YL)); - toggleComicsViewAction->setIcon(icoViewsButton); - // socialAction = new QAction(this); //---- @@ -259,7 +207,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti openContainingFolderAction->setText(tr("Open folder...")); openContainingFolderAction->setData(OPEN_CONTAINING_FOLDER_ACTION_YL); openContainingFolderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_CONTAINING_FOLDER_ACTION_YL)); - openContainingFolderAction->setIcon(QIcon(":/images/menus_icons/open_containing_folder.svg")); setFolderAsNotCompletedAction = new QAction(window); setFolderAsNotCompletedAction->setText(tr("Set as uncompleted")); @@ -322,7 +269,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti openContainingFolderComicAction->setText(tr("Open containing folder...")); openContainingFolderComicAction->setData(OPEN_CONTAINING_FOLDER_COMIC_ACTION_YL); openContainingFolderComicAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_CONTAINING_FOLDER_COMIC_ACTION_YL)); - openContainingFolderComicAction->setIcon(QIcon(":/images/menus_icons/open_containing_folder.svg")); resetComicRatingAction = new QAction(window); resetComicRatingAction->setText(tr("Reset comic rating")); @@ -334,19 +280,16 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti selectAllComicsAction->setText(tr("Select all comics")); selectAllComicsAction->setData(SELECT_ALL_COMICS_ACTION_YL); selectAllComicsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SELECT_ALL_COMICS_ACTION_YL)); - selectAllComicsAction->setIcon(QIcon(":/images/comics_view_toolbar/selectAll.svg")); editSelectedComicsAction = new QAction(window); editSelectedComicsAction->setText(tr("Edit")); editSelectedComicsAction->setData(EDIT_SELECTED_COMICS_ACTION_YL); editSelectedComicsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(EDIT_SELECTED_COMICS_ACTION_YL)); - editSelectedComicsAction->setIcon(QIcon(":/images/comics_view_toolbar/editComic.svg")); asignOrderAction = new QAction(window); asignOrderAction->setText(tr("Assign current order to comics")); asignOrderAction->setData(ASIGN_ORDER_ACTION_YL); asignOrderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ASIGN_ORDER_ACTION_YL)); - asignOrderAction->setIcon(QIcon(":/images/comics_view_toolbar/asignNumber.svg")); forceCoverExtractedAction = new QAction(window); forceCoverExtractedAction->setText(tr("Update cover")); @@ -358,7 +301,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti deleteComicsAction->setText(tr("Delete selected comics")); deleteComicsAction->setData(DELETE_COMICS_ACTION_YL); deleteComicsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(DELETE_COMICS_ACTION_YL)); - deleteComicsAction->setIcon(QIcon(":/images/comics_view_toolbar/trash.svg")); deleteMetadataAction = new QAction(window); deleteMetadataAction->setText(tr("Delete metadata from selected comics")); @@ -369,7 +311,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti getInfoAction->setData(GET_INFO_ACTION_YL); getInfoAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GET_INFO_ACTION_YL)); getInfoAction->setText(tr("Download tags from Comic Vine")); - getInfoAction->setIcon(QIcon(":/images/comics_view_toolbar/getInfo.svg")); //------------------------------------------------------------------------- focusSearchLineAction = new QAction(tr("Focus search line"), window); @@ -390,19 +331,17 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti window->addAction(showEditShortcutsAction); quitAction = new QAction(tr("&Quit"), window); - quitAction->setIcon(QIcon(":/images/viewer_toolbar/close.svg")); + // quitAction->setIcon(QIcon(":/images/viewer_toolbar/close.svg")); quitAction->setData(QUIT_ACTION_YL); quitAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(QUIT_ACTION_YL)); // TODO: is `quitAction->setMenuRole(QAction::QuitRole);` useful on macOS? window->addAction(quitAction); updateFolderAction = new QAction(tr("Update folder"), window); - updateFolderAction->setIcon(QIcon(":/images/menus_icons/update_current_folder.svg")); updateCurrentFolderAction = new QAction(tr("Update current folder"), window); updateCurrentFolderAction->setData(UPDATE_CURRENT_FOLDER_ACTION_YL); updateCurrentFolderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(UPDATE_CURRENT_FOLDER_ACTION_YL)); - updateCurrentFolderAction->setIcon(QIcon(":/images/menus_icons/update_current_folder.svg")); rescanXMLFromCurrentFolderAction = new QAction(tr("Scan legacy XML metadata"), window); rescanXMLFromCurrentFolderAction->setData(SCAN_XML_FROM_CURRENT_FOLDER_ACTION_YL); @@ -412,25 +351,21 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti addReadingListAction->setData(ADD_READING_LIST_ACTION_YL); addReadingListAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADD_READING_LIST_ACTION_YL)); addReadingListAction->setToolTip(tr("Add a new reading list to the current library")); - addReadingListAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/addNew_sidebar"))); deleteReadingListAction = new QAction(tr("Remove reading list"), window); deleteReadingListAction->setData(REMOVE_READING_LIST_ACTION_YL); deleteReadingListAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(REMOVE_READING_LIST_ACTION_YL)); deleteReadingListAction->setToolTip(tr("Remove current reading list from the library")); - deleteReadingListAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/delete_sidebar"))); addLabelAction = new QAction(tr("Add new label"), window); addLabelAction->setData(ADD_LABEL_ACTION_YL); addLabelAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADD_LABEL_ACTION_YL)); addLabelAction->setToolTip(tr("Add a new label to this library")); - addLabelAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/addLabelIcon"))); renameListAction = new QAction(tr("Rename selected list"), window); renameListAction->setData(RENAME_LIST_ACTION_YL); renameListAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(RENAME_LIST_ACTION_YL)); renameListAction->setToolTip(tr("Rename any selected labels or lists")); - renameListAction->setIcon(QIcon(addExtensionToIconPath(":/images/sidebar/renameListIcon"))); //-- addToMenuAction = new QAction(tr("Add to..."), window); @@ -439,7 +374,6 @@ void LibraryWindowActions::createActions(LibraryWindow *window, QSettings *setti addToFavoritesAction->setData(ADD_TO_FAVORITES_ACTION_YL); addToFavoritesAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADD_TO_FAVORITES_ACTION_YL)); addToFavoritesAction->setToolTip(tr("Add selected comics to favorites list")); - addToFavoritesAction->setIcon(QIcon(":/images/lists/default_1.svg")); // global actions window->addAction(openComicAction); // this fixes opening comics in fullscreen mode using the keyboard shortcut @@ -609,11 +543,23 @@ void LibraryWindowActions::createConnections( void LibraryWindowActions::setUpShortcutsManagement(EditShortcutsDialog *editShortcutsDialog) { + // Set up icon mapping for theme changes + QMap> iconMapping; + iconMapping["Comics"] = [](const Theme &t) { return t.shortcutsIcons.comicsIcon; }; + iconMapping["Folders"] = [](const Theme &t) { return t.shortcutsIcons.foldersIcon; }; + iconMapping["Lists"] = [](const Theme &t) { return t.shortcutsIcons.foldersIcon; }; // TODO change icon + iconMapping["General"] = [](const Theme &t) { return t.shortcutsIcons.generalIcon; }; + iconMapping["Libraries"] = [](const Theme &t) { return t.shortcutsIcons.librariesIcon; }; + iconMapping["Visualization"] = [](const Theme &t) { return t.shortcutsIcons.visualizationIcon; }; + editShortcutsDialog->setGroupIconMapping(iconMapping); QList allActions; QList tmpList; - editShortcutsDialog->addActionsGroup("Comics", QIcon(":/images/shortcuts_group_comics.svg"), + // Get current theme for initial icons + const auto &theme = ThemeManager::instance().getCurrentTheme(); + + editShortcutsDialog->addActionsGroup("Comics", theme.shortcutsIcons.comicsIcon, tmpList = QList() << openComicAction << saveCoversToAction @@ -632,7 +578,7 @@ void LibraryWindowActions::setUpShortcutsManagement(EditShortcutsDialog *editSho allActions << tmpList; - editShortcutsDialog->addActionsGroup("Folders", QIcon(":/images/shortcuts_group_folders.svg"), + editShortcutsDialog->addActionsGroup("Folders", theme.shortcutsIcons.foldersIcon, tmpList = QList() << addFolderAction << deleteFolderAction @@ -652,7 +598,7 @@ void LibraryWindowActions::setUpShortcutsManagement(EditShortcutsDialog *editSho << deleteCustomFolderCoverAction); allActions << tmpList; - editShortcutsDialog->addActionsGroup("Lists", QIcon(":/images/shortcuts_group_folders.svg"), // TODO change icon + editShortcutsDialog->addActionsGroup("Lists", theme.shortcutsIcons.foldersIcon, // TODO change icon tmpList = QList() << addReadingListAction << deleteReadingListAction @@ -660,7 +606,7 @@ void LibraryWindowActions::setUpShortcutsManagement(EditShortcutsDialog *editSho << renameListAction); allActions << tmpList; - editShortcutsDialog->addActionsGroup("General", QIcon(":/images/shortcuts_group_general.svg"), + editShortcutsDialog->addActionsGroup("General", theme.shortcutsIcons.generalIcon, tmpList = QList() << backAction << forwardAction @@ -674,7 +620,7 @@ void LibraryWindowActions::setUpShortcutsManagement(EditShortcutsDialog *editSho allActions << tmpList; - editShortcutsDialog->addActionsGroup("Libraries", QIcon(":/images/shortcuts_group_libraries.svg"), + editShortcutsDialog->addActionsGroup("Libraries", theme.shortcutsIcons.librariesIcon, tmpList = QList() << createLibraryAction << openLibraryAction @@ -690,7 +636,7 @@ void LibraryWindowActions::setUpShortcutsManagement(EditShortcutsDialog *editSho allActions << tmpList; - editShortcutsDialog->addActionsGroup("Visualization", QIcon(":/images/shortcuts_group_visualization.svg"), + editShortcutsDialog->addActionsGroup("Visualization", theme.shortcutsIcons.visualizationIcon, tmpList = QList() << showHideMarksAction << toogleShowRecentIndicatorAction @@ -774,3 +720,67 @@ void LibraryWindowActions::disableAllActions() disableLibrariesActions(true); disableFoldersActions(true); } + +void LibraryWindowActions::updateTheme(const Theme &theme) +{ + const auto &mainToolbar = theme.mainToolbar; + const auto &comicsToolbar = theme.comicsViewToolbar; + const auto &readingListIcons = theme.readingListIcons; + const auto &menuIcons = theme.menuIcons; + + // Update sidebar action icons + const auto &sidebarIcons = theme.sidebarIcons; + createLibraryAction->setIcon(sidebarIcons.newLibraryIcon); + openLibraryAction->setIcon(sidebarIcons.openLibraryIcon); + addFolderAction->setIcon(sidebarIcons.addNewIcon); + deleteFolderAction->setIcon(sidebarIcons.deleteIcon); + setRootIndexAction->setIcon(sidebarIcons.setRootIcon); + expandAllNodesAction->setIcon(sidebarIcons.expandIcon); + colapseAllNodesAction->setIcon(sidebarIcons.colapseIcon); + addReadingListAction->setIcon(sidebarIcons.addNewIcon); + deleteReadingListAction->setIcon(sidebarIcons.deleteIcon); + addLabelAction->setIcon(sidebarIcons.addLabelIcon); + renameListAction->setIcon(sidebarIcons.renameListIcon); + + // Main toolbar icons + backAction->setIcon(mainToolbar.backIcon); + forwardAction->setIcon(mainToolbar.forwardIcon); + helpAboutAction->setIcon(mainToolbar.helpIcon); + optionsAction->setIcon(mainToolbar.settingsIcon); + serverConfigAction->setIcon(mainToolbar.serverIcon); +#ifndef Q_OS_MACOS + toggleFullScreenAction->setIcon(mainToolbar.fullscreenIcon); +#endif + + // Comics view toolbar icons + openComicAction->setIcon(comicsToolbar.openInYACReaderIcon); + setAsReadAction->setIcon(comicsToolbar.setAsReadIcon); + setAsNonReadAction->setIcon(comicsToolbar.setAsUnreadIcon); + setMangaAction->setIcon(comicsToolbar.setAsMangaIcon); + setNormalAction->setIcon(comicsToolbar.setAsNormalIcon); + showHideMarksAction->setIcon(comicsToolbar.showMarksIcon); + toogleShowRecentIndicatorAction->setIcon(comicsToolbar.showRecentIndicatorIcon); + selectAllComicsAction->setIcon(comicsToolbar.selectAllIcon); + editSelectedComicsAction->setIcon(comicsToolbar.editComicIcon); + asignOrderAction->setIcon(comicsToolbar.assignNumberIcon); + deleteComicsAction->setIcon(comicsToolbar.deleteIcon); + getInfoAction->setIcon(comicsToolbar.getInfoIcon); + + // Reading list icons + addToFavoritesAction->setIcon(readingListIcons.favoritesIcon); + + // Menu icons (context menus) + exportComicsInfoAction->setIcon(menuIcons.exportComicsInfoIcon); + importComicsInfoAction->setIcon(menuIcons.importComicsInfoIcon); + exportLibraryAction->setIcon(menuIcons.exportLibraryIcon); + importLibraryAction->setIcon(menuIcons.importLibraryIcon); + updateLibraryAction->setIcon(menuIcons.updateLibraryIcon); + renameLibraryAction->setIcon(menuIcons.renameLibraryIcon); + removeLibraryAction->setIcon(menuIcons.removeLibraryIcon); + openContainingFolderAction->setIcon(menuIcons.openContainingFolderIcon); + openContainingFolderComicAction->setIcon(menuIcons.openContainingFolderIcon); + updateFolderAction->setIcon(menuIcons.updateCurrentFolderIcon); + updateCurrentFolderAction->setIcon(menuIcons.updateCurrentFolderIcon); + + quitAction->setIcon(menuIcons.quitIcon); +} diff --git a/YACReaderLibrary/library_window_actions.h b/YACReaderLibrary/library_window_actions.h index 304942363..0cffabdbb 100644 --- a/YACReaderLibrary/library_window_actions.h +++ b/YACReaderLibrary/library_window_actions.h @@ -1,11 +1,11 @@ #ifndef LIBRARY_WINDOW_ACTIONS_H #define LIBRARY_WINDOW_ACTIONS_H +#include "qaction.h" + #include #include -#include "qaction.h" - class LibraryWindow; class YACReaderHistoryController; class EditShortcutsDialog; @@ -16,6 +16,7 @@ class YACReaderFoldersView; class YACReaderOptionsDialog; class ServerConfigDialog; class RecentVisibilityCoordinator; +struct Theme; class LibraryWindowActions { @@ -48,7 +49,6 @@ class LibraryWindowActions QAction *optionsAction; QAction *serverConfigAction; QAction *toggleComicsViewAction; - // QAction * socialAction; // tree actions QAction *addFolderAction; @@ -139,6 +139,7 @@ class LibraryWindowActions void disableFoldersActions(bool disabled); void disableAllActions(); void setUpShortcutsManagement(EditShortcutsDialog *editShortcutsDialog); + void updateTheme(const Theme &theme); }; #endif // LIBRARY_WINDOW_ACTIONS_H diff --git a/YACReaderLibrary/main.cpp b/YACReaderLibrary/main.cpp index 0af94d5f1..a77c4925d 100644 --- a/YACReaderLibrary/main.cpp +++ b/YACReaderLibrary/main.cpp @@ -1,27 +1,29 @@ #include "library_window.h" #include -#include -#include -#include #include -#include #include +#include +#include +#include #if !defined use_unarr && !defined use_libarchive #include #endif -#include -#include - -#include "yacreader_global.h" -#include "yacreader_http_server.h" -#include "yacreader_local_server.h" +#include "app_language_utils.h" +#include "appearance_configuration.h" #include "comic_db.h" #include "data_base_management.h" #include "db_helper.h" -#include "yacreader_libraries.h" #include "exit_check.h" -#include "opengl_checker.h" +#include "theme_manager.h" +#include "theme_repository.h" +#include "yacreader_global.h" +#include "yacreader_http_server.h" +#include "yacreader_libraries.h" +#include "yacreader_local_server.h" + +#include +#include #ifdef Q_OS_MACOS #include "trayhandler.h" #endif @@ -77,15 +79,6 @@ void logSystemAndConfig() else QLOG_INFO() << "server : disabled"; - if (settings.value(USE_OPEN_GL).toBool()) - QLOG_INFO() << "OpenGL : enabled" - << " - " << (settings.value(V_SYNC).toBool() ? "VSync on" : "VSync off"); - else - QLOG_INFO() << "OpenGL : disabled"; - - OpenGLChecker checker; - QLOG_INFO() << "OpenGL version : " << checker.textVersionDescription(); - auto libraries = DBHelper::getLibraries().getLibraries(); QLOG_INFO() << "Libraries: "; for (auto library : libraries) { @@ -132,27 +125,23 @@ int main(int argc, char **argv) { qInstallMessageHandler(messageHandler); - static const char ENV_VAR_QT_DEVICE_PIXEL_RATIO[] = "QT_DEVICE_PIXEL_RATIO"; - if (!qEnvironmentVariableIsSet(ENV_VAR_QT_DEVICE_PIXEL_RATIO) && !qEnvironmentVariableIsSet("QT_AUTO_SCREEN_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCALE_FACTOR") && !qEnvironmentVariableIsSet("QT_SCREEN_SCALE_FACTORS")) { - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - } - - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QImageReader::setAllocationLimit(0); -#endif QApplication app(argc, argv); -#ifdef FORCE_ANGLE - app.setAttribute(Qt::AA_UseOpenGLES); -#endif - app.setApplicationName("YACReaderLibrary"); app.setOrganizationName("YACReader"); app.setApplicationVersion(VERSION); + YACReader::initializeSharedPluginPaths(); + + // Theme initialization + auto *appearanceConfig = new AppearanceConfiguration( + YACReader::getSettingsPath() + "/YACReaderLibrary.ini", qApp); + auto *themeRepo = new ThemeRepository( + ":/themes", YACReader::getSettingsPath() + "/themes/user", "YACReaderLibrary"); + ThemeManager::instance().initialize(appearanceConfig, themeRepo); // Set window icon according to Freedesktop icon specification // This is mostly relevant for Linux and other Unix systems @@ -177,13 +166,11 @@ int main(int argc, char **argv) logger.addDestination(std::move(debugDestination)); logger.addDestination(std::move(fileDestination)); - QTranslator translator; -#if defined Q_OS_UNIX && !defined Q_OS_MACOS - translator.load(QLocale(), "yacreaderlibrary", "_", QString(DATADIR) + "/yacreader/languages"); -#else - translator.load(QLocale(), "yacreaderlibrary", "_", "languages"); -#endif - app.installTranslator(&translator); + QSettings uiSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); + uiSettings.beginGroup("libraryConfig"); + QString selectedLanguage = uiSettings.value(UI_LANGUAGE).toString(); + uiSettings.endGroup(); + YACReader::UiLanguage::applyLanguage("yacreaderlibrary", selectedLanguage); /*QTranslator viewerTranslator; #if defined Q_OS_UNIX && !defined Q_OS_MACOS @@ -199,29 +186,8 @@ int main(int argc, char **argv) parser.addHelpOption(); parser.addVersionOption(); parser.addOption({ "loglevel", "Set log level. Valid values: trace, info, debug, warn, error.", "loglevel", "warning" }); -#ifdef Q_OS_WIN - parser.addOption({ "opengl", "Set opengl renderer. Valid values: desktop, es, software.", "gl_renderer" }); -#endif parser.process(app); -#ifdef Q_OS_WIN - if (parser.isSet("opengl")) { - QTextStream qout(stdout); - if (parser.value("opengl") == "desktop") { - app.setAttribute(Qt::AA_UseDesktopOpenGL); - } else if (parser.value("opengl") == "es") { - app.setAttribute(Qt::AA_UseOpenGLES); - } else if (parser.value("opengl") == "software") { - qout << "Warning! This will be slow as hell. Only use this setting for" - "testing or as a last resort."; - app.setAttribute(Qt::AA_UseSoftwareOpenGL); - } else { - qout << "Invalid value:" << parser.value("gl_renderer"); - parser.showHelp(); - } - } -#endif - if (parser.isSet("loglevel")) { if (parser.value("loglevel") == "trace") { logger.setLoggingLevel(QsLogging::TraceLevel); diff --git a/YACReaderLibrary/no_libraries_widget.cpp b/YACReaderLibrary/no_libraries_widget.cpp index c0e05441c..8a539601b 100644 --- a/YACReaderLibrary/no_libraries_widget.cpp +++ b/YACReaderLibrary/no_libraries_widget.cpp @@ -1,31 +1,23 @@ #include "no_libraries_widget.h" -#include -#include #include +#include #include +#include NoLibrariesWidget::NoLibrariesWidget(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - QPalette p(palette()); - p.setColor(QPalette::Window, QColor(250, 250, 250)); setAutoFillBackground(true); - setPalette(p); - QPixmap icon(":/images/noLibrariesIcon.png"); - QLabel *iconLabel = new QLabel(); - iconLabel->setPixmap(icon); + iconLabel = new QLabel(); - QPixmap line(":/images/noLibrariesLine.png"); - QLabel *lineLabel = new QLabel(); - lineLabel->setPixmap(line); + lineLabel = new QLabel(); - QLabel *text = new QLabel("" + tr("You don't have any libraries yet") + ""); + text = new QLabel(tr("You don't have any libraries yet")); text->setStyleSheet("QLabel {font-size:25px;font-weight:bold;}"); - QLabel *textDescription = new QLabel("" + tr("

You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.

Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.

") + "
"); + textDescription = new QLabel(tr("

You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.

Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.

")); textDescription->setWordWrap(true); textDescription->setMaximumWidth(330); @@ -75,4 +67,26 @@ NoLibrariesWidget::NoLibrariesWidget(QWidget *parent) connect(createButton, &QAbstractButton::clicked, this, &NoLibrariesWidget::createNewLibrary); connect(addButton, &QAbstractButton::clicked, this, &NoLibrariesWidget::addExistingLibrary); + + initTheme(this); +} + +void NoLibrariesWidget::applyTheme(const Theme &theme) +{ + auto nlwTheme = theme.noLibrariesWidget; + + QPalette p(palette()); + p.setColor(QPalette::Window, nlwTheme.backgroundColor); + setPalette(p); + + QPalette textPalette = text->palette(); + textPalette.setColor(QPalette::WindowText, nlwTheme.textColor); + text->setPalette(textPalette); + + QPalette descPalette = textDescription->palette(); + descPalette.setColor(QPalette::WindowText, nlwTheme.descriptionTextColor); + textDescription->setPalette(descPalette); + + iconLabel->setPixmap(nlwTheme.noLibrariesIcon); + lineLabel->setPixmap(nlwTheme.noLibrariesLinePixmap); } diff --git a/YACReaderLibrary/no_libraries_widget.h b/YACReaderLibrary/no_libraries_widget.h index ee1a7b82d..19967071d 100644 --- a/YACReaderLibrary/no_libraries_widget.h +++ b/YACReaderLibrary/no_libraries_widget.h @@ -1,9 +1,13 @@ #ifndef NO_LIBRARIES_WIDGET_H #define NO_LIBRARIES_WIDGET_H +#include "themable.h" + #include -class NoLibrariesWidget : public QWidget +class QLabel; + +class NoLibrariesWidget : public QWidget, protected Themable { Q_OBJECT public: @@ -13,6 +17,15 @@ class NoLibrariesWidget : public QWidget void createNewLibrary(); void addExistingLibrary(); public slots: + +protected: + void applyTheme(const Theme &theme) override; + +private: + QLabel *iconLabel; + QLabel *text; + QLabel *textDescription; + QLabel *lineLabel; }; #endif // NO_LIBRARIES_WIDGET_H diff --git a/YACReaderLibrary/no_search_results_widget.cpp b/YACReaderLibrary/no_search_results_widget.cpp index bda1096c8..e1238d8ff 100644 --- a/YACReaderLibrary/no_search_results_widget.cpp +++ b/YACReaderLibrary/no_search_results_widget.cpp @@ -1,53 +1,19 @@ #include "no_search_results_widget.h" -#include "yacreader_global.h" - -#include -#include -#include - NoSearchResultsWidget::NoSearchResultsWidget(QWidget *parent) - : QWidget(parent) + : EmptyContainerInfo(parent) { -#ifdef Y_MAC_UI - backgroundColor = "#FFFFFF"; -#else - backgroundColor = "#2A2A2A"; -#endif - - auto layout = new QVBoxLayout; - - iconLabel = new QLabel(); - iconLabel->setPixmap(QPixmap(":/images/empty_search.png")); - iconLabel->setAlignment(Qt::AlignCenter); + setUpDefaultLayout(true); - titleLabel = new QLabel("No results"); - titleLabel->setAlignment(Qt::AlignCenter); - -#ifdef Y_MAC_UI - titleLabel->setStyleSheet("QLabel {color:#888888; font-size:24px;font-family:Arial;font-weight:bold;}"); -#else - titleLabel->setStyleSheet("QLabel {color:#CCCCCC; font-size:24px;font-family:Arial;font-weight:bold;}"); -#endif - - layout->addSpacing(100); - layout->addWidget(iconLabel); - layout->addSpacing(30); - layout->addWidget(titleLabel); - layout->addStretch(); - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(0); + setPixmap(theme.emptyContainer.noSearchResultsIcon); + setText(tr("No results")); setContentsMargins(0, 0, 0, 0); - - setStyleSheet(QString("QWidget {background:%1}").arg(backgroundColor)); - setSizePolicy(QSizePolicy ::Expanding, QSizePolicy ::Expanding); - setLayout(layout); } -void NoSearchResultsWidget::paintEvent(QPaintEvent *) +void NoSearchResultsWidget::applyTheme(const Theme &theme) { - QPainter painter(this); - painter.fillRect(0, 0, width(), height(), QColor(backgroundColor)); + EmptyContainerInfo::applyTheme(theme); + setPixmap(theme.emptyContainer.noSearchResultsIcon); } diff --git a/YACReaderLibrary/no_search_results_widget.h b/YACReaderLibrary/no_search_results_widget.h index 57939af73..48df514ac 100644 --- a/YACReaderLibrary/no_search_results_widget.h +++ b/YACReaderLibrary/no_search_results_widget.h @@ -1,25 +1,16 @@ #ifndef NO_SEARCH_RESULTS_WIDGET_H #define NO_SEARCH_RESULTS_WIDGET_H -#include +#include "empty_container_info.h" -class QLabel; - -class NoSearchResultsWidget : public QWidget +class NoSearchResultsWidget : public EmptyContainerInfo { Q_OBJECT public: explicit NoSearchResultsWidget(QWidget *parent = nullptr); -signals: - -public slots: - protected: - QLabel *iconLabel; - QLabel *titleLabel; - void paintEvent(QPaintEvent *) override; - QString backgroundColor; + void applyTheme(const Theme &theme) override; }; #endif // NO_SEARCH_RESULTS_WIDGET_H diff --git a/YACReaderLibrary/options_dialog.cpp b/YACReaderLibrary/options_dialog.cpp index dd7026750..ff37d8859 100644 --- a/YACReaderLibrary/options_dialog.cpp +++ b/YACReaderLibrary/options_dialog.cpp @@ -1,17 +1,23 @@ #include "options_dialog.h" -#ifndef NO_OPENGL -#include "yacreader_flow_gl.h" -#include "yacreader_gl_flow_config_widget.h" -#endif -#include "yacreader_flow_config_widget.h" #include "api_key_dialog.h" - +#include "app_language_utils.h" +#include "appearance_tab_widget.h" +#include "theme_factory.h" +#include "theme_manager.h" +#include "yacreader_3d_flow_config_widget.h" #include "yacreader_global_gui.h" -#ifndef NO_OPENGL +#include +#include +#include +#include +#include +#include +#include +#include + FlowType flowType = Strip; -#endif OptionsDialog::OptionsDialog(QWidget *parent) : YACReaderOptionsDialog(parent) @@ -21,16 +27,18 @@ OptionsDialog::OptionsDialog(QWidget *parent) auto comicFlowW = createFlowTab(); auto gridViewW = createGridTab(); + auto appearanceW = createAppearanceTab(); + auto tabWidget = new QTabWidget(); tabWidget->addTab(generalW, tr("General")); tabWidget->addTab(librariesW, tr("Libraries")); tabWidget->addTab(comicFlowW, tr("Comic Flow")); -#ifndef NO_OPENGL tabWidget->addTab(gridViewW, tr("Grid view")); -#endif + tabWidget->addTab(appearanceW, tr("Appearance")); auto buttons = new QHBoxLayout(); buttons->addStretch(); + buttons->addWidget(new QLabel(tr("Restart is needed"))); buttons->addWidget(accept); buttons->addWidget(cancel); @@ -54,6 +62,12 @@ void OptionsDialog::restoreOptions(QSettings *settings) { YACReaderOptionsDialog::restoreOptions(settings); + const auto selectedLanguage = settings->value(UI_LANGUAGE).toString().trimmed(); + int languageIndex = languageCombo->findData(selectedLanguage); + if (languageIndex < 0) + languageIndex = 0; + languageCombo->setCurrentIndex(languageIndex); + trayIconCheckbox->setChecked(settings->value(CLOSE_TO_TRAY, false).toBool()); startToTrayCheckbox->setChecked(settings->value(START_TO_TRAY, false).toBool()); startToTrayCheckbox->setEnabled(trayIconCheckbox->isChecked()); @@ -92,6 +106,12 @@ void OptionsDialog::restoreOptions(QSettings *settings) void OptionsDialog::saveOptions() { + const auto selectedLanguage = languageCombo->currentData().toString().trimmed(); + if (selectedLanguage.isEmpty()) + settings->remove(UI_LANGUAGE); + else + settings->setValue(UI_LANGUAGE, selectedLanguage); + settings->setValue(THIRD_PARTY_READER_COMMAND, thirdPartyReaderEdit->text()); YACReaderOptionsDialog::saveOptions(); } @@ -152,6 +172,19 @@ void OptionsDialog::resetToDefaults() QWidget *OptionsDialog::createGeneralTab() { + auto *languageBox = new QGroupBox(tr("Language")); + auto *languageLayout = new QHBoxLayout(); + languageLayout->addWidget(new QLabel(tr("Application language"))); + languageCombo = new QComboBox(this); + languageCombo->addItem(tr("System default"), QString()); + const auto availableLanguages = YACReader::UiLanguage::availableLanguages("yacreaderlibrary"); + for (const auto &language : availableLanguages) { + languageCombo->addItem( + QString("%1 (%2)").arg(language.displayName, language.code), language.code); + } + languageLayout->addWidget(languageCombo); + languageBox->setLayout(languageLayout); + // Tray icon settings QGroupBox *trayIconBox = new QGroupBox(tr("Tray icon settings (experimental)")); QVBoxLayout *trayLayout = new QVBoxLayout(); @@ -218,6 +251,7 @@ QWidget *OptionsDialog::createGeneralTab() connect(clearButton, &QPushButton::clicked, thirdPartyReaderEdit, &QLineEdit::clear); auto generalLayout = new QVBoxLayout(); + generalLayout->addWidget(languageBox); generalLayout->addWidget(trayIconBox); generalLayout->addWidget(shortcutsBox); generalLayout->addWidget(apiKeyBox); @@ -333,21 +367,11 @@ QWidget *OptionsDialog::createFlowTab() { auto switchFlowType = new QHBoxLayout(); switchFlowType->addStretch(); -#ifndef NO_OPENGL - switchFlowType->addWidget(useGL); -#endif auto flowLayout = new QVBoxLayout; - flowLayout->addWidget(sw); -#ifndef NO_OPENGL flowLayout->addWidget(gl); -#endif flowLayout->addLayout(switchFlowType); -#ifndef NO_OPENGL - sw->hide(); -#endif - auto comicFlowW = new QWidget; comicFlowW->setLayout(flowLayout); @@ -424,3 +448,13 @@ QWidget *OptionsDialog::createGridTab() return gridViewW; } + +QWidget *OptionsDialog::createAppearanceTab() +{ + return new AppearanceTabWidget( + ThemeManager::instance().getAppearanceConfiguration(), + ThemeManager::instance().getRepository(), + []() { return ThemeManager::instance().getCurrentTheme().sourceJson; }, + [](const QJsonObject &json) { ThemeManager::instance().setTheme(makeTheme(json)); }, + this); +} diff --git a/YACReaderLibrary/options_dialog.h b/YACReaderLibrary/options_dialog.h index ccf8a2ffb..017a3ced1 100644 --- a/YACReaderLibrary/options_dialog.h +++ b/YACReaderLibrary/options_dialog.h @@ -1,11 +1,17 @@ #ifndef __OPTIONS_DIALOG_H #define __OPTIONS_DIALOG_H -#include - +#include "yacreader_global.h" #include "yacreader_options_dialog.h" -#include "yacreader_global.h" +#include +#include +#include +#include +#include +#include +#include +#include using namespace YACReader; @@ -34,6 +40,7 @@ private slots: QCheckBox *displayContinueReadingBannerCheck; QCheckBox *trayIconCheckbox; QCheckBox *startToTrayCheckbox; + QComboBox *languageCombo; QCheckBox *comicInfoXMLCheckbox; QSlider *recentIntervalSlider; QLabel *numDaysLabel; @@ -61,6 +68,7 @@ private slots: QWidget *createLibrariesTab(); QWidget *createFlowTab(); QWidget *createGridTab(); + QWidget *createAppearanceTab(); }; #endif diff --git a/YACReaderLibrary/package_manager.cpp b/YACReaderLibrary/package_manager.cpp index 38200f5c1..2c8278d84 100644 --- a/YACReaderLibrary/package_manager.cpp +++ b/YACReaderLibrary/package_manager.cpp @@ -1,4 +1,5 @@ #include "package_manager.h" + #include PackageManager::PackageManager() diff --git a/YACReaderLibrary/properties_dialog.cpp b/YACReaderLibrary/properties_dialog.cpp index 55b66c9d6..4b43cd42c 100644 --- a/YACReaderLibrary/properties_dialog.cpp +++ b/YACReaderLibrary/properties_dialog.cpp @@ -1,28 +1,28 @@ #include "properties_dialog.h" -#include "yacreader_global_gui.h" - #include "cover_utils.h" #include "data_base_management.h" +#include "db_helper.h" #include "initial_comic_info_extractor.h" +#include "yacreader_cover_label.h" #include "yacreader_field_edit.h" #include "yacreader_field_plain_text_edit.h" -#include "db_helper.h" -#include "yacreader_cover_label.h" +#include "yacreader_global_gui.h" -#include #include -#include -#include #include -#include -#include +#include +#include #include +#include +#include +#include #include -#include -#include -#include #include +#include +#include +#include +#include using namespace YACReader; @@ -106,21 +106,21 @@ void PropertiesDialog::createCoverBox() coverPageEdit = new YACReaderFieldEdit(); showPreviousCoverPageButton = new QToolButton(); - showPreviousCoverPageButton->setIcon(QIcon(":/images/previousCoverPage.png")); + showPreviousCoverPageButton->setIcon(QIcon(":/images/metadata_dialog/previousCoverPage.svg")); showPreviousCoverPageButton->setToolTip(tr("Load previous page as cover")); showPreviousCoverPageButton->setStyleSheet("QToolButton {border:none;}"); showNextCoverPageButton = new QToolButton(); - showNextCoverPageButton->setIcon(QIcon(":/images/nextCoverPage.png")); + showNextCoverPageButton->setIcon(QIcon(":/images/metadata_dialog/nextCoverPage.svg")); showNextCoverPageButton->setToolTip(tr("Load next page as cover")); showNextCoverPageButton->setStyleSheet("QToolButton {border:none;}"); resetCoverButton = new QToolButton(); - resetCoverButton->setIcon(QIcon(":/images/resetCover.svg")); + resetCoverButton->setIcon(QIcon(":/images/metadata_dialog/resetCover.svg")); resetCoverButton->setToolTip(tr("Reset cover to the default image")); resetCoverButton->setStyleSheet("QToolButton {border:none;}"); loadCustomCoverImageButton = new QToolButton(); - loadCustomCoverImageButton->setIcon(QIcon(":/images/loadCustomCover.svg")); + loadCustomCoverImageButton->setIcon(QIcon(":/images/metadata_dialog/loadCustomCover.svg")); loadCustomCoverImageButton->setToolTip(tr("Load custom cover image")); loadCustomCoverImageButton->setStyleSheet("QToolButton {border:none;}"); diff --git a/YACReaderLibrary/properties_dialog.h b/YACReaderLibrary/properties_dialog.h index f4dcdd96b..c4f9e3455 100644 --- a/YACReaderLibrary/properties_dialog.h +++ b/YACReaderLibrary/properties_dialog.h @@ -2,7 +2,6 @@ #define __PROPERTIES_DIALOG_H #include - #include class QGridLayout; diff --git a/YACReaderLibrary/qml.qrc b/YACReaderLibrary/qml.qrc deleted file mode 100644 index 8bdd2e314..000000000 --- a/YACReaderLibrary/qml.qrc +++ /dev/null @@ -1,32 +0,0 @@ - - - qml/GridComicsView.qml - qml/FolderContentView.qml - qml/tick.png - qml/reading.png - qml/star_menu.png - qml/star_menu@2x.png - qml/InfoComicsView.qml - qml/FlowView.qml - qml/info-indicator.png - qml/info-shadow.png - qml/info-indicator-light.png - qml/info-shadow-light.png - qml/info-indicator-light@2x.png - qml/info-shadow-light@2x.png - qml/info-top-shadow.png - qml/ComicInfoView.qml - qml/info-favorites.png - qml/info-favorites@2x.png - qml/info-rating.png - qml/info-rating@2x.png - qml/info-tag.png - qml/info-tag@2x.png - qml/info-tick.png - qml/info-tick@2x.png - qml/InfoTick.qml - qml/InfoFavorites.qml - qml/InfoRating.qml - qml/prerendered_cover_shadow.png - - diff --git a/YACReaderLibrary/qml/ComicInfoView.qml b/YACReaderLibrary/qml/ComicInfoView.qml index de2d4442f..c65e9fe04 100644 --- a/YACReaderLibrary/qml/ComicInfoView.qml +++ b/YACReaderLibrary/qml/ComicInfoView.qml @@ -13,7 +13,7 @@ Rectangle { height: info.height + 2 * topMargin - property string infoColor: infoTextColor + property string infoColor: infoMetadataTextColor property font infoFont: Qt.font({ family: "Arial", @@ -80,7 +80,8 @@ Rectangle { Layout.topMargin: topMargin InfoTick { - Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.alignment: Qt.AlignTop | Qt.AlignLeft + Layout.topMargin: 5 read: comicInfo ? comicInfo.read ?? false : false @@ -95,7 +96,7 @@ Rectangle { } InfoFavorites { - Layout.topMargin: 1 + Layout.topMargin: 2 Layout.rightMargin: 17 Layout.alignment: Qt.AlignTop @@ -134,7 +135,7 @@ Rectangle { id: title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.bold: true font.pixelSize: mainContainer.compact ? 18 : 21; @@ -259,7 +260,7 @@ Rectangle { Text { id: showInComicVine font: mainContainer.infoFont - color: "#ffcc00" + color: themeLinkColor text: "Show in Comic Vine" visible: comicInfo ? comicInfo.comicVineID ?? false : false MouseArea { @@ -278,17 +279,12 @@ Rectangle { Layout.fillWidth: true id: sinopsis - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 wrapMode: Text.WordWrap horizontalAlignment: Text.AlignJustify - text: '' + (comicInfo ? comicInfo.synopsis ?? "" : "") + '' + text: '' + (comicInfo ? comicInfo.synopsis ?? "" : "") + '' visible: comicInfo ? comicInfo.synopsis ?? false : false textFormat: Text.RichText } @@ -298,7 +294,7 @@ Rectangle { Layout.bottomMargin: 5 id: characters_title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 18 font.bold: true @@ -316,7 +312,7 @@ Rectangle { model: comicInfo ? comicInfo.getCharacters().length : null Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -330,7 +326,7 @@ Rectangle { Layout.bottomMargin: 5 id: main_character_or_team_title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 18 font.bold: true @@ -341,7 +337,7 @@ Rectangle { } Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -355,7 +351,7 @@ Rectangle { Layout.bottomMargin: 5 id: teams_title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 18 font.bold: true @@ -375,7 +371,7 @@ Rectangle { model: comicInfo ? comicInfo.getTeams().length : null Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -389,7 +385,7 @@ Rectangle { Layout.bottomMargin: 5 id: locations_title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 18 font.bold: true @@ -407,7 +403,7 @@ Rectangle { model: comicInfo ? comicInfo.getLocations().length : null Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -421,7 +417,7 @@ Rectangle { Layout.bottomMargin: 5 id: authors_title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 18 font.bold: true @@ -446,7 +442,7 @@ Rectangle { model: comicInfo ? comicInfo.getWriters().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -454,7 +450,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -468,7 +464,7 @@ Rectangle { model: comicInfo ? comicInfo.getPencillers().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -476,7 +472,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -490,7 +486,7 @@ Rectangle { model: comicInfo ? comicInfo.getInkers().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -498,7 +494,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -512,7 +508,7 @@ Rectangle { model: comicInfo ? comicInfo.getColorists().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -520,7 +516,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -534,7 +530,7 @@ Rectangle { model: comicInfo ? comicInfo.getLetterers().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -542,7 +538,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -556,7 +552,7 @@ Rectangle { model: comicInfo ? comicInfo.getCoverArtists().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -564,7 +560,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -578,7 +574,7 @@ Rectangle { model: comicInfo ? comicInfo.getEditors().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -586,7 +582,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -600,7 +596,7 @@ Rectangle { model: comicInfo ? comicInfo.getImprint().length : null Column{ Text { - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -608,7 +604,7 @@ Rectangle { } Text { - color: infoTextColor + color: infoMetadataTextColor font.family: "Arial" font.pixelSize: 13 font.italic: true @@ -622,7 +618,7 @@ Rectangle { Layout.topMargin: 25 id: publisher_title - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 18 font.bold: true @@ -639,7 +635,7 @@ Rectangle { Text { id: publisher - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -651,7 +647,7 @@ Rectangle { Text { id: format - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -663,7 +659,7 @@ Rectangle { Text { id: type - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -675,7 +671,7 @@ Rectangle { Text { id: color - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -687,7 +683,7 @@ Rectangle { Text { id: language - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 @@ -699,7 +695,7 @@ Rectangle { Text { id: age_rating - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 15 diff --git a/YACReaderLibrary/qml/FlowView.qml b/YACReaderLibrary/qml/FlowView.qml index 1953054a1..5038ba001 100644 --- a/YACReaderLibrary/qml/FlowView.qml +++ b/YACReaderLibrary/qml/FlowView.qml @@ -1,7 +1,8 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 +import QtQuick -import QtGraphicalEffects 1.0 +import QtQuick.Controls + +import QtQuick.Effects import com.yacreader.ComicModel 1.0 @@ -24,7 +25,7 @@ Rectangle { Rectangle { id: background - color: "#2A2A2A" + color: backgroundBlurOverlayColor anchors.fill: backgroundImg } @@ -38,14 +39,16 @@ Rectangle { mipmap: true asynchronous : true cache: false //TODO clear cache only when it is needed - opacity: 0 + layer.enabled: true visible: false } - FastBlur { + MultiEffect { anchors.fill: backgroundImg source: backgroundImg - radius: backgroundBlurRadius + blurEnabled: true + blur: 1.0 + blurMax: Math.max(2, mainFlowContainer.backgroundBlurRadius) opacity: backgroundBlurOpacity visible: backgroundBlurVisible } @@ -112,26 +115,32 @@ Rectangle { color:"transparent" + scale: mouseArea.containsMouse ? 1.025 : 1 + + Behavior on scale { + NumberAnimation { duration: 90 } + } + BusyIndicator { scale: 0.5 anchors.centerIn: parent running: coverElement.status === Image.Loading } - BorderImage { - anchors { - top: coverElement.top - left: coverElement.left - right: coverElement.right - bottom: coverElement.bottom - margins: -6 + BorderImage { + anchors { + top: coverElement.top + left: coverElement.left + right: coverElement.right + bottom: coverElement.bottom + margins: -6 + } + border { left: 10; top: 10; right: 10; bottom: 10 } + horizontalTileMode: BorderImage.Stretch + verticalTileMode: BorderImage.Stretch + source: "prerendered_cover_shadow.png" + visible: showDropShadow } - border { left: 10; top: 10; right: 10; bottom: 10 } - horizontalTileMode: BorderImage.Stretch - verticalTileMode: BorderImage.Stretch - source: "prerendered_cover_shadow.png" - visible: showDropShadow - } Image { id: coverElement @@ -144,12 +153,13 @@ Rectangle { cache: false } + //mark Image { id: mark width: 23 height: 23 - source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" + source: read_column&&show_marks?"tick.svg":has_been_opened&&show_marks?"reading.svg":"" anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} asynchronous : true } @@ -161,7 +171,7 @@ Rectangle { anchors.centerIn: coverElement color: "transparent" border { - color: "#30FFFFFF" + color: comicCoverBorderColor width: 1 } } diff --git a/YACReaderLibrary/qml/FlowView6.qml b/YACReaderLibrary/qml/FlowView6.qml deleted file mode 100644 index 3e96df8c7..000000000 --- a/YACReaderLibrary/qml/FlowView6.qml +++ /dev/null @@ -1,225 +0,0 @@ -import QtQuick - -import QtQuick.Controls - -import Qt5Compat.GraphicalEffects - -import com.yacreader.ComicModel 1.0 - -Rectangle { - id: mainFlowContainer - - property url backgroundImageURL; - - property real backgroundBlurRadius : 100; //85; - property real backgroundBlurOpacity : 0.25; //0.35; - property bool backgroundBlurVisible : true; - - property real additionalBottomSpace : 0; - - property real verticalPadding: 12 - - property real itemsSpacing: 17 - - signal currentCoverChanged(int index) - - Rectangle { - id: background - color: "#2A2A2A" - anchors.fill: backgroundImg - } - - Image { - id: backgroundImg - width: parent.width - height: parent.height + additionalBottomSpace - source: backgroundImage - fillMode: Image.PreserveAspectCrop - smooth: true - mipmap: true - asynchronous : true - cache: false //TODO clear cache only when it is needed - opacity: 0 - visible: false - } - - FastBlur { - anchors.fill: backgroundImg - source: backgroundImg - radius: backgroundBlurRadius - opacity: backgroundBlurOpacity - visible: backgroundBlurVisible - } - - anchors.margins: 0 - - MouseArea { - anchors.fill : list - onWheel: wheel => { - - if(list.moving) - return; - - var ci - if(wheel.angleDelta.y < 0) { - ci = Math.min(list.currentIndex+1, list.count - 1); - } - else if(wheel.angleDelta.y > 0) { - ci = Math.max(0,list.currentIndex-1); - } else { - return; - } - - list.currentIndex = ci; - } - } - - ListView { - id: list - objectName: "list" - anchors.fill: parent - - property int previousIndex; - - orientation: Qt.Horizontal - pixelAligned: true - - model: comicsList - - spacing: itemsSpacing - anchors.leftMargin: Math.floor(verticalPadding * 1.1) - - snapMode: ListView.SnapToItem - - highlightFollowsCurrentItem: true - highlightRangeMode: ListView.StrictlyEnforceRange - preferredHighlightEnd: 50 - - highlightMoveDuration: 250 - - onCurrentIndexChanged: currentIndex => { - if (list.currentIndex !== -1) { - mainFlowContainer.currentCoverChanged(list.currentIndex); - } - } - - delegate: Component { - - //cover - Rectangle { - width: Math.floor((list.height - (verticalPadding * 2)) * 0.65); - height: list.height - (verticalPadding * 2); - anchors.verticalCenter: parent.verticalCenter - - color:"transparent" - - scale: mouseArea.containsMouse ? 1.025 : 1 - - Behavior on scale { - NumberAnimation { duration: 90 } - } - - BusyIndicator { - scale: 0.5 - anchors.centerIn: parent - running: coverElement.status === Image.Loading - } - - BorderImage { - anchors { - top: coverElement.top - left: coverElement.left - right: coverElement.right - bottom: coverElement.bottom - margins: -6 - } - border { left: 10; top: 10; right: 10; bottom: 10 } - horizontalTileMode: BorderImage.Stretch - verticalTileMode: BorderImage.Stretch - source: "prerendered_cover_shadow.png" - visible: showDropShadow - } - - Image { - id: coverElement - anchors.fill: parent - source: cover_path - fillMode: Image.PreserveAspectCrop - smooth: true - mipmap: true - asynchronous : true - cache: false - } - - - //mark - Image { - id: mark - width: 23 - height: 23 - source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" - anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} - asynchronous : true - } - - //border - Rectangle { - width: coverElement.width - height: coverElement.height - anchors.centerIn: coverElement - color: "transparent" - border { - color: "#30FFFFFF" - width: 1 - } - } - - MouseArea { - id: mouseArea - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - - hoverEnabled: true - - onDoubleClicked: { - list.currentIndex = index; - currentIndexHelper.selectedItem(index); - } - - onReleased: mouse => { - list.currentIndex = index; - - if(mouse.button === Qt.RightButton) // context menu is requested - { - var coordinates = mainFlowContainer.mapFromItem(coverElement,mouseX,mouseY) - contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y)); - } - - mouse.accepted = true; - } - } - } - } - - focus: true - Keys.onPressed: event => { - - if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) - return; - var ci - if (event.key === Qt.Key_Right || event.key === Qt.Key_Down) { - ci = Math.min(list.currentIndex+1, list.count - 1); - } - else if (event.key === Qt.Key_Left || event.key === Qt.Key_Up) { - ci = Math.max(0,list.currentIndex-1); - } else { - return; - } - - list.currentIndex = ci; - - event.accepted = true; - } - - } -} diff --git a/YACReaderLibrary/qml/FolderContentView.qml b/YACReaderLibrary/qml/FolderContentView.qml index d49d42d16..98b705227 100644 --- a/YACReaderLibrary/qml/FolderContentView.qml +++ b/YACReaderLibrary/qml/FolderContentView.qml @@ -1,15 +1,17 @@ -import QtQuick 2.15 +import QtQuick -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.12 +import QtQuick.Controls +import QtQuick.Layouts -import QtGraphicalEffects 1.0 +import QtQuick.Effects import com.yacreader.ComicModel 1.0 import com.yacreader.ComicInfo 1.0 import com.yacreader.ComicDB 1.0 +import QtQuick.Controls.Basic + Rectangle { id: main @@ -82,9 +84,9 @@ Rectangle { height: coverElement.height radius: 10 anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - color: "#20000000" + color: placeholderFolder1Color border { - color: "#20FFFFFF" + color: placeholderFolder1BorderColor width: 1 } } @@ -95,9 +97,9 @@ Rectangle { height: coverElement.height radius: 10 anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - color: "#88000000" + color: placeholderFolder2Color border { - color: "#20FFFFFF" + color: placeholderFolder2BorderColor width: 1 } } @@ -117,18 +119,31 @@ Rectangle { mipmap: true asynchronous : true cache: true + visible: false + } + Item { + id: coverMask + anchors.fill: parent layer.enabled: true - layer.effect: OpacityMask { + layer.smooth: true + visible: false + + Rectangle { anchors.fill: parent - cached: true - maskSource: Rectangle { - width: coverElement.width - height: coverElement.height - radius: 10 - } + radius: 10 + color: "black" } } + + MultiEffect { + source: coverImage + anchors.fill: coverImage + maskEnabled: true + maskSource: coverMask + maskThresholdMin: 0.5 + maskSpreadAtMin: 1.0 + } } //is new @@ -137,7 +152,7 @@ Rectangle { height: 10 radius: 5 anchors { left: coverElement.left; top: coverElement.top; topMargin: 10; leftMargin: 10; } - color: "#FFFFCC00" + color: newItemColor visible: (((new Date() / 1000) - added) < recent_range || ((new Date() / 1000) - updated) < recent_range) && show_recent } @@ -149,7 +164,7 @@ Rectangle { anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} color: "transparent" border { - color: "#20FFFFFF" + color: folderCoverBorderColor width: 1 } } @@ -163,7 +178,7 @@ Rectangle { wrapMode: Text.WordWrap text: name elide: Text.ElideRight - color: titleColor + color: itemTitleColor font.letterSpacing: fontSpacing font.pointSize: fontSize font.family: fontFamily @@ -206,7 +221,7 @@ Rectangle { Text { id: continueReadingText text: qsTr("Continue Reading...") - color: continueReadingColor + color: continueReadingTextColor anchors.left: parent.left anchors.top: parent.top anchors.topMargin: 15 @@ -282,7 +297,7 @@ Rectangle { wrapMode: Text.WordWrap text: readable_title elide: Text.ElideRight - color: titleColor + color: itemTitleColor font.letterSpacing: fontSpacing font.pointSize: fontSize font.family: fontFamily @@ -295,7 +310,7 @@ Rectangle { anchors.centerIn: coverElement color: "transparent" border { - color: "#30FFFFFF" + color: comicCoverBorderColor width: 1 } } @@ -403,6 +418,14 @@ Rectangle { } } + onOriginYChanged: { + console.log(" origin changed ", grid.originY) + } + + onContentYChanged: { + console.log(" content y changed ", grid.contentY) + } + ScrollBar.vertical: ScrollBar { visible: grid.contentHeight > grid.height @@ -410,13 +433,13 @@ Rectangle { implicitWidth: 12 implicitHeight: 26 Rectangle { - color: "#88424242" + color: scrollbarColor anchors.fill: parent anchors.topMargin: 6 anchors.leftMargin: 3 anchors.rightMargin: 2 anchors.bottomMargin: 6 - border.color: "#AA313131" + border.color: scrollbarBorderColor border.width: 1 radius: 3.5 } diff --git a/YACReaderLibrary/qml/FolderContentView6.qml b/YACReaderLibrary/qml/FolderContentView6.qml deleted file mode 100644 index 6b27c713c..000000000 --- a/YACReaderLibrary/qml/FolderContentView6.qml +++ /dev/null @@ -1,477 +0,0 @@ -import QtQuick - -import QtQuick.Controls -import QtQuick.Layouts - -import Qt5Compat.GraphicalEffects - -import com.yacreader.ComicModel 1.0 - -import com.yacreader.ComicInfo 1.0 -import com.yacreader.ComicDB 1.0 - -import QtQuick.Controls.Basic - -Rectangle { - id: main - - property int continuReadingHeight: 430; - property int topContentMargin: 20; - - color: backgroundColor - anchors.margins: 0 - - Component { - id: appDelegate - Rectangle - { - id: cell - width: grid.cellWidth - height: grid.cellHeight - color: "#00000000" - - scale: mouseArea.containsMouse ? 1.025 : 1 - - Behavior on scale { - NumberAnimation { duration: 90 } - } - - Rectangle { - id: realCell - - property int position : 0 - - width: itemWidth - height: itemHeight - - color: "transparent" - anchors.horizontalCenter: parent.horizontalCenter - - MouseArea { - id: mouseArea - - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - - hoverEnabled: true - - onDoubleClicked: { - openHelper.openFolder(index); - } - - onPressed: mouse => { - var ci = grid.currentIndex; //save current index - - mouse.accepted = true; - - if(mouse.button === Qt.RightButton) // context menu is requested - { - var coordinates = main.mapFromItem(realCell,mouseX,mouseY) - contextMenuHelper.requestedFolderContextMenu(Qt.point(coordinates.x,coordinates.y), index); - mouse.accepted = false; - - } - } - - } - } - - /**/ - - Rectangle { - transform: Rotation { origin.x: coverWidth / 2; origin.y: coverHeight / 2; angle: -4} - width: coverElement.width - height: coverElement.height - radius: 10 - anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - color: "#20000000" - border { - color: "#20FFFFFF" - width: 1 - } - } - - Rectangle { - transform: Rotation { origin.x: coverWidth / 2; origin.y: coverHeight / 2; angle: 3} - width: coverElement.width - height: coverElement.height - radius: 10 - anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - color: "#88000000" - border { - color: "#20FFFFFF" - width: 1 - } - } - - Item { - width: coverWidth - height: coverHeight - anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - id: coverElement - - Image { - id: coverImage - anchors.fill: parent - source: cover_path - fillMode: Image.PreserveAspectCrop - smooth: true - mipmap: true - asynchronous : true - cache: true - - layer.enabled: true - layer.effect: OpacityMask { - anchors.fill: parent - cached: true - maskSource: Rectangle { - width: coverElement.width - height: coverElement.height - radius: 10 - } - } - } - } - - //is new - Rectangle { - width: 10 - height: 10 - radius: 5 - anchors { left: coverElement.left; top: coverElement.top; topMargin: 10; leftMargin: 10; } - color: "#FFFFCC00" - visible: (((new Date() / 1000) - added) < recent_range || ((new Date() / 1000) - updated) < recent_range) && show_recent - } - - //border - Rectangle { - width: coverElement.width - height: coverElement.height - radius: 10 - anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - color: "transparent" - border { - color: "#20FFFFFF" - width: 1 - } - } - - //folder name - Text { - id : titleText - anchors { top: coverElement.bottom; left: realCell.left; leftMargin: 4; rightMargin: 4; topMargin: 10; } - width: itemWidth - 8 - maximumLineCount: 2 - wrapMode: Text.WordWrap - text: name - elide: Text.ElideRight - color: titleColor - font.letterSpacing: fontSpacing - font.pointSize: fontSize - font.family: fontFamily - } - } - } - - Rectangle { - id: scrollView - objectName: "topScrollView" - anchors.fill: parent - anchors.margins: 0 - children: grid - - color: "transparent" - - function scrollToOrigin() { - grid.contentY = grid.originY - grid.contentX = grid.originX - } - - property Component continueReadingView: Component { - id: continueReadingView - Rectangle { - id: continueReadingTopView - color: "#00000000" - - height: list.count > 0 && showContinueReading ? main.continuReadingHeight : main.topContentMargin - - Rectangle { - color: continueReadingBackgroundColor - - id: continueReadingBackground - - width: main.width - height: main.continuReadingHeight - main.topContentMargin - - visible: list.count > 0 && showContinueReading - - Text { - id: continueReadingText - text: qsTr("Continue Reading...") - color: continueReadingColor - anchors.left: parent.left - anchors.top: parent.top - anchors.topMargin: 15 - anchors.bottomMargin: 20 - anchors.leftMargin: 25 - anchors.rightMargin: 0 - font.pointSize: 18 - font.weight: Font.DemiBold - } - - ListView { - id: list - objectName: "list" - anchors { top: continueReadingText.bottom; left: parent.left; right: parent.right; bottom: parent.bottom; } - - property int previousIndex; - property int verticalPadding: 20 - - orientation: Qt.Horizontal - pixelAligned: true - - model: comicsList - - spacing: 20 - anchors.topMargin: 15 - anchors.bottomMargin: 20 - anchors.leftMargin: 25 - anchors.rightMargin: 20 - - WheelHandler { - onWheel: event => { - if (list.contentWidth <= list.width) { - return; - } - - var newValue = Math.min(list.contentWidth - list.width - anchors.leftMargin, (Math.max(list.originX , list.contentX - event.angleDelta.y))); - list.contentX = newValue - } - } - - delegate: Component { - - //cover - Rectangle { - width: Math.floor((list.height - (list.verticalPadding * 2)) * 0.65); - height: list.height - (list.verticalPadding * 2); - - color:"transparent" - - scale: mouseArea.containsMouse ? 1.025 : 1 - - Behavior on scale { - NumberAnimation { duration: 90 } - } - - Image { - id: coverElement - anchors.fill: parent - source: cover_path - fillMode: Image.PreserveAspectCrop - smooth: true - mipmap: true - asynchronous : true - cache: true - } - - //title - Text { - id : comicTitleText - anchors { top: coverElement.bottom; left: coverElement.left; right: coverElement.right; leftMargin: 4; rightMargin: 4; topMargin: 4; } - width: itemWidth - 8 - maximumLineCount: 2 - wrapMode: Text.WordWrap - text: readable_title - elide: Text.ElideRight - color: titleColor - font.letterSpacing: fontSpacing - font.pointSize: fontSize - font.family: fontFamily - } - - //border - Rectangle { - width: coverElement.width - height: coverElement.height - anchors.centerIn: coverElement - color: "transparent" - border { - color: "#30FFFFFF" - width: 1 - } - } - - MouseArea { - id: mouseArea - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - - hoverEnabled: true - - onDoubleClicked: { - list.currentIndex = index; - openHelper.openComicFromContinueReadingList(index); - } - - onReleased: mouse => { - list.currentIndex = index; - - if(mouse.button === Qt.RightButton) // context menu is requested - { - var coordinates = main.mapFromItem(coverElement,mouseX,mouseY) - contextMenuHelper.requestedContinueReadingComicContextMenu(Qt.point(coordinates.x,coordinates.y), index); - } - - mouse.accepted = true; - } - } - } - } - - focus: true - } - } - } - } - - GridView { - id:grid - objectName: "grid" - anchors.fill: parent - cellHeight: cellCustomHeight - header: continueReadingView - focus: true - model: foldersList - delegate: appDelegate - anchors.topMargin: 0 - anchors.bottomMargin: 10 - anchors.leftMargin: 0 - anchors.rightMargin: 0 - pixelAligned: true - highlightFollowsCurrentItem: true - - currentIndex: 0 - cacheBuffer: 0 - - interactive: true - - move: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - moveDisplaced: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - remove: Transition { - ParallelAnimation { - NumberAnimation { property: "opacity"; to: 0; duration: 250 } - - } - } - - removeDisplaced: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - displaced: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - function numCellsPerRow() { - return Math.floor(width / cellCustomWidth); - } - - onWidthChanged: { - calculateCellWidths(cellCustomWidth); - } - - function calculateCellWidths(cWidth) { - var wholeCells = Math.floor(width / cWidth); - var rest = width - (cWidth * wholeCells) - - grid.cellWidth = cWidth + Math.floor(rest / wholeCells); - } - - WheelHandler { - onWheel: event => { - if (grid.contentHeight <= grid.height) { - return; - } - - var newValue = Math.min((grid.contentHeight - grid.height + grid.originY), (Math.max(grid.originY , grid.contentY - event.angleDelta.y))); - grid.contentY = newValue; - } - } - - onOriginYChanged: { - console.log(" origin changed ", grid.originY) - } - - onContentYChanged: { - console.log(" content y changed ", grid.contentY) - } - - ScrollBar.vertical: ScrollBar { - visible: grid.contentHeight > grid.height - - contentItem: Item { - implicitWidth: 12 - implicitHeight: 26 - Rectangle { - color: "#88424242" - anchors.fill: parent - anchors.topMargin: 6 - anchors.leftMargin: 3 - anchors.rightMargin: 2 - anchors.bottomMargin: 6 - border.color: "#AA313131" - border.width: 1 - radius: 3.5 - } - } - } - - DropArea { - anchors.fill: parent - - onEntered: drag => { - if(drag.hasUrls) - { - if(dropManager.canDropUrls(drag.urls, drag.action)) - { - drag.accepted = true; - }else - drag.accepted = false; - } - else if (dropManager.canDropFormats(drag.formats)) { - drag.accepted = true; - } else - drag.accepted = false; - } - - onDropped: drop => { - if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) - { - dropManager.droppedFiles(drop.urls, drop.action); - } - else{ - if (dropManager.canDropFormats(drop.formats)) - { - var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); - var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x - var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); - - if(realIndex === -1) - realIndex = grid.count - 1; - - var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; - dropManager.droppedComicsForResortingAt("", destIndex); - } - } - } - } - } - } -} diff --git a/YACReaderLibrary/qml/GridComicsView.qml b/YACReaderLibrary/qml/GridComicsView.qml index bede0f79b..1aa16186e 100644 --- a/YACReaderLibrary/qml/GridComicsView.qml +++ b/YACReaderLibrary/qml/GridComicsView.qml @@ -1,15 +1,18 @@ -import QtQuick 2.15 +import QtQuick -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.12 +import QtQuick.Controls +import QtQuick.Layouts -import QtGraphicalEffects 1.0 +import QtQuick.Effects import com.yacreader.ComicModel 1.0 import com.yacreader.ComicInfo 1.0 import com.yacreader.ComicDB 1.0 +import QtQuick.Controls.Basic +import QtQuick.Controls.impl + SplitView { orientation: Qt.Horizontal handle: Rectangle { @@ -31,14 +34,16 @@ SplitView { mipmap: true asynchronous : true cache: false //TODO clear cache only when it is needed - opacity: 0 + layer.enabled: true visible: false } - FastBlur { + MultiEffect { anchors.fill: backgroundImg source: backgroundImg - radius: backgroundBlurRadius + blurEnabled: true + blur: 1.0 + blurMax: Math.max(2, backgroundBlurRadius) opacity: backgroundBlurOpacity visible: backgroundBlurVisible } @@ -103,8 +108,8 @@ SplitView { width: itemWidth height: itemHeight - color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedColor:cellColor; - //border.color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedBorderColor:borderColor; + color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?cellSelectedColor:cellColor; + //border.color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?cellSelectedBorderColor:borderColor; //border.width: ?1:0; anchors.horizontalCenter: parent.horizontalCenter @@ -138,7 +143,7 @@ SplitView { rightMargin : commonBorder ? -commonBorderWidth : -rBorderwidth } - border.color: selectedBorderColor + border.color: cellSelectedBorderColor border.width: 3 opacity: (dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index) ? 1 : 0 @@ -290,7 +295,7 @@ SplitView { height: 10 radius: 5 anchors { left: coverElement.left; top: coverElement.top; topMargin: 5; leftMargin: 5; } - color: "#FFFFCC00" + color: newItemColor visible: (((new Date() / 1000) - added_date) < recent_range) && show_recent } @@ -301,7 +306,7 @@ SplitView { anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} color: "transparent" border { - color: "#20FFFFFF" + color: comicCoverBorderColor width: 1 } } @@ -311,7 +316,7 @@ SplitView { id: mark width: 23 height: 23 - source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" + source: read_column&&show_marks?"tick.svg":has_been_opened&&show_marks?"reading.svg":"" anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} asynchronous : true } @@ -325,7 +330,7 @@ SplitView { wrapMode: Text.WordWrap text: title elide: Text.ElideRight - color: titleColor + color: itemTitleColor clip: true font.letterSpacing: fontSpacing font.pointSize: fontSize @@ -336,17 +341,18 @@ SplitView { Text { anchors {bottom: realCell.bottom; left: realCell.left; margins: 4} text: number?"#"+number:"" - color: textColor + color: itemDetailsColor font.letterSpacing: fontSpacing font.pointSize: fontSize font.family: fontFamily } //page icon - Image { + ColorImage { id: pageImage - anchors {bottom: realCell.bottom; right: realCell.right; bottomMargin: 5; rightMargin: 4; leftMargin: 4} - source: "page.png" + anchors {bottom: realCell.bottom; right: realCell.right; bottomMargin: 6; rightMargin: 4; leftMargin: 4} + source: "page.svg" + color: itemDetailsColor width: 8 height: 10 } @@ -356,18 +362,19 @@ SplitView { id: pages anchors {bottom: realCell.bottom; right: pageImage.left; margins: 4} text: has_been_opened?current_page+"/"+num_pages:num_pages - color: textColor + color: itemDetailsColor font.letterSpacing: fontSpacing font.pointSize: fontSize font.family: fontFamily } //rating icon - Image { + ColorImage { id: ratingImage - anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12} - source: "star.png" - width: 13 + anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 6.5; rightMargin: Math.floor(pages.width)+12} + source: "star.svg" + color: itemDetailsColor + width: 11 height: 11 MouseArea { @@ -377,30 +384,38 @@ SplitView { comicsSelectionHelper.clear(); comicsSelectionHelper.selectIndex(index); grid.currentIndex = index; - ratingConextMenu.popup(); - } - } - - Menu { - background: Rectangle { - implicitWidth: 42 - implicitHeight: 100 - //border.color: "#222" - //color: "#444" - } + ratingLoader.active = true; + ratingLoader.item.popup(); + } + } + + Loader { + id: ratingLoader + active: false + sourceComponent: ratingConextMenuComponent + } + + Component { + id: ratingConextMenuComponent + Menu { + background: Rectangle { + implicitWidth: 42 + implicitHeight: 100 + } - id: ratingConextMenu + id: ratingConextMenu - Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) } - Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) } - Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) } - Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) } - Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) } + Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) } + Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) } + Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) } + Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) } + Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) } - delegate: MenuItem { - implicitHeight: 30 - } - } + delegate: MenuItem { + implicitHeight: 30 + } + } + } } //comic rating @@ -408,7 +423,7 @@ SplitView { id: comicRating anchors {bottom: realCell.bottom; right: ratingImage.left; margins: 4} text: rating>0?rating:"-" - color: textColor + color: itemDetailsColor } } } @@ -462,17 +477,16 @@ SplitView { mipmap: true asynchronous : true cache: false //TODO clear cache only when it is needed - } - DropShadow { - anchors.fill: currentCoverElement - horizontalOffset: 0 - verticalOffset: 0 - radius: 8.0 - samples: 17 - color: "#FF000000" - source: currentCoverElement - visible: showDropShadow; + layer.enabled: showDropShadow + layer.effect: MultiEffect { + shadowEnabled: true + shadowColor: currentComicCoverShadowColor + shadowBlur: 1.0 + blurMax: 8 + shadowHorizontalOffset: 0 + shadowVerticalOffset: 0 + } } ColumnLayout @@ -497,13 +511,14 @@ SplitView { id: currentComicInfoTitleView - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.bold: true font.pixelSize: 21 wrapMode: Text.WordWrap - text: currentComic ? currentComic.getTitleIncludingNumber() : "" } + text: currentComic?.getTitleIncludingNumber() ?? "" + } Flow { spacing: 0 @@ -516,7 +531,7 @@ SplitView { family: "Arial", pixelSize: 14 }); - property string infoFlowTextColor: infoTextColor + property string infoFlowTextColor: infoMetadataTextColor Text { id: currentComicInfoVolume @@ -593,7 +608,7 @@ SplitView { Text { id: currentComicInfoShowInComicVine font: currentComicDetailsFlowView.infoFont - color: "#ffcc00" + color: themeLinkColor text: "Show in Comic Vine" visible: currentComicInfo.comicVineID ? true : false MouseArea { @@ -615,6 +630,7 @@ SplitView { ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + contentWidth: -1 contentItem: currentComicInfoSinopsis id: synopsisScroller @@ -627,17 +643,12 @@ SplitView { width: synopsisScroller.width id: currentComicInfoSinopsis - color: infoTitleColor + color: infoTextColor font.family: "Arial" font.pixelSize: 14 wrapMode: Text.WordWrap - text: '' + currentComicInfo.synopsis ?? "" + '' + text: '' + (currentComicInfo.synopsis ?? "") + '' visible: currentComicInfo.synopsis ?? false textFormat: Text.RichText } @@ -645,6 +656,7 @@ SplitView { } Button { + containmentMask: null text: "Read" id: readButton x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin @@ -656,9 +668,9 @@ SplitView { implicitWidth: 100 implicitHeight: 30 border.width: readButton.activeFocus ? 2 : 1 - border.color: "#FFCC00" + border.color: buttonColor radius: height / 2 - color: "#FFCC00" + color: buttonColor } contentItem: Text { @@ -668,21 +680,19 @@ SplitView { font.family: "Arial" font.pointSize: 12 font.bold: true - color: "white" + color: buttonTextColor text: readButton.text } - } - - DropShadow { - anchors.fill: readButton - horizontalOffset: 0 - verticalOffset: 0 - radius: 8.0 - samples: 17 - color: "#AA000000" - source: readButton - visible: showDropShadow && !readButton.pressed + layer.enabled: showDropShadow && !readButton.pressed + layer.effect: MultiEffect { + shadowEnabled: true + shadowColor: buttonShadowColor + shadowBlur: 1.0 + blurMax: 8 + shadowHorizontalOffset: 0 + shadowVerticalOffset: 0 + } } } } @@ -767,13 +777,13 @@ SplitView { implicitWidth: 12 implicitHeight: 26 Rectangle { - color: "#88424242" + color: scrollbarColor anchors.fill: parent anchors.topMargin: 6 anchors.leftMargin: 3 anchors.rightMargin: 2 anchors.bottomMargin: 6 - border.color: "#AA313131" + border.color: scrollbarBorderColor border.width: 1 radius: 3.5 } @@ -896,7 +906,7 @@ SplitView { implicitWidth: 12 implicitHeight: 26 Rectangle { - color: "#424246" + color: infoScrollbarColor anchors.fill: parent anchors.topMargin: 6 anchors.leftMargin: 5 diff --git a/YACReaderLibrary/qml/GridComicsView6.qml b/YACReaderLibrary/qml/GridComicsView6.qml deleted file mode 100644 index 9e0ff61b7..000000000 --- a/YACReaderLibrary/qml/GridComicsView6.qml +++ /dev/null @@ -1,927 +0,0 @@ -import QtQuick - -import QtQuick.Controls -import QtQuick.Layouts - -import Qt5Compat.GraphicalEffects - -import com.yacreader.ComicModel 1.0 - -import com.yacreader.ComicInfo 1.0 -import com.yacreader.ComicDB 1.0 - -import QtQuick.Controls.Basic - -SplitView { - orientation: Qt.Horizontal - handle: Rectangle { - border.width : 0 - implicitWidth: 10 - color: info_container.color - } - - Rectangle { - id: main - clip: true - - Image { - id: backgroundImg - anchors.fill: parent - source: backgroundImage - fillMode: Image.PreserveAspectCrop - smooth: true - mipmap: true - asynchronous : true - cache: false //TODO clear cache only when it is needed - opacity: 0 - visible: false - } - - FastBlur { - anchors.fill: backgroundImg - source: backgroundImg - radius: backgroundBlurRadius - opacity: backgroundBlurOpacity - visible: backgroundBlurVisible - } - - color: backgroundColor - width: parent.width - (info_container.visible ? info_container.width : 0) - SplitView.fillWidth: true - SplitView.minimumWidth: coverWidth + 100 - height: parent.height - anchors.margins: 0 - - Component { - id: appDelegate - Rectangle - { - id: cell - width: grid.cellWidth - height: grid.cellHeight - color: "#00000000" - - scale: mouseArea.containsMouse ? 1.025 : 1 - - Behavior on scale { - NumberAnimation { duration: 90 } - } - - BorderImage { - anchors { - top: realCell.top - left: realCell.left - right: realCell.right - bottom: realCell.bottom - margins: -10 - } - border { left: 10; top: 10; right: 10; bottom: 10 } - horizontalTileMode: BorderImage.Stretch - verticalTileMode: BorderImage.Stretch - source: "prerendered_cover_shadow.png" - visible: showDropShadow - } - - Rectangle { - id: realCell - - property int position : 0 - property bool dragging: false; - Drag.active: mouseArea.drag.active - Drag.hotSpot.x: 32 - Drag.hotSpot.y: 32 - Drag.dragType: Drag.Automatic - //Drag.mimeData: { "x": 1 } - Drag.proposedAction: Qt.CopyAction - Drag.onActiveChanged: { - if(!dragging) - { - dragManager.startDrag(); - dragging = true; - }else - dragging = false; - } - - width: itemWidth - height: itemHeight - - color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedColor:cellColor; - //border.color: ((dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index))?selectedBorderColor:borderColor; - //border.width: ?1:0; - anchors.horizontalCenter: parent.horizontalCenter - - Rectangle - { - id: mouseOverBorder - - property bool commonBorder : false - - property int lBorderwidth : 2 - property int rBorderwidth : 2 - property int tBorderwidth : 2 - property int bBorderwidth : 2 - - property int commonBorderWidth : 1 - - z : -1 - - color: "#00000000" - - anchors - { - left: parent.left - right: parent.right - top: parent.top - bottom: parent.bottom - - topMargin : commonBorder ? -commonBorderWidth : -tBorderwidth - bottomMargin : commonBorder ? -commonBorderWidth : -bBorderwidth - leftMargin : commonBorder ? -commonBorderWidth : -lBorderwidth - rightMargin : commonBorder ? -commonBorderWidth : -rBorderwidth - } - - border.color: selectedBorderColor - border.width: 3 - - opacity: (dummyValue || !dummyValue) && comicsSelectionHelper.isSelectedIndex(index) ? 1 : 0 - - Behavior on opacity { - NumberAnimation { duration: 300 } - } - - radius : 2 - } - - - MouseArea { - id: mouseArea - drag.target: realCell - - drag.minimumX: 0 - drag.maximumX: 0 - drag.minimumY: 0 - drag.maximumY: 0 - - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - - hoverEnabled: true - - onDoubleClicked: { - comicsSelectionHelper.clear(); - - comicsSelectionHelper.selectIndex(index); - grid.currentIndex = index; - currentIndexHelper.selectedItem(index); - } - - function selectAll(from,to) - { - for(var i = from;i<=to;i++) - { - comicsSelectionHelper.selectIndex(i); - } - } - - onPressed: mouse => { - var ci = grid.currentIndex; //save current index - - /*if(mouse.button != Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) - { - if(!comicsSelectionHelper.isSelectedIndex(index)) - comicsSelectionHelper.clear(); - }*/ - - if(mouse.modifiers & Qt.ShiftModifier) - if(index < ci) - { - selectAll(index,ci); - grid.currentIndex = index; - } - else if (index > ci) - { - selectAll(ci,index); - grid.currentIndex = index; - } - - mouse.accepted = true; - - if(mouse.button === Qt.RightButton) // context menu is requested - { - if(!comicsSelectionHelper.isSelectedIndex(index)) //the context menu is requested outside the current selection, the selection will be - { - currentIndexHelper.setCurrentIndex(index) - grid.currentIndex = index; - } - - var coordinates = main.mapFromItem(realCell,mouseX,mouseY) - contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y)); - mouse.accepted = false; - - } else //left button - { - - if(mouse.modifiers & Qt.ControlModifier) - { - if(comicsSelectionHelper.isSelectedIndex(index)) - { - if(comicsSelectionHelper.numItemsSelected()>1) - { - comicsSelectionHelper.deselectIndex(index); - if(grid.currentIndex === index) - grid.currentIndex = comicsSelectionHelper.lastSelectedIndex(); - } - } - else - { - comicsSelectionHelper.selectIndex(index); - grid.currentIndex = index; - } - } - - if(mouse.button !== Qt.RightButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) //just left button click - { - if(comicsSelectionHelper.isSelectedIndex(index)) //the context menu is requested outside the current selection, the selection will be - { - - } - else - { - currentIndexHelper.setCurrentIndex(index) - } - - grid.currentIndex = index; - } - } - - } - - onReleased: mouse => { - if(mouse.button === Qt.LeftButton && !(mouse.modifiers & Qt.ControlModifier || mouse.modifiers & Qt.ShiftModifier)) - { - if(comicsSelectionHelper.isSelectedIndex(index)) - { - currentIndexHelper.setCurrentIndex(index) - grid.currentIndex = index; - } - } - } - } - } - - /**/ - - //cover - Image { - id: coverElement - width: coverWidth - height: coverHeight - anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - source: cover_path - fillMode: Image.PreserveAspectCrop - smooth: true - mipmap: true - asynchronous : true - cache: false //TODO clear cache only when it is needed - - } - - //is new - Rectangle { - width: 10 - height: 10 - radius: 5 - anchors { left: coverElement.left; top: coverElement.top; topMargin: 5; leftMargin: 5; } - color: "#FFFFCC00" - visible: (((new Date() / 1000) - added_date) < recent_range) && show_recent - } - - //border - Rectangle { - width: coverElement.width - height: coverElement.height - anchors {horizontalCenter: parent.horizontalCenter; top: realCell.top; topMargin: 0} - color: "transparent" - border { - color: "#20FFFFFF" - width: 1 - } - } - - //mark - Image { - id: mark - width: 23 - height: 23 - source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" - anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} - asynchronous : true - } - - //title - Text { - id : titleText - anchors { top: coverElement.bottom; left: realCell.left; leftMargin: 4; rightMargin: 4; topMargin: 4; } - width: itemWidth - 8 - maximumLineCount: 2 - wrapMode: Text.WordWrap - text: title - elide: Text.ElideRight - color: titleColor - clip: true - font.letterSpacing: fontSpacing - font.pointSize: fontSize - font.family: fontFamily - } - - //number - Text { - anchors {bottom: realCell.bottom; left: realCell.left; margins: 4} - text: number?"#"+number:"" - color: textColor - font.letterSpacing: fontSpacing - font.pointSize: fontSize - font.family: fontFamily - } - - //page icon - Image { - id: pageImage - anchors {bottom: realCell.bottom; right: realCell.right; bottomMargin: 5; rightMargin: 4; leftMargin: 4} - source: "page.png" - width: 8 - height: 10 - } - - //numPages - Text { - id: pages - anchors {bottom: realCell.bottom; right: pageImage.left; margins: 4} - text: has_been_opened?current_page+"/"+num_pages:num_pages - color: textColor - font.letterSpacing: fontSpacing - font.pointSize: fontSize - font.family: fontFamily - } - - //rating icon - Image { - id: ratingImage - anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12} - source: "star.png" - width: 13 - height: 11 - - MouseArea { - anchors.fill: parent - onPressed: { - console.log("rating"); - comicsSelectionHelper.clear(); - comicsSelectionHelper.selectIndex(index); - grid.currentIndex = index; - ratingLoader.active = true; - ratingLoader.item.popup(); - } - } - - Loader { - id: ratingLoader - active: false - sourceComponent: ratingConextMenuComponent - } - - Component { - id: ratingConextMenuComponent - Menu { - background: Rectangle { - implicitWidth: 42 - implicitHeight: 100 - } - - id: ratingConextMenu - - Action { text: "1"; enabled: true; onTriggered: comicRatingHelper.rate(index,1) } - Action { text: "2"; enabled: true; onTriggered: comicRatingHelper.rate(index,2) } - Action { text: "3"; enabled: true; onTriggered: comicRatingHelper.rate(index,3) } - Action { text: "4"; enabled: true; onTriggered: comicRatingHelper.rate(index,4) } - Action { text: "5"; enabled: true; onTriggered: comicRatingHelper.rate(index,5) } - - delegate: MenuItem { - implicitHeight: 30 - } - } - } - } - - //comic rating - Text { - id: comicRating - anchors {bottom: realCell.bottom; right: ratingImage.left; margins: 4} - text: rating>0?rating:"-" - color: textColor - } - } - } - - Rectangle { - id: scrollView - objectName: "topScrollView" - anchors.fill: parent - anchors.margins: 0 - children: grid - - color: "transparent" - - function scrollToOrigin() { - grid.contentY = grid.originY - grid.contentX = grid.originX - } - - property Component currentComicView: Component { - id: currentComicView - Rectangle { - id: currentComicViewTopView - color: "#00000000" - - height: showCurrentComic ? 270 : 20 - - Rectangle { - color: currentComicBackgroundColor - - id: currentComicVisualView - - width: main.width - height: 250 - - visible: showCurrentComic - - //cover - Image { - id: currentCoverElement - anchors.fill: parent - - anchors.leftMargin: 15 - anchors.topMargin: 15 - anchors.bottomMargin: 15 - anchors.rightMargin: 15 - horizontalAlignment: Image.AlignLeft - anchors {horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 0} - source: comicsList.getCoverUrlPathForComicHash(currentComicInfo.hash.toString()) - fillMode: Image.PreserveAspectFit - smooth: true - mipmap: true - asynchronous : true - cache: false //TODO clear cache only when it is needed - } - - DropShadow { - anchors.fill: currentCoverElement - horizontalOffset: 0 - verticalOffset: 0 - radius: 8.0 - transparentBorder: true - //samples: 17 - color: "#FF000000" - source: currentCoverElement - visible: showDropShadow; - } - - ColumnLayout - { - id: currentComicInfoView - - x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin - //y: currentCoverElement.anchors.topMargin - - anchors.top: currentCoverElement.top - anchors.right: parent.right - anchors.left: readButton.left - - spacing: 9 - - Text { - Layout.topMargin: 7 - Layout.fillWidth: true - Layout.rightMargin: 20 - - Layout.alignment: Qt.AlignTop | Qt.AlignLeft - - id: currentComicInfoTitleView - - color: infoTitleColor - font.family: "Arial" - font.bold: true - font.pixelSize: 21 - wrapMode: Text.WordWrap - - text: currentComic?.getTitleIncludingNumber() ?? "" - } - - Flow { - spacing: 0 - Layout.alignment: Qt.AlignTop | Qt.AlignLeft - Layout.fillWidth: true - Layout.fillHeight: false - - id: currentComicDetailsFlowView - property font infoFont: Qt.font({ - family: "Arial", - pixelSize: 14 - }); - property string infoFlowTextColor: infoTextColor - - Text { - id: currentComicInfoVolume - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.volume ? currentComicInfo.volume : "" - rightPadding: 20 - visible: currentComicInfo.volume ? true : false - } - - Text { - id: currentComicInfoNumbering - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.number + "/" + currentComicInfo.count - rightPadding: 20 - visible : currentComicInfo.number ? true : false - } - - Text { - id: currentComicInfoArc - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.getStoryArcInfoString() - rightPadding: 20 - visible : currentComicInfo.getStoryArcInfoString().length > 0 - } - - Text { - id: currentComicInfoAlternate - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.getAlternateSeriesString() - rightPadding: 20 - visible : currentComicInfo.getStoryArcInfoString().length > 0 - } - - Text { - id: currentComicInfoSeriesGroup - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.seriesGroup ? currentComicInfo.seriesGroup : "" - rightPadding: 20 - visible: currentComicInfo.seriesGroup ? true : false - } - - Text { - id: currentComicInfoGenre - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.genere ? currentComicInfo.genere : "" - rightPadding: 20 - visible: currentComicInfo.genere ? true : false - } - - Text { - id: currentComicInfoDate - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: currentComicInfo.date ? currentComicInfo.date : "" - rightPadding: 20 - visible: currentComicInfo.date ? true : false - } - - Text { - id: currentComicInfoPages - color: currentComicDetailsFlowView.infoFlowTextColor - font: currentComicDetailsFlowView.infoFont - text: (currentComicInfo.numPages ? currentComicInfo.numPages : "") + " pages" - rightPadding: 20 - visible: currentComicInfo.numPages ? true : false - } - - Text { - id: currentComicInfoShowInComicVine - font: currentComicDetailsFlowView.infoFont - color: "#ffcc00" - text: "Show in Comic Vine" - visible: currentComicInfo.comicVineID ? true : false - MouseArea { - anchors.fill: parent - onClicked: { - Qt.openUrlExternally("http://www.comicvine.com/comic/4000-%1/".arg(comicInfo.comicVineID)); - } - } - } - } - - ScrollView { - Layout.topMargin: 6 - Layout.rightMargin: 30 - Layout.bottomMargin: 5 - Layout.fillWidth: true - Layout.maximumHeight: (currentComicVisualView.height * 0.32) - Layout.maximumWidth: 960 - - ScrollBar.horizontal.policy: ScrollBar.AlwaysOff - - contentWidth: -1 - contentItem: currentComicInfoSinopsis - - id: synopsisScroller - - clip: true - - Text { - Layout.maximumWidth: 960 - - width: synopsisScroller.width - - id: currentComicInfoSinopsis - color: infoTitleColor - font.family: "Arial" - font.pixelSize: 14 - wrapMode: Text.WordWrap - - text: '' + currentComicInfo.synopsis ?? "" + '' - visible: currentComicInfo.synopsis ?? false - textFormat: Text.RichText - } - } - } - - Button { - containmentMask: null - text: "Read" - id: readButton - x: currentCoverElement.anchors.rightMargin + currentCoverElement.paintedWidth + currentCoverElement.anchors.rightMargin - anchors.bottom: currentCoverElement.bottom - anchors.bottomMargin: 15 - - onClicked: comicOpener.triggerOpenCurrentComic() - background: Rectangle { - implicitWidth: 100 - implicitHeight: 30 - border.width: readButton.activeFocus ? 2 : 1 - border.color: "#FFCC00" - radius: height / 2 - color: "#FFCC00" - } - - contentItem: Text { - renderType: Text.NativeRendering - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - font.family: "Arial" - font.pointSize: 12 - font.bold: true - color: "white" - text: readButton.text - } - } - - - DropShadow { - anchors.fill: readButton - transparentBorder: true - horizontalOffset: 0 - verticalOffset: 0 - radius: 8.0 - //samples: 17 - color: "#AA000000" - source: readButton - visible: showDropShadow && !readButton.pressed - } - } - } - } - - GridView { - id:grid - objectName: "grid" - anchors.fill: parent - cellHeight: cellCustomHeight - header: currentComicView - focus: true - model: comicsList - delegate: appDelegate - anchors.topMargin: 0 - anchors.bottomMargin: 10 - anchors.leftMargin: 0 - anchors.rightMargin: 0 - pixelAligned: true - highlightFollowsCurrentItem: true - - currentIndex: 0 - cacheBuffer: 0 - - interactive: true - - move: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - moveDisplaced: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - remove: Transition { - ParallelAnimation { - NumberAnimation { property: "opacity"; to: 0; duration: 250 } - - } - } - - removeDisplaced: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - - - displaced: Transition { - NumberAnimation { properties: "x,y"; duration: 250 } - } - - function numCellsPerRow() { - return Math.floor(width / cellCustomWidth); - } - - onWidthChanged: { - calculateCellWidths(cellCustomWidth); - } - - function calculateCellWidths(cWidth) { - var wholeCells = Math.floor(width / cWidth); - var rest = width - (cWidth * wholeCells) - - grid.cellWidth = cWidth + Math.floor(rest / wholeCells); - } - - WheelHandler { - onWheel: { - if (grid.contentHeight <= grid.height) { - return; - } - - var newValue = Math.min((grid.contentHeight - grid.height + grid.originY), (Math.max(grid.originY , grid.contentY - event.angleDelta.y))); - grid.contentY = newValue; - } - } - - ScrollBar.vertical: ScrollBar { - visible: grid.contentHeight > grid.height - - contentItem: Item { - implicitWidth: 12 - implicitHeight: 26 - Rectangle { - color: "#88424242" - anchors.fill: parent - anchors.topMargin: 6 - anchors.leftMargin: 3 - anchors.rightMargin: 2 - anchors.bottomMargin: 6 - border.color: "#AA313131" - border.width: 1 - radius: 3.5 - } - } - } - - Keys.onPressed: { - if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) { - event.accepted = true - return; - } - - var numCells = grid.numCellsPerRow(); - var ci = 0; - if (event.key === Qt.Key_Right) { - ci = Math.min(grid.currentIndex+1,grid.count - 1); - } - else if (event.key === Qt.Key_Left) { - ci = Math.max(0,grid.currentIndex-1); - } - else if (event.key === Qt.Key_Up) { - ci = Math.max(0,grid.currentIndex-numCells); - } - else if (event.key === Qt.Key_Down) { - ci = Math.min(grid.currentIndex+numCells,grid.count - 1); - } else { - return; - } - - event.accepted = true; - grid.currentIndex = -1 - comicsSelectionHelper.clear(); - currentIndexHelper.setCurrentIndex(ci); - grid.currentIndex = ci; - } - - DropArea { - anchors.fill: parent - - onEntered: drag => { - if(drag.hasUrls) - { - if(dropManager.canDropUrls(drag.urls, drag.action)) - { - drag.accepted = true; - }else - drag.accepted = false; - } - else if (dropManager.canDropFormats(drag.formats)) { - drag.accepted = true; - } else - drag.accepted = false; - } - - onDropped: drop => { - if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) - { - dropManager.droppedFiles(drop.urls, drop.action); - } - else{ - if (dropManager.canDropFormats(drop.formats)) - { - var destItem = grid.itemAt(drop.x,drop.y + grid.contentY); - var destLocalX = grid.mapToItem(destItem,drop.x,drop.y + grid.contentY).x - var realIndex = grid.indexAt(drop.x,drop.y + grid.contentY); - - if(realIndex === -1) - realIndex = grid.count - 1; - - var destIndex = destLocalX < (grid.cellWidth / 2) ? realIndex : realIndex + 1; - dropManager.droppedComicsForResortingAt("", destIndex); - } - } - } - } - } - } - } - - Rectangle { - id: info_container - objectName: "infoContainer" - SplitView.preferredWidth: 350 - SplitView.minimumWidth: 350 - SplitView.maximumWidth: 960 - height: parent.height - - color: infoBackgroundColor - - visible: showInfo - - Flickable{ - id: infoFlickable - anchors.fill: parent - anchors.margins: 0 - - contentWidth: infoView.width - contentHeight: infoView.height - - ComicInfoView { - id: infoView - width: info_container.width - } - - WheelHandler { - onWheel: { - if (infoFlickable.contentHeight <= infoFlickable.height) { - return; - } - - var newValue = Math.min((infoFlickable.contentHeight - infoFlickable.height), (Math.max(infoFlickable.originY , infoFlickable.contentY - event.angleDelta.y))); - infoFlickable.contentY = newValue; - } - } - - ScrollBar.vertical: ScrollBar { - visible: infoFlickable.contentHeight > infoFlickable.height - - contentItem: Item { - implicitWidth: 12 - implicitHeight: 26 - Rectangle { - color: "#424246" - anchors.fill: parent - anchors.topMargin: 6 - anchors.leftMargin: 5 - anchors.rightMargin: 4 - anchors.bottomMargin: 6 - radius: 2 - } - } - } - } - - } -} diff --git a/YACReaderLibrary/qml/InfoComicsView.qml b/YACReaderLibrary/qml/InfoComicsView.qml index 650a3bc1d..66d169ea8 100644 --- a/YACReaderLibrary/qml/InfoComicsView.qml +++ b/YACReaderLibrary/qml/InfoComicsView.qml @@ -1,13 +1,15 @@ -import QtQuick 2.15 +import QtQuick -import QtQuick.Controls 2.15 +import QtQuick.Controls import com.yacreader.ComicModel 1.0 +import QtQuick.Controls.Basic + Rectangle { id: main - color: infoBackgroundColor + color: "transparent" //width: parent.width //height: parent.height @@ -92,7 +94,7 @@ Rectangle { implicitWidth: 12 implicitHeight: 26 Rectangle { - color: "#424246" + color: infoScrollbarColor anchors.fill: parent anchors.topMargin: 6 anchors.leftMargin: 5 diff --git a/YACReaderLibrary/qml/InfoComicsView6.qml b/YACReaderLibrary/qml/InfoComicsView6.qml deleted file mode 100644 index e4adaf4bf..000000000 --- a/YACReaderLibrary/qml/InfoComicsView6.qml +++ /dev/null @@ -1,131 +0,0 @@ -import QtQuick - -import QtQuick.Controls - -import com.yacreader.ComicModel 1.0 - -import QtQuick.Controls.Basic - -Rectangle { - id: main - - color: infoBackgroundColor - - //width: parent.width - //height: parent.height - anchors.margins: 0 - - FlowView { - id: flow - objectName: "flow" - height: 256 //TODO dynamic size? - - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - - additionalBottomSpace: indicator.height - } - - Image { - id: top_shadow - source: topShadow - width: parent.width - fillMode: Image.TileHorizontally - } - - Rectangle { - id: indicator_container - width: parent.width - y: 250 - - Image { - id: indicator - source: infoIndicator - } - - Image { - id: bottom_shadow - x: indicator.width - width: parent.width - indicator.width - source: infoShadow - fillMode: Image.TileHorizontally - } - } - - Rectangle { - id: info_container - width: parent.width - y: flow.height + flow.additionalBottomSpace - 6 - height: parent.height - y - - clip: true - - color: infoBackgroundColor - - Flickable{ - id: infoFlickable - anchors.fill: parent - anchors.margins: 0 - - contentWidth: infoView.width - contentHeight: infoView.height - - ComicInfoView { - id: infoView - width: info_container.width - 14 - } - - WheelHandler { - onWheel: { - if (infoFlickable.contentHeight <= infoFlickable.height) { - return; - } - - var newValue = Math.min((infoFlickable.contentHeight - infoFlickable.height), (Math.max(infoFlickable.originY , infoFlickable.contentY - event.angleDelta.y))); - infoFlickable.contentY = newValue; - } - } - - ScrollBar.vertical: ScrollBar { - visible: infoFlickable.contentHeight > infoFlickable.height - - contentItem: Item { - implicitWidth: 12 - implicitHeight: 26 - Rectangle { - color: "#424246" - anchors.fill: parent - anchors.topMargin: 6 - anchors.leftMargin: 5 - anchors.rightMargin: 4 - anchors.bottomMargin: 6 - radius: 2 - } - } - } - } - } - - DropArea { - anchors.fill: parent - - onEntered: { - if(drag.hasUrls) - { - if(dropManager.canDropUrls(drag.urls, drag.action)) - { - drag.accepted = true; - }else - drag.accepted = false; - } - } - - onDropped: { - if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) - { - dropManager.droppedFiles(drop.urls, drop.action); - } - } - } -} diff --git a/YACReaderLibrary/qml/InfoFavorites.qml b/YACReaderLibrary/qml/InfoFavorites.qml index 57b43a9ae..ce88142c2 100644 --- a/YACReaderLibrary/qml/InfoFavorites.qml +++ b/YACReaderLibrary/qml/InfoFavorites.qml @@ -1,6 +1,6 @@ -import QtQuick 2.15 +import QtQuick -import QtGraphicalEffects 1.0 +import QtQuick.Controls.impl Item { width: 20 @@ -17,15 +17,10 @@ Item { } } - Image { + ColorImage { anchors.centerIn: parent id: favorites_button_compact - source: "info-favorites.png" - } - - ColorOverlay { - anchors.fill: favorites_button_compact - source: favorites_button_compact + source: "info-favorites.svg" color: active ? favCheckedColor : favUncheckedColor } } diff --git a/YACReaderLibrary/qml/InfoFavorites6.qml b/YACReaderLibrary/qml/InfoFavorites6.qml deleted file mode 100644 index be98fd1d4..000000000 --- a/YACReaderLibrary/qml/InfoFavorites6.qml +++ /dev/null @@ -1,32 +0,0 @@ -import QtQuick - -import Qt5Compat.GraphicalEffects - -Item { - width: 20 - height: 20 - - property bool active - - signal activeChangedByUser(bool active) - - MouseArea { - anchors.fill: favorites_button_compact - onClicked: { - activeChangedByUser(!active); - } - } - - Image { - anchors.centerIn: parent - id: favorites_button_compact - source: "info-favorites.png" - } - - ColorOverlay { - anchors.fill: favorites_button_compact - source: favorites_button_compact - color: active ? favCheckedColor : favUncheckedColor - } -} - diff --git a/YACReaderLibrary/qml/InfoRating.qml b/YACReaderLibrary/qml/InfoRating.qml index fd039701a..2a7b482ac 100644 --- a/YACReaderLibrary/qml/InfoRating.qml +++ b/YACReaderLibrary/qml/InfoRating.qml @@ -1,6 +1,6 @@ -import QtQuick 2.15 +import QtQuick -import QtGraphicalEffects 1.0 +import QtQuick.Controls.impl Row { spacing: 0 @@ -16,14 +16,9 @@ Row { width: 25 height: 20 - Image { + ColorImage { id: star - source: "info-rating.png" - } - - ColorOverlay { - anchors.fill: star - source: star + source: "info-rating.svg" color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor } diff --git a/YACReaderLibrary/qml/InfoRating6.qml b/YACReaderLibrary/qml/InfoRating6.qml deleted file mode 100644 index ca3eda60c..000000000 --- a/YACReaderLibrary/qml/InfoRating6.qml +++ /dev/null @@ -1,48 +0,0 @@ -import QtQuick - -import Qt5Compat.GraphicalEffects - -Row { - spacing: 0 - property int rating : 0 - property int mouseIndex : 0 - - signal ratingChangedByUser(int rating) - - Repeater { - id: rating_compact - model: 5 - Item { - width: 25 - height: 20 - - Image { - id: star - source: "info-rating.png" - } - - ColorOverlay { - anchors.fill: star - source: star - color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor - } - - MouseArea { - anchors.fill: parent - hoverEnabled: true - - onPositionChanged: { - mouseIndex = index + 1; - } - - onClicked: { - ratingChangedByUser(mouseIndex); - } - - onExited: { - mouseIndex = 0; - } - } - } - } -} diff --git a/YACReaderLibrary/qml/InfoTick.qml b/YACReaderLibrary/qml/InfoTick.qml index 7bfe4e83f..5b50a31fe 100644 --- a/YACReaderLibrary/qml/InfoTick.qml +++ b/YACReaderLibrary/qml/InfoTick.qml @@ -1,6 +1,6 @@ -import QtQuick 2.15 +import QtQuick -import QtGraphicalEffects 1.0 +import QtQuick.Controls.impl Item { @@ -15,14 +15,9 @@ Item { } } - Image { + ColorImage { id: read_compact - source: "info-tick.png" - } - - ColorOverlay { - anchors.fill: read_compact - source: read_compact + source: "info-tick.svg" color: read ? readTickCheckedColor : readTickUncheckedColor } } diff --git a/YACReaderLibrary/qml/InfoTick6.qml b/YACReaderLibrary/qml/InfoTick6.qml deleted file mode 100644 index e7f260676..000000000 --- a/YACReaderLibrary/qml/InfoTick6.qml +++ /dev/null @@ -1,28 +0,0 @@ -import QtQuick - -import Qt5Compat.GraphicalEffects - -Item { - - property bool read - - signal readChangedByUser(bool read) - - MouseArea { - anchors.fill: read_compact - onClicked: { - readChangedByUser(!read); - } - } - - Image { - id: read_compact - source: "info-tick.png" - } - - ColorOverlay { - anchors.fill: read_compact - source: read_compact - color: read ? readTickCheckedColor : readTickUncheckedColor - } -} diff --git a/YACReaderLibrary/qml/info-favorites.png b/YACReaderLibrary/qml/info-favorites.png deleted file mode 100644 index f8b613954..000000000 Binary files a/YACReaderLibrary/qml/info-favorites.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-favorites.svg b/YACReaderLibrary/qml/info-favorites.svg new file mode 100644 index 000000000..1fe077be8 --- /dev/null +++ b/YACReaderLibrary/qml/info-favorites.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/info-favorites@2x.png b/YACReaderLibrary/qml/info-favorites@2x.png deleted file mode 100644 index 19aedd321..000000000 Binary files a/YACReaderLibrary/qml/info-favorites@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-indicator-light.png b/YACReaderLibrary/qml/info-indicator-light.png deleted file mode 100644 index b08a8ead6..000000000 Binary files a/YACReaderLibrary/qml/info-indicator-light.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-indicator-light@2x.png b/YACReaderLibrary/qml/info-indicator-light@2x.png deleted file mode 100644 index 38abb8c85..000000000 Binary files a/YACReaderLibrary/qml/info-indicator-light@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-indicator.png b/YACReaderLibrary/qml/info-indicator.png deleted file mode 100644 index af4a616a7..000000000 Binary files a/YACReaderLibrary/qml/info-indicator.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-indicator.svg b/YACReaderLibrary/qml/info-indicator.svg new file mode 100644 index 000000000..84d28a33b --- /dev/null +++ b/YACReaderLibrary/qml/info-indicator.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/info-rating.png b/YACReaderLibrary/qml/info-rating.png deleted file mode 100644 index d65cf2ab0..000000000 Binary files a/YACReaderLibrary/qml/info-rating.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-rating.svg b/YACReaderLibrary/qml/info-rating.svg new file mode 100644 index 000000000..54f4199dd --- /dev/null +++ b/YACReaderLibrary/qml/info-rating.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/info-rating@2x.png b/YACReaderLibrary/qml/info-rating@2x.png deleted file mode 100644 index 01048c809..000000000 Binary files a/YACReaderLibrary/qml/info-rating@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-shadow-light.png b/YACReaderLibrary/qml/info-shadow-light.png deleted file mode 100644 index e52f2c7ad..000000000 Binary files a/YACReaderLibrary/qml/info-shadow-light.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-shadow-light@2x.png b/YACReaderLibrary/qml/info-shadow-light@2x.png deleted file mode 100644 index 3abb75afe..000000000 Binary files a/YACReaderLibrary/qml/info-shadow-light@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-shadow.png b/YACReaderLibrary/qml/info-shadow.png deleted file mode 100644 index 3508da2ee..000000000 Binary files a/YACReaderLibrary/qml/info-shadow.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-shadow.svg b/YACReaderLibrary/qml/info-shadow.svg new file mode 100644 index 000000000..679574287 --- /dev/null +++ b/YACReaderLibrary/qml/info-shadow.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/info-tag.png b/YACReaderLibrary/qml/info-tag.png deleted file mode 100644 index b7209c58f..000000000 Binary files a/YACReaderLibrary/qml/info-tag.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-tag.svg b/YACReaderLibrary/qml/info-tag.svg new file mode 100644 index 000000000..5d3b00bbe --- /dev/null +++ b/YACReaderLibrary/qml/info-tag.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/info-tag@2x.png b/YACReaderLibrary/qml/info-tag@2x.png deleted file mode 100644 index 04a995f87..000000000 Binary files a/YACReaderLibrary/qml/info-tag@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-tick.png b/YACReaderLibrary/qml/info-tick.png deleted file mode 100644 index aa6b80b96..000000000 Binary files a/YACReaderLibrary/qml/info-tick.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-tick.svg b/YACReaderLibrary/qml/info-tick.svg new file mode 100644 index 000000000..6ff50d94d --- /dev/null +++ b/YACReaderLibrary/qml/info-tick.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/info-tick@2x.png b/YACReaderLibrary/qml/info-tick@2x.png deleted file mode 100644 index 46455b1d2..000000000 Binary files a/YACReaderLibrary/qml/info-tick@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-top-shadow.png b/YACReaderLibrary/qml/info-top-shadow.png deleted file mode 100644 index 1fd602815..000000000 Binary files a/YACReaderLibrary/qml/info-top-shadow.png and /dev/null differ diff --git a/YACReaderLibrary/qml/info-top-shadow.svg b/YACReaderLibrary/qml/info-top-shadow.svg new file mode 100644 index 000000000..f8092b2a2 --- /dev/null +++ b/YACReaderLibrary/qml/info-top-shadow.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/page-macosx.png b/YACReaderLibrary/qml/page-macosx.png deleted file mode 100644 index c82165916..000000000 Binary files a/YACReaderLibrary/qml/page-macosx.png and /dev/null differ diff --git a/YACReaderLibrary/qml/page-macosx@2x.png b/YACReaderLibrary/qml/page-macosx@2x.png deleted file mode 100644 index a69a9428d..000000000 Binary files a/YACReaderLibrary/qml/page-macosx@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/page.png b/YACReaderLibrary/qml/page.png deleted file mode 100644 index 83e35370a..000000000 Binary files a/YACReaderLibrary/qml/page.png and /dev/null differ diff --git a/YACReaderLibrary/qml/page.svg b/YACReaderLibrary/qml/page.svg new file mode 100644 index 000000000..446162fb4 --- /dev/null +++ b/YACReaderLibrary/qml/page.svg @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/reading.png b/YACReaderLibrary/qml/reading.png deleted file mode 100644 index a26a81d63..000000000 Binary files a/YACReaderLibrary/qml/reading.png and /dev/null differ diff --git a/YACReaderLibrary/qml/reading.svg b/YACReaderLibrary/qml/reading.svg new file mode 100644 index 000000000..65b5b4060 --- /dev/null +++ b/YACReaderLibrary/qml/reading.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/star-macosx.png b/YACReaderLibrary/qml/star-macosx.png deleted file mode 100644 index 37577a74c..000000000 Binary files a/YACReaderLibrary/qml/star-macosx.png and /dev/null differ diff --git a/YACReaderLibrary/qml/star-macosx@2x.png b/YACReaderLibrary/qml/star-macosx@2x.png deleted file mode 100644 index 82e1ae7f0..000000000 Binary files a/YACReaderLibrary/qml/star-macosx@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/star.png b/YACReaderLibrary/qml/star.png deleted file mode 100644 index 61d8782c9..000000000 Binary files a/YACReaderLibrary/qml/star.png and /dev/null differ diff --git a/YACReaderLibrary/qml/star.svg b/YACReaderLibrary/qml/star.svg new file mode 100644 index 000000000..ca56cb9db --- /dev/null +++ b/YACReaderLibrary/qml/star.svg @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml/star_menu.png b/YACReaderLibrary/qml/star_menu.png deleted file mode 100644 index 4472e5a31..000000000 Binary files a/YACReaderLibrary/qml/star_menu.png and /dev/null differ diff --git a/YACReaderLibrary/qml/star_menu@2x.png b/YACReaderLibrary/qml/star_menu@2x.png deleted file mode 100644 index 9e1644855..000000000 Binary files a/YACReaderLibrary/qml/star_menu@2x.png and /dev/null differ diff --git a/YACReaderLibrary/qml/tick.png b/YACReaderLibrary/qml/tick.png deleted file mode 100644 index 78a20644c..000000000 Binary files a/YACReaderLibrary/qml/tick.png and /dev/null differ diff --git a/YACReaderLibrary/qml/tick.svg b/YACReaderLibrary/qml/tick.svg new file mode 100644 index 000000000..856b4f6af --- /dev/null +++ b/YACReaderLibrary/qml/tick.svg @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/YACReaderLibrary/qml6.qrc b/YACReaderLibrary/qml6.qrc deleted file mode 100644 index 6eb3226fc..000000000 --- a/YACReaderLibrary/qml6.qrc +++ /dev/null @@ -1,32 +0,0 @@ - - - qml/GridComicsView6.qml - qml/FolderContentView6.qml - qml/FlowView6.qml - qml/InfoTick6.qml - qml/InfoFavorites6.qml - qml/InfoRating6.qml - qml/InfoComicsView6.qml - qml/tick.png - qml/reading.png - qml/star_menu.png - qml/star_menu@2x.png - qml/info-indicator.png - qml/info-shadow.png - qml/info-indicator-light.png - qml/info-shadow-light.png - qml/info-indicator-light@2x.png - qml/info-shadow-light@2x.png - qml/info-top-shadow.png - qml/ComicInfoView.qml - qml/info-favorites.png - qml/info-favorites@2x.png - qml/info-rating.png - qml/info-rating@2x.png - qml/info-tag.png - qml/info-tag@2x.png - qml/info-tick.png - qml/info-tick@2x.png - qml/prerendered_cover_shadow.png - - diff --git a/YACReaderLibrary/qml_osx.qrc b/YACReaderLibrary/qml_osx.qrc deleted file mode 100644 index 1649991a5..000000000 --- a/YACReaderLibrary/qml_osx.qrc +++ /dev/null @@ -1,8 +0,0 @@ - - - qml/page-macosx.png - qml/page-macosx@2x.png - qml/star-macosx.png - qml/star-macosx@2x.png - - diff --git a/YACReaderLibrary/qml_win.qrc b/YACReaderLibrary/qml_win.qrc deleted file mode 100644 index 59e2872fa..000000000 --- a/YACReaderLibrary/qml_win.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - qml/page.png - qml/star.png - - diff --git a/YACReaderLibrary/recent_visibility_coordinator.h b/YACReaderLibrary/recent_visibility_coordinator.h index 22fb1db4a..b6e917ceb 100644 --- a/YACReaderLibrary/recent_visibility_coordinator.h +++ b/YACReaderLibrary/recent_visibility_coordinator.h @@ -2,11 +2,9 @@ #ifndef RECENT_VISIBILITY_COORDINATOR_H #define RECENT_VISIBILITY_COORDINATOR_H -#include - -#include "folder_model.h" #include "comic_model.h" #include "folder_content_view.h" +#include "folder_model.h" class RecentVisibilityCoordinator : public QObject { diff --git a/YACReaderLibrary/rename_library_dialog.cpp b/YACReaderLibrary/rename_library_dialog.cpp index b249a22c9..0439aeac5 100644 --- a/YACReaderLibrary/rename_library_dialog.cpp +++ b/YACReaderLibrary/rename_library_dialog.cpp @@ -1,8 +1,8 @@ #include "rename_library_dialog.h" +#include #include #include -#include RenameLibraryDialog::RenameLibraryDialog(QWidget *parent) : QDialog(parent) @@ -39,9 +39,7 @@ void RenameLibraryDialog::setupUI() mainLayout->addLayout(bottomLayout); auto imgMainLayout = new QHBoxLayout; - QLabel *imgLabel = new QLabel(this); - QPixmap p(":/images/edit.png"); - imgLabel->setPixmap(p); + imgLabel = new QLabel(this); imgMainLayout->addWidget(imgLabel); imgMainLayout->addLayout(mainLayout); @@ -49,6 +47,13 @@ void RenameLibraryDialog::setupUI() setModal(true); setWindowTitle(tr("Rename current library")); + + initTheme(this); +} + +void RenameLibraryDialog::applyTheme(const Theme &theme) +{ + imgLabel->setPixmap(theme.dialogIcons.editIcon); } void RenameLibraryDialog::rename() diff --git a/YACReaderLibrary/rename_library_dialog.h b/YACReaderLibrary/rename_library_dialog.h index 385614153..c8145c598 100644 --- a/YACReaderLibrary/rename_library_dialog.h +++ b/YACReaderLibrary/rename_library_dialog.h @@ -1,18 +1,24 @@ #ifndef __RENAME_LIBRARY_DIALOG_H #define __RENAME_LIBRARY_DIALOG_H +#include "themable.h" + #include #include #include #include -class RenameLibraryDialog : public QDialog +class RenameLibraryDialog : public QDialog, protected Themable { Q_OBJECT public: RenameLibraryDialog(QWidget *parent = nullptr); +protected: + void applyTheme(const Theme &theme) override; + private: + QLabel *imgLabel; QLabel *newNameLabel; QLineEdit *newNameEdit; QPushButton *accept; diff --git a/YACReaderLibrary/server/CMakeLists.txt b/YACReaderLibrary/server/CMakeLists.txt new file mode 100644 index 000000000..839072efe --- /dev/null +++ b/YACReaderLibrary/server/CMakeLists.txt @@ -0,0 +1,86 @@ +# YACReaderLibrary server (REST API + HTTP server) + +add_library(server STATIC + static.h + static.cpp + requestmapper.h + requestmapper.cpp + yacreader_http_server.h + yacreader_http_server.cpp + yacreader_http_session.h + yacreader_http_session.cpp + yacreader_http_session_store.h + yacreader_http_session_store.cpp + yacreader_server_data_helper.h + yacreader_server_data_helper.cpp + controllers/versioncontroller.h + controllers/versioncontroller.cpp + controllers/v2/comiccontroller_v2.h + controllers/v2/comiccontroller_v2.cpp + controllers/v2/errorcontroller_v2.h + controllers/v2/errorcontroller_v2.cpp + controllers/v2/folderinfocontroller_v2.h + controllers/v2/folderinfocontroller_v2.cpp + controllers/v2/librariescontroller_v2.h + controllers/v2/librariescontroller_v2.cpp + controllers/v2/pagecontroller_v2.h + controllers/v2/pagecontroller_v2.cpp + controllers/v2/covercontroller_v2.h + controllers/v2/covercontroller_v2.cpp + controllers/v2/updatecomiccontroller_v2.h + controllers/v2/updatecomiccontroller_v2.cpp + controllers/v2/comicdownloadinfocontroller_v2.h + controllers/v2/comicdownloadinfocontroller_v2.cpp + controllers/v2/synccontroller_v2.h + controllers/v2/synccontroller_v2.cpp + controllers/v2/foldercontentcontroller_v2.h + controllers/v2/foldercontentcontroller_v2.cpp + controllers/v2/tagscontroller_v2.h + controllers/v2/tagscontroller_v2.cpp + controllers/v2/tagcontentcontroller_v2.h + controllers/v2/tagcontentcontroller_v2.cpp + controllers/v2/favoritescontroller_v2.h + controllers/v2/favoritescontroller_v2.cpp + controllers/v2/readingcomicscontroller_v2.h + controllers/v2/readingcomicscontroller_v2.cpp + controllers/v2/readinglistscontroller_v2.h + controllers/v2/readinglistscontroller_v2.cpp + controllers/v2/readinglistcontentcontroller_v2.h + controllers/v2/readinglistcontentcontroller_v2.cpp + controllers/v2/comicfullinfocontroller_v2.h + controllers/v2/comicfullinfocontroller_v2.cpp + controllers/v2/readinglistinfocontroller_v2.h + controllers/v2/readinglistinfocontroller_v2.cpp + controllers/v2/taginfocontroller_v2.h + controllers/v2/taginfocontroller_v2.cpp + controllers/v2/comiccontrollerinreadinglist_v2.h + controllers/v2/comiccontrollerinreadinglist_v2.cpp + controllers/v2/foldermetadatacontroller_v2.h + controllers/v2/foldermetadatacontroller_v2.cpp + controllers/v2/searchcontroller_v2.h + controllers/v2/searchcontroller_v2.cpp + controllers/webui/statuspagecontroller.h + controllers/webui/statuspagecontroller.cpp +) +target_include_directories(server PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/controllers + ${CMAKE_CURRENT_SOURCE_DIR}/controllers/v2 +) +yacreader_apply_build_options(server) +target_compile_definitions(server PUBLIC SERVER_VERSION_NUMBER="2.1") +if(UNIX AND NOT APPLE) + target_compile_definitions(server PRIVATE + "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"") +endif() +target_link_libraries(server PUBLIC + Qt6::Core + Qt6::Network + Qt6::Sql + QtWebApp_httpserver + QtWebApp_templateengine + QsLog + common_all + comic_backend + db_helper +) diff --git a/YACReaderLibrary/server/controllers/v1/comiccontroller.cpp b/YACReaderLibrary/server/controllers/v1/comiccontroller.cpp deleted file mode 100644 index 896d5044b..000000000 --- a/YACReaderLibrary/server/controllers/v1/comiccontroller.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "comiccontroller.h" - -#include "db_helper.h" -#include "yacreader_libraries.h" -#include "yacreader_http_session.h" - -#include "template.h" -#include "../static.h" - -#include "comic_db.h" -#include "comic.h" - -#include "QsLog.h" - -#include - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; - -ComicController::ComicController() { } - -void ComicController::service(HttpRequest &request, HttpResponse &response) -{ - HttpSession session = Static::sessionStore->getSession(request, response, false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - QStringList pathElements = path.split('/'); - qulonglong libraryId = pathElements.at(2).toLongLong(); - QString libraryName = DBHelper::getLibraryName(libraryId); - qulonglong comicId = pathElements.at(4).toULongLong(); - - bool remoteComic = path.endsWith("remote"); - - // TODO - // if(pathElements.size() == 6) - //{ - // QString action = pathElements.at(5); - // if(!action.isEmpty() && (action == "close")) - // { - // session.dismissCurrentComic(); - // response.write("",true); - // return; - // } - // } - - YACReaderLibraries libraries = DBHelper::getLibraries(); - - ComicDB comic = DBHelper::getComicInfo(libraryId, comicId); - - if (!remoteComic) - ySession->setDownloadedComic(comic.info.hash); - - Comic *comicFile = FactoryComic::newComic(libraries.getPath(libraryId) + comic.path); - - if (comicFile != nullptr) { - QThread *thread = nullptr; - - thread = new QThread(); - - comicFile->moveToThread(thread); - - connect(comicFile, QOverload<>::of(&Comic::errorOpening), thread, &QThread::quit); - connect(comicFile, QOverload::of(&Comic::errorOpening), thread, &QThread::quit); - connect(comicFile, &Comic::imagesLoaded, thread, &QThread::quit); - connect(thread, &QThread::started, comicFile, &Comic::process); - connect(thread, &QThread::finished, thread, &QObject::deleteLater); - - comicFile->load(libraries.getPath(libraryId) + comic.path); - - if (thread != nullptr) - thread->start(); - - if (remoteComic) { - QLOG_TRACE() << "remote comic requested"; - ySession->setCurrentRemoteComic(comic.id, comicFile); - - } else { - QLOG_TRACE() << "comic requested"; - ySession->setCurrentComic(comic.id, comicFile); - } - - response.setHeader("Content-Type", "text/plain; charset=utf-8"); - // TODO this field is not used by the client! - response.write(QString("library:%1\r\n").arg(libraryName).toUtf8()); - response.write(QString("libraryId:%1\r\n").arg(libraryId).toUtf8()); - if (remoteComic) // send previous and next comics id - { - QList siblings = DBHelper::getFolderComicsFromLibrary(libraryId, comic.parentId, true); - bool found = false; - int i; - for (i = 0; i < siblings.length(); i++) { - if (siblings.at(i)->id == comic.id) { - found = true; - break; - } - } - if (found) { - if (i > 0) - response.write(QString("previousComic:%1\r\n").arg(siblings.at(i - 1)->id).toUtf8()); - if (i < siblings.length() - 1) - response.write(QString("nextComic:%1\r\n").arg(siblings.at(i + 1)->id).toUtf8()); - } else { - // ERROR - } - qDeleteAll(siblings); - } - response.write(comic.toTXT().toUtf8(), true); - } else { - // delete comicFile; - response.setStatus(404, "not found"); - response.write("404 not found", true); - } - // response.write(t.toLatin1(),true); -} diff --git a/YACReaderLibrary/server/controllers/v1/comiccontroller.h b/YACReaderLibrary/server/controllers/v1/comiccontroller.h deleted file mode 100644 index 1dbaffeba..000000000 --- a/YACReaderLibrary/server/controllers/v1/comiccontroller.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef COMICCONTROLLER_H -#define COMICCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -#include -class Comic; -class QString; - -class ComicController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(ComicController); - -public: - /** Constructor */ - ComicController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // COMICCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/comicdownloadinfocontroller.cpp b/YACReaderLibrary/server/controllers/v1/comicdownloadinfocontroller.cpp deleted file mode 100644 index c1f75d1af..000000000 --- a/YACReaderLibrary/server/controllers/v1/comicdownloadinfocontroller.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "comicdownloadinfocontroller.h" - -#include "db_helper.h" -#include "yacreader_libraries.h" - -#include "comic_db.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; - -ComicDownloadInfoController::ComicDownloadInfoController() { } - -void ComicDownloadInfoController::service(HttpRequest &request, HttpResponse &response) -{ - response.setHeader("Content-Type", "text/plain; charset=utf-8"); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - QStringList pathElements = path.split('/'); - - qulonglong libraryId = pathElements.at(2).toLongLong(); - qulonglong comicId = pathElements.at(4).toULongLong(); - - ComicDB comic = DBHelper::getComicInfo(libraryId, comicId); - - // TODO: check if the comic wasn't found; - response.write(QString("fileName:%1\r\n").arg(comic.getFileName()).toUtf8()); - response.write(QString("fileSize:%1\r\n").arg(comic.getFileSize()).toUtf8(), true); -} diff --git a/YACReaderLibrary/server/controllers/v1/comicdownloadinfocontroller.h b/YACReaderLibrary/server/controllers/v1/comicdownloadinfocontroller.h deleted file mode 100644 index 742c782cd..000000000 --- a/YACReaderLibrary/server/controllers/v1/comicdownloadinfocontroller.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef COMICDOWNLOADINFOCONTROLLER_H -#define COMICDOWNLOADINFOCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class ComicDownloadInfoController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(ComicDownloadInfoController); - -public: - /** Constructor **/ - ComicDownloadInfoController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // COMICDOWNLOADINFOCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/covercontroller.cpp b/YACReaderLibrary/server/controllers/v1/covercontroller.cpp deleted file mode 100644 index 4d3163b84..000000000 --- a/YACReaderLibrary/server/controllers/v1/covercontroller.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include - -#include "covercontroller.h" -#include "db_helper.h" //get libraries -#include "yacreader_libraries.h" -#include "yacreader_http_session.h" - -#include "template.h" -#include "../static.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; - -CoverController::CoverController() { } - -void CoverController::service(HttpRequest &request, HttpResponse &response) -{ - HttpSession session = Static::sessionStore->getSession(request, response, false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - - response.setHeader("Content-Type", "image/jpeg"); - response.setHeader("Connection", "close"); - // response.setHeader("Content-Type", "plain/text; charset=ISO-8859-1"); - - YACReaderLibraries libraries = DBHelper::getLibraries(); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - QStringList pathElements = path.split('/'); - QString libraryName = DBHelper::getLibraryName(pathElements.at(2).toInt()); - QString fileName = pathElements.at(4); - - bool folderCover = request.getParameter("folderCover").length() > 0; - - // response.writeText(path+"
"); - // response.writeText(libraryName+"
"); - // response.writeText(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName+"
"); - - // QFile file(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName); - // if (file.exists()) { - // if (file.open(QIODevice::ReadOnly)) - // { - // qDebug("StaticFileController: Open file %s",qPrintable(file.fileName())); - // // Return the file content, do not store in cache - // while (!file.atEnd() && !file.error()) { - // response.write(file.read(131072)); - // } - // } - - // file.close(); - //} - - QImage img(libraries.getPath(libraryName) + "/.yacreaderlibrary/covers/" + fileName); - if (!img.isNull()) { - - int width = 80, height = 120; - if (ySession->getDisplayType() == "@2x") { - width = 160; - height = 240; - } - - if (float(img.width()) / img.height() < 0.66666) - img = img.scaledToWidth(width, Qt::SmoothTransformation); - else - img = img.scaledToHeight(height, Qt::SmoothTransformation); - - QImage destImg(width, height, QImage::Format_RGB32); - destImg.fill(Qt::black); - QPainter p(&destImg); - - p.drawImage((width - img.width()) / 2, (height - img.height()) / 2, img); - - if (folderCover) { - if (ySession->getDisplayType() == "@2x") - p.drawImage(0, 0, QImage(":/images/f_overlayed_retina.png")); - else - p.drawImage(0, 0, QImage(":/images/f_overlayed.png")); - } - - QByteArray ba; - QBuffer buffer(&ba); - buffer.open(QIODevice::WriteOnly); - destImg.save(&buffer, "JPG"); - response.write(ba, true); - } - // DONE else, hay que devolver un 404 - else { - response.setStatus(404, "not found"); - response.write("404 not found", true); - } -} diff --git a/YACReaderLibrary/server/controllers/v1/covercontroller.h b/YACReaderLibrary/server/controllers/v1/covercontroller.h deleted file mode 100644 index bf0e9c335..000000000 --- a/YACReaderLibrary/server/controllers/v1/covercontroller.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef COVERCONTROLLER_H -#define COVERCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class CoverController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(CoverController); - -public: - /** Constructor */ - CoverController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // COVERCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/errorcontroller.cpp b/YACReaderLibrary/server/controllers/v1/errorcontroller.cpp deleted file mode 100644 index 887f263af..000000000 --- a/YACReaderLibrary/server/controllers/v1/errorcontroller.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "errorcontroller.h" - -#include "template.h" -#include "../static.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; - -ErrorController::ErrorController(int errorCode) - : error(errorCode) -{ -} - -void ErrorController::service(HttpRequest &request, HttpResponse &response) -{ - Q_UNUSED(request) - switch (error) { - case 300: - response.setStatus(300, "redirect"); - response.write(" ", true); - break; - case 404: - response.setStatus(404, "not found"); - response.write("404 not found", true); - break; - } -} diff --git a/YACReaderLibrary/server/controllers/v1/errorcontroller.h b/YACReaderLibrary/server/controllers/v1/errorcontroller.h deleted file mode 100644 index bcd745fda..000000000 --- a/YACReaderLibrary/server/controllers/v1/errorcontroller.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef ERRORCONTROLLER_H -#define ERRORCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class ErrorController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(ErrorController); - -public: - /** Constructor */ - ErrorController(int errorCode); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; - -private: - int error; -}; - -#endif // ERRORCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp b/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp deleted file mode 100644 index 4c791f3ae..000000000 --- a/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp +++ /dev/null @@ -1,308 +0,0 @@ -#include "foldercontroller.h" -#include "controllers/v1/errorcontroller.h" - -#include "yacreader_http_session.h" - -#include "db_helper.h" //get libraries -#include "comic_db.h" - -#include "folder.h" - -#include "template.h" -#include "../static.h" - -#include "qnaturalsorting.h" -#include "yacreader_global.h" - -#include "QsLog.h" - -#include - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; -using stefanfrings::Template; - -FolderController::FolderController() { } - -void FolderController::service(HttpRequest &request, HttpResponse &response) -{ - QSettings *settings = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); // TODO unificar la creación del fichero de config con el servidor - settings->beginGroup("libraryConfig"); - - HttpSession session = Static::sessionStore->getSession(request, response, false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - - response.setHeader("Content-Type", "text/html; charset=utf-8"); - response.setHeader("Connection", "close"); - - // QString y = session.get("xxx").toString(); - // response.writeText(QString("session xxx : %1
").arg(y)); - - Template t = Static::templateLoader->getTemplate("folder", request.getHeader("Accept-Language")); - t.enableWarnings(); - - // set device type for templates - t.setVariable("device", ySession->getDeviceType()); - t.setVariable("display", ySession->getDisplayType()); - t.setCondition("device.ipad", ySession->getDeviceType() == "ipad"); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - QStringList pathElements = path.split('/'); - int libraryId = pathElements.at(2).toInt(); - QString libraryName = DBHelper::getLibraryName(libraryId); - qulonglong folderId = pathElements.at(4).toULongLong(); - - folderId = qMax(1, folderId); - - QString folderName = DBHelper::getFolderName(libraryId, folderId); - if (folderName.isEmpty()) { - ErrorController(300).service(request, response); - return; - } - - if (folderId != 1) - t.setVariable("folder.name", folderName); - else - t.setVariable("folder.name", libraryName); - QList folderContent = DBHelper::getFolderSubfoldersFromLibrary(libraryId, folderId); - QList folderComics = DBHelper::getFolderComicsFromLibrary(libraryId, folderId); - - // response.writeText(libraryName); - - folderContent.append(folderComics); - - std::sort(folderContent.begin(), folderContent.end(), LibraryItemSorter()); - folderComics.clear(); - - // qulonglong backId = DBHelper::getParentFromComicFolderId(libraryName,folderId); - - int page = 0; - QByteArray p = request.getParameter("page"); - if (p.length() != 0) - page = p.toInt(); - - // /comicIdi/pagei/comicIdj/pagej/....../comicIdn/pagen - // QString currentPath = session.get("currentPath").toString(); - // QStringList pathSize = currentPath.split("/").last().toInt; - - bool fromUp = false; - - QMultiMap map = request.getParameterMap(); - if (map.contains("up")) - fromUp = true; - - // int upPage = 0; - - if (folderId == 1) { - ySession->clearNavigationPath(); - ySession->pushNavigationItem(QPair(folderId, page)); - t.setVariable(QString("upurl"), "/"); - } else { - if (fromUp) - ySession->popNavigationItem(); - else // drill down or direct access - { - QStack> path = ySession->getNavigationPath(); - bool found = false; - for (QStack>::const_iterator itr = path.begin(); itr != path.end(); itr++) - if (itr->first == folderId) { - found = true; - break; - } - - if (found) { - while (ySession->topNavigationItem().first != folderId) - ySession->popNavigationItem(); - - ySession->updateTopItem(QPair(folderId, page)); - } else - ySession->pushNavigationItem(QPair(folderId, page)); - } - - QStack> path = ySession->getNavigationPath(); - if (path.count() > 1) { - QPair parentItem = path.at(path.count() - 2); - qulonglong upParent = parentItem.first; - quint32 upPage = parentItem.second; - t.setVariable(QString("upurl"), "/library/" + QString::number(libraryId) + "/folder/" + QString("%1?page=%2&up=true").arg(upParent).arg(upPage)); - } else - t.setVariable(QString("upurl"), "/"); - } - - int elementsPerPage = 24; - - int numFolders = folderContent.length(); - // int numComics = folderComics.length(); - int totalLength = folderContent.length() + folderComics.length(); - - // int numFolderPages = numFolders / elementsPerPage + ((numFolders%elementsPerPage)>0?1:0); - int numPages = totalLength / elementsPerPage + ((totalLength % elementsPerPage) > 0 ? 1 : 0); - - // response.writeText(QString("Number of pages : %1
").arg(numPages)); - - if (page < 0) - page = 0; - else if (page >= numPages) - page = numPages - 1; - - int indexCurrentPage = page * elementsPerPage; - int numFoldersAtCurrentPage = qMax(0, qMin(numFolders - indexCurrentPage, elementsPerPage)); - - // PATH - QStack> foldersPath = ySession->getNavigationPath(); - t.setVariable(QString("library.name"), libraryName); - t.setVariable(QString("library.url"), QString("/library/%1/folder/1").arg(libraryId)); - t.loop("path", foldersPath.count() - 1); - for (int i = 1; i < foldersPath.count(); i++) { - t.setVariable(QString("path%1.url").arg(i - 1), QString("/library/%1/folder/%2").arg(libraryId).arg(foldersPath[i].first)); - t.setVariable(QString("path%1.name").arg(i - 1), DBHelper::getFolderName(libraryId, foldersPath[i].first)); - } - - if (folderContent.length() > 0) { - t.loop("element", numFoldersAtCurrentPage); - int i = 0; - while (i < numFoldersAtCurrentPage) { - LibraryItem *item = folderContent.at(i + (page * elementsPerPage)); - t.setVariable(QString("element%1.name").arg(i), folderContent.at(i + (page * elementsPerPage))->name); - if (item->isDir()) { - t.setVariable(QString("element%1.class").arg(i), "folder"); - - QList children = DBHelper::getFolderComicsFromLibrary(libraryId, item->id); - if (children.length() > 0) { - const ComicDB *comic = static_cast(children.at(0)); - t.setVariable(QString("element%1.image.url").arg(i), QString("/library/%1/cover/%2.jpg?folderCover=true").arg(libraryId).arg(comic->info.hash)); - } else - t.setVariable(QString("element%1.image.url").arg(i), "/images/f.png"); - - t.setVariable(QString("element%1.browse").arg(i), QString("BROWSE").arg(QString("/library/%1/folder/%2").arg(libraryId).arg(item->id))); - t.setVariable(QString("element%1.cover.browse").arg(i), QString("").arg(QString("/library/%1/folder/%2").arg(libraryId).arg(item->id))); - t.setVariable(QString("element%1.cover.browse.end").arg(i), ""); - // t.setVariable(QString("element%1.url").arg(i),"/library/"+libraryName+"/folder/"+QString("%1").arg(folderContent.at(i + (page*10))->id)); - // t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id)); - - t.setVariable(QString("element%1.download").arg(i), QString("IMPORT").arg("/library/" + QString::number(libraryId) + "/folder/" + QString("%1/info").arg(folderContent.at(i + (page * elementsPerPage))->id))); - t.setVariable(QString("element%1.read").arg(i), ""); - - t.setVariable(QString("element%1.size").arg(i), ""); - t.setVariable(QString("element%1.pages").arg(i), ""); - t.setVariable(QString("element%1.status").arg(i), ""); - } else { - t.setVariable(QString("element%1.class").arg(i), "cover"); - const ComicDB *comic = (ComicDB *)item; - t.setVariable(QString("element%1.browse").arg(i), ""); - // t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/comic/"+QString("%1").arg(comic->id)); - if (!ySession->isComicOnDevice(comic->info.hash) && !ySession->isComicDownloaded(comic->info.hash)) - t.setVariable(QString("element%1.download").arg(i), QString("IMPORT").arg("/library/" + QString::number(libraryId) + "/comic/" + QString("%1").arg(comic->id))); - else if (ySession->isComicOnDevice(comic->info.hash)) - t.setVariable(QString("element%1.download").arg(i), QString("
IMPORTED
")); - else - t.setVariable(QString("element%1.download").arg(i), QString("
IMPORTING
")); - - // t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png"); - - t.setVariable(QString("element%1.read").arg(i), QString("READ").arg("/library/" + QString::number(libraryId) + "/comic/" + QString("%1").arg(comic->id) + "/remote")); - - t.setVariable(QString("element%1.image.url").arg(i), QString("/library/%1/cover/%2.jpg").arg(libraryId).arg(comic->info.hash)); - - t.setVariable(QString("element%1.size").arg(i), "" + QString::number(comic->info.hash.right(comic->info.hash.length() - 40).toInt() / 1024.0 / 1024.0, 'f', 2) + "Mb"); - if (comic->info.hasBeenOpened) - t.setVariable(QString("element%1.pages").arg(i), QString("%1/%2 pages").arg(comic->info.currentPage).arg(comic->info.numPages.toInt())); - else - t.setVariable(QString("element%1.pages").arg(i), QString("%1 pages").arg(comic->info.numPages.toInt())); - - if (comic->info.read) - t.setVariable(QString("element%1.status").arg(i), QString("
")); - else if (comic->info.hasBeenOpened) - t.setVariable(QString("element%1.status").arg(i), QString("
")); - else - t.setVariable(QString("element%1.status").arg(i), ""); - - t.setVariable(QString("element%1.cover.browse").arg(i), ""); - t.setVariable(QString("element%1.cover.browse.end").arg(i), ""); - } - i++; - } - } else { - t.loop("element", 0); - } - - if (numPages > 1) { - t.setCondition("pageIndex", true); - - QMap indexCount; - - QString firstChar; - int xyz = 1; - for (QList::const_iterator itr = folderContent.constBegin(); itr != folderContent.constEnd(); itr++) { - firstChar = QString((*itr)->name[0]).toUpper(); - firstChar = firstChar.normalized(QString::NormalizationForm_D).at(0); // TODO _D or _KD?? - bool ok; - /*int dec = */ firstChar.toInt(&ok, 10); - if (ok) - firstChar = "#"; - // response.writeText(QString("%1 - %2
").arg((*itr)->name).arg(xyz)); - if (indexCount.contains(firstChar)) - indexCount.insert(firstChar, indexCount.value(firstChar) + 1); - else - indexCount.insert(firstChar, 1); - - xyz++; - } - - QList index = indexCount.keys(); - if (index.length() > 1) { - t.setCondition("alphaIndex", true); - - std::sort(index.begin(), index.end(), naturalSortLessThanCI); - t.loop("index", index.length()); - int i = 0; - int count = 0; - int indexPage = 0; - for (QList::const_iterator itr = index.constBegin(); itr != index.constEnd(); itr++) { - // response.writeText(QString("%1 - %2
").arg(*itr).arg(count)); - t.setVariable(QString("index%1.indexname").arg(i), *itr); - t.setVariable(QString("index%1.url").arg(i), QString("/library/%1/folder/%2?page=%3").arg(libraryId).arg(folderId).arg(indexPage)); - i++; - count += indexCount.value(*itr); - indexPage = count / elementsPerPage; - } - } else { - t.loop("index", 0); - t.setCondition("alphaIndex", false); - } - - t.loop("page", numPages); - int z = 0; - while (z < numPages) { - - t.setVariable(QString("page%1.url").arg(z), QString("/library/%1/folder/%2?page=%3").arg(libraryId).arg(folderId).arg(z)); - t.setVariable(QString("page%1.number").arg(z), QString("%1").arg(z + 1)); - if (page == z) - t.setVariable(QString("page%1.current").arg(z), "current"); - else - t.setVariable(QString("page%1.current").arg(z), ""); - z++; - } - - t.setVariable("page.first", QString("/library/%1/folder/%2?page=%3").arg(libraryId).arg(folderId).arg(0)); - t.setVariable("page.previous", QString("/library/%1/folder/%2?page=%3").arg(libraryId).arg(folderId).arg((page == 0) ? page : page - 1)); - t.setVariable("page.next", QString("/library/%1/folder/%2?page=%3").arg(libraryId).arg(folderId).arg((page == numPages - 1) ? page : page + 1)); - t.setVariable("page.last", QString("/library/%1/folder/%2?page=%3").arg(libraryId).arg(folderId).arg(numPages - 1)); - t.setCondition("index", true); - } else { - - t.loop("page", 0); - t.loop("index", 0); - t.setCondition("index", false); - t.setCondition("pageIndex", false); - t.setCondition("alphaIndex", false); - } - - t.setVariable("page", QString("%1").arg(page + 1)); - t.setVariable("pages", QString("%1").arg(numPages)); - - qDeleteAll(folderContent); - - response.write(t.toUtf8(), true); -} diff --git a/YACReaderLibrary/server/controllers/v1/foldercontroller.h b/YACReaderLibrary/server/controllers/v1/foldercontroller.h deleted file mode 100644 index f468366d5..000000000 --- a/YACReaderLibrary/server/controllers/v1/foldercontroller.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef FOLDERCONTROLLER_H -#define FOLDERCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class FolderController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(FolderController); - -public: - /** Constructor */ - FolderController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // FOLDERCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/folderinfocontroller.cpp b/YACReaderLibrary/server/controllers/v1/folderinfocontroller.cpp deleted file mode 100644 index 18189b8b3..000000000 --- a/YACReaderLibrary/server/controllers/v1/folderinfocontroller.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "folderinfocontroller.h" -#include "db_helper.h" //get libraries - -#include "folder.h" -#include "comic_db.h" - -#include "template.h" -#include "../static.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; - -FolderInfoController::FolderInfoController() { } - -void FolderInfoController::service(HttpRequest &request, HttpResponse &response) -{ - response.setHeader("Content-Type", "text/plain; charset=utf-8"); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - QStringList pathElements = path.split('/'); - int libraryId = pathElements.at(2).toInt(); - qulonglong parentId = pathElements.at(4).toULongLong(); - - serviceComics(libraryId, parentId, response); - - response.write("", true); -} - -void FolderInfoController::serviceComics(const int &library, const qulonglong &folderId, HttpResponse &response) -{ - QList folderContent = DBHelper::getFolderSubfoldersFromLibrary(library, folderId); - QList folderComics = DBHelper::getFolderComicsFromLibrary(library, folderId); - - ComicDB *currentComic; - for (QList::const_iterator itr = folderComics.constBegin(); itr != folderComics.constEnd(); itr++) { - currentComic = (ComicDB *)(*itr); - response.write(QString("/library/%1/comic/%2:%3:%4\r\n").arg(library).arg(currentComic->id).arg(currentComic->getFileName()).arg(currentComic->getFileSize()).toUtf8()); - delete currentComic; - } - - Folder *currentFolder; - for (QList::const_iterator itr = folderContent.constBegin(); itr != folderContent.constEnd(); itr++) { - currentFolder = (Folder *)(*itr); - serviceComics(library, currentFolder->id, response); - delete currentFolder; - } -} diff --git a/YACReaderLibrary/server/controllers/v1/folderinfocontroller.h b/YACReaderLibrary/server/controllers/v1/folderinfocontroller.h deleted file mode 100644 index f52cd50fa..000000000 --- a/YACReaderLibrary/server/controllers/v1/folderinfocontroller.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef FOLDERINFOCONTROLLER_H -#define FOLDERINFOCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class FolderInfoController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(FolderInfoController); - -public: - /** Constructor */ - FolderInfoController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; - -private: - void serviceComics(const int &library, const qulonglong &folderId, stefanfrings::HttpResponse &response); -}; - -#endif // FOLDERINFOCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/librariescontroller.cpp b/YACReaderLibrary/server/controllers/v1/librariescontroller.cpp deleted file mode 100644 index 32ad96e82..000000000 --- a/YACReaderLibrary/server/controllers/v1/librariescontroller.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "librariescontroller.h" -#include "db_helper.h" //get libraries -#include "yacreader_libraries.h" -#include "yacreader_http_session.h" - -#include "template.h" -#include "../static.h" - -#include "QsLog.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; -using stefanfrings::Template; - -LibrariesController::LibrariesController() { } - -void LibrariesController::service(HttpRequest &request, HttpResponse &response) -{ - HttpSession session = Static::sessionStore->getSession(request, response, false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - - response.setHeader("Content-Type", "text/html; charset=utf-8"); - response.setHeader("Connection", "close"); - - ySession->clearNavigationPath(); - - Template t = Static::templateLoader->getTemplate("libraries", request.getHeader("Accept-Language")); - t.enableWarnings(); - - // set device type and display - t.setVariable("device", ySession->getDeviceType()); - t.setVariable("display", ySession->getDisplayType()); - - YACReaderLibraries libraries = DBHelper::getLibraries(); - QList names = DBHelper::getLibrariesNames(); - - t.loop("library", names.length()); - - int currentId = 0; - int i = 0; - foreach (QString name, names) { - currentId = libraries.getId(name); - t.setVariable(QString("library%1.name").arg(i), QString::number(currentId)); - t.setVariable(QString("library%1.label").arg(i), name); - i++; - } - - response.setStatus(200, "OK"); - response.write(t.toUtf8(), true); -} diff --git a/YACReaderLibrary/server/controllers/v1/librariescontroller.h b/YACReaderLibrary/server/controllers/v1/librariescontroller.h deleted file mode 100644 index 26a60b05a..000000000 --- a/YACReaderLibrary/server/controllers/v1/librariescontroller.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef LIBRARIESCONTROLLER_H -#define LIBRARIESCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -/** - This controller displays a HTML form and dumps the submitted input. -*/ - -class LibrariesController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(LibrariesController); - -public: - /** Constructor */ - LibrariesController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // LIBRARIESCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/pagecontroller.cpp b/YACReaderLibrary/server/controllers/v1/pagecontroller.cpp deleted file mode 100644 index 58ea334c5..000000000 --- a/YACReaderLibrary/server/controllers/v1/pagecontroller.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "pagecontroller.h" - -#include "../static.h" - -#include "comic.h" -#include "comiccontroller.h" -#include "yacreader_http_session.h" - -#include -#include - -#include - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; - -PageController::PageController() { } - -void PageController::service(HttpRequest &request, HttpResponse &response) -{ - HttpSession session = Static::sessionStore->getSession(request, response, false); - YACReaderHttpSession *ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - bool remote = path.endsWith("remote"); - - // QByteArray path2=request.getPath(); - // qDebug("PageController: request to -> %s ",path2.data()); - - QStringList pathElements = path.split('/'); - qulonglong comicId = pathElements.at(4).toULongLong(); - unsigned int page = pathElements.at(6).toUInt(); - - // qDebug("lib name : %s",pathElements.at(2).data()); - - Comic *comicFile; - qulonglong currentComicId; - if (remote) { - QLOG_TRACE() << "se recupera comic remoto para servir páginas"; - comicFile = ySession->getCurrentRemoteComic(); - currentComicId = ySession->getCurrentRemoteComicId(); - } else { - QLOG_TRACE() << "se recupera comic para servir páginas"; - comicFile = ySession->getCurrentComic(); - currentComicId = ySession->getCurrentComicId(); - } - - if (currentComicId != 0 && !QPointer(comicFile).isNull()) { - if (comicId == currentComicId && page < comicFile->numPages()) { - if (comicFile->pageIsLoaded(page)) { - // qDebug("PageController: La página estaba cargada -> %s ",path.data()); - response.setHeader("Content-Type", "image/jpeg"); - response.setHeader("Transfer-Encoding", "chunked"); - QByteArray pageData = comicFile->getRawPage(page); - QDataStream data(pageData); - char buffer[4096]; - while (!data.atEnd()) { - int len = data.readRawData(buffer, 4096); - response.write(QByteArray(buffer, len)); - } - // response.write(pageData,true); - response.write(QByteArray(), true); - } else { - // qDebug("PageController: La página NO estaba cargada 404 -> %s ",path.data()); - response.setStatus(404, "not found"); // TODO qué mensaje enviar - response.write("404 not found", true); - } - } else { - if (comicId != currentComicId) { - // delete comicFile; - if (remote) - ySession->dismissCurrentRemoteComic(); - else - ySession->dismissCurrentComic(); - } - response.setStatus(404, "not found"); // TODO qué mensaje enviar - response.write("404 not found", true); - } - } else { - response.setStatus(404, "not found"); - response.write("404 not found", true); - } - - // response.write(t.toLatin1(),true); -} diff --git a/YACReaderLibrary/server/controllers/v1/pagecontroller.h b/YACReaderLibrary/server/controllers/v1/pagecontroller.h deleted file mode 100644 index fdd48541b..000000000 --- a/YACReaderLibrary/server/controllers/v1/pagecontroller.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef PAGECONTROLLER_H -#define PAGECONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class PageController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(PageController); - -public: - /** Constructor */ - PageController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // PAGECONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/sessioncontroller.cpp b/YACReaderLibrary/server/controllers/v1/sessioncontroller.cpp deleted file mode 100644 index 3381046f0..000000000 --- a/YACReaderLibrary/server/controllers/v1/sessioncontroller.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/** - @file - @author Stefan Frings -*/ - -#include "sessioncontroller.h" -#include "../static.h" -#include -#include - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; - -SessionController::SessionController() { } - -void SessionController::service(HttpRequest &request, HttpResponse &response) -{ - - response.setHeader("Content-Type", "text/html; charset=ISO-8859-1"); - - // Get current session, or create a new one - HttpSession session = Static::sessionStore->getSession(request, response); - if (!session.contains("startTime")) { - response.write("New session started. Reload this page now."); - session.set("startTime", QDateTime::currentDateTime()); - } - - else { - QDateTime startTime = session.get("startTime").toDateTime(); - response.write("Your session started "); - response.write(startTime.toString().toLatin1()); - response.write(""); - } -} diff --git a/YACReaderLibrary/server/controllers/v1/sessionmanager.h b/YACReaderLibrary/server/controllers/v1/sessionmanager.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/YACReaderLibrary/server/controllers/v1/synccontroller.cpp b/YACReaderLibrary/server/controllers/v1/synccontroller.cpp deleted file mode 100644 index 3239b64e8..000000000 --- a/YACReaderLibrary/server/controllers/v1/synccontroller.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "synccontroller.h" - -#include "QsLog.h" -#include - -#include "comic_db.h" -#include "db_helper.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; - -SyncController::SyncController() -{ -} - -void SyncController::service(HttpRequest &request, HttpResponse &response) -{ - QString postData = QString::fromUtf8(request.getBody()); - - QLOG_TRACE() << "POST DATA: " << postData; - - if (postData.length() > 0) { - QList data = postData.split("\n"); - - qulonglong libraryId; - qulonglong comicId; - int currentPage; - int currentRating; - QString hash; - foreach (QString comicInfo, data) { - QList comicInfoProgress = comicInfo.split("\t"); - - if (comicInfoProgress.length() == 4 || comicInfoProgress.length() == 5) { - libraryId = comicInfoProgress.at(0).toULongLong(); - comicId = comicInfoProgress.at(1).toULongLong(); - hash = comicInfoProgress.at(2); - currentPage = comicInfoProgress.at(3).toInt(); - - ComicInfo info; - info.currentPage = currentPage; - info.hash = hash; // TODO remove the hash check and add UUIDs for libraries - info.id = comicId; - - // Client 2.1+ version - if (comicInfoProgress.length() > 4) { - currentRating = comicInfoProgress.at(4).toInt(); - info.rating = currentRating; - } - - DBHelper::updateFromRemoteClient(libraryId, info); - } - } - } else { - response.setStatus(412, "No comic info received"); - response.write("", true); - return; - } - - response.write("OK", true); -} diff --git a/YACReaderLibrary/server/controllers/v1/synccontroller.h b/YACReaderLibrary/server/controllers/v1/synccontroller.h deleted file mode 100644 index 1780429e8..000000000 --- a/YACReaderLibrary/server/controllers/v1/synccontroller.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef SYNCCONTROLLER_H -#define SYNCCONTROLLER_H - -#include - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class SyncController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(SyncController) -public: - /** Constructor */ - SyncController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // SYNCCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v1/updatecomiccontroller.cpp b/YACReaderLibrary/server/controllers/v1/updatecomiccontroller.cpp deleted file mode 100644 index ffc14e8f2..000000000 --- a/YACReaderLibrary/server/controllers/v1/updatecomiccontroller.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "updatecomiccontroller.h" - -#include "db_helper.h" -#include "yacreader_libraries.h" - -#include "template.h" -#include "../static.h" - -#include "comic_db.h" -#include "comic.h" - -#include "QsLog.h" - -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; - -UpdateComicController::UpdateComicController() { } - -void UpdateComicController::service(HttpRequest &request, HttpResponse &response) -{ - HttpSession session = Static::sessionStore->getSession(request, response, false); - - QString path = QUrl::fromPercentEncoding(request.getPath()).toUtf8(); - QStringList pathElements = path.split('/'); - qulonglong libraryId = pathElements.at(2).toULongLong(); - QString libraryName = DBHelper::getLibraryName(libraryId); - qulonglong comicId = pathElements.at(4).toULongLong(); - - QString postData = QString::fromUtf8(request.getBody()); - - QLOG_TRACE() << "POST DATA: " << postData; - - if (postData.length() > 0) { - QList data = postData.split("\n"); - int currentPage = data.at(0).split(":").at(1).toInt(); - ComicInfo info; - info.currentPage = currentPage; - info.id = comicId; - DBHelper::updateProgress(libraryId, info); - } else { - response.setStatus(412, "No comic info received"); - response.write("", true); - return; - } - - response.write("OK", true); -} diff --git a/YACReaderLibrary/server/controllers/v1/updatecomiccontroller.h b/YACReaderLibrary/server/controllers/v1/updatecomiccontroller.h deleted file mode 100644 index 2dcf4c598..000000000 --- a/YACReaderLibrary/server/controllers/v1/updatecomiccontroller.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef UPDATECOMICCONTROLLER_H -#define UPDATECOMICCONTROLLER_H - -#include "httprequest.h" -#include "httpresponse.h" -#include "httprequesthandler.h" - -class UpdateComicController : public stefanfrings::HttpRequestHandler -{ - Q_OBJECT - Q_DISABLE_COPY(UpdateComicController); - -public: - UpdateComicController(); - - /** Generates the response */ - void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; -}; - -#endif // UPDATECOMICCONTROLLER_H diff --git a/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp index c2d457be3..7c71efc0d 100644 --- a/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.cpp @@ -1,20 +1,13 @@ #include "comiccontroller_v2.h" -#include "db_helper.h" -#include "yacreader_libraries.h" -#include "yacreader_http_session.h" - -#include "template.h" #include "../static.h" - -#include "comic_db.h" +#include "QsLog.h" #include "comic.h" - +#include "comic_db.h" +#include "db_helper.h" #include "qnaturalsorting.h" - -#include "QsLog.h" - -#include +#include "yacreader_http_session.h" +#include "yacreader_libraries.h" using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.h b/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.h index f22aa6317..7197e6269 100644 --- a/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/comiccontroller_v2.h @@ -2,8 +2,8 @@ #define COMICCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ComicControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.cpp b/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.cpp index 96113d2e2..bd026624f 100644 --- a/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.cpp @@ -1,20 +1,12 @@ #include "comiccontrollerinreadinglist_v2.h" -#include "db_helper.h" -#include "yacreader_libraries.h" -#include "yacreader_http_session.h" - -#include "template.h" #include "../static.h" - -#include "comic_db.h" -#include "comic.h" - -#include "qnaturalsorting.h" - #include "QsLog.h" - -#include +#include "comic.h" +#include "comic_db.h" +#include "db_helper.h" +#include "yacreader_http_session.h" +#include "yacreader_libraries.h" using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.h b/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.h index 424fcbf74..3f697abfd 100644 --- a/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.h +++ b/YACReaderLibrary/server/controllers/v2/comiccontrollerinreadinglist_v2.h @@ -2,8 +2,8 @@ #define COMICCONTROLLERINREADINGLISTV2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ComicControllerInReadingListV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.cpp index c9a97a0bc..ef414872f 100644 --- a/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.cpp @@ -1,9 +1,9 @@ #include "comicdownloadinfocontroller_v2.h" +#include "comic_db.h" #include "db_helper.h" -#include "yacreader_libraries.h" -#include "comic_db.h" +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.h b/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.h index a40f214dc..4e32ff196 100644 --- a/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/comicdownloadinfocontroller_v2.h @@ -2,8 +2,8 @@ #define COMICDOWNLOADINFOCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ComicDownloadInfoControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp index 8f06c83b5..12dd01bca 100644 --- a/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.cpp @@ -1,14 +1,11 @@ #include "comicfullinfocontroller_v2.h" -#include - -#include "db_helper.h" #include "comic_db.h" - +#include "db_helper.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" -#include +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.h b/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.h index 031232ee9..e7bae830b 100644 --- a/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/comicfullinfocontroller_v2.h @@ -2,8 +2,8 @@ #define COMICFULLINFOCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ComicFullinfoController_v2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp index e0bb5a35e..aa3741497 100644 --- a/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/covercontroller_v2.cpp @@ -1,8 +1,10 @@ #include "covercontroller_v2.h" + #include "db_helper.h" //get libraries -#include -#include "yacreader_libraries.h" #include "yacreader_global.h" +#include "yacreader_libraries.h" + +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/covercontroller_v2.h b/YACReaderLibrary/server/controllers/v2/covercontroller_v2.h index 7dc7d726d..2b47b1086 100644 --- a/YACReaderLibrary/server/controllers/v2/covercontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/covercontroller_v2.h @@ -2,8 +2,8 @@ #define COVERCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class CoverControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.cpp index cedbbc30b..e0f6c618b 100644 --- a/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.cpp @@ -1,8 +1,5 @@ #include "errorcontroller_v2.h" -#include "template.h" -#include "../static.h" - using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.h b/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.h index 3b64416fb..eda826d18 100644 --- a/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/errorcontroller_v2.h @@ -2,8 +2,8 @@ #define ERRORCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ErrorControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp index a7bc39fb4..b7e35dc50 100644 --- a/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.cpp @@ -1,8 +1,7 @@ #include "favoritescontroller_v2.h" -#include "db_helper.h" #include "comic_db.h" - +#include "db_helper.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" diff --git a/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.h b/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.h index 5ab08463f..d0de2944e 100644 --- a/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/favoritescontroller_v2.h @@ -2,8 +2,8 @@ #define FAVORITESCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class FavoritesControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp index 6f99993ec..9a2f118ed 100644 --- a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp @@ -1,20 +1,16 @@ #include "foldercontentcontroller_v2.h" -#include - -#include "db_helper.h" +#include "QsLog.h" #include "comic_db.h" +#include "db_helper.h" #include "folder.h" - +#include "qnaturalsorting.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" -#include "qnaturalsorting.h" - -#include "QsLog.h" +#include #include -#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.h b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.h index b856fe7f2..d5eac13e2 100644 --- a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.h @@ -2,8 +2,8 @@ #define FOLDERCONTENTCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class FolderContentControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.cpp index c6988435e..ff17afca9 100644 --- a/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.cpp @@ -1,11 +1,10 @@ #include "folderinfocontroller_v2.h" -#include "db_helper.h" //get libraries -#include "folder.h" #include "comic_db.h" +#include "db_helper.h" //get libraries +#include "folder.h" -#include "template.h" -#include "../static.h" +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.h b/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.h index 321fc4243..ddac5fe07 100644 --- a/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/folderinfocontroller_v2.h @@ -2,8 +2,8 @@ #define FOLDERINFOCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class FolderInfoControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.cpp index 8910dcc7d..7d8d34b83 100644 --- a/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.cpp @@ -2,7 +2,6 @@ #include "db_helper.h" #include "folder.h" - #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" diff --git a/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.h b/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.h index 03980355c..0e2ba8926 100644 --- a/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/foldermetadatacontroller_v2.h @@ -2,8 +2,8 @@ #define FOLDERMETADATACONTROLLERV2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class FolderMetadataControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp index ea949499d..4039ef2c8 100644 --- a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.cpp @@ -1,4 +1,5 @@ #include "librariescontroller_v2.h" + #include "db_helper.h" //get libraries #include "yacreader_libraries.h" @@ -15,7 +16,7 @@ void LibrariesControllerV2::service(HttpRequest & /* request */, HttpResponse &r QJsonArray librariesJson; - foreach (YACReaderLibrary library, libraries) { + for (const auto &library : libraries) { QJsonObject libraryJson; libraryJson["name"] = library.getName(); diff --git a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.h b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.h index 521492c4e..a09c7d369 100644 --- a/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/librariescontroller_v2.h @@ -2,8 +2,8 @@ #define LIBRARIESCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" /** This controller displays a HTML form and dumps the submitted input. diff --git a/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp index d0a93d004..6755ccab4 100644 --- a/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.cpp @@ -1,14 +1,11 @@ #include "pagecontroller_v2.h" #include "../static.h" - #include "comic.h" -#include "comiccontroller.h" #include "yacreader_http_session.h" #include #include - #include using stefanfrings::HttpRequest; diff --git a/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.h b/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.h index 4bd71ce6e..60806e5f3 100644 --- a/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/pagecontroller_v2.h @@ -2,8 +2,8 @@ #define PAGECONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class PageControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp index a63b3d7cc..2b10a767c 100644 --- a/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.cpp @@ -1,8 +1,7 @@ #include "readingcomicscontroller_v2.h" -#include "db_helper.h" #include "comic_db.h" - +#include "db_helper.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" diff --git a/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.h b/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.h index 51c960613..5aa916c39 100644 --- a/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/readingcomicscontroller_v2.h @@ -2,8 +2,8 @@ #define READINGCOMICSCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ReadingComicsControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp index 0abb55fce..353324ac6 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.cpp @@ -1,8 +1,7 @@ #include "readinglistcontentcontroller_v2.h" -#include "db_helper.h" #include "comic_db.h" - +#include "db_helper.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" diff --git a/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.h b/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.h index bdf482e12..40e6f7dcf 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/readinglistcontentcontroller_v2.h @@ -2,8 +2,8 @@ #define READINGLISTCONTENTCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ReadingListContentControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.cpp index 6145cf63d..51a48b168 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.cpp @@ -1,12 +1,9 @@ #include "readinglistinfocontroller_v2.h" -#include "db_helper.h" - -#include "folder.h" #include "comic_db.h" +#include "db_helper.h" -#include "template.h" -#include "../static.h" +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.h b/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.h index 32f42b269..43de4e8f2 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/readinglistinfocontroller_v2.h @@ -2,8 +2,8 @@ #define READINGLISTINFOCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ReadingListInfoControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.h b/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.h index d319982dc..ea156c15f 100644 --- a/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/readinglistscontroller_v2.h @@ -2,8 +2,8 @@ #define READINGLISTSCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class ReadingListsControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.cpp index e4a0632a4..a84091327 100644 --- a/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.cpp @@ -3,8 +3,8 @@ #include "data_base_management.h" #include "db_helper.h" -#include "yacreader_libraries.h" #include "search_query.h" +#include "yacreader_libraries.h" #include #include diff --git a/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.h b/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.h index 52c1e778b..8837aa5df 100644 --- a/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/searchcontroller_v2.h @@ -3,8 +3,8 @@ #define SEARCHCONTROLLER_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" #include diff --git a/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp index a64a11823..23f6d92bb 100644 --- a/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/synccontroller_v2.cpp @@ -1,13 +1,13 @@ #include "synccontroller_v2.h" #include "QsLog.h" -#include - #include "comic_db.h" #include "db_helper.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" +#include + using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; @@ -24,7 +24,7 @@ void SyncControllerV2::service(HttpRequest &request, HttpResponse &response) QLOG_TRACE() << "POST DATA: " << postData; if (postData.length() > 0) { - QList data = postData.split("\n"); + const auto data = postData.split("\n"); qulonglong libraryId; qulonglong comicId; @@ -35,17 +35,17 @@ void SyncControllerV2::service(HttpRequest &request, HttpResponse &response) QMap> comics; QList comicsWithNoLibrary; - auto libraries = DBHelper::getLibraries(); + const auto libraries = DBHelper::getLibraries(); bool clientSendsHasBeenOpened = false; bool clientSendsImageFilters = false; - foreach (QString comicInfo, data) { + for (const auto &comicInfo : data) { if (comicInfo.isEmpty()) { continue; } - QList comicInfoProgress = comicInfo.split("\t"); + const auto comicInfoProgress = comicInfo.split("\t"); if (comicInfoProgress.isEmpty()) { continue; @@ -166,11 +166,13 @@ void SyncControllerV2::service(HttpRequest &request, HttpResponse &response) if (!comics.isEmpty()) { auto moreRecentComicsFound = DBHelper::updateFromRemoteClient(comics, clientSendsHasBeenOpened, clientSendsImageFilters); + const auto libraryIds = moreRecentComicsFound.keys(); - foreach (qulonglong libraryId, moreRecentComicsFound.keys()) { + for (const auto libraryId : libraryIds) { auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(libraryId); + const auto &libraryComics = moreRecentComicsFound[libraryId]; - foreach (ComicDB comic, moreRecentComicsFound[libraryId]) { + for (const auto &comic : libraryComics) { items.append(YACReaderServerDataHelper::fullComicToJSON(libraryId, libraryUuid, comic)); } } diff --git a/YACReaderLibrary/server/controllers/v2/synccontroller_v2.h b/YACReaderLibrary/server/controllers/v2/synccontroller_v2.h index ca7358c7e..715a01c7e 100644 --- a/YACReaderLibrary/server/controllers/v2/synccontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/synccontroller_v2.h @@ -1,11 +1,11 @@ #ifndef SYNCCONTROLLER_V2_H #define SYNCCONTROLLER_V2_H -#include - #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" + +#include class SyncControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp index 8aca99cf7..301f665ef 100644 --- a/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.cpp @@ -1,8 +1,7 @@ #include "tagcontentcontroller_v2.h" -#include "db_helper.h" #include "comic_db.h" - +#include "db_helper.h" #include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" diff --git a/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.h b/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.h index 9d140479d..956439949 100644 --- a/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/tagcontentcontroller_v2.h @@ -2,8 +2,8 @@ #define TAGCONTENTCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class TagContentControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.cpp index 29dad28cb..e7d3205ec 100644 --- a/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.cpp @@ -1,12 +1,9 @@ #include "taginfocontroller_v2.h" -#include "db_helper.h" - -#include "folder.h" #include "comic_db.h" +#include "db_helper.h" -#include "template.h" -#include "../static.h" +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.h b/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.h index 78232c921..7617b4d54 100644 --- a/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/taginfocontroller_v2.h @@ -2,8 +2,8 @@ #define TAGINFOCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class TagInfoControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp index 28337ec74..a60e42387 100644 --- a/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.cpp @@ -1,10 +1,8 @@ #include "tagscontroller_v2.h" #include "db_helper.h" -#include "yacreader_libraries.h" - #include "reading_list.h" - +#include "yacreader_libraries.h" #include "yacreader_server_data_helper.h" using stefanfrings::HttpRequest; diff --git a/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.h b/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.h index 4748f82df..4a8e1f4b6 100644 --- a/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/tagscontroller_v2.h @@ -2,8 +2,8 @@ #define TAGSCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class TagsControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp index 943248385..7e4979749 100644 --- a/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.cpp @@ -1,15 +1,10 @@ #include "updatecomiccontroller_v2.h" -#include "db_helper.h" -#include "yacreader_libraries.h" - -#include "template.h" -#include "../static.h" - +#include "QsLog.h" #include "comic_db.h" -#include "comic.h" +#include "db_helper.h" -#include "QsLog.h" +#include using stefanfrings::HttpRequest; using stefanfrings::HttpResponse; diff --git a/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.h b/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.h index 90a15b6fa..59912d379 100644 --- a/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.h +++ b/YACReaderLibrary/server/controllers/v2/updatecomiccontroller_v2.h @@ -2,8 +2,8 @@ #define UPDATECOMICCONTROLLER_V2_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class UpdateComicControllerV2 : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/controllers/versioncontroller.h b/YACReaderLibrary/server/controllers/versioncontroller.h index 9824ed34d..f38586a88 100644 --- a/YACReaderLibrary/server/controllers/versioncontroller.h +++ b/YACReaderLibrary/server/controllers/versioncontroller.h @@ -2,8 +2,8 @@ #define VERSIONCONTROLLER_H #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" #include diff --git a/YACReaderLibrary/server/controllers/webui/statuspagecontroller.cpp b/YACReaderLibrary/server/controllers/webui/statuspagecontroller.cpp index 8312bb88f..fadf99110 100644 --- a/YACReaderLibrary/server/controllers/webui/statuspagecontroller.cpp +++ b/YACReaderLibrary/server/controllers/webui/statuspagecontroller.cpp @@ -1,8 +1,8 @@ #include "statuspagecontroller.h" +#include "db_helper.h" #include "template.h" #include "yacreader_global.h" -#include "db_helper.h" #include "yacreader_libraries.h" #include diff --git a/YACReaderLibrary/server/controllers/webui/statuspagecontroller.h b/YACReaderLibrary/server/controllers/webui/statuspagecontroller.h index 22dae09fa..4eccd086c 100644 --- a/YACReaderLibrary/server/controllers/webui/statuspagecontroller.h +++ b/YACReaderLibrary/server/controllers/webui/statuspagecontroller.h @@ -2,8 +2,8 @@ #define STATUSPAGE_CONTROLLER #include "httprequest.h" -#include "httpresponse.h" #include "httprequesthandler.h" +#include "httpresponse.h" class StatusPageController : public stefanfrings::HttpRequestHandler { diff --git a/YACReaderLibrary/server/requestmapper.cpp b/YACReaderLibrary/server/requestmapper.cpp index 5f767bb00..10f3d2e33 100644 --- a/YACReaderLibrary/server/requestmapper.cpp +++ b/YACReaderLibrary/server/requestmapper.cpp @@ -1,133 +1,46 @@ #include "requestmapper.h" -#include "static.h" -#include "staticfilecontroller.h" - -#include "controllers/versioncontroller.h" - -#include "controllers/v1/librariescontroller.h" -#include "controllers/v1/foldercontroller.h" -#include "controllers/v1/covercontroller.h" -#include "controllers/v1/comiccontroller.h" -#include "controllers/v1/folderinfocontroller.h" -#include "controllers/v1/pagecontroller.h" -#include "controllers/v1/updatecomiccontroller.h" -#include "controllers/v1/errorcontroller.h" -#include "controllers/v1/comicdownloadinfocontroller.h" -#include "controllers/v1/synccontroller.h" -#include "controllers/v2/librariescontroller_v2.h" -#include "controllers/v2/covercontroller_v2.h" +#include "QsLog.h" #include "controllers/v2/comiccontroller_v2.h" -#include "controllers/v2/folderinfocontroller_v2.h" -#include "controllers/v2/pagecontroller_v2.h" -#include "controllers/v2/updatecomiccontroller_v2.h" +#include "controllers/v2/comiccontrollerinreadinglist_v2.h" #include "controllers/v2/comicdownloadinfocontroller_v2.h" -#include "controllers/v2/synccontroller_v2.h" -#include "controllers/v2/foldercontentcontroller_v2.h" -#include "controllers/v2/tagscontroller_v2.h" -#include "controllers/v2/tagcontentcontroller_v2.h" -#include "controllers/v2/taginfocontroller_v2.h" +#include "controllers/v2/comicfullinfocontroller_v2.h" +#include "controllers/v2/covercontroller_v2.h" #include "controllers/v2/favoritescontroller_v2.h" +#include "controllers/v2/foldercontentcontroller_v2.h" +#include "controllers/v2/folderinfocontroller_v2.h" +#include "controllers/v2/foldermetadatacontroller_v2.h" +#include "controllers/v2/librariescontroller_v2.h" +#include "controllers/v2/pagecontroller_v2.h" #include "controllers/v2/readingcomicscontroller_v2.h" -#include "controllers/v2/readinglistscontroller_v2.h" #include "controllers/v2/readinglistcontentcontroller_v2.h" #include "controllers/v2/readinglistinfocontroller_v2.h" -#include "controllers/v2/comicfullinfocontroller_v2.h" -#include "controllers/v2/comiccontrollerinreadinglist_v2.h" +#include "controllers/v2/readinglistscontroller_v2.h" #include "controllers/v2/searchcontroller_v2.h" -#include "controllers/v2/foldermetadatacontroller_v2.h" - +#include "controllers/v2/synccontroller_v2.h" +#include "controllers/v2/tagcontentcontroller_v2.h" +#include "controllers/v2/taginfocontroller_v2.h" +#include "controllers/v2/tagscontroller_v2.h" +#include "controllers/v2/updatecomiccontroller_v2.h" +#include "controllers/versioncontroller.h" #include "controllers/webui/statuspagecontroller.h" - #include "db_helper.h" -#include "yacreader_libraries.h" - +#include "static.h" +#include "staticfilecontroller.h" #include "yacreader_http_session.h" - -#include "QsLog.h" +#include "yacreader_libraries.h" #include using stefanfrings::HttpRequest; using stefanfrings::HttpRequestHandler; using stefanfrings::HttpResponse; -using stefanfrings::HttpSession; QMutex RequestMapper::mutex; RequestMapper::RequestMapper(QObject *parent) : HttpRequestHandler(parent) { } -void RequestMapper::loadSessionV1(HttpRequest &request, HttpResponse &response) -{ - QMutexLocker locker(&mutex); - - HttpSession session = Static::sessionStore->getSession(request, response); - if (session.contains("ySession")) // session is already alive check if it is needed to update comics - { - auto ySession = Static::yacreaderSessionStore->getYACReaderSessionHttpSession(session.getId()); - - QString postData = QString::fromUtf8(request.getBody()); - - if (postData.contains("currentPage")) - return; - - if (postData.length() > 0) { - - QList data = postData.split("\n"); - if (data.length() > 2) { - ySession->setDeviceType(data.at(0).split(":").at(1)); - ySession->setDisplayType(data.at(1).split(":").at(1)); - QList comics = data.at(2).split(":").at(1).split("\t"); - ySession->clearComics(); - foreach (QString hash, comics) { - ySession->setComicOnDevice(hash); - } - } else { - if (data.length() > 1) { - ySession->setDeviceType(data.at(0).split(":").at(1)); - ySession->setDisplayType(data.at(1).split(":").at(1)); - } - } - } - } else { - auto ySession = new YACReaderHttpSession(this); - - Static::yacreaderSessionStore->addYACReaderHttpSession(session.getId(), ySession); - - session.set("ySession", "ok"); - - QString postData = QString::fromUtf8(request.getBody()); - // response.writeText(postData); - - QList data = postData.split("\n"); - - if (data.length() > 2) { - auto deviceTypeData = data.at(0).split(":"); - if (deviceTypeData.length() == 2) { - ySession->setDeviceType(deviceTypeData.at(1)); - } - - auto displayTypeData = data.at(1).split(":"); - if (displayTypeData.length() == 2) { - ySession->setDisplayType(displayTypeData.at(1)); - } - - auto comicsData = data.at(2).split(":"); - if (comicsData.length() == 2) { - QList comics = comicsData.at(1).split("\t"); - foreach (QString hash, comics) { - ySession->setComicOnDevice(hash); - } - } - } else // values by default, only for debug purposes. - { - ySession->setDeviceType("ipad"); - ySession->setDisplayType("@2x"); - } - } -} - void RequestMapper::loadSessionV2(HttpRequest &request, HttpResponse & /* response */) { QMutexLocker locker(&mutex); @@ -160,7 +73,8 @@ void RequestMapper::service(HttpRequest &request, HttpResponse &response) } else if (path.startsWith("/webui")) { serviceWebUI(request, response); } else { - serviceV1(request, response); + response.setStatus(404, "not found"); + response.write("404 not found", true); } } @@ -169,71 +83,6 @@ void RequestMapper::serviceWebUI(HttpRequest &request, HttpResponse &response) StatusPageController().service(request, response); } -void RequestMapper::serviceV1(HttpRequest &request, HttpResponse &response) -{ - QByteArray path = request.getPath(); - - QRegExp folder("/library/.+/folder/[0-9]+/?"); // get comic content - QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?"); // get folder info - QRegExp comicDownloadInfo("/library/.+/comic/[0-9]+/?"); // get comic info (basic/download info) - QRegExp comicFullInfo("/library/.+/comic/[0-9]+/info/?"); // get comic info (full info) - QRegExp comicOpen("/library/.+/comic/[0-9]+/remote/?"); // the server will open for reading the comic - QRegExp comicUpdate("/library/.+/comic/[0-9]+/update/?"); // get comic info - QRegExp comicClose("/library/.+/comic/[0-9]+/close/?"); // the server will close the comic and free memory - QRegExp cover("/library/.+/cover/[0-9a-f]+.jpg"); // get comic cover (navigation) - QRegExp comicPage("/library/.+/comic/[0-9]+/page/[0-9]+/?"); // get comic page - QRegExp comicPageRemote("/library/.+/comic/[0-9]+/page/[0-9]+/remote?"); // get comic page (remote reading) - - QRegExp sync("/sync"); - - QRegExp library("/library/([0-9]+)/.+"); // permite verificar que la biblioteca solicitada existe - - path = QUrl::fromPercentEncoding(path).toUtf8(); - - if (!sync.exactMatch(path)) // no session is needed for syncback info, until security will be added - loadSessionV1(request, response); - - // primera petición, se ha hecho un post, se sirven las bibliotecas si la seguridad mediante login no está habilitada - if (path == "/") // Don't send data to the server using '/' !!!! - { - LibrariesController().service(request, response); - } else { - if (sync.exactMatch(path)) - SyncController().service(request, response); - else { - // se comprueba que la sesión sea la correcta con el fin de evitar accesos no autorizados - HttpSession session = Static::sessionStore->getSession(request, response, false); - if (!session.isNull() && session.contains("ySession")) { - if (library.indexIn(path) != -1 && DBHelper::getLibraries().contains(library.cap(1).toInt())) { - // listar el contenido del folder - if (folder.exactMatch(path)) { - FolderController().service(request, response); - } else if (folderInfo.exactMatch(path)) { - FolderInfoController().service(request, response); - } else if (cover.exactMatch(path)) { - CoverController().service(request, response); - } else if (comicDownloadInfo.exactMatch(path)) { - ComicDownloadInfoController().service(request, response); - } else if (comicFullInfo.exactMatch(path) || comicOpen.exactMatch(path)) // start download or start remote reading - { - ComicController().service(request, response); - } else if (comicPage.exactMatch(path) || comicPageRemote.exactMatch(path)) { - PageController().service(request, response); - } else if (comicUpdate.exactMatch(path)) { - UpdateComicController().service(request, response); - } - } else { - // response.writeText(library.cap(1)); - Static::staticFileController->service(request, response); - } - } else // acceso no autorizado, redirección - { - ErrorController(300).service(request, response); - } - } - } -} - void RequestMapper::serviceV2(HttpRequest &request, HttpResponse &response) { QByteArray path = request.getPath(); diff --git a/YACReaderLibrary/server/requestmapper.h b/YACReaderLibrary/server/requestmapper.h index 3f089ba1b..3598b1e96 100644 --- a/YACReaderLibrary/server/requestmapper.h +++ b/YACReaderLibrary/server/requestmapper.h @@ -2,6 +2,7 @@ #define REQUESTMAPPER_H #include "httprequesthandler.h" + #include class RequestMapper : public stefanfrings::HttpRequestHandler @@ -12,7 +13,6 @@ class RequestMapper : public stefanfrings::HttpRequestHandler RequestMapper(QObject *parent = nullptr); void service(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response) override; - void loadSessionV1(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response); void loadSessionV2(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response); signals: @@ -20,7 +20,6 @@ class RequestMapper : public stefanfrings::HttpRequestHandler void comicUpdated(qulonglong libraryId, qulonglong comicId); private: - void serviceV1(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response); void serviceV2(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response); void serviceWebUI(stefanfrings::HttpRequest &request, stefanfrings::HttpResponse &response); diff --git a/YACReaderLibrary/server/server.pri b/YACReaderLibrary/server/server.pri deleted file mode 100644 index 7452130a5..000000000 --- a/YACReaderLibrary/server/server.pri +++ /dev/null @@ -1,105 +0,0 @@ -INCLUDEPATH += $$PWD -INCLUDEPATH += $$PWD/controllers -INCLUDEPATH += $$PWD/controllers/v1 -INCLUDEPATH += $$PWD/controllers/v2 -DEPENDPATH += $$PWD -DEPENDPATH += $$PWD/controllers -DEPENDPATH += $$PWD/controllers/v1 -DEPENDPATH += $$PWD/controllers/v2 - - -HEADERS += \ - $$PWD/controllers/v2/foldermetadatacontroller_v2.h \ - $$PWD/controllers/v2/searchcontroller_v2.h \ - $$PWD/static.h \ - $$PWD/requestmapper.h \ - $$PWD/yacreader_http_server.h \ - $$PWD/yacreader_http_session.h \ - $$PWD/yacreader_http_session_store.h \ - $$PWD/yacreader_server_data_helper.h \ - $$PWD/controllers/versioncontroller.h \ - #v1 - $$PWD/controllers/v1/comiccontroller.h \ - $$PWD/controllers/v1/errorcontroller.h \ - $$PWD/controllers/v1/foldercontroller.h \ - $$PWD/controllers/v1/folderinfocontroller.h \ - $$PWD/controllers/v1/librariescontroller.h \ - $$PWD/controllers/v1/pagecontroller.h \ - $$PWD/controllers/v1/covercontroller.h \ - $$PWD/controllers/v1/updatecomiccontroller.h \ - $$PWD/controllers/v1/comicdownloadinfocontroller.h \ - $$PWD/controllers/v1/synccontroller.h \ - #v2 - $$PWD/controllers/v2/comiccontroller_v2.h \ - $$PWD/controllers/v2/errorcontroller_v2.h \ - $$PWD/controllers/v2/folderinfocontroller_v2.h \ - $$PWD/controllers/v2/librariescontroller_v2.h \ - $$PWD/controllers/v2/pagecontroller_v2.h \ - $$PWD/controllers/v2/covercontroller_v2.h \ - $$PWD/controllers/v2/updatecomiccontroller_v2.h \ - $$PWD/controllers/v2/comicdownloadinfocontroller_v2.h \ - $$PWD/controllers/v2/synccontroller_v2.h \ - $$PWD/controllers/v2/foldercontentcontroller_v2.h \ - $$PWD/controllers/v2/tagscontroller_v2.h \ - $$PWD/controllers/v2/tagcontentcontroller_v2.h \ - $$PWD/controllers/v2/favoritescontroller_v2.h \ - $$PWD/controllers/v2/readingcomicscontroller_v2.h \ - $$PWD/controllers/v2/readinglistscontroller_v2.h \ - $$PWD/controllers/v2/readinglistcontentcontroller_v2.h \ - $$PWD/controllers/v2/comicfullinfocontroller_v2.h \ - $$PWD/controllers/v2/readinglistinfocontroller_v2.h \ - $$PWD/controllers/v2/taginfocontroller_v2.h \ - $$PWD/controllers/v2/comiccontrollerinreadinglist_v2.h\ - #Browser - $$PWD/controllers/webui/statuspagecontroller.h - - -SOURCES += \ - $$PWD/controllers/v2/foldermetadatacontroller_v2.cpp \ - $$PWD/controllers/v2/searchcontroller_v2.cpp \ - $$PWD/static.cpp \ - $$PWD/requestmapper.cpp \ - $$PWD/yacreader_http_server.cpp \ - $$PWD/yacreader_http_session.cpp \ - $$PWD/yacreader_http_session_store.cpp \ - $$PWD/yacreader_server_data_helper.cpp \ - $$PWD/controllers/versioncontroller.cpp \ - #v1 - $$PWD/controllers/v1/comiccontroller.cpp \ - $$PWD/controllers/v1/errorcontroller.cpp \ - $$PWD/controllers/v1/foldercontroller.cpp \ - $$PWD/controllers/v1/folderinfocontroller.cpp \ - $$PWD/controllers/v1/librariescontroller.cpp \ - $$PWD/controllers/v1/pagecontroller.cpp \ - $$PWD/controllers/v1/covercontroller.cpp \ - $$PWD/controllers/v1/updatecomiccontroller.cpp \ - $$PWD/controllers/v1/comicdownloadinfocontroller.cpp \ - $$PWD/controllers/v1/synccontroller.cpp \ - #v2 - $$PWD/controllers/v2/comiccontroller_v2.cpp \ - $$PWD/controllers/v2/errorcontroller_v2.cpp \ - $$PWD/controllers/v2/folderinfocontroller_v2.cpp \ - $$PWD/controllers/v2/librariescontroller_v2.cpp \ - $$PWD/controllers/v2/pagecontroller_v2.cpp \ - $$PWD/controllers/v2/covercontroller_v2.cpp \ - $$PWD/controllers/v2/updatecomiccontroller_v2.cpp \ - $$PWD/controllers/v2/comicdownloadinfocontroller_v2.cpp \ - $$PWD/controllers/v2/synccontroller_v2.cpp \ - $$PWD/controllers/v2/foldercontentcontroller_v2.cpp \ - $$PWD/controllers/v2/tagscontroller_v2.cpp \ - $$PWD/controllers/v2/tagcontentcontroller_v2.cpp \ - $$PWD/controllers/v2/favoritescontroller_v2.cpp \ - $$PWD/controllers/v2/readingcomicscontroller_v2.cpp \ - $$PWD/controllers/v2/readinglistscontroller_v2.cpp \ - $$PWD/controllers/v2/readinglistcontentcontroller_v2.cpp \ - $$PWD/controllers/v2/comicfullinfocontroller_v2.cpp \ - $$PWD/controllers/v2/readinglistinfocontroller_v2.cpp \ - $$PWD/controllers/v2/taginfocontroller_v2.cpp \ - $$PWD/controllers/v2/comiccontrollerinreadinglist_v2.cpp \ - #WebUI - $$PWD/controllers/webui/statuspagecontroller.cpp - -include(../../third_party/QtWebApp/httpserver/httpserver.pri) -include(../../third_party/QtWebApp/templateengine/templateengine.pri) - -DEFINES += SERVER_VERSION_NUMBER=\\\"2.1\\\" diff --git a/YACReaderLibrary/server/static.cpp b/YACReaderLibrary/server/static.cpp index e13f828d8..9610df738 100644 --- a/YACReaderLibrary/server/static.cpp +++ b/YACReaderLibrary/server/static.cpp @@ -4,22 +4,16 @@ */ #include "static.h" + #include #include #include #include -using stefanfrings::HttpResponse; -using stefanfrings::HttpSessionStore; using stefanfrings::StaticFileController; -using stefanfrings::TemplateLoader; QString Static::configDir = nullptr; -TemplateLoader *Static::templateLoader = nullptr; - -HttpSessionStore *Static::sessionStore = nullptr; - StaticFileController *Static::staticFileController = 0; YACReaderHttpSessionStore *Static::yacreaderSessionStore = nullptr; @@ -51,7 +45,7 @@ QString Static::getConfigDir() searchList.append(QDir::rootPath() + "etc/opt"); searchList.append(QDir::rootPath() + "etc"); - foreach (QString dir, searchList) { + for (const auto &dir : searchList) { QFile file(dir + "/" + configFileName); if (file.exists()) { // found @@ -62,7 +56,7 @@ QString Static::getConfigDir() } // not found - foreach (QString dir, searchList) { + for (const auto &dir : searchList) { qWarning("%s/%s not found", qPrintable(dir), qPrintable(configFileName)); } qWarning("Cannot find config file %s", qPrintable(configFileName)); // TODO establecer los valores por defecto diff --git a/YACReaderLibrary/server/static.h b/YACReaderLibrary/server/static.h index 5c2296f58..48bf1d654 100644 --- a/YACReaderLibrary/server/static.h +++ b/YACReaderLibrary/server/static.h @@ -6,13 +6,11 @@ #ifndef STATIC_H #define STATIC_H -#include -#include "templatecache.h" -#include "httpsessionstore.h" #include "staticfilecontroller.h" - #include "yacreader_http_session_store.h" +#include + /** This class contains some static resources that are used by the application. */ @@ -46,12 +44,6 @@ class Static */ static QString getConfigDir(); - /** Cache for template files */ - static stefanfrings::TemplateLoader *templateLoader; - - /** Storage for session cookies */ - static stefanfrings::HttpSessionStore *sessionStore; - static YACReaderHttpSessionStore *yacreaderSessionStore; /** Controller for static files */ diff --git a/YACReaderLibrary/server/yacreader_http_server.cpp b/YACReaderLibrary/server/yacreader_http_server.cpp index b60280aa8..cf59e681e 100644 --- a/YACReaderLibrary/server/yacreader_http_server.cpp +++ b/YACReaderLibrary/server/yacreader_http_server.cpp @@ -3,17 +3,17 @@ @author Stefan Frings */ -#include "static.h" #include "yacreader_http_server.h" + +#include "static.h" // #include "dualfilelogger.h" #include "httplistener.h" #include "requestmapper.h" #include "staticfilecontroller.h" - #include "yacreader_global.h" -#include #include +#include /** Name of this application */ #define APPNAME "YACReaderLibrary" @@ -25,12 +25,7 @@ #define DESCRIPTION "Comic reader and organizer" using stefanfrings::HttpListener; -using stefanfrings::HttpRequest; -using stefanfrings::HttpResponse; - -using stefanfrings::HttpSessionStore; using stefanfrings::StaticFileController; -using stefanfrings::TemplateCache; void YACReaderHttpServer::start(quint16 port) { @@ -38,36 +33,7 @@ void YACReaderHttpServer::start(quint16 port) QCoreApplication *app = QCoreApplication::instance(); QString configFileName = YACReader::getSettingsPath() + "/" + QCoreApplication::applicationName() + ".ini"; - // Configure template loader and cache - auto templateSettings = new QSettings(configFileName, QSettings::IniFormat, app); - templateSettings->beginGroup("templates"); - - if (templateSettings->value("cacheSize").isNull()) - templateSettings->setValue("cacheSize", "160000"); - - QString baseTemplatePath = QString("./server/templates"); - QString templatePath; - -#if defined Q_OS_UNIX && !defined Q_OS_MACOS - templatePath = QFileInfo(QString(DATADIR) + "/yacreader", baseTemplatePath).absoluteFilePath(); -#else - templatePath = QFileInfo(QCoreApplication::applicationDirPath(), baseTemplatePath).absoluteFilePath(); -#endif - if (!templateSettings->contains("path")) - templateSettings->setValue("path", templatePath); - - Static::templateLoader = new TemplateCache(templateSettings, app); - - // Configure session store - auto sessionSettings = new QSettings(configFileName, QSettings::IniFormat, app); - sessionSettings->beginGroup("sessions"); - - if (sessionSettings->value("expirationTime").isNull()) - sessionSettings->setValue("expirationTime", 864000000); - - Static::sessionStore = new HttpSessionStore(sessionSettings, app); - - Static::yacreaderSessionStore = new YACReaderHttpSessionStore(Static::sessionStore, app); + Static::yacreaderSessionStore = new YACReaderHttpSessionStore(app); // Configure static file controller auto fileSettings = new QSettings(configFileName, QSettings::IniFormat, app); diff --git a/YACReaderLibrary/server/yacreader_http_session.h b/YACReaderLibrary/server/yacreader_http_session.h index 995753e30..e1691aee8 100644 --- a/YACReaderLibrary/server/yacreader_http_session.h +++ b/YACReaderLibrary/server/yacreader_http_session.h @@ -1,10 +1,10 @@ #ifndef YACREADERHTTPSESSION_H #define YACREADERHTTPSESSION_H -#include - #include "comic.h" +#include + class YACReaderHttpSession : public QObject { Q_OBJECT diff --git a/YACReaderLibrary/server/yacreader_http_session_store.cpp b/YACReaderLibrary/server/yacreader_http_session_store.cpp index ba92a7851..0fe827cc1 100644 --- a/YACReaderLibrary/server/yacreader_http_session_store.cpp +++ b/YACReaderLibrary/server/yacreader_http_session_store.cpp @@ -2,17 +2,11 @@ #include "yacreader_http_session.h" -#include "httpsessionstore.h" +#include -using stefanfrings::HttpSessionStore; - -YACReaderHttpSessionStore::YACReaderHttpSessionStore(HttpSessionStore *sessionStore, QObject *parent) - : QObject(parent), sessionStore(sessionStore) +YACReaderHttpSessionStore::YACReaderHttpSessionStore(QObject *parent) + : QObject(parent) { - // sessions are no longer http sessions in v2, we need another mechanism for cleaning - - // connect(&cleanupTimer,SIGNAL(timeout()),this,SLOT(sessionTimerEvent())); - // cleanupTimer.start(60000); } void YACReaderHttpSessionStore::addYACReaderHttpSession(const QByteArray &httpSessionId, YACReaderHttpSession *yacreaderHttpSession) @@ -28,20 +22,3 @@ YACReaderHttpSession *YACReaderHttpSessionStore::getYACReaderSessionHttpSession( return sessions.value(httpSessionId, nullptr); } - -void YACReaderHttpSessionStore::sessionTimerEvent() -{ - // sessions are no longer http sessions in v2, we are using a token, so sessionStore->getSession(id).isNull() is always true. - /*QMutexLocker locker(&mutex); - for(const QByteArray &id : sessions.keys()) - { - if(sessionStore->getSession(id).isNull()) - { - YACReaderHttpSession *session = sessions.value(id, nullptr); - if(session != nullptr) - delete session; - - sessions.remove(id); - } - }*/ -} diff --git a/YACReaderLibrary/server/yacreader_http_session_store.h b/YACReaderLibrary/server/yacreader_http_session_store.h index fe3e7e422..6771c999d 100644 --- a/YACReaderLibrary/server/yacreader_http_session_store.h +++ b/YACReaderLibrary/server/yacreader_http_session_store.h @@ -1,37 +1,24 @@ #ifndef YACREADERHTTPSESSIONSTORE_H #define YACREADERHTTPSESSIONSTORE_H +#include +#include #include -#include -namespace stefanfrings { -class HttpSessionStore; -} class YACReaderHttpSession; class YACReaderHttpSessionStore : public QObject { Q_OBJECT public: - explicit YACReaderHttpSessionStore(stefanfrings::HttpSessionStore *sessionStore, QObject *parent = nullptr); + explicit YACReaderHttpSessionStore(QObject *parent = nullptr); void addYACReaderHttpSession(const QByteArray &httpSessionId, YACReaderHttpSession *yacreaderHttpSession); YACReaderHttpSession *getYACReaderSessionHttpSession(const QByteArray &httpSessionId); -signals: - -public slots: - private: QMap sessions; - stefanfrings::HttpSessionStore *sessionStore; - QTimer cleanupTimer; - QMutex mutex; - -private slots: - - void sessionTimerEvent(); }; #endif // YACREADERHTTPSESSIONSTORE_H diff --git a/YACReaderLibrary/server/yacreader_server_data_helper.h b/YACReaderLibrary/server/yacreader_server_data_helper.h index d495898e9..f755bf0ae 100644 --- a/YACReaderLibrary/server/yacreader_server_data_helper.h +++ b/YACReaderLibrary/server/yacreader_server_data_helper.h @@ -1,11 +1,12 @@ #ifndef YACREADERSERVERDATAHELPER_H #define YACREADERSERVERDATAHELPER_H -#include -#include "folder.h" #include "comic_db.h" +#include "folder.h" #include "reading_list.h" +#include + class YACReaderServerDataHelper { public: diff --git a/YACReaderLibrary/server_config_dialog.cpp b/YACReaderLibrary/server_config_dialog.cpp index eacd28c1a..21a361469 100644 --- a/YACReaderLibrary/server_config_dialog.cpp +++ b/YACReaderLibrary/server_config_dialog.cpp @@ -1,52 +1,54 @@ -#include -#include -#include -#include -#include -#include - #include "server_config_dialog.h" -#include "yacreader_http_server.h" -#include "yacreader_global_gui.h" #include "ip_config_helper.h" #include "qrcodegen.hpp" +#include "yacreader_global_gui.h" +#include "yacreader_http_server.h" + +#include +#include +#include +#include +#include +#include extern YACReaderHttpServer *httpServer; ServerConfigDialog::ServerConfigDialog(QWidget *parent) : QDialog(parent) { + // Background decoration (SVG on left side) + backgroundDecoration = new QLabel(this); + backgroundDecoration->move(0, 0); + backgroundDecoration->setFixedSize(329, 595); + backgroundDecoration->setScaledContents(true); + accept = new QPushButton(tr("set port"), this); + qrCode = new QLabel(this); qrCode->move(64, 112); qrCode->setFixedSize(200, 200); qrCode->setScaledContents(true); - QLabel *title1 = new QLabel(tr("Server connectivity information"), this); - title1->move(332, 61); - title1->setStyleSheet("QLabel {color:#474747; font-size:30px; font-family: Arial;}"); + titleLabel = new QLabel(tr("Server connectivity information"), this); + titleLabel->move(332, 61); - QLabel *qrMessage = new QLabel(tr("Scan it!"), this); - qrMessage->move(135, 388); // 373,627); - qrMessage->setStyleSheet("QLabel {color:#A3A3A3; font-size:18px; font-family: Arial;}"); - qrMessage->setWordWrap(true); - qrMessage->setFixedWidth(200); + qrMessageLabel = new QLabel(tr("Scan it!"), this); + qrMessageLabel->move(135, 388); + qrMessageLabel->setWordWrap(true); + qrMessageLabel->setFixedWidth(200); - QLabel *propaganda = new QLabel(tr("YACReader is available for iOS and Android devices.
Discover it for iOS or Android."), this); - propaganda->move(332, 505); - propaganda->setStyleSheet("QLabel {color:#4D4D4D; font-size:13px; font-family: Arial; font-style: italic;}"); - propaganda->setOpenExternalLinks(true); + propagandaLabel = new QLabel(tr("YACReader is available for iOS and Android devices.
Discover it for iOS or Android."), this); + propagandaLabel->move(332, 505); + propagandaLabel->setOpenExternalLinks(true); // FORM--------------------------------------------------------------------- - QLabel *ipLabel = new QLabel(tr("Choose an IP address"), this); + ipLabel = new QLabel(tr("Choose an IP address"), this); ipLabel->move(332, 117); - ipLabel->setStyleSheet("QLabel {color:#575757; font-size:18px; font-family: Arial;}"); - QLabel *portLabel = new QLabel(tr("Port"), this); + portLabel = new QLabel(tr("Port"), this); portLabel->move(332, 211); - portLabel->setStyleSheet("QLabel {color:#575757; font-size:18px; font-family: Arial;}"); ip = new QComboBox(this); connect(ip, &QComboBox::currentTextChanged, this, &ServerConfigDialog::regenerateQR); @@ -78,15 +80,8 @@ ServerConfigDialog::ServerConfigDialog(QWidget *parent) check = new QCheckBox(this); check->move(332, 314); check->setText(tr("enable the server")); - check->setStyleSheet("QCheckBox {color:#262626; font-size:13px; font-family: Arial;}"); - - QPalette palette; - QImage image(":/images/serverConfigBackground.png"); - palette.setBrush(this->backgroundRole(), QBrush(image)); - setPalette(palette); - - this->setFixedSize(image.size()); + this->setFixedSize(770, 595); QSettings *settings = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); settings->beginGroup("libraryConfig"); @@ -105,6 +100,28 @@ ServerConfigDialog::ServerConfigDialog(QWidget *parent) settings->endGroup(); connect(check, &QCheckBox::stateChanged, this, &ServerConfigDialog::enableServer); + + // Initialize theme + initTheme(this); +} + +void ServerConfigDialog::applyTheme(const Theme &theme) +{ + // Apply pre-built QSS from theme + setStyleSheet(theme.serverConfigDialog.dialogQSS); + titleLabel->setStyleSheet(theme.serverConfigDialog.titleLabelQSS); + qrMessageLabel->setStyleSheet(theme.serverConfigDialog.qrMessageLabelQSS); + propagandaLabel->setStyleSheet(theme.serverConfigDialog.propagandaLabelQSS); + ipLabel->setStyleSheet(theme.serverConfigDialog.labelQSS); + portLabel->setStyleSheet(theme.serverConfigDialog.labelQSS); + check->setStyleSheet(theme.serverConfigDialog.checkBoxQSS); + + // Set background decoration (SVG on left) + backgroundDecoration->setPixmap(theme.serverConfigDialog.backgroundDecoration); + backgroundDecoration->lower(); // Send to back so other widgets appear on top + + // Regenerate QR code with new theme colors + generateQR(); } void ServerConfigDialog::showEvent(QShowEvent *event) @@ -156,16 +173,22 @@ void ServerConfigDialog::generateQR(const QString &serverAddress) { qrCode->clear(); + auto backgroundColor = theme.serverConfigDialog.qrBackgroundColor; + auto foregroundColor = theme.serverConfigDialog.qrForegroundColor; + qrcodegen::QrCode code = qrcodegen::QrCode::encodeText( serverAddress.toLocal8Bit(), qrcodegen::QrCode::Ecc::LOW); - QBitmap image(code.getSize(), code.getSize()); - image.fill(); - QPainter painter; - painter.begin(&image); - for (int x = 0; x < code.getSize(); x++) { - for (int y = 0; y < code.getSize(); y++) { + int qrSize = code.getSize(); + QPixmap qrPixmap(qrSize, qrSize); + qrPixmap.fill(backgroundColor); + + QPainter painter(&qrPixmap); + painter.setPen(foregroundColor); + painter.setBrush(foregroundColor); + for (int x = 0; x < qrSize; x++) { + for (int y = 0; y < qrSize; y++) { if (code.getModule(x, y)) { painter.drawPoint(x, y); } @@ -173,14 +196,11 @@ void ServerConfigDialog::generateQR(const QString &serverAddress) } painter.end(); - image = image.scaled(qrCode->size() * devicePixelRatioF()); - - QPixmap pMask(image.size()); - pMask.fill(QColor(66, 66, 66)); - pMask.setMask(image.createMaskFromColor(Qt::white)); - pMask.setDevicePixelRatio(devicePixelRatioF()); + // Scale to label size + qrPixmap = qrPixmap.scaled(qrCode->size() * devicePixelRatioF(), Qt::KeepAspectRatio, Qt::FastTransformation); + qrPixmap.setDevicePixelRatio(devicePixelRatioF()); - qrCode->setPixmap(pMask); + qrCode->setPixmap(qrPixmap); } void ServerConfigDialog::regenerateQR(const QString &ip) diff --git a/YACReaderLibrary/server_config_dialog.h b/YACReaderLibrary/server_config_dialog.h index 7d0e9cfab..67014af44 100644 --- a/YACReaderLibrary/server_config_dialog.h +++ b/YACReaderLibrary/server_config_dialog.h @@ -1,20 +1,25 @@ #ifndef __SERVER_CONFIG_DIALOG_H #define __SERVER_CONFIG_DIALOG_H +#include "themable.h" + +#include +#include #include #include #include #include -#include -#include -class ServerConfigDialog : public QDialog +class ServerConfigDialog : public QDialog, protected Themable { Q_OBJECT public: ServerConfigDialog(QWidget *parent = 0); void showEvent(QShowEvent *event) override; +protected: + void applyTheme(const Theme &theme) override; + private: QComboBox *ip; QLineEdit *port; @@ -25,6 +30,14 @@ class ServerConfigDialog : public QDialog QPushButton *accept; QLabel *qrCode; + // Labels for themable styling + QLabel *titleLabel; + QLabel *qrMessageLabel; + QLabel *propagandaLabel; + QLabel *ipLabel; + QLabel *portLabel; + QLabel *backgroundDecoration; + public slots: void generateQR(); void generateQR(const QString &serverAddress); diff --git a/YACReaderLibrary/themes/builtin_classic.json b/YACReaderLibrary/themes/builtin_classic.json new file mode 100644 index 000000000..52ac1a37a --- /dev/null +++ b/YACReaderLibrary/themes/builtin_classic.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#000000", + "readMainColor": "#DB4725", + "readTickColor": "#8A2C17", + "readingColor": "#E6B90F", + "textColor": "#4C4C4C" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#F2F2F2", + "backgroundColor": "#FAFAFA", + "headerBackgroundColor": "#F5F5F5", + "headerBorderColor": "#B8BDC4", + "headerGradientColor": "#D1D1D1", + "headerTextColor": "#313232", + "itemBorderBottomColor": "#DFDFDF", + "itemBorderBottomWidth": 1, + "itemBorderTopColor": "#FEFEFE", + "itemBorderTopWidth": 1, + "itemTextColor": "#252626", + "selectedColor": "#D4D4D4", + "selectedTextColor": "#252626", + "starRatingColor": "#E9BE0F", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#F0F0F0", + "checkedBackgroundColor": "#CCCCCC", + "iconColor": "#404040", + "separatorColor": "#CCCCCC" + }, + "contentSplitter": { + "handleColor": "#B8B8B8", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#F7F7F7" + }, + "emptyContainer": { + "backgroundColor": "#2A2A2A", + "iconColor": "#4C4C4C", + "titleTextColor": "#CCCCCC" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#2A2A2A", + "backgroundColor": "#2A2A2A", + "borderColor": "#121212", + "buttonColor": "#FFCC00", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FFFFFF", + "cellColor": "#212121", + "cellColorWithBackground": "#99212121", + "cellSelectedBorderColor": "#FFCC00", + "cellSelectedColor": "#121212", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#88000000", + "continueReadingTextColor": "#FFFFFF", + "currentComicBackgroundColor": "#88000000", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#E84852", + "favUncheckedColor": "#1C1C1C", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#2E2E2E", + "infoBorderColor": "#404040", + "infoMetadataTextColor": "#B0B0B0", + "infoScrollbarColor": "#FF424246", + "infoShadowColor": "#000000", + "infoTextColor": "#FFFFFF", + "itemDetailsColor": "#A8A8A8", + "itemTitleColor": "#FFFFFF", + "linkColor": "#FFCC00", + "newItemColor": "#FFFFCC00", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#20000000", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#88000000", + "ratingSelectedColor": "#FFFFFF", + "ratingUnselectedColor": "#1C1C1C", + "readTickCheckedColor": "#E84852", + "readTickUncheckedColor": "#1C1C1C", + "scrollbarBorderColor": "#AA313131", + "scrollbarColor": "#88424242", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#302F2D", + "linkColor": "#C19441" + }, + "importWidget": { + "backgroundColor": "#2A2A2A", + "coversDecorationBgColor": "#3A3A3A", + "coversDecorationShadowColor": "#1A1A1A", + "coversLabelColor": "#AAAAAA", + "coversViewBackgroundColor": "#3A3A3A", + "currentComicTextColor": "#AAAAAA", + "descriptionTextColor": "#AAAAAA", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#AAAAAA", + "iconColor": "#CCCCCC", + "modeIconColor": "#4A4A4A", + "titleTextColor": "#CCCCCC" + }, + "libraryItem": { + "libraryIconColor": "#DDDFDF", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#000000", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#2E2E2E", + "selectedTextColor": "#FFFFFF", + "textColor": "#DDDFDF" + }, + "mainToolbar": { + "backgroundColor": "#F0F0F0", + "dividerColor": "#B8BDC4", + "folderNameColor": "#404040", + "iconColor": "#404040", + "iconDisabledColor": "#B0B0B0" + }, + "menuIcons": { + "iconColor": "#F7F7F7" + }, + "meta": { + "displayName": "Default Classic", + "id": "builtin/classic", + "targetApp": "YACReaderLibrary", + "variant": "dark", + "version": "10.0.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#FFFFFF", + "buttonBackgroundColor": "#2E2E2E", + "buttonBorderColor": "#242424", + "buttonTextColor": "#FFFFFF", + "checkBoxTickColor": "#FFFFFF", + "contentAltBackgroundColor": "#2B2B2B", + "contentBackgroundColor": "#2B2B2B", + "contentTextColor": "#FFFFFF", + "dialogBackgroundColor": "#404040", + "downArrowColor": "#9F9F9F", + "hyperlinkColor": "#FFCC00", + "labelBackgroundColor": "#2B2B2B", + "labelTextColor": "#FFFFFF", + "navIconColor": "#FFFFFF", + "radioCheckedBackgroundColor": "#E5E5E5", + "radioCheckedIndicatorColor": "#5F5F5F", + "radioUncheckedColor": "#E5E5E5", + "rowIconColor": "#E5E5E5", + "tableAltBackgroundColor": "#2E2E2E", + "tableBackgroundColor": "#2B2B2B", + "tableBorderColor": "#242424", + "tableHeaderBackgroundColor": "#292929", + "tableHeaderBorderColor": "#1F1F1F", + "tableHeaderGradientColor": "#292929", + "tableHeaderTextColor": "#EBEBEB", + "tableScrollBackgroundColor": "#404040", + "tableScrollHandleColor": "#DDDDDD", + "tableSectionBorderDark": "#DFDFDF", + "tableSectionBorderLight": "#FEFEFE", + "tableSelectedColor": "#555555", + "toolButtonAccentColor": "#282828", + "upArrowColor": "#9F9F9F" + }, + "navigationTree": { + "branchIndicatorColor": "#E0E0E0", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#E0E0E0", + "folderIconSelectedColor": "#E0E0E0", + "folderIconSelectedShadowColor": "#000000", + "folderIconShadowColor": "#000000", + "folderNotCompletedColor": "#EDC518", + "folderReadOverlayColor": "#464646", + "folderReadOverlaySelectedColor": "#464646", + "newItemColor": "#EDC518", + "scrollBackgroundColor": "#404040", + "scrollHandleColor": "#DDDDDD", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#2E2E2E", + "textColor": "#DDDFDF" + }, + "noLibrariesWidget": { + "backgroundColor": "#2A2A2A", + "descriptionTextColor": "#AAAAAA", + "iconColor": "#4C4C4C", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#CCCCCC" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#FFCC00", + "currentlyReadingMainSelectedColor": "#FFCC00", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#E15055", + "favoritesMainSelectedColor": "#E15055", + "labelColors": { + "blue": "#82C7FF", + "cyan": "#A0FDDB", + "dark": "#B7B7B7", + "green": "#ADE738", + "light": "#CBCBCB", + "orange": "#F5C240", + "pink": "#FD9CDA", + "purple": "#D692FC", + "red": "#F67A7B", + "violet": "#8F95FF", + "white": "#FCFCFC", + "yellow": "#F2E446" + }, + "labelShadowColor": "#000000", + "labelShadowSelectedColor": "#000000", + "listDetailColor": "#464646", + "listDetailSelectedColor": "#464646", + "listMainColor": "#E7E7E7", + "listMainSelectedColor": "#E7E7E7", + "listShadowColor": "#000000", + "listShadowSelectedColor": "#000000", + "readingListMainColor": "#E7E7E7", + "readingListMainSelectedColor": "#E7E7E7", + "specialListShadowColor": "#000000", + "specialListShadowSelectedColor": "#000000" + }, + "searchLineEdit": { + "backgroundColor": "#404040", + "iconColor": "#F7F7F7", + "textColor": "#ABABAB" + }, + "serverConfigDialog": { + "backgroundColor": "#2A2A2A", + "checkBoxTextColor": "#262626", + "decorationColor": "#F7F7F7", + "labelTextColor": "#575757", + "propagandaTextColor": "#4D4D4D", + "qrBackgroundColor": "#2A2A2A", + "qrForegroundColor": "#FFFFFF", + "qrMessageTextColor": "#A3A3A3", + "titleTextColor": "#474747" + }, + "shortcutsIcons": { + "iconColor": "#F7F7F7" + }, + "sidebar": { + "backgroundColor": "#454545", + "busyIndicatorColor": "#FFFFFF", + "sectionSeparatorColor": "#575757", + "separatorColor": "#BDBFBF", + "titleDropShadowColor": "#000000", + "titleTextColor": "#BDBFBF", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#E0E0E0", + "shadowColor": "#000000", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#2A2A2A", + "closeButtonColor": "#DDDDDD", + "contentTextColor": "#E0E0E0", + "headerDecorationColor": "#E8B800", + "headerTextColor": "#E0E0E0", + "linkColor": "#E8B800", + "versionTextColor": "#858585" + } +} diff --git a/YACReaderLibrary/themes/builtin_dark.json b/YACReaderLibrary/themes/builtin_dark.json new file mode 100644 index 000000000..3964ec748 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_dark.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#111111", + "readMainColor": "#DB4725", + "readTickColor": "#8A2C17", + "readingColor": "#E6B90F", + "textColor": "#888888" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#2C2C2C", + "backgroundColor": "#232323", + "headerBackgroundColor": "#2A2A2A", + "headerBorderColor": "#1F1F1F", + "headerGradientColor": "#252525", + "headerTextColor": "#DDDDDD", + "itemBorderBottomColor": "#1F1F1F", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#353535", + "itemBorderTopWidth": 0, + "itemTextColor": "#DDDDDD", + "selectedColor": "#555555", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#E9BE0F", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#1F1F1F", + "checkedBackgroundColor": "#555555", + "iconColor": "#DDDDDD", + "separatorColor": "#444444" + }, + "contentSplitter": { + "handleColor": "#1F1F1F", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#F7F7F7" + }, + "emptyContainer": { + "backgroundColor": "#2A2A2A", + "iconColor": "#4C4C4C", + "titleTextColor": "#CCCCCC" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#2A2A2A", + "backgroundColor": "#2A2A2A", + "borderColor": "#121212", + "buttonColor": "#FFCC00", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FFFFFF", + "cellColor": "#212121", + "cellColorWithBackground": "#99212121", + "cellSelectedBorderColor": "#FFCC00", + "cellSelectedColor": "#121212", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#88000000", + "continueReadingTextColor": "#FFFFFF", + "currentComicBackgroundColor": "#55000000", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#E84852", + "favUncheckedColor": "#1C1C1C", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#2E2E2E", + "infoBorderColor": "#404040", + "infoMetadataTextColor": "#B0B0B0", + "infoScrollbarColor": "#FF424246", + "infoShadowColor": "#000000", + "infoTextColor": "#FFFFFF", + "itemDetailsColor": "#A8A8A8", + "itemTitleColor": "#FFFFFF", + "linkColor": "#FFCC00", + "newItemColor": "#FFFFCC00", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#20000000", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#88000000", + "ratingSelectedColor": "#FFFFFF", + "ratingUnselectedColor": "#1C1C1C", + "readTickCheckedColor": "#E84852", + "readTickUncheckedColor": "#1C1C1C", + "scrollbarBorderColor": "#AA313131", + "scrollbarColor": "#88424242", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#E0E0E0", + "linkColor": "#D4A84B" + }, + "importWidget": { + "backgroundColor": "#2A2A2A", + "coversDecorationBgColor": "#3A3A3A", + "coversDecorationShadowColor": "#1A1A1A", + "coversLabelColor": "#AAAAAA", + "coversViewBackgroundColor": "#3A3A3A", + "currentComicTextColor": "#AAAAAA", + "descriptionTextColor": "#AAAAAA", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#AAAAAA", + "iconColor": "#CCCCCC", + "modeIconColor": "#4A4A4A", + "titleTextColor": "#CCCCCC" + }, + "libraryItem": { + "libraryIconColor": "#DDDFDF", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#000000", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#2E2E2E", + "selectedTextColor": "#FFFFFF", + "textColor": "#DDDFDF" + }, + "mainToolbar": { + "backgroundColor": "#1F1F1F", + "dividerColor": "#555555", + "folderNameColor": "#DDDDDD", + "iconColor": "#DDDDDD", + "iconDisabledColor": "#666666" + }, + "menuIcons": { + "iconColor": "#F7F7F7" + }, + "meta": { + "displayName": "Default Dark", + "id": "builtin/dark", + "targetApp": "YACReaderLibrary", + "variant": "dark", + "version": "10.0.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#FFFFFF", + "buttonBackgroundColor": "#2E2E2E", + "buttonBorderColor": "#242424", + "buttonTextColor": "#FFFFFF", + "checkBoxTickColor": "#FFFFFF", + "contentAltBackgroundColor": "#2E2E2E", + "contentBackgroundColor": "#2B2B2B", + "contentTextColor": "#FFFFFF", + "dialogBackgroundColor": "#404040", + "downArrowColor": "#9F9F9F", + "hyperlinkColor": "#FFCC00", + "labelBackgroundColor": "#2B2B2B", + "labelTextColor": "#FFFFFF", + "navIconColor": "#FFFFFF", + "radioCheckedBackgroundColor": "#E5E5E5", + "radioCheckedIndicatorColor": "#5F5F5F", + "radioUncheckedColor": "#E5E5E5", + "rowIconColor": "#E5E5E5", + "tableAltBackgroundColor": "#2E2E2E", + "tableBackgroundColor": "#2B2B2B", + "tableBorderColor": "#242424", + "tableHeaderBackgroundColor": "#292929", + "tableHeaderBorderColor": "#1F1F1F", + "tableHeaderGradientColor": "#292929", + "tableHeaderTextColor": "#EBEBEB", + "tableScrollBackgroundColor": "#404040", + "tableScrollHandleColor": "#DDDDDD", + "tableSectionBorderDark": "#DFDFDF", + "tableSectionBorderLight": "#FEFEFE", + "tableSelectedColor": "#555555", + "toolButtonAccentColor": "#282828", + "upArrowColor": "#9F9F9F" + }, + "navigationTree": { + "branchIndicatorColor": "#E0E0E0", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#E0E0E0", + "folderIconSelectedColor": "#E0E0E0", + "folderIconSelectedShadowColor": "#000000", + "folderIconShadowColor": "#000000", + "folderNotCompletedColor": "#EDC518", + "folderReadOverlayColor": "#222222", + "folderReadOverlaySelectedColor": "#222222", + "newItemColor": "#EDC518", + "scrollBackgroundColor": "#404040", + "scrollHandleColor": "#DDDDDD", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#2E2E2E", + "textColor": "#DDDFDF" + }, + "noLibrariesWidget": { + "backgroundColor": "#2A2A2A", + "descriptionTextColor": "#AAAAAA", + "iconColor": "#4C4C4C", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#CCCCCC" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#FFCC00", + "currentlyReadingMainSelectedColor": "#FFCC00", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#E15055", + "favoritesMainSelectedColor": "#E15055", + "labelColors": { + "blue": "#82C7FF", + "cyan": "#A0FDDB", + "dark": "#7C7C7C", + "green": "#ADE738", + "light": "#AFAFAF", + "orange": "#F5C240", + "pink": "#FD9CDA", + "purple": "#D692FC", + "red": "#F67A7B", + "violet": "#8F95FF", + "white": "#FCFCFC", + "yellow": "#F2E446" + }, + "labelShadowColor": "#000000", + "labelShadowSelectedColor": "#000000", + "listDetailColor": "#464646", + "listDetailSelectedColor": "#464646", + "listMainColor": "#E7E7E7", + "listMainSelectedColor": "#E7E7E7", + "listShadowColor": "#000000", + "listShadowSelectedColor": "#000000", + "readingListMainColor": "#E7E7E7", + "readingListMainSelectedColor": "#E7E7E7", + "specialListShadowColor": "#000000", + "specialListShadowSelectedColor": "#000000" + }, + "searchLineEdit": { + "backgroundColor": "#404040", + "iconColor": "#F7F7F7", + "textColor": "#ABABAB" + }, + "serverConfigDialog": { + "backgroundColor": "#2A2A2A", + "checkBoxTextColor": "#DDDDDD", + "decorationColor": "#F7F7F7", + "labelTextColor": "#C0C0C0", + "propagandaTextColor": "#B0B0B0", + "qrBackgroundColor": "#2A2A2A", + "qrForegroundColor": "#FFFFFF", + "qrMessageTextColor": "#A3A3A3", + "titleTextColor": "#D0D0D0" + }, + "shortcutsIcons": { + "iconColor": "#F7F7F7" + }, + "sidebar": { + "backgroundColor": "#454545", + "busyIndicatorColor": "#FFFFFF", + "sectionSeparatorColor": "#575757", + "separatorColor": "#BDBFBF", + "titleDropShadowColor": "#000000", + "titleTextColor": "#BDBFBF", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#E0E0E0", + "shadowColor": "#000000", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#2A2A2A", + "closeButtonColor": "#DDDDDD", + "contentTextColor": "#E0E0E0", + "headerDecorationColor": "#E8B800", + "headerTextColor": "#E0E0E0", + "linkColor": "#E8B800", + "versionTextColor": "#858585" + } +} diff --git a/YACReaderLibrary/themes/builtin_dark1.json b/YACReaderLibrary/themes/builtin_dark1.json new file mode 100644 index 000000000..59127c345 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_dark1.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#221F22", + "readMainColor": "#FF6188", + "readTickColor": "#622534", + "readingColor": "#F3BF12", + "textColor": "#939293" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#2A272B", + "backgroundColor": "#221F22", + "headerBackgroundColor": "#2D2A2E", + "headerBorderColor": "#1C1A1D", + "headerGradientColor": "#353236", + "headerTextColor": "#FCFCFA", + "itemBorderBottomColor": "#1C1A1D", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#403E41", + "itemBorderTopWidth": 0, + "itemTextColor": "#F2F2F0", + "selectedColor": "#5B595C", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#FFD866", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#1C1A1D", + "checkedBackgroundColor": "#5B595C", + "iconColor": "#FCFCFA", + "separatorColor": "#403E41" + }, + "contentSplitter": { + "handleColor": "#1C1A1D", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#FCFCFA" + }, + "emptyContainer": { + "backgroundColor": "#2B282D", + "iconColor": "#5B595C", + "titleTextColor": "#FCFCFA" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#2B282D", + "backgroundColor": "#2B282D", + "borderColor": "#151316", + "buttonColor": "#78DCE8", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#1C1A1D", + "cellColor": "#221F22", + "cellColorWithBackground": "#99221F22", + "cellSelectedBorderColor": "#78DCE8", + "cellSelectedColor": "#151316", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#881D191D", + "continueReadingTextColor": "#FCFCFA", + "currentComicBackgroundColor": "#55221F22", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#FF6188", + "favUncheckedColor": "#1C1A1D", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#272428", + "infoBorderColor": "#403E41", + "infoMetadataTextColor": "#A6A5A6", + "infoScrollbarColor": "#FF5B595C", + "infoShadowColor": "#000000", + "infoTextColor": "#FCFCFA", + "itemDetailsColor": "#C1C0C0", + "itemTitleColor": "#FCFCFA", + "linkColor": "#78DCE8", + "newItemColor": "#FFFFD866", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#20221F22", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#88221F22", + "ratingSelectedColor": "#FFD866", + "ratingUnselectedColor": "#1C1A1D", + "readTickCheckedColor": "#A9DC76", + "readTickUncheckedColor": "#1C1A1D", + "scrollbarBorderColor": "#AA353236", + "scrollbarColor": "#885B595C", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#FCFCFA", + "linkColor": "#78DCE8" + }, + "importWidget": { + "backgroundColor": "#2B282D", + "coversDecorationBgColor": "#353236", + "coversDecorationShadowColor": "#1C1A1D", + "coversLabelColor": "#A6A5A6", + "coversViewBackgroundColor": "#353236", + "currentComicTextColor": "#A6A5A6", + "descriptionTextColor": "#A6A5A6", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#A9DC76", + "iconColor": "#FCFCFA", + "modeIconColor": "#5B595C", + "titleTextColor": "#FCFCFA" + }, + "libraryItem": { + "libraryIconColor": "#D7D6D7", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#000000", + "libraryOptionsIconColor": "#FCFCFA", + "selectedBackgroundColor": "#221F24", + "selectedTextColor": "#FFFFFF", + "textColor": "#D7D6D7" + }, + "mainToolbar": { + "backgroundColor": "#1C1A1D", + "dividerColor": "#5B595C", + "folderNameColor": "#FCFCFA", + "iconColor": "#FCFCFA", + "iconDisabledColor": "#6E6C70" + }, + "menuIcons": { + "iconColor": "#FCFCFA" + }, + "meta": { + "displayName": "Monodark", + "id": "builtin/dark1", + "targetApp": "YACReaderLibrary", + "variant": "dark", + "version": "10.0.2" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#FCFCFA", + "buttonBackgroundColor": "#353236", + "buttonBorderColor": "#221F22", + "buttonTextColor": "#FCFCFA", + "checkBoxTickColor": "#FCFCFA", + "contentAltBackgroundColor": "#353236", + "contentBackgroundColor": "#2B282D", + "contentTextColor": "#FCFCFA", + "dialogBackgroundColor": "#403E41", + "downArrowColor": "#A6A5A6", + "hyperlinkColor": "#78DCE8", + "labelBackgroundColor": "#2B282D", + "labelTextColor": "#FCFCFA", + "navIconColor": "#FCFCFA", + "radioCheckedBackgroundColor": "#D7D6D7", + "radioCheckedIndicatorColor": "#5B595C", + "radioUncheckedColor": "#D7D6D7", + "rowIconColor": "#D7D6D7", + "tableAltBackgroundColor": "#353236", + "tableBackgroundColor": "#2D2A2E", + "tableBorderColor": "#221F22", + "tableHeaderBackgroundColor": "#2A272B", + "tableHeaderBorderColor": "#1C1A1D", + "tableHeaderGradientColor": "#353236", + "tableHeaderTextColor": "#FCFCFA", + "tableScrollBackgroundColor": "#403E41", + "tableScrollHandleColor": "#D7D6D7", + "tableSectionBorderDark": "#D7D6D7", + "tableSectionBorderLight": "#FCFCFA", + "tableSelectedColor": "#5B595C", + "toolButtonAccentColor": "#221F22", + "upArrowColor": "#A6A5A6" + }, + "navigationTree": { + "branchIndicatorColor": "#D7D6D7", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#D7D6D7", + "folderIconSelectedColor": "#FCFCFA", + "folderIconSelectedShadowColor": "#000000", + "folderIconShadowColor": "#000000", + "folderNotCompletedColor": "#FFD866", + "folderReadOverlayColor": "#221F22", + "folderReadOverlaySelectedColor": "#221F22", + "newItemColor": "#FFD866", + "scrollBackgroundColor": "#403E41", + "scrollHandleColor": "#D7D6D7", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#221F24", + "textColor": "#D7D6D7" + }, + "noLibrariesWidget": { + "backgroundColor": "#2B282D", + "descriptionTextColor": "#A6A5A6", + "iconColor": "#5B595C", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#D7D6D7" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#78DCE8", + "currentlyReadingMainSelectedColor": "#78DCE8", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#FF6188", + "favoritesMainSelectedColor": "#FF6188", + "labelColors": { + "blue": "#6FB3FF", + "cyan": "#78DCE8", + "dark": "#939293", + "green": "#A9DC76", + "light": "#D7D6D7", + "orange": "#FC9867", + "pink": "#FF90C2", + "purple": "#D39DF2", + "red": "#FF6188", + "violet": "#8B7DFF", + "white": "#FCFCFA", + "yellow": "#FFD866" + }, + "labelShadowColor": "#000000", + "labelShadowSelectedColor": "#000000", + "listDetailColor": "#5B595C", + "listDetailSelectedColor": "#5B595C", + "listMainColor": "#E6E6E3", + "listMainSelectedColor": "#E6E6E3", + "listShadowColor": "#000000", + "listShadowSelectedColor": "#000000", + "readingListMainColor": "#E6E6E3", + "readingListMainSelectedColor": "#E6E6E3", + "specialListShadowColor": "#000000", + "specialListShadowSelectedColor": "#000000" + }, + "searchLineEdit": { + "backgroundColor": "#403E41", + "iconColor": "#FCFCFA", + "textColor": "#C1C0C0" + }, + "serverConfigDialog": { + "backgroundColor": "#2B282D", + "checkBoxTextColor": "#FCFCFA", + "decorationColor": "#FCFCFA", + "labelTextColor": "#D7D6D7", + "propagandaTextColor": "#A6A5A6", + "qrBackgroundColor": "#2D2A2E", + "qrForegroundColor": "#FFFFFF", + "qrMessageTextColor": "#A6A5A6", + "titleTextColor": "#FCFCFA" + }, + "shortcutsIcons": { + "iconColor": "#FCFCFA" + }, + "sidebar": { + "backgroundColor": "#2C292D", + "busyIndicatorColor": "#FFFFFF", + "sectionSeparatorColor": "#403E41", + "separatorColor": "#A6A5A6", + "titleDropShadowColor": "#000000", + "titleTextColor": "#D7D6D7", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#D7D6D7", + "shadowColor": "#000000", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#2B282D", + "closeButtonColor": "#FCFCFA", + "contentTextColor": "#E6E6E3", + "headerDecorationColor": "#78DCE8", + "headerTextColor": "#FCFCFA", + "linkColor": "#78DCE8", + "versionTextColor": "#939293" + } +} diff --git a/YACReaderLibrary/themes/builtin_dark2.json b/YACReaderLibrary/themes/builtin_dark2.json new file mode 100644 index 000000000..0585de39b --- /dev/null +++ b/YACReaderLibrary/themes/builtin_dark2.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#282A36", + "readMainColor": "#FF5555", + "readTickColor": "#712626", + "readingColor": "#50FA7B", + "textColor": "#6C789C" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#424450", + "backgroundColor": "#282A36", + "headerBackgroundColor": "#343746", + "headerBorderColor": "#21222C", + "headerGradientColor": "#424450", + "headerTextColor": "#F8F8F2", + "itemBorderBottomColor": "#21222C", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#424450", + "itemBorderTopWidth": 0, + "itemTextColor": "#F8F8F2", + "selectedColor": "#B1548A", + "selectedTextColor": "#F8F8F2", + "starRatingColor": "#F1FA8C", + "starRatingSelectedColor": "#F8F8F2" + }, + "comicsViewToolbar": { + "backgroundColor": "#21222C", + "checkedBackgroundColor": "#44475A", + "iconColor": "#F8F8F2", + "separatorColor": "#424450" + }, + "contentSplitter": { + "handleColor": "#21222C", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#F8F8F2" + }, + "emptyContainer": { + "backgroundColor": "#343746", + "iconColor": "#44475A", + "titleTextColor": "#F8F8F2" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#282A36", + "backgroundColor": "#282A36", + "borderColor": "#21222C", + "buttonColor": "#50FA7B", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#21222C", + "cellColor": "#282A36", + "cellColorWithBackground": "#99282A36", + "cellSelectedBorderColor": "#8BE9FD", + "cellSelectedColor": "#44475A", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#88393C4D", + "continueReadingTextColor": "#F8F8F2", + "currentComicBackgroundColor": "#55282A36", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#FF79C6", + "favUncheckedColor": "#21222C", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#343746", + "infoBorderColor": "#424450", + "infoMetadataTextColor": "#6272A4", + "infoScrollbarColor": "#44475A", + "infoShadowColor": "#000000", + "infoTextColor": "#F8F8F2", + "itemDetailsColor": "#EDEDF0", + "itemTitleColor": "#F8F8F2", + "linkColor": "#8BE9FD", + "newItemColor": "#F1FA8C", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#20282A36", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#88282A36", + "ratingSelectedColor": "#F1FA8C", + "ratingUnselectedColor": "#21222C", + "readTickCheckedColor": "#50FA7B", + "readTickUncheckedColor": "#21222C", + "scrollbarBorderColor": "#424450", + "scrollbarColor": "#44475A", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#F8F8F2", + "linkColor": "#8BE9FD" + }, + "importWidget": { + "backgroundColor": "#343746", + "coversDecorationBgColor": "#424450", + "coversDecorationShadowColor": "#21222C", + "coversLabelColor": "#6272A4", + "coversViewBackgroundColor": "#424450", + "currentComicTextColor": "#6272A4", + "descriptionTextColor": "#6272A4", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#50FA7B", + "iconColor": "#F8F8F2", + "modeIconColor": "#44475A", + "titleTextColor": "#F8F8F2" + }, + "libraryItem": { + "libraryIconColor": "#EDEDF0", + "libraryIconSelectedColor": "#F8F8F2", + "libraryIconShadowColor": "#000000", + "libraryOptionsIconColor": "#F8F8F2", + "selectedBackgroundColor": "#21222C", + "selectedTextColor": "#F8F8F2", + "textColor": "#EDEDF0" + }, + "mainToolbar": { + "backgroundColor": "#21222C", + "dividerColor": "#424450", + "folderNameColor": "#F8F8F2", + "iconColor": "#F8F8F2", + "iconDisabledColor": "#4F566B" + }, + "menuIcons": { + "iconColor": "#F8F8F2" + }, + "meta": { + "displayName": "Late Night", + "id": "builtin/dark2", + "targetApp": "YACReaderLibrary", + "variant": "dark", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#F8F8F2", + "buttonBackgroundColor": "#424450", + "buttonBorderColor": "#282A36", + "buttonTextColor": "#F8F8F2", + "checkBoxTickColor": "#F8F8F2", + "contentAltBackgroundColor": "#424450", + "contentBackgroundColor": "#343746", + "contentTextColor": "#F8F8F2", + "dialogBackgroundColor": "#424450", + "downArrowColor": "#6272A4", + "hyperlinkColor": "#8BE9FD", + "labelBackgroundColor": "#343746", + "labelTextColor": "#F8F8F2", + "navIconColor": "#F8F8F2", + "radioCheckedBackgroundColor": "#EDEDF0", + "radioCheckedIndicatorColor": "#44475A", + "radioUncheckedColor": "#EDEDF0", + "rowIconColor": "#EDEDF0", + "tableAltBackgroundColor": "#424450", + "tableBackgroundColor": "#343746", + "tableBorderColor": "#282A36", + "tableHeaderBackgroundColor": "#424450", + "tableHeaderBorderColor": "#21222C", + "tableHeaderGradientColor": "#424450", + "tableHeaderTextColor": "#F8F8F2", + "tableScrollBackgroundColor": "#424450", + "tableScrollHandleColor": "#EDEDF0", + "tableSectionBorderDark": "#EDEDF0", + "tableSectionBorderLight": "#F8F8F2", + "tableSelectedColor": "#44475A", + "toolButtonAccentColor": "#282A36", + "upArrowColor": "#6272A4" + }, + "navigationTree": { + "branchIndicatorColor": "#EDEDF0", + "branchIndicatorSelectedColor": "#F8F8F2", + "folderIconColor": "#EDEDF0", + "folderIconSelectedColor": "#F8F8F2", + "folderIconSelectedShadowColor": "#000000", + "folderIconShadowColor": "#000000", + "folderNotCompletedColor": "#F1FA8C", + "folderReadOverlayColor": "#282A36", + "folderReadOverlaySelectedColor": "#282A36", + "newItemColor": "#F1FA8C", + "scrollBackgroundColor": "#424450", + "scrollHandleColor": "#EDEDF0", + "selectedTextColor": "#F8F8F2", + "selectionBackgroundColor": "#21222C", + "textColor": "#EDEDF0" + }, + "noLibrariesWidget": { + "backgroundColor": "#343746", + "descriptionTextColor": "#6272A4", + "iconColor": "#44475A", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#EDEDF0" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#8BE9FD", + "currentlyReadingMainSelectedColor": "#8BE9FD", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#FF79C6", + "favoritesMainSelectedColor": "#FF79C6", + "labelColors": { + "blue": "#6A99FF", + "cyan": "#8FF2FD", + "dark": "#636884", + "green": "#8EFAA9", + "light": "#BDBDBF", + "orange": "#FFB86C", + "pink": "#FF79C6", + "purple": "#BD93F9", + "red": "#FF5555", + "violet": "#A5A7FF", + "white": "#F8F8F2", + "yellow": "#F1FA8C" + }, + "labelShadowColor": "#000000", + "labelShadowSelectedColor": "#000000", + "listDetailColor": "#6272A4", + "listDetailSelectedColor": "#6272A4", + "listMainColor": "#EDEDF0", + "listMainSelectedColor": "#EDEDF0", + "listShadowColor": "#000000", + "listShadowSelectedColor": "#000000", + "readingListMainColor": "#EDEDF0", + "readingListMainSelectedColor": "#EDEDF0", + "specialListShadowColor": "#000000", + "specialListShadowSelectedColor": "#000000" + }, + "searchLineEdit": { + "backgroundColor": "#424450", + "iconColor": "#F8F8F2", + "textColor": "#EDEDF0" + }, + "serverConfigDialog": { + "backgroundColor": "#343746", + "checkBoxTextColor": "#F8F8F2", + "decorationColor": "#F8F8F2", + "labelTextColor": "#EDEDF0", + "propagandaTextColor": "#6272A4", + "qrBackgroundColor": "#343746", + "qrForegroundColor": "#F8F8F2", + "qrMessageTextColor": "#6272A4", + "titleTextColor": "#F8F8F2" + }, + "shortcutsIcons": { + "iconColor": "#F8F8F2" + }, + "sidebar": { + "backgroundColor": "#343746", + "busyIndicatorColor": "#F8F8F2", + "sectionSeparatorColor": "#424450", + "separatorColor": "#6272A4", + "titleDropShadowColor": "#000000", + "titleTextColor": "#EDEDF0", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#EDEDF0", + "shadowColor": "#000000", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#343746", + "closeButtonColor": "#F8F8F2", + "contentTextColor": "#EDEDF0", + "headerDecorationColor": "#8BE9FD", + "headerTextColor": "#F8F8F2", + "linkColor": "#8BE9FD", + "versionTextColor": "#6272A4" + } +} diff --git a/YACReaderLibrary/themes/builtin_dark3.json b/YACReaderLibrary/themes/builtin_dark3.json new file mode 100644 index 000000000..a6d5335c1 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_dark3.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#282828", + "readMainColor": "#F0503E", + "readTickColor": "#B63D2F", + "readingColor": "#FABD2F", + "textColor": "#928374" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#3C3836", + "backgroundColor": "#282828", + "headerBackgroundColor": "#32302F", + "headerBorderColor": "#1D2021", + "headerGradientColor": "#3C3836", + "headerTextColor": "#EBDBB2", + "itemBorderBottomColor": "#1D2021", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#504945", + "itemBorderTopWidth": 0, + "itemTextColor": "#EBDBB2", + "selectedColor": "#504945", + "selectedTextColor": "#EBDBB2", + "starRatingColor": "#FABD2F", + "starRatingSelectedColor": "#EBDBB2" + }, + "comicsViewToolbar": { + "backgroundColor": "#1D2021", + "checkedBackgroundColor": "#504945", + "iconColor": "#EBDBB2", + "separatorColor": "#504945" + }, + "contentSplitter": { + "handleColor": "#1D2021", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#EBDBB2" + }, + "emptyContainer": { + "backgroundColor": "#32302F", + "iconColor": "#504945", + "titleTextColor": "#EBDBB2" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#282828", + "backgroundColor": "#282828", + "borderColor": "#1D2021", + "buttonColor": "#B8BB26", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#1D2021", + "cellColor": "#282828", + "cellColorWithBackground": "#99282828", + "cellSelectedBorderColor": "#8EC07C", + "cellSelectedColor": "#504945", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#884A433E", + "continueReadingTextColor": "#EBDBB2", + "currentComicBackgroundColor": "#55282828", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#D3869B", + "favUncheckedColor": "#1D2021", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#32302F", + "infoBorderColor": "#504945", + "infoMetadataTextColor": "#928374", + "infoScrollbarColor": "#504945", + "infoShadowColor": "#000000", + "infoTextColor": "#EBDBB2", + "itemDetailsColor": "#D5C4A1", + "itemTitleColor": "#EBDBB2", + "linkColor": "#8EC07C", + "newItemColor": "#FABD2F", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#20282828", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#88282828", + "ratingSelectedColor": "#FABD2F", + "ratingUnselectedColor": "#1D2021", + "readTickCheckedColor": "#B8BB26", + "readTickUncheckedColor": "#1D2021", + "scrollbarBorderColor": "#504945", + "scrollbarColor": "#504945", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#EBDBB2", + "linkColor": "#8EC07C" + }, + "importWidget": { + "backgroundColor": "#32302F", + "coversDecorationBgColor": "#3C3836", + "coversDecorationShadowColor": "#1D2021", + "coversLabelColor": "#928374", + "coversViewBackgroundColor": "#3C3836", + "currentComicTextColor": "#928374", + "descriptionTextColor": "#928374", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#B8BB26", + "iconColor": "#EBDBB2", + "modeIconColor": "#504945", + "titleTextColor": "#EBDBB2" + }, + "libraryItem": { + "libraryIconColor": "#D5C4A1", + "libraryIconSelectedColor": "#EBDBB2", + "libraryIconShadowColor": "#000000", + "libraryOptionsIconColor": "#EBDBB2", + "selectedBackgroundColor": "#1D2021", + "selectedTextColor": "#EBDBB2", + "textColor": "#D5C4A1" + }, + "mainToolbar": { + "backgroundColor": "#1D2021", + "dividerColor": "#504945", + "folderNameColor": "#EBDBB2", + "iconColor": "#EBDBB2", + "iconDisabledColor": "#5B5248" + }, + "menuIcons": { + "iconColor": "#EBDBB2" + }, + "meta": { + "displayName": "Retro Dark", + "id": "builtin/dark3", + "targetApp": "YACReaderLibrary", + "variant": "dark", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#EBDBB2", + "buttonBackgroundColor": "#3C3836", + "buttonBorderColor": "#282828", + "buttonTextColor": "#EBDBB2", + "checkBoxTickColor": "#EBDBB2", + "contentAltBackgroundColor": "#3C3836", + "contentBackgroundColor": "#32302F", + "contentTextColor": "#EBDBB2", + "dialogBackgroundColor": "#504945", + "downArrowColor": "#928374", + "hyperlinkColor": "#8EC07C", + "labelBackgroundColor": "#32302F", + "labelTextColor": "#EBDBB2", + "navIconColor": "#EBDBB2", + "radioCheckedBackgroundColor": "#D5C4A1", + "radioCheckedIndicatorColor": "#504945", + "radioUncheckedColor": "#D5C4A1", + "rowIconColor": "#D5C4A1", + "tableAltBackgroundColor": "#3C3836", + "tableBackgroundColor": "#32302F", + "tableBorderColor": "#282828", + "tableHeaderBackgroundColor": "#3C3836", + "tableHeaderBorderColor": "#1D2021", + "tableHeaderGradientColor": "#504945", + "tableHeaderTextColor": "#EBDBB2", + "tableScrollBackgroundColor": "#504945", + "tableScrollHandleColor": "#D5C4A1", + "tableSectionBorderDark": "#D5C4A1", + "tableSectionBorderLight": "#EBDBB2", + "tableSelectedColor": "#504945", + "toolButtonAccentColor": "#282828", + "upArrowColor": "#928374" + }, + "navigationTree": { + "branchIndicatorColor": "#D5C4A1", + "branchIndicatorSelectedColor": "#EBDBB2", + "folderIconColor": "#D5C4A1", + "folderIconSelectedColor": "#EBDBB2", + "folderIconSelectedShadowColor": "#000000", + "folderIconShadowColor": "#000000", + "folderNotCompletedColor": "#FABD2F", + "folderReadOverlayColor": "#282828", + "folderReadOverlaySelectedColor": "#282828", + "newItemColor": "#FABD2F", + "scrollBackgroundColor": "#3C3836", + "scrollHandleColor": "#D5C4A1", + "selectedTextColor": "#EBDBB2", + "selectionBackgroundColor": "#1D2021", + "textColor": "#D5C4A1" + }, + "noLibrariesWidget": { + "backgroundColor": "#32302F", + "descriptionTextColor": "#928374", + "iconColor": "#504945", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#D5C4A1" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#8EC07C", + "currentlyReadingMainSelectedColor": "#8EC07C", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#D3869B", + "favoritesMainSelectedColor": "#D3869B", + "labelColors": { + "blue": "#83A598", + "cyan": "#8EC07C", + "dark": "#928374", + "green": "#B8BB26", + "light": "#D5C4A1", + "orange": "#FE8019", + "pink": "#D3869B", + "purple": "#B16396", + "red": "#FB4934", + "violet": "#9978BE", + "white": "#EBDBB2", + "yellow": "#FABD2F" + }, + "labelShadowColor": "#000000", + "labelShadowSelectedColor": "#000000", + "listDetailColor": "#928374", + "listDetailSelectedColor": "#928374", + "listMainColor": "#D5C4A1", + "listMainSelectedColor": "#D5C4A1", + "listShadowColor": "#000000", + "listShadowSelectedColor": "#000000", + "readingListMainColor": "#D5C4A1", + "readingListMainSelectedColor": "#D5C4A1", + "specialListShadowColor": "#000000", + "specialListShadowSelectedColor": "#000000" + }, + "searchLineEdit": { + "backgroundColor": "#3C3836", + "iconColor": "#EBDBB2", + "textColor": "#D5C4A1" + }, + "serverConfigDialog": { + "backgroundColor": "#32302F", + "checkBoxTextColor": "#EBDBB2", + "decorationColor": "#EBDBB2", + "labelTextColor": "#D5C4A1", + "propagandaTextColor": "#928374", + "qrBackgroundColor": "#32302F", + "qrForegroundColor": "#EBDBB2", + "qrMessageTextColor": "#928374", + "titleTextColor": "#EBDBB2" + }, + "shortcutsIcons": { + "iconColor": "#EBDBB2" + }, + "sidebar": { + "backgroundColor": "#32302F", + "busyIndicatorColor": "#EBDBB2", + "sectionSeparatorColor": "#504945", + "separatorColor": "#928374", + "titleDropShadowColor": "#000000", + "titleTextColor": "#D5C4A1", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#D5C4A1", + "shadowColor": "#000000", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#32302F", + "closeButtonColor": "#EBDBB2", + "contentTextColor": "#D5C4A1", + "headerDecorationColor": "#8EC07C", + "headerTextColor": "#EBDBB2", + "linkColor": "#8EC07C", + "versionTextColor": "#928374" + } +} diff --git a/YACReaderLibrary/themes/builtin_dark4.json b/YACReaderLibrary/themes/builtin_dark4.json new file mode 100644 index 000000000..e1144a9ce --- /dev/null +++ b/YACReaderLibrary/themes/builtin_dark4.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#2E3440", + "readMainColor": "#BF616A", + "readTickColor": "#552B2F", + "readingColor": "#EBCB8B", + "textColor": "#787D88" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#353C4A", + "backgroundColor": "#2E3440", + "headerBackgroundColor": "#3B4252", + "headerBorderColor": "#2A303B", + "headerGradientColor": "#434C5E", + "headerTextColor": "#ECEFF4", + "itemBorderBottomColor": "#2A303B", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#4C566A", + "itemBorderTopWidth": 0, + "itemTextColor": "#ECEFF4", + "selectedColor": "#22262F", + "selectedTextColor": "#ECEFF4", + "starRatingColor": "#EBCB8B", + "starRatingSelectedColor": "#ECEFF4" + }, + "comicsViewToolbar": { + "backgroundColor": "#2A303B", + "checkedBackgroundColor": "#4C566A", + "iconColor": "#ECEFF4", + "separatorColor": "#4C566A" + }, + "contentSplitter": { + "handleColor": "#2A303B", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#ECEFF4" + }, + "emptyContainer": { + "backgroundColor": "#3B4252", + "iconColor": "#4C566A", + "titleTextColor": "#ECEFF4" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#2E3440", + "backgroundColor": "#2E3440", + "borderColor": "#2A303B", + "buttonColor": "#A3BE8C", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#2A303B", + "cellColor": "#2E3440", + "cellColorWithBackground": "#992E3440", + "cellSelectedBorderColor": "#8FBCBB", + "cellSelectedColor": "#4C566A", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#880C0E11", + "continueReadingTextColor": "#ECEFF4", + "currentComicBackgroundColor": "#552E3440", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#D8A6B3", + "favUncheckedColor": "#2A303B", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#3B4252", + "infoBorderColor": "#4C566A", + "infoMetadataTextColor": "#81A1C1", + "infoScrollbarColor": "#4C566A", + "infoShadowColor": "#000000", + "infoTextColor": "#ECEFF4", + "itemDetailsColor": "#E5E9F0", + "itemTitleColor": "#ECEFF4", + "linkColor": "#8FBCBB", + "newItemColor": "#EBCB8B", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#202E3440", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#882E3440", + "ratingSelectedColor": "#EBCB8B", + "ratingUnselectedColor": "#2A303B", + "readTickCheckedColor": "#A3BE8C", + "readTickUncheckedColor": "#2A303B", + "scrollbarBorderColor": "#4C566A", + "scrollbarColor": "#4C566A", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#ECEFF4", + "linkColor": "#8FBCBB" + }, + "importWidget": { + "backgroundColor": "#3B4252", + "coversDecorationBgColor": "#434C5E", + "coversDecorationShadowColor": "#2A303B", + "coversLabelColor": "#81A1C1", + "coversViewBackgroundColor": "#434C5E", + "currentComicTextColor": "#81A1C1", + "descriptionTextColor": "#81A1C1", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#A3BE8C", + "iconColor": "#ECEFF4", + "modeIconColor": "#4C566A", + "titleTextColor": "#ECEFF4" + }, + "libraryItem": { + "libraryIconColor": "#E5E9F0", + "libraryIconSelectedColor": "#ECEFF4", + "libraryIconShadowColor": "#000000", + "libraryOptionsIconColor": "#ECEFF4", + "selectedBackgroundColor": "#2E3440", + "selectedTextColor": "#ECEFF4", + "textColor": "#E5E9F0" + }, + "mainToolbar": { + "backgroundColor": "#2A303B", + "dividerColor": "#4C566A", + "folderNameColor": "#ECEFF4", + "iconColor": "#ECEFF4", + "iconDisabledColor": "#4A5568" + }, + "menuIcons": { + "iconColor": "#ECEFF4" + }, + "meta": { + "displayName": "Frozen Dark", + "id": "builtin/dark4", + "targetApp": "YACReaderLibrary", + "variant": "dark", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#ECEFF4", + "buttonBackgroundColor": "#434C5E", + "buttonBorderColor": "#2E3440", + "buttonTextColor": "#ECEFF4", + "checkBoxTickColor": "#ECEFF4", + "contentAltBackgroundColor": "#434C5E", + "contentBackgroundColor": "#3B4252", + "contentTextColor": "#ECEFF4", + "dialogBackgroundColor": "#4C566A", + "downArrowColor": "#81A1C1", + "hyperlinkColor": "#8FBCBB", + "labelBackgroundColor": "#3B4252", + "labelTextColor": "#ECEFF4", + "navIconColor": "#ECEFF4", + "radioCheckedBackgroundColor": "#E5E9F0", + "radioCheckedIndicatorColor": "#4C566A", + "radioUncheckedColor": "#E5E9F0", + "rowIconColor": "#E5E9F0", + "tableAltBackgroundColor": "#434C5E", + "tableBackgroundColor": "#3B4252", + "tableBorderColor": "#2E3440", + "tableHeaderBackgroundColor": "#434C5E", + "tableHeaderBorderColor": "#2A303B", + "tableHeaderGradientColor": "#4C566A", + "tableHeaderTextColor": "#ECEFF4", + "tableScrollBackgroundColor": "#4C566A", + "tableScrollHandleColor": "#E5E9F0", + "tableSectionBorderDark": "#E5E9F0", + "tableSectionBorderLight": "#ECEFF4", + "tableSelectedColor": "#4C566A", + "toolButtonAccentColor": "#2E3440", + "upArrowColor": "#81A1C1" + }, + "navigationTree": { + "branchIndicatorColor": "#E5E9F0", + "branchIndicatorSelectedColor": "#ECEFF4", + "folderIconColor": "#E5E9F0", + "folderIconSelectedColor": "#ECEFF4", + "folderIconSelectedShadowColor": "#000000", + "folderIconShadowColor": "#000000", + "folderNotCompletedColor": "#EBCB8B", + "folderReadOverlayColor": "#2E3440", + "folderReadOverlaySelectedColor": "#2E3440", + "newItemColor": "#EBCB8B", + "scrollBackgroundColor": "#434C5E", + "scrollHandleColor": "#E5E9F0", + "selectedTextColor": "#ECEFF4", + "selectionBackgroundColor": "#2E3440", + "textColor": "#E5E9F0" + }, + "noLibrariesWidget": { + "backgroundColor": "#3B4252", + "descriptionTextColor": "#81A1C1", + "iconColor": "#4C566A", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#E5E9F0" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#8FBCBB", + "currentlyReadingMainSelectedColor": "#8FBCBB", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#D8A6B3", + "favoritesMainSelectedColor": "#D8A6B3", + "labelColors": { + "blue": "#5E81AC", + "cyan": "#8FBCBB", + "dark": "#64788D", + "green": "#A3BE8C", + "light": "#ADB1B6", + "orange": "#D08770", + "pink": "#D8A6B3", + "purple": "#A484C1", + "red": "#BF616A", + "violet": "#948CB4", + "white": "#ECEFF4", + "yellow": "#EBCB8B" + }, + "labelShadowColor": "#000000", + "labelShadowSelectedColor": "#000000", + "listDetailColor": "#81A1C1", + "listDetailSelectedColor": "#81A1C1", + "listMainColor": "#E5E9F0", + "listMainSelectedColor": "#E5E9F0", + "listShadowColor": "#000000", + "listShadowSelectedColor": "#000000", + "readingListMainColor": "#E5E9F0", + "readingListMainSelectedColor": "#E5E9F0", + "specialListShadowColor": "#000000", + "specialListShadowSelectedColor": "#000000" + }, + "searchLineEdit": { + "backgroundColor": "#434C5E", + "iconColor": "#ECEFF4", + "textColor": "#E5E9F0" + }, + "serverConfigDialog": { + "backgroundColor": "#3B4252", + "checkBoxTextColor": "#ECEFF4", + "decorationColor": "#ECEFF4", + "labelTextColor": "#E5E9F0", + "propagandaTextColor": "#81A1C1", + "qrBackgroundColor": "#3B4252", + "qrForegroundColor": "#ECEFF4", + "qrMessageTextColor": "#81A1C1", + "titleTextColor": "#ECEFF4" + }, + "shortcutsIcons": { + "iconColor": "#ECEFF4" + }, + "sidebar": { + "backgroundColor": "#3B4252", + "busyIndicatorColor": "#ECEFF4", + "sectionSeparatorColor": "#4C566A", + "separatorColor": "#81A1C1", + "titleDropShadowColor": "#000000", + "titleTextColor": "#E5E9F0", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#E5E9F0", + "shadowColor": "#000000", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#3B4252", + "closeButtonColor": "#ECEFF4", + "contentTextColor": "#E5E9F0", + "headerDecorationColor": "#8FBCBB", + "headerTextColor": "#ECEFF4", + "linkColor": "#8FBCBB", + "versionTextColor": "#81A1C1" + } +} diff --git a/YACReaderLibrary/themes/builtin_light.json b/YACReaderLibrary/themes/builtin_light.json new file mode 100644 index 000000000..f6d252ac5 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_light.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#DCDCDC", + "readMainColor": "#DB4725", + "readTickColor": "#8A2C17", + "readingColor": "#E6B90F", + "textColor": "#303030" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#F2F2F2", + "backgroundColor": "#FAFAFA", + "headerBackgroundColor": "#F5F5F5", + "headerBorderColor": "#B8BDC4", + "headerGradientColor": "#F5F5F5", + "headerTextColor": "#313232", + "itemBorderBottomColor": "#DFDFDF", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#FEFEFE", + "itemBorderTopWidth": 0, + "itemTextColor": "#252626", + "selectedColor": "#595959", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#E9BE0F", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#F0F0F0", + "checkedBackgroundColor": "#CCCCCC", + "iconColor": "#404040", + "separatorColor": "#CCCCCC" + }, + "contentSplitter": { + "handleColor": "#F0F0F0", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#606060" + }, + "emptyContainer": { + "backgroundColor": "#FFFFFF", + "iconColor": "#CCCCCC", + "titleTextColor": "#888888" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#9E9E9E", + "backgroundColor": "#F6F6F6", + "borderColor": "#DBDBDB", + "buttonColor": "#FFCC00", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FFFFFF", + "cellColor": "#FFFFFF", + "cellColorWithBackground": "#99FFFFFF", + "cellSelectedBorderColor": "#FFCC00", + "cellSelectedColor": "#FFFFFF", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#E8E8E8", + "continueReadingTextColor": "#000000", + "currentComicBackgroundColor": "#88FFFFFF", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#E84852", + "favUncheckedColor": "#DEDEDE", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#FFFFFF", + "infoBorderColor": "#808080", + "infoMetadataTextColor": "#404040", + "infoScrollbarColor": "#FF424246", + "infoShadowColor": "#444444", + "infoTextColor": "#2E2E2E", + "itemDetailsColor": "#636363", + "itemTitleColor": "#121212", + "linkColor": "#FFCC00", + "newItemColor": "#FFFFCC00", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#20000000", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#88000000", + "ratingSelectedColor": "#2B2B2B", + "ratingUnselectedColor": "#DEDEDE", + "readTickCheckedColor": "#E84852", + "readTickUncheckedColor": "#DEDEDE", + "scrollbarBorderColor": "#AA313131", + "scrollbarColor": "#88424242", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#302F2D", + "linkColor": "#C19441" + }, + "importWidget": { + "backgroundColor": "#FAFAFA", + "coversDecorationBgColor": "#E6E6E6", + "coversDecorationShadowColor": "#A1A1A1", + "coversLabelColor": "#565959", + "coversViewBackgroundColor": "#E6E6E6", + "currentComicTextColor": "#565959", + "descriptionTextColor": "#565959", + "glowLineColor": "#FFE100", + "iconCheckedColor": "#565959", + "iconColor": "#495252", + "modeIconColor": "#E6E6E6", + "titleTextColor": "#495252" + }, + "libraryItem": { + "libraryIconColor": "#606060", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#FFFFFF", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#333133", + "selectedTextColor": "#FFFFFF", + "textColor": "#000000" + }, + "mainToolbar": { + "backgroundColor": "#F0F0F0", + "dividerColor": "#B8BDC4", + "folderNameColor": "#333133", + "iconColor": "#333133", + "iconDisabledColor": "#B0B0B0" + }, + "menuIcons": { + "iconColor": "#606060" + }, + "meta": { + "displayName": "Default Light", + "id": "builtin/light", + "targetApp": "YACReaderLibrary", + "variant": "light", + "version": "10.0.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#000000", + "buttonBackgroundColor": "#E0E0E0", + "buttonBorderColor": "#CCCCCC", + "buttonTextColor": "#000000", + "checkBoxTickColor": "#000000", + "contentAltBackgroundColor": "#E0E0E0", + "contentBackgroundColor": "#ECECEC", + "contentTextColor": "#000000", + "dialogBackgroundColor": "#FBFBFB", + "downArrowColor": "#222222", + "hyperlinkColor": "#FFCC00", + "labelBackgroundColor": "#ECECEC", + "labelTextColor": "#000000", + "navIconColor": "#222222", + "radioCheckedBackgroundColor": "#E0E0E0", + "radioCheckedIndicatorColor": "#222222", + "radioUncheckedColor": "#E0E0E0", + "rowIconColor": "#222222", + "tableAltBackgroundColor": "#FAFAFA", + "tableBackgroundColor": "#F4F4F4", + "tableBorderColor": "#CCCCCC", + "tableHeaderBackgroundColor": "#E0E0E0", + "tableHeaderBorderColor": "#C0C0C0", + "tableHeaderGradientColor": "#E0E0E0", + "tableHeaderTextColor": "#333333", + "tableScrollBackgroundColor": "#D0D0D0", + "tableScrollHandleColor": "#888888", + "tableSectionBorderDark": "#CCCCCC", + "tableSectionBorderLight": "#FFFFFF", + "tableSelectedColor": "#DDDDDD", + "toolButtonAccentColor": "#A0A0A0", + "upArrowColor": "#222222" + }, + "navigationTree": { + "branchIndicatorColor": "#606060", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#606060", + "folderIconSelectedColor": "#FFFFFF", + "folderIconSelectedShadowColor": "#161616", + "folderIconShadowColor": "#FFFFFF", + "folderNotCompletedColor": "#555F7F", + "folderReadOverlayColor": "#FFFFFF", + "folderReadOverlaySelectedColor": "#161616", + "newItemColor": "#555F7F", + "scrollBackgroundColor": "#E0E0E0", + "scrollHandleColor": "#888888", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#333133", + "textColor": "#000000" + }, + "noLibrariesWidget": { + "backgroundColor": "#FFFFFF", + "descriptionTextColor": "#565959", + "iconColor": "#CCCCCC", + "noLibrariesLineColor": "#A8A8A8", + "textColor": "#495252" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#FFCC00", + "currentlyReadingMainSelectedColor": "#FFCC00", + "currentlyReadingOuterColor": "#000000", + "currentlyReadingOuterSelectedColor": "#000000", + "favoritesMainColor": "#E15055", + "favoritesMainSelectedColor": "#E15055", + "labelColors": { + "blue": "#82C7FF", + "cyan": "#A0FDDB", + "dark": "#B7B7B7", + "green": "#ADE738", + "light": "#CBCBCB", + "orange": "#F5C240", + "pink": "#FD9CDA", + "purple": "#D692FC", + "red": "#F67A7B", + "violet": "#8F95FF", + "white": "#FCFCFC", + "yellow": "#F2E446" + }, + "labelShadowColor": "#8F8F8F", + "labelShadowSelectedColor": "#161616", + "listDetailColor": "#FFFFFF", + "listDetailSelectedColor": "#161616", + "listMainColor": "#808080", + "listMainSelectedColor": "#FFFFFF", + "listShadowColor": "#8F8F8F", + "listShadowSelectedColor": "#161616", + "readingListMainColor": "#808080", + "readingListMainSelectedColor": "#808080", + "specialListShadowColor": "#8F8F8F", + "specialListShadowSelectedColor": "#161616" + }, + "searchLineEdit": { + "backgroundColor": "#333133", + "iconColor": "#EFEFEF", + "textColor": "#FFFFFF" + }, + "serverConfigDialog": { + "backgroundColor": "#FFFFFF", + "checkBoxTextColor": "#262626", + "decorationColor": "#606060", + "labelTextColor": "#575757", + "propagandaTextColor": "#4D4D4D", + "qrBackgroundColor": "#FFFFFF", + "qrForegroundColor": "#606060", + "qrMessageTextColor": "#A3A3A3", + "titleTextColor": "#474747" + }, + "shortcutsIcons": { + "iconColor": "#606060" + }, + "sidebar": { + "backgroundColor": "#FBFBFB", + "busyIndicatorColor": "#808080", + "sectionSeparatorColor": "#E0E0E0", + "separatorColor": "#808080", + "titleDropShadowColor": "#FFFFFF", + "titleTextColor": "#4A494A", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#4F4E4F", + "shadowColor": "#FBFBFB", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#444444", + "contentTextColor": "#0A0A0A", + "headerDecorationColor": "#E8B800", + "headerTextColor": "#0A0A0A", + "linkColor": "#E8B800", + "versionTextColor": "#858585" + } +} diff --git a/YACReaderLibrary/themes/builtin_light1.json b/YACReaderLibrary/themes/builtin_light1.json new file mode 100644 index 000000000..662d8ac39 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_light1.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#E6E9EF", + "readMainColor": "#EE99A0", + "readTickColor": "#ED8796", + "readingColor": "#EED49F", + "textColor": "#5C5F77" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#E6E9EF", + "backgroundColor": "#EFF1F5", + "headerBackgroundColor": "#ECEFF5", + "headerBorderColor": "#BCC0CC", + "headerGradientColor": "#ECEFF5", + "headerTextColor": "#4C4F69", + "itemBorderBottomColor": "#CCD0DA", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#F5F6F8", + "itemBorderTopWidth": 0, + "itemTextColor": "#4C4F69", + "selectedColor": "#4C4F69", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#EED49F", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#F2F4F8", + "checkedBackgroundColor": "#CCD0DA", + "iconColor": "#4C4F69", + "separatorColor": "#CCD0DA" + }, + "contentSplitter": { + "handleColor": "#DCE0E8", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#5C5F77" + }, + "emptyContainer": { + "backgroundColor": "#EFF1F5", + "iconColor": "#BCC0CC", + "titleTextColor": "#7C7F93" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#CCD0DA", + "backgroundColor": "#EFF1F5", + "borderColor": "#DCE0E8", + "buttonColor": "#8CAAEE", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#303446", + "cellColor": "#FFFFFF", + "cellColorWithBackground": "#99FFFFFF", + "cellSelectedBorderColor": "#B7BDF8", + "cellSelectedColor": "#F4F5F8", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#E6E9EF", + "continueReadingTextColor": "#4C4F69", + "currentComicBackgroundColor": "#88EFF1F5", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#F5BDE6", + "favUncheckedColor": "#8C8FA1", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#FFFFFF", + "infoBorderColor": "#CCD0DA", + "infoMetadataTextColor": "#6C6F85", + "infoScrollbarColor": "#FF7C7F93", + "infoShadowColor": "#8C8FA1", + "infoTextColor": "#4C4F69", + "itemDetailsColor": "#6C6F85", + "itemTitleColor": "#303446", + "linkColor": "#8CAAEE", + "newItemColor": "#FFE5C890", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#10CCD0DA", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#40BCC0CC", + "ratingSelectedColor": "#4C4F69", + "ratingUnselectedColor": "#8C8FA1", + "readTickCheckedColor": "#A6D189", + "readTickUncheckedColor": "#8C8FA1", + "scrollbarBorderColor": "#AACCD0DA", + "scrollbarColor": "#888C8FA1", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#303446", + "linkColor": "#8CAAEE" + }, + "importWidget": { + "backgroundColor": "#EFF1F5", + "coversDecorationBgColor": "#E6E9EF", + "coversDecorationShadowColor": "#BCC0CC", + "coversLabelColor": "#6C6F85", + "coversViewBackgroundColor": "#E6E9EF", + "currentComicTextColor": "#6C6F85", + "descriptionTextColor": "#6C6F85", + "glowLineColor": "#E5C890", + "iconCheckedColor": "#A6D189", + "iconColor": "#4C4F69", + "modeIconColor": "#DCE0E8", + "titleTextColor": "#4C4F69" + }, + "libraryItem": { + "libraryIconColor": "#6C6F85", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#EFF1F5", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#4C4F69", + "selectedTextColor": "#FFFFFF", + "textColor": "#4C4F69" + }, + "mainToolbar": { + "backgroundColor": "#F2F4F8", + "dividerColor": "#CCD0DA", + "folderNameColor": "#4C4F69", + "iconColor": "#4C4F69", + "iconDisabledColor": "#9CA0B0" + }, + "menuIcons": { + "iconColor": "#5C5F77" + }, + "meta": { + "displayName": "Pastel", + "id": "builtin/light1", + "targetApp": "YACReaderLibrary", + "variant": "light", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#4C4F69", + "buttonBackgroundColor": "#E6E9EF", + "buttonBorderColor": "#CCD0DA", + "buttonTextColor": "#4C4F69", + "checkBoxTickColor": "#4C4F69", + "contentAltBackgroundColor": "#E6E9EF", + "contentBackgroundColor": "#EFF1F5", + "contentTextColor": "#4C4F69", + "dialogBackgroundColor": "#F4F5F8", + "downArrowColor": "#4C4F69", + "hyperlinkColor": "#8CAAEE", + "labelBackgroundColor": "#EFF1F5", + "labelTextColor": "#4C4F69", + "navIconColor": "#BABBF1", + "radioCheckedBackgroundColor": "#DCE0E8", + "radioCheckedIndicatorColor": "#4C4F69", + "radioUncheckedColor": "#BCC0CC", + "rowIconColor": "#BABBF1", + "tableAltBackgroundColor": "#F4F5F8", + "tableBackgroundColor": "#EFF1F5", + "tableBorderColor": "#CCD0DA", + "tableHeaderBackgroundColor": "#E6E9EF", + "tableHeaderBorderColor": "#BCC0CC", + "tableHeaderGradientColor": "#E6E9EF", + "tableHeaderTextColor": "#4C4F69", + "tableScrollBackgroundColor": "#DCE0E8", + "tableScrollHandleColor": "#8C8FA1", + "tableSectionBorderDark": "#CCD0DA", + "tableSectionBorderLight": "#FFFFFF", + "tableSelectedColor": "#DCE0E8", + "toolButtonAccentColor": "#B5BFE2", + "upArrowColor": "#4C4F69" + }, + "navigationTree": { + "branchIndicatorColor": "#6C6F85", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#6C6F85", + "folderIconSelectedColor": "#FFFFFF", + "folderIconSelectedShadowColor": "#4C4F69", + "folderIconShadowColor": "#EFF1F5", + "folderNotCompletedColor": "#E5C890", + "folderReadOverlayColor": "#FFFFFF", + "folderReadOverlaySelectedColor": "#4C4F69", + "newItemColor": "#E5C890", + "scrollBackgroundColor": "#DCE0E8", + "scrollHandleColor": "#8C8FA1", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#4C4F69", + "textColor": "#4C4F69" + }, + "noLibrariesWidget": { + "backgroundColor": "#EFF1F5", + "descriptionTextColor": "#6C6F85", + "iconColor": "#BCC0CC", + "noLibrariesLineColor": "#CCD0DA", + "textColor": "#4C4F69" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#8CAAEE", + "currentlyReadingMainSelectedColor": "#8CAAEE", + "currentlyReadingOuterColor": "#4C4F69", + "currentlyReadingOuterSelectedColor": "#4C4F69", + "favoritesMainColor": "#F4B8E4", + "favoritesMainSelectedColor": "#F4B8E4", + "labelColors": { + "blue": "#8CAAEE", + "cyan": "#99D1DB", + "dark": "#949CBB", + "green": "#A6D189", + "light": "#B5BFE2", + "orange": "#EF9F76", + "pink": "#F4B8E4", + "purple": "#CA9EE6", + "red": "#E78284", + "violet": "#BABBF1", + "white": "#EFF1F5", + "yellow": "#E5C890" + }, + "labelShadowColor": "#B5BFE2", + "labelShadowSelectedColor": "#4C4F69", + "listDetailColor": "#FFFFFF", + "listDetailSelectedColor": "#4C4F69", + "listMainColor": "#6C6F85", + "listMainSelectedColor": "#FFFFFF", + "listShadowColor": "#9CA0B0", + "listShadowSelectedColor": "#4C4F69", + "readingListMainColor": "#6C6F85", + "readingListMainSelectedColor": "#FFFFFF", + "specialListShadowColor": "#9CA0B0", + "specialListShadowSelectedColor": "#4C4F69" + }, + "searchLineEdit": { + "backgroundColor": "#4C4F69", + "iconColor": "#EFF1F5", + "textColor": "#FFFFFF" + }, + "serverConfigDialog": { + "backgroundColor": "#EFF1F5", + "checkBoxTextColor": "#4C4F69", + "decorationColor": "#6C6F85", + "labelTextColor": "#5C5F77", + "propagandaTextColor": "#6C6F85", + "qrBackgroundColor": "#FFFFFF", + "qrForegroundColor": "#4C4F69", + "qrMessageTextColor": "#8C8FA1", + "titleTextColor": "#303446" + }, + "shortcutsIcons": { + "iconColor": "#5C5F77" + }, + "sidebar": { + "backgroundColor": "#F4F5F8", + "busyIndicatorColor": "#BABBF1", + "sectionSeparatorColor": "#DCE0E8", + "separatorColor": "#9CA0B0", + "titleDropShadowColor": "#FFFFFF", + "titleTextColor": "#4C4F69", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#5C5F77", + "shadowColor": "#F4F5F8", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#4C4F69", + "contentTextColor": "#303446", + "headerDecorationColor": "#BABBF1", + "headerTextColor": "#303446", + "linkColor": "#8CAAEE", + "versionTextColor": "#8C8FA1" + } +} diff --git a/YACReaderLibrary/themes/builtin_light2.json b/YACReaderLibrary/themes/builtin_light2.json new file mode 100644 index 000000000..cdff8ce64 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_light2.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#D5D6DB", + "readMainColor": "#F52A65", + "readTickColor": "#C64343", + "readingColor": "#8C6C3E", + "textColor": "#4A5685" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#D7D8DD", + "backgroundColor": "#E1E2E7", + "headerBackgroundColor": "#E6E8EF", + "headerBorderColor": "#C4C8DA", + "headerGradientColor": "#E6E8EF", + "headerTextColor": "#2F334D", + "itemBorderBottomColor": "#C4C8DA", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#F5F6F8", + "itemBorderTopWidth": 0, + "itemTextColor": "#2F334D", + "selectedColor": "#3760BF", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#8C6C3E", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#EEF1F8", + "checkedBackgroundColor": "#C4C8DA", + "iconColor": "#2F334D", + "separatorColor": "#C4C8DA" + }, + "contentSplitter": { + "handleColor": "#D7D8DD", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#4A5685" + }, + "emptyContainer": { + "backgroundColor": "#E1E2E7", + "iconColor": "#C4C8DA", + "titleTextColor": "#68709A" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#B4B5B9", + "backgroundColor": "#E1E2E7", + "borderColor": "#D5D6DB", + "buttonColor": "#3760BF", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FFFFFF", + "cellColor": "#FFFFFF", + "cellColorWithBackground": "#99FFFFFF", + "cellSelectedBorderColor": "#2E7DE9", + "cellSelectedColor": "#EEF1F8", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#D7D8DD", + "continueReadingTextColor": "#2F334D", + "currentComicBackgroundColor": "#88E1E2E7", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#D20065", + "favUncheckedColor": "#8990B3", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#FFFFFF", + "infoBorderColor": "#C4C8DA", + "infoMetadataTextColor": "#68709A", + "infoScrollbarColor": "#FF6172B0", + "infoShadowColor": "#8990B3", + "infoTextColor": "#2F334D", + "itemDetailsColor": "#4A5685", + "itemTitleColor": "#1F2335", + "linkColor": "#2E7DE9", + "newItemColor": "#FF8C6C3E", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#10C4C8DA", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#40B4B5B9", + "ratingSelectedColor": "#3760BF", + "ratingUnselectedColor": "#8990B3", + "readTickCheckedColor": "#587539", + "readTickUncheckedColor": "#8990B3", + "scrollbarBorderColor": "#AAC4C8DA", + "scrollbarColor": "#888990B3", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#2F334D", + "linkColor": "#2E7DE9" + }, + "importWidget": { + "backgroundColor": "#E1E2E7", + "coversDecorationBgColor": "#D5D6DB", + "coversDecorationShadowColor": "#C4C8DA", + "coversLabelColor": "#4A5685", + "coversViewBackgroundColor": "#D5D6DB", + "currentComicTextColor": "#4A5685", + "descriptionTextColor": "#4A5685", + "glowLineColor": "#8C6C3E", + "iconCheckedColor": "#587539", + "iconColor": "#2F334D", + "modeIconColor": "#D5D6DB", + "titleTextColor": "#2F334D" + }, + "libraryItem": { + "libraryIconColor": "#4A5685", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#E1E2E7", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#3760BF", + "selectedTextColor": "#FFFFFF", + "textColor": "#2F334D" + }, + "mainToolbar": { + "backgroundColor": "#EEF1F8", + "dividerColor": "#C4C8DA", + "folderNameColor": "#2F334D", + "iconColor": "#2F334D", + "iconDisabledColor": "#A1A6C5" + }, + "menuIcons": { + "iconColor": "#4A5685" + }, + "meta": { + "displayName": "Late Day", + "id": "builtin/light2", + "targetApp": "YACReaderLibrary", + "variant": "light", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#2F334D", + "buttonBackgroundColor": "#D5D6DB", + "buttonBorderColor": "#C4C8DA", + "buttonTextColor": "#2F334D", + "checkBoxTickColor": "#2F334D", + "contentAltBackgroundColor": "#D7D8DD", + "contentBackgroundColor": "#EEF1F8", + "contentTextColor": "#2F334D", + "dialogBackgroundColor": "#F5F6FA", + "downArrowColor": "#2F334D", + "hyperlinkColor": "#2E7DE9", + "labelBackgroundColor": "#EEF1F8", + "labelTextColor": "#2F334D", + "navIconColor": "#3760BF", + "radioCheckedBackgroundColor": "#C4C8DA", + "radioCheckedIndicatorColor": "#2F334D", + "radioUncheckedColor": "#D5D6DB", + "rowIconColor": "#3760BF", + "tableAltBackgroundColor": "#F5F6FA", + "tableBackgroundColor": "#EEF1F8", + "tableBorderColor": "#C4C8DA", + "tableHeaderBackgroundColor": "#D7D8DD", + "tableHeaderBorderColor": "#C4C8DA", + "tableHeaderGradientColor": "#D5D6DB", + "tableHeaderTextColor": "#2F334D", + "tableScrollBackgroundColor": "#D5D6DB", + "tableScrollHandleColor": "#8990B3", + "tableSectionBorderDark": "#C4C8DA", + "tableSectionBorderLight": "#FFFFFF", + "tableSelectedColor": "#D7D8DD", + "toolButtonAccentColor": "#A1A6C5", + "upArrowColor": "#2F334D" + }, + "navigationTree": { + "branchIndicatorColor": "#4A5685", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#4A5685", + "folderIconSelectedColor": "#FFFFFF", + "folderIconSelectedShadowColor": "#3760BF", + "folderIconShadowColor": "#E1E2E7", + "folderNotCompletedColor": "#8C6C3E", + "folderReadOverlayColor": "#FFFFFF", + "folderReadOverlaySelectedColor": "#3760BF", + "newItemColor": "#8C6C3E", + "scrollBackgroundColor": "#D5D6DB", + "scrollHandleColor": "#8990B3", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#3760BF", + "textColor": "#2F334D" + }, + "noLibrariesWidget": { + "backgroundColor": "#E1E2E7", + "descriptionTextColor": "#4A5685", + "iconColor": "#C4C8DA", + "noLibrariesLineColor": "#C4C8DA", + "textColor": "#2F334D" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#2E7DE9", + "currentlyReadingMainSelectedColor": "#2E7DE9", + "currentlyReadingOuterColor": "#3760BF", + "currentlyReadingOuterSelectedColor": "#3760BF", + "favoritesMainColor": "#D20065", + "favoritesMainSelectedColor": "#D20065", + "labelColors": { + "blue": "#2E7DE9", + "cyan": "#007197", + "dark": "#8990B3", + "green": "#587539", + "light": "#C4C8DA", + "orange": "#B15C00", + "pink": "#D20065", + "purple": "#9854F1", + "red": "#F52A65", + "violet": "#7847BD", + "white": "#E1E2E7", + "yellow": "#8C6C3E" + }, + "labelShadowColor": "#A1A6C5", + "labelShadowSelectedColor": "#3760BF", + "listDetailColor": "#FFFFFF", + "listDetailSelectedColor": "#3760BF", + "listMainColor": "#6172B0", + "listMainSelectedColor": "#FFFFFF", + "listShadowColor": "#A1A6C5", + "listShadowSelectedColor": "#3760BF", + "readingListMainColor": "#6172B0", + "readingListMainSelectedColor": "#FFFFFF", + "specialListShadowColor": "#A1A6C5", + "specialListShadowSelectedColor": "#3760BF" + }, + "searchLineEdit": { + "backgroundColor": "#3760BF", + "iconColor": "#E1E2E7", + "textColor": "#FFFFFF" + }, + "serverConfigDialog": { + "backgroundColor": "#E1E2E7", + "checkBoxTextColor": "#2F334D", + "decorationColor": "#4A5685", + "labelTextColor": "#4A5685", + "propagandaTextColor": "#68709A", + "qrBackgroundColor": "#FFFFFF", + "qrForegroundColor": "#3760BF", + "qrMessageTextColor": "#8990B3", + "titleTextColor": "#1F2335" + }, + "shortcutsIcons": { + "iconColor": "#4A5685" + }, + "sidebar": { + "backgroundColor": "#EEF1F8", + "busyIndicatorColor": "#2E7DE9", + "sectionSeparatorColor": "#D5D6DB", + "separatorColor": "#8990B3", + "titleDropShadowColor": "#FFFFFF", + "titleTextColor": "#2F334D", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#4A5685", + "shadowColor": "#EEF1F8", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#FFFFFF", + "closeButtonColor": "#2F334D", + "contentTextColor": "#1F2335", + "headerDecorationColor": "#2E7DE9", + "headerTextColor": "#1F2335", + "linkColor": "#2E7DE9", + "versionTextColor": "#8990B3" + } +} diff --git a/YACReaderLibrary/themes/builtin_light3.json b/YACReaderLibrary/themes/builtin_light3.json new file mode 100644 index 000000000..a6fd68a82 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_light3.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#EFEBD4", + "readMainColor": "#F85552", + "readTickColor": "#C74C4A", + "readingColor": "#DFA000", + "textColor": "#5C6A72" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#F4F0D9", + "backgroundColor": "#FDF6E3", + "headerBackgroundColor": "#F8F3E4", + "headerBorderColor": "#E6E2CC", + "headerGradientColor": "#F8F3E4", + "headerTextColor": "#5C6A72", + "itemBorderBottomColor": "#E6E2CC", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#FFFBEF", + "itemBorderTopWidth": 0, + "itemTextColor": "#4F5B58", + "selectedColor": "#5C6A72", + "selectedTextColor": "#FFFBEF", + "starRatingColor": "#DFA000", + "starRatingSelectedColor": "#FFFBEF" + }, + "comicsViewToolbar": { + "backgroundColor": "#FBF7EA", + "checkedBackgroundColor": "#E6E2CC", + "iconColor": "#5C6A72", + "separatorColor": "#E6E2CC" + }, + "contentSplitter": { + "handleColor": "#EFEBD4", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#708089" + }, + "emptyContainer": { + "backgroundColor": "#FDF6E3", + "iconColor": "#E6E2CC", + "titleTextColor": "#859289" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#E6E2CC", + "backgroundColor": "#FDF6E3", + "borderColor": "#E6E2CC", + "buttonColor": "#5C6A72", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FDF6E3", + "cellColor": "#FFFBEF", + "cellColorWithBackground": "#99FFFBEF", + "cellSelectedBorderColor": "#3A94C5", + "cellSelectedColor": "#F4F0D9", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#EFEBD4", + "continueReadingTextColor": "#4F5B58", + "currentComicBackgroundColor": "#88FDF6E3", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#DF69BA", + "favUncheckedColor": "#859289", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#FFFBEF", + "infoBorderColor": "#E6E2CC", + "infoMetadataTextColor": "#708089", + "infoScrollbarColor": "#FF708089", + "infoShadowColor": "#9DA9A0", + "infoTextColor": "#4F5B58", + "itemDetailsColor": "#708089", + "itemTitleColor": "#3F4B47", + "linkColor": "#3A94C5", + "newItemColor": "#FFDFA000", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#10E6E2CC", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#40D3C6AA", + "ratingSelectedColor": "#5C6A72", + "ratingUnselectedColor": "#859289", + "readTickCheckedColor": "#8DA101", + "readTickUncheckedColor": "#859289", + "scrollbarBorderColor": "#AAE6E2CC", + "scrollbarColor": "#88859289", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#4F5B58", + "linkColor": "#3A94C5" + }, + "importWidget": { + "backgroundColor": "#FDF6E3", + "coversDecorationBgColor": "#F4F0D9", + "coversDecorationShadowColor": "#E6E2CC", + "coversLabelColor": "#708089", + "coversViewBackgroundColor": "#F4F0D9", + "currentComicTextColor": "#708089", + "descriptionTextColor": "#708089", + "glowLineColor": "#DFA000", + "iconCheckedColor": "#8DA101", + "iconColor": "#5C6A72", + "modeIconColor": "#E6E2CC", + "titleTextColor": "#4F5B58" + }, + "libraryItem": { + "libraryIconColor": "#708089", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#FDF6E3", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#5C6A72", + "selectedTextColor": "#FFFFFF", + "textColor": "#4F5B58" + }, + "mainToolbar": { + "backgroundColor": "#FBF7EA", + "dividerColor": "#E6E2CC", + "folderNameColor": "#4F5B58", + "iconColor": "#4F5B58", + "iconDisabledColor": "#9DA9A0" + }, + "menuIcons": { + "iconColor": "#708089" + }, + "meta": { + "displayName": "Fadegreen", + "id": "builtin/light3", + "targetApp": "YACReaderLibrary", + "variant": "light", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#4F5B58", + "buttonBackgroundColor": "#F4F0D9", + "buttonBorderColor": "#E6E2CC", + "buttonTextColor": "#4F5B58", + "checkBoxTickColor": "#4F5B58", + "contentAltBackgroundColor": "#F4F0D9", + "contentBackgroundColor": "#FFFBEF", + "contentTextColor": "#4F5B58", + "dialogBackgroundColor": "#FDF6E3", + "downArrowColor": "#4F5B58", + "hyperlinkColor": "#3A94C5", + "labelBackgroundColor": "#FFFBEF", + "labelTextColor": "#4F5B58", + "navIconColor": "#4F5B58", + "radioCheckedBackgroundColor": "#E6E2CC", + "radioCheckedIndicatorColor": "#5C6A72", + "radioUncheckedColor": "#E6E2CC", + "rowIconColor": "#4F5B58", + "tableAltBackgroundColor": "#FDF6E3", + "tableBackgroundColor": "#FFFBEF", + "tableBorderColor": "#E6E2CC", + "tableHeaderBackgroundColor": "#F4F0D9", + "tableHeaderBorderColor": "#E6E2CC", + "tableHeaderGradientColor": "#EFEBD4", + "tableHeaderTextColor": "#5C6A72", + "tableScrollBackgroundColor": "#E6E2CC", + "tableScrollHandleColor": "#859289", + "tableSectionBorderDark": "#E6E2CC", + "tableSectionBorderLight": "#FFFFFF", + "tableSelectedColor": "#EFEBD4", + "toolButtonAccentColor": "#9DA9A0", + "upArrowColor": "#4F5B58" + }, + "navigationTree": { + "branchIndicatorColor": "#708089", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#708089", + "folderIconSelectedColor": "#FFFFFF", + "folderIconSelectedShadowColor": "#5C6A72", + "folderIconShadowColor": "#FDF6E3", + "folderNotCompletedColor": "#DFA000", + "folderReadOverlayColor": "#FFFFFF", + "folderReadOverlaySelectedColor": "#5C6A72", + "newItemColor": "#DFA000", + "scrollBackgroundColor": "#E6E2CC", + "scrollHandleColor": "#859289", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#5C6A72", + "textColor": "#4F5B58" + }, + "noLibrariesWidget": { + "backgroundColor": "#FDF6E3", + "descriptionTextColor": "#708089", + "iconColor": "#E6E2CC", + "noLibrariesLineColor": "#D3C6AA", + "textColor": "#4F5B58" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#3A94C5", + "currentlyReadingMainSelectedColor": "#3A94C5", + "currentlyReadingOuterColor": "#5C6A72", + "currentlyReadingOuterSelectedColor": "#5C6A72", + "favoritesMainColor": "#DF69BA", + "favoritesMainSelectedColor": "#DF69BA", + "labelColors": { + "blue": "#3A94C5", + "cyan": "#35A77C", + "dark": "#859289", + "green": "#8DA101", + "light": "#E6E2CC", + "orange": "#F57D26", + "pink": "#DF69BA", + "purple": "#A676E0", + "red": "#F85552", + "violet": "#7F6CD9", + "white": "#FDF6E3", + "yellow": "#DFA000" + }, + "labelShadowColor": "#9DA9A0", + "labelShadowSelectedColor": "#5C6A72", + "listDetailColor": "#FFFFFF", + "listDetailSelectedColor": "#5C6A72", + "listMainColor": "#708089", + "listMainSelectedColor": "#FFFFFF", + "listShadowColor": "#9DA9A0", + "listShadowSelectedColor": "#5C6A72", + "readingListMainColor": "#708089", + "readingListMainSelectedColor": "#FFFFFF", + "specialListShadowColor": "#9DA9A0", + "specialListShadowSelectedColor": "#5C6A72" + }, + "searchLineEdit": { + "backgroundColor": "#5C6A72", + "iconColor": "#FDF6E3", + "textColor": "#FFFFFF" + }, + "serverConfigDialog": { + "backgroundColor": "#FDF6E3", + "checkBoxTextColor": "#4F5B58", + "decorationColor": "#708089", + "labelTextColor": "#708089", + "propagandaTextColor": "#859289", + "qrBackgroundColor": "#FFFBEF", + "qrForegroundColor": "#5C6A72", + "qrMessageTextColor": "#9DA9A0", + "titleTextColor": "#3F4B47" + }, + "shortcutsIcons": { + "iconColor": "#708089" + }, + "sidebar": { + "backgroundColor": "#FFFBEF", + "busyIndicatorColor": "#3A94C5", + "sectionSeparatorColor": "#E6E2CC", + "separatorColor": "#859289", + "titleDropShadowColor": "#FDF6E3", + "titleTextColor": "#4F5B58", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#708089", + "shadowColor": "#FFFBEF", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#FFFBEF", + "closeButtonColor": "#4F5B58", + "contentTextColor": "#3F4B47", + "headerDecorationColor": "#8DA101", + "headerTextColor": "#3F4B47", + "linkColor": "#3A94C5", + "versionTextColor": "#859289" + } +} diff --git a/YACReaderLibrary/themes/builtin_light4.json b/YACReaderLibrary/themes/builtin_light4.json new file mode 100644 index 000000000..d9619ff9c --- /dev/null +++ b/YACReaderLibrary/themes/builtin_light4.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#E8DDD3", + "readMainColor": "#B4637A", + "readTickColor": "#9D536B", + "readingColor": "#EA9D34", + "textColor": "#6E6A86" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#F2E9E1", + "backgroundColor": "#FAF4ED", + "headerBackgroundColor": "#FFF8F1", + "headerBorderColor": "#D9CEC7", + "headerGradientColor": "#FFF8F1", + "headerTextColor": "#575279", + "itemBorderBottomColor": "#E8DDD3", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#FFFFFF", + "itemBorderTopWidth": 0, + "itemTextColor": "#575279", + "selectedColor": "#907AA9", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#EA9D34", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#FFF8F1", + "checkedBackgroundColor": "#E8DDD3", + "iconColor": "#575279", + "separatorColor": "#D9CEC7" + }, + "contentSplitter": { + "handleColor": "#E8DDD3", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#6E6A86" + }, + "emptyContainer": { + "backgroundColor": "#FAF4ED", + "iconColor": "#D9CEC7", + "titleTextColor": "#9893A5" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#D9CEC7", + "backgroundColor": "#FAF4ED", + "borderColor": "#E8DDD3", + "buttonColor": "#286983", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FFFFFF", + "cellColor": "#FFF8F2", + "cellColorWithBackground": "#99FFF8F2", + "cellSelectedBorderColor": "#907AA9", + "cellSelectedColor": "#FDF7F0", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#F2E9E1", + "continueReadingTextColor": "#575279", + "currentComicBackgroundColor": "#88FAF4ED", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#B4637A", + "favUncheckedColor": "#8E879C", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#FFF8F2", + "infoBorderColor": "#D9CEC7", + "infoMetadataTextColor": "#797593", + "infoScrollbarColor": "#FF8E879C", + "infoShadowColor": "#A59EAF", + "infoTextColor": "#575279", + "itemDetailsColor": "#6E6A86", + "itemTitleColor": "#4F4A72", + "linkColor": "#286983", + "newItemColor": "#FFEA9D34", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#10E8DDD3", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#40D9CEC7", + "ratingSelectedColor": "#907AA9", + "ratingUnselectedColor": "#8E879C", + "readTickCheckedColor": "#5E8D73", + "readTickUncheckedColor": "#8E879C", + "scrollbarBorderColor": "#AAD9CEC7", + "scrollbarColor": "#888E879C", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#4F4A72", + "linkColor": "#286983" + }, + "importWidget": { + "backgroundColor": "#FAF4ED", + "coversDecorationBgColor": "#E8DDD3", + "coversDecorationShadowColor": "#D9CEC7", + "coversLabelColor": "#6E6A86", + "coversViewBackgroundColor": "#E8DDD3", + "currentComicTextColor": "#6E6A86", + "descriptionTextColor": "#6E6A86", + "glowLineColor": "#EA9D34", + "iconCheckedColor": "#5E8D73", + "iconColor": "#575279", + "modeIconColor": "#F2E9E1", + "titleTextColor": "#575279" + }, + "libraryItem": { + "libraryIconColor": "#6E6A86", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#FAF4ED", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#907AA9", + "selectedTextColor": "#FFFFFF", + "textColor": "#575279" + }, + "mainToolbar": { + "backgroundColor": "#FFF8F1", + "dividerColor": "#D9CEC7", + "folderNameColor": "#575279", + "iconColor": "#575279", + "iconDisabledColor": "#B4AAB8" + }, + "menuIcons": { + "iconColor": "#6E6A86" + }, + "meta": { + "displayName": "Rose", + "id": "builtin/light4", + "targetApp": "YACReaderLibrary", + "variant": "light", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#575279", + "buttonBackgroundColor": "#F2E9E1", + "buttonBorderColor": "#D9CEC7", + "buttonTextColor": "#575279", + "checkBoxTickColor": "#575279", + "contentAltBackgroundColor": "#F2E9E1", + "contentBackgroundColor": "#FAF4ED", + "contentTextColor": "#575279", + "dialogBackgroundColor": "#FFF8F2", + "downArrowColor": "#575279", + "hyperlinkColor": "#286983", + "labelBackgroundColor": "#FAF4ED", + "labelTextColor": "#575279", + "navIconColor": "#907AA9", + "radioCheckedBackgroundColor": "#E8DDD3", + "radioCheckedIndicatorColor": "#575279", + "radioUncheckedColor": "#D9CEC7", + "rowIconColor": "#907AA9", + "tableAltBackgroundColor": "#FFF8F2", + "tableBackgroundColor": "#FAF4ED", + "tableBorderColor": "#D9CEC7", + "tableHeaderBackgroundColor": "#F2E9E1", + "tableHeaderBorderColor": "#D9CEC7", + "tableHeaderGradientColor": "#F2E9E1", + "tableHeaderTextColor": "#575279", + "tableScrollBackgroundColor": "#E8DDD3", + "tableScrollHandleColor": "#8E879C", + "tableSectionBorderDark": "#D9CEC7", + "tableSectionBorderLight": "#FFFFFF", + "tableSelectedColor": "#E8DDD3", + "toolButtonAccentColor": "#B4AAB8", + "upArrowColor": "#575279" + }, + "navigationTree": { + "branchIndicatorColor": "#6E6A86", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#6E6A86", + "folderIconSelectedColor": "#FFFFFF", + "folderIconSelectedShadowColor": "#907AA9", + "folderIconShadowColor": "#FAF4ED", + "folderNotCompletedColor": "#EA9D34", + "folderReadOverlayColor": "#FFFFFF", + "folderReadOverlaySelectedColor": "#907AA9", + "newItemColor": "#EA9D34", + "scrollBackgroundColor": "#F2E9E1", + "scrollHandleColor": "#8E879C", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#907AA9", + "textColor": "#575279" + }, + "noLibrariesWidget": { + "backgroundColor": "#FAF4ED", + "descriptionTextColor": "#6E6A86", + "iconColor": "#D9CEC7", + "noLibrariesLineColor": "#E8DDD3", + "textColor": "#575279" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#286983", + "currentlyReadingMainSelectedColor": "#286983", + "currentlyReadingOuterColor": "#907AA9", + "currentlyReadingOuterSelectedColor": "#907AA9", + "favoritesMainColor": "#B4637A", + "favoritesMainSelectedColor": "#B4637A", + "labelColors": { + "blue": "#286983", + "cyan": "#56949F", + "dark": "#797593", + "green": "#5E8D73", + "light": "#D9CEC7", + "orange": "#C8842F", + "pink": "#D7827E", + "purple": "#907AA9", + "red": "#B4637A", + "violet": "#7C6FA8", + "white": "#FAF4ED", + "yellow": "#EA9D34" + }, + "labelShadowColor": "#B4AAB8", + "labelShadowSelectedColor": "#907AA9", + "listDetailColor": "#FFFFFF", + "listDetailSelectedColor": "#907AA9", + "listMainColor": "#797593", + "listMainSelectedColor": "#FFFFFF", + "listShadowColor": "#B4AAB8", + "listShadowSelectedColor": "#907AA9", + "readingListMainColor": "#797593", + "readingListMainSelectedColor": "#FFFFFF", + "specialListShadowColor": "#B4AAB8", + "specialListShadowSelectedColor": "#907AA9" + }, + "searchLineEdit": { + "backgroundColor": "#575279", + "iconColor": "#FAF4ED", + "textColor": "#FFFFFF" + }, + "serverConfigDialog": { + "backgroundColor": "#FAF4ED", + "checkBoxTextColor": "#575279", + "decorationColor": "#6E6A86", + "labelTextColor": "#6E6A86", + "propagandaTextColor": "#797593", + "qrBackgroundColor": "#FFF8F2", + "qrForegroundColor": "#575279", + "qrMessageTextColor": "#A59EAF", + "titleTextColor": "#4F4A72" + }, + "shortcutsIcons": { + "iconColor": "#6E6A86" + }, + "sidebar": { + "backgroundColor": "#FFF7F1", + "busyIndicatorColor": "#286983", + "sectionSeparatorColor": "#E8DDD3", + "separatorColor": "#A59EAF", + "titleDropShadowColor": "#FFFFFF", + "titleTextColor": "#575279", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#6E6A86", + "shadowColor": "#FFF7F1", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#FFF8F2", + "closeButtonColor": "#575279", + "contentTextColor": "#4F4A72", + "headerDecorationColor": "#907AA9", + "headerTextColor": "#4F4A72", + "linkColor": "#286983", + "versionTextColor": "#A59EAF" + } +} diff --git a/YACReaderLibrary/themes/builtin_light5.json b/YACReaderLibrary/themes/builtin_light5.json new file mode 100644 index 000000000..f6fbaa3a8 --- /dev/null +++ b/YACReaderLibrary/themes/builtin_light5.json @@ -0,0 +1,264 @@ +{ + "comicFlow": { + "backgroundColor": "#E7DCCB", + "readMainColor": "#C84053", + "readTickColor": "#A53A49", + "readingColor": "#B98D3B", + "textColor": "#716E61" + }, + "comicsViewTable": { + "alternateBackgroundColor": "#F1E7D7", + "backgroundColor": "#F7F2E7", + "headerBackgroundColor": "#FCF7ED", + "headerBorderColor": "#D8CDBA", + "headerGradientColor": "#FCF7ED", + "headerTextColor": "#545464", + "itemBorderBottomColor": "#E3D8C7", + "itemBorderBottomWidth": 0, + "itemBorderTopColor": "#FFFFFF", + "itemBorderTopWidth": 0, + "itemTextColor": "#545464", + "selectedColor": "#5D57A3", + "selectedTextColor": "#FFFFFF", + "starRatingColor": "#B98D3B", + "starRatingSelectedColor": "#FFFFFF" + }, + "comicsViewToolbar": { + "backgroundColor": "#FCF7ED", + "checkedBackgroundColor": "#E7DCCB", + "iconColor": "#545464", + "separatorColor": "#D8CDBA" + }, + "contentSplitter": { + "handleColor": "#E3D8C7", + "horizontalHandleHeight": 4, + "verticalHandleWidth": 4 + }, + "dialogIcons": { + "iconColor": "#716E61" + }, + "emptyContainer": { + "backgroundColor": "#F7F2E7", + "iconColor": "#D8CDBA", + "titleTextColor": "#8A8980" + }, + "gridAndInfoView": { + "backgroundBlurOverlayColor": "#C9BDAA", + "backgroundColor": "#F7F2E7", + "borderColor": "#E3D8C7", + "buttonColor": "#4D699B", + "buttonShadowColor": "#AA000000", + "buttonTextColor": "#FFFFFF", + "cellColor": "#FFF9F0", + "cellColorWithBackground": "#99FFF9F0", + "cellSelectedBorderColor": "#5D57A3", + "cellSelectedColor": "#FBF6ED", + "comicCoverBorderColor": "#30FFFFFF", + "continueReadingBackgroundColor": "#F1E7D7", + "continueReadingTextColor": "#545464", + "currentComicBackgroundColor": "#88F7F2E7", + "currentComicCoverShadowColor": "#FF000000", + "favCheckedColor": "#B35B79", + "favUncheckedColor": "#7D7A73", + "folderCoverBorderColor": "#20FFFFFF", + "infoBackgroundColor": "#FFF9F0", + "infoBorderColor": "#D8CDBA", + "infoMetadataTextColor": "#716E61", + "infoScrollbarColor": "#FF7D7A73", + "infoShadowColor": "#8A8980", + "infoTextColor": "#545464", + "itemDetailsColor": "#716E61", + "itemTitleColor": "#43436C", + "linkColor": "#4D699B", + "newItemColor": "#FFB98D3B", + "placeholderFolder1BorderColor": "#20FFFFFF", + "placeholderFolder1Color": "#10E3D8C7", + "placeholderFolder2BorderColor": "#20FFFFFF", + "placeholderFolder2Color": "#40C9BDAA", + "ratingSelectedColor": "#5D57A3", + "ratingUnselectedColor": "#7D7A73", + "readTickCheckedColor": "#6F894E", + "readTickUncheckedColor": "#7D7A73", + "scrollbarBorderColor": "#AAD8CDBA", + "scrollbarColor": "#887D7A73", + "showDropShadow": true + }, + "helpAboutDialog": { + "headingColor": "#43436C", + "linkColor": "#4D699B" + }, + "importWidget": { + "backgroundColor": "#F7F2E7", + "coversDecorationBgColor": "#E7DCCB", + "coversDecorationShadowColor": "#D8CDBA", + "coversLabelColor": "#716E61", + "coversViewBackgroundColor": "#E7DCCB", + "currentComicTextColor": "#716E61", + "descriptionTextColor": "#716E61", + "glowLineColor": "#B98D3B", + "iconCheckedColor": "#6F894E", + "iconColor": "#545464", + "modeIconColor": "#E7DCCB", + "titleTextColor": "#545464" + }, + "libraryItem": { + "libraryIconColor": "#716E61", + "libraryIconSelectedColor": "#FFFFFF", + "libraryIconShadowColor": "#F7F2E7", + "libraryOptionsIconColor": "#FFFFFF", + "selectedBackgroundColor": "#5D57A3", + "selectedTextColor": "#FFFFFF", + "textColor": "#545464" + }, + "mainToolbar": { + "backgroundColor": "#FCF7ED", + "dividerColor": "#D8CDBA", + "folderNameColor": "#545464", + "iconColor": "#545464", + "iconDisabledColor": "#A6A294" + }, + "menuIcons": { + "iconColor": "#716E61" + }, + "meta": { + "displayName": "Lotus", + "id": "builtin/light5", + "targetApp": "YACReaderLibrary", + "variant": "light", + "version": "10.1.0" + }, + "metadataScraperDialog": { + "busyIndicatorColor": "#545464", + "buttonBackgroundColor": "#F1E7D7", + "buttonBorderColor": "#D8CDBA", + "buttonTextColor": "#545464", + "checkBoxTickColor": "#545464", + "contentAltBackgroundColor": "#F1E7D7", + "contentBackgroundColor": "#F7F2E7", + "contentTextColor": "#545464", + "dialogBackgroundColor": "#FFF9F0", + "downArrowColor": "#545464", + "hyperlinkColor": "#4D699B", + "labelBackgroundColor": "#F7F2E7", + "labelTextColor": "#545464", + "navIconColor": "#5D57A3", + "radioCheckedBackgroundColor": "#E7DCCB", + "radioCheckedIndicatorColor": "#545464", + "radioUncheckedColor": "#D8CDBA", + "rowIconColor": "#5D57A3", + "tableAltBackgroundColor": "#FFF9F0", + "tableBackgroundColor": "#F7F2E7", + "tableBorderColor": "#D8CDBA", + "tableHeaderBackgroundColor": "#F1E7D7", + "tableHeaderBorderColor": "#D8CDBA", + "tableHeaderGradientColor": "#F1E7D7", + "tableHeaderTextColor": "#545464", + "tableScrollBackgroundColor": "#E7DCCB", + "tableScrollHandleColor": "#7D7A73", + "tableSectionBorderDark": "#D8CDBA", + "tableSectionBorderLight": "#FFFFFF", + "tableSelectedColor": "#E7DCCB", + "toolButtonAccentColor": "#A6A294", + "upArrowColor": "#545464" + }, + "navigationTree": { + "branchIndicatorColor": "#716E61", + "branchIndicatorSelectedColor": "#FFFFFF", + "folderIconColor": "#716E61", + "folderIconSelectedColor": "#FFFFFF", + "folderIconSelectedShadowColor": "#5D57A3", + "folderIconShadowColor": "#F7F2E7", + "folderNotCompletedColor": "#B98D3B", + "folderReadOverlayColor": "#FFFFFF", + "folderReadOverlaySelectedColor": "#5D57A3", + "newItemColor": "#B98D3B", + "scrollBackgroundColor": "#F1E7D7", + "scrollHandleColor": "#7D7A73", + "selectedTextColor": "#FFFFFF", + "selectionBackgroundColor": "#5D57A3", + "textColor": "#545464" + }, + "noLibrariesWidget": { + "backgroundColor": "#F7F2E7", + "descriptionTextColor": "#716E61", + "iconColor": "#D8CDBA", + "noLibrariesLineColor": "#E3D8C7", + "textColor": "#545464" + }, + "readingListIcons": { + "currentlyReadingMainColor": "#4D699B", + "currentlyReadingMainSelectedColor": "#4D699B", + "currentlyReadingOuterColor": "#5D57A3", + "currentlyReadingOuterSelectedColor": "#5D57A3", + "favoritesMainColor": "#B35B79", + "favoritesMainSelectedColor": "#B35B79", + "labelColors": { + "blue": "#4D699B", + "cyan": "#597B75", + "dark": "#716E61", + "green": "#6F894E", + "light": "#D8CDBA", + "orange": "#CC6D00", + "pink": "#B35B79", + "purple": "#7E6C9A", + "red": "#C84053", + "violet": "#5D57A3", + "white": "#F7F2E7", + "yellow": "#B98D3B" + }, + "labelShadowColor": "#A6A294", + "labelShadowSelectedColor": "#5D57A3", + "listDetailColor": "#FFFFFF", + "listDetailSelectedColor": "#5D57A3", + "listMainColor": "#716E61", + "listMainSelectedColor": "#FFFFFF", + "listShadowColor": "#A6A294", + "listShadowSelectedColor": "#5D57A3", + "readingListMainColor": "#716E61", + "readingListMainSelectedColor": "#FFFFFF", + "specialListShadowColor": "#A6A294", + "specialListShadowSelectedColor": "#5D57A3" + }, + "searchLineEdit": { + "backgroundColor": "#545464", + "iconColor": "#F7F2E7", + "textColor": "#FFFFFF" + }, + "serverConfigDialog": { + "backgroundColor": "#F7F2E7", + "checkBoxTextColor": "#545464", + "decorationColor": "#716E61", + "labelTextColor": "#716E61", + "propagandaTextColor": "#8A8980", + "qrBackgroundColor": "#FFF9F0", + "qrForegroundColor": "#545464", + "qrMessageTextColor": "#A6A294", + "titleTextColor": "#43436C" + }, + "shortcutsIcons": { + "iconColor": "#716E61" + }, + "sidebar": { + "backgroundColor": "#FBF6EC", + "busyIndicatorColor": "#4D699B", + "sectionSeparatorColor": "#E3D8C7", + "separatorColor": "#8A8980", + "titleDropShadowColor": "#FFFFFF", + "titleTextColor": "#545464", + "uppercaseLabels": true + }, + "sidebarIcons": { + "iconColor": "#716E61", + "shadowColor": "#FBF6EC", + "useSystemFolderIcons": false + }, + "whatsNewDialog": { + "backgroundColor": "#FFF9F0", + "closeButtonColor": "#545464", + "contentTextColor": "#43436C", + "headerDecorationColor": "#5D57A3", + "headerTextColor": "#43436C", + "linkColor": "#4D699B", + "versionTextColor": "#A6A294" + } +} diff --git a/YACReaderLibrary/themes/theme.h b/YACReaderLibrary/themes/theme.h new file mode 100644 index 000000000..6117dd4fd --- /dev/null +++ b/YACReaderLibrary/themes/theme.h @@ -0,0 +1,517 @@ +#ifndef THEME_H +#define THEME_H + +#include "help_about_dialog_theme.h" +#include "theme_meta.h" +#include "whats_new_dialog_theme.h" +#include "yacreader_icon.h" + +#include + +struct MetadataScraperDialogThemeTemplates { + QString defaultLabelQSS = "QLabel {color:%1; font-size:12px;font-family:Arial;}"; + QString titleLabelQSS = "QLabel {color:%1; font-size:18px;font-family:Arial;}"; + QString coverLabelQSS = "QLabel {background-color: %1; color:%2; font-size:12px; font-family:Arial; }"; + + QString radioButtonQSS = "QRadioButton {margin-left:27px; margin-top:5px; color:%1;font-size:12px;font-family:Arial;}" + "QRadioButton::indicator {width:11px;height:11px;}" + "QRadioButton::indicator::unchecked {image : url(%2);}" + "QRadioButton::indicator::checked {image : url(%3);}"; + + QString checkBoxQSS = "QCheckBox {" + " color: %1;" + " font-size: 12px;" + " font-family: Arial;" + " spacing: 10px;" + "}" + "QCheckBox::indicator {" + " width: 13px;" + " height: 13px;" + " border: 1px solid %2;" + " background: %3;" + "}" + "QCheckBox::indicator:checked {" + " image: url(%4);" + " background: %3;" + "}" + "QCheckBox::indicator:unchecked {" + " background: %3;" + "}"; + + QString scraperLineEditTitleLabelQSS = "QLabel {color:%1;}"; + QString scraperLineEditQSS = "QLineEdit {" + "border:none; background-color: %1; color : %2; padding-left: %3; padding-bottom: 1px; margin-bottom: 0px;" + "}"; + + QString scraperToolButtonQSS = "QPushButton {border: none; background: %1; color:%2; border-radius:2px;}" + "QPushButton::pressed {border: none; background: %3; color:%2; border-radius:2px;}"; + QString scraperToolButtonSeparatorQSS = "QWidget {background:%1;}"; + + QString scraperScrollLabelTextQSS = "QLabel {background-color: %1; color:%2; font-size:12px; font-family:Arial; } QLabel::link { color: %3; font-size:12px; font-family:Arial; }"; + QString scraperScrollLabelScrollAreaQSS = "QScrollArea {background-color:%1; border:none;}" + "QScrollBar:vertical { border: none; background: %1; width: 3px; margin: 0; }" + "QScrollBar:horizontal { border: none; background: %1; height: 3px; margin: 0; }" + "QScrollBar::handle:vertical { background: %2; width: 7px; min-height: 20px; }" + "QScrollBar::handle:horizontal { background: %2; width: 7px; min-height: 20px; }" + "QScrollBar::add-line:vertical { border: none; background: %3; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::sub-line:vertical { border: none; background: %3; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::add-line:horizontal { border: none; background: %3; width: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 0 3px 0;}" + "QScrollBar::sub-line:horizontal { border: none; background: %3; width: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 0 3px 0;}" + "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" + "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" + "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {background: none; }"; + + QString scraperTableViewQSS = "QTableView {color:%1; border:0px;alternate-background-color: %2;background-color: %3; outline: 0px;}" + "QTableView::item {outline: 0px; border: 0px; color:%1;}" + "QTableView::item:selected {outline: 0px; background-color: %4; }" + "QHeaderView::section:horizontal {background-color:%5; border-bottom:1px solid %6; border-right:1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 %14, stop: 1 %6); border-left:none; border-top:none; padding:4px; color:%7;}" + "QHeaderView::section:vertical {border-bottom: 1px solid %8;border-top: 1px solid %9;}" + "QHeaderView::down-arrow {image: url('%12');width: 8px;height: 7px;padding-right: 10px;}" + "QHeaderView::up-arrow {image: url('%13');width: 8px;height: 7px; padding-right: 10px;}" + "QScrollBar:vertical { border: none; background: %3; width: 3px; margin: 0; }" + "QScrollBar:horizontal { border: none; background: %3; height: 3px; margin: 0; }" + "QScrollBar::handle:vertical { background: %10; width: 7px; min-height: 20px; }" + "QScrollBar::handle:horizontal { background: %10; width: 7px; min-height: 20px; }" + "QScrollBar::add-line:vertical { border: none; background: %11; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::sub-line:vertical { border: none; background: %11; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::add-line:horizontal { border: none; background: %11; width: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 0 3px 0;}" + "QScrollBar::sub-line:horizontal { border: none; background: %11; width: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 0 3px 0;}" + "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" + "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" + "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal {background: none; }"; + + QString dialogQSS = "QDialog {background-color: %1; }"; + QString dialogButtonsQSS = "QPushButton {border: 1px solid %1; background: %2; color:%3; padding: 5px 26px 5px 26px; font-size:12px;font-family:Arial; font-weight:bold;}"; + + QString nextPageIcon = ":/images/comic_vine/nextPage.svg"; + QString previousPageIcon = ":/images/comic_vine/previousPage.svg"; + QSize pageIconSize = QSize(7, 8); + + QString rowUpIcon = ":/images/comic_vine/rowUp.svg"; + QString rowDownIcon = ":/images/comic_vine/rowDown.svg"; + QSize rowIconSize = QSize(8, 7); +}; + +struct ComicFlowTheme { + QColor backgroundColor; + QColor textColor; + QPixmap readPixmap; + QPixmap readingPixmap; +}; + +struct ComicsViewTableThemeTemplates { + QString tableViewQSS = "QTableView {alternate-background-color: %1; background-color: %2; outline: 0px; border: none;}" + "QTableCornerButton::section {background-color:%3; border:none; border-bottom:1px solid %4; border-right:1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 %5, stop: 1 %4);}" + "QTableView::item {outline: 0px; border-bottom: %12px solid %6; border-top: %13px solid %7; padding-bottom:1px; color:%8;}" + "QTableView::item:selected {outline: 0px; border-bottom: %12px solid %9; border-top: %13px solid %9; padding-bottom:1px; background-color: %9; color: %10; }" + "QHeaderView::section:horizontal {background-color:%3; border-bottom:1px solid %4; border-right:1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 %5, stop: 1 %4); border-left:none; border-top:none; padding:4px; color:%11;}" + "QHeaderView::section:vertical {border-bottom: 1px solid %6; border-top: 1px solid %7;}"; +}; + +struct ComicsViewTableTheme { + QString tableViewQSS; + QColor starRatingColor; + QColor starRatingSelectedColor; +}; + +struct EmptyContainerThemeTemplates { + QString titleLabelQSS = "QLabel {color:%1; font-size:24px;font-family:Arial;font-weight:bold;}"; +}; + +struct EmptyContainerTheme { + QColor backgroundColor; + QString titleLabelQSS; + + // Search-related icons (themed from search_result.svg) + QPixmap searchingIcon; // For ClassicComicsView searching state + QPixmap noSearchResultsIcon; // For NoSearchResultsWidget empty state + + // Empty container icons (themed from SVGs) + QPixmap emptyFolderIcon; + QPixmap emptyFavoritesIcon; + QPixmap emptyCurrentReadingsIcon; + QPixmap emptyReadingListIcon; + QMap emptyLabelIcons; // Keyed by YACReader::LabelColors enum value +}; + +struct NoLibrariesWidgetTheme { + QColor backgroundColor; // Background of the widget + QColor textColor; // Main title text color + QColor descriptionTextColor; // Description text color + QPixmap noLibrariesIcon; // Icon displayed in the widget + QPixmap noLibrariesLinePixmap; // Themed horizontal line separator +}; + +struct SidebarTheme { + QColor backgroundColor; + QColor separatorColor; + QColor sectionSeparatorColor; // Horizontal separators between sidebar sections + QString splitterQSS = "QSplitter::handle { image: none; background-color: transparent; }" + "QSplitter::handle:vertical { height: 39px; }"; + + // When true, section title strings are uppercased after translation + bool uppercaseLabels; + + // Title bar colors + QColor titleTextColor; + QColor titleDropShadowColor; + QColor busyIndicatorColor; +}; + +struct ImportWidgetThemeTemplates { + QString titleLabelQSS = "QLabel {color:%1; font-size:25px;font-weight:bold;}"; +}; + +struct ImportWidgetTheme { + QColor backgroundColor; + QString titleLabelQSS; + QColor descriptionTextColor; + QColor currentComicTextColor; + QColor coversViewBackgroundColor; + QColor coversLabelColor; + + QPixmap topCoversDecoration; + QPixmap bottomCoversDecoration; + QPixmap importingIcon; + QPixmap updatingIcon; + QIcon coversToggleIcon; + QPixmap glowLinePixmap; // Themed glow line animation +}; + +struct NavigationTreeThemeTemplates { + // Styled tree view template with custom scroll bars + // %1 = text color, %2 = selection/hover background, %3 = scroll background, %4 = scroll handle, %5 = selected text color + QString navigationTreeQSS = "QTreeView {background-color:transparent; border: none; color:%1; outline:0; show-decoration-selected: 0;}" + "QTreeView::item:selected {background-color: %2; color:%5; font:bold;}" + "QTreeView::item:hover {background-color:%2; color:%5; font:bold;}" + "QTreeView::branch:selected {background-color:%2;}" + "QScrollBar:vertical { border: none; background: %3; width: 7px; margin: 0 3px 0 0; }" + "QScrollBar::handle:vertical { background: %4; width: 7px; min-height: 20px; }" + "QScrollBar::add-line:vertical { border: none; background: %3; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::sub-line:vertical { border: none; background: %3; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" + "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" + "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" + "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }" + "QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings {border-image: none;image: url('%6');}" + "QTreeView::branch:has-children:selected:!has-siblings:closed,QTreeView::branch:closed:selected:has-children:has-siblings {border-image: none;image: url('%8');}" + "QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings {border-image: none;image: url('%7');}" + "QTreeView::branch:open:has-children:selected:!has-siblings,QTreeView::branch:open:has-children:selected:has-siblings {border-image: none;image: url('%9');}"; +}; + +struct NavigationTreeTheme { + QString navigationTreeQSS; + QColor folderNotCompletedColor; // Left-edge bar for folders not yet fully read + QColor newItemColor; // Dot for recently added/updated folders + + // Branch indicator icon paths (used by QSS url()) + QString branchClosedIconPath; + QString branchOpenIconPath; + QString branchClosedIconSelectedPath; + QString branchOpenIconSelectedPath; + + // Folder icons (normal and selected states, including finished/read tick variant) + QIcon folderIcon; + QIcon folderFinishedIcon; +}; + +// Grid and info view theme colors (used by GridComicsView, FolderContentView, InfoComicsView) +struct GridAndInfoViewTheme { + // Grid colors + QColor backgroundColor; + QColor cellColor; + QColor cellColorWithBackground; + QColor cellSelectedColor; + QColor cellSelectedBorderColor; + QColor borderColor; + QColor itemTitleColor; + QColor itemDetailsColor; + bool showDropShadow; + + // Info panel colors + QColor infoBackgroundColor; + QString topShadow; // Recolored SVG path + QString infoShadow; // Recolored SVG path + QString infoIndicator; // Recolored SVG path + QColor infoMetadataTextColor; + QColor infoTextColor; + + // Rating and favorite colors + QColor ratingUnselectedColor; + QColor ratingSelectedColor; + QColor favUncheckedColor; + QColor favCheckedColor; + QColor readTickUncheckedColor; + QColor readTickCheckedColor; + + // Current comic banner + QColor currentComicBackgroundColor; + + // Continue reading section (FolderContentView) + QColor continueReadingBackgroundColor; + QColor continueReadingTextColor; + + // Blur overlay background (FlowView always, GridView when background image enabled) + QColor backgroundBlurOverlayColor; + + // New item indicator dot (cover grid and folder grid) + QColor newItemColor; + + // Button colors + QColor buttonColor; + QColor buttonTextColor; + QColor linkColor; + + // Scrollbar colors — content grid (on backgroundColor) + QColor scrollbarColor; + QColor scrollbarBorderColor; + + // Scrollbar color — info panel (on infoBackgroundColor) + QColor infoScrollbarColor; + + // Cover overlay / border effects + QColor comicCoverBorderColor; + QColor folderCoverBorderColor; + QColor placeholderFolder1Color; + QColor placeholderFolder1BorderColor; + QColor placeholderFolder2Color; + QColor placeholderFolder2BorderColor; + + // Drop shadow effects + QColor currentComicCoverShadowColor; + QColor buttonShadowColor; +}; + +struct MainToolbarThemeTemplates { + // Toolbar QSS: %1 = background color + QString toolbarQSS = "QToolButton {border:none;}"; + + // Folder name label QSS: %1 = text color + QString folderNameLabelQSS = "QLabel {color:%1; font-size:22px; font-weight:bold;}"; +}; + +struct ContentSplitterThemeTemplates { + QString horizontalSplitterQSS = "QSplitter::handle { image: none; background-color: %1; height: %2px; }"; + QString verticalSplitterQSS = "QSplitter::handle { image: none; background-color: %1; height: %2px; }"; +}; + +struct ComicsViewToolbarThemeTemplates { + QString toolbarQSS = "QToolBar { border: none; background: %1; }\n" + "QToolBar::separator { background: %2; width: 1px; margin: 5px 4px; }\n" + "QToolButton:checked { background-color: %3; }\n"; +}; + +struct SearchLineEditThemeTemplates { + // %1 = text color, %2 = background color, %3 = padding-left, %4 = padding-right + QString lineEditQSS = "QLineEdit {color: %1; border:none; border-radius: 4px; background-color:%2; padding-left: %3px; padding-right: %4px; padding-bottom: 1px; margin-right: 9px;} "; + QString searchLabelQSS = "QLabel { border: none; padding: 0px; }"; + QString clearButtonQSS = "QToolButton { border: none; padding: 0px; }"; +}; + +struct ContentSplitterTheme { + QString horizontalSplitterQSS; // For Qt::Horizontal splitters (vertical handle bar) + QString verticalSplitterQSS; // For Qt::Vertical splitters (horizontal handle bar) +}; + +struct SidebarIconsTheme { + // When true, use QFileIconProvider for folder icons and overlay folderReadOverlay for finished folders + // When false, use the themed folderIcon and folderFinishedIcon from NavigationTreeTheme + bool useSystemFolderIcons; + QPixmap folderReadOverlay; // Tick overlay drawn on system folder icons when useSystemFolderIcons is true + + // Library icon (for YACReaderLibraryItemWidget - unselected state) + QIcon libraryIcon; + + // Action icons (for LibraryWindowActions - toolbar buttons) + QIcon newLibraryIcon; + QIcon openLibraryIcon; + QIcon addNewIcon; + QIcon deleteIcon; + QIcon setRootIcon; + QIcon expandIcon; + QIcon colapseIcon; + QIcon addLabelIcon; + QIcon renameListIcon; +}; + +struct LibraryItemTheme { + QColor textColor; + QColor selectedTextColor; + QColor selectedBackgroundColor; + QIcon libraryIconSelected; // Library icon when selected + QIcon libraryOptionsIcon; // Options icon (shown only when selected) +}; + +struct SearchLineEditTheme { + QString lineEditQSS; + QString searchLabelQSS; + QString clearButtonQSS; + QPixmap searchIcon; + QPixmap clearIcon; +}; + +struct ReadingListIconsTheme { + // Label icons by color name (red, orange, yellow, green, cyan, blue, violet, purple, pink, white, light, dark) + QMap labelIcons; + + // Special list icons (Reading, Favorites, Currently Reading) + QIcon readingListIcon; // default_0 - bookmark + QIcon favoritesIcon; // default_1 - heart + QIcon currentlyReadingIcon; // default_2 - circle with star + + // Reading list icon + QIcon listIcon; +}; + +struct DialogIconsTheme { + QPixmap newLibraryIcon; + QPixmap openLibraryIcon; + QPixmap editIcon; + QPixmap exportComicsInfoIcon; + QPixmap importComicsInfoIcon; + QPixmap exportLibraryIcon; + QPixmap importLibraryIcon; + QIcon findFolderIcon; +}; + +struct MenuIconsTheme { + // Library context menu + QIcon exportComicsInfoIcon; + QIcon importComicsInfoIcon; + QIcon exportLibraryIcon; + QIcon importLibraryIcon; + QIcon updateLibraryIcon; + QIcon renameLibraryIcon; // editIcon + QIcon removeLibraryIcon; + + // Folder/Comic context menu + QIcon openContainingFolderIcon; + QIcon updateCurrentFolderIcon; + + // App + QIcon quitIcon; +}; + +struct ShortcutsIconsTheme { + QIcon comicsIcon; + QIcon foldersIcon; + QIcon generalIcon; + QIcon librariesIcon; + QIcon visualizationIcon; +}; + +struct ServerConfigDialogTheme { + QString dialogQSS; + QString titleLabelQSS; + QString qrMessageLabelQSS; + QString propagandaLabelQSS; + QString labelQSS; + QString checkBoxQSS; + QColor qrBackgroundColor; + QColor qrForegroundColor; + QPixmap backgroundDecoration; +}; + +struct ComicsViewToolbarTheme { + QString toolbarQSS; + + QIcon openInYACReaderIcon; + QIcon setAsReadIcon; + QIcon setAsUnreadIcon; + QIcon showComicInfoIcon; + QIcon setAsNormalIcon; + QIcon setAsMangaIcon; + QIcon editComicIcon; + QIcon getInfoIcon; + QIcon assignNumberIcon; + QIcon selectAllIcon; + QIcon deleteIcon; + QIcon hideComicFlowIcon; + QIcon showMarksIcon; + QIcon showRecentIndicatorIcon; + QIcon bigGridZoomIcon; + QIcon smallGridZoomIcon; +}; + +struct MainToolbarTheme { + QColor backgroundColor; + QColor folderNameColor; + QPixmap dividerPixmap; + + // Icons (contain both Normal and Disabled states) + QIcon backIcon; + QIcon forwardIcon; + QIcon settingsIcon; + QIcon serverIcon; + QIcon helpIcon; + QIcon gridIcon; + QIcon flowIcon; + QIcon infoIcon; + QIcon fullscreenIcon; + + // QSS + QString toolbarQSS; + QString folderNameLabelQSS; +}; + +struct MetadataScraperDialogTheme { + QString defaultLabelQSS; + QString titleLabelQSS; + QString coverLabelQSS; + QString radioButtonQSS; + QString checkBoxQSS; + + QString scraperLineEditTitleLabelQSS; + QString scraperLineEditQSS; + + QString scraperToolButtonQSS; + QString scraperToolButtonSeparatorQSS; + QColor scraperToolButtonFillColor; + + QString scraperScrollLabelTextQSS; + QString scraperScrollLabelScrollAreaQSS; + + QString scraperTableViewQSS; + + QString dialogQSS; + QString dialogButtonsQSS; + + QString noBorderToolButtonQSS = "QToolButton { border: none; }"; + + QColor busyIndicatorColor; + + YACReaderIcon nextPageIcon; + YACReaderIcon previousPageIcon; + + YACReaderIcon rowUpIcon; + YACReaderIcon rowDownIcon; +}; + +struct Theme { + ThemeMeta meta; + QJsonObject sourceJson; + + ComicFlowTheme comicFlow; + MetadataScraperDialogTheme metadataScraperDialog; + HelpAboutDialogTheme helpAboutDialog; + WhatsNewDialogTheme whatsNewDialog; + EmptyContainerTheme emptyContainer; + NoLibrariesWidgetTheme noLibrariesWidget; + SidebarTheme sidebar; + SidebarIconsTheme sidebarIcons; + LibraryItemTheme libraryItem; + ImportWidgetTheme importWidget; + ServerConfigDialogTheme serverConfigDialog; + NavigationTreeTheme navigationTree; + ComicsViewTableTheme comicsViewTable; + GridAndInfoViewTheme gridAndInfoView; + MainToolbarTheme mainToolbar; + ContentSplitterTheme contentSplitter; + ComicsViewToolbarTheme comicsViewToolbar; + SearchLineEditTheme searchLineEdit; + ReadingListIconsTheme readingListIcons; + DialogIconsTheme dialogIcons; + MenuIconsTheme menuIcons; + ShortcutsIconsTheme shortcutsIcons; +}; + +#endif // THEME_H diff --git a/YACReaderLibrary/themes/theme_factory.cpp b/YACReaderLibrary/themes/theme_factory.cpp new file mode 100644 index 000000000..9ecf3e6db --- /dev/null +++ b/YACReaderLibrary/themes/theme_factory.cpp @@ -0,0 +1,1291 @@ +#include "theme_factory.h" + +#include "icon_utils.h" +#include "yacreader_global.h" + +#include +#include +#include +#include + +struct MetadataScraperDialogParams { + MetadataScraperDialogThemeTemplates t; + + QColor contentTextColor; + QColor contentBackgroundColor; + QColor contentAltBackgroundColor; + QColor dialogBackgroundColor; + + QColor tableBackgroundColor; + QColor tableAltBackgroundColor; + QColor tableBorderColor; + QColor tableSelectedColor; + QColor tableHeaderBackgroundColor; + QColor tableHeaderGradientColor; + QColor tableHeaderBorderColor; + QColor tableHeaderTextColor; + QColor tableScrollHandleColor; + QColor tableScrollBackgroundColor; + QColor tableSectionBorderLight; + QColor tableSectionBorderDark; + + QColor labelTextColor; + QColor labelBackgroundColor; + QColor hyperlinkColor; // TODO: it doesn't work + + QColor buttonBackgroundColor; + QColor buttonTextColor; + QColor buttonBorderColor; + + QColor radioUncheckedColor; + + QColor radioCheckedBackgroundColor; + QColor radioCheckedIndicatorColor; + + QColor checkBoxTickColor; + + QColor toolButtonAccentColor; + + QColor downArrowColor; + QColor upArrowColor; + + QColor busyIndicatorColor; + QColor navIconColor; + QColor rowIconColor; +}; + +struct EmptyContainerParams { + EmptyContainerThemeTemplates t; + + QColor backgroundColor; + QColor titleTextColor; + + QColor iconColor; +}; + +struct NoLibrariesWidgetParams { + QColor backgroundColor; + QColor textColor; + QColor descriptionTextColor; + QColor iconColor; + QColor noLibrariesLineColor; +}; + +struct SidebarParams { + QColor backgroundColor; + QColor separatorColor; + QColor sectionSeparatorColor; // Horizontal separators between sidebar sections + + bool uppercaseLabels; + + // Title bar colors + QColor titleTextColor; + QColor titleDropShadowColor; + QColor busyIndicatorColor; +}; + +struct ImportWidgetParams { + ImportWidgetThemeTemplates t; + + QColor backgroundColor; + QColor titleTextColor; + QColor descriptionTextColor; + QColor currentComicTextColor; + QColor coversViewBackgroundColor; + QColor coversLabelColor; + QColor coversDecorationBgColor; + QColor coversDecorationShadowColor; + QColor modeIconColor; + QColor iconColor; + QColor iconCheckedColor; + QColor glowLineColor; +}; + +struct NavigationTreeParams { + NavigationTreeThemeTemplates t; + + QColor textColor; + QColor selectionBackgroundColor; + QColor scrollBackgroundColor; + QColor scrollHandleColor; + QColor selectedTextColor; + QColor folderNotCompletedColor; + QColor newItemColor; + + // Branch indicator icon colors (independent of sidebarIcons.iconColor) + QColor branchIndicatorColor; + QColor branchIndicatorSelectedColor; + + // Folder icon colors (own parameters, independent of sidebarIcons) + QColor folderIconColor; // Main color for unselected folder (#f0f) + QColor folderIconShadowColor; // Shadow color for unselected folder (#0ff) + QColor folderIconSelectedColor; // Main color for selected folder (#f0f) + QColor folderIconSelectedShadowColor; // Shadow color for selected folder (#0ff) + QColor folderReadOverlayColor; // Tick/checkmark color for unselected folder (#ff0 in folder_finished, #f0f in folder_read_overlay.svg) + QColor folderReadOverlaySelectedColor; // Tick/checkmark color for selected folder +}; + +struct ComicsViewTableParams { + ComicsViewTableThemeTemplates t; + + QColor alternateBackgroundColor; + QColor backgroundColor; + QColor headerBackgroundColor; + QColor headerBorderColor; + QColor headerGradientColor; + QColor itemBorderBottomColor; + QColor itemBorderTopColor; + int itemBorderBottomWidth; // px + int itemBorderTopWidth; // px + QColor itemTextColor; + QColor selectedColor; + QColor selectedTextColor; + QColor headerTextColor; + + QColor starRatingColor; + QColor starRatingSelectedColor; +}; + +struct GridAndInfoViewParams { + // Grid colors + QColor backgroundColor; + QColor cellColor; + QColor cellColorWithBackground; + QColor cellSelectedColor; + QColor cellSelectedBorderColor; + QColor borderColor; + QColor itemTitleColor; + QColor itemDetailsColor; + bool showDropShadow; + + // Info panel colors + QColor infoBackgroundColor; + QColor infoBorderColor; + QColor infoShadowColor; + QColor infoMetadataTextColor; + QColor infoTextColor; + + // Rating and favorite colors + QColor ratingUnselectedColor; + QColor ratingSelectedColor; + QColor favUncheckedColor; + QColor favCheckedColor; + QColor readTickUncheckedColor; + QColor readTickCheckedColor; + + // Current comic banner + QColor currentComicBackgroundColor; + + // Continue reading section (FolderContentView) + QColor continueReadingBackgroundColor; + QColor continueReadingTextColor; + + // Blur overlay background (FlowView always, GridView when background image enabled) + QColor backgroundBlurOverlayColor; + + // New item indicator dot + QColor newItemColor; + + // Button colors + QColor buttonColor; + QColor buttonTextColor; + QColor linkColor; + + // Scrollbar colors — content grid + QColor scrollbarColor; + QColor scrollbarBorderColor; + + // Scrollbar color — info panel + QColor infoScrollbarColor; + + // Cover overlay / border effects + QColor comicCoverBorderColor; + QColor folderCoverBorderColor; + QColor placeholderFolder1Color; + QColor placeholderFolder1BorderColor; + QColor placeholderFolder2Color; + QColor placeholderFolder2BorderColor; + + // Drop shadow effects + QColor currentComicCoverShadowColor; + QColor buttonShadowColor; +}; + +struct MainToolbarParams { + MainToolbarThemeTemplates t; + + QColor backgroundColor; + QColor folderNameColor; + QColor dividerColor; + QColor iconColor; + QColor iconDisabledColor; +}; + +struct ContentSplitterParams { + ContentSplitterThemeTemplates t; + + QColor handleColor; + int horizontalHandleHeight; // for vertical splitter (horizontal handle) + int verticalHandleWidth; // for horizontal splitter (vertical handle) +}; + +struct SidebarIconsParams { + // Icon colors - #f0f placeholder gets replaced with these + QColor iconColor; // Main icon color (replaces #f0f) + QColor shadowColor; // Shadow color (replaces #0ff) + + // When true, use QFileIconProvider for folder icons and overlay a tick for finished folders + bool useSystemFolderIcons; +}; + +struct ServerConfigDialogThemeTemplates { + QString dialogQSS = "ServerConfigDialog { background-color: %1; }"; + QString titleLabelQSS = "QLabel { color: %1; font-size: 30px; font-family: Arial; }"; + QString qrMessageLabelQSS = "QLabel { color: %1; font-size: 18px; font-family: Arial; }"; + QString propagandaLabelQSS = "QLabel { color: %1; font-size: 13px; font-family: Arial; font-style: italic; }"; + QString labelQSS = "QLabel { color: %1; font-size: 18px; font-family: Arial; }"; + QString checkBoxQSS = "QCheckBox { color: %1; font-size: 13px; font-family: Arial; }"; +}; + +struct LibraryItemParams { + QColor textColor; + QColor selectedTextColor; + QColor selectedBackgroundColor; + QColor libraryIconColor; + QColor libraryIconShadowColor; + QColor libraryIconSelectedColor; + QColor libraryOptionsIconColor; // Color for the options icon (shown only when selected) +}; + +struct ComicsViewToolbarParams { + ComicsViewToolbarThemeTemplates t; + + QColor backgroundColor; + QColor separatorColor; + QColor checkedBackgroundColor; + QColor iconColor; +}; + +struct SearchLineEditParams { + SearchLineEditThemeTemplates t; + + QColor textColor; + QColor backgroundColor; + QColor iconColor; // Main icon color (replaces #f0f) +}; + +struct ReadingListIconsParams { + QMap labelColors; // Label colors by name (e.g., "red" -> #f67a7b) + QColor labelShadowColor; // Shadow color for labels (replaces #0ff) + QColor labelShadowSelectedColor; // Shadow color for labels when selected/hovered + + // Special list icon colors + QColor readingListMainColor; // default_0 main color (replaces #f0f) + QColor readingListMainSelectedColor; // default_0 main color when selected/hovered + QColor favoritesMainColor; // default_1 main color (replaces #f0f) + QColor favoritesMainSelectedColor; // default_1 main color when selected/hovered + QColor currentlyReadingMainColor; // default_2 main color (replaces #f0f) + QColor currentlyReadingMainSelectedColor; // default_2 main color when selected/hovered + QColor currentlyReadingOuterColor; // default_2 outer circle (replaces #ff0) + QColor currentlyReadingOuterSelectedColor; // default_2 outer circle when selected/hovered + QColor specialListShadowColor; // Shadow color for special lists (replaces #0ff) + QColor specialListShadowSelectedColor; // Shadow color for special lists when selected/hovered + + // List icon colors + QColor listMainColor; // main color (replaces #f0f) + QColor listMainSelectedColor; // main color when selected/hovered + QColor listShadowColor; // shadow color (replaces #0ff) + QColor listShadowSelectedColor; // shadow color when selected/hovered + QColor listDetailColor; // detail/checkbox color (replaces #ff0) + QColor listDetailSelectedColor; // detail/checkbox color when selected/hovered +}; + +struct DialogIconsParams { + QColor iconColor; // Main icon color (replaces #f0f) +}; + +struct MenuIconsParams { + QColor iconColor; // Main icon color (replaces #f0f) +}; + +struct ShortcutsIconsParams { + QColor iconColor; // Main icon color (replaces #f0f) +}; + +struct ServerConfigDialogParams { + ServerConfigDialogThemeTemplates t; + QColor backgroundColor; + QColor titleTextColor; + QColor qrMessageTextColor; + QColor propagandaTextColor; + QColor labelTextColor; + QColor checkBoxTextColor; + QColor qrBackgroundColor; + QColor qrForegroundColor; + QColor decorationColor; +}; + +struct WhatsNewDialogParams { + QColor backgroundColor; + QColor headerTextColor; + QColor versionTextColor; + QColor contentTextColor; + QColor linkColor; + QColor closeButtonColor; + QColor headerDecorationColor; +}; + +struct ComicFlowParams { + QColor backgroundColor; + QColor textColor; + QColor readMainColor; // Main ribbon color for read state (#f0f in readRibbon.svg) + QColor readTickColor; // Tick color for read state (#0ff in readRibbon.svg) + QColor readingColor; // Main ribbon color for reading state (#f0f in readingRibbon.svg) +}; + +struct ThemeParams { + ThemeMeta meta; + + ComicFlowParams comicFlowParams; + MetadataScraperDialogParams metadataScraperDialogParams; + HelpAboutDialogTheme helpAboutDialogParams; + EmptyContainerParams emptyContainerParams; + NoLibrariesWidgetParams noLibrariesWidgetParams; + SidebarParams sidebarParams; + SidebarIconsParams sidebarIconsParams; + LibraryItemParams libraryItemParams; + ImportWidgetParams importWidgetParams; + ServerConfigDialogParams serverConfigDialogParams; + MainToolbarParams mainToolbarParams; + ContentSplitterParams contentSplitterParams; + NavigationTreeParams navigationTreeParams; + ComicsViewTableParams comicsViewTableParams; + GridAndInfoViewParams gridAndInfoViewParams; + ComicsViewToolbarParams comicsViewToolbarParams; + SearchLineEditParams searchLineEditParams; + ReadingListIconsParams readingListIconsParams; + DialogIconsParams dialogIconsParams; + MenuIconsParams menuIconsParams; + ShortcutsIconsParams shortcutsIconsParams; + WhatsNewDialogParams whatsNewDialogParams; +}; + +Theme makeTheme(const ThemeParams ¶ms) +{ + Theme theme; + + // Comic Flow + const auto &cf = params.comicFlowParams; + theme.comicFlow.backgroundColor = cf.backgroundColor; + theme.comicFlow.textColor = cf.textColor; + + { + const qreal dpr = qApp->devicePixelRatio(); + // readRibbon: #f0f (main) + #0ff (tick) + theme.comicFlow.readPixmap = renderSvgToPixmap( + recoloredSvgToThemeFile(":/images/readRibbon.svg", cf.readMainColor, cf.readTickColor, params.meta.id), + 100, 136, dpr); + // readingRibbon: #f0f (main) + theme.comicFlow.readingPixmap = renderSvgToPixmap( + recoloredSvgToThemeFile(":/images/readingRibbon.svg", cf.readingColor, params.meta.id), + 100, 136, dpr); + } + + // MetadataScraperDialog + const auto &msd = params.metadataScraperDialogParams; + const auto &t = msd.t; + + auto recolor = [&](const QString &path, const QColor &color) { + return recoloredSvgToThemeFile(path, color, params.meta.id); + }; + + theme.metadataScraperDialog.defaultLabelQSS = t.defaultLabelQSS.arg(msd.labelTextColor.name()); + theme.metadataScraperDialog.titleLabelQSS = t.titleLabelQSS.arg(msd.labelTextColor.name()); + theme.metadataScraperDialog.coverLabelQSS = t.coverLabelQSS.arg(msd.labelBackgroundColor.name(), msd.labelTextColor.name()); + theme.metadataScraperDialog.radioButtonQSS = t.radioButtonQSS.arg(msd.buttonTextColor.name(), recolor(":/images/comic_vine/radioUnchecked.svg", msd.radioUncheckedColor), recoloredSvgToThemeFile(":/images/comic_vine/radioChecked.svg", msd.radioCheckedBackgroundColor, msd.radioCheckedIndicatorColor, params.meta.id)); + theme.metadataScraperDialog.checkBoxQSS = t.checkBoxQSS.arg(msd.buttonTextColor.name(), msd.buttonBorderColor.name(), msd.buttonBackgroundColor.name(), recolor(":/images/comic_vine/checkBoxTick.svg", msd.checkBoxTickColor)); + + theme.metadataScraperDialog.scraperLineEditTitleLabelQSS = t.scraperLineEditTitleLabelQSS.arg(msd.contentTextColor.name()); + theme.metadataScraperDialog.scraperLineEditQSS = t.scraperLineEditQSS.arg(msd.contentAltBackgroundColor.name(), msd.contentTextColor.name(), "%1"); + + theme.metadataScraperDialog.scraperToolButtonQSS = t.scraperToolButtonQSS.arg(msd.buttonBackgroundColor.name(), msd.buttonTextColor.name(), msd.toolButtonAccentColor.name()); + theme.metadataScraperDialog.scraperToolButtonSeparatorQSS = t.scraperToolButtonSeparatorQSS.arg(msd.toolButtonAccentColor.name()); + theme.metadataScraperDialog.scraperToolButtonFillColor = msd.buttonBackgroundColor; + + theme.metadataScraperDialog.scraperScrollLabelTextQSS = t.scraperScrollLabelTextQSS.arg(msd.contentBackgroundColor.name(), msd.contentTextColor.name(), msd.hyperlinkColor.name()); + theme.metadataScraperDialog.scraperScrollLabelScrollAreaQSS = t.scraperScrollLabelScrollAreaQSS.arg(msd.contentBackgroundColor.name(), msd.tableScrollHandleColor.name(), msd.tableScrollBackgroundColor.name()); + + theme.metadataScraperDialog.scraperTableViewQSS = t.scraperTableViewQSS + .arg(msd.tableHeaderTextColor.name(), + msd.tableAltBackgroundColor.name(), + msd.tableBackgroundColor.name(), + msd.tableSelectedColor.name(), + msd.tableHeaderBackgroundColor.name(), + msd.tableHeaderBorderColor.name(), + msd.tableHeaderTextColor.name(), + msd.tableSectionBorderDark.name(), + msd.tableSectionBorderLight.name(), + msd.tableScrollHandleColor.name(), + msd.tableScrollBackgroundColor.name(), + recolor(":/images/comic_vine/downArrow.svg", msd.downArrowColor), + recolor(":/images/comic_vine/upArrow.svg", msd.upArrowColor), + msd.tableHeaderGradientColor.name()); + + theme.metadataScraperDialog.dialogQSS = t.dialogQSS.arg(msd.dialogBackgroundColor.name()); + theme.metadataScraperDialog.dialogButtonsQSS = t.dialogButtonsQSS.arg(msd.buttonBorderColor.name(), msd.buttonBackgroundColor.name(), msd.buttonTextColor.name()); + + theme.metadataScraperDialog.busyIndicatorColor = msd.busyIndicatorColor; + + theme.metadataScraperDialog.nextPageIcon = { QIcon(recolor(t.nextPageIcon, msd.navIconColor)), t.pageIconSize }; + theme.metadataScraperDialog.previousPageIcon = { QIcon(recolor(t.previousPageIcon, msd.navIconColor)), t.pageIconSize }; + + theme.metadataScraperDialog.rowUpIcon = { QIcon(recolor(t.rowUpIcon, msd.rowIconColor)), t.rowIconSize }; + theme.metadataScraperDialog.rowDownIcon = { QIcon(recolor(t.rowDownIcon, msd.rowIconColor)), t.rowIconSize }; + + // HelpAboutDialog + theme.helpAboutDialog = params.helpAboutDialogParams; + // end HelpAboutDialog + + // WhatsNewDialog + const auto &wn = params.whatsNewDialogParams; + theme.whatsNewDialog.backgroundColor = wn.backgroundColor; + theme.whatsNewDialog.headerTextColor = wn.headerTextColor; + theme.whatsNewDialog.versionTextColor = wn.versionTextColor; + theme.whatsNewDialog.contentTextColor = wn.contentTextColor; + theme.whatsNewDialog.linkColor = wn.linkColor; + theme.whatsNewDialog.closeButtonIcon = QPixmap(recoloredSvgToThemeFile(":/images/custom_dialog/custom_close_button.svg", wn.closeButtonColor, params.meta.id)); + theme.whatsNewDialog.headerDecoration = QPixmap(recoloredSvgToThemeFile(":/images/whats_new/whatsnew_header.svg", wn.headerDecorationColor, params.meta.id)); + // end WhatsNewDialog + + // EmptyContainer + const auto &ec = params.emptyContainerParams; + const auto &ect = ec.t; + + theme.emptyContainer.backgroundColor = ec.backgroundColor; + theme.emptyContainer.titleLabelQSS = ect.titleLabelQSS.arg(ec.titleTextColor.name()); + { + const qreal dpr = qApp->devicePixelRatio(); + const auto &rli = params.readingListIconsParams; + + theme.emptyContainer.searchingIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/search_result.svg", ec.iconColor, params.meta.id, { .suffix = "_searching" }), 97, dpr); + theme.emptyContainer.noSearchResultsIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/search_result.svg", ec.iconColor, params.meta.id, { .suffix = "_no_results" }), 239, dpr); + + theme.emptyContainer.emptyFolderIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/empty_container/empty_folder.svg", ec.iconColor, params.meta.id), 319, 243, dpr); + theme.emptyContainer.emptyFavoritesIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/empty_container/empty_favorites.svg", rli.favoritesMainColor, params.meta.id), 238, 223, dpr); + theme.emptyContainer.emptyCurrentReadingsIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/empty_container/empty_current_readings.svg", ec.iconColor, params.meta.id), 167, 214, dpr); + theme.emptyContainer.emptyReadingListIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/empty_container/empty_reading_list.svg", ec.iconColor, params.meta.id), 248, 187, dpr); + + // Generate empty label icons for each label color + for (int c = YACReader::YRed; c <= YACReader::YDark; ++c) { + auto labelColor = static_cast(c); + auto colorName = YACReader::colorToName(labelColor); + auto it = rli.labelColors.find(colorName); + if (it != rli.labelColors.end()) { + theme.emptyContainer.emptyLabelIcons[c] = renderSvgToPixmap( + recoloredSvgToThemeFile(":/images/empty_container/empty_label.svg", it.value(), params.meta.id, { .suffix = "_" + colorName }), 243, 243, dpr); + } + } + } + // end EmptyContainer + + // NoLibrariesWidget + const auto &nlw = params.noLibrariesWidgetParams; + const qreal dprNLW = qApp->devicePixelRatio(); + + theme.noLibrariesWidget.backgroundColor = nlw.backgroundColor; + theme.noLibrariesWidget.textColor = nlw.textColor; + theme.noLibrariesWidget.descriptionTextColor = nlw.descriptionTextColor; + theme.noLibrariesWidget.noLibrariesIcon = renderSvgToPixmap( + recoloredSvgToThemeFile(":/images/noLibrariesIcon.svg", nlw.iconColor, params.meta.id), + 165, 160, dprNLW); + theme.noLibrariesWidget.noLibrariesLinePixmap = renderSvgToPixmap( + recoloredSvgToThemeFile(":/images/noLibrariesLine.svg", nlw.noLibrariesLineColor, params.meta.id), + 579, 1, dprNLW); + // end NoLibrariesWidget + + // Sidebar + const auto &sb = params.sidebarParams; + theme.sidebar.backgroundColor = sb.backgroundColor; + theme.sidebar.separatorColor = sb.separatorColor; + theme.sidebar.sectionSeparatorColor = sb.sectionSeparatorColor; + theme.sidebar.uppercaseLabels = sb.uppercaseLabels; + theme.sidebar.titleTextColor = sb.titleTextColor; + theme.sidebar.titleDropShadowColor = sb.titleDropShadowColor; + theme.sidebar.busyIndicatorColor = sb.busyIndicatorColor; + // end Sidebar + + // ImportWidget + const auto &iw = params.importWidgetParams; + const auto &iwt = iw.t; + theme.importWidget.backgroundColor = iw.backgroundColor; + theme.importWidget.titleLabelQSS = iwt.titleLabelQSS.arg(iw.titleTextColor.name()); + theme.importWidget.descriptionTextColor = iw.descriptionTextColor; + theme.importWidget.currentComicTextColor = iw.currentComicTextColor; + theme.importWidget.coversViewBackgroundColor = iw.coversViewBackgroundColor; + theme.importWidget.coversLabelColor = iw.coversLabelColor; + theme.importWidget.topCoversDecoration = QPixmap(recoloredSvgToThemeFile(":/images/import/importTopCoversDecoration.svg", iw.coversDecorationBgColor, iw.coversDecorationShadowColor, params.meta.id)); + theme.importWidget.bottomCoversDecoration = QPixmap(recoloredSvgToThemeFile(":/images/import/importBottomCoversDecoration.svg", iw.coversDecorationBgColor, iw.coversDecorationShadowColor, params.meta.id)); + theme.importWidget.importingIcon = QPixmap(recoloredSvgToThemeFile(":/images/import/importingIcon.svg", iw.modeIconColor, params.meta.id)); + theme.importWidget.updatingIcon = QPixmap(recoloredSvgToThemeFile(":/images/import/updatingIcon.svg", iw.modeIconColor, params.meta.id)); + // glowLine: 579x5 glow line animation + theme.importWidget.glowLinePixmap = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/glowLine.svg", iw.glowLineColor, params.meta.id), 579, 5, qApp->devicePixelRatio()); + { + QIcon coversToggle; + const QString normalPath = recoloredSvgToThemeFile(":/images/import/coversToggle.svg", iw.iconColor, params.meta.id); + const QString checkedPath = recoloredSvgToThemeFile(":/images/import/coversToggle.svg", iw.iconCheckedColor, params.meta.id, { .suffix = "_checked" }); + coversToggle.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + coversToggle.addFile(checkedPath, QSize(), QIcon::Normal, QIcon::On); + theme.importWidget.coversToggleIcon = coversToggle; + } + // end ImportWidget + + // ComicsViewTable + const auto &cvta = params.comicsViewTableParams; + theme.comicsViewTable.tableViewQSS = cvta.t.tableViewQSS + .arg(cvta.alternateBackgroundColor.name(), + cvta.backgroundColor.name(), + cvta.headerBackgroundColor.name(), + cvta.headerBorderColor.name(), + cvta.headerGradientColor.name(), + cvta.itemBorderBottomColor.name(), + cvta.itemBorderTopColor.name(), + cvta.itemTextColor.name(), + cvta.selectedColor.name(), + cvta.selectedTextColor.name(), + cvta.headerTextColor.name(), + QString::number(cvta.itemBorderBottomWidth), + QString::number(cvta.itemBorderTopWidth)); + theme.comicsViewTable.starRatingColor = cvta.starRatingColor; + theme.comicsViewTable.starRatingSelectedColor = cvta.starRatingSelectedColor; + // end ComicsViewTable + + // GridAndInfoView + const auto &giv = params.gridAndInfoViewParams; + theme.gridAndInfoView.backgroundColor = giv.backgroundColor; + theme.gridAndInfoView.cellColor = giv.cellColor; + theme.gridAndInfoView.cellColorWithBackground = giv.cellColorWithBackground; + theme.gridAndInfoView.cellSelectedColor = giv.cellSelectedColor; + theme.gridAndInfoView.cellSelectedBorderColor = giv.cellSelectedBorderColor; + theme.gridAndInfoView.borderColor = giv.borderColor; + theme.gridAndInfoView.itemTitleColor = giv.itemTitleColor; + theme.gridAndInfoView.itemDetailsColor = giv.itemDetailsColor; + theme.gridAndInfoView.showDropShadow = giv.showDropShadow; + theme.gridAndInfoView.infoBackgroundColor = giv.infoBackgroundColor; + theme.gridAndInfoView.topShadow = recoloredSvgToThemeFile(":/qml/info-top-shadow.svg", giv.infoBackgroundColor, giv.infoBorderColor, giv.infoShadowColor, params.meta.id); + theme.gridAndInfoView.infoShadow = recoloredSvgToThemeFile(":/qml/info-shadow.svg", giv.infoBackgroundColor, giv.infoBorderColor, giv.infoShadowColor, params.meta.id); + theme.gridAndInfoView.infoIndicator = recoloredSvgToThemeFile(":/qml/info-indicator.svg", giv.infoBackgroundColor, giv.infoBorderColor, giv.infoShadowColor, params.meta.id); + theme.gridAndInfoView.infoMetadataTextColor = giv.infoMetadataTextColor; + theme.gridAndInfoView.infoTextColor = giv.infoTextColor; + theme.gridAndInfoView.ratingUnselectedColor = giv.ratingUnselectedColor; + theme.gridAndInfoView.ratingSelectedColor = giv.ratingSelectedColor; + theme.gridAndInfoView.favUncheckedColor = giv.favUncheckedColor; + theme.gridAndInfoView.favCheckedColor = giv.favCheckedColor; + theme.gridAndInfoView.readTickUncheckedColor = giv.readTickUncheckedColor; + theme.gridAndInfoView.readTickCheckedColor = giv.readTickCheckedColor; + theme.gridAndInfoView.currentComicBackgroundColor = giv.currentComicBackgroundColor; + theme.gridAndInfoView.continueReadingBackgroundColor = giv.continueReadingBackgroundColor; + theme.gridAndInfoView.continueReadingTextColor = giv.continueReadingTextColor; + theme.gridAndInfoView.backgroundBlurOverlayColor = giv.backgroundBlurOverlayColor; + theme.gridAndInfoView.newItemColor = giv.newItemColor; + theme.gridAndInfoView.buttonColor = giv.buttonColor; + theme.gridAndInfoView.buttonTextColor = giv.buttonTextColor; + theme.gridAndInfoView.linkColor = giv.linkColor; + theme.gridAndInfoView.scrollbarColor = giv.scrollbarColor; + theme.gridAndInfoView.scrollbarBorderColor = giv.scrollbarBorderColor; + theme.gridAndInfoView.infoScrollbarColor = giv.infoScrollbarColor; + theme.gridAndInfoView.comicCoverBorderColor = giv.comicCoverBorderColor; + theme.gridAndInfoView.folderCoverBorderColor = giv.folderCoverBorderColor; + theme.gridAndInfoView.placeholderFolder1Color = giv.placeholderFolder1Color; + theme.gridAndInfoView.placeholderFolder1BorderColor = giv.placeholderFolder1BorderColor; + theme.gridAndInfoView.placeholderFolder2Color = giv.placeholderFolder2Color; + theme.gridAndInfoView.placeholderFolder2BorderColor = giv.placeholderFolder2BorderColor; + theme.gridAndInfoView.currentComicCoverShadowColor = giv.currentComicCoverShadowColor; + theme.gridAndInfoView.buttonShadowColor = giv.buttonShadowColor; + // end GridAndInfoView + + // MainToolbar + const auto &mt = params.mainToolbarParams; + theme.mainToolbar.backgroundColor = mt.backgroundColor; + theme.mainToolbar.folderNameColor = mt.folderNameColor; + theme.mainToolbar.toolbarQSS = mt.t.toolbarQSS; + theme.mainToolbar.folderNameLabelQSS = mt.t.folderNameLabelQSS.arg(mt.folderNameColor.name()); + + // Build divider pixmap with gradient (HiDPI aware) + { + const qreal dpr = qApp->devicePixelRatio(); + const int width = 1; + const int height = 34; + + QPixmap pixmap(width * dpr, height * dpr); + pixmap.setDevicePixelRatio(dpr); + pixmap.fill(Qt::transparent); + + QPainter painter(&pixmap); + painter.setRenderHint(QPainter::Antialiasing); + + QLinearGradient gradient(0, 0, 0, height); + QColor transparentColor = mt.dividerColor; + transparentColor.setAlpha(0); + + gradient.setColorAt(0.0, transparentColor); + gradient.setColorAt(0.5, mt.dividerColor); + gradient.setColorAt(1.0, transparentColor); + + painter.setPen(QPen(QBrush(gradient), 1)); + painter.drawLine(0, 0, 0, height); + + theme.mainToolbar.dividerPixmap = pixmap; + } + + // Build icons with Normal and Disabled states + auto makeToolbarIcon = [&](const QString &basePath) { + QIcon icon; + const QString normalPath = recoloredSvgToThemeFile(basePath, mt.iconColor, params.meta.id); + const QString disabledPath = recoloredSvgToThemeFile(basePath, mt.iconDisabledColor, params.meta.id, { .suffix = "_disabled" }); + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(disabledPath, QSize(), QIcon::Disabled, QIcon::Off); + return icon; + }; + + theme.mainToolbar.backIcon = makeToolbarIcon(":/images/main_toolbar/back.svg"); + theme.mainToolbar.forwardIcon = makeToolbarIcon(":/images/main_toolbar/forward.svg"); + theme.mainToolbar.settingsIcon = makeToolbarIcon(":/images/main_toolbar/settings.svg"); + theme.mainToolbar.serverIcon = makeToolbarIcon(":/images/main_toolbar/server.svg"); + theme.mainToolbar.helpIcon = makeToolbarIcon(":/images/main_toolbar/help.svg"); + theme.mainToolbar.gridIcon = makeToolbarIcon(":/images/main_toolbar/grid.svg"); + theme.mainToolbar.flowIcon = makeToolbarIcon(":/images/main_toolbar/flow.svg"); + theme.mainToolbar.infoIcon = makeToolbarIcon(":/images/main_toolbar/info.svg"); + theme.mainToolbar.fullscreenIcon = makeToolbarIcon(":/images/main_toolbar/fullscreen.svg"); + // end MainToolbar + + // SidebarIcons + const auto &si = params.sidebarIconsParams; + + // Helper to create icons with shadow (two-color: #f0f main, #0ff shadow) + // Adds both Normal and Selected modes to prevent Qt from applying a selection tint + auto makeSidebarIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, si.iconColor, si.shadowColor, params.meta.id); + QIcon icon; + icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + return icon; + }; + + // Helper for single-color icons (only #f0f main) + auto makeSingleColorIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, si.iconColor, params.meta.id); + QIcon icon; + icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + return icon; + }; + + // System folder icons flag and overlay + theme.sidebarIcons.useSystemFolderIcons = si.useSystemFolderIcons; + if (si.useSystemFolderIcons) { + const QString overlayPath = recoloredSvgToThemeFile(":/images/sidebar/folder_read_overlay.svg", params.navigationTreeParams.folderReadOverlayColor, params.meta.id); + theme.sidebarIcons.folderReadOverlay = QPixmap(overlayPath); + } + + // Library icon (unselected state, two-color: #f0f main, #0ff shadow) + { + const auto &li = params.libraryItemParams; + const QString libraryIconPath = recoloredSvgToThemeFile(":/images/sidebar/libraryIcon.svg", li.libraryIconColor, li.libraryIconShadowColor, params.meta.id); + QIcon icon; + icon.addFile(libraryIconPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(libraryIconPath, QSize(), QIcon::Selected, QIcon::Off); + theme.sidebarIcons.libraryIcon = icon; + } + + // Action icons + theme.sidebarIcons.newLibraryIcon = makeSidebarIcon(":/images/sidebar/newLibraryIcon.svg"); + theme.sidebarIcons.openLibraryIcon = makeSidebarIcon(":/images/sidebar/openLibraryIcon.svg"); + theme.sidebarIcons.addNewIcon = makeSidebarIcon(":/images/sidebar/addNew_sidebar.svg"); + theme.sidebarIcons.deleteIcon = makeSidebarIcon(":/images/sidebar/delete_sidebar.svg"); + theme.sidebarIcons.setRootIcon = makeSidebarIcon(":/images/sidebar/setRoot.svg"); + theme.sidebarIcons.expandIcon = makeSidebarIcon(":/images/sidebar/expand.svg"); + theme.sidebarIcons.colapseIcon = makeSidebarIcon(":/images/sidebar/colapse.svg"); + theme.sidebarIcons.addLabelIcon = makeSidebarIcon(":/images/sidebar/addLabelIcon.svg"); + theme.sidebarIcons.renameListIcon = makeSidebarIcon(":/images/sidebar/renameListIcon.svg"); + + // end SidebarIcons + + // LibraryItem + const auto &li = params.libraryItemParams; + theme.libraryItem.textColor = li.textColor; + theme.libraryItem.selectedTextColor = li.selectedTextColor; + theme.libraryItem.selectedBackgroundColor = li.selectedBackgroundColor; + + // Library icon when selected (uses its own color to contrast with selected background) + const QString libraryIconSelectedPath = recoloredSvgToThemeFile(":/images/sidebar/libraryIconSelected.svg", li.libraryIconSelectedColor, params.meta.id); + theme.libraryItem.libraryIconSelected = QIcon(libraryIconSelectedPath); + + // Library options icon (shown only when selected, uses its own color) + const QString libraryOptionsPath = recoloredSvgToThemeFile(":/images/sidebar/libraryOptions.svg", li.libraryOptionsIconColor, params.meta.id); + theme.libraryItem.libraryOptionsIcon = QIcon(libraryOptionsPath); + // end LibraryItem + + // NavigationTree + const auto &nt = params.navigationTreeParams; + + // Branch indicator icons — own colors, independent of the sidebar icon color + theme.navigationTree.branchClosedIconPath = recoloredSvgToThemeFile(":/images/sidebar/branch-closed.svg", nt.branchIndicatorColor, params.meta.id); + theme.navigationTree.branchOpenIconPath = recoloredSvgToThemeFile(":/images/sidebar/branch-open.svg", nt.branchIndicatorColor, params.meta.id); + theme.navigationTree.branchClosedIconSelectedPath = recoloredSvgToThemeFile(":/images/sidebar/branch-closed.svg", nt.branchIndicatorSelectedColor, params.meta.id, { .suffix = "_selected" }); + theme.navigationTree.branchOpenIconSelectedPath = recoloredSvgToThemeFile(":/images/sidebar/branch-open.svg", nt.branchIndicatorSelectedColor, params.meta.id, { .suffix = "_selected" }); + + theme.navigationTree.navigationTreeQSS = nt.t.navigationTreeQSS + .arg(nt.textColor.name(), + nt.selectionBackgroundColor.name(), + nt.scrollBackgroundColor.name(), + nt.scrollHandleColor.name(), + nt.selectedTextColor.name(), + theme.navigationTree.branchClosedIconPath, + theme.navigationTree.branchOpenIconPath, + theme.navigationTree.branchClosedIconSelectedPath, + theme.navigationTree.branchOpenIconSelectedPath); + theme.navigationTree.folderNotCompletedColor = nt.folderNotCompletedColor; + theme.navigationTree.newItemColor = nt.newItemColor; + + // Folder icon — normal and selected states with independent colors + { + const QString normalPath = recoloredSvgToThemeFile(":/images/sidebar/folder.svg", nt.folderIconColor, nt.folderIconShadowColor, params.meta.id); + const QString selectedPath = recoloredSvgToThemeFile(":/images/sidebar/folder.svg", nt.folderIconSelectedColor, nt.folderIconSelectedShadowColor, params.meta.id, { .suffix = "_selected" }); + theme.navigationTree.folderIcon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + theme.navigationTree.folderIcon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + } + + // Folder finished icon — same but with tick (#ff0) recolored independently for each state + { + const QString normalPath = recoloredSvgToThemeFile(":/images/sidebar/folder_finished.svg", nt.folderIconColor, nt.folderIconShadowColor, nt.folderReadOverlayColor, params.meta.id); + const QString selectedPath = recoloredSvgToThemeFile(":/images/sidebar/folder_finished.svg", nt.folderIconSelectedColor, nt.folderIconSelectedShadowColor, nt.folderReadOverlaySelectedColor, params.meta.id, { .suffix = "_selected" }); + theme.navigationTree.folderFinishedIcon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + theme.navigationTree.folderFinishedIcon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + } + // end NavigationTree + + // ContentSplitter + const auto &cs = params.contentSplitterParams; + theme.contentSplitter.horizontalSplitterQSS = cs.t.horizontalSplitterQSS + .arg(cs.handleColor.name()) + .arg(cs.verticalHandleWidth); + theme.contentSplitter.verticalSplitterQSS = cs.t.verticalSplitterQSS + .arg(cs.handleColor.name()) + .arg(cs.horizontalHandleHeight); + // end ContentSplitter + + // ComicsViewToolbar + const auto &cvt = params.comicsViewToolbarParams; + + // Helper to create single-color icons for comics view toolbar + auto makeComicsViewIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, cvt.iconColor, params.meta.id); + QIcon icon; + icon.addFile(path, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(path, QSize(), QIcon::Selected, QIcon::Off); + return icon; + }; + + theme.comicsViewToolbar.toolbarQSS = cvt.t.toolbarQSS.arg( + cvt.backgroundColor.name(), + cvt.separatorColor.name(), + cvt.checkedBackgroundColor.name()); + theme.comicsViewToolbar.openInYACReaderIcon = makeComicsViewIcon(":/images/comics_view_toolbar/openInYACReader.svg"); + theme.comicsViewToolbar.setAsReadIcon = makeComicsViewIcon(":/images/comics_view_toolbar/setReadButton.svg"); + theme.comicsViewToolbar.setAsUnreadIcon = makeComicsViewIcon(":/images/comics_view_toolbar/setUnread.svg"); + theme.comicsViewToolbar.showComicInfoIcon = makeComicsViewIcon(":/images/comics_view_toolbar/show_comic_info.svg"); + theme.comicsViewToolbar.setAsNormalIcon = makeComicsViewIcon(":/images/comics_view_toolbar/setNormal.svg"); + theme.comicsViewToolbar.setAsMangaIcon = makeComicsViewIcon(":/images/comics_view_toolbar/setManga.svg"); + theme.comicsViewToolbar.editComicIcon = makeComicsViewIcon(":/images/comics_view_toolbar/editComic.svg"); + theme.comicsViewToolbar.getInfoIcon = makeComicsViewIcon(":/images/comics_view_toolbar/getInfo.svg"); + theme.comicsViewToolbar.assignNumberIcon = makeComicsViewIcon(":/images/comics_view_toolbar/asignNumber.svg"); + theme.comicsViewToolbar.selectAllIcon = makeComicsViewIcon(":/images/comics_view_toolbar/selectAll.svg"); + theme.comicsViewToolbar.deleteIcon = makeComicsViewIcon(":/images/comics_view_toolbar/trash.svg"); + theme.comicsViewToolbar.hideComicFlowIcon = makeComicsViewIcon(":/images/comics_view_toolbar/hideComicFlow.svg"); + theme.comicsViewToolbar.showMarksIcon = makeComicsViewIcon(":/images/comics_view_toolbar/showMarks.svg"); + theme.comicsViewToolbar.showRecentIndicatorIcon = makeComicsViewIcon(":/images/comics_view_toolbar/showRecentIndicator.svg"); + theme.comicsViewToolbar.bigGridZoomIcon = makeComicsViewIcon(":/images/comics_view_toolbar/big_size_grid_zoom.svg"); + theme.comicsViewToolbar.smallGridZoomIcon = makeComicsViewIcon(":/images/comics_view_toolbar/small_size_grid_zoom.svg"); + // end ComicsViewToolbar + + // SearchLineEdit + const auto &sle = params.searchLineEditParams; + + theme.searchLineEdit.lineEditQSS = sle.t.lineEditQSS + .arg(sle.textColor.name(), + sle.backgroundColor.name()); + theme.searchLineEdit.searchLabelQSS = sle.t.searchLabelQSS; + theme.searchLineEdit.clearButtonQSS = sle.t.clearButtonQSS; + + const qreal dpr = qApp->devicePixelRatio(); + theme.searchLineEdit.searchIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/iconSearchNew.svg", sle.iconColor, params.meta.id), 15, dpr); + theme.searchLineEdit.clearIcon = renderSvgToPixmap(recoloredSvgToThemeFile(":/images/clearSearchNew.svg", sle.iconColor, params.meta.id), 12, dpr); + // end SearchLineEdit + + // ReadingListIcons + const auto &rli = params.readingListIconsParams; + + // Helper to create label icons from template (uses color name to generate label_.svg files) + auto makeLabelIcon = [&](const QString &colorName, const QColor &mainColor) { + const QString normalPath = recoloredSvgToThemeFile(":/images/lists/label_template.svg", mainColor, rli.labelShadowColor, params.meta.id, { .fileName = "label_" + colorName }); + const QString selectedPath = recoloredSvgToThemeFile(":/images/lists/label_template.svg", mainColor, rli.labelShadowSelectedColor, params.meta.id, { .suffix = "_selected", .fileName = "label_" + colorName }); + QIcon icon; + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + return icon; + }; + + for (auto it = rli.labelColors.constBegin(); it != rli.labelColors.constEnd(); ++it) { + theme.readingListIcons.labelIcons[it.key()] = makeLabelIcon(it.key(), it.value()); + } + + // Special list icons + auto makeSpecialIcon = [&](const QString &basePath, const QColor &mainColor, const QColor &mainSelectedColor) { + const QString normalPath = recoloredSvgToThemeFile(basePath, mainColor, rli.specialListShadowColor, params.meta.id); + const QString selectedPath = recoloredSvgToThemeFile(basePath, mainSelectedColor, rli.specialListShadowSelectedColor, params.meta.id, { .suffix = "_selected" }); + QIcon icon; + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + return icon; + }; + + theme.readingListIcons.readingListIcon = makeSpecialIcon(":/images/lists/default_0.svg", rli.readingListMainColor, rli.readingListMainSelectedColor); + theme.readingListIcons.favoritesIcon = makeSpecialIcon(":/images/lists/default_1.svg", rli.favoritesMainColor, rli.favoritesMainSelectedColor); + + // Currently reading has 3 colors + { + const QString normalPath = recoloredSvgToThemeFile(":/images/lists/default_2.svg", rli.currentlyReadingMainColor, rli.specialListShadowColor, rli.currentlyReadingOuterColor, params.meta.id); + const QString selectedPath = recoloredSvgToThemeFile(":/images/lists/default_2.svg", rli.currentlyReadingMainSelectedColor, rli.specialListShadowSelectedColor, rli.currentlyReadingOuterSelectedColor, params.meta.id, { .suffix = "_selected" }); + QIcon icon; + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + theme.readingListIcons.currentlyReadingIcon = icon; + } + + // List icon (3 colors) + { + const QString normalPath = recoloredSvgToThemeFile(":/images/lists/list.svg", rli.listMainColor, rli.listShadowColor, rli.listDetailColor, params.meta.id); + const QString selectedPath = recoloredSvgToThemeFile(":/images/lists/list.svg", rli.listMainSelectedColor, rli.listShadowSelectedColor, rli.listDetailSelectedColor, params.meta.id, { .suffix = "_selected" }); + QIcon icon; + icon.addFile(normalPath, QSize(), QIcon::Normal, QIcon::Off); + icon.addFile(selectedPath, QSize(), QIcon::Selected, QIcon::Off); + theme.readingListIcons.listIcon = icon; + } + // end ReadingListIcons + + // MenuIcons + const auto &mi = params.menuIconsParams; + auto makeMenuIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, mi.iconColor, params.meta.id); + return QIcon(path); + }; + + theme.menuIcons.exportComicsInfoIcon = makeMenuIcon(":/images/menus_icons/exportComicsInfoIcon.svg"); + theme.menuIcons.importComicsInfoIcon = makeMenuIcon(":/images/menus_icons/importComicsInfoIcon.svg"); + theme.menuIcons.exportLibraryIcon = makeMenuIcon(":/images/menus_icons/exportLibraryIcon.svg"); + theme.menuIcons.importLibraryIcon = makeMenuIcon(":/images/menus_icons/importLibraryIcon.svg"); + theme.menuIcons.updateLibraryIcon = makeMenuIcon(":/images/menus_icons/updateLibraryIcon.svg"); + theme.menuIcons.renameLibraryIcon = makeMenuIcon(":/images/menus_icons/editIcon.svg"); + theme.menuIcons.removeLibraryIcon = makeMenuIcon(":/images/menus_icons/removeLibraryIcon.svg"); + theme.menuIcons.openContainingFolderIcon = makeMenuIcon(":/images/menus_icons/open_containing_folder.svg"); + theme.menuIcons.updateCurrentFolderIcon = makeMenuIcon(":/images/menus_icons/update_current_folder.svg"); + theme.menuIcons.quitIcon = makeMenuIcon(":/images/viewer_toolbar/close.svg"); + // end MenuIcons + + // DialogIcons + const auto &di = params.dialogIconsParams; + auto makeDialogIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, di.iconColor, params.meta.id); + return QPixmap(path); + }; + theme.dialogIcons.newLibraryIcon = makeDialogIcon(":/images/library_dialogs/new.svg"); + theme.dialogIcons.openLibraryIcon = makeDialogIcon(":/images/library_dialogs/openLibrary.svg"); + theme.dialogIcons.editIcon = makeDialogIcon(":/images/library_dialogs/edit.svg"); + theme.dialogIcons.exportComicsInfoIcon = makeDialogIcon(":/images/library_dialogs/exportComicsInfo.svg"); + theme.dialogIcons.importComicsInfoIcon = makeDialogIcon(":/images/library_dialogs/importComicsInfo.svg"); + theme.dialogIcons.exportLibraryIcon = makeDialogIcon(":/images/library_dialogs/exportLibrary.svg"); + theme.dialogIcons.importLibraryIcon = makeDialogIcon(":/images/library_dialogs/importLibrary.svg"); + { + const QString path = recoloredSvgToThemeFile(":/images/find_folder.svg", di.iconColor, params.meta.id); + const qreal dpr = qApp->devicePixelRatio(); + theme.dialogIcons.findFolderIcon = QIcon(renderSvgToPixmap(path, 13, 13, dpr)); + } + // end DialogIcons + + // ShortcutsIcons + const auto &sci = params.shortcutsIconsParams; + auto makeShortcutsIcon = [&](const QString &basePath) { + const QString path = recoloredSvgToThemeFile(basePath, sci.iconColor, params.meta.id); + return QIcon(path); + }; + + theme.shortcutsIcons.comicsIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_comics.svg"); + theme.shortcutsIcons.foldersIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_folders.svg"); + theme.shortcutsIcons.generalIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_general.svg"); + theme.shortcutsIcons.librariesIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_libraries.svg"); + theme.shortcutsIcons.visualizationIcon = makeShortcutsIcon(":/images/shortcuts/shortcuts_group_visualization.svg"); + // end ShortcutsIcons + + // ServerConfigDialog + const auto &scd = params.serverConfigDialogParams; + theme.serverConfigDialog.dialogQSS = scd.t.dialogQSS.arg(scd.backgroundColor.name()); + theme.serverConfigDialog.titleLabelQSS = scd.t.titleLabelQSS.arg(scd.titleTextColor.name()); + theme.serverConfigDialog.qrMessageLabelQSS = scd.t.qrMessageLabelQSS.arg(scd.qrMessageTextColor.name()); + theme.serverConfigDialog.propagandaLabelQSS = scd.t.propagandaLabelQSS.arg(scd.propagandaTextColor.name()); + theme.serverConfigDialog.labelQSS = scd.t.labelQSS.arg(scd.labelTextColor.name()); + theme.serverConfigDialog.checkBoxQSS = scd.t.checkBoxQSS.arg(scd.checkBoxTextColor.name()); + theme.serverConfigDialog.qrBackgroundColor = scd.qrBackgroundColor; + theme.serverConfigDialog.qrForegroundColor = scd.qrForegroundColor; + theme.serverConfigDialog.backgroundDecoration = QPixmap(recoloredSvgToThemeFile(":/images/serverConfigBackground.svg", scd.decorationColor, params.meta.id)); + + theme.meta = params.meta; + + return theme; +} + +// JSON helpers --------------------------------------------------------------- + +static QColor colorFromJson(const QJsonObject &obj, const QString &key, const QColor &fallback) +{ + if (!obj.contains(key)) + return fallback; + QColor c(obj[key].toString()); + return c.isValid() ? c : fallback; +} + +Theme makeTheme(const QJsonObject &json) +{ + ThemeParams p; + + if (json.contains("comicFlow")) { + const auto o = json["comicFlow"].toObject(); + p.comicFlowParams.backgroundColor = colorFromJson(o, "backgroundColor", p.comicFlowParams.backgroundColor); + p.comicFlowParams.textColor = colorFromJson(o, "textColor", p.comicFlowParams.textColor); + p.comicFlowParams.readMainColor = colorFromJson(o, "readMainColor", p.comicFlowParams.readMainColor); + p.comicFlowParams.readTickColor = colorFromJson(o, "readTickColor", p.comicFlowParams.readTickColor); + p.comicFlowParams.readingColor = colorFromJson(o, "readingColor", p.comicFlowParams.readingColor); + } + + if (json.contains("metadataScraperDialog")) { + const auto o = json["metadataScraperDialog"].toObject(); + auto &msd = p.metadataScraperDialogParams; + msd.contentTextColor = colorFromJson(o, "contentTextColor", msd.contentTextColor); + msd.contentBackgroundColor = colorFromJson(o, "contentBackgroundColor", msd.contentBackgroundColor); + msd.contentAltBackgroundColor = colorFromJson(o, "contentAltBackgroundColor", msd.contentAltBackgroundColor); + msd.dialogBackgroundColor = colorFromJson(o, "dialogBackgroundColor", msd.dialogBackgroundColor); + msd.tableBackgroundColor = colorFromJson(o, "tableBackgroundColor", msd.tableBackgroundColor); + msd.tableAltBackgroundColor = colorFromJson(o, "tableAltBackgroundColor", msd.tableAltBackgroundColor); + msd.tableBorderColor = colorFromJson(o, "tableBorderColor", msd.tableBorderColor); + msd.tableSelectedColor = colorFromJson(o, "tableSelectedColor", msd.tableSelectedColor); + msd.tableHeaderBackgroundColor = colorFromJson(o, "tableHeaderBackgroundColor", msd.tableHeaderBackgroundColor); + msd.tableHeaderGradientColor = colorFromJson(o, "tableHeaderGradientColor", msd.tableHeaderGradientColor); + msd.tableHeaderBorderColor = colorFromJson(o, "tableHeaderBorderColor", msd.tableHeaderBorderColor); + msd.tableHeaderTextColor = colorFromJson(o, "tableHeaderTextColor", msd.tableHeaderTextColor); + msd.tableScrollHandleColor = colorFromJson(o, "tableScrollHandleColor", msd.tableScrollHandleColor); + msd.tableScrollBackgroundColor = colorFromJson(o, "tableScrollBackgroundColor", msd.tableScrollBackgroundColor); + msd.tableSectionBorderLight = colorFromJson(o, "tableSectionBorderLight", msd.tableSectionBorderLight); + msd.tableSectionBorderDark = colorFromJson(o, "tableSectionBorderDark", msd.tableSectionBorderDark); + msd.labelTextColor = colorFromJson(o, "labelTextColor", msd.labelTextColor); + msd.labelBackgroundColor = colorFromJson(o, "labelBackgroundColor", msd.labelBackgroundColor); + msd.hyperlinkColor = colorFromJson(o, "hyperlinkColor", msd.hyperlinkColor); + msd.buttonBackgroundColor = colorFromJson(o, "buttonBackgroundColor", msd.buttonBackgroundColor); + msd.buttonTextColor = colorFromJson(o, "buttonTextColor", msd.buttonTextColor); + msd.buttonBorderColor = colorFromJson(o, "buttonBorderColor", msd.buttonBorderColor); + msd.radioUncheckedColor = colorFromJson(o, "radioUncheckedColor", msd.radioUncheckedColor); + msd.radioCheckedBackgroundColor = colorFromJson(o, "radioCheckedBackgroundColor", msd.radioCheckedBackgroundColor); + msd.radioCheckedIndicatorColor = colorFromJson(o, "radioCheckedIndicatorColor", msd.radioCheckedIndicatorColor); + msd.checkBoxTickColor = colorFromJson(o, "checkBoxTickColor", msd.checkBoxTickColor); + msd.toolButtonAccentColor = colorFromJson(o, "toolButtonAccentColor", msd.toolButtonAccentColor); + msd.downArrowColor = colorFromJson(o, "downArrowColor", msd.downArrowColor); + msd.upArrowColor = colorFromJson(o, "upArrowColor", msd.upArrowColor); + msd.busyIndicatorColor = colorFromJson(o, "busyIndicatorColor", msd.busyIndicatorColor); + msd.navIconColor = colorFromJson(o, "navIconColor", msd.navIconColor); + msd.rowIconColor = colorFromJson(o, "rowIconColor", msd.rowIconColor); + } + + if (json.contains("helpAboutDialog")) { + const auto o = json["helpAboutDialog"].toObject(); + p.helpAboutDialogParams.headingColor = colorFromJson(o, "headingColor", p.helpAboutDialogParams.headingColor); + p.helpAboutDialogParams.linkColor = colorFromJson(o, "linkColor", p.helpAboutDialogParams.linkColor); + } + + if (json.contains("whatsNewDialog")) { + const auto o = json["whatsNewDialog"].toObject(); + auto &wn = p.whatsNewDialogParams; + wn.backgroundColor = colorFromJson(o, "backgroundColor", wn.backgroundColor); + wn.headerTextColor = colorFromJson(o, "headerTextColor", wn.headerTextColor); + wn.versionTextColor = colorFromJson(o, "versionTextColor", wn.versionTextColor); + wn.contentTextColor = colorFromJson(o, "contentTextColor", wn.contentTextColor); + wn.linkColor = colorFromJson(o, "linkColor", wn.linkColor); + wn.closeButtonColor = colorFromJson(o, "closeButtonColor", wn.closeButtonColor); + wn.headerDecorationColor = colorFromJson(o, "headerDecorationColor", wn.headerDecorationColor); + } + + if (json.contains("emptyContainer")) { + const auto o = json["emptyContainer"].toObject(); + auto &ec = p.emptyContainerParams; + ec.backgroundColor = colorFromJson(o, "backgroundColor", ec.backgroundColor); + ec.titleTextColor = colorFromJson(o, "titleTextColor", ec.titleTextColor); + ec.iconColor = colorFromJson(o, "iconColor", ec.iconColor); + } + + if (json.contains("noLibrariesWidget")) { + const auto o = json["noLibrariesWidget"].toObject(); + auto &nlw = p.noLibrariesWidgetParams; + nlw.backgroundColor = colorFromJson(o, "backgroundColor", nlw.backgroundColor); + nlw.textColor = colorFromJson(o, "textColor", nlw.textColor); + nlw.descriptionTextColor = colorFromJson(o, "descriptionTextColor", nlw.descriptionTextColor); + nlw.iconColor = colorFromJson(o, "iconColor", nlw.iconColor); + nlw.noLibrariesLineColor = colorFromJson(o, "noLibrariesLineColor", nlw.noLibrariesLineColor); + } + + if (json.contains("sidebar")) { + const auto o = json["sidebar"].toObject(); + auto &sb = p.sidebarParams; + sb.backgroundColor = colorFromJson(o, "backgroundColor", sb.backgroundColor); + sb.separatorColor = colorFromJson(o, "separatorColor", sb.separatorColor); + sb.sectionSeparatorColor = colorFromJson(o, "sectionSeparatorColor", sb.sectionSeparatorColor); + if (o.contains("uppercaseLabels")) + sb.uppercaseLabels = o["uppercaseLabels"].toBool(sb.uppercaseLabels); + sb.titleTextColor = colorFromJson(o, "titleTextColor", sb.titleTextColor); + sb.titleDropShadowColor = colorFromJson(o, "titleDropShadowColor", sb.titleDropShadowColor); + sb.busyIndicatorColor = colorFromJson(o, "busyIndicatorColor", sb.busyIndicatorColor); + } + + if (json.contains("sidebarIcons")) { + const auto o = json["sidebarIcons"].toObject(); + auto &si = p.sidebarIconsParams; + si.iconColor = colorFromJson(o, "iconColor", si.iconColor); + si.shadowColor = colorFromJson(o, "shadowColor", si.shadowColor); + if (o.contains("useSystemFolderIcons")) + si.useSystemFolderIcons = o["useSystemFolderIcons"].toBool(si.useSystemFolderIcons); + } + + if (json.contains("libraryItem")) { + const auto o = json["libraryItem"].toObject(); + auto &li = p.libraryItemParams; + li.textColor = colorFromJson(o, "textColor", li.textColor); + li.libraryIconColor = colorFromJson(o, "libraryIconColor", li.libraryIconColor); + li.libraryIconShadowColor = colorFromJson(o, "libraryIconShadowColor", li.libraryIconShadowColor); + li.selectedTextColor = colorFromJson(o, "selectedTextColor", li.selectedTextColor); + li.selectedBackgroundColor = colorFromJson(o, "selectedBackgroundColor", li.selectedBackgroundColor); + li.libraryIconSelectedColor = colorFromJson(o, "libraryIconSelectedColor", li.libraryIconSelectedColor); + li.libraryOptionsIconColor = colorFromJson(o, "libraryOptionsIconColor", li.libraryOptionsIconColor); + } + + if (json.contains("importWidget")) { + const auto o = json["importWidget"].toObject(); + auto &iw = p.importWidgetParams; + iw.backgroundColor = colorFromJson(o, "backgroundColor", iw.backgroundColor); + iw.titleTextColor = colorFromJson(o, "titleTextColor", iw.titleTextColor); + iw.descriptionTextColor = colorFromJson(o, "descriptionTextColor", iw.descriptionTextColor); + iw.currentComicTextColor = colorFromJson(o, "currentComicTextColor", iw.currentComicTextColor); + iw.coversViewBackgroundColor = colorFromJson(o, "coversViewBackgroundColor", iw.coversViewBackgroundColor); + iw.coversLabelColor = colorFromJson(o, "coversLabelColor", iw.coversLabelColor); + iw.coversDecorationBgColor = colorFromJson(o, "coversDecorationBgColor", iw.coversDecorationBgColor); + iw.coversDecorationShadowColor = colorFromJson(o, "coversDecorationShadowColor", iw.coversDecorationShadowColor); + iw.modeIconColor = colorFromJson(o, "modeIconColor", iw.modeIconColor); + iw.iconColor = colorFromJson(o, "iconColor", iw.iconColor); + iw.iconCheckedColor = colorFromJson(o, "iconCheckedColor", iw.iconCheckedColor); + iw.glowLineColor = colorFromJson(o, "glowLineColor", iw.glowLineColor); + } + + if (json.contains("serverConfigDialog")) { + const auto o = json["serverConfigDialog"].toObject(); + auto &scd2 = p.serverConfigDialogParams; + scd2.backgroundColor = colorFromJson(o, "backgroundColor", scd2.backgroundColor); + scd2.titleTextColor = colorFromJson(o, "titleTextColor", scd2.titleTextColor); + scd2.qrMessageTextColor = colorFromJson(o, "qrMessageTextColor", scd2.qrMessageTextColor); + scd2.propagandaTextColor = colorFromJson(o, "propagandaTextColor", scd2.propagandaTextColor); + scd2.labelTextColor = colorFromJson(o, "labelTextColor", scd2.labelTextColor); + scd2.checkBoxTextColor = colorFromJson(o, "checkBoxTextColor", scd2.checkBoxTextColor); + scd2.qrBackgroundColor = colorFromJson(o, "qrBackgroundColor", scd2.qrBackgroundColor); + scd2.qrForegroundColor = colorFromJson(o, "qrForegroundColor", scd2.qrForegroundColor); + scd2.decorationColor = colorFromJson(o, "decorationColor", scd2.decorationColor); + } + + if (json.contains("mainToolbar")) { + const auto o = json["mainToolbar"].toObject(); + auto &mt = p.mainToolbarParams; + mt.backgroundColor = colorFromJson(o, "backgroundColor", mt.backgroundColor); + mt.folderNameColor = colorFromJson(o, "folderNameColor", mt.folderNameColor); + mt.dividerColor = colorFromJson(o, "dividerColor", mt.dividerColor); + mt.iconColor = colorFromJson(o, "iconColor", mt.iconColor); + mt.iconDisabledColor = colorFromJson(o, "iconDisabledColor", mt.iconDisabledColor); + } + + if (json.contains("contentSplitter")) { + const auto o = json["contentSplitter"].toObject(); + auto &cs = p.contentSplitterParams; + cs.handleColor = colorFromJson(o, "handleColor", cs.handleColor); + if (o.contains("horizontalHandleHeight")) + cs.horizontalHandleHeight = o["horizontalHandleHeight"].toInt(cs.horizontalHandleHeight); + if (o.contains("verticalHandleWidth")) + cs.verticalHandleWidth = o["verticalHandleWidth"].toInt(cs.verticalHandleWidth); + } + + if (json.contains("navigationTree")) { + const auto o = json["navigationTree"].toObject(); + auto &nt = p.navigationTreeParams; + nt.textColor = colorFromJson(o, "textColor", nt.textColor); + nt.selectionBackgroundColor = colorFromJson(o, "selectionBackgroundColor", nt.selectionBackgroundColor); + nt.scrollBackgroundColor = colorFromJson(o, "scrollBackgroundColor", nt.scrollBackgroundColor); + nt.scrollHandleColor = colorFromJson(o, "scrollHandleColor", nt.scrollHandleColor); + nt.selectedTextColor = colorFromJson(o, "selectedTextColor", nt.selectedTextColor); + nt.folderNotCompletedColor = colorFromJson(o, "folderNotCompletedColor", nt.folderNotCompletedColor); + nt.newItemColor = colorFromJson(o, "newItemColor", nt.newItemColor); + nt.branchIndicatorColor = colorFromJson(o, "branchIndicatorColor", nt.branchIndicatorColor); + nt.branchIndicatorSelectedColor = colorFromJson(o, "branchIndicatorSelectedColor", nt.branchIndicatorSelectedColor); + nt.folderIconColor = colorFromJson(o, "folderIconColor", nt.folderIconColor); + nt.folderIconShadowColor = colorFromJson(o, "folderIconShadowColor", nt.folderIconShadowColor); + nt.folderIconSelectedColor = colorFromJson(o, "folderIconSelectedColor", nt.folderIconSelectedColor); + nt.folderIconSelectedShadowColor = colorFromJson(o, "folderIconSelectedShadowColor", nt.folderIconSelectedShadowColor); + nt.folderReadOverlayColor = colorFromJson(o, "folderReadOverlayColor", nt.folderReadOverlayColor); + nt.folderReadOverlaySelectedColor = colorFromJson(o, "folderReadOverlaySelectedColor", nt.folderReadOverlaySelectedColor); + } + + if (json.contains("comicsViewTable")) { + const auto o = json["comicsViewTable"].toObject(); + auto &cvta = p.comicsViewTableParams; + cvta.alternateBackgroundColor = colorFromJson(o, "alternateBackgroundColor", cvta.alternateBackgroundColor); + cvta.backgroundColor = colorFromJson(o, "backgroundColor", cvta.backgroundColor); + cvta.headerBackgroundColor = colorFromJson(o, "headerBackgroundColor", cvta.headerBackgroundColor); + cvta.headerBorderColor = colorFromJson(o, "headerBorderColor", cvta.headerBorderColor); + cvta.headerGradientColor = colorFromJson(o, "headerGradientColor", cvta.headerGradientColor); + cvta.itemBorderBottomColor = colorFromJson(o, "itemBorderBottomColor", cvta.itemBorderBottomColor); + cvta.itemBorderTopColor = colorFromJson(o, "itemBorderTopColor", cvta.itemBorderTopColor); + cvta.itemBorderBottomWidth = o["itemBorderBottomWidth"].toInt(cvta.itemBorderBottomWidth); + cvta.itemBorderTopWidth = o["itemBorderTopWidth"].toInt(cvta.itemBorderTopWidth); + cvta.itemTextColor = colorFromJson(o, "itemTextColor", cvta.itemTextColor); + cvta.selectedColor = colorFromJson(o, "selectedColor", cvta.selectedColor); + cvta.selectedTextColor = colorFromJson(o, "selectedTextColor", cvta.selectedTextColor); + cvta.headerTextColor = colorFromJson(o, "headerTextColor", cvta.headerTextColor); + cvta.starRatingColor = colorFromJson(o, "starRatingColor", cvta.starRatingColor); + cvta.starRatingSelectedColor = colorFromJson(o, "starRatingSelectedColor", cvta.starRatingSelectedColor); + } + + if (json.contains("gridAndInfoView")) { + const auto o = json["gridAndInfoView"].toObject(); + auto &giv = p.gridAndInfoViewParams; + giv.backgroundColor = colorFromJson(o, "backgroundColor", giv.backgroundColor); + giv.cellColor = colorFromJson(o, "cellColor", giv.cellColor); + giv.cellColorWithBackground = colorFromJson(o, "cellColorWithBackground", giv.cellColorWithBackground); + giv.cellSelectedColor = colorFromJson(o, "cellSelectedColor", giv.cellSelectedColor); + giv.cellSelectedBorderColor = colorFromJson(o, "cellSelectedBorderColor", giv.cellSelectedBorderColor); + giv.borderColor = colorFromJson(o, "borderColor", giv.borderColor); + giv.itemTitleColor = colorFromJson(o, "itemTitleColor", giv.itemTitleColor); + giv.itemDetailsColor = colorFromJson(o, "itemDetailsColor", giv.itemDetailsColor); + if (o.contains("showDropShadow")) + giv.showDropShadow = o["showDropShadow"].toBool(giv.showDropShadow); + giv.infoBackgroundColor = colorFromJson(o, "infoBackgroundColor", giv.infoBackgroundColor); + giv.infoBorderColor = colorFromJson(o, "infoBorderColor", giv.infoBorderColor); + giv.infoShadowColor = colorFromJson(o, "infoShadowColor", giv.infoShadowColor); + giv.infoMetadataTextColor = colorFromJson(o, "infoMetadataTextColor", giv.infoMetadataTextColor); + giv.infoTextColor = colorFromJson(o, "infoTextColor", giv.infoTextColor); + giv.ratingUnselectedColor = colorFromJson(o, "ratingUnselectedColor", giv.ratingUnselectedColor); + giv.ratingSelectedColor = colorFromJson(o, "ratingSelectedColor", giv.ratingSelectedColor); + giv.favUncheckedColor = colorFromJson(o, "favUncheckedColor", giv.favUncheckedColor); + giv.favCheckedColor = colorFromJson(o, "favCheckedColor", giv.favCheckedColor); + giv.readTickUncheckedColor = colorFromJson(o, "readTickUncheckedColor", giv.readTickUncheckedColor); + giv.readTickCheckedColor = colorFromJson(o, "readTickCheckedColor", giv.readTickCheckedColor); + giv.currentComicBackgroundColor = colorFromJson(o, "currentComicBackgroundColor", giv.currentComicBackgroundColor); + giv.continueReadingBackgroundColor = colorFromJson(o, "continueReadingBackgroundColor", giv.continueReadingBackgroundColor); + giv.continueReadingTextColor = colorFromJson(o, "continueReadingTextColor", giv.continueReadingTextColor); + giv.backgroundBlurOverlayColor = colorFromJson(o, "backgroundBlurOverlayColor", giv.backgroundBlurOverlayColor); + giv.newItemColor = colorFromJson(o, "newItemColor", giv.newItemColor); + giv.buttonColor = colorFromJson(o, "buttonColor", giv.buttonColor); + giv.buttonTextColor = colorFromJson(o, "buttonTextColor", giv.buttonTextColor); + giv.linkColor = colorFromJson(o, "linkColor", giv.linkColor); + giv.scrollbarColor = colorFromJson(o, "scrollbarColor", giv.scrollbarColor); + giv.scrollbarBorderColor = colorFromJson(o, "scrollbarBorderColor", giv.scrollbarBorderColor); + giv.infoScrollbarColor = colorFromJson(o, "infoScrollbarColor", giv.infoScrollbarColor); + giv.comicCoverBorderColor = colorFromJson(o, "comicCoverBorderColor", giv.comicCoverBorderColor); + giv.folderCoverBorderColor = colorFromJson(o, "folderCoverBorderColor", giv.folderCoverBorderColor); + giv.placeholderFolder1Color = colorFromJson(o, "placeholderFolder1Color", giv.placeholderFolder1Color); + giv.placeholderFolder1BorderColor = colorFromJson(o, "placeholderFolder1BorderColor", giv.placeholderFolder1BorderColor); + giv.placeholderFolder2Color = colorFromJson(o, "placeholderFolder2Color", giv.placeholderFolder2Color); + giv.placeholderFolder2BorderColor = colorFromJson(o, "placeholderFolder2BorderColor", giv.placeholderFolder2BorderColor); + giv.currentComicCoverShadowColor = colorFromJson(o, "currentComicCoverShadowColor", giv.currentComicCoverShadowColor); + giv.buttonShadowColor = colorFromJson(o, "buttonShadowColor", giv.buttonShadowColor); + } + + if (json.contains("comicsViewToolbar")) { + const auto o = json["comicsViewToolbar"].toObject(); + auto &cvt = p.comicsViewToolbarParams; + cvt.backgroundColor = colorFromJson(o, "backgroundColor", cvt.backgroundColor); + cvt.separatorColor = colorFromJson(o, "separatorColor", cvt.separatorColor); + cvt.checkedBackgroundColor = colorFromJson(o, "checkedBackgroundColor", cvt.checkedBackgroundColor); + cvt.iconColor = colorFromJson(o, "iconColor", cvt.iconColor); + } + + if (json.contains("searchLineEdit")) { + const auto o = json["searchLineEdit"].toObject(); + auto &sle = p.searchLineEditParams; + sle.textColor = colorFromJson(o, "textColor", sle.textColor); + sle.backgroundColor = colorFromJson(o, "backgroundColor", sle.backgroundColor); + sle.iconColor = colorFromJson(o, "iconColor", sle.iconColor); + } + + if (json.contains("readingListIcons")) { + const auto o = json["readingListIcons"].toObject(); + auto &rli = p.readingListIconsParams; + if (o.contains("labelColors")) { + const auto lc = o["labelColors"].toObject(); + for (auto it = lc.constBegin(); it != lc.constEnd(); ++it) { + QColor c(it.value().toString()); + if (c.isValid()) + rli.labelColors[it.key()] = c; + } + } + rli.labelShadowColor = colorFromJson(o, "labelShadowColor", rli.labelShadowColor); + rli.labelShadowSelectedColor = colorFromJson(o, "labelShadowSelectedColor", rli.labelShadowSelectedColor); + rli.readingListMainColor = colorFromJson(o, "readingListMainColor", rli.readingListMainColor); + rli.readingListMainSelectedColor = colorFromJson(o, "readingListMainSelectedColor", rli.readingListMainSelectedColor); + rli.favoritesMainColor = colorFromJson(o, "favoritesMainColor", rli.favoritesMainColor); + rli.favoritesMainSelectedColor = colorFromJson(o, "favoritesMainSelectedColor", rli.favoritesMainSelectedColor); + rli.currentlyReadingMainColor = colorFromJson(o, "currentlyReadingMainColor", rli.currentlyReadingMainColor); + rli.currentlyReadingMainSelectedColor = colorFromJson(o, "currentlyReadingMainSelectedColor", rli.currentlyReadingMainSelectedColor); + rli.currentlyReadingOuterColor = colorFromJson(o, "currentlyReadingOuterColor", rli.currentlyReadingOuterColor); + rli.currentlyReadingOuterSelectedColor = colorFromJson(o, "currentlyReadingOuterSelectedColor", rli.currentlyReadingOuterSelectedColor); + rli.specialListShadowColor = colorFromJson(o, "specialListShadowColor", rli.specialListShadowColor); + rli.specialListShadowSelectedColor = colorFromJson(o, "specialListShadowSelectedColor", rli.specialListShadowSelectedColor); + rli.listMainColor = colorFromJson(o, "listMainColor", rli.listMainColor); + rli.listMainSelectedColor = colorFromJson(o, "listMainSelectedColor", rli.listMainSelectedColor); + rli.listShadowColor = colorFromJson(o, "listShadowColor", rli.listShadowColor); + rli.listShadowSelectedColor = colorFromJson(o, "listShadowSelectedColor", rli.listShadowSelectedColor); + rli.listDetailColor = colorFromJson(o, "listDetailColor", rli.listDetailColor); + rli.listDetailSelectedColor = colorFromJson(o, "listDetailSelectedColor", rli.listDetailSelectedColor); + } + + if (json.contains("dialogIcons")) { + const auto o = json["dialogIcons"].toObject(); + p.dialogIconsParams.iconColor = colorFromJson(o, "iconColor", p.dialogIconsParams.iconColor); + } + + if (json.contains("menuIcons")) { + const auto o = json["menuIcons"].toObject(); + p.menuIconsParams.iconColor = colorFromJson(o, "iconColor", p.menuIconsParams.iconColor); + } + + if (json.contains("shortcutsIcons")) { + const auto o = json["shortcutsIcons"].toObject(); + p.shortcutsIconsParams.iconColor = colorFromJson(o, "iconColor", p.shortcutsIconsParams.iconColor); + } + + if (json.contains("meta")) { + const auto o = json["meta"].toObject(); + p.meta.id = o["id"].toString(p.meta.id); + p.meta.displayName = o["displayName"].toString(p.meta.displayName); + const QString variantStr = o["variant"].toString(); + if (variantStr == "light") + p.meta.variant = ThemeVariant::Light; + else if (variantStr == "dark") + p.meta.variant = ThemeVariant::Dark; + p.meta.targetApp = o["targetApp"].toString(p.meta.targetApp); + p.meta.version = o["version"].toString(p.meta.version); + } + + Theme theme = makeTheme(p); + theme.sourceJson = json; + return theme; +} diff --git a/YACReaderLibrary/themes/theme_factory.h b/YACReaderLibrary/themes/theme_factory.h new file mode 100644 index 000000000..ebed9bbb1 --- /dev/null +++ b/YACReaderLibrary/themes/theme_factory.h @@ -0,0 +1,10 @@ +#ifndef THEME_FACTORY_H +#define THEME_FACTORY_H + +#include "theme.h" + +#include + +Theme makeTheme(const QJsonObject &json); + +#endif // THEME_FACTORY_H diff --git a/YACReaderLibrary/trayhandler.mm b/YACReaderLibrary/trayhandler.mm index c53f0897c..cf1dbdae1 100644 --- a/YACReaderLibrary/trayhandler.mm +++ b/YACReaderLibrary/trayhandler.mm @@ -1,12 +1,11 @@ #include -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #undef __OBJC_BOOL_IS_BOOL -#endif -#import #include "trayhandler.h" +#import + void OSXShowDockIcon() { [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; diff --git a/YACReaderLibrary/trayicon_controller.cpp b/YACReaderLibrary/trayicon_controller.cpp index de7902eeb..4a9ae8098 100644 --- a/YACReaderLibrary/trayicon_controller.cpp +++ b/YACReaderLibrary/trayicon_controller.cpp @@ -1,10 +1,9 @@ #include "trayicon_controller.h" -#include "yacreader_global_gui.h" - #include "library_window.h" +#include "yacreader_global_gui.h" -#include +#include #include #ifdef Q_OS_MACOS diff --git a/YACReaderLibrary/trayicon_controller.h b/YACReaderLibrary/trayicon_controller.h index 1ff9d407d..5d8687b9a 100644 --- a/YACReaderLibrary/trayicon_controller.h +++ b/YACReaderLibrary/trayicon_controller.h @@ -1,7 +1,9 @@ #ifndef TRAYICON_CONTROLLER_H #define TRAYICON_CONTROLLER_H -#include +#include +#include +#include #include class LibraryWindow; diff --git a/YACReaderLibrary/xml_info_library_scanner.cpp b/YACReaderLibrary/xml_info_library_scanner.cpp index 2740e416a..40855e363 100644 --- a/YACReaderLibrary/xml_info_library_scanner.cpp +++ b/YACReaderLibrary/xml_info_library_scanner.cpp @@ -1,14 +1,15 @@ #include "xml_info_library_scanner.h" +#include "QsLog.h" #include "comic_db.h" #include "data_base_management.h" #include "db_helper.h" +#include "folder_item.h" #include "initial_comic_info_extractor.h" #include "xml_info_parser.h" #include "yacreader_global.h" -#include "folder_item.h" -#include "QsLog.h" +#include using namespace YACReader; diff --git a/YACReaderLibrary/xml_info_library_scanner.h b/YACReaderLibrary/xml_info_library_scanner.h index b752a2e18..f0676ad7f 100644 --- a/YACReaderLibrary/xml_info_library_scanner.h +++ b/YACReaderLibrary/xml_info_library_scanner.h @@ -1,8 +1,8 @@ #ifndef XMLINFOLIBRARYSCANNER_H #define XMLINFOLIBRARYSCANNER_H -#include #include +#include namespace YACReader { diff --git a/YACReaderLibrary/yacreader_comics_selection_helper.h b/YACReaderLibrary/yacreader_comics_selection_helper.h index aad8d799b..05566d89d 100644 --- a/YACReaderLibrary/yacreader_comics_selection_helper.h +++ b/YACReaderLibrary/yacreader_comics_selection_helper.h @@ -1,8 +1,10 @@ #ifndef YACREADERCOMICSSELECTIONHELPER_H #define YACREADERCOMICSSELECTIONHELPER_H +#include +#include +#include #include -#include class ComicModel; diff --git a/YACReaderLibrary/yacreader_content_views_manager.cpp b/YACReaderLibrary/yacreader_content_views_manager.cpp index 294a072c7..0d505a8dc 100644 --- a/YACReaderLibrary/yacreader_content_views_manager.cpp +++ b/YACReaderLibrary/yacreader_content_views_manager.cpp @@ -1,22 +1,22 @@ #include "yacreader_content_views_manager.h" -#include "library_window.h" - #include "classic_comics_view.h" -#include "grid_comics_view.h" -#include "info_comics_view.h" #include "comics_view_transition.h" -#include "folder_content_view.h" +#include "empty_folder_widget.h" #include "empty_label_widget.h" -#include "empty_special_list.h" #include "empty_reading_list_widget.h" +#include "empty_special_list.h" +#include "folder_content_view.h" +#include "grid_comics_view.h" +#include "info_comics_view.h" +#include "library_window.h" #include "no_search_results_widget.h" - +#include "options_dialog.h" +#include "yacreader_options_dialog.h" #include "yacreader_sidebar.h" //-- #include "yacreader_search_line_edit.h" -#include "options_dialog.h" YACReaderContentViewsManager::YACReaderContentViewsManager(QSettings *settings, LibraryWindow *parent) : QObject(parent), libraryWindow(parent), classicComicsView(nullptr), gridComicsView(nullptr), infoComicsView(nullptr) @@ -50,6 +50,7 @@ YACReaderContentViewsManager::YACReaderContentViewsManager(QSettings *settings, comicsViewStack->addWidget(emptyLabelWidget = new EmptyLabelWidget()); comicsViewStack->addWidget(emptySpecialList = new EmptySpecialListWidget()); comicsViewStack->addWidget(emptyReadingList = new EmptyReadingListWidget()); + comicsViewStack->addWidget(emptyFolderWidget = new EmptyFolderWidget()); comicsViewStack->addWidget(noSearchResultsWidget = new NoSearchResultsWidget()); comicsViewStack->addWidget(comicsView); @@ -60,6 +61,8 @@ YACReaderContentViewsManager::YACReaderContentViewsManager(QSettings *settings, connect(folderContentView, &FolderContentView::copyComicsToCurrentFolder, libraryWindow, &LibraryWindow::copyAndImportComicsToCurrentFolder); connect(folderContentView, &FolderContentView::moveComicsToCurrentFolder, libraryWindow, &LibraryWindow::moveAndImportComicsToCurrentFolder); connect(libraryWindow->optionsDialog, &YACReaderOptionsDialog::optionsChanged, folderContentView, &FolderContentView::updateSettings); + + initTheme(this); } QWidget *YACReaderContentViewsManager::containerWidget() @@ -126,6 +129,7 @@ void YACReaderContentViewsManager::showComicsView() { comicsViewStack->setCurrentWidget(comicsView); + // TODO: check if this is still needed in the rhi implementation // BUG, ugly workaround for glitch when QOpenGLWidget (flow) is used just after any other widget in the views stack // Somehow QOpenGLWidget is messing with the rendering of the side bar (wrong buffer swapping) libraryWindow->sideBar->update(); @@ -151,6 +155,11 @@ void YACReaderContentViewsManager::showEmptyReadingListWidget() comicsViewStack->setCurrentWidget(emptyReadingList); } +void YACReaderContentViewsManager::showEmptyFolderWidget() +{ + comicsViewStack->setCurrentWidget(emptyFolderWidget); +} + void YACReaderContentViewsManager::showNoSearchResultsView() { comicsViewStack->setCurrentWidget(noSearchResultsWidget); @@ -234,10 +243,11 @@ void YACReaderContentViewsManager::showComicsViewTransition() void YACReaderContentViewsManager::_toggleComicsView() { + const auto &mainToolbar = theme.mainToolbar; + switch (comicsViewStatus) { case Flow: { - QIcon icoViewsButton; - icoViewsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/info"), QSize(), QIcon::Normal); + QIcon icoViewsButton = mainToolbar.infoIcon; libraryWindow->actions.toggleComicsViewAction->setIcon(icoViewsButton); #ifdef Y_MAC_UI libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton); @@ -254,8 +264,7 @@ void YACReaderContentViewsManager::_toggleComicsView() } case Grid: { - QIcon icoViewsButton; - icoViewsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/flow"), QSize(), QIcon::Normal); + QIcon icoViewsButton = mainToolbar.flowIcon; libraryWindow->actions.toggleComicsViewAction->setIcon(icoViewsButton); #ifdef Y_MAC_UI libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton); @@ -270,8 +279,7 @@ void YACReaderContentViewsManager::_toggleComicsView() } case Info: { - QIcon icoViewsButton; - icoViewsButton.addFile(addExtensionToIconPath(":/images/main_toolbar/grid"), QSize(), QIcon::Normal); + QIcon icoViewsButton = mainToolbar.gridIcon; libraryWindow->actions.toggleComicsViewAction->setIcon(icoViewsButton); #ifdef Y_MAC_UI libraryWindow->libraryToolBar->updateViewSelectorIcon(icoViewsButton); @@ -291,3 +299,28 @@ void YACReaderContentViewsManager::_toggleComicsView() if (comicsViewStack->currentWidget() == comicsViewTransition) showComicsView(); } + +void YACReaderContentViewsManager::applyTheme(const Theme &theme) +{ + const auto &mainToolbar = theme.mainToolbar; + + // Update the toggle button icon based on current view status + // The icon shows what the NEXT view will be when clicked + QIcon icon; + switch (comicsViewStatus) { + case Flow: + icon = mainToolbar.gridIcon; + break; + case Grid: + icon = mainToolbar.infoIcon; + break; + case Info: + icon = mainToolbar.flowIcon; + break; + } + + libraryWindow->actions.toggleComicsViewAction->setIcon(icon); +#ifdef Y_MAC_UI + libraryWindow->libraryToolBar->updateViewSelectorIcon(icon); +#endif +} diff --git a/YACReaderLibrary/yacreader_content_views_manager.h b/YACReaderLibrary/yacreader_content_views_manager.h index 67119a0bf..e78a1f62f 100644 --- a/YACReaderLibrary/yacreader_content_views_manager.h +++ b/YACReaderLibrary/yacreader_content_views_manager.h @@ -1,10 +1,12 @@ #ifndef YACREADERCONTENTVIEWSMANAGER_H #define YACREADERCONTENTVIEWSMANAGER_H -#include - +#include "themable.h" #include "yacreader_global_gui.h" +#include +#include + class LibraryWindow; class ComicsView; @@ -16,11 +18,12 @@ class FolderContentView; class EmptyLabelWidget; class EmptySpecialListWidget; class EmptyReadingListWidget; +class EmptyFolderWidget; class NoSearchResultsWidget; using namespace YACReader; -class YACReaderContentViewsManager : public QObject +class YACReaderContentViewsManager : public QObject, protected Themable { Q_OBJECT public: @@ -36,6 +39,7 @@ class YACReaderContentViewsManager : public QObject EmptyLabelWidget *emptyLabelWidget; EmptySpecialListWidget *emptySpecialList; EmptyReadingListWidget *emptyReadingList; + EmptyFolderWidget *emptyFolderWidget; NoSearchResultsWidget *noSearchResultsWidget; @@ -56,6 +60,8 @@ class YACReaderContentViewsManager : public QObject GridComicsView *gridComicsView; InfoComicsView *infoComicsView; + void applyTheme(const Theme &theme) override; + signals: public slots: @@ -67,6 +73,7 @@ public slots: void showEmptyLabelView(); void showEmptySpecialList(); void showEmptyReadingListWidget(); + void showEmptyFolderWidget(); void showNoSearchResultsView(); protected slots: diff --git a/YACReaderLibrary/yacreader_folders_view.cpp b/YACReaderLibrary/yacreader_folders_view.cpp index c042a6e60..18a63e9d5 100644 --- a/YACReaderLibrary/yacreader_folders_view.cpp +++ b/YACReaderLibrary/yacreader_folders_view.cpp @@ -1,14 +1,10 @@ #include "yacreader_folders_view.h" -#include "yacreader_global.h" - -#include "folder_item.h" -#include "folder_model.h" - +#include "QsLog.h" #include "comic.h" #include "comic_files_manager.h" - -#include "QsLog.h" +#include "folder_model.h" +#include "yacreader_treeview.h" YACReaderFoldersView::YACReaderFoldersView(QWidget *parent) : YACReaderTreeView(parent) @@ -20,12 +16,10 @@ void YACReaderFoldersView::dragEnterEvent(QDragEnterEvent *event) { YACReaderTreeView::dragEnterEvent(event); - QList urlList; - if (event->mimeData()->hasUrls() && event->dropAction() == Qt::CopyAction) { - urlList = event->mimeData()->urls(); + const auto urlList = event->mimeData()->urls(); QString currentPath; - foreach (QUrl url, urlList) { + for (const auto &url : urlList) { // comics or folders are accepted, folders' content is validate in dropEvent (avoid any lag before droping) currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath) || QFileInfo(currentPath).isDir()) { @@ -57,7 +51,7 @@ void YACReaderFoldersView::dropEvent(QDropEvent *event) if (validAction) { QList> droppedFiles = ComicFilesManager::getDroppedFiles(event->mimeData()->urls()); - QModelIndex destinationIndex = indexAt(event->pos()); + QModelIndex destinationIndex = indexAt(event->position().toPoint()); if (event->dropAction() == Qt::CopyAction) { QLOG_DEBUG() << "copy - tree :" << droppedFiles; @@ -80,19 +74,30 @@ YACReaderFoldersViewItemDeletegate::YACReaderFoldersViewItemDeletegate(QObject * void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { + // Promote hover to selected so QIcon::Selected mode activates on mouse-over, + // matching the QSS which already uses the same background for hover and selected. + QStyleOptionViewItem opt = option; + if (opt.state & QStyle::State_MouseOver) + opt.state |= QStyle::State_Selected; + + // Get indicator colors from the theme via the owning view + QColor notCompletedColor(237, 197, 24); // Default fallback + QColor newItemDotColor(237, 197, 24); // Default fallback + if (auto foldersView = qobject_cast(parent())) { + const auto &nt = foldersView->navigationTreeTheme(); + notCompletedColor = nt.folderNotCompletedColor; + newItemDotColor = nt.newItemColor; + } + if (!index.data(FolderModel::CompletedRole).toBool()) { painter->save(); -#ifdef Y_MAC_UI - painter->setBrush(QBrush(QColor(85, 95, 127))); -#else - painter->setBrush(QBrush(QColor(237, 197, 24))); -#endif + painter->setBrush(QBrush(notCompletedColor)); painter->setPen(QPen(QBrush(), 0)); - painter->drawRect(0, option.rect.y(), 2, option.rect.height()); + painter->drawRect(0, opt.rect.y(), 2, opt.rect.height()); painter->restore(); } - QStyledItemDelegate::paint(painter, option, index); + QStyledItemDelegate::paint(painter, opt, index); auto showRecent = index.data(FolderModel::ShowRecentRole).toBool(); @@ -105,13 +110,9 @@ void YACReaderFoldersViewItemDeletegate::paint(QPainter *painter, const QStyleOp if (now - added < daysInSeconds || now - updated < daysInSeconds) { painter->save(); painter->setRenderHint(QPainter::Antialiasing); -#ifdef Y_MAC_UI - painter->setBrush(QBrush(QColor(85, 95, 127))); -#else - painter->setBrush(QBrush(QColor(237, 197, 24))); -#endif + painter->setBrush(QBrush(newItemDotColor)); painter->setPen(QPen(QBrush(), 0)); - painter->drawEllipse(option.rect.x() + 13, option.rect.y() + 2, 7, 7); + painter->drawEllipse(opt.rect.x() + 13, opt.rect.y() + 2, 7, 7); painter->restore(); } } diff --git a/YACReaderLibrary/yacreader_folders_view.h b/YACReaderLibrary/yacreader_folders_view.h index 55ea0db4d..30ac57c9f 100644 --- a/YACReaderLibrary/yacreader_folders_view.h +++ b/YACReaderLibrary/yacreader_folders_view.h @@ -1,15 +1,19 @@ #ifndef YACREADER_FOLDERS_VIEW_H #define YACREADER_FOLDERS_VIEW_H +#include "theme.h" #include "yacreader_treeview.h" -#include +#include +#include +#include class YACReaderFoldersView : public YACReaderTreeView { Q_OBJECT public: explicit YACReaderFoldersView(QWidget *parent = nullptr); + const NavigationTreeTheme &navigationTreeTheme() const { return theme.navigationTree; } signals: // Drops diff --git a/YACReaderLibrary/yacreader_history_controller.h b/YACReaderLibrary/yacreader_history_controller.h index b51ecb8ee..8bf539d6b 100644 --- a/YACReaderLibrary/yacreader_history_controller.h +++ b/YACReaderLibrary/yacreader_history_controller.h @@ -1,9 +1,8 @@ #ifndef YACREADER_HISTORY_CONTROLLER_H #define YACREADER_HISTORY_CONTROLLER_H -#include - #include +#include class YACReaderHistoryController; diff --git a/YACReaderLibrary/yacreader_libraries.cpp b/YACReaderLibrary/yacreader_libraries.cpp index 2ac86ff34..6e16d97d2 100644 --- a/YACReaderLibrary/yacreader_libraries.cpp +++ b/YACReaderLibrary/yacreader_libraries.cpp @@ -1,4 +1,5 @@ #include "yacreader_libraries.h" + #include "qnaturalsorting.h" #include "yacreader_global.h" @@ -37,54 +38,54 @@ YACReaderLibraries::YACReaderLibraries(const YACReaderLibraries &source) { } -QList YACReaderLibraries::getNames() +QList YACReaderLibraries::getNames() const { QList names; std::transform(libraries.cbegin(), libraries.cend(), std::back_inserter(names), [](const YACReaderLibrary &library) { return library.getName(); }); return names; } -QString YACReaderLibraries::getPath(const QString &name) +QString YACReaderLibraries::getPath(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend() ? library->getPath() : ""; } -QString YACReaderLibraries::getPath(int id) +QString YACReaderLibraries::getPath(int id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getLegacyId() == id; }); return library != libraries.cend() ? library->getPath() : ""; } -QString YACReaderLibraries::getPath(const QUuid &id) +QString YACReaderLibraries::getPath(const QUuid &id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getId() == id; }); return library != libraries.cend() ? library->getPath() : ""; } -QString YACReaderLibraries::getDBPath(int id) +QString YACReaderLibraries::getDBPath(int id) const { return LibraryPaths::libraryDataPath(getPath(id)); } -QString YACReaderLibraries::getName(int id) +QString YACReaderLibraries::getName(int id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getLegacyId() == id; }); return library != libraries.cend() ? library->getName() : ""; } -bool YACReaderLibraries::isEmpty() +bool YACReaderLibraries::isEmpty() const { return libraries.isEmpty(); } -bool YACReaderLibraries::contains(const QString &name) +bool YACReaderLibraries::contains(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend(); } -bool YACReaderLibraries::contains(int id) +bool YACReaderLibraries::contains(int id) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [id](const YACReaderLibrary &library) { return library.getLegacyId() == id; }); return library != libraries.cend(); @@ -103,19 +104,19 @@ void YACReaderLibraries::rename(const QString &oldName, const QString &newName) libraries.append(YACReaderLibrary(newName, library->getPath(), library->getLegacyId(), library->getId())); } -int YACReaderLibraries::getId(const QString &name) +int YACReaderLibraries::getId(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend() ? library->getLegacyId() : -1; } -QUuid YACReaderLibraries::getUuid(const QString &name) +QUuid YACReaderLibraries::getUuid(const QString &name) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [name](const YACReaderLibrary &library) { return library.getName() == name; }); return library != libraries.cend() ? library->getId() : QUuid(); } -int YACReaderLibraries::getIdFromUuid(const QUuid &uuid) +int YACReaderLibraries::getIdFromUuid(const QUuid &uuid) const { auto library = std::find_if(libraries.cbegin(), libraries.cend(), [uuid](const YACReaderLibrary &library) { return library.getId() == uuid; }); return library != libraries.cend() ? library->getLegacyId() : -1; @@ -148,8 +149,9 @@ QUuid YACReaderLibraries::getLibraryIdFromLegacyId(int legacyId) const void YACReaderLibraries::addLibrary(const QString &name, const QString &path) { int legacyId = 0; - foreach (YACReaderLibrary l, libraries) - legacyId = qMax(legacyId, l.getLegacyId()); + const auto &existingLibraries = libraries; + for (const auto &library : existingLibraries) + legacyId = qMax(legacyId, library.getLegacyId()); legacyId++; auto id = readFromLibraryFolder(path); diff --git a/YACReaderLibrary/yacreader_libraries.h b/YACReaderLibrary/yacreader_libraries.h index e7e8c86d2..c370eb4f2 100644 --- a/YACReaderLibrary/yacreader_libraries.h +++ b/YACReaderLibrary/yacreader_libraries.h @@ -12,20 +12,20 @@ class YACReaderLibraries : public QObject public: YACReaderLibraries(); YACReaderLibraries(const YACReaderLibraries &source); - QList getNames(); - QString getPath(const QString &name); - QString getPath(int id); - QString getPath(const QUuid &id); - QString getDBPath(int id); - QString getName(int id); - bool isEmpty(); - bool contains(const QString &name); - bool contains(int id); + QList getNames() const; + QString getPath(const QString &name) const; + QString getPath(int id) const; + QString getPath(const QUuid &id) const; + QString getDBPath(int id) const; + QString getName(int id) const; + bool isEmpty() const; + bool contains(const QString &name) const; + bool contains(int id) const; void remove(const QString &name); void rename(const QString &oldName, const QString &newName); - int getId(const QString &name); - QUuid getUuid(const QString &name); - int getIdFromUuid(const QUuid &uuid); + int getId(const QString &name) const; + QUuid getUuid(const QString &name) const; + int getIdFromUuid(const QUuid &uuid) const; YACReaderLibraries &operator=(const YACReaderLibraries &source); QList getLibraries() const; QList sortedLibraries() const; diff --git a/YACReaderLibrary/yacreader_local_server.cpp b/YACReaderLibrary/yacreader_local_server.cpp index b506260d1..f367eae5c 100644 --- a/YACReaderLibrary/yacreader_local_server.cpp +++ b/YACReaderLibrary/yacreader_local_server.cpp @@ -1,16 +1,14 @@ #include "yacreader_local_server.h" +#include "QsLog.h" +#include "comic_db.h" +#include "db_helper.h" +#include "yacreader_global.h" + #include #include #include -#include "yacreader_global.h" -#include "db_helper.h" - -#include "comic_db.h" - -#include "QsLog.h" - using namespace YACReader; QMutex YACReaderClientConnectionWorker::dbMutex; diff --git a/YACReaderLibrary/yacreader_local_server.h b/YACReaderLibrary/yacreader_local_server.h index bb935c59c..8a0432e40 100644 --- a/YACReaderLibrary/yacreader_local_server.h +++ b/YACReaderLibrary/yacreader_local_server.h @@ -1,9 +1,9 @@ #ifndef YACREADER_LOCAL_SERVER_H #define YACREADER_LOCAL_SERVER_H +#include #include #include -#include class QLocalServer; class QLocalSocket; diff --git a/YACReaderLibrary/yacreader_main_toolbar.cpp b/YACReaderLibrary/yacreader_main_toolbar.cpp index c879ef6f5..c074d41fc 100644 --- a/YACReaderLibrary/yacreader_main_toolbar.cpp +++ b/YACReaderLibrary/yacreader_main_toolbar.cpp @@ -1,12 +1,12 @@ #include "yacreader_main_toolbar.h" -#include +#include #include -#include #include -#include #include -#include +#include +#include +#include YACReaderMainToolBar::YACReaderMainToolBar(QWidget *parent) : QWidget(parent) @@ -14,8 +14,6 @@ YACReaderMainToolBar::YACReaderMainToolBar(QWidget *parent) mainLayout = new QHBoxLayout; currentFolder = new QLabel(this); - // currentFolder->setAlignment(Qt::AlignCenter); - currentFolder->setStyleSheet(" QLabel {color:#404040; font-size:22px; font-weight:bold;}"); QFont f = currentFolder->font(); f.setStyleStrategy(QFont::PreferAntialias); @@ -76,6 +74,8 @@ YACReaderMainToolBar::YACReaderMainToolBar(QWidget *parent) setLayout(mainLayout); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + initTheme(this); } QSize YACReaderMainToolBar::sizeHint() const @@ -95,7 +95,7 @@ void YACReaderMainToolBar::paintEvent(QPaintEvent *event) Q_UNUSED(event); QPainter painter(this); - painter.fillRect(0, 0, width(), height(), QColor("#F0F0F0")); + painter.fillRect(0, 0, width(), height(), theme.mainToolbar.backgroundColor); } void YACReaderMainToolBar::resizeEvent(QResizeEvent *event) @@ -116,9 +116,9 @@ void YACReaderMainToolBar::resizeEvent(QResizeEvent *event) void YACReaderMainToolBar::addDivider() { - QPixmap img(":/images/main_toolbar/divider.svg"); QLabel *divider = new QLabel(); - divider->setPixmap(img); + divider->setPixmap(theme.mainToolbar.dividerPixmap); + dividers.append(divider); mainLayout->addSpacing(5); mainLayout->addWidget(divider, 0, Qt::AlignVCenter); @@ -149,3 +149,34 @@ void YACReaderMainToolBar::setCurrentFolderName(const QString &name) currentFolder->adjustSize(); currentFolder->move((width() - currentFolder->width()) / 2, (height() - currentFolder->height()) / 2); } + +void YACReaderMainToolBar::applyTheme(const Theme &theme) +{ + const auto &mt = theme.mainToolbar; + + currentFolder->setStyleSheet(mt.folderNameLabelQSS); + + // Update dividers + for (QLabel *divider : dividers) { + divider->setPixmap(mt.dividerPixmap); + } + + // Update action icons via the button's default action + // (buttons get their icons from their default actions when setDefaultAction is called) + if (auto action = backButton->defaultAction()) + action->setIcon(mt.backIcon); + if (auto action = forwardButton->defaultAction()) + action->setIcon(mt.forwardIcon); + if (auto action = settingsButton->defaultAction()) + action->setIcon(mt.settingsIcon); + if (auto action = serverButton->defaultAction()) + action->setIcon(mt.serverIcon); + if (auto action = helpButton->defaultAction()) + action->setIcon(mt.helpIcon); + if (auto action = fullscreenButton->defaultAction()) + action->setIcon(mt.fullscreenIcon); + + // toggleComicsViewButton icon is handled by YACReaderContentViewsManager::applyTheme() + + update(); // Repaint with new background color +} diff --git a/YACReaderLibrary/yacreader_main_toolbar.h b/YACReaderLibrary/yacreader_main_toolbar.h index d010782a8..9526f2ec1 100644 --- a/YACReaderLibrary/yacreader_main_toolbar.h +++ b/YACReaderLibrary/yacreader_main_toolbar.h @@ -1,6 +1,8 @@ #ifndef YACREADER_MAIN_TOOLBAR_H #define YACREADER_MAIN_TOOLBAR_H +#include "themable.h" + #include class QToolButton; @@ -10,7 +12,7 @@ class QPaintEvent; class QHBoxLayout; // TODO create methods for adding actions, separators and sctreches dynimically -class YACReaderMainToolBar : public QWidget +class YACReaderMainToolBar : public QWidget, protected Themable { Q_OBJECT public: @@ -40,8 +42,13 @@ public slots: QLabel *currentFolder; QString currentFolderName; + QList dividers; + void addDivider(); void addWideDivider(); + +protected: + void applyTheme(const Theme &theme) override; }; #endif // YACREADER_MAIN_TOOLBAR_H diff --git a/YACReaderLibrary/yacreader_navigation_controller.cpp b/YACReaderLibrary/yacreader_navigation_controller.cpp index 9e477fe67..56b7623af 100644 --- a/YACReaderLibrary/yacreader_navigation_controller.cpp +++ b/YACReaderLibrary/yacreader_navigation_controller.cpp @@ -1,24 +1,22 @@ #include "yacreader_navigation_controller.h" -#include - -#include "library_window.h" -#include "yacreader_folders_view.h" -#include "yacreader_reading_lists_view.h" -#include "folder_item.h" -#include "yacreader_history_controller.h" +#include "QsLog.h" #include "comic_model.h" -#include "folder_model.h" -#include "reading_list_model.h" #include "comics_view.h" -#include "folder_content_view.h" -#include "yacreader_search_line_edit.h" -#include "yacreader_global.h" #include "empty_label_widget.h" #include "empty_special_list.h" +#include "folder_content_view.h" +#include "folder_item.h" +#include "folder_model.h" +#include "library_window.h" +#include "reading_list_model.h" #include "yacreader_content_views_manager.h" +#include "yacreader_folders_view.h" +#include "yacreader_global.h" +#include "yacreader_history_controller.h" +#include "yacreader_reading_lists_view.h" -#include "QsLog.h" +#include YACReaderNavigationController::YACReaderNavigationController(LibraryWindow *parent, YACReaderContentViewsManager *contentViewsManager) : QObject(parent), libraryWindow(parent), contentViewsManager(contentViewsManager) @@ -64,11 +62,15 @@ void YACReaderNavigationController::loadFolderInfo(const QModelIndex &modelIndex contentViewsManager->comicsView->setModel(libraryWindow->comicsModel); contentViewsManager->showComicsView(); libraryWindow->disableComicsActions(false); - } else { - // showEmptyFolder + } else if (libraryWindow->foldersModel->rowCount(modelIndex) > 0 || !modelIndex.isValid()) { + // folder has subfolders (or is root), show folder content view loadEmptyFolderInfo(modelIndex); contentViewsManager->showFolderContentView(); libraryWindow->disableComicsActions(true); + } else { + // folder has no comics and no subfolders + contentViewsManager->showEmptyFolderWidget(); + libraryWindow->disableComicsActions(true); } // libraryWindow->updateFoldersViewConextMenu(modelIndex); @@ -122,16 +124,13 @@ void YACReaderNavigationController::loadSpecialListInfo(const QModelIndex &model // setup empty special list widget switch (type) { case ReadingListModel::TypeSpecialList::Favorites: - contentViewsManager->emptySpecialList->setPixmap(QPixmap(":/images/empty_favorites.png")); - contentViewsManager->emptySpecialList->setText(tr("No favorites")); + contentViewsManager->emptySpecialList->showFavorites(); break; case ReadingListModel::TypeSpecialList::Reading: - contentViewsManager->emptySpecialList->setPixmap(QPixmap(":/images/empty_current_readings.png")); - contentViewsManager->emptySpecialList->setText(tr("You are not reading anything yet, come on!!")); + contentViewsManager->emptySpecialList->showReading(); break; case ReadingListModel::TypeSpecialList::Recent: - contentViewsManager->emptySpecialList->setPixmap(QPixmap()); - contentViewsManager->emptySpecialList->setText(tr("There are no recent comics!")); + contentViewsManager->emptySpecialList->showRecent(); break; } diff --git a/YACReaderLibrary/yacreader_reading_lists_view.cpp b/YACReaderLibrary/yacreader_reading_lists_view.cpp index 6d3d3b401..7f4c37225 100644 --- a/YACReaderLibrary/yacreader_reading_lists_view.cpp +++ b/YACReaderLibrary/yacreader_reading_lists_view.cpp @@ -1,6 +1,5 @@ #include "yacreader_reading_lists_view.h" -#include "reading_list_item.h" #include "reading_list_model.h" YACReaderReadingListsView::YACReaderReadingListsView(QWidget *parent) @@ -25,7 +24,7 @@ void YACReaderReadingListsView::dragEnterEvent(QDragEnterEvent *event) void YACReaderReadingListsView::dragMoveEvent(QDragMoveEvent *event) { YACReaderTreeView::dragMoveEvent(event); - QModelIndex destinationIndex = indexAt(event->pos()); + QModelIndex destinationIndex = indexAt(event->position().toPoint()); if (model()->canDropMimeData(event->mimeData(), event->proposedAction(), destinationIndex.row(), destinationIndex.column(), destinationIndex.parent())) event->acceptProposedAction(); } @@ -50,7 +49,13 @@ void YACReaderReadingListsViewItemDeletegate::paint(QPainter *painter, const QSt return; } - QStyledItemDelegate::paint(painter, option, index); + // Promote hover to selected so QIcon::Selected mode activates on mouse-over, + // matching the QSS which already uses the same background for hover and selected. + QStyleOptionViewItem opt = option; + if (opt.state & QStyle::State_MouseOver) + opt.state |= QStyle::State_Selected; + + QStyledItemDelegate::paint(painter, opt, index); } QSize YACReaderReadingListsViewItemDeletegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const diff --git a/YACReaderLibrary/yacreader_reading_lists_view.h b/YACReaderLibrary/yacreader_reading_lists_view.h index 12965afe1..9ad883450 100644 --- a/YACReaderLibrary/yacreader_reading_lists_view.h +++ b/YACReaderLibrary/yacreader_reading_lists_view.h @@ -3,7 +3,9 @@ #include "yacreader_treeview.h" -#include +#include +#include +#include class YACReaderReadingListsView : public YACReaderTreeView { diff --git a/YACReaderLibrary/yacreaderlibrary_de.ts b/YACReaderLibrary/yacreaderlibrary_de.ts index bf043d2f4..06f833137 100644 --- a/YACReaderLibrary/yacreaderlibrary_de.ts +++ b/YACReaderLibrary/yacreaderlibrary_de.ts @@ -12,82 +12,70 @@ AddLabelDialog - + cancel Abbrechen - + Label name: Label-Name: - + Choose a color: Wähle eine Farbe: - red - Rot + Rot - orange - Orange + Orange - yellow - Gelb + Gelb - green - Grün + Grün - cyan - Kobalt + Kobalt - blue - Blau + Blau - violet - Violett + Violett - purple - Lila + Lila - pink - Pink + Pink - white - Weiß + Weiß - light - Hell + Hell - dark - Dunkel + Dunkel - + accept Akzeptieren @@ -100,7 +88,7 @@ Hinzufügen - + Add an existing library Eine vorhandene Bibliothek hinzufügen @@ -124,8 +112,8 @@ ApiKeyDialog - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - Bevor du dich mit Comic Vine verbindest, brauchst du deinen eigenen API-Schlüssel. Du kannst <a href="http://www.comicvine.com/api/">hier</a> einen kostenlosen bekommen. + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Bevor du dich mit Comic Vine verbindest, brauchst du deinen eigenen API-Schlüssel. Du kannst <a href="http://www.comicvine.com/api/">hier</a> einen kostenlosen bekommen. @@ -143,93 +131,233 @@ Abbrechen + + AppearanceTabWidget + + + Color scheme + Farbschema + + + + System + Systemumgebung + + + + Light + Helligkeit + + + + Dark + Dunkel + + + + Custom + Brauch + + + + Remove + Entfernen + + + + Remove this user-imported theme + Entfernen Sie dieses vom Benutzer importierte Design + + + + Light: + Licht: + + + + Dark: + Dunkel: + + + + Custom: + Benutzerdefiniert: + + + + Import theme... + Theme importieren... + + + + Theme + Thema + + + + Theme editor + Theme-Editor + + + + Open Theme Editor... + Theme-Editor öffnen... + + + + Theme editor error + Fehler im Theme-Editor + + + + The current theme JSON could not be loaded. + Der aktuelle Theme-JSON konnte nicht geladen werden. + + + + Import theme + Thema importieren + + + + JSON files (*.json);;All files (*) + JSON-Dateien (*.json);;Alle Dateien (*) + + + + Could not import theme from: +%1 + Theme konnte nicht importiert werden von: +%1 + + + + Could not import theme from: +%1 + +%2 + Theme konnte nicht importiert werden von: +%1 + +%2 + + + + Import failed + Der Import ist fehlgeschlagen + + + + BookmarksDialog + + + Lastest Page + Neueste Seite + + + + Close + Schließen + + + + Click on any image to go to the bookmark + Klicke auf ein beliebiges Bild, um zum Lesezeichen zu gehen + + + + + Loading... + Laden... + + ClassicComicsView - + Hide comic flow - Comic "Flow" verstecken + Comic Flow ausblenden ComicInfoView - + Main character or team - + Hauptfigur oder Team - + Teams - + Mannschaften - + Locations - + Standorte - + Authors Autoren - + writer Schriftsteller - + penciller Künstler (Bleistift) - + inker Künstler (Tinte) - + colorist Künstler (Farbe) - + letterer Künstler (Lettering) - + cover artist Künstler (Cover) - + editor - + Redakteur - + imprint - + Imprint - + Publisher Herausgeber - + color Farbe - + b/w Schwarzweiß - + Characters Charaktere @@ -254,17 +382,17 @@ Series - + Serie Volume - + Volumen Story Arc - + Handlungsbogen @@ -294,7 +422,7 @@ Publication Date - + Veröffentlichungsdatum @@ -305,74 +433,82 @@ ComicVineDialog - + back zurück - + next nächste - + skip überspringen - + close schließen - - + + Retrieving tags for : %1 Herunterladen von Tags für : %1 - + Looking for comic... Suche nach Comic... - + search suche - - - + + + Looking for volume... Suche nach Band.... - - + + comic %1 of %2 - %3 Comic %1 von %2 - %3 - + %1 comics selected %1 Comic ausgewählt - + Error connecting to ComicVine Fehler bei Verbindung zu ComicVine - + Retrieving volume info... Herunterladen von Info zu Ausgabe... + + ContinuousPageWidget + + + Loading page %1 + Seite wird geladen %1 + + CreateLibraryDialog - + Create new library Erstelle eine neue Bibliothek @@ -392,7 +528,7 @@ Es kann einige Minuten dauern, eine neue Bibliothek zu erstellen. Sie können den Prozess abbrechen und die Bibliothek später aktualisieren, um den Vorgang abzuschließen. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben @@ -407,7 +543,7 @@ Bibliothek-Name : - + Path not found Pfad nicht gefunden @@ -430,40 +566,41 @@ Kürzel-Einstellungen - + Shortcut in use Verwendete Kürzel - - The shortcut "%1" is already assigned to other function - Das Kürzel "%1" ist bereits für eine andere Funktion in Verwendung + + The shortcut "%1" is already assigned to other function + Das Kürzel "%1" ist bereits für eine andere Funktion in Verwendung EmptyFolderWidget - - Subfolders in this folder - Unterordner in diesem Ordner + Unterordner in diesem Ordner - Empty folder - Leerer Ordner + Leerer Ordner - Drag and drop folders and comics here - Ziehen Sie Ordner und Comics hierher, um sie abzulegen + Ziehen Sie Ordner und Comics hierher, um sie abzulegen + + + + This folder doesn't contain comics yet + Dieser Ordner enthält noch keine Comics EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet Dieses Label enthält noch keine Comics @@ -475,6 +612,24 @@ Diese Leseliste enthält noch keine Comics
+ + EmptySpecialListWidget + + + No favorites + Keine Favoriten + + + + You are not reading anything yet, come on!! + Sie lesen noch nichts, starten Sie!! + + + + There are no recent comics! + Es gibt keine aktuellen Comics! + + ExportComicsInfoDialog @@ -483,7 +638,7 @@ Zieldatei : - + Destination database name Ziel-Datenbank Name @@ -498,17 +653,17 @@ Erstellen - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben - + Export comics info Comicinfo exportieren - + Problem found while writing Problem beim Schreiben @@ -526,7 +681,7 @@ Erstellen - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben @@ -536,17 +691,17 @@ Ziel-Ordner : - + Problem found while writing Problem beim Schreiben - + Create covers package Erzeuge Titelbild-Paket - + Destination directory Ziel-Verzeichnis @@ -577,23 +732,52 @@ FolderContentView - + Continue Reading... - + Weiterlesen... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Seite : + + + + Go To + Gehe zu + + + + Cancel + Abbrechen + + + + + Total pages : + Seiten gesamt : + + + + Go to... + Gehe zu... + + + + GoToFlowToolBar + + + Page : + Seite : GridComicsView - + Show info Info anzeigen @@ -601,17 +785,17 @@ HelpAboutDialog - + Help Hilfe - + System info - + Systeminformationen - + About Über @@ -639,9 +823,9 @@ Importiere Comic-Info - + Comics info file (*.ydb) - Comics Info File (*.ydb) + Comics-Info-Datei (*.ydb) @@ -662,7 +846,7 @@ Entpacken - + Compresed library covers (*.clc) Komprimierte Bibliothek Cover (*.clc) @@ -677,7 +861,7 @@ Bibliothek-Name : - + Extract a catalog Einen Katalog extrahieren @@ -685,54 +869,54 @@ ImportWidget - + stop - Stop + Stopp - + Importing comics Comics werden importiert - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderLibrary erstellt nun eine neue Bibliothek. </p><p>Es kann einige Minuten dauern, eine neue Bibliothek zu erstellen. Sie können den Prozess abbrechen und die Bibliothek später aktualisieren, um den Vorgang abzuschließen.</p> - + Some of the comics being added... Einige der Comics werden hinzugefügt... - + Updating the library Aktualisierung der Bibliothek - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>Die aktuelle Bibliothek wird gerade aktualisiert. Für eine schnellere Aktualisierung, aktualisieren Sie die Bibliothek bitte regelmäßig.</p><p>Sie können den Prozess abbrechen und mit der Aktualisierung später fortfahren.<p> - + Upgrading the library Upgrade der Bibliothek - + <p>The current library is being upgraded, please wait.</p> Die aktuelle Bibliothek wird gerade upgegradet, bitte warten. - + Scanning the library - + Durchsuchen der Bibliothek - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>Die aktuelle Bibliothek wird nach alten XML-Metadateninformationen durchsucht.</p><p>Dies ist nur einmal erforderlich und nur, wenn die Bibliothek mit YACReaderLibrary 9.8.2 oder früher erstellt wurde.</p> @@ -742,22 +926,22 @@ Bearbeiten - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. Der ausgewählte Ordner enthält keine Bibliothek. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Diese Bibliothek wurde mit einer älteren Version von YACReader erzeugt. Sie muss geupdated werden. Jetzt updaten? - + Comic - Comic + Komisch - + Error opening the library Fehler beim Öffnen der Bibliothek @@ -766,8 +950,8 @@ Zeige/Verberge Markierungen - - + + YACReader not found YACReader nicht gefunden @@ -784,12 +968,12 @@ Comic als gelesen markieren - + Remove and delete metadata Entferne und lösche Metadaten - + Old library Alte Bibliothek @@ -798,12 +982,12 @@ Titelbild updaten - + Set as completed Als gelesen markieren - + Library Bibliothek @@ -816,7 +1000,7 @@ Vollbildmodus an/aus - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Die Bibliothek wurde mit einer neueren Version von YACReader erstellt. Die neue Version jetzt herunterladen? @@ -829,26 +1013,26 @@ Aktuelle Bibliothek updaten - - Library '%1' is no longer available. Do you want to remove it? - Bibliothek '%1' ist nicht mehr verfügbar. Wollen Sie sie entfernen? + + Library '%1' is no longer available. Do you want to remove it? + Bibliothek '%1' ist nicht mehr verfügbar. Wollen Sie sie entfernen? Update library Bibliothek updaten - + Open folder... Öffne Ordner... - + Do you want remove Möchten Sie entfernen - + Set as uncompleted Als nicht gelesen markieren @@ -857,12 +1041,12 @@ Comic-Bewertung zurücksetzen - + Error updating the library Fehler beim Updaten der Bibliothek - + Folder Ordner @@ -871,16 +1055,16 @@ Alle Unterordner anzeigen - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - Bibliothek '%1' wurde mit einer älteren Version von YACReader erstellt. Sie muss neu erzeugt werden. Wollen Sie die Bibliothek jetzt erzeugen? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Bibliothek '%1' wurde mit einer älteren Version von YACReader erstellt. Sie muss neu erzeugt werden. Wollen Sie die Bibliothek jetzt erzeugen? Pack covers Titelbild-Paket erzeugen - + Set as read Als gelesen markieren @@ -901,7 +1085,7 @@ Neue Bibliothek erstellen - + Library not available Bibliothek nicht verfügbar @@ -910,7 +1094,7 @@ Importiere Comics-Info - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. Es gab ein Problem beim Löschen der ausgewählten Comics. Überprüfen Sie bitte die Schreibberechtigung für die ausgewählten Dateien oder Ordner. @@ -919,12 +1103,12 @@ Aktuellen Comic öffnen - + YACReader Library YACReader Bibliothek - + Error creating the library Fehler beim Erstellen der Bibliothek @@ -933,7 +1117,7 @@ Titelbilder entpacken - + Update needed Update benötigt @@ -942,22 +1126,22 @@ Eine vorhandede Bibliothek öffnen - + Library name already exists Bibliothek-Name bereits vorhanden - - There is another library with the name '%1'. - Es gibt bereits eine Bibliothek mit dem Namen '%1'. + + There is another library with the name '%1'. + Es gibt bereits eine Bibliothek mit dem Namen '%1'. - + Download new version Neue Version herunterladen - + Delete comics Comics löschen @@ -986,7 +1170,7 @@ Katalog entpacken - + All the selected comics will be deleted from your disk. Are you sure? Alle ausgewählten Comics werden von Ihrer Festplatte gelöscht. Sind Sie sicher? @@ -995,13 +1179,13 @@ Tags von Comic Vine herunterladen - - + + Set as unread Als ungelesen markieren - + Library not found Bibliothek nicht gefunden @@ -1014,58 +1198,58 @@ Bibliothek entfernen - - - + + + manga - + Manga - - - + + + comic - + komisch - - - + + + web comic - + Webcomic - - - + + + western manga (left to right) - + Western-Manga (von links nach rechts) Open containing folder... Öffne aktuellen Ordner... - - + + Unable to delete Löschen nicht möglich - - - + + + 4koma (top to botom) 4koma (top to botom - + 4koma (von oben nach unten) - + library? Bibliothek? - + Are you sure? Sind Sie sicher? @@ -1074,9 +1258,9 @@ Ausgewählte Titelbilder speichern in... - + Rescan library for XML info - + Durchsuchen Sie die Bibliothek erneut nach XML-Informationen Save covers of the selected comics as JPG files @@ -1103,7 +1287,7 @@ Gelesen-Markierungen anzeigen oder verbergen - + Add new folder Neuen Ordner erstellen @@ -1112,7 +1296,7 @@ Neuen Ordner in der aktuellen Bibliothek erstellen - + Delete folder Ordner löschen @@ -1145,7 +1329,7 @@ &Schließen - + Update folder Ordner aktualisieren @@ -1198,190 +1382,191 @@ Ausgewählte Comics zu Favoriten hinzufügen - + Upgrade failed Update gescheitert - + There were errors during library upgrade in: Beim Upgrade der Bibliothek kam es zu Fehlern in: - - + + Copying comics... Kopieren von Comics... - - + + Moving comics... Verschieben von Comics... - + Folder name: Ordnername - + No folder selected Kein Ordner ausgewählt - + Please, select a folder first Bitte wählen Sie zuerst einen Ordner aus - + Error in path Fehler im Pfad - - There was an error accessing the folder's path + + There was an error accessing the folder's path Beim Aufrufen des Ordnerpfades kam es zu einem Fehler - + The selected folder and all its contents will be deleted from your disk. Are you sure? Der ausgewählte Ordner und sein gesamter Inhalt wird von Ihrer Festplatte gelöscht. Sind Sie sicher? - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. Beim Löschen des ausgewählten Ordners ist ein Problem aufgetreten. Bitte überprüfen Sie die Schreibrechte und stellen Sie sicher, dass keine Anwendung diese Ordner oder die darin enthaltenen Dateien verwendet. - + Add new reading lists Neue Leseliste hinzufügen - - + + List name: Name der Liste - + Delete list/label Ausgewählte/s Liste/Label löschen - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? Das ausgewählte Element wird gelöscht; Ihre Comics oder Ordner werden NICHT von Ihrer Festplatte gelöscht. Sind Sie sicher? - + Rename list name Listenname ändern - - - - + + + + Set type - + Typ festlegen - + Set custom cover - + Legen Sie ein benutzerdefiniertes Cover fest - + Delete custom cover - + Benutzerdefiniertes Cover löschen - + Save covers Titelbilder speichern - + You are adding too many libraries. Sie fügen zu viele Bibliotheken hinzu. - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. Sie fügen zu viele Bibliotheken hinzu. - Wahrscheinlich brauchen Sie nur eine Bibliothek in Ihrem obersten Comic-Ordner, Sie können alle Unterordner mit Hilfe des Ordnerbereichs in der linken Seitenleiste durchsuchen. + +Wahrscheinlich brauchen Sie nur eine Bibliothek in Ihrem obersten Comic-Ordner, Sie können alle Unterordner mit Hilfe des Ordnerbereichs in der linken Seitenleiste durchsuchen. YACReaderLibrary wird Sie nicht daran hindern, weitere Bibliotheken zu erstellen, aber Sie sollten die Anzahl der Bibliotheken gering halten. - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. YACReader nicht gefunden. YACReader muss im gleichen Ordner installiert sein wie YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. YACReader nicht gefunden. Eventuell besteht ein Problem mit Ihrer YACReader-Installation. - + Error - Error + Fehler - + Error opening comic with third party reader. - + Beim Öffnen des Comics mit dem Drittanbieter-Reader ist ein Fehler aufgetreten. - + Library info - + Informationen zur Bibliothek - + Assign comics numbers Comics Nummern zuweisen - + Assign numbers starting in: Nummern zuweisen, beginnend mit: - + Invalid image - + Ungültiges Bild - + The selected file is not a valid image. - + Die ausgewählte Datei ist kein gültiges Bild. - + Error saving cover - + Fehler beim Speichern des Covers - + There was an error saving the cover image. - + Beim Speichern des Titelbildes ist ein Fehler aufgetreten. - + Remove comics Comics löschen - + Comics will only be deleted from the current label/list. Are you sure? Comics werden nur vom aktuellen Label/der aktuellen Liste gelöscht. Sind Sie sicher? @@ -1389,439 +1574,439 @@ YACReaderLibrary wird Sie nicht daran hindern, weitere Bibliotheken zu erstellen LibraryWindowActions - + Create a new library - Neue Bibliothek erstellen + Neue Bibliothek erstellen - + Open an existing library - Eine vorhandede Bibliothek öffnen + Eine vorhandede Bibliothek öffnen - - + + Export comics info - + Comicinfo exportieren - - + + Import comics info - + Importiere Comic-Info - + Pack covers - Titelbild-Paket erzeugen + Titelbild-Paket erzeugen - + Pack the covers of the selected library - Packe die Titelbilder der ausgewählten Bibliothek in ein Paket + Packe die Titelbilder der ausgewählten Bibliothek in ein Paket - + Unpack covers - Titelbilder entpacken + Titelbilder entpacken - + Unpack a catalog - Katalog entpacken + Katalog entpacken - + Update library - + Bibliothek updaten - + Update current library - Aktuelle Bibliothek updaten + Aktuelle Bibliothek updaten - + Rename library - Bibliothek umbenennen + Bibliothek umbenennen - + Rename current library - Aktuelle Bibliothek umbenennen + Aktuelle Bibliothek umbenennen - + Remove library - Bibliothek entfernen + Bibliothek entfernen - + Remove current library from your collection - Aktuelle Bibliothek aus der Sammlung entfernen + Aktuelle Bibliothek aus der Sammlung entfernen - + Rescan library for XML info - + Durchsuchen Sie die Bibliothek erneut nach XML-Informationen - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Versucht, in Comic-Dateien eingebettete XML-Informationen zu finden. Sie müssen dies nur tun, wenn die Bibliothek mit 9.8.2 oder früheren Versionen erstellt wurde oder wenn Sie Software von Drittanbietern verwenden, um XML-Informationen in die Dateien einzubetten. - + Show library info - + Bibliotheksinformationen anzeigen - + Show information about the current library - + Informationen zur aktuellen Bibliothek anzeigen - + Open current comic - Aktuellen Comic öffnen + Aktuellen Comic öffnen - + Open current comic on YACReader - Aktuellen Comic mit YACReader öffnen + Aktuellen Comic mit YACReader öffnen - + Save selected covers to... - Ausgewählte Titelbilder speichern in... + Ausgewählte Titelbilder speichern in... - + Save covers of the selected comics as JPG files - Titelbilder der ausgewählten Comics als JPG-Datei speichern + Titelbilder der ausgewählten Comics als JPG-Datei speichern - - + + Set as read - Als gelesen markieren + Als gelesen markieren - + Set comic as read - Comic als gelesen markieren + Comic als gelesen markieren - - + + Set as unread - Als ungelesen markieren + Als ungelesen markieren - + Set comic as unread - Comic als ungelesen markieren + Comic als ungelesen markieren - - + + manga - + Manga - + Set issue as manga - Ausgabe als Manga festlegen + Ausgabe als Manga festlegen - - + + comic - + komisch - + Set issue as normal - Ausgabe als normal festlegen + Ausgabe als normal festlegen - + western manga - + Western-Manga - + Set issue as western manga - + Ausgabe als Western-Manga festlegen - - + + web comic - + Webcomic - + Set issue as web comic - + Ausgabe als Webcomic festlegen - - + + yonkoma - + Yonkoma - + Set issue as yonkoma - + Stellen Sie das Problem als Yonkoma ein - + Show/Hide marks - Zeige/Verberge Markierungen + Zeige/Verberge Markierungen - + Show or hide read marks - Gelesen-Markierungen anzeigen oder verbergen + Gelesen-Markierungen anzeigen oder verbergen - + Show/Hide recent indicator - + Aktuelle Anzeige ein-/ausblenden - + Show or hide recent indicator - + Aktuelle Anzeige anzeigen oder ausblenden - - + + Fullscreen mode on/off - Vollbildmodus an/aus + Vollbildmodus an/aus - + Help, About YACReader - Hilfe, Über YACReader + Hilfe, Über YACReader - + Add new folder - Neuen Ordner erstellen + Neuen Ordner erstellen - + Add new folder to the current library - Neuen Ordner in der aktuellen Bibliothek erstellen + Neuen Ordner in der aktuellen Bibliothek erstellen - + Delete folder - Ordner löschen + Ordner löschen - + Delete current folder from disk - Aktuellen Ordner von der Festplatte löschen + Aktuellen Ordner von der Festplatte löschen - + Select root node - Ursprungsordner auswählen + Ursprungsordner auswählen - + Expand all nodes - Alle Unterordner anzeigen + Alle Unterordner anzeigen - + Collapse all nodes - Alle Unterordner einklappen + Alle Unterordner einklappen - + Show options dialog - Zeige den Optionen-Dialog + Zeige den Optionen-Dialog - + Show comics server options dialog - Zeige Comic-Server-Optionen-Dialog + Zeige Comic-Server-Optionen-Dialog - - + + Change between comics views - Zwischen Comic-Anzeigemodi wechseln + Zwischen Comic-Anzeigemodi wechseln - + Open folder... - Öffne Ordner... + Öffne Ordner... - + Set as uncompleted - Als nicht gelesen markieren + Als nicht gelesen markieren - + Set as completed - Als gelesen markieren + Als gelesen markieren - + Set custom cover - + Legen Sie ein benutzerdefiniertes Cover fest - + Delete custom cover - + Benutzerdefiniertes Cover löschen - + western manga (left to right) - + Western-Manga (von links nach rechts) - + Open containing folder... - Öffne aktuellen Ordner... + Öffne aktuellen Ordner... - + Reset comic rating - Comic-Bewertung zurücksetzen + Comic-Bewertung zurücksetzen - + Select all comics - Alle Comics auswählen + Alle Comics auswählen - + Edit - Bearbeiten + Bearbeiten - + Assign current order to comics - Aktuele Sortierung auf Comics anwenden + Aktuele Sortierung auf Comics anwenden - + Update cover - Titelbild updaten + Titelbild updaten - + Delete selected comics - Ausgewählte Comics löschen + Ausgewählte Comics löschen - + Delete metadata from selected comics - + Metadaten aus ausgewählten Comics löschen - + Download tags from Comic Vine - Tags von Comic Vine herunterladen + Tags von Comic Vine herunterladen - + Focus search line - + Suchzeile fokussieren - + Focus comics view - + Fokus-Comic-Ansicht - + Edit shortcuts - Kürzel bearbeiten + Kürzel bearbeiten - + &Quit - &Schließen + &Schließen - + Update folder - Ordner aktualisieren + Ordner aktualisieren - + Update current folder - Aktuellen Ordner aktualisieren + Aktuellen Ordner aktualisieren - + Scan legacy XML metadata - + Scannen Sie ältere XML-Metadaten - + Add new reading list - Neue Leseliste hinzufügen + Neue Leseliste hinzufügen - + Add a new reading list to the current library - Neue Leseliste zur aktuellen Bibliothek hinzufügen + Neue Leseliste zur aktuellen Bibliothek hinzufügen - + Remove reading list - Leseliste entfernen + Leseliste entfernen - + Remove current reading list from the library - Aktuelle Leseliste von der Bibliothek entfernen + Aktuelle Leseliste von der Bibliothek entfernen - + Add new label - Neues Label hinzufügen + Neues Label hinzufügen - + Add a new label to this library - Neues Label zu dieser Bibliothek hinzufügen + Neues Label zu dieser Bibliothek hinzufügen - + Rename selected list - Ausgewählte Liste umbenennen + Ausgewählte Liste umbenennen - + Rename any selected labels or lists - Ausgewählte Labels oder Listen umbenennen + Ausgewählte Labels oder Listen umbenennen - + Add to... - Hinzufügen zu... + Hinzufügen zu... - + Favorites - Favoriten + Favoriten - + Add selected comics to favorites list - Ausgewählte Comics zu Favoriten hinzufügen + Ausgewählte Comics zu Favoriten hinzufügen @@ -1835,376 +2020,578 @@ YACReaderLibrary wird Sie nicht daran hindern, weitere Bibliotheken zu erstellen LogWindow - Log window - Protokollfenster + Protokollfenster - &Pause - &Pause + Pause - &Save - &Speichern + &Speichern - C&lear - L&öschen + L&öschen - &Copy - &Kopieren + &Kopieren - Level: - Level: + Level - &Auto scroll - Automatisches Scrollen + Automatisches Scrollen NoLibrariesWidget - + create your first library Erstellen Sie Ihre erste Bibliothek - - You don't have any libraries yet + + You don't have any libraries yet Sie haben aktuell noch keine Bibliothek - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>Sie können eine Bibliothek in jedem beliebigen Ordner erstellen, YACReaderLibrary wird alle Comics und Unterordner von diesem Ordner importieren. Wenn Sie bereits eine Bibliothek erstellt haben, können Sie sie öffnen.</p><p>Vergessen Sie nicht, dass Sie YACReader als eigentsändige Anwendung nutzen können, um Comics auf Ihrem Computer zu lesen.</p> - + add an existing one Existierende hinzufügen + + NoSearchResultsWidget + + + No results + Keine Ergebnisse + + OptionsDialog - + + + Appearance + Aussehen + + + + Options Optionen - + + + Language + Sprache + + + + + Application language + Anwendungssprache + + + + + System default + Systemstandard + + + Tray icon settings (experimental) Taskleisten-Einstellungen (experimentell) - + Close to tray In Taskleiste schließen - + Start into the system tray In die Taskleiste starten - + Edit Comic Vine API key Comic Vine API-Schlüssel ändern - + Comic Vine API key Comic Vine API Schlüssel - + ComicInfo.xml legacy support - + ComicInfo.xml-Legacy-Unterstützung - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Importieren Sie Metadaten aus ComicInfo.xml, wenn Sie neue Comics hinzufügen - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + Berücksichtigen Sie „neue“ Elemente, die seit X Tagen hinzugefügt oder aktualisiert wurden - + Third party reader - + Drittanbieter-Reader - + Write {comic_file_path} where the path should go in the command - + Schreiben Sie {comic_file_path}, wohin der Pfad im Befehl gehen soll - + + Clear - + Löschen - + Update libraries at startup - + Aktualisieren Sie die Bibliotheken beim Start - + Try to detect changes automatically - + Versuchen Sie, Änderungen automatisch zu erkennen - + Update libraries periodically - + Aktualisieren Sie die Bibliotheken regelmäßig - + Interval: - + Intervall: - + 30 minutes - + 30 Minuten - + 1 hour - + 1 Stunde - + 2 hours - + 2 Stunden - + 4 hours - + 4 Stunden - + 8 hours - + 8 Stunden - + 12 hours - + 12 Stunden - + daily - + täglich - + Update libraries at certain time - + Aktualisieren Sie Bibliotheken zu einem bestimmten Zeitpunkt - + Time: - + Zeit: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + WARNUNG! Während Bibliotheksaktualisierungen sind Schreibvorgänge in die Datenbank deaktiviert! +Planen Sie keine Updates, während Sie die App möglicherweise aktiv nutzen. +Bei automatischen Updates blockiert die App einige Aktionen, bis das Update abgeschlossen ist. +Um eine automatische Aktualisierung zu stoppen, tippen Sie auf die Ladeanzeige neben dem Titel „Bibliotheken“. - + Modifications detection - + Erkennung von Änderungen - + Compare the modified date of files when updating a library (not recommended) - + Vergleichen Sie das Änderungsdatum von Dateien beim Aktualisieren einer Bibliothek (nicht empfohlen) - + Enable background image Hintergrundbild aktivieren - + Opacity level Deckkraft-Stufe - + Blur level Unschärfe-Stufe - + Use selected comic cover as background Den ausgewählten Comic als Hintergrund verwenden - + Restore defautls Standardwerte wiederherstellen - + Background Hintergrund - + Display continue reading banner Weiterlesen-Banner anzeigen - + Display current comic banner - + Aktuelles Comic-Banner anzeigen - + Continue reading Weiterlesen - + Comic Flow Comic Flow - - + + Libraries - Bibliotheken + Bibliotheken - + Grid view Rasteransicht - + + General Allgemein - - - PropertiesDialog - - Day: - Tag: + + My comics path + Meine Comics-Pfad - - Plot - Inhalt + + Display + Anzeige - - Size: - Größe: + + Show time in current page information label + Zeit im Informationsetikett der aktuellen Seite anzeigen - - Year: - Jahr: + + "Go to flow" size + Größe von "Gehe zu Comic Flow" - - Inker(s): - Künstler(Tinte): + + Background color + Hintergrundfarbe - - Publishing - Veröffentlichung + + Choose + Auswählen - - Publisher: - Verlag: + + Scroll behaviour + Scrollverhalten - - General info - Allgemeine Info + + Disable scroll animations and smooth scrolling + Scroll-Animationen und sanftes Scrollen deaktivieren - - Color/BW: - Farbe/Schwarz-Weiß: + + Do not turn page using scroll + Blättern Sie nicht mit dem Scrollen um - - Edit selected comics information - Ausgewählte Comic-Informationen bearbeiten + + Use single scroll step to turn page + Verwenden Sie einen einzelnen Bildlaufschritt, um die Seite umzublättern - - Penciller(s): - Künstler(Bleistift): + + Mouse mode + Mausmodus - - Colorist(s): - Künstler(Farbe): + + Only Back/Forward buttons can turn pages + Nur mit den Zurück-/Vorwärts-Tasten können Seiten umgeblättert werden - - Genre: - Genre: + + Use the Left/Right buttons to turn pages. + Verwenden Sie die Links-/Rechts-Tasten, um Seiten umzublättern. - - Notes - + + Click left or right half of the screen to turn pages. + Klicken Sie auf die linke oder rechte Hälfte des Bildschirms, um die Seiten umzublättern. - - Load previous page as cover - + + Quick Navigation Mode + Schnellnavigations-Modus - - Load next page as cover - + + Disable mouse over activation + Aktivierung durch Maus deaktivieren - - Reset cover to the default image - + + Brightness + Helligkeit - + + Contrast + Kontrast + + + + Gamma + Gammawert + + + + Reset + Zurücksetzen + + + + Image options + Bilderoptionen + + + + Fit options + Anpassungsoptionen + + + + Enlarge images to fit width/height + Bilder vergrößern, um sie Breite/Höhe anzupassen + + + + Double Page options + Doppelseiten-Einstellungen + + + + Show covers as single page + Cover als eine Seite darstellen + + + + Scaling + Skalierung + + + + Scaling method + Skalierungsmethode + + + + Nearest (fast, low quality) + Am nächsten (schnell, niedrige Qualität) + + + + Bilinear + Bilinear-Filter + + + + Lanczos (better quality) + Lanczos (bessere Qualität) + + + + Page Flow + Seitenfluss + + + + Image adjustment + Bildanpassung + + + + + Restart is needed + Neustart erforderlich + + + + Comics directory + Comics-Verzeichnis + + + + PropertiesDialog + + + Day: + Tag: + + + + Plot + Inhalt + + + + Size: + Größe: + + + + Year: + Jahr: + + + + Inker(s): + Künstler(Tinte): + + + + Publishing + Veröffentlichung + + + + Publisher: + Verlag: + + + + General info + Allgemeine Info + + + + Color/BW: + Farbe/Schwarz-Weiß: + + + + Edit selected comics information + Ausgewählte Comic-Informationen bearbeiten + + + + Penciller(s): + Künstler(Bleistift): + + + + Colorist(s): + Künstler(Farbe): + + + + Genre: + Gattung: + + + + Notes + Notizen + + + + Load previous page as cover + Vorherige Seite als Cover laden + + + + Load next page as cover + Nächste Seite als Cover laden + + + + Reset cover to the default image + Cover auf das Standardbild zurücksetzen + + + Load custom cover image - + Laden Sie ein benutzerdefiniertes Titelbild Series: - Serie: + Serie: @@ -2214,27 +2601,27 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + alt. Nummer: Alternate series: - + Alternative Serie: Series Group: - + Seriengruppe: Editor(s): - + Herausgeber(n): Imprint: - + Impressum: @@ -2244,32 +2631,32 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + Typ: Language (ISO): - + Sprache (ISO): Teams: - + Mannschaften: Locations: - + Standorte: Main character or team: - + Hauptfigur oder Team: Review: - + Rezension: @@ -2279,12 +2666,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Invalid cover - + Ungültiger Versicherungsschutz The image is invalid. - + Das Bild ist ungültig. @@ -2329,7 +2716,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + Schlagworte: @@ -2353,8 +2740,8 @@ To stop an automatic update tap on the loading indicator next to the Libraries t - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine Link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine-Link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ansehen </a> @@ -2364,7 +2751,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Format: - Format: + Formatangabe: @@ -2385,7 +2772,23 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Manga: - Manga: + Manga-Typ: + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer ist die Headless-Version (keine GUI) von YACReaderLibrary. + +Diese Anwendung unterstützt dauerhafte Einstellungen. Um sie einzurichten, bearbeiten Sie diese Datei %1 +Um mehr über die verfügbaren Einstellungen zu erfahren, lesen Sie bitte die Dokumentation unter https://raw.githubusercontent.com/YACReader/yareader/develop/YACReaderLibraryServer/SETTINGS_README.md @@ -2413,7 +2816,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Info - Info + Information @@ -2423,69 +2826,87 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Error - Error + Fehler Fatal - Fatal + Tödlich - + Select custom cover - + Wählen Sie ein benutzerdefiniertes Cover - + Images (%1) - + Bilder (%1) + + + + The file could not be read or is not valid JSON. + Die Datei konnte nicht gelesen werden oder ist kein gültiges JSON. + + + + This theme is for %1, not %2. + Dieses Thema ist für %1, nicht für %2. + + + + Libraries + Bibliotheken + + + + Folders + Ordner + + + + Reading Lists + Leselisten QsLogging::LogWindowModel - Time - Zeit + Zeit - Level - Level + Stufe - Message - Nachricht + Nachricht QsLogging::Window - &Pause - &Pause + Pause - &Resume - &Weiter + &Weiter - Save log - Protokoll speichern + Protokoll speichern - Log file (*.log) - Protokolldatei (*.log) + Protokolldatei (*.log) RenameLibraryDialog - + Rename current library Aktuelle Bibliothek umbenennen @@ -2508,18 +2929,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of %1 found : %2 Anzahl von %1 gefunden : %2 - - + + page %1 of %2 Seite %1 von %2 - + Number of volumes found : %1 Anzahl der gefundenen Bände: %1 @@ -2530,17 +2951,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - Bitte stellen Sie weitere Informationen zur Verfügung. + Bitte stellen Sie weitere Informationen zur Verfügung. - + Series: Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Verwenden Sie die Suche nach exakten Übereinstimmungen. Deaktivieren Sie diese Option, wenn Sie Bände finden möchten, die mit einigen Wörtern im Namen übereinstimmen. @@ -2551,40 +2972,40 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Bitte stellen Sie weitere Informationen zur Verfügung. - + Series: Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Verwenden Sie die Suche nach exakten Übereinstimmungen. Deaktivieren Sie diese Option, wenn Sie Bände finden möchten, die mit einigen Wörtern im Namen übereinstimmen. SelectComic - + loading description Beschreibung wird laden - + comics Comics - + loading cover Titelbild wird geladen - + comic description unavailable - + Comic-Beschreibung nicht verfügbar - + Please, select the right comic info. Bitte wählen Sie die korrekte Comic-Information aus. @@ -2596,37 +3017,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + loading description Beschreibung wird geladen - + Please, select the right series for your comic. Bitte wählen Sie die korrekte Serie für Ihre Comics aus. - + Filter: - + Filteroption: - + Nothing found, clear the filter if any. - + Nichts gefunden. Löschen Sie ggf. den Filter. - + loading cover Titelbild wird geladen - + volume description unavailable - + Bandbeschreibung nicht verfügbar - + volumes Bände @@ -2638,12 +3059,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SeriesQuestion - + no Nein - + yes Ja @@ -2656,41 +3077,41 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + Port Anschluss - + enable the server Server aktivieren - + set port Anschluss wählen - + Server connectivity information Serveranschluss-Information - + Scan it! Durchsuchen! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader ist für iOS- und Android-Geräte verfügbar.<br/>Entdecken Sie es für <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> oder <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - YACReader ist für iOS-Geräte verfügbar. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Jetzt entdecken! </a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + YACReader ist für iOS-Geräte verfügbar. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Jetzt entdecken! </a> - + Choose an IP address IP-Adresse auswählen @@ -2708,339 +3129,1167 @@ um die Leistung zu verbessern SortVolumeComics - + remove selected comics Ausgewählte Comics entfernen - + sort comics to match comic information Comics laut Comic-Information sortieren - + restore all removed comics Alle entfernten Comics wiederherstellen - + issues Ausgaben - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. Sortieren Sie bitte die Comic-Informationen links, bis die Informationen mit den Comics übereinstimmen. - TitleHeader + ThemeEditorDialog - - SEARCH - Suchen + + Theme Editor + Theme-Editor - - - UpdateLibraryDialog - - Update library - Bibliothek aktualisieren + + + + + - - Cancel - Abbrechen + + - + - - - Updating.... - Aktualisierung.... + + i + ich - - - VolumeComicsModel - - title - Titel + + Expand all + Alles erweitern - - - VolumesModel - - year - Jahr + + Collapse all + Alles einklappen - - issues - Ausgaben + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Halten Sie gedrückt, um den ausgewählten Wert in der Benutzeroberfläche zu blinken (Magenta / umgeschaltet / 0↔10). Loslassen stellt das Original wieder her. - - publisher - Herausgeber + + Search… + Suchen… - - - YACReader::TrayIconController - - &Restore - &Wiederherstellen + + Light + Helligkeit - &Quit - &Schließen + + Dark + Dunkel - - Systray - Taskleiste + + ID: + AUSWEIS: - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - YACReaderLibrary wird im Hintergrund weiterlaufen. Um das Programm zu schließen, wählen Sie <b>Schließen</b> im Kontextmenü des Taskleisten-Symbols. + + Display name: + Anzeigename: - - - YACReader::WhatsNewDialog - - Close - Schließen + + Variant: + Variante: - - - YACReaderDeletingProgress - - cancel - Abbrechen + + Theme info + Themeninfo - - Please wait, deleting in progress... - Bitte warten, Löschvorgang läuft... + + Parameter + Parameterwert - - - YACReaderFieldEdit - - Restore to default - Standardeinstellungen wiederherstellen + + Value + Wert - - - Click to overwrite - Zum Überschreiben anklicken + + Save and apply + Speichern und anwenden - - - YACReaderFieldPlainTextEdit - - Restore to default - Standardeinstellungen wiederherstellen + + Export to file... + In Datei exportieren... - - - - - Click to overwrite - Zum Überschreiben anklicken + + Load from file... + Aus Datei laden... - - - YACReaderFlowConfigWidget - - CoverFlow look - CoverFlow-Ansicht + + Close + Schließen - - How to show covers: - Wie Titelseiten angezeigt werden sollen: + + Double-click to edit color + Doppelklicken Sie, um die Farbe zu bearbeiten - - Stripe look - Streifen-Ansicht + + + + + + + true + WAHR - - Overlapped Stripe look - Überlappende Streifen-Ansicht + + + + + false + FALSCH - - - YACReaderGLFlowConfigWidget - - Zoom - Vergößern + + Double-click to toggle + Zum Umschalten doppelklicken - - Light - Helligkeit + + Double-click to edit value + Doppelklicken Sie, um den Wert zu bearbeiten - - Show advanced settings - Zeige erweiterte Einstellungen + + + + Edit: %1 + Bearbeiten: %1 - - Roulette look - Zufällige Darstellung + + Save theme + Thema speichern - - Cover Angle - Titelbild-Winkel + + + JSON files (*.json);;All files (*) + JSON-Dateien (*.json);;Alle Dateien (*) - - Stripe look - Streifen-Ansicht + + Save failed + Speichern fehlgeschlagen - - Position - Position + + Could not open file for writing: +%1 + Die Datei konnte nicht zum Schreiben geöffnet werden: +%1 - - Z offset - Z Abstand + + Load theme + Theme laden - - Y offset - Y Abstand + + + + Load failed + Das Laden ist fehlgeschlagen + + + + Could not open file: +%1 + Datei konnte nicht geöffnet werden: +%1 + + + + Invalid JSON: +%1 + Ungültiger JSON: +%1 + + + + Expected a JSON object. + Es wurde ein JSON-Objekt erwartet. + + + + TitleHeader + + + SEARCH + Suchen + + + + UpdateLibraryDialog + + + Update library + Bibliothek aktualisieren + + + + Cancel + Abbrechen + + + + Updating.... + Aktualisierung.... + + + + Viewer + + + + Press 'O' to open comic. + 'O' drücken, um Comic zu öffnen. + + + + Not found + Nicht gefunden + + + + Comic not found + Comic nicht gefunden + + + + Error opening comic + Fehler beim Öffnen des Comics + + + + CRC Error + CRC Fehler + + + + Loading...please wait! + Ladevorgang... Bitte warten! + + + + Page not available! + Seite nicht verfügbar! + + + + Cover! + Titelseite! + + + + Last page! + Letzte Seite! + + + + VolumeComicsModel + + + title + Titel + + + + VolumesModel + + + year + Jahr + + + + issues + Ausgaben + + + + publisher + Herausgeber + + + + YACReader3DFlowConfigWidget + + + Presets: + Voreinstellungen: + + + + Classic look + Klassische Ansicht + + + + Stripe look + Streifen-Ansicht + + + + Overlapped Stripe look + Überlappende Streifen-Ansicht + + + + Modern look + Moderne Ansicht + + + + Roulette look + Zufällige Darstellung + + + + Show advanced settings + Zeige erweiterte Einstellungen + + + + Custom: + Benutzerdefiniert: + + + + View angle + Zeige Winkel + + + + Position + Lage + + + + Cover gap + Titelbild Abstand + + + + Central gap + Mittiger Abstand + + + + Zoom + Vergößern + + + + Y offset + Y Abstand + + + + Z offset + Z Abstand + + + + Cover Angle + Titelbild-Winkel + + + + Visibility + Sichtbarkeit + + + + Light + Helligkeit + + + + Max angle + Maximaler Winkel + + + + Low Performance + Niedrige Leistung + + + + High Performance + Hohe Leistung + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + VSync nutzen (verbessert die Bilddarstellung im Vollbild, schlechtere Leistung) + + + + Performance: + Leistung: + + + + YACReader::MainWindowViewer + + + &Open + &Öffnen + + + + Open a comic + Comic öffnen + + + + New instance + Neuer Fall + + + + Open Folder + Ordner öffnen + + + + Open image folder + Bilder-Ordner öffnen + + + + Open latest comic + Neuesten Comic öffnen + + + + Open the latest comic opened in the previous reading session + Öffne den neuesten Comic deiner letzten Sitzung + + + + Clear + Löschen + + + + Clear open recent list + Lösche Liste zuletzt geöffneter Elemente + + + + Save + Speichern + + + + + Save current page + Aktuelle Seite speichern + + + + Previous Comic + Voheriger Comic + + + + + + Open previous comic + Vorherigen Comic öffnen + + + + Next Comic + Nächster Comic + + + + + + Open next comic + Nächsten Comic öffnen + + + + &Previous + &Vorherige + + + + + + Go to previous page + Zur vorherigen Seite gehen + + + + &Next + &Nächstes + + + + + + Go to next page + Zur nächsten Seite gehen + + + + Fit Height + Höhe anpassen + + + + Fit image to height + Bild an Höhe anpassen + + + + Fit Width + Breite anpassen + + + + Fit image to width + Bildbreite anpassen + + + + Show full size + Vollansicht anzeigen + + + + Fit to page + An Seite anpassen + + + + Continuous scroll + Kontinuierliches Scrollen + + + + Switch to continuous scroll mode + Wechseln Sie in den kontinuierlichen Bildlaufmodus + + + + Reset zoom + Zoom zurücksetzen + + + + Show zoom slider + Zoomleiste anzeigen + + + + Zoom+ + Vergr??ern+ + + + + Zoom- + Verkleinern- + + + + Rotate image to the left + Bild nach links drehen + + + + Rotate image to the right + Bild nach rechts drehen + + + + Double page mode + Doppelseiten-Modus + + + + Switch to double page mode + Zum Doppelseiten-Modus wechseln + + + + Double page manga mode + Doppelseiten-Manga-Modus + + + + Reverse reading order in double page mode + Umgekehrte Lesereihenfolge im Doppelseiten-Modus + + + + Go To + Gehe zu + + + + Go to page ... + Gehe zu Seite ... + + + + Options + Optionen + + + + YACReader options + YACReader Optionen + + + + + Help + Hilfe + + + + Help, About YACReader + Hilfe, Über YACReader + + + + Magnifying glass + Vergößerungsglas + + + + Switch Magnifying glass + Vergrößerungsglas wechseln + + + + Set bookmark + Lesezeichen setzen + + + + Set a bookmark on the current page + Lesezeichen auf dieser Seite setzen + + + + Show bookmarks + Lesezeichen anzeigen + + + + Show the bookmarks of the current comic + Lesezeichen für diesen Comic anzeigen + + + + Show keyboard shortcuts + Tastenkürzel anzeigen + + + + Show Info + Info anzeigen + + + + Close + Schließen + + + + Show Dictionary + Wörterbuch anzeigen + + + + Show go to flow + "Gehe zu Comic Flow" anzeigen + + + + Edit shortcuts + Kürzel bearbeiten + + + + &File + &Datei + + + + + Open recent + Kürzlich geöffnet + + + + File + Datei + + + + Edit + Bearbeiten + + + + View + Anzeigen + + + + Go + Los + + + + Window + Fenster + + + + + + Open Comic + Comic öffnen + + + + + + Comic files + Comic-Dateien + + + + Open folder + Ordner öffnen + + + + page_%1.jpg + Seite_%1.jpg + + + + Image files (*.jpg) + Bildateien (*.jpg) + + + + + Comics + Comichefte + + + + + General + Allgemein + + + + + Magnifiying glass + Vergrößerungsglas + + + + + Page adjustement + Seitenanpassung + + + + + Reading + Lesend + + + + Toggle fullscreen mode + Vollbild-Modus umschalten + + + + Hide/show toolbar + Symbolleiste anzeigen/verstecken + + + + Size up magnifying glass + Vergrößerungsglas vergrößern + + + + Size down magnifying glass + Vergrößerungsglas verkleinern + + + + Zoom in magnifying glass + Vergrößerungsglas reinzoomen + + + + Zoom out magnifying glass + Vergrößerungsglas rauszoomen + + + + Reset magnifying glass + Lupe zurücksetzen + + + + Toggle between fit to width and fit to height + Zwischen Anpassung an Seite und Höhe wechseln + + + + Autoscroll down + Automatisches Runterscrollen + + + + Autoscroll up + Automatisches Raufscrollen + + + + Autoscroll forward, horizontal first + Automatisches Vorwärtsscrollen, horizontal zuerst + + + + Autoscroll backward, horizontal first + Automatisches Zurückscrollen, horizontal zuerst + + + + Autoscroll forward, vertical first + Automatisches Vorwärtsscrollen, vertikal zuerst + + + + Autoscroll backward, vertical first + Automatisches Zurückscrollen, vertikal zuerst + + + + Move down + Nach unten + + + + Move up + Nach oben + + + + Move left + Nach links + + + + Move right + Nach rechts + + + + Go to the first page + Zur ersten Seite gehen + + + + Go to the last page + Zur letzten Seite gehen + + + + Offset double page to the left + Doppelseite nach links versetzt + + + + Offset double page to the right + Doppelseite nach rechts versetzt + + + + There is a new version available + Neue Version verfügbar + + + + Do you want to download the new version? + Möchten Sie die neue Version herunterladen? + + + + Remind me in 14 days + In 14 Tagen erneut erinnern + + + + Not now + Nicht jetzt + + + + YACReader::TrayIconController + + + &Restore + &Wiederherstellen + + + &Quit + &Schließen + + + + Systray + Taskleiste + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary wird im Hintergrund weiterlaufen. Um das Programm zu schließen, wählen Sie <b>Schließen</b> im Kontextmenü des Taskleisten-Symbols. + + + + YACReader::WhatsNewDialog + + Close + Schließen + + + + YACReaderFieldEdit + + + Restore to default + Standardeinstellungen wiederherstellen + + + + + Click to overwrite + Zum Überschreiben anklicken + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Standardeinstellungen wiederherstellen + + + + + + + Click to overwrite + Zum Überschreiben anklicken + + + + YACReaderFlowConfigWidget + + CoverFlow look + CoverFlow-Ansicht + + + How to show covers: + Wie Titelseiten angezeigt werden sollen: + + + Stripe look + Streifen-Ansicht + + + Overlapped Stripe look + Überlappende Streifen-Ansicht + + + + YACReaderGLFlowConfigWidget + + Zoom + Vergößern + + + Light + Helligkeit + + + Show advanced settings + Zeige erweiterte Einstellungen + + + Roulette look + Zufällige Darstellung + + + Cover Angle + Titelbild-Winkel + + + Stripe look + Streifen-Ansicht + + + Position + Lage + + + Z offset + Z Abstand + + + Y offset + Y Abstand - Central gap - Mittiger Abstand + Mittiger Abstand - Presets: - Voreinstellungen: + Voreinstellungen: - Overlapped Stripe look - Überlappende Streifen-Ansicht + Überlappende Streifen-Ansicht - Modern look - Moderne Ansicht + Moderne Ansicht - View angle - Zeige Winkel + Zeige Winkel - Max angle - Maximaler Winkel + Maximaler Winkel - Custom: - Benutzerdefiniert: + Benutzerdefiniert: - Classic look - Klassische Ansicht + Klassische Ansicht - Cover gap - Titelbild Abstand + Titelbild Abstand - High Performance - Hohe Leistung + Hohe Leistung - Performance: - Leistung: + Leistung: - Use VSync (improve the image quality in fullscreen mode, worse performance) - VSync nutzen (verbessert die Bilddarstellung im Vollbild, schlechtere Leistung) + VSync nutzen (verbessert die Bilddarstellung im Vollbild, schlechtere Leistung) - Visibility - Sichtbarkeit + Sichtbarkeit - Low Performance - Niedrige Leistung + Niedrige Leistung YACReaderNavigationController - No favorites - Keine Favoriten + Keine Favoriten - You are not reading anything yet, come on!! - Sie lesen noch nichts, starten Sie!! - - - - There are no recent comics! - + Sie lesen noch nichts, starten Sie!! YACReaderOptionsDialog - + Save Speichern - Use hardware acceleration (restart needed) - Hardwarebeschleunigung nutzen (Neustart erforderlich) + Hardwarebeschleunigung nutzen (Neustart erforderlich) - + Cancel Abbrechen - + Edit shortcuts Kürzel bearbeiten - + Shortcuts Kürzel @@ -3048,7 +4297,7 @@ um die Leistung zu verbessern YACReaderSearchLineEdit - + type to search tippen, um zu suchen @@ -3056,34 +4305,60 @@ um die Leistung zu verbessern YACReaderSideBar - LIBRARIES - BIBLIOTHEKEN + BIBLIOTHEKEN - FOLDERS - ORDNER + ORDNER - Libraries - Bibliotheken + Bibliotheken - Folders - Ordner + Ordner - Reading Lists - Leselisten + Leselisten - READING LISTS - LESELISTEN + LESELISTEN + + + + YACReaderSlider + + + Reset + Zurücksetzen + + + + YACReaderTranslator + + + YACReader translator + YACReader Übersetzer + + + + + Translation + Übersetzung + + + + clear + Löschen + + + + Service not available + Service nicht verfügbar diff --git a/YACReaderLibrary/yacreaderlibrary_en.ts b/YACReaderLibrary/yacreaderlibrary_en.ts index 2540f02e7..68b815eac 100644 --- a/YACReaderLibrary/yacreaderlibrary_en.ts +++ b/YACReaderLibrary/yacreaderlibrary_en.ts @@ -6,90 +6,30 @@ None - + None AddLabelDialog - + Label name: - + Label name: - + Choose a color: - - - - - red - - - - - orange - - - - - yellow - - - - - green - - - - - cyan - - - - - blue - - - - - violet - - - - - purple - - - - - pink - - - - - white - - - - - light - - - - - dark - + Choose a color: - + accept - + accept - + cancel - + cancel @@ -97,28 +37,28 @@ Comics folder : - + Comics folder : Library name : Library Name : - + Library name : Add - + Add Cancel - + Cancel - + Add an existing library - + Add an existing library @@ -126,113 +66,170 @@ Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> Paste here your Comic Vine API key - + Paste here your Comic Vine API key Accept - + Accept Cancel - + Cancel - ClassicComicsView + AppearanceTabWidget - - Hide comic flow - + + Color scheme + Color scheme - - - ComicInfoView - - Main character or team - + + System + System - - Teams - + + Light + Light - - Locations - + + Dark + Dark - - Authors - + + Custom + Custom - - writer - + + Remove + Remove - - penciller - + + Remove this user-imported theme + Remove this user-imported theme - - inker - + + Light: + Light: - - colorist - + + Dark: + Dark: - - letterer - + + Custom: + Custom: + + + + Import theme... + Import theme... + + + + Theme + Theme + + + + Theme editor + Theme editor + + + + Open Theme Editor... + Open Theme Editor... + + + + Theme editor error + Theme editor error + + + + The current theme JSON could not be loaded. + The current theme JSON could not be loaded. + + + + Import theme + Import theme + + + + JSON files (*.json);;All files (*) + JSON files (*.json);;All files (*) + + + + Could not import theme from: +%1 + Could not import theme from: +%1 - - cover artist - + + Could not import theme from: +%1 + +%2 + Could not import theme from: +%1 + +%2 - - editor - + + Import failed + Import failed + + + BookmarksDialog - - imprint - + + Lastest Page + Lastest Page - - Publisher - + + Close + Close - - color - + + Click on any image to go to the bookmark + Click on any image to go to the bookmark - - b/w - + + + Loading... + Loading... + + + ClassicComicsView - - Characters - + + Hide comic flow + Hide comic flow @@ -240,134 +237,142 @@ yes - + yes no - + no Title - + Title File Name - + File Name Pages - + Pages Size - + Size Read - + Read Current Page - + Current Page Publication Date - + Publication Date Rating - + Rating Series - + Series Volume - + Volume Story Arc - + Story Arc ComicVineDialog - + skip - + skip - + back - + back - + next - + next - + search - + search - + close - + close - - - + + + Looking for volume... - + Looking for volume... - - + + comic %1 of %2 - %3 - + comic %1 of %2 - %3 - + %1 comics selected - + %1 comics selected - + Error connecting to ComicVine - + Error connecting to ComicVine - - + + Retrieving tags for : %1 - + Retrieving tags for : %1 - + Retrieving volume info... - + Retrieving volume info... - + Looking for comic... - + Looking for comic... + + + + ContinuousPageWidget + + + Loading page %1 + Loading page %1 @@ -375,42 +380,42 @@ Comics folder : - + Comics folder : Library Name : - + Library Name : Create - + Create Cancel - + Cancel Create a library could take several minutes. You can stop the process and update the library later for completing the task. - + Create a library could take several minutes. You can stop the process and update the library later for completing the task. - + Create new library - + Create new library - + Path not found - + Path not found - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder @@ -418,54 +423,43 @@ Restore defaults - + Restore defaults To change a shortcut, double click in the key combination and type the new keys. - + To change a shortcut, double click in the key combination and type the new keys. Shortcuts settings - + Shortcuts settings - + Shortcut in use - + Shortcut in use - + The shortcut "%1" is already assigned to other function - + The shortcut "%1" is already assigned to other function EmptyFolderWidget - - - Subfolders in this folder - - - - - Empty folder - - - - - Drag and drop folders and comics here - + + This folder doesn't contain comics yet + This folder doesn't contain comics yet EmptyLabelWidget - + This label doesn't contain comics yet - + This label doesn't contain comics yet @@ -474,7 +468,25 @@ This reading list does not contain any comics yet This reading list doesn't contain any comics yet - + This reading list does not contain any comics yet + + + + EmptySpecialListWidget + + + No favorites + No favorites + + + + You are not reading anything yet, come on!! + You are not reading anything yet, come on!! + + + + There are no recent comics! + There are no recent comics! @@ -482,37 +494,37 @@ Output file : - + Output file : Create - + Create Cancel - + Cancel - + Export comics info - + Export comics info - + Destination database name - + Destination database name - + Problem found while writing - + Problem found while writing - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder @@ -520,37 +532,37 @@ Output folder : - + Output folder : Create - + Create Cancel - + Cancel - + Create covers package - + Create covers package - + Problem found while writing - + Problem found while writing - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - + Destination directory - + Destination directory @@ -558,64 +570,85 @@ CRC error on page (%1): some of the pages will not be displayed correctly - + CRC error on page (%1): some of the pages will not be displayed correctly Unknown error opening the file - + Unknown error opening the file 7z not found - + 7z not found Format not supported - + Format not supported - FolderContentView + GoToDialog + + + Page : + Page : + + + + Go To + Go To + + + + Cancel + Cancel + + + + + Total pages : + Total pages : + - - Continue Reading... - + + Go to... + Go to... - FolderContentView6 + GoToFlowToolBar - - Continue Reading... - + + Page : + Page : GridComicsView - + Show info - + Show info HelpAboutDialog - + About - + About - + Help - + Help - + System info - + System info @@ -623,27 +656,27 @@ Import comics info - + Import comics info Info database location : - + Info database location : Import - + Import Cancel - + Cancel - + Comics info file (*.ydb) - + Comics info file (*.ydb) @@ -651,940 +684,944 @@ Library Name : - + Library Name : Package location : - + Package location : Destination folder : - + Destination folder : Unpack - + Unpack Cancel - + Cancel - + Extract a catalog - + Extract a catalog - + Compresed library covers (*.clc) - + Compresed library covers (*.clc) ImportWidget - + stop - + stop - + Some of the comics being added... - + Some of the comics being added... - + Importing comics - + Importing comics - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> - + Updating the library - + Updating the library - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> - + Upgrading the library - + Upgrading the library - + <p>The current library is being upgraded, please wait.</p> - + <p>The current library is being upgraded, please wait.</p> - + Scanning the library - + Scanning the library - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> LibraryWindow - + YACReader Library - + YACReader Library - + Library - + Library - + Set as read - + Set as read - - + + Set as unread - + Set as unread - - - + + + manga - + manga - - - + + + comic - + comic - - - + + + web comic - + web comic - - - + + + western manga (left to right) - + western manga (left to right) - + Library not available Library ' - + Library not available - + Rescan library for XML info - + Rescan library for XML info - + Delete folder - + Delete folder - + Open folder... - + Open folder... - + Set as uncompleted - + Set as uncompleted - + Set as completed - + Set as completed - + Update folder - + Update folder - + Folder - + Folder - + Comic - + Comic - + Upgrade failed - + Upgrade failed - + There were errors during library upgrade in: - + There were errors during library upgrade in: - + Update needed - + Update needed - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? - + Download new version - + Download new version - + This library was created with a newer version of YACReaderLibrary. Download the new version now? - + This library was created with a newer version of YACReaderLibrary. Download the new version now? - + Library '%1' is no longer available. Do you want to remove it? - + Library '%1' is no longer available. Do you want to remove it? - + Old library - + Old library - + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - - + + Copying comics... - + Copying comics... - - + + Moving comics... - + Moving comics... - + Folder name: - + Folder name: - + No folder selected - + No folder selected - + Please, select a folder first - + Please, select a folder first - + Error in path - + Error in path - + There was an error accessing the folder's path - + There was an error accessing the folder's path - + The selected folder and all its contents will be deleted from your disk. Are you sure? - + The selected folder and all its contents will be deleted from your disk. Are you sure? - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - + Add new reading lists - + Add new reading lists - - + + List name: - + List name: - + Delete list/label - + Delete list/label - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? - + Rename list name - + Rename list name - - - + + + 4koma (top to botom) - + 4koma (top to botom) - - - - + + + + Set type - + Set type - + Set custom cover - + Set custom cover - + Delete custom cover - + Delete custom cover - + Save covers - + Save covers - + You are adding too many libraries. - + You are adding too many libraries. - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. - + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. - - + + YACReader not found - + YACReader not found - + Error - + Error - + Error opening comic with third party reader. - + Error opening comic with third party reader. - + Library not found - + Library not found - + The selected folder doesn't contain any library. - + The selected folder doesn't contain any library. - + Are you sure? - + Are you sure? - + Do you want remove - + Do you want remove - + library? - + library? - + Remove and delete metadata - + Remove and delete metadata - + Library info - + Library info - + Assign comics numbers - + Assign comics numbers - + Assign numbers starting in: - + Assign numbers starting in: - - + + Unable to delete - + Unable to delete - + Add new folder - + Add new folder - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. - + YACReader not found. There might be a problem with your YACReader installation. - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - + Invalid image - + Invalid image - + The selected file is not a valid image. - + The selected file is not a valid image. - + Error saving cover - + Error saving cover - + There was an error saving the cover image. - + There was an error saving the cover image. - + Error creating the library - + Error creating the library - + Error updating the library - + Error updating the library - + Error opening the library - + Error opening the library - + Delete comics - + Delete comics - + All the selected comics will be deleted from your disk. Are you sure? - + All the selected comics will be deleted from your disk. Are you sure? - + Remove comics - + Remove comics - + Comics will only be deleted from the current label/list. Are you sure? - + Comics will only be deleted from the current label/list. Are you sure? - + Library name already exists - + Library name already exists - + There is another library with the name '%1'. - + There is another library with the name '%1'. LibraryWindowActions - + Create a new library - + Create a new library - + Open an existing library - + Open an existing library - - + + Export comics info - + Export comics info - - + + Import comics info - + Import comics info - + Pack covers - + Pack covers - + Pack the covers of the selected library - + Pack the covers of the selected library - + Unpack covers - + Unpack covers - + Unpack a catalog - + Unpack a catalog - + Update library - + Update library - + Update current library - + Update current library - + Rename library - + Rename library - + Rename current library - + Rename current library - + Remove library - + Remove library - + Remove current library from your collection - + Remove current library from your collection - + Rescan library for XML info - + Rescan library for XML info - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Show library info - + Show library info - + Show information about the current library - + Show information about the current library - + Open current comic - + Open current comic - + Open current comic on YACReader - + Open current comic on YACReader - + Save selected covers to... - + Save selected covers to... - + Save covers of the selected comics as JPG files - + Save covers of the selected comics as JPG files - - + + Set as read - + Set as read - + Set comic as read - + Set comic as read - - + + Set as unread - + Set as unread - + Set comic as unread - + Set comic as unread - - + + manga - + manga - + Set issue as manga - + Set issue as manga - - + + comic - + comic - + Set issue as normal - + Set issue as normal - + western manga - + western manga - + Set issue as western manga - + Set issue as western manga - - + + web comic - + web comic - + Set issue as web comic - + Set issue as web comic - - + + yonkoma - + yonkoma - + Set issue as yonkoma - + Set issue as yonkoma - + Show/Hide marks - + Show/Hide marks - + Show or hide read marks - + Show or hide read marks - + Show/Hide recent indicator - + Show/Hide recent indicator - + Show or hide recent indicator - + Show or hide recent indicator - - + + Fullscreen mode on/off - + Fullscreen mode on/off - + Help, About YACReader - + Help, About YACReader - + Add new folder - + Add new folder - + Add new folder to the current library - + Add new folder to the current library - + Delete folder - + Delete folder - + Delete current folder from disk - + Delete current folder from disk - + Select root node - + Select root node - + Expand all nodes - + Expand all nodes - + Collapse all nodes - + Collapse all nodes - + Show options dialog - + Show options dialog - + Show comics server options dialog - + Show comics server options dialog - - + + Change between comics views - + Change between comics views - + Open folder... - + Open folder... - + Set as uncompleted - + Set as uncompleted - + Set as completed - + Set as completed - + Set custom cover - + Set custom cover - + Delete custom cover - + Delete custom cover - + western manga (left to right) - + western manga (left to right) - + Open containing folder... - + Open containing folder... - + Reset comic rating - + Reset comic rating - + Select all comics - + Select all comics - + Edit - + Edit - + Assign current order to comics - + Assign current order to comics - + Update cover - + Update cover - + Delete selected comics - + Delete selected comics - + Delete metadata from selected comics - + Delete metadata from selected comics - + Download tags from Comic Vine - + Download tags from Comic Vine - + Focus search line - + Focus search line - + Focus comics view - + Focus comics view - + Edit shortcuts - + Edit shortcuts - + &Quit - + &Quit - + Update folder - + Update folder - + Update current folder - + Update current folder - + Scan legacy XML metadata - + Scan legacy XML metadata - + Add new reading list - + Add new reading list - + Add a new reading list to the current library - + Add a new reading list to the current library - + Remove reading list - + Remove reading list - + Remove current reading list from the library - + Remove current reading list from the library - + Add new label - + Add new label - + Add a new label to this library - + Add a new label to this library - + Rename selected list - + Rename selected list - + Rename any selected labels or lists - + Rename any selected labels or lists - + Add to... - + Add to... - + Favorites - + Favorites - + Add selected comics to favorites list - + Add selected comics to favorites list @@ -1592,68 +1629,38 @@ YACReaderLibrary will not stop you from creating more libraries but you should k file name - - - - - LogWindow - - - Log window - - - - - &Pause - - - - - &Save - - - - - C&lear - - - - - &Copy - - - - - Level: - - - - - &Auto scroll - + file name NoLibrariesWidget - + You don't have any libraries yet - + You don't have any libraries yet - + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> - + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> - + create your first library - + create your first library - + add an existing one - + add an existing one + + + + NoSearchResultsWidget + + + No results + No results @@ -1661,123 +1668,124 @@ YACReaderLibrary will not stop you from creating more libraries but you should k Tray icon settings (experimental) - + Tray icon settings (experimental) Close to tray - + Close to tray Start into the system tray - + Start into the system tray Edit Comic Vine API key - + Edit Comic Vine API key Comic Vine API key - + Comic Vine API key ComicInfo.xml legacy support - + ComicInfo.xml legacy support Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Import metadata from ComicInfo.xml when adding new comics Consider 'recent' items added or updated since X days ago - + Consider 'recent' items added or updated since X days ago Third party reader - + Third party reader Write {comic_file_path} where the path should go in the command - + Write {comic_file_path} where the path should go in the command + Clear - + Clear Update libraries at startup - + Update libraries at startup Try to detect changes automatically - + Try to detect changes automatically Update libraries periodically - + Update libraries periodically Interval: - + Interval: 30 minutes - + 30 minutes 1 hour - + 1 hour 2 hours - + 2 hours 4 hours - + 4 hours 8 hours - + 8 hours 12 hours - + 12 hours daily - + daily Update libraries at certain time - + Update libraries at certain time Time: - + Time: @@ -1788,364 +1796,561 @@ To stop an automatic update tap on the loading indicator next to the Libraries t WARNING! During library updates writes to the database are disabled! Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. Modifications detection - + Modifications detection Compare the modified date of files when updating a library (not recommended) - + Compare the modified date of files when updating a library (not recommended) - + Enable background image - + Enable background image - + Opacity level - + Opacity level - + Blur level - + Blur level - + Use selected comic cover as background - + Use selected comic cover as background - + Restore defautls - + Restore defautls - + Background - + Background - + Display continue reading banner - + Display continue reading banner - + Display current comic banner - + Display current comic banner - + Continue reading - + Continue reading - + Comic Flow - + Comic Flow - + Libraries - + Libraries Grid view - + Grid view - + + General - + General + + + + + Appearance + Appearance + Options - + Options - - - PropertiesDialog - - General info - + + My comics path + My comics path - - Authors - + + Display + Display - - Publishing - + + Show time in current page information label + Show time in current page information label - - Plot - + + "Go to flow" size + "Go to flow" size - - Notes - + + Background color + Background color - - Cover page - + + Choose + Choose - - Load previous page as cover - + + Scroll behaviour + Scroll behaviour - - Load next page as cover - + + Disable scroll animations and smooth scrolling + Disable scroll animations and smooth scrolling - - Reset cover to the default image - + + Do not turn page using scroll + Do not turn page using scroll - - Load custom cover image - + + Use single scroll step to turn page + Use single scroll step to turn page - - Series: - + + Mouse mode + Mouse mode - - Title: - + + Only Back/Forward buttons can turn pages + Only Back/Forward buttons can turn pages - - - - of: - + + Use the Left/Right buttons to turn pages. + Use the Left/Right buttons to turn pages. - - Issue number: - + + Click left or right half of the screen to turn pages. + Click left or right half of the screen to turn pages. - - Volume: - + + Quick Navigation Mode + Quick Navigation Mode - - Arc number: - + + Disable mouse over activation + Disable mouse over activation - - Story arc: - + + Brightness + Brightness - - alt. number: - + + Contrast + Contrast - - Alternate series: - + + Gamma + Gamma - - Series Group: - + + Reset + Reset - - Genre: - Genere: - + + Image options + Image options - - Size: - + + Fit options + Fit options - - Writer(s): - + + Enlarge images to fit width/height + Enlarge images to fit width/height - - Penciller(s): - + + Double Page options + Double Page options - - Inker(s): - + + Show covers as single page + Show covers as single page - - Colorist(s): - + + Scaling + Scaling - - Letterer(s): - + + Scaling method + Scaling method - - Cover Artist(s): - + + Nearest (fast, low quality) + Nearest (fast, low quality) - - Editor(s): - + + Bilinear + Bilinear - - Imprint: - + + Lanczos (better quality) + Lanczos (better quality) - + + Page Flow + Page Flow + + + + Image adjustment + Image adjustment + + + + Restart is needed + Restart is needed + + + + Comics directory + Comics directory + + + + PropertiesDialog + + + General info + General info + + + + Authors + Authors + + + + Publishing + Publishing + + + + Plot + Plot + + + + Notes + Notes + + + + Cover page + Cover page + + + + Load previous page as cover + Load previous page as cover + + + + Load next page as cover + Load next page as cover + + + + Reset cover to the default image + Reset cover to the default image + + + + Load custom cover image + Load custom cover image + + + + Series: + Series: + + + + Title: + Title: + + + + + + of: + of: + + + + Issue number: + Issue number: + + + + Volume: + Volume: + + + + Arc number: + Arc number: + + + + Story arc: + Story arc: + + + + alt. number: + alt. number: + + + + Alternate series: + Alternate series: + + + + Series Group: + Series Group: + + + + Genre: + Genere: + Genre: + + + + Size: + Size: + + + + Writer(s): + Writer(s): + + + + Penciller(s): + Penciller(s): + + + + Inker(s): + Inker(s): + + + + Colorist(s): + Colorist(s): + + + + Letterer(s): + Letterer(s): + + + + Cover Artist(s): + Cover Artist(s): + + + + Editor(s): + Editor(s): + + + + Imprint: + Imprint: + + + Day: - + Day: Month: - + Month: Year: - + Year: Publisher: - + Publisher: Format: - + Format: Color/BW: - + Color/BW: Age rating: - + Age rating: Type: - + Type: Language (ISO): - + Language (ISO): Synopsis: - + Synopsis: Characters: - + Characters: Teams: - + Teams: Locations: - + Locations: Main character or team: - + Main character or team: Review: - + Review: Notes: - + Notes: Tags: - + Tags: Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> Not found - + Not found Comic not found. You should update your library. - + Comic not found. You should update your library. Edit selected comics information - + Edit selected comics information Invalid cover - + Invalid cover The image is invalid. - + The image is invalid. Edit comic information - + Edit comic information + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md @@ -2153,93 +2358,77 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 7z lib not found - + 7z lib not found unable to load 7z lib from ./utils - + unable to load 7z lib from ./utils Trace - + Trace Debug - + Debug Info - + Info Warning - + Warning Error - + Error Fatal - + Fatal - + Select custom cover - + Select custom cover - + Images (%1) - - - - - QsLogging::LogWindowModel - - - Time - - - - - Level - + Images (%1) - - Message - + + The file could not be read or is not valid JSON. + The file could not be read or is not valid JSON. - - - QsLogging::Window - - &Pause - + + This theme is for %1, not %2. + This theme is for %1, not %2. - - &Resume - + + Libraries + Libraries - - Save log - + + Folders + Folders - - Log file (*.log) - + + Reading Lists + Reading Lists @@ -2247,41 +2436,41 @@ To stop an automatic update tap on the loading indicator next to the Libraries t New Library Name : - + New Library Name : Rename - + Rename Cancel - + Cancel - + Rename current library - + Rename current library ScraperResultsPaginator - + Number of volumes found : %1 - + Number of volumes found : %1 - - + + page %1 of %2 - + page %1 of %2 - + Number of %1 found : %2 - + Number of %1 found : %2 @@ -2290,17 +2479,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - + Please provide some additional information for this comic. - + Series: - + Series: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. @@ -2308,83 +2497,83 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information. - + Please provide some additional information. - + Series: - + Series: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. SelectComic - + Please, select the right comic info. - + Please, select the right comic info. - + comics - + comics - + loading cover - + loading cover - + loading description - + loading description - + comic description unavailable - + comic description unavailable SelectVolume - + Please, select the right series for your comic. - + Please, select the right series for your comic. - + Filter: - + Filter: - + volumes - + volumes - + Nothing found, clear the filter if any. - + Nothing found, clear the filter if any. - + loading cover - + loading cover - + loading description - + loading description - + volume description unavailable - + volume description unavailable @@ -2392,432 +2581,1123 @@ To stop an automatic update tap on the loading indicator next to the Libraries t You are trying to get information for various comics at once, are they part of the same series? - + You are trying to get information for various comics at once, are they part of the same series? - + yes - + yes - + no - + no ServerConfigDialog - + set port - + set port - + Server connectivity information - + Server connectivity information - + Scan it! - + Scan it! - + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address - + Choose an IP address - + Port - + Port - + enable the server - + enable the server SortVolumeComics - + Please, sort the list of comics on the left until it matches the comics' information. - + Please, sort the list of comics on the left until it matches the comics' information. - + sort comics to match comic information - + sort comics to match comic information - + issues - + issues - + remove selected comics - + remove selected comics - + restore all removed comics - + restore all removed comics - TitleHeader + ThemeEditorDialog - - SEARCH - + + Theme Editor + Theme Editor - - - UpdateLibraryDialog - - Updating.... - + + + + + - - Cancel - + + - + - - - Update library - + + i + i - - - VolumeComicsModel - - title - + + Expand all + Expand all - - - VolumesModel - - year - + + Collapse all + Collapse all - - issues - + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. - - publisher - + + Search… + Search… - - - YACReader::TrayIconController - - &Restore - + + Light + Light - - Systray - + + Dark + Dark - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - + + ID: + ID: - - - YACReader::WhatsNewDialog - - Close - + + Display name: + Display name: - - - YACReaderDeletingProgress - - Please wait, deleting in progress... - + + Variant: + Variant: - - cancel - + + Theme info + Theme info - - - YACReaderFieldEdit - - - Click to overwrite - + + Parameter + Parameter - - Restore to default - + + Value + Value - - - YACReaderFieldPlainTextEdit - - - - - Click to overwrite - + + Save and apply + Save and apply - - Restore to default - + + Export to file... + Export to file... - - - YACReaderFlowConfigWidget - - How to show covers: - + + Load from file... + Load from file... - - CoverFlow look - + + Close + Close - - Stripe look - + + Double-click to edit color + Double-click to edit color - - Overlapped Stripe look - + + + + + + + true + true - - - YACReaderGLFlowConfigWidget - - Presets: - + + + + + false + false - - Classic look - + + Double-click to toggle + Double-click to toggle - - Stripe look - + + Double-click to edit value + Double-click to edit value - - Overlapped Stripe look - + + + + Edit: %1 + Edit: %1 - - Modern look - + + Save theme + Save theme - - Roulette look - + + + JSON files (*.json);;All files (*) + JSON files (*.json);;All files (*) - - Show advanced settings - + + Save failed + Save failed - - Custom: - + + Could not open file for writing: +%1 + Could not open file for writing: +%1 - - View angle - + + Load theme + Load theme - - Position - + + + + Load failed + Load failed - - Cover gap - + + Could not open file: +%1 + Could not open file: +%1 - - Central gap - + + Invalid JSON: +%1 + Invalid JSON: +%1 - - Zoom - + + Expected a JSON object. + Expected a JSON object. + + + TitleHeader - - Y offset - + + SEARCH + SEARCH + + + UpdateLibraryDialog - - Z offset - + + Updating.... + Updating.... - - Cover Angle - + + Cancel + Cancel - - Visibility - + + Update library + Update library + + + Viewer - - Light - + + + Press 'O' to open comic. + Press 'O' to open comic. - - Max angle - + + Not found + Not found - - Low Performance - + + Comic not found + Comic not found - - High Performance - + + Error opening comic + Error opening comic - - Use VSync (improve the image quality in fullscreen mode, worse performance) - + + CRC Error + CRC Error - + + Loading...please wait! + Loading...please wait! + + + + Page not available! + Page not available! + + + + Cover! + Cover! + + + + Last page! + Last page! + + + + VolumeComicsModel + + + title + title + + + + VolumesModel + + + year + year + + + + issues + issues + + + + publisher + publisher + + + + YACReader3DFlowConfigWidget + + + Presets: + Presets: + + + + Classic look + Classic look + + + + Stripe look + Stripe look + + + + Overlapped Stripe look + Overlapped Stripe look + + + + Modern look + Modern look + + + + Roulette look + Roulette look + + + + Show advanced settings + Show advanced settings + + + + Custom: + Custom: + + + + View angle + View angle + + + + Position + Position + + + + Cover gap + Cover gap + + + + Central gap + Central gap + + + + Zoom + Zoom + + + + Y offset + Y offset + + + + Z offset + Z offset + + + + Cover Angle + Cover Angle + + + + Visibility + Visibility + + + + Light + Light + + + + Max angle + Max angle + + + + Low Performance + Low Performance + + + + High Performance + High Performance + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Use VSync (improve the image quality in fullscreen mode, worse performance) + + + Performance: - + Performance: - YACReaderNavigationController + YACReader::MainWindowViewer - - No favorites - + + &Open + &Open - - You are not reading anything yet, come on!! - + + Open a comic + Open a comic - - There are no recent comics! - + + New instance + New instance + + + + Open Folder + Open Folder + + + + Open image folder + Open image folder + + + + Open latest comic + Open latest comic + + + + Open the latest comic opened in the previous reading session + Open the latest comic opened in the previous reading session + + + + Clear + Clear + + + + Clear open recent list + Clear open recent list + + + + Save + Save + + + + + Save current page + Save current page + + + + Previous Comic + Previous Comic + + + + + + Open previous comic + Open previous comic + + + + Next Comic + Next Comic + + + + + + Open next comic + Open next comic + + + + &Previous + &Previous + + + + + + Go to previous page + Go to previous page + + + + &Next + &Next + + + + + + Go to next page + Go to next page + + + + Fit Height + Fit Height + + + + Fit image to height + Fit image to height + + + + Fit Width + Fit Width + + + + Fit image to width + Fit image to width + + + + Show full size + Show full size + + + + Fit to page + Fit to page + + + + Continuous scroll + Continuous scroll + + + + Switch to continuous scroll mode + Switch to continuous scroll mode + + + + Reset zoom + Reset zoom + + + + Show zoom slider + Show zoom slider + + + + Zoom+ + Zoom+ + + + + Zoom- + Zoom- + + + + Rotate image to the left + Rotate image to the left + + + + Rotate image to the right + Rotate image to the right + + + + Double page mode + Double page mode + + + + Switch to double page mode + Switch to double page mode + + + + Double page manga mode + Double page manga mode + + + + Reverse reading order in double page mode + Reverse reading order in double page mode + + + + Go To + Go To + + + + Go to page ... + Go to page ... + + + + Options + Options + + + + YACReader options + YACReader options + + + + + Help + Help + + + + Help, About YACReader + Help, About YACReader + + + + Magnifying glass + Magnifying glass + + + + Switch Magnifying glass + Switch Magnifying glass + + + + Set bookmark + Set bookmark + + + + Set a bookmark on the current page + Set a bookmark on the current page + + + + Show bookmarks + Show bookmarks + + + + Show the bookmarks of the current comic + Show the bookmarks of the current comic + + + + Show keyboard shortcuts + Show keyboard shortcuts + + + + Show Info + Show Info + + + + Close + Close + + + + Show Dictionary + Show Dictionary + + + + Show go to flow + Show go to flow + + + + Edit shortcuts + Edit shortcuts + + + + &File + &File + + + + + Open recent + Open recent + + + + File + File + + + + Edit + Edit + + + + View + View + + + + Go + Go + + + + Window + Window + + + + + + Open Comic + Open Comic + + + + + + Comic files + Comic files + + + + Open folder + Open folder + + + + page_%1.jpg + page_%1.jpg + + + + Image files (*.jpg) + Image files (*.jpg) + + + + + Comics + Comics + + + + + General + General + + + + + Magnifiying glass + Magnifiying glass + + + + + Page adjustement + Page adjustement + + + + + Reading + Reading + + + + Toggle fullscreen mode + Toggle fullscreen mode + + + + Hide/show toolbar + Hide/show toolbar + + + + Size up magnifying glass + Size up magnifying glass + + + + Size down magnifying glass + Size down magnifying glass + + + + Zoom in magnifying glass + Zoom in magnifying glass + + + + Zoom out magnifying glass + Zoom out magnifying glass + + + + Reset magnifying glass + Reset magnifying glass + + + + Toggle between fit to width and fit to height + Toggle between fit to width and fit to height + + + + Autoscroll down + Autoscroll down + + + + Autoscroll up + Autoscroll up + + + + Autoscroll forward, horizontal first + Autoscroll forward, horizontal first + + + + Autoscroll backward, horizontal first + Autoscroll backward, horizontal first + + + + Autoscroll forward, vertical first + Autoscroll forward, vertical first + + + + Autoscroll backward, vertical first + Autoscroll backward, vertical first + + + + Move down + Move down + + + + Move up + Move up + + + + Move left + Move left + + + + Move right + Move right + + + + Go to the first page + Go to the first page + + + + Go to the last page + Go to the last page + + + + Offset double page to the left + Offset double page to the left + + + + Offset double page to the right + Offset double page to the right + + + + There is a new version available + There is a new version available + + + + Do you want to download the new version? + Do you want to download the new version? + + + + Remind me in 14 days + Remind me in 14 days + + + + Not now + Not now + + + + YACReader::TrayIconController + + + &Restore + &Restore + + + + Systray + Systray + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + + + + YACReaderFieldEdit + + + + Click to overwrite + Click to overwrite + + + + Restore to default + Restore to default + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Click to overwrite + + + + Restore to default + Restore to default YACReaderOptionsDialog - + Save - + Save - + Cancel - + Cancel - + Edit shortcuts - + Edit shortcuts - + Shortcuts - - - - - Use hardware acceleration (restart needed) - + Shortcuts YACReaderSearchLineEdit - + type to search - + type to search - YACReaderSideBar + YACReaderSlider - - Libraries - - - - - Folders - + + Reset + Reset + + + YACReaderTranslator - - Reading Lists - + + YACReader translator + YACReader translator - - LIBRARIES - + + + Translation + Translation - - FOLDERS - + + clear + clear - - READING LISTS - + + Service not available + Service not available diff --git a/YACReaderLibrary/yacreaderlibrary_es.ts b/YACReaderLibrary/yacreaderlibrary_es.ts index c2309aa65..7d0980459 100644 --- a/YACReaderLibrary/yacreaderlibrary_es.ts +++ b/YACReaderLibrary/yacreaderlibrary_es.ts @@ -12,82 +12,70 @@ AddLabelDialog - + cancel cancelar - + Label name: Nombre de la etiqueta: - + Choose a color: Elige un color: - red - rojo + rojo - orange - naranja + naranja - yellow - amarillo + amarillo - green - verde + verde - cyan - cian + cian - blue - azul + azul - violet - violeta + violeta - purple - morado + morado - pink - rosa + rosa - white - blanco + blanco - light - claro + claro - dark - oscuro + oscuro - + accept aceptar @@ -100,7 +88,7 @@ Añadir - + Add an existing library Añadir una biblioteca existente @@ -129,13 +117,13 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - Antes de que te puedas conectar a Comic Vine necesitas tu ropia clave API. Por favor, obtén una gratis <a href=\"http://www.comicvine.com/api/\">aquí</a> + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Antes de que te puedas conectar a Comic Vine necesitas tu propia clave API. Por favor, obtén una gratis <a href="http://www.comicvine.com/api/">aquí</a> Paste here your Comic Vine API key - Pega aquí tu clave API de Comic Vina + Pega aquí tu clave API de Comic Vine @@ -143,93 +131,233 @@ Aceptar + + AppearanceTabWidget + + + Color scheme + Esquema de color + + + + System + Sistema + + + + Light + Luz + + + + Dark + Oscuro + + + + Custom + Personalizado + + + + Remove + Eliminar + + + + Remove this user-imported theme + Eliminar este tema importado por el usuario + + + + Light: + Claro: + + + + Dark: + Oscuro: + + + + Custom: + Personalizado: + + + + Import theme... + Importar tema... + + + + Theme + Tema + + + + Theme editor + Editor de temas + + + + Open Theme Editor... + Abrir editor de temas... + + + + Theme editor error + Error del editor de temas + + + + The current theme JSON could not be loaded. + No se ha podido cargar el JSON del tema actual. + + + + Import theme + Importar tema + + + + JSON files (*.json);;All files (*) + Archivos JSON (*.json);;Todos los archivos (*) + + + + Could not import theme from: +%1 + No se pudo importar el tema desde: +%1 + + + + Could not import theme from: +%1 + +%2 + No se pudo importar el tema desde: +%1 + +%2 + + + + Import failed + Error al importar + + + + BookmarksDialog + + + Lastest Page + Última página + + + + Close + Cerrar + + + + Click on any image to go to the bookmark + Pulsa en cualquier imagen para ir al marcador + + + + + Loading... + Cargando... + + ClassicComicsView - + Hide comic flow - Ocultar cómic flow + Ocultar Comic Flow ComicInfoView - + Main character or team Personaje principal o equipo - + Teams Equipos - + Locations Lugares - + Authors Autores - + writer escritor - + penciller dibujante - + inker entintador - + colorist colorista - + letterer rotulista - + cover artist artista de portada - + editor editor - + imprint sello editorial - + Publisher Editorial - + color color - + b/w b/n - + Characters Personajes @@ -239,7 +367,7 @@ no - no + No @@ -259,7 +387,7 @@ Volume - Volúmen + Volumen @@ -305,74 +433,82 @@ ComicVineDialog - + back atrás - + next siguiente - + skip omitir - + close cerrar - - + + Retrieving tags for : %1 Recuperando etiquetas para : %1 - + Looking for comic... Buscando cómic... - + search buscar - - - + + + Looking for volume... Buscando volumen... - - + + comic %1 of %2 - %3 cómic %1 de %2 - %3 - + %1 comics selected - %1 comics seleccionados + %1 cómics seleccionados - + Error connecting to ComicVine Error conectando a ComicVine - + Retrieving volume info... - Recuperando imformación del volumen... + Recuperando información del volumen... + + + + ContinuousPageWidget + + + Loading page %1 + Cargando página %1 CreateLibraryDialog - + Create new library Crear la nueva biblioteca @@ -392,7 +528,7 @@ Crear una biblioteca puede llevar varios minutos. Puedes parar el proceso en cualquier momento y completar la tarea más tarde. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder La ruta seleccionada no existe o no es válida. Asegúrate de que tienes privilegios de escritura en esta carpeta @@ -407,7 +543,7 @@ Nombre de la biblioteca : - + Path not found Ruta no encontrada @@ -430,40 +566,41 @@ Configuración de atajos - + Shortcut in use Atajo en uso - - The shortcut "%1" is already assigned to other function - El atajo "%1" ya está asignado a otra función + + The shortcut "%1" is already assigned to other function + El atajo "%1" ya está asignado a otra función EmptyFolderWidget - - Subfolders in this folder - Subcarpetas en esta carpeta + Subcarpetas en esta carpeta - Empty folder - Carpeta vacía + Carpeta vacía - Drag and drop folders and comics here - Arrastra y suelta carpetas y cómics aquí + Arrastra y suelta carpetas y cómics aquí + + + + This folder doesn't contain comics yet + Esta carpeta aún no contiene cómics EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet Esta etiqueta aún no contiene ningún cómic @@ -475,6 +612,24 @@ Esta lista de tectura aún no contiene ningún cómic + + EmptySpecialListWidget + + + No favorites + Ningún favorito + + + + You are not reading anything yet, come on!! + No estás leyendo nada aún, ¡vamos! + + + + There are no recent comics! + ¡No hay comics recientes! + + ExportComicsInfoDialog @@ -483,7 +638,7 @@ Archivo de salida : - + Destination database name Nombre de la base de datos de destino @@ -498,17 +653,17 @@ Crear - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder La ruta seleccionada para el archivo de salida no existe o no es una ruta válida. Asegúrate de que tienes permisos de escritura en esta carpeta - + Export comics info Exportar información de los cómics - + Problem found while writing Problema encontrado mientras se escribía @@ -526,7 +681,7 @@ Crear - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder La ruta seleccionada para el archivo de salida no existe o no es una ruta válida. Asegúrate de que tienes permisos de escritura en esta carpeta @@ -536,17 +691,17 @@ Carpeta de destino : - + Problem found while writing Problema encontrado mientras se escribía - + Create covers package Crear paquete de portadas - + Destination directory Carpeta de destino @@ -577,7 +732,7 @@ FolderContentView - + Continue Reading... Continúa leyendo... @@ -585,15 +740,51 @@ FolderContentView6 - Continue Reading... - Continúa leyendo... + Continúa leyendo... + + + + GoToDialog + + + Page : + Página : + + + + Go To + Ir a + + + + Cancel + Cancelar + + + + + Total pages : + Páginas totales : + + + + Go to... + Ir a... + + + + GoToFlowToolBar + + + Page : + Página : GridComicsView - + Show info Mostrar información @@ -601,17 +792,17 @@ HelpAboutDialog - + Help Ayuda - + System info Información de systema - + About Acerca de @@ -639,7 +830,7 @@ Importar información de cómics - + Comics info file (*.ydb) Archivo de información de cómics (*.ydb) @@ -662,9 +853,9 @@ Desempaquetar - + Compresed library covers (*.clc) - Compresed library covers (*.clc) + Portadas de biblioteca comprimidas (*.clc) @@ -677,7 +868,7 @@ Nombre de la biblioteca : - + Extract a catalog Extraer un catálogo @@ -685,52 +876,52 @@ ImportWidget - + stop parar - + Importing comics Importando cómics - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderLibrary está creando una nueva biblioteca.</p><p>Crear una biblioteca puede llevar varios minutos. Puedes parar el proceso en cualquier momento y actualizar la biblioteca más tarde para completar el proceso.</p> - + Some of the comics being added... Algunos de los cómics que estan siendo añadidos.... - + Updating the library Actualizando la biblioteca - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>La biblioteca actual está siendo actualizada. Para actualizaciones más rápidas, por favor, actualiza tus bibliotecas frecuentemente.</p><p>Puedes parar el proceso y continunar la actualización más tarde.</p> - + Upgrading the library Actualizando la biblioteca - + <p>The current library is being upgraded, please wait.</p> <p>La biblioteca actual está siendo actualizadad, espera por favor.</p> - + Scanning the library Escaneando la biblioteca - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> <p>La biblioteca está siendo escaneada para encontrar metadatos en formato XML.</p><p>Sólo necesitas hacer esto una vez, y sólo si la biblioteca fue creada con YACReaderLibrary 9.8.2 o antes.</p> @@ -742,22 +933,22 @@ Editar - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. La carpeta seleccionada no contiene ninguna biblioteca. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Esta biblioteca fue creada con una versión anterior de YACReaderLibrary. Es necesario que se actualice. ¿Deseas hacerlo ahora? - + Comic Cómic - + Error opening the library Error abriendo la biblioteca @@ -766,8 +957,8 @@ Mostrar/Ocultar marcas - - + + YACReader not found YACReader no encontrado @@ -780,12 +971,12 @@ Marcar cómic como leído - + Remove and delete metadata Eliminar y borrar metadatos - + Old library Biblioteca antigua @@ -794,12 +985,12 @@ Actualizar portada - + Set as completed Marcar como completo - + Library Librería @@ -812,7 +1003,7 @@ Modo a pantalla completa on/off - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Esta biblioteca fue creada con una versión más nueva de YACReaderLibrary. ¿Deseas descargar la nueva versión ahora? @@ -825,26 +1016,26 @@ Actualizar la biblioteca seleccionada - - Library '%1' is no longer available. Do you want to remove it? - La biblioteca '%1' no está disponible. ¿Deseas eliminarla? + + Library '%1' is no longer available. Do you want to remove it? + La biblioteca '%1' no está disponible. ¿Deseas eliminarla? Update library Actualizar biblioteca - + Open folder... Abrir carpeta... - + Do you want remove ¿Deseas eliminar la biblioteca - + Set as uncompleted Marcar como incompleto @@ -853,12 +1044,12 @@ Reseteal cómic rating - + Error updating the library Error actualizando la biblioteca - + Folder Carpeta @@ -867,16 +1058,16 @@ Expandir todos los nodos - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - La biblioteca '%1' ha sido creada con una versión más antigua de YACReaderLibrary y debe ser creada de nuevo. ¿Deseas crear la biblioteca ahora? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La biblioteca '%1' ha sido creada con una versión más antigua de YACReaderLibrary y debe ser creada de nuevo. ¿Deseas crear la biblioteca ahora? Pack covers Empaquetar portadas - + Set as read Marcar como leído @@ -897,7 +1088,7 @@ Crear una nueva biblioteca - + Library not available Biblioteca no disponible @@ -906,7 +1097,7 @@ Importar información de cómics - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. Ha habido algún problema intentando borrar los cómics selecionados. Por favor, verifica los permisos de escritura en los arhicovs seleccionados o los directorios que los conienen. @@ -915,12 +1106,12 @@ Abrir cómic actual - + YACReader Library - YACReader Library + Biblioteca YACReader - + Error creating the library Errar creando la biblioteca @@ -929,7 +1120,7 @@ Desempaquetar portadas - + Update needed Se necesita actualizar @@ -938,22 +1129,22 @@ Abrir una biblioteca existente - + Library name already exists Ya existe el nombre de la biblioteca - - There is another library with the name '%1'. - Hay otra biblioteca con el nombre '%1'. + + There is another library with the name '%1'. + Hay otra biblioteca con el nombre '%1'. - + Download new version Descargar la nueva versión - + Delete comics Borrar cómics @@ -982,7 +1173,7 @@ Desempaquetar un catálogo - + All the selected comics will be deleted from your disk. Are you sure? Todos los cómics seleccionados serán borrados de tu disco. ¿Estás seguro? @@ -991,13 +1182,13 @@ Descargar etiquetas de Comic Vine - - + + Set as unread Marcar como no leído - + Library not found Biblioteca no encontrada @@ -1010,16 +1201,16 @@ Eliminar biblioteca - - - + + + manga - manga + historieta manga - - - + + + comic cómic @@ -1032,9 +1223,9 @@ Marcar número como manga occidental - - - + + + web comic cómic web @@ -1044,7 +1235,7 @@ yonkoma - yonkoma + tira yonkoma Set issue as yonkoma @@ -1059,9 +1250,9 @@ Mostrar o ocultar el indicador reciente - - - + + + western manga (left to right) manga occidental (izquierda a derecha) @@ -1070,26 +1261,26 @@ Abrir carpeta contenedora... - - + + Unable to delete No se ha podido borrar - - - + + + 4koma (top to botom) 4koma (top to botom 4koma (de arriba a abajo) - + library? ? - + Are you sure? ¿Estás seguro? @@ -1098,7 +1289,7 @@ Guardar las portadas seleccionadas en... - + Rescan library for XML info Volver a escanear la biblioteca en busca de información XML @@ -1123,7 +1314,7 @@ Mostrar u ocultar marcas - + Add new folder Añadir carpeta @@ -1132,7 +1323,7 @@ Añadir carpeta a la biblioteca actual - + Delete folder Borrar carpeta @@ -1173,7 +1364,7 @@ Salir - + Update folder Actualizar carpeta @@ -1230,187 +1421,191 @@ Añadir cómics seleccionados a la lista de favoritos - + Upgrade failed La actualización falló - + There were errors during library upgrade in: Hubo errores durante la actualización de la biblioteca en: - - + + Copying comics... Copiando cómics... - - + + Moving comics... Moviendo cómics... - + Folder name: Nombre de la carpeta: - + No folder selected No has selecionado ninguna carpeta - + Please, select a folder first Por favor, selecciona una carpeta primero - + Error in path Error en la ruta - - There was an error accessing the folder's path + + There was an error accessing the folder's path Hubo un error al acceder a la ruta de la carpeta - + The selected folder and all its contents will be deleted from your disk. Are you sure? ¿Estás seguro de que deseas eliminar la carpeta seleccionada y todo su contenido de tu disco? - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. Se produjo un problema al intentar eliminar las carpetas seleccionadas. Por favor, verifica los permisos de escritura y asegúrate de que no haya aplicaciones usando estas carpetas o alguno de los archivos contenidos en ellas. - + Add new reading lists Añadir nuevas listas de lectura - - + + List name: Nombre de la lista: - + Delete list/label Eliminar lista/etiqueta - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? El elemento seleccionado se eliminará, tus cómics o carpetas NO se eliminarán de tu disco. ¿Estás seguro? - + Rename list name Renombrar lista - - - - + + + + Set type Establecer tipo - + Set custom cover Establecer portada personalizada - + Delete custom cover Eliminar portada personalizada - + Save covers Guardar portadas - + You are adding too many libraries. Estás añadiendo demasiadas bibliotecas. - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. - Estás añadiendo demasiadas bibliotecas.\n\nProbablemente solo necesites una biblioteca en la carpeta principal de tus cómics, puedes explorar cualquier subcarpeta utilizando la sección de carpetas en la barra lateral izquierda.\n\nYACReaderLibrary no te detendrá de crear más bibliotecas, pero deberías mantener el número de bibliotecas bajo control. + Estás añadiendo demasiadas bibliotecas. + +Probablemente solo necesites una biblioteca en la carpeta principal de tus cómics, puedes explorar cualquier subcarpeta utilizando la sección de carpetas en la barra lateral izquierda. + +YACReaderLibrary no te detendrá de crear más bibliotecas, pero deberías mantener el número de bibliotecas bajo control. - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. YACReader no encontrado. YACReader debería estar instalado en la misma carpeta que YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. YACReader no encontrado. Podría haber un problema con tu instalación de YACReader. - + Error - Error + Fallo - + Error opening comic with third party reader. Error al abrir el cómic con una aplicación de terceros. - + Library info Información de la biblioteca - + Assign comics numbers Asignar números a los cómics - + Assign numbers starting in: Asignar números comenzando en: - + Invalid image Imagen inválida - + The selected file is not a valid image. El archivo seleccionado no es una imagen válida. - + Error saving cover Error guardando portada - + There was an error saving the cover image. Hubo un error guardando la image de portada. - + Remove comics Eliminar cómics - + Comics will only be deleted from the current label/list. Are you sure? Los cómics sólo se eliminarán de la etiqueta/lista actual. ¿Estás seguro? @@ -1418,437 +1613,437 @@ YACReaderLibrary will not stop you from creating more libraries but you should k LibraryWindowActions - + Create a new library Crear una nueva biblioteca - + Open an existing library Abrir una biblioteca existente - - + + Export comics info Exportar información de los cómics - - + + Import comics info Importar información de cómics - + Pack covers Empaquetar portadas - + Pack the covers of the selected library Empaquetar las portadas de la biblioteca seleccionada - + Unpack covers Desempaquetar portadas - + Unpack a catalog Desempaquetar un catálogo - + Update library Actualizar biblioteca - + Update current library Actualizar la biblioteca seleccionada - + Rename library Renombrar biblioteca - + Rename current library Renombrar la biblioteca seleccionada - + Remove library Eliminar biblioteca - + Remove current library from your collection Eliminar biblioteca de la colección - + Rescan library for XML info Volver a escanear la biblioteca en busca de información XML - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. Intenta encontrar información XML incrustada en los archivos de cómic. Solo necesitas hacer esto si la biblioteca fue creada con la versión 9.8.2 o versiones anteriores o si estás utilizando software de terceros para incrustar información XML en los archivos. - + Show library info Mostrar información de la biblioteca - + Show information about the current library Mostrar información de la biblioteca actual - + Open current comic Abrir cómic actual - + Open current comic on YACReader Abrir el cómic actual en YACReader - + Save selected covers to... Guardar las portadas seleccionadas en... - + Save covers of the selected comics as JPG files Guardar las portadas de los cómics seleccionados como archivos JPG - - + + Set as read Marcar como leído - + Set comic as read Marcar cómic como leído - - + + Set as unread Marcar como no leído - + Set comic as unread Marcar cómic como no leído - - + + manga - manga + historieta manga - + Set issue as manga Marcar número como manga - - + + comic cómic - + Set issue as normal Marcar número como cómic - + western manga manga occidental - + Set issue as western manga Marcar número como manga occidental - - + + web comic cómic web - + Set issue as web comic Marcar número como cómic web - - + + yonkoma - yonkoma + tira yonkoma - + Set issue as yonkoma Marcar número como yonkoma - + Show/Hide marks Mostrar/Ocultar marcas - + Show or hide read marks Mostrar u ocultar marcas - + Show/Hide recent indicator Mostrar/Ocultar el indicador reciente - + Show or hide recent indicator Mostrar o ocultar el indicador reciente - - + + Fullscreen mode on/off Modo a pantalla completa on/off - + Help, About YACReader Ayuda, A cerca de... YACReader - + Add new folder Añadir carpeta - + Add new folder to the current library Añadir carpeta a la biblioteca actual - + Delete folder Borrar carpeta - + Delete current folder from disk Borrar carpeta actual del disco - + Select root node Seleccionar el nodo raíz - + Expand all nodes Expandir todos los nodos - + Collapse all nodes Contraer todos los nodos - + Show options dialog Mostrar opciones - + Show comics server options dialog - + Mostrar el diálogo de opciones del servidor de cómics - - + + Change between comics views Cambiar entre vistas de cómics - + Open folder... Abrir carpeta... - + Set as uncompleted Marcar como incompleto - + Set as completed Marcar como completo - + Set custom cover Establecer portada personalizada - + Delete custom cover Eliminar portada personalizada - + western manga (left to right) manga occidental (izquierda a derecha) - + Open containing folder... Abrir carpeta contenedora... - + Reset comic rating Reseteal cómic rating - + Select all comics Seleccionar todos los cómics - + Edit Editar - + Assign current order to comics Asignar el orden actual a los cómics - + Update cover Actualizar portada - + Delete selected comics Borrar los cómics seleccionados - + Delete metadata from selected comics Borrar metadatos de los cómics seleccionados - + Download tags from Comic Vine Descargar etiquetas de Comic Vine - + Focus search line Selecionar el campo de búsqueda - + Focus comics view Selecionar la vista de cómics - + Edit shortcuts Editar atajos - + &Quit - Salir + &Salir - + Update folder Actualizar carpeta - + Update current folder Actualizar carpeta actual - + Scan legacy XML metadata Escaneal metadatos XML - + Add new reading list Añadir lista de lectura - + Add a new reading list to the current library Añadir una nueva lista de lectura a la biblioteca actual - + Remove reading list Eliminar lista de lectura - + Remove current reading list from the library Eliminar la lista de lectura actual de la biblioteca - + Add new label Añadir etiqueta - + Add a new label to this library Añadir etiqueta a esta biblioteca - + Rename selected list Renombrar la lista seleccionada - + Rename any selected labels or lists Renombrar las etiquetas o listas seleccionadas - + Add to... Añadir a... - + Favorites Favoritos - + Add selected comics to favorites list Añadir cómics seleccionados a la lista de favoritos @@ -1864,359 +2059,537 @@ YACReaderLibrary will not stop you from creating more libraries but you should k LogWindow - - Log window - - - - &Pause - &Pausar - - - - &Save - - - - - C&lear - - - - - &Copy - - - - - Level: - - - - - &Auto scroll - + &Pausar NoLibrariesWidget - + create your first library crea tu primera biblioteca - - You don't have any libraries yet + + You don't have any libraries yet Aún no tienes ninguna biblioteca - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>Puedes crear una biblioteca en cualquier carpeta, YACReaderLibrary importará todos las carpetas y cómics de esa carpeta. Si has creado alguna biblioteca anteriormente, puedes abrirla sin volver a crearla.</p><p>No olvides que puedes usar YACReader como una aplicación independiente para leer los cómics en tu ordenador.</p> - + add an existing one añade una existente + + NoSearchResultsWidget + + + No results + Sin resultados + + OptionsDialog - + + + Appearance + Apariencia + + + + Options Opciones - + + + Language + Idioma + + + + + Application language + Idioma de la aplicación + + + + + System default + Predeterminado del sistema + + + Tray icon settings (experimental) Opciones de bandeja de sistema (experimental) - + Close to tray Cerrar a la bandeja - + Start into the system tray Comenzar en la bandeja de sistema - + Edit Comic Vine API key Editar la clave API de Comic Vine - + Comic Vine API key Clave API de Comic Vine - + ComicInfo.xml legacy support Soporte para ComicInfo.xml - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics Importar metadatos desde ComicInfo.xml al añadir nuevos cómics - - Consider 'recent' items added or updated since X days ago - Considerar elementos 'recientes' añadidos o actualizados desde hace X días + + Consider 'recent' items added or updated since X days ago + Considerar elementos 'recientes' añadidos o actualizados desde hace X días - + Third party reader Lector externo - + Write {comic_file_path} where the path should go in the command Escribe {comic_file_path} donde la ruta al cómic debería ir en el comando - + + Clear Borrar - + Update libraries at startup Actualizar bibliotecas al inicio - + Try to detect changes automatically Intentar detectar cambios automáticamente - + Update libraries periodically Actualizar bibliotecas periódicamente - + Interval: Intervalo: - + 30 minutes 30 minutos - + 1 hour 1 hora - + 2 hours 2 horas - + 4 hours 4 horas - + 8 hours 8 horas - + 12 hours 12 horas - + daily dirariamente - + Update libraries at certain time Actualizar bibliotecas en un momento determinado - + Time: Hora: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - ¡ADVERTENCIA! Durante las actualizaciones de la biblioteca se desactivan las escrituras en la base de datos. No programes actualizaciones mientras puedas estar usando la aplicación activamente. Durante las actualizaciones automáticas, la aplicación bloqueará algunas de las acciones hasta que la actualización esté terminada. Para detener una actualización automática, toca en el indicador de carga junto al título de Bibliotecas. + ¡ADVERTENCIA! Durante las actualizaciones de la biblioteca se desactivan las escrituras en la base de datos. +No programes actualizaciones mientras puedas estar usando la aplicación activamente. +Durante las actualizaciones automáticas, la aplicación bloqueará algunas de las acciones hasta que la actualización esté terminada. +Para detener una actualización automática, toca en el indicador de carga junto al título de Bibliotecas. - + Modifications detection Detección de modificaciones - + Compare the modified date of files when updating a library (not recommended) Comparar la fecha de modificación de los archivos al actualizar una biblioteca (no recomendado) - + Enable background image Activar imagen de fondo - + Opacity level Nivel de opacidad - + Blur level Nivel de desenfoque - + Use selected comic cover as background Usar la portada del cómic seleccionado como fondo - + Restore defautls Restaurar valores predeterminados - + Background Fondo - + Display continue reading banner - Mostrar banner de "Continuar leyendo" + Mostrar banner de "Continuar leyendo" - + Display current comic banner Mostar el báner del cómic actual - + Continue reading Continuar leyendo - + Comic Flow Comic Flow - - + + Libraries Bibliotecas - + Grid view Vista en cuadrícula - + + General - General + Opciones generales - - - PropertiesDialog - - Day: - Día: + + My comics path + Ruta a mis cómics - - Plot - Argumento + + Display + Visualización - - Size: - Tamaño: + + Show time in current page information label + Mostrar la hora en la etiqueta de información de la página actual - - Year: - Año: + + "Go to flow" size + Tamaño de "Ir a Comic Flow" - - Inker(s): - Entintador(es): + + Background color + Color de fondo - - Publishing - Publicación + + Choose + Elegir - - Publisher: - Editorial: + + Scroll behaviour + Comportamiento del scroll - - General info - Información general + + Disable scroll animations and smooth scrolling + Desactivar animaciones de desplazamiento y desplazamiento suave - - Color/BW: - Color/BN: + + Do not turn page using scroll + No cambiar de página usando el scroll - - Edit selected comics information - Editar la información de los cómics seleccionados + + Use single scroll step to turn page + Usar un solo paso de desplazamiento para cambiar de página - - Penciller(s): - Dibujant(es): + + Mouse mode + Modo del ratón - - Colorist(s): - Color: + + Only Back/Forward buttons can turn pages + Solo los botones Atrás/Adelante pueden cambiar de página - - Genre: - Género: + + Use the Left/Right buttons to turn pages. + Usar los botones Izquierda/Derecha para cambiar de página. - - Notes - Notas + + Click left or right half of the screen to turn pages. + Hacer clic en la mitad izquierda o derecha de la pantalla para cambiar de página. - - Load previous page as cover - Cargar página anterior como portada + + Quick Navigation Mode + Modo de navegación rápida - + + Disable mouse over activation + Desactivar activación al pasar el ratón + + + + Brightness + Brillo + + + + Contrast + Contraste + + + + Gamma + Gama + + + + Reset + Restablecer + + + + Image options + Opciones de imagen + + + + Fit options + Opciones de ajuste + + + + Enlarge images to fit width/height + Ampliar imágenes para ajustarse al ancho/alto + + + + Double Page options + Opciones de doble página + + + + Show covers as single page + Mostrar portadas como página única + + + + Scaling + Escalado + + + + Scaling method + Método de escalado + + + + Nearest (fast, low quality) + Vecino más cercano (rápido, baja calidad) + + + + Bilinear + Bilineal + + + + Lanczos (better quality) + Lanczos (mejor calidad) + + + + Page Flow + Flujo de página + + + + Image adjustment + Ajustes de imagen + + + + + Restart is needed + Es necesario reiniciar + + + + Comics directory + Directorio de cómics + + + + PropertiesDialog + + + Day: + Día: + + + + Plot + Argumento + + + + Size: + Tamaño: + + + + Year: + Año: + + + + Inker(s): + Entintador(es): + + + + Publishing + Publicación + + + + Publisher: + Editorial: + + + + General info + Información general + + + + Color/BW: + Color/BN: + + + + Edit selected comics information + Editar la información de los cómics seleccionados + + + + Penciller(s): + Dibujant(es): + + + + Colorist(s): + Color: + + + + Genre: + Género: + + + + Notes + Notas + + + + Load previous page as cover + Cargar página anterior como portada + + + Load next page as cover Cargar página siguiente como portada @@ -2233,7 +2606,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Series: - Series: + Serie: @@ -2382,8 +2755,8 @@ To stop an automatic update tap on the loading indicator next to the Libraries t - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ver </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ver </a> @@ -2413,6 +2786,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Número de arco: + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer es la versión sin interfaz gráfica (headless) de YACReaderLibrary. + +Esta aplicación admite ajustes persistentes; para configurarlos, edita este archivo %1 +Para conocer los ajustes disponibles, consulta la documentación en https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + QObject @@ -2428,89 +2817,107 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Trace - + Traza Debug - + Depuración Info - + Información Warning - + Advertencia Error - + Fallo Fatal - + Cr?tico - + Select custom cover - + Seleccionar portada personalizada - + Images (%1) - + Imágenes (%1) + + + + The file could not be read or is not valid JSON. + No se pudo leer el archivo o no es un JSON válido. + + + + This theme is for %1, not %2. + Este tema es para %1, no para %2. + + + + Libraries + Bibliotecas + + + + Folders + Carpetas + + + + Reading Lists + Listas de lectura QsLogging::LogWindowModel - Time - Hora + Hora - Level - Nivel + Nivel - Message - Mensaje + Mensaje QsLogging::Window - &Pause - &Pausar + &Pausar - &Resume - &Restaurar + &Restaurar - Save log - Guardar log + Guardar log - Log file (*.log) - Archivo de log (*.log) + Archivo de log (*.log) RenameLibraryDialog - + Rename current library Renombrar la biblioteca seleccionada @@ -2533,18 +2940,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of %1 found : %2 Número de %1 encontrados : %2 - - + + page %1 of %2 página %1 de %2 - + Number of volumes found : %1 Número de volúmenes encontrados : %1 @@ -2558,12 +2965,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Por favor, proporciona alguna información adicional para éste cómic. - + Series: - Series: + Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. Usar búsqueda exacta. Desactívala si quieres encontrar volúmenes que coincidan con algunas palabras del nombre. @@ -2576,12 +2983,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Por favor, proporciona alguna informacion adicional. - + Series: - Series: + Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. Usar búsqueda exacta. Desactívala si queires buscar volúmenes que coincidan con algunas de las palabras del nombre. @@ -2589,27 +2996,27 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectComic - + loading description cargando descripción - + comics cómics - + loading cover cargando portada - + comic description unavailable Descripción del cómic no disponible - + Please, select the right comic info. Por favor, selecciona la información correcta. @@ -2621,37 +3028,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + loading description cargando descripción - + Please, select the right series for your comic. Por favor, seleciona la serie correcta para tu cómic. - + Filter: Filtro: - + Nothing found, clear the filter if any. No se encontró nada, limpia el filtro si lo hubiera. - + loading cover cargando portada - + volume description unavailable Descripción del volumen no disponible - + volumes volúmenes @@ -2663,12 +3070,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SeriesQuestion - + no - no + No - + yes @@ -2681,37 +3088,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + Port Puerto - + enable the server activar el servidor - + set port fijar puerto - + Server connectivity information Infomación de conexión del servidor - + Scan it! ¡Escaneálo! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - YACReader está disponible para iOS y Android.<br/> Descúbrela para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a>o <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader está disponible para iOS y Android.<br/> Descúbrela para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a>o <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address Elige una dirección IP @@ -2719,335 +3126,1167 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SortVolumeComics - + remove selected comics eliminar cómics seleccionados - + sort comics to match comic information ordena los cómics para coincidir con la información - + restore all removed comics restaurar todos los cómics eliminados - + issues números - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. Por favor, ordena la lista de cómics en la izquiera hasta que coincida con la información adecuada. - TitleHeader + ThemeEditorDialog - - SEARCH - BUSCAR + + Theme Editor + Editor de temas - - - UpdateLibraryDialog - - Update library - Actualizar biblioteca + + + + + - - Cancel - Cancelar + + - + - - - Updating.... - Actualizado... + + i + ? - - - VolumeComicsModel - - title - título + + Expand all + Expandir todo - - - VolumesModel - - year - año + + Collapse all + Contraer todo - - issues - números + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Mantén pulsado para resaltar temporalmente el valor seleccionado en la interfaz (magenta / alternado / 0↔10). Al soltar se restaura el original. - - publisher - editor + + Search… + Buscar… - - - YACReader::TrayIconController - - &Restore - &Restaurar + + Light + Luz - - Systray - Bandeja del sistema + + Dark + Oscuro - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - YACReaderLibrary se continuará ejecutando en la bandeja del sistema. Para cerrar el programa elige <b>Cerrar</b> en el menú contextual del icono de la applicación en la bandeja del sistema. + + ID: + IDENTIFICACIÓN: - - - YACReader::WhatsNewDialog - - Close - Cerrar + + Display name: + Nombre para mostrar: - - - YACReaderDeletingProgress - - cancel - cancelar + + Variant: + Variante: - - Please wait, deleting in progress... - Borrando, por favor espera... + + Theme info + Información del tema - - - YACReaderFieldEdit - - Restore to default - Restaurar valor por defecto + + Parameter + Parámetro - - - Click to overwrite - Click para sobreescribir + + Value + Valor - - - YACReaderFieldPlainTextEdit - - Restore to default - Restaurar valor por defecto + + Save and apply + Guardar y aplicar - - - - - Click to overwrite - Click para sobreescribir + + Export to file... + Exportar a archivo... - - - YACReaderFlowConfigWidget - - CoverFlow look - Tipo CoverFlow + + Load from file... + Cargar desde archivo... - - How to show covers: - Cómo mostrar las portadas: + + Close + Cerrar - - Stripe look - Tipo tira + + Double-click to edit color + Doble clic para editar el color - - Overlapped Stripe look - Tipo tira solapada + + + + + + + true + verdadero - - - YACReaderGLFlowConfigWidget - - Zoom - Zoom + + + + + false + falso - - Light - Luz + + Double-click to toggle + Doble clic para alternar - - Show advanced settings - Opciones avanzadas + + Double-click to edit value + Doble clic para editar el valor - - Roulette look - Tipo ruleta + + + + Edit: %1 + Editar: %1 - - Cover Angle - Ángulo de las portadas + + Save theme + Guardar tema - - Stripe look - Tipo tira + + + JSON files (*.json);;All files (*) + Archivos JSON (*.json);;Todos los archivos (*) - - Position - Posición + + Save failed + Error al guardar - - Z offset - Desplazamiento en Z + + Could not open file for writing: +%1 + No se pudo abrir el archivo para escribir: +%1 - - Y offset - Desplazamiento en Y + + Load theme + Cargar tema - - Central gap - Hueco central + + + + Load failed + Error al cargar - - Presets: - Predeterminados: + + Could not open file: +%1 + No se pudo abrir el archivo: +%1 - - Overlapped Stripe look - Tipo tira solapada + + Invalid JSON: +%1 + JSON no válido: +%1 - - Modern look + + Expected a JSON object. + Se esperaba un objeto JSON. + + + + TitleHeader + + + SEARCH + BUSCAR + + + + UpdateLibraryDialog + + + Update library + Actualizar biblioteca + + + + Cancel + Cancelar + + + + Updating.... + Actualizado... + + + + Viewer + + + + Press 'O' to open comic. + Pulsa 'O' para abrir un fichero. + + + + Not found + No encontrado + + + + Comic not found + Cómic no encontrado + + + + Error opening comic + Error abriendo cómic + + + + CRC Error + Error CRC + + + + Loading...please wait! + Cargando...espere, por favor! + + + + Page not available! + ¡Página no disponible! + + + + Cover! + ¡Portada! + + + + Last page! + ¡Última página! + + + + VolumeComicsModel + + + title + título + + + + VolumesModel + + + year + año + + + + issues + números + + + + publisher + editor + + + + YACReader3DFlowConfigWidget + + + Presets: + Predeterminados: + + + + Classic look + Tipo clásico + + + + Stripe look + Tipo tira + + + + Overlapped Stripe look + Tipo tira solapada + + + + Modern look Tipo moderno - + + Roulette look + Tipo ruleta + + + + Show advanced settings + Opciones avanzadas + + + + Custom: + Personalizado: + + + + View angle + Ángulo de vista + + + + Position + Posición + + + + Cover gap + Hueco entre portadas + + + + Central gap + Hueco central + + + + Zoom + Ampliaci?n + + + + Y offset + Desplazamiento en Y + + + + Z offset + Desplazamiento en Z + + + + Cover Angle + Ángulo de las portadas + + + + Visibility + Visibilidad + + + + Light + Luz + + + + Max angle + Ángulo máximo + + + + Low Performance + Rendimiento bajo + + + + High Performance + Alto rendimiento + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Usar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + + + + Performance: + Rendimiento: + + + + YACReader::MainWindowViewer + + + &Open + &Abrir + + + + Open a comic + Abrir cómic + + + + New instance + Nueva instancia + + + + Open Folder + Abrir carpeta + + + + Open image folder + Abrir carpeta de imágenes + + + + Open latest comic + Abrir el cómic más reciente + + + + Open the latest comic opened in the previous reading session + Abrir el cómic más reciente abierto en la sesión de lectura anterior + + + + Clear + Borrar + + + + Clear open recent list + Limpiar lista de abiertos recientemente + + + + Save + Guardar + + + + + Save current page + Guardar la página actual + + + + Previous Comic + Cómic anterior + + + + + + Open previous comic + Abrir cómic anterior + + + + Next Comic + Siguiente Cómic + + + + + + Open next comic + Abrir siguiente cómic + + + + &Previous + A&nterior + + + + + + Go to previous page + Ir a la página anterior + + + + &Next + Siguie&nte + + + + + + Go to next page + Ir a la página siguiente + + + + Fit Height + Ajustar altura + + + + Fit image to height + Ajustar página a lo alto + + + + Fit Width + Ajustar anchura + + + + Fit image to width + Ajustar página a lo ancho + + + + Show full size + Mostrar a tamaño original + + + + Fit to page + Ajustar a página + + + + Continuous scroll + Desplazamiento continuo + + + + Switch to continuous scroll mode + Cambiar al modo de desplazamiento continuo + + + + Reset zoom + Restablecer zoom + + + + Show zoom slider + Mostrar control deslizante de zoom + + + + Zoom+ + Ampliar+ + + + + Zoom- + Reducir + + + + Rotate image to the left + Rotar imagen a la izquierda + + + + Rotate image to the right + Rotar imagen a la derecha + + + + Double page mode + Modo a doble página + + + + Switch to double page mode + Cambiar a modo de doble página + + + + Double page manga mode + Modo de manga de página doble + + + + Reverse reading order in double page mode + Invertir el orden de lectura en modo de página doble + + + + Go To + Ir a + + + + Go to page ... + Ir a página... + + + + Options + Opciones + + + + YACReader options + Opciones de YACReader + + + + + Help + Ayuda + + + + Help, About YACReader + Ayuda, A cerca de... YACReader + + + + Magnifying glass + Lupa + + + + Switch Magnifying glass + Lupa On/Off + + + + Set bookmark + Añadir marcador + + + + Set a bookmark on the current page + Añadir un marcador en la página actual + + + + Show bookmarks + Mostrar marcadores + + + + Show the bookmarks of the current comic + Mostrar los marcadores del cómic actual + + + + Show keyboard shortcuts + Mostrar atajos de teclado + + + + Show Info + Mostrar información + + + + Close + Cerrar + + + + Show Dictionary + Mostrar diccionario + + + + Show go to flow + Mostrar "Ir a Comic Flow" + + + + Edit shortcuts + Editar atajos + + + + &File + &Archivo + + + + + Open recent + Abrir reciente + + + + File + Archivo + + + + Edit + Editar + + + + View + Ver + + + + Go + Ir + + + + Window + Ventana + + + + + + Open Comic + Abrir cómic + + + + + + Comic files + Archivos de cómic + + + + Open folder + Abrir carpeta + + + + page_%1.jpg + página_%1.jpg + + + + Image files (*.jpg) + Archivos de imagen (*.jpg) + + + + + Comics + Cómics + + + + + General + Opciones generales + + + + + Magnifiying glass + Lupa + + + + + Page adjustement + Ajuste de página + + + + + Reading + Leyendo + + + + Toggle fullscreen mode + Alternar modo de pantalla completa + + + + Hide/show toolbar + Ocultar/mostrar barra de herramientas + + + + Size up magnifying glass + Aumentar tamaño de la lupa + + + + Size down magnifying glass + Disminuir tamaño de lupa + + + + Zoom in magnifying glass + Incrementar el aumento de la lupa + + + + Zoom out magnifying glass + Reducir el aumento de la lupa + + + + Reset magnifying glass + Resetear lupa + + + + Toggle between fit to width and fit to height + Alternar entre ajuste al ancho y ajuste al alto + + + + Autoscroll down + Desplazamiento automático hacia abajo + + + + Autoscroll up + Desplazamiento automático hacia arriba + + + + Autoscroll forward, horizontal first + Desplazamiento automático hacia adelante, primero horizontal + + + + Autoscroll backward, horizontal first + Desplazamiento automático hacia atrás, primero horizontal + + + + Autoscroll forward, vertical first + Desplazamiento automático hacia adelante, primero vertical + + + + Autoscroll backward, vertical first + Desplazamiento automático hacia atrás, primero vertical + + + + Move down + Mover abajo + + + + Move up + Mover arriba + + + + Move left + Mover a la izquierda + + + + Move right + Mover a la derecha + + + + Go to the first page + Ir a la primera página + + + + Go to the last page + Ir a la última página + + + + Offset double page to the left + Mover una página a la izquierda + + + + Offset double page to the right + Mover una página a la derecha + + + + There is a new version available + Hay una nueva versión disponible + + + + Do you want to download the new version? + ¿Desea descargar la nueva versión? + + + + Remind me in 14 days + Recordar en 14 días + + + + Not now + Ahora no + + + + YACReader::TrayIconController + + + &Restore + &Restaurar + + + + Systray + Bandeja del sistema + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary se continuará ejecutando en la bandeja del sistema. Para cerrar el programa elige <b>Cerrar</b> en el menú contextual del icono de la aplicación en la bandeja del sistema. + + + + YACReader::WhatsNewDialog + + Close + Cerrar + + + + YACReaderFieldEdit + + + Restore to default + Restaurar valor por defecto + + + + + Click to overwrite + Clic para sobrescribir + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Restaurar valor por defecto + + + + + + + Click to overwrite + Clic para sobrescribir + + + + YACReaderFlowConfigWidget + + CoverFlow look + Tipo CoverFlow + + + How to show covers: + Cómo mostrar las portadas: + + + Stripe look + Tipo tira + + + Overlapped Stripe look + Tipo tira solapada + + + + YACReaderGLFlowConfigWidget + + Zoom + Ampliaci?n + + + Light + Luz + + + Show advanced settings + Opciones avanzadas + + + Roulette look + Tipo ruleta + + + Cover Angle + Ángulo de las portadas + + + Stripe look + Tipo tira + + + Position + Posición + + + Z offset + Desplazamiento en Z + + + Y offset + Desplazamiento en Y + + + Central gap + Hueco central + + + Presets: + Predeterminados: + + + Overlapped Stripe look + Tipo tira solapada + + + Modern look + Tipo moderno + + View angle - Ángulo de vista + Ángulo de vista - Max angle - Ángulo máximo + Ángulo máximo - Custom: - Personalizado: + Personalizado: - Classic look - Tipo clásico + Tipo clásico - Cover gap - Hueco entre portadas + Hueco entre portadas - High Performance - Alto rendimiento + Alto rendimiento - Performance: - Rendimiento: + Rendimiento: - Use VSync (improve the image quality in fullscreen mode, worse performance) - Usar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + Usar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) - Visibility - Visibilidad + Visibilidad - Low Performance - Rendimiento bajo + Rendimiento bajo YACReaderNavigationController - No favorites - Ningún favorito + Ningún favorito - You are not reading anything yet, come on!! - No estás leyendo nada aún, ¡vamos! + No estás leyendo nada aún, ¡vamos! - There are no recent comics! - ¡No hay comics recientes! + ¡No hay comics recientes! YACReaderOptionsDialog - + Save Guardar - Use hardware acceleration (restart needed) - Usar aceleración por hardware (necesario reiniciar) + Usar aceleración por hardware (necesario reiniciar) - + Cancel Cancelar - + Edit shortcuts Editar atajos - + Shortcuts Atajos @@ -3055,7 +4294,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t YACReaderSearchLineEdit - + type to search escribe para buscar @@ -3063,34 +4302,60 @@ To stop an automatic update tap on the loading indicator next to the Libraries t YACReaderSideBar - LIBRARIES - BIBLIOTECAS + BIBLIOTECAS - FOLDERS - CARPETAS + CARPETAS - Libraries - Bibliotecas + Bibliotecas - Folders - Carpetas + Carpetas - Reading Lists - Listas de lectura + Listas de lectura - READING LISTS - LISTAS DE LECTURA + LISTAS DE LECTURA + + + + YACReaderSlider + + + Reset + Restablecer + + + + YACReaderTranslator + + + YACReader translator + Traductor YACReader + + + + + Translation + Traducción + + + + clear + Limpiar + + + + Service not available + Servicio no disponible diff --git a/YACReaderLibrary/yacreaderlibrary_fr.ts b/YACReaderLibrary/yacreaderlibrary_fr.ts index abf9377fd..8a9ccc5f5 100644 --- a/YACReaderLibrary/yacreaderlibrary_fr.ts +++ b/YACReaderLibrary/yacreaderlibrary_fr.ts @@ -12,84 +12,72 @@ AddLabelDialog - red - rouge + rouge - blue - bleu + bleu - dark - foncé + foncé - cyan - cyan + bleu cyan - pink - rose + rose - green - vert + vert - light - clair + clair - white - blanc + blanc - + Choose a color: Choisissez une couleur: - + accept accepter - + cancel Annuler - orange - orange + orang? - purple - violet + violet - violet - violet + pourpre - yellow - jaune + jaune - + Label name: - + Nom de l'étiquette : @@ -100,7 +88,7 @@ Ajouter - + Add an existing library Ajouter une librairie existante @@ -134,8 +122,8 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - Avant de pouvoir vous connecter à Comic Vine, vous avez besoin de votre propre clé API. Veuillez en obtenir une gratuitement ici: <a href="http://www.comicvine.com/api/"></a> + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Avant de pouvoir vous connecter à Comic Vine, vous avez besoin de votre propre clé API. Veuillez en obtenir une gratuitement ici: <a href="http://www.comicvine.com/api/"></a> @@ -143,93 +131,233 @@ Collez ici votre clé API Comic Vine + + AppearanceTabWidget + + + Color scheme + Jeu de couleurs + + + + System + Système + + + + Light + Lumière + + + + Dark + Sombre + + + + Custom + Coutume + + + + Remove + Retirer + + + + Remove this user-imported theme + Supprimer ce thème importé par l'utilisateur + + + + Light: + Lumière: + + + + Dark: + Sombre: + + + + Custom: + Personnalisation: + + + + Import theme... + Importer le thème... + + + + Theme + Thème + + + + Theme editor + Éditeur de thème + + + + Open Theme Editor... + Ouvrir l'éditeur de thème... + + + + Theme editor error + Erreur de l'éditeur de thème + + + + The current theme JSON could not be loaded. + Le thème actuel JSON n'a pas pu être chargé. + + + + Import theme + Importer un thème + + + + JSON files (*.json);;All files (*) + Fichiers JSON (*.json);;Tous les fichiers (*) + + + + Could not import theme from: +%1 + Impossible d'importer le thème depuis : +%1 + + + + Could not import theme from: +%1 + +%2 + Impossible d'importer le thème depuis : +%1 + +%2 + + + + Import failed + Échec de l'importation + + + + BookmarksDialog + + + Lastest Page + Aller à la dernière page + + + + Close + Fermer + + + + Click on any image to go to the bookmark + Cliquez sur une image pour aller au marque-page + + + + + Loading... + Chargement... + + ClassicComicsView - + Hide comic flow - Cacher le flux de bande dessinée + Masquer Comic Flow ComicInfoView - + b/w - noir et blanc + n/b - + cover artist - couverture + dessinateur de couverture - + color couleur - + inker - encre + encreur - + penciller - dessin + dessinateur - + colorist - couleur + coloriste - + writer - scénario + scénariste - + Characters Personnages - + Main character or team - + Personnage principal ou équipe - + Teams - + Équipes - + Locations - + Emplacements - + Authors Auteurs - + editor - + éditeur - + imprint - + label éditorial - + Publisher - Editeur + Éditeur - + letterer lettreur @@ -254,17 +382,17 @@ Series - + Série Volume - + Tome Story Arc - + Arc d'histoire @@ -274,7 +402,7 @@ Pages - Pages + Feuilles @@ -294,7 +422,7 @@ Publication Date - + Date de publication @@ -305,74 +433,82 @@ ComicVineDialog - + back retour - + next suivant - + skip passer - + close fermer - - + + Retrieving tags for : %1 Retrouver les infomartions de: %1 - + Looking for comic... Vous cherchez une bande dessinée ... - + search chercher - - + + comic %1 of %2 - %3 bande dessinée %1 sur %2 - %3 - + %1 comics selected %1 bande(s) dessinnée(s) sélectionnée(s) - + Error connecting to ComicVine Erreur de connexion à Comic Vine - - - + + + Looking for volume... - + Vous cherchez du volume... - + Retrieving volume info... - + Récupération des informations sur le volume... + + + + ContinuousPageWidget + + + Loading page %1 + Chargement de la page %1 CreateLibraryDialog - + Create new library Créer une nouvelle librairie @@ -389,12 +525,12 @@ Create a library could take several minutes. You can stop the process and update the library later for completing the task. - La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et continuer plus tard. + La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et continuer plus tard. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder - Le chemin sélectionné n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + Le chemin sélectionné n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier @@ -407,7 +543,7 @@ Nom de la librairie : - + Path not found Chemin introuvable @@ -417,53 +553,50 @@ Restore defaults - + Réinitialiser To change a shortcut, double click in the key combination and type the new keys. - + Pour modifier un raccourci, double-cliquez sur la combinaison de touches et tapez les nouvelles clés. Shortcuts settings - + Paramètres de raccourcis - + Shortcut in use - + Raccourci en cours d'utilisation - - The shortcut "%1" is already assigned to other function - + + The shortcut "%1" is already assigned to other function + Le raccourci "%1" est déjà affecté à une autre fonction EmptyFolderWidget - - Subfolders in this folder - Sous-dossiers dans ce dossier + Sous-dossiers dans ce dossier - Drag and drop folders and comics here - Glissez et déposez les dossiers et les bandes dessinées ici + Glissez et déposez les dossiers et les bandes dessinées ici - - Empty folder - + + This folder doesn't contain comics yet + Ce dossier ne contient pas encore de bandes dessinées EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet Ce dossier ne contient pas encore de bandes dessinées @@ -475,6 +608,24 @@ Cette liste de lecture ne contient aucune bande dessinée + + EmptySpecialListWidget + + + No favorites + Pas de favoris + + + + You are not reading anything yet, come on!! + Vous ne lisez rien encore, allez !! + + + + There are no recent comics! + Il n'y a pas de BD récente ! + + ExportComicsInfoDialog @@ -483,7 +634,7 @@ Fichier de sortie : - + Destination database name Nom de la base de données de destination @@ -498,19 +649,19 @@ Créer - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier - + Export comics info Exporter les infos des bandes dessinées - + Problem found while writing - Problème durant l'écriture + Problème durant l'écriture @@ -526,9 +677,9 @@ Créer - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier @@ -536,17 +687,17 @@ Dossier de sortie : - + Problem found while writing - Problème durant l'écriture + Problème durant l'écriture - + Create covers package Créer un pack de couvertures - + Destination directory Répertoire de destination @@ -561,57 +712,86 @@ CRC error on page (%1): some of the pages will not be displayed correctly - + Erreur CRC sur la page (%1): certaines pages ne s'afficheront pas correctement Unknown error opening the file - + Erreur inconnue lors de l'ouverture du fichier Format not supported - + Format non supporté FolderContentView - + Continue Reading... - + Continuer la lecture... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Feuille : + + + + Go To + Aller à + + + + Cancel + Annuler + + + + + Total pages : + Nombre de pages : + + + + Go to... + Aller à... + + + + GoToFlowToolBar + + + Page : + Feuille : GridComicsView - + Show info - + Afficher les informations HelpAboutDialog - + Help Aide - + System info - + Informations système - + About A propos @@ -639,7 +819,7 @@ Importer les infos des bandes dessinées - + Comics info file (*.ydb) Fichier infos BD (*.ydb) @@ -662,9 +842,9 @@ Désarchiver - + Compresed library covers (*.clc) - Compresed library covers (*.clc) + Couvertures de bibliothèque compressées (*.clc) @@ -677,7 +857,7 @@ Nom de la librairie : - + Extract a catalog Extraire un catalogue @@ -685,54 +865,54 @@ ImportWidget - + stop - Stop + Arrêter - + Importing comics Importation de bande dessinée - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> - <p>YACReaderLibrary est en train de créer une nouvelle librairie.</p><p>La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et poursuivre plus tard.</p> + <p>YACReaderLibrary est en train de créer une nouvelle librairie.</p><p>La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et poursuivre plus tard.</p> - + Some of the comics being added... Ajout de bande dessinée... - + Updating the library Mise à jour de la librairie - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>Mise à jour de la librairie. Pour plus de rapidité lors de la mise à jour, veuillez effectuer cette dernière régulièrement.</p><p>Vous pouvez arrêter le processus et poursuivre plus tard.</p> - + Upgrading the library - + Mise à niveau de la bibliothèque - + <p>The current library is being upgraded, please wait.</p> - + <p>La bibliothèque actuelle est en cours de mise à niveau, veuillez patienter.</p> - + Scanning the library - + Scanner la bibliothèque - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>La bibliothèque actuelle est en cours d'analyse pour rechercher des informations sur les métadonnées XML héritées.</p><p>Ceci n'est nécessaire qu'une seule fois, et uniquement si la bibliothèque a été créée avec YACReaderLibrary 9.8.2 ou une version antérieure.</p> @@ -742,17 +922,17 @@ Editer - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. Le dossier sélectionné ne contient aucune librairie. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Cette librairie a été créée avec une ancienne version de YACReaderLibrary. Mise à jour necessaire. Mettre à jour? - + Comic Bande dessinée @@ -761,9 +941,9 @@ Mettre à jour ce dossier - + Error opening the library - Erreur lors de l'ouverture de la librairie + Erreur lors de l'ouverture de la librairie Show/Hide marks @@ -782,45 +962,45 @@ Marquer cette bande dessinée comme lu - - - + + + manga - + mangas - - - + + + comic - + comique - - - + + + western manga (left to right) - + manga occidental (de gauche à droite) Add selected comics to favorites list Ajouter la bande dessinée sélectionnée à la liste des favoris - - - + + + 4koma (top to botom) 4koma (top to botom - + 4koma (de haut en bas) - + Remove and delete metadata Supprimer les métadata - + Old library Ancienne librairie @@ -829,12 +1009,12 @@ Mise à jour des couvertures - + Set as completed Marquer comme complet - + Library Librairie @@ -847,13 +1027,13 @@ Mode plein écran activé/désactivé - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Cette librairie a été créée avec une version plus récente de YACReaderLibrary. Télécharger la nouvelle version? - - + + Moving comics... Déplacer la bande dessinée... @@ -866,53 +1046,53 @@ Mettre à jour la librairie actuelle - - + + Copying comics... Copier la bande dessinée... - - Library '%1' is no longer available. Do you want to remove it? - La librarie '%1' n'est plus disponible. Voulez-vous la supprimer? + + Library '%1' is no longer available. Do you want to remove it? + La librarie '%1' n'est plus disponible. Voulez-vous la supprimer? Update library Mettre la librairie à jour - + Open folder... Ouvrir le dossier... - + Do you want remove Voulez-vous supprimer - + Set as uncompleted Marquer comme incomplet Reset comic rating - Supprimer la note d'évaluation + Supprimer la note d'évaluation - + Error updating the library Erreur lors de la mise à jour de la librairie - + Folder Dossier - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? - L'élément sélectionné sera supprimé, vos bandes dessinées ou dossiers ne seront pas supprimés de votre disque. Êtes-vous sûr? + L'élément sélectionné sera supprimé, vos bandes dessinées ou dossiers ne seront pas supprimés de votre disque. Êtes-vous sûr? Expand all nodes @@ -923,9 +1103,9 @@ Ajouter à... - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - La librarie '%1' a été créée avec une ancienne version de YACReaderLibrary. Elle doit être re-créée. Voulez-vous créer la librairie? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La librarie '%1' a été créée avec une ancienne version de YACReaderLibrary. Elle doit être re-créée. Voulez-vous créer la librairie? Pack covers @@ -936,12 +1116,12 @@ Supprimer la liste de lecture actuelle de la bibliothèque - + Add new reading lists Ajouter de nouvelles listes de lecture - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -949,12 +1129,12 @@ You probably only need one library in your top level comics folder, you can brow YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. Vous ajoutez trop de bibliothèques. -Vous n'avez probablement besoin que d'une bibliothèque dans votre dossier BD de niveau supérieur, vous pouvez parcourir les sous-dossiers en utilisant la section des dossiers dans la barre latérale gauche. +Vous n'avez probablement besoin que d'une bibliothèque dans votre dossier BD de niveau supérieur, vous pouvez parcourir les sous-dossiers en utilisant la section des dossiers dans la barre latérale gauche. YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais vous devriez garder le nombre de bibliothèques bas. - + Set as read Marquer comme lu @@ -975,7 +1155,7 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Créer une nouvelle librairie - + Library not available Librairie non disponible @@ -996,7 +1176,7 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Ouvrir cette bande dessinée - + YACReader Library Librairie de YACReader @@ -1005,12 +1185,12 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Ajouter une nouvelle liste de lecture à la bibliothèque actuelle - + Error creating the library Erreur lors de la création de la librairie - + Update folder Mettre à jour le dossier @@ -1019,7 +1199,7 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Désarchiver les couvertures - + Update needed Mise à jour requise @@ -1032,26 +1212,26 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Afficher ou masquer les marques de lecture - + Library name already exists Le nom de la librairie existe déjà - - There is another library with the name '%1'. - Une autre librairie a le nom '%1'. + + There is another library with the name '%1'. + Une autre librairie a le nom '%1'. Remove reading list Supprimer la liste de lecture - + Download new version Téléchrger la nouvelle version - + Delete comics Supprimer les comics @@ -1061,7 +1241,7 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Assign current order to comics - Assigner l'ordre actuel aux bandes dessinées + Assigner l'ordre actuel aux bandes dessinées Pack the covers of the selected library @@ -1088,7 +1268,7 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Désarchiver un catalogue - + All the selected comics will be deleted from your disk. Are you sure? Tous les comics sélectionnés vont être supprimés de votre disque. Êtes-vous sûr? @@ -1097,13 +1277,13 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Télécharger les informations de Comic Vine - - + + Set as unread Marquer comme non-lu - + Library not found Librairie introuvable @@ -1120,7 +1300,7 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Ouvrir le dossier... - + library? la librairie? @@ -1129,640 +1309,640 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v Enregistrer les couvertures des bandes dessinées sélectionnées en tant que fichiers JPG - + Are you sure? Êtes-vous sûr? - + Rescan library for XML info - + Réanalyser la bibliothèque pour les informations XML - - - + + + web comic - + bande dessinée Web - + Add new folder - + Ajouter un nouveau dossier - + Delete folder - + Supprimer le dossier - + Upgrade failed - + La mise à niveau a échoué - + There were errors during library upgrade in: - + Des erreurs se sont produites lors de la mise à niveau de la bibliothèque dans : - + Folder name: - + Nom du dossier : - + No folder selected - + Aucun dossier sélectionné - + Please, select a folder first - + Veuillez d'abord sélectionner un dossier - + Error in path - + Erreur dans le chemin - - There was an error accessing the folder's path - + + There was an error accessing the folder's path + Une erreur s'est produite lors de l'accès au chemin du dossier - + The selected folder and all its contents will be deleted from your disk. Are you sure? - + Le dossier sélectionné et tout son contenu seront supprimés de votre disque. Es-tu sûr? - - + + Unable to delete - + Impossible de supprimer - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - + Un problème est survenu lors de la tentative de suppression des dossiers sélectionnés. Veuillez vérifier les autorisations d'écriture et assurez-vous que toutes les applications utilisent ces dossiers ou l'un des fichiers contenus. - - + + List name: - + Nom de la liste : - + Delete list/label - + Supprimer la liste/l'étiquette - + Rename list name - + Renommer le nom de la liste - - - - + + + + Set type - + Définir le type - + Set custom cover - + Définir une couverture personnalisée - + Delete custom cover - + Supprimer la couverture personnalisée - + Save covers - + Enregistrer les couvertures - + You are adding too many libraries. - + Vous ajoutez trop de bibliothèques. - - + + YACReader not found - + YACReader introuvable - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader introuvable. YACReader doit être installé dans le même dossier que YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. - + YACReader introuvable. Il se peut qu'il y ait un problème avec votre installation de YACReader. - + Error - + Erreur - + Error opening comic with third party reader. - + Erreur lors de l'ouverture de la bande dessinée avec un lecteur tiers. - + Library info - + Informations sur la bibliothèque - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - + Un problème est survenu lors de la tentative de suppression des bandes dessinées sélectionnées. Veuillez vérifier les autorisations d'écriture dans les fichiers sélectionnés ou le dossier contenant. - + Assign comics numbers - + Attribuer des numéros de bandes dessinées - + Assign numbers starting in: - + Attribuez des numéros commençant par : - + Invalid image - + Image invalide - + The selected file is not a valid image. - + Le fichier sélectionné n'est pas une image valide. - + Error saving cover - + Erreur lors de l'enregistrement de la couverture - + There was an error saving the cover image. - + Une erreur s'est produite lors de l'enregistrement de l'image de couverture. - + Remove comics - + Supprimer les bandes dessinées - + Comics will only be deleted from the current label/list. Are you sure? - + Les bandes dessinées seront uniquement supprimées du label/liste actuelle. Es-tu sûr? LibraryWindowActions - + Create a new library - Créer une nouvelle librairie + Créer une nouvelle librairie - + Open an existing library - Ouvrir une librairie existante + Ouvrir une librairie existante - - + + Export comics info - Exporter les infos des bandes dessinées + Exporter les infos des bandes dessinées - - + + Import comics info - Importer les infos des bandes dessinées + Importer les infos des bandes dessinées - + Pack covers - Archiver les couvertures + Archiver les couvertures - + Pack the covers of the selected library - Archiver les couvertures de la librairie sélectionnée + Archiver les couvertures de la librairie sélectionnée - + Unpack covers - Désarchiver les couvertures + Désarchiver les couvertures - + Unpack a catalog - Désarchiver un catalogue + Désarchiver un catalogue - + Update library - Mettre la librairie à jour + Mettre la librairie à jour - + Update current library - Mettre à jour la librairie actuelle + Mettre à jour la librairie actuelle - + Rename library - Renommer la librairie + Renommer la librairie - + Rename current library - Renommer la librairie actuelle + Renommer la librairie actuelle - + Remove library - Supprimer la librairie + Supprimer la librairie - + Remove current library from your collection - Enlever cette librairie de votre collection + Enlever cette librairie de votre collection - + Rescan library for XML info - + Réanalyser la bibliothèque pour les informations XML - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Essaie de trouver des informations XML intégrées dans des fichiers de bandes dessinées. Vous ne devez le faire que si la bibliothèque a été créée avec la version 9.8.2 ou des versions antérieures ou si vous utilisez un logiciel tiers pour intégrer des informations XML dans les fichiers. - + Show library info - + Afficher les informations sur la bibliothèque - + Show information about the current library - + Afficher des informations sur la bibliothèque actuelle - + Open current comic - Ouvrir cette bande dessinée + Ouvrir cette bande dessinée - + Open current comic on YACReader - Ouvrir cette bande dessinée dans YACReader + Ouvrir cette bande dessinée dans YACReader - + Save selected covers to... - Exporter la couverture vers... + Exporter la couverture vers... - + Save covers of the selected comics as JPG files - Enregistrer les couvertures des bandes dessinées sélectionnées en tant que fichiers JPG + Enregistrer les couvertures des bandes dessinées sélectionnées en tant que fichiers JPG - - + + Set as read - Marquer comme lu + Marquer comme lu - + Set comic as read - Marquer cette bande dessinée comme lu + Marquer cette bande dessinée comme lu - - + + Set as unread - Marquer comme non-lu + Marquer comme non-lu - + Set comic as unread - Marquer cette bande dessinée comme non-lu + Marquer cette bande dessinée comme non-lu - - + + manga - + mangas - + Set issue as manga - + Définir le problème comme manga - - + + comic - + comique - + Set issue as normal - + Définir le problème comme d'habitude - + western manga - + manga occidental - + Set issue as western manga - + Définir le problème comme un manga occidental - - + + web comic - + bande dessinée Web - + Set issue as web comic - + Définir le problème comme bande dessinée Web - - + + yonkoma - + Yonkoma - + Set issue as yonkoma - + Définir le problème comme Yonkoma - + Show/Hide marks - Afficher/Cacher les marqueurs + Afficher/Cacher les marqueurs - + Show or hide read marks - Afficher ou masquer les marques de lecture + Afficher ou masquer les marques de lecture - + Show/Hide recent indicator - + Afficher/Masquer l'indicateur récent - + Show or hide recent indicator - + Afficher ou masquer l'indicateur récent - - + + Fullscreen mode on/off - Mode plein écran activé/désactivé + Mode plein écran activé/désactivé - + Help, About YACReader - Aide, à propos de YACReader + Aide, à propos de YACReader - + Add new folder - + Ajouter un nouveau dossier - + Add new folder to the current library - + Ajouter un nouveau dossier à la bibliothèque actuelle - + Delete folder - + Supprimer le dossier - + Delete current folder from disk - + Supprimer le dossier actuel du disque - + Select root node - Allerà la racine + Allerà la racine - + Expand all nodes - Afficher tous les noeuds + Afficher tous les noeuds - + Collapse all nodes - + Réduire tous les nœuds - + Show options dialog - Ouvrir la boite de dialogue + Ouvrir la boite de dialogue - + Show comics server options dialog - Ouvrir la boite de dialogue du serveur + Ouvrir la boite de dialogue du serveur - - + + Change between comics views - + Changement entre les vues de bandes dessinées - + Open folder... - Ouvrir le dossier... + Ouvrir le dossier... - + Set as uncompleted - Marquer comme incomplet + Marquer comme incomplet - + Set as completed - Marquer comme complet + Marquer comme complet - + Set custom cover - + Définir une couverture personnalisée - + Delete custom cover - + Supprimer la couverture personnalisée - + western manga (left to right) - + manga occidental (de gauche à droite) - + Open containing folder... - Ouvrir le dossier... + Ouvrir le dossier... - + Reset comic rating - Supprimer la note d'évaluation + Supprimer la note d'évaluation - + Select all comics - Sélectionner toutes les bandes dessinées + Sélectionner toutes les bandes dessinées - + Edit - Editer + Editer - + Assign current order to comics - Assigner l'ordre actuel aux bandes dessinées + Assigner l'ordre actuel aux bandes dessinées - + Update cover - Mise à jour des couvertures + Mise à jour des couvertures - + Delete selected comics - Supprimer la bande dessinée sélectionnée + Supprimer la bande dessinée sélectionnée - + Delete metadata from selected comics - + Supprimer les métadonnées des bandes dessinées sélectionnées - + Download tags from Comic Vine - Télécharger les informations de Comic Vine + Télécharger les informations de Comic Vine - + Focus search line - + Ligne de recherche ciblée - + Focus comics view - + Focus sur la vue des bandes dessinées - + Edit shortcuts - + Modifier les raccourcis - + &Quit - + &Quitter - + Update folder - Mettre à jour le dossier + Mettre à jour le dossier - + Update current folder - Mettre à jour ce dossier + Mettre à jour ce dossier - + Scan legacy XML metadata - + Analyser les métadonnées XML héritées - + Add new reading list - Ajouter une nouvelle liste de lecture + Ajouter une nouvelle liste de lecture - + Add a new reading list to the current library - Ajouter une nouvelle liste de lecture à la bibliothèque actuelle + Ajouter une nouvelle liste de lecture à la bibliothèque actuelle - + Remove reading list - Supprimer la liste de lecture + Supprimer la liste de lecture - + Remove current reading list from the library - Supprimer la liste de lecture actuelle de la bibliothèque + Supprimer la liste de lecture actuelle de la bibliothèque - + Add new label - + Ajouter une nouvelle étiquette - + Add a new label to this library - + Ajouter une nouvelle étiquette à cette bibliothèque - + Rename selected list - + Renommer la liste sélectionnée - + Rename any selected labels or lists - + Renommer toutes les étiquettes ou listes sélectionnées - + Add to... - Ajouter à... + Ajouter à... - + Favorites - Favoris + Favoris - + Add selected comics to favorites list - Ajouter la bande dessinée sélectionnée à la liste des favoris + Ajouter la bande dessinée sélectionnée à la liste des favoris @@ -1770,389 +1950,560 @@ YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais v file name - + nom de fichier - LogWindow - - - Log window - - - - - &Pause - - + NoLibrariesWidget - - &Save - + + create your first library + Créez votre première librairie - - C&lear - + + You don't have any libraries yet + Vous n'avez pas encore de librairie - - &Copy - + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Vous pouvez creer une librairie dans n'importe quel dossierr, YACReaderLibrary importera les dossiers et les bandes dessinées contenus dans ce dossier. Si vous avez déjà crer des librairies, vous pouvez les ouvrir.</p><p>N'oubliez pas que vous pouvez utiliser YACReader en tant que stand alone pour lire vos bandes dessinées sur votre ordinateur.</p> - - Level: - + + add an existing one + Ajouter une librairie existante + + + NoSearchResultsWidget - - &Auto scroll - + + No results + Aucun résultat - NoLibrariesWidget + OptionsDialog - - create your first library - Créez votre première librairie + + + Appearance + Apparence - - You don't have any libraries yet - Vous n'avez pas encore de librairie + + + Options + Possibilités - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> - <p>Vous pouvez creer une librairie dans n'importe quel dossierr, YACReaderLibrary importera les dossiers et les bandes dessinées contenus dans ce dossier. Si vous avez déjà crer des librairies, vous pouvez les ouvrir.</p><p>N'oubliez pas que vous pouvez utiliser YACReader en tant que stand alone pour lire vos bandes dessinées sur votre ordinateur.</p> + + + Language + Langue - - add an existing one - Ajouter une librairie existante + + + Application language + Langue de l'application - - - OptionsDialog - - Options - Options + + + System default + Par défaut du système - + Tray icon settings (experimental) - + Paramètres de l'icône de la barre d'état (expérimental) - + Close to tray - + Près du plateau - + Start into the system tray - + Commencez dans la barre d'état système - + Edit Comic Vine API key - + Modifier la clé API Comic Vine - + Comic Vine API key - + Clé API Comic Vine - + ComicInfo.xml legacy support - + Prise en charge héritée de ComicInfo.xml - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Importer des métadonnées depuis ComicInfo.xml lors de l'ajout de nouvelles bandes dessinées - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + Considérez les éléments « récents » ajoutés ou mis à jour depuis X jours - + Third party reader - + Lecteur tiers - + Write {comic_file_path} where the path should go in the command - + Écrivez {comic_file_path} où le chemin doit aller dans la commande - + + Clear - + Clair - + Update libraries at startup - + Mettre à jour les bibliothèques au démarrage - + Try to detect changes automatically - + Essayez de détecter automatiquement les changements - + Update libraries periodically - + Mettre à jour les bibliothèques périodiquement - + Interval: - + Intervalle: - + 30 minutes - + 30 min - + 1 hour - + 1 heure - + 2 hours - + 2 heures - + 4 hours - + 4 heures - + 8 hours - + 8 heures - + 12 hours - + 12 heures - + daily - + tous les jours - + Update libraries at certain time - + Mettre à jour les bibliothèques à un certain moment - + Time: - + Temps: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + AVERTISSEMENT! Lors des mises à jour de la bibliothèque, les écritures dans la base de données sont désactivées ! +Ne planifiez pas de mises à jour pendant que vous utilisez activement l'application. +Lors des mises à jour automatiques, l'application bloquera certaines actions jusqu'à ce que la mise à jour soit terminée. +Pour arrêter une mise à jour automatique, appuyez sur l'indicateur de chargement à côté du titre Bibliothèques. - + Modifications detection - + Détection des modifications - + Compare the modified date of files when updating a library (not recommended) - + Comparer la date de modification des fichiers lors de la mise à jour d'une bibliothèque (déconseillé) - + Enable background image - + Activer l'image d'arrière-plan - + Opacity level - + Niveau d'opacité - + Blur level - + Niveau de flou - + Use selected comic cover as background - + Utiliser la couverture de bande dessinée sélectionnée comme arrière-plan - + Restore defautls - + Restaurer les valeurs par défaut - + Background - + Arrière-plan - + Display continue reading banner - + Afficher la bannière de lecture continue - + Display current comic banner - + Afficher la bannière de bande dessinée actuelle - + Continue reading - + Continuer la lecture - + Comic Flow - + Comic Flow - - + + Libraries - + Bibliothèques - + Grid view - + Vue grille - + + General - + Général - - - PropertiesDialog - - - - of: - sur: + + My comics path + Chemin de mes bandes dessinées - - Day: - Jour: + + Display + Afficher - - Plot - Intrigue + + Show time in current page information label + Afficher l'heure dans l'étiquette d'information de la page actuelle - - Size: - Taille: + + "Go to flow" size + Taille de "Aller à Comic Flow" - - Year: - Année: + + Background color + Couleur d'arrière plan - - Inker(s): - Encreur(s): + + Choose + Choisir - - Publishing - Publication + + Scroll behaviour + Comportement de défilement - - Publisher: - Editeur: + + Disable scroll animations and smooth scrolling + Désactiver les animations de défilement et le défilement fluide - - General info - Infos générales + + Do not turn page using scroll + Ne tournez pas la page en utilisant le défilement - - Color/BW: - Couleur/Noir et blanc: + + Use single scroll step to turn page + Utilisez une seule étape de défilement pour tourner la page - - Edit selected comics information - Editer les informations du comic sélectionné + + Mouse mode + Mode souris - - Penciller(s): - Dessinateur(s): + + Only Back/Forward buttons can turn pages + Seuls les boutons Précédent/Avant peuvent tourner les pages - - Colorist(s): - Coloriste(s): + + Use the Left/Right buttons to turn pages. + Utilisez les boutons Gauche/Droite pour tourner les pages. - - Genre: - Genre: + + Click left or right half of the screen to turn pages. + Cliquez sur la moitié gauche ou droite de l'écran pour tourner les pages. + + + + Quick Navigation Mode + Mode navigation rapide + + + + Disable mouse over activation + Désactiver la souris sur l'activation + + + + Brightness + Luminosité + + + + Contrast + Contraste + + + + Gamma + Valeur gamma + + + + Reset + Remise à zéro + + + + Image options + Option de l'image + + + + Fit options + Options d'ajustement + + + + Enlarge images to fit width/height + Agrandir les images pour les adapter à la largeur/hauteur + + + + Double Page options + Options de double page + + + + Show covers as single page + Afficher les couvertures sur une seule page + + + + Scaling + Mise à l'échelle + + + + Scaling method + Méthode de mise à l'échelle + + + + Nearest (fast, low quality) + Le plus proche (rapide, mauvaise qualité) + + + + Bilinear + Bilinéaire + + + + Lanczos (better quality) + Lanczos (meilleure qualité) + + + + Page Flow + Flux des pages + + + + Image adjustment + Ajustement de l'image + + + + + Restart is needed + Redémarrage nécessaire + + + + Comics directory + Répertoire des bandes dessinées + + + + PropertiesDialog + + + + + of: + sur: + + + + Day: + Jour: + + + + Plot + Intrigue + + + + Size: + Taille: + + + + Year: + Année: + + + + Inker(s): + Encreur(s): + + + + Publishing + Publication + + + + Publisher: + Editeur: + + + + General info + Infos générales + + + + Color/BW: + Couleur/Noir et blanc: + + + + Edit selected comics information + Editer les informations du comic sélectionné + + + + Penciller(s): + Dessinateur(s): + + + + Colorist(s): + Coloriste(s): + + + + Genre: + Genre : Notes - + Remarques Load previous page as cover - + Charger la page précédente comme couverture Load next page as cover - + Charger la page suivante comme couverture Reset cover to the default image - + Réinitialiser la couverture à l'image par défaut Load custom cover image - + Charger une image de couverture personnalisée Series: - + Série: @@ -2162,27 +2513,27 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + alt. nombre: Alternate series: - + Série alternative : Series Group: - + Groupe de séries : Editor(s): - + Editeur(s) : Imprint: - + Imprimer: @@ -2192,52 +2543,52 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + Taper: Language (ISO): - + Langue (ISO) : Teams: - + Équipes : Locations: - + Emplacements : Main character or team: - + Personnage principal ou équipe : Review: - + Revoir: Notes: - Notes: + Remarques : Invalid cover - + Couverture invalide The image is invalid. - + L'image n'est pas valide. Synopsis: - Synopsis: + Synopsis : @@ -2252,7 +2603,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + Balises : @@ -2272,7 +2623,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Age rating: - Limite d'âge: + Limite d'âge: @@ -2307,12 +2658,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Volume: - Volume: + Tome : Format: - Format: + Format : @@ -2321,8 +2672,24 @@ To stop an automatic update tap on the loading indicator next to the Libraries t - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Lien Comic Vine : <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> vue </a> + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer est la version sans tête (sans interface graphique) de YACReaderLibrary. + +Cette application prend en charge les paramètres persistants, pour les configurer, modifiez ce fichier %1 +Pour en savoir plus sur les paramètres disponibles, veuillez consulter la documentation sur https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md @@ -2330,99 +2697,83 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 7z lib not found - + lib 7z introuvable unable to load 7z lib from ./utils - + impossible de charger 7z depuis ./utils Trace - + Tracer Debug - + Déboguer Info - + Informations Warning - + Avertissement Error - + Erreur Fatal - + Critique - + Select custom cover - + Sélectionnez une couverture personnalisée - + Images (%1) - - - - - QsLogging::LogWindowModel - - - Time - + Illustrations (%1) - - Level - + + The file could not be read or is not valid JSON. + Le fichier n'a pas pu être lu ou n'est pas un JSON valide. - - Message - - - - - QsLogging::Window - - - &Pause - + + This theme is for %1, not %2. + Ce thème est pour %1, pas pour %2. - - &Resume - + + Libraries + Bibliothèques - - Save log - + + Folders + Dossiers - - Log file (*.log) - + + Reading Lists + Listes de lecture RenameLibraryDialog - + Rename current library Renommer la librairie actuelle @@ -2445,20 +2796,20 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of volumes found : %1 - + Nombre de volumes trouvés : %1 - - + + page %1 of %2 - + page %1 de %2 - + Number of %1 found : %2 - + Nombre de %1 trouvés : %2 @@ -2467,17 +2818,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - + Veuillez fournir des informations supplémentaires pour cette bande dessinée. - + Series: - + Série: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Utilisez la recherche de correspondance exacte. Désactivez-la si vous souhaitez rechercher des volumes correspondant à certains mots du nom. @@ -2485,516 +2836,1355 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information. - + Veuillez fournir quelques informations supplémentaires. - + Series: - + Série: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Utilisez la recherche de correspondance exacte. Désactivez-la si vous souhaitez rechercher des volumes correspondant à certains mots du nom. SelectComic - + Please, select the right comic info. - + Veuillez sélectionner les bonnes informations sur la bande dessinée. - + comics - + bandes dessinées - + loading cover - + couvercle de chargement - + loading description - + description du chargement - + comic description unavailable - + description de la bande dessinée indisponible SelectVolume - + Please, select the right series for your comic. - + Veuillez sélectionner la bonne série pour votre bande dessinée. - + Filter: - + Filtre: - + volumes - + tomes - + Nothing found, clear the filter if any. - + Rien trouvé, effacez le filtre le cas échéant. - + loading cover - + couvercle de chargement - + loading description - + description du chargement - + volume description unavailable - + description du volume indisponible SeriesQuestion - + no non - + yes oui You are trying to get information for various comics at once, are they part of the same series? - + Vous essayez d’obtenir des informations sur plusieurs bandes dessinées à la fois, font-elles partie de la même série ? ServerConfigDialog - + Port - Port + Port r?seau - + enable the server Autoriser le serveur - + set port Configurer le port - + Server connectivity information - + Informations sur la connectivité du serveur - + Scan it! - + Scannez-le ! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader est disponible pour les appareils iOS et Android.<br/>Découvrez-le pour <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> ou <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address - + Choisissez une adresse IP SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. - + + Please, sort the list of comics on the left until it matches the comics' information. + Veuillez trier la liste des bandes dessinées sur la gauche jusqu'à ce qu'elle corresponde aux informations des bandes dessinées. - + sort comics to match comic information - + trier les bandes dessinées pour qu'elles correspondent aux informations sur les bandes dessinées - + issues - + problèmes - + remove selected comics - + supprimer les bandes dessinées sélectionnées - + restore all removed comics - + restaurer toutes les bandes dessinées supprimées - TitleHeader + ThemeEditorDialog - - SEARCH - + + Theme Editor + Éditeur de thème - - - UpdateLibraryDialog - - Update library - Mettre la librairie à jour + + + + + - - Cancel - Annuler + + - + - - - Updating.... - Mise à jour... + + i + je - - - VolumeComicsModel - - title - + + Expand all + Tout développer - - - VolumesModel - - publisher - éditeur + + Collapse all + Tout réduire - - year - + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Maintenez enfoncé pour faire clignoter la valeur sélectionnée dans l'interface utilisateur (magenta / basculé / 0↔10). Les versions restaurent l'original. - - issues - + + Search… + Rechercher… - - - YACReader::TrayIconController - - &Restore - + + Light + Lumière - - Systray - + + Dark + Sombre - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - + + ID: + IDENTIFIANT: - - - YACReader::WhatsNewDialog - - Close - + + Display name: + Nom d'affichage : - - - YACReaderDeletingProgress - - cancel - Annuler + + Variant: + Variante: - - Please wait, deleting in progress... - Attendez, suppression en cours... + + Theme info + Informations sur le thème - - - YACReaderFieldEdit - - Restore to default - Restaurer les paramètres par défaut + + Parameter + Paramètre - - - Click to overwrite - Cliquer pour modifier + + Value + Valeur - - - YACReaderFieldPlainTextEdit - - Restore to default - Restaurer les paramètres par défaut + + Save and apply + Enregistrer et postuler - - - - - Click to overwrite - Cliquer pour modifier + + Export to file... + Exporter vers un fichier... - - - YACReaderFlowConfigWidget - - CoverFlow look - Vue CoverFlow + + Load from file... + Charger à partir du fichier... - - How to show covers: - Comment voir les couvertures: + + Close + Fermer - - Stripe look - Vue alignée + + Double-click to edit color + Double-cliquez pour modifier la couleur - - Overlapped Stripe look - Vue superposée + + + + + + + true + vrai - - - YACReaderGLFlowConfigWidget - - Zoom - Zoom + + + + + false + FAUX - - Light - Lumière + + Double-click to toggle + Double-cliquez pour basculer - - Show advanced settings - Réglages avancés + + Double-click to edit value + Double-cliquez pour modifier la valeur - - Roulette look - Vue roulette + + + + Edit: %1 + Modifier : %1 - - Cover Angle - Angle des couvertures + + Save theme + Enregistrer le thème - - Stripe look - Vue alignée + + + JSON files (*.json);;All files (*) + Fichiers JSON (*.json);;Tous les fichiers (*) - - Position - Position + + Save failed + Échec de l'enregistrement - - Z offset - Axe Z + + Could not open file for writing: +%1 + Impossible d'ouvrir le fichier en écriture : +%1 - - Y offset - Axe Y + + Load theme + Charger le thème - - Central gap - Espace central + + + + Load failed + Échec du chargement - - Presets: - Réglages: + + Could not open file: +%1 + Impossible d'ouvrir le fichier : +%1 - - Overlapped Stripe look - Vue superposée + + Invalid JSON: +%1 + JSON invalide : +%1 - - Modern look - Vue moderne + + Expected a JSON object. + Attendu un objet JSON. + + + TitleHeader - - View angle - Angle de vue + + SEARCH + RECHERCHE + + + UpdateLibraryDialog - - Max angle - Angle maximum + + Update library + Mettre la librairie à jour - - Custom: - Personnalisation: - + + Cancel + Annuler + + + + Updating.... + Mise à jour... + + + + Viewer + + + + Press 'O' to open comic. + Appuyez sur "O" pour ouvrir une bande dessinée. + + + + Not found + Introuvable + - + + Comic not found + Bande dessinée introuvable + + + + Error opening comic + Erreur d'ouverture de la bande dessinée + + + + CRC Error + Erreur CRC + + + + Loading...please wait! + Chargement... Patientez + + + + Page not available! + Page non disponible ! + + + + Cover! + Couverture! + + + + Last page! + Dernière page! + + + + VolumeComicsModel + + + title + titre + + + + VolumesModel + + + publisher + éditeur + + + + year + année + + + + issues + problèmes + + + + YACReader3DFlowConfigWidget + + + Presets: + Réglages: + + + Classic look Vue classique - + + Stripe look + Vue alignée + + + + Overlapped Stripe look + Vue superposée + + + + Modern look + Vue moderne + + + + Roulette look + Vue roulette + + + + Show advanced settings + Réglages avancés + + + + Custom: + Personnalisation: + + + + View angle + Angle de vue + + + + Position + Positionnement + + + Cover gap Espace entre les couvertures - + + Central gap + Espace central + + + + Zoom + Agrandissement + + + + Y offset + Axe Y + + + + Z offset + Axe Z + + + + Cover Angle + Angle des couvertures + + + + Visibility + Visibilité + + + + Light + Lumière + + + + Max angle + Angle maximum + + + + Low Performance + Basse performance + + + High Performance Haute performance - + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Utiliser VSync (améliore la qualité de l'image en plein écran, diminue la performance) + + + + Performance: + Performance : + + + + YACReader::MainWindowViewer + + + &Open + &Ouvrir + + + + Open a comic + Ouvrir une bande dessinée + + + + New instance + Nouvelle instance + + + + Open Folder + Ouvrir un dossier + + + + Open image folder + Ouvrir un dossier d'images + + + + Open latest comic + Ouvrir la dernière bande dessinée + + + + Open the latest comic opened in the previous reading session + Ouvrir la dernière bande dessinée ouverte lors de la session de lecture précédente + + + + Clear + Clair + + + + Clear open recent list + Vider la liste d'ouverture récente + + + + Save + Sauvegarder + + + + + Save current page + Sauvegarder la page actuelle + + + + Previous Comic + Bande dessinée précédente + + + + + + Open previous comic + Ouvrir la bande dessiné précédente + + + + Next Comic + Bande dessinée suivante + + + + + + Open next comic + Ouvrir la bande dessinée suivante + + + + &Previous + &Précédent + + + + + + Go to previous page + Aller à la page précédente + + + + &Next + &Suivant + + + + + + Go to next page + Aller à la page suivante + + + + Fit Height + Ajuster la hauteur + + + + Fit image to height + Ajuster l'image à la hauteur + + + + Fit Width + Ajuster la largeur + + + + Fit image to width + Ajuster l'image à la largeur + + + + Show full size + Plein écran + + + + Fit to page + Ajuster à la page + + + + Continuous scroll + Défilement continu + + + + Switch to continuous scroll mode + Passer en mode défilement continu + + + + Reset zoom + Réinitialiser le zoom + + + + Show zoom slider + Afficher le curseur de zoom + + + + Zoom+ + Agrandir + + + + Zoom- + R?duire + + + + Rotate image to the left + Rotation à gauche + + + + Rotate image to the right + Rotation à droite + + + + Double page mode + Mode double page + + + + Switch to double page mode + Passer en mode double page + + + + Double page manga mode + Mode manga en double page + + + + Reverse reading order in double page mode + Ordre de lecture inversée en mode double page + + + + Go To + Aller à + + + + Go to page ... + Aller à la page ... + + + + Options + Possibilités + + + + YACReader options + Options de YACReader + + + + + Help + Aide + + + + Help, About YACReader + Aide, à propos de YACReader + + + + Magnifying glass + Loupe + + + + Switch Magnifying glass + Utiliser la loupe + + + + Set bookmark + Placer un marque-page + + + + Set a bookmark on the current page + Placer un marque-page sur la page actuelle + + + + Show bookmarks + Voir les marque-pages + + + + Show the bookmarks of the current comic + Voir les marque-pages de cette bande dessinée + + + + Show keyboard shortcuts + Voir les raccourcis + + + + Show Info + Voir les infos + + + + Close + Fermer + + + + Show Dictionary + Dictionnaire + + + + Show go to flow + Afficher "Aller à Comic Flow" + + + + Edit shortcuts + Modifier les raccourcis + + + + &File + &Fichier + + + + + Open recent + Ouvrir récent + + + + File + Fichier + + + + Edit + Editer + + + + View + Vue + + + + Go + Aller + + + + Window + Fenêtre + + + + + + Open Comic + Ouvrir la bande dessinée + + + + + + Comic files + Bande dessinée + + + + Open folder + Ouvirir le dossier + + + + page_%1.jpg + feuille_%1.jpg + + + + Image files (*.jpg) + Image(*.jpg) + + + + + Comics + Bandes dessinées + + + + + General + Général + + + + + Magnifiying glass + Loupe + + + + + Page adjustement + Ajustement de la page + + + + + Reading + Lecture + + + + Toggle fullscreen mode + Basculer en mode plein écran + + + + Hide/show toolbar + Masquer / afficher la barre d'outils + + + + Size up magnifying glass + Augmenter la taille de la loupe + + + + Size down magnifying glass + Réduire la taille de la loupe + + + + Zoom in magnifying glass + Zoomer + + + + Zoom out magnifying glass + Dézoomer + + + + Reset magnifying glass + Réinitialiser la loupe + + + + Toggle between fit to width and fit to height + Basculer entre adapter à la largeur et adapter à la hauteur + + + + Autoscroll down + Défilement automatique vers le bas + + + + Autoscroll up + Défilement automatique vers le haut + + + + Autoscroll forward, horizontal first + Défilement automatique en avant, horizontal + + + + Autoscroll backward, horizontal first + Défilement automatique en arrière horizontal + + + + Autoscroll forward, vertical first + Défilement automatique en avant, vertical + + + + Autoscroll backward, vertical first + Défilement automatique en arrière, verticak + + + + Move down + Descendre + + + + Move up + Monter + + + + Move left + Déplacer à gauche + + + + Move right + Déplacer à droite + + + + Go to the first page + Aller à la première page + + + + Go to the last page + Aller à la dernière page + + + + Offset double page to the left + Double page décalée vers la gauche + + + + Offset double page to the right + Double page décalée à droite + + + + There is a new version available + Une nouvelle version est disponible + + + + Do you want to download the new version? + Voulez-vous télécharger la nouvelle version? + + + + Remind me in 14 days + Rappelez-moi dans 14 jours + + + + Not now + Pas maintenant + + + + YACReader::TrayIconController + + + &Restore + &Restaurer + + + + Systray + Zone de notification + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuera à fonctionner dans la barre d'état système. Pour terminer le programme, choisissez <b>Quitter</b> dans le menu contextuel de l'icône de la barre d'état système. + + + + YACReaderFieldEdit + + + Restore to default + Restaurer les paramètres par défaut + + + + + Click to overwrite + Cliquer pour modifier + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Restaurer les paramètres par défaut + + + + + + + Click to overwrite + Cliquer pour modifier + + + + YACReaderFlowConfigWidget + + CoverFlow look + Vue CoverFlow + + + How to show covers: + Comment voir les couvertures: + + + Stripe look + Vue alignée + + + Overlapped Stripe look + Vue superposée + + + + YACReaderGLFlowConfigWidget + + Zoom + Agrandissement + + + Light + Lumière + + + Show advanced settings + Réglages avancés + + + Roulette look + Vue roulette + + + Cover Angle + Angle des couvertures + + + Stripe look + Vue alignée + + + Position + Positionnement + + + Z offset + Axe Z + + + Y offset + Axe Y + + + Central gap + Espace central + + + Presets: + Réglages: + + + Overlapped Stripe look + Vue superposée + + + Modern look + Vue moderne + + + View angle + Angle de vue + + + Max angle + Angle maximum + + + Custom: + Personnalisation: + + + Classic look + Vue classique + + + Cover gap + Espace entre les couvertures + + + High Performance + Haute performance + + Performance: - Performance: + Performance : - Use VSync (improve the image quality in fullscreen mode, worse performance) - Utiliser VSync (améliore la qualité de l'image en plein écran, diminue la performance) + Utiliser VSync (améliore la qualité de l'image en plein écran, diminue la performance) - Visibility - Visibilité + Visibilité - Low Performance - Basse performance + Basse performance YACReaderNavigationController - You are not reading anything yet, come on!! - Vous ne lisez rien encore, allez !! + Vous ne lisez rien encore, allez !! - - There are no recent comics! - - - - No favorites - Pas de favoris + Pas de favoris YACReaderOptionsDialog - + Save Sauvegarder - Use hardware acceleration (restart needed) - Utiliser l'accélération hardware (redémarrage nécessaire) + Utiliser l'accélération hardware (redémarrage nécessaire) - + Cancel Annuler - + Edit shortcuts - + Modifier les raccourcis - + Shortcuts - + Raccourcis YACReaderSearchLineEdit - + type to search - + tapez pour rechercher YACReaderSideBar - Reading Lists - Listes de lecture + Listes de lecture - LIBRARIES - LIBRAIRIES + LIBRAIRIES - FOLDERS - DOSSIERS + DOSSIERS - READING LISTS - Listes de lecture + Listes de lecture + + + YACReaderSlider - - Libraries - + + Reset + Remise à zéro + + + YACReaderTranslator - - Folders - + + YACReader translator + Traducteur YACReader + + + + + Translation + Traduction + + + + clear + effacer + + + + Service not available + Service non disponible diff --git a/YACReaderLibrary/yacreaderlibrary_it.ts b/YACReaderLibrary/yacreaderlibrary_it.ts index ed29a7c7c..57845f0cb 100644 --- a/YACReaderLibrary/yacreaderlibrary_it.ts +++ b/YACReaderLibrary/yacreaderlibrary_it.ts @@ -12,82 +12,70 @@ AddLabelDialog - red - Rosso + Rosso - blue - Blu + Blu - dark - Scuro + Scuro - cyan - Azzurro + Azzurro - pink - Rosa + Rosa - green - Verde + Verde - light - Luminoso + Luminoso - white - Bianco + Bianco - + Choose a color: Seleziona un colore: - + accept Accetta - + cancel Cancella - orange - Arancione + Arancione - purple - Porpora + Porpora - violet - Viola + Viola - yellow - Giallo + Giallo - + Label name: Nome etichetta: @@ -100,7 +88,7 @@ Aggiungi - + Add an existing library Aggiungi ad una libreria esistente @@ -121,7 +109,7 @@ Library name : - + Nome della biblioteca: @@ -138,104 +126,244 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - Prima di conneterti a "Comic Vine" devi avere la tua chiave API. Per favore recuperane una da <a href="http://www.comicvine.com/api/">QUI</a + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Prima di conneterti a "Comic Vine" devi avere la tua chiave API. Per favore recuperane una da <a href="http://www.comicvine.com/api/">QUI</a Paste here your Comic Vine API key - Incolla qui la tua chiave API di "Comic Vine" + Incolla qui la tua chiave API di "Comic Vine" + + + + AppearanceTabWidget + + + Color scheme + Combinazione di colori + + + + System + Sistema + + + + Light + Luminoso + + + + Dark + Buio + + + + Custom + Costume + + + + Remove + Rimuovere + + + + Remove this user-imported theme + Rimuovi questo tema importato dall'utente + + + + Light: + Leggero: + + + + Dark: + Buio: + + + + Custom: + Personalizza: + + + + Import theme... + Importa tema... + + + + Theme + Tema + + + + Theme editor + Redattore del tema + + + + Open Theme Editor... + Apri l'editor del tema... + + + + Theme editor error + Errore nell'editor del tema + + + + The current theme JSON could not be loaded. + Impossibile caricare il tema corrente JSON. + + + + Import theme + Importa tema + + + + JSON files (*.json);;All files (*) + File JSON (*.json);;Tutti i file (*) + + + + Could not import theme from: +%1 + Impossibile importare il tema da: +%1 + + + + Could not import theme from: +%1 + +%2 + Impossibile importare il tema da: +%1 + +%2 + + + + Import failed + Importazione non riuscita + + + + BookmarksDialog + + + Lastest Page + Ultima Pagina + + + + Close + Chiudi + + + + Click on any image to go to the bookmark + Clicca su qualsiasi immagine per andare al segnalibro + + + + + Loading... + Caricamento... ClassicComicsView - + Hide comic flow - Nascondi il flusso dei fumetti + Nascondi Comic Flow ComicInfoView - + + Characters + Personaggi + + + Main character or team - + Personaggio principale o squadra - + Teams - + Squadre - + Locations - + Posizioni - + Authors - Autori + Autori - + writer - + sceneggiatore - + penciller - + disegnatore - + inker - + inchiostratore - + colorist - + colorista - + letterer - + letterista - + cover artist - + disegnatore di copertina - + editor - + editor - + imprint - + marchio editoriale - + Publisher - + Editore - + color - + colore - + b/w - - - - - Characters - + b/n @@ -258,17 +386,17 @@ Series - + Serie Volume - + Tomo Story Arc - + Arco narrativo @@ -298,7 +426,7 @@ Publication Date - + Data di pubblicazione @@ -309,74 +437,82 @@ ComicVineDialog - + back Indietro - + next Prossimo - + skip Salta - + close Chiudi - - + + Retrieving tags for : %1 Ricezione tag per: %1 - + Looking for comic... Sto cercando il fumetto... - + search Cerca - - - + + + Looking for volume... Sto cercando il fumetto... - - + + comic %1 of %2 - %3 Fumetto %1 di %2 - %3 - + %1 comics selected Fumetto %1 selezionato - + Error connecting to ComicVine Errore durante la connessione a ComicVine - + Retrieving volume info... - Sto ricevendo le informazioni per l'abum... + Sto ricevendo le informazioni per l'abum... + + + + ContinuousPageWidget + + + Loading page %1 + Caricamento pagina %1 CreateLibraryDialog - + Create new library Crea una nuova libreria @@ -396,7 +532,7 @@ Creare una Libreria può aver bisogno di alcuni minuti. Puoi fermare il processo ed aggiornare la libreria più tardi. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder Il percorso selezionato non esiste oppure non è valido. Controlla di avere i permessi di scrittura per questa cartella @@ -411,7 +547,7 @@ Nome libreria: - + Path not found Percorso non trovato @@ -419,7 +555,7 @@ EditShortcutsDialog - + Shortcut in use Scorciatoia in uso @@ -434,9 +570,9 @@ Impostazioni scorciatoie - - The shortcut "%1" is already assigned to other function - La scorciatoia "%1" è già assegnata ad un' altra funzione + + The shortcut "%1" is already assigned to other function + La scorciatoia "%1" è già assegnata ad un' altra funzione @@ -447,27 +583,28 @@ EmptyFolderWidget - Empty folder - Cartella vuota + Cartella vuota - - Subfolders in this folder - Sottocartelle in questa cartella + Sottocartelle in questa cartella - Drag and drop folders and comics here - Prendi e sposta le cartelle qui + Prendi e sposta le cartelle qui + + + + This folder doesn't contain comics yet + Questa cartella non contiene ancora fumetti EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet Per ora questa etichetta non contiene fumetti @@ -479,6 +616,24 @@ Per ora questa lista non contiene fumetti + + EmptySpecialListWidget + + + No favorites + Nessun Favorito + + + + You are not reading anything yet, come on!! + Non stai ancora leggendo nulla, Forza!! + + + + There are no recent comics! + Non ci sono fumetti recenti! + + ExportComicsInfoDialog @@ -487,7 +642,7 @@ File di Output: - + Destination database name Nome database di destinazione @@ -502,17 +657,17 @@ Crea - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Il percorso selezionato per il file di Output non esiste oppure non è valido. Controlla di avere i permessi di scrittura per questa cartella - + Export comics info Esporta informazioni fumetto - + Problem found while writing Trovato problema durante la scrittura @@ -530,7 +685,7 @@ Crea - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Il percorso selezionato per il file di Output non esiste oppure non è valido. Controlla di avere i permessi di scrittura per questa cartella @@ -540,17 +695,17 @@ Cartella di Output: - + Problem found while writing Trovato problema durante la scrittura - + Create covers package Crea pacchetto delle copertine - + Destination directory Cartella di destinazione @@ -570,7 +725,7 @@ Unknown error opening the file - Errore sconosciuto all'apertura del file + Errore sconosciuto all'apertura del file @@ -581,23 +736,52 @@ FolderContentView - + Continue Reading... - + Continua a leggere... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Pagina: + + + + Go To + Vai a + + + + Cancel + Cancella + + + + + Total pages : + Pagine totali: + + + + Go to... + Vai a... + + + + GoToFlowToolBar + + + Page : + Pagina: GridComicsView - + Show info Mostra informazioni @@ -605,17 +789,17 @@ HelpAboutDialog - + Help Aiuto - + System info - + Informazioni di sistema - + About Informazioni @@ -643,7 +827,7 @@ Importa informazioni fumetto - + Comics info file (*.ydb) File informazioni fumetto (*.ydb) @@ -666,7 +850,7 @@ Decomprimi - + Compresed library covers (*.clc) Libreria di copertine compresse (*.clc) @@ -681,7 +865,7 @@ Nome libreria: - + Extract a catalog Estrai un catalogo @@ -689,54 +873,54 @@ ImportWidget - + stop Ferma - + Importing comics Sto importando i fumetti - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> - <p>YacReader sta creando una nuova libreria.</p><p>La creazione di una libreria può durare diversi minuti. Puoi fermare l'attività ed aggiornare la libreria più tardi, completando l'attività</p> + <p>YacReader sta creando una nuova libreria.</p><p>La creazione di una libreria può durare diversi minuti. Puoi fermare l'attività ed aggiornare la libreria più tardi, completando l'attività</p> - + Some of the comics being added... Alcuni fumetti che sto aggiungendo... - + Updating the library Sto aggiornando la Libreria - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>Quest alibreria si sta aggiornando. Per aggiornamenti più veloci aggiorna la tua libreria di frequente.</p><p>Puoi fermare il processo ed aggiornare la libreria più tardi.</p> - + Upgrading the library - + Aggiornamento della biblioteca - + <p>The current library is being upgraded, please wait.</p> - + <p>È in corso l'aggiornamento della libreria corrente, attendi.</p> - + Scanning the library - + Scansione della libreria - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>Scansione della libreria corrente per informazioni sui metadati XML legacy.</p><p>Questa operazione è necessaria solo una volta e solo se la libreria è stata creata con YACReaderLibrary 9.8.2 o versioni precedenti.</p> @@ -746,27 +930,27 @@ Edita - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. La cartella selezionata non contiene nessuna Libreria. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Questa libreria è stata creata con una versione precedente di YACREaderLibrary. Deve essere aggiornata. Aggiorno ora? - + Comic Fumetto - + Folder name: Nome della cartella: - + The selected folder and all its contents will be deleted from your disk. Are you sure? La cartella seleziona e tutto il suo contenuto verranno cancellati dal tuo disco. Sei sicuro? @@ -775,17 +959,17 @@ Aggiorna la cartella corrente - + Error opening the library - Errore nell'apertura della libreria + Errore nell'apertura della libreria Show/Hide marks Mostra/Nascondi - - + + YACReader not found YACReader non trovato @@ -794,9 +978,9 @@ Mostra le opzioni per il server dei fumetti - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - C'è stato un problema cancellando le cartelle selezionate. Per favore controlla i tuoi permessi di scrittura e sii sicuro che non ci siano altre applicazioni che usano le stesse cartelle. + C'è stato un problema cancellando le cartelle selezionate. Per favore controlla i tuoi permessi di scrittura e sii sicuro che non ci siano altre applicazioni che usano le stesse cartelle. Remove current library from your collection @@ -807,7 +991,7 @@ Setta il fumetto come letto - + Rename list name Rinomina la lista @@ -816,7 +1000,7 @@ Aggiungi i fumetti selezionati alla lista dei favoriti - + Remove and delete metadata Rimuovi e cancella i Metadati @@ -825,7 +1009,7 @@ YACReader non trovato, YACReader deve esere installato nella stessa cartella di YACReaderLibrary. - + Old library Vecchia libreria @@ -838,17 +1022,17 @@ Rinomina qualsiasi etichetta o lista selezionata - + Set as completed Segna come completo - - There was an error accessing the folder's path - C'è stato un errore nell'accesso al percorso della cartella + + There was an error accessing the folder's path + C'è stato un errore nell'accesso al percorso della cartella - + Library Libreria @@ -857,9 +1041,9 @@ Aggiungi una nuova cartella alla libreria corrente - + Comics will only be deleted from the current label/list. Are you sure? - I fumetti verranno cancellati dall'etichetta/lista corrente. Sei sicuro? + I fumetti verranno cancellati dall'etichetta/lista corrente. Sei sicuro? Rename current library @@ -870,13 +1054,13 @@ Modalità a schermo interno on/off - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Questa libreria è stata creata con una verisone più recente di YACReaderLibrary. Scarico la versione aggiornata ora? - - + + Moving comics... Sto muovendo i fumetti... @@ -889,37 +1073,37 @@ Aggiorna la Libreria corrente - - + + Copying comics... Sto copiando i fumetti... - - Library '%1' is no longer available. Do you want to remove it? - La libreria '%1' non è più disponibile, la vuoi cancellare? + + Library '%1' is no longer available. Do you want to remove it? + La libreria '%1' non è più disponibile, la vuoi cancellare? Update library Aggiorna Libreria - + Open folder... Apri Cartella... - + Do you want remove Vuoi rimuovere - + Set as uncompleted Segna come non completo - + Error in path Errore nel percorso @@ -928,17 +1112,17 @@ Resetta la valutazione dei fumetti - + Error updating the library Errore aggiornando la libreria - + Folder Cartella - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? Gli elementi selezionati verranno cancellati, i tuoi fumetti o cartella NON verranno cancellati dal tuo disco. Sei sicuro? @@ -951,8 +1135,8 @@ Cancella la cartella corrente dal disco - - + + List name: Nome lista: @@ -961,16 +1145,16 @@ Aggiungi a... - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - La libreria '%1' è stata creata con una versione precedente di YACREaderLibrary. Deve essere ricreata. Lo vuoi fare ora? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La libreria '%1' è stata creata con una versione precedente di YACREaderLibrary. Deve essere ricreata. Lo vuoi fare ora? Pack covers Compatta Copertine - + Save covers Salva Copertine @@ -983,12 +1167,12 @@ Rimuovi la lista di lettura dalla libreria - + Add new reading lists Aggiungi una lista di lettura - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -1001,17 +1185,17 @@ Hai probabilemnte bisogno di una sola Libreria al livello superiore, puoi poi na YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il numero di librerie basso. - + Set as read Setta come letto - + Library info - + Informazioni sulla biblioteca - + Assign comics numbers Assegna un numero ai fumetti @@ -1028,7 +1212,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Mostra le opzioni - + Please, select a folder first Per cortesia prima seleziona una cartella @@ -1037,7 +1221,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Crea una nuova libreria - + Library not available Libreria non disponibile @@ -1046,13 +1230,13 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Importa informazioni fumetto - The current library can't be udpated. Check for write write permissions on: + The current library can't be udpated. Check for write write permissions on: La libreria corrente non può essere aggiornata. Controlla i tuoi permessi di scrittura su: - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - C'è un problema nel cancellare i fumetti selezionati. Per favore controlla i tuoi permessi di scrittura sui file o sulla cartella. + C'è un problema nel cancellare i fumetti selezionati. Per favore controlla i tuoi permessi di scrittura sui file o sulla cartella. Add new reading list @@ -1067,7 +1251,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Apri il fumetto corrente - + YACReader Library Libreria YACReader @@ -1076,7 +1260,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Aggiungi una lista di lettura alla libreria corrente - + Error creating the library Errore creando la libreria @@ -1085,12 +1269,12 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Aggiornamento fallito - + You are adding too many libraries. Stai aggiungendto troppe librerie. - + Update folder Aggiorna Cartella @@ -1099,7 +1283,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Scompatta le Copertine - + Update needed Devi aggiornarmi @@ -1112,61 +1296,61 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Mostra o nascondi lo stato di lettura - + Library name already exists Esiste già una libreria con lo stesso nome - - There is another library with the name '%1'. - Esiste già una libreria con il nome '%1'. + + There is another library with the name '%1'. + Esiste già una libreria con il nome '%1'. Remove reading list Rimuovi la lista di lettura - + Delete folder Cancella Cartella - + Assign numbers starting in: Assegna numeri partendo da: - + Download new version Scarica la nuova versione - + Invalid image - + Immagine non valida - + The selected file is not a valid image. - + Il file selezionato non è un'immagine valida. - + Error saving cover - + Errore durante il salvataggio della copertina - + There was an error saving the cover image. - + Si è verificato un errore durante il salvataggio dell'immagine di copertina. - + Delete comics Cancella i fumetti - + Add new folder Aggiungi una nuova cartella @@ -1176,7 +1360,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Assign current order to comics - Assegna l'ordinamento corrente ai fumetti + Assegna l'ordinamento corrente ai fumetti Pack the covers of the selected library @@ -1199,7 +1383,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Rinomina la lista selezionata - + Delete list/label Cancella Lista/Etichetta @@ -1216,7 +1400,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Seleziona il nodo principale - + No folder selected Nessuna cartella selezionata @@ -1225,7 +1409,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Scompatta un catalogo - + All the selected comics will be deleted from your disk. Are you sure? Tutti i fumetti selezionati saranno cancellati dal tuo disco. Sei sicuro? @@ -1234,7 +1418,7 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Scarica i Tag da Comic Vine - + Remove comics Rimuovi i fumetti @@ -1243,13 +1427,13 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Aggiungi una nuova etichetta a questa libreria - - + + Set as unread Setta come non letto - + Library not found Libreria non trovata @@ -1262,32 +1446,32 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Rimuovi la libreria - - - + + + manga - + Manga - - - + + + comic - + comico - - - + + + web comic - + fumetto web - - - + + + western manga (left to right) - + manga occidentale (da sinistra a destra) Open containing folder... @@ -1298,48 +1482,48 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Aggiungi una nuova etichetta - - + + Unable to delete Non posso cancellare - - - + + + 4koma (top to botom) - + 4koma (dall'alto verso il basso) - - - - + + + + Set type - + Imposta il tipo - + Set custom cover - + Imposta la copertina personalizzata - + Delete custom cover - + Elimina la copertina personalizzata - + Error - + Errore - + Error opening comic with third party reader. - + Errore nell'apertura del fumetto con un lettore di terze parti. - + library? Libreria? @@ -1348,472 +1532,472 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Salva le copertine dei fumetti selezionati come file JPG - + Are you sure? Sei sicuro? - + Rescan library for XML info - + Eseguire nuovamente la scansione della libreria per informazioni XML - + Upgrade failed - + Aggiornamento non riuscito - + There were errors during library upgrade in: - + Si sono verificati errori durante l'aggiornamento della libreria in: - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader non trovato. YACReader deve essere installato nella stessa cartella di YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. - + YACReader non trovato. Potrebbe esserci un problema con l'installazione di YACReader. LibraryWindowActions - + Create a new library - Crea una nuova libreria + Crea una nuova libreria - + Open an existing library - Apri una libreria esistente + Apri una libreria esistente - - + + Export comics info - Esporta informazioni fumetto + Esporta informazioni fumetto - - + + Import comics info - Importa informazioni fumetto + Importa informazioni fumetto - + Pack covers - Compatta Copertine + Compatta Copertine - + Pack the covers of the selected library - Compatta le copertine della libreria selezionata + Compatta le copertine della libreria selezionata - + Unpack covers - Scompatta le Copertine + Scompatta le Copertine - + Unpack a catalog - Scompatta un catalogo + Scompatta un catalogo - + Update library - Aggiorna Libreria + Aggiorna Libreria - + Update current library - Aggiorna la Libreria corrente + Aggiorna la Libreria corrente - + Rename library - Rinomina la libreria + Rinomina la libreria - + Rename current library - Rinomina la libreria corrente + Rinomina la libreria corrente - + Remove library - Rimuovi la libreria + Rimuovi la libreria - + Remove current library from your collection - Rimuovi la libreria corrente dalla tua collezione + Rimuovi la libreria corrente dalla tua collezione - + Rescan library for XML info - + Eseguire nuovamente la scansione della libreria per informazioni XML - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Cerca di trovare informazioni XML incorporate nei file dei fumetti. Devi farlo solo se la libreria è stata creata con la versione 9.8.2 o precedente o se utilizzi software di terze parti per incorporare informazioni XML nei file. - + Show library info - + Mostra informazioni sulla biblioteca - + Show information about the current library - + Mostra informazioni sulla libreria corrente - + Open current comic - Apri il fumetto corrente + Apri il fumetto corrente - + Open current comic on YACReader - Apri il fumetto corrente con YACReader + Apri il fumetto corrente con YACReader - + Save selected covers to... - Salva le copertine selezionate in... + Salva le copertine selezionate in... - + Save covers of the selected comics as JPG files - Salva le copertine dei fumetti selezionati come file JPG + Salva le copertine dei fumetti selezionati come file JPG - - + + Set as read - Setta come letto + Setta come letto - + Set comic as read - Setta il fumetto come letto + Setta il fumetto come letto - - + + Set as unread - Setta come non letto + Setta come non letto - + Set comic as unread - Setta il fumetto come non letto + Setta il fumetto come non letto - - + + manga - + Manga - + Set issue as manga - + Imposta il problema come manga - - + + comic - + comico - + Set issue as normal - + Imposta il problema come normale - + western manga - + manga occidentali - + Set issue as western manga - + Imposta il problema come manga occidentale - - + + web comic - + fumetto web - + Set issue as web comic - + Imposta il problema come fumetto web - - + + yonkoma - + Yonkoma - + Set issue as yonkoma - + Imposta il problema come Yonkoma - + Show/Hide marks - Mostra/Nascondi + Mostra/Nascondi - + Show or hide read marks - Mostra o nascondi lo stato di lettura + Mostra o nascondi lo stato di lettura - + Show/Hide recent indicator - + Mostra/Nascondi l'indicatore recente - + Show or hide recent indicator - + Mostra o nascondi l'indicatore recente - - + + Fullscreen mode on/off - Modalità a schermo interno on/off + Modalità a schermo interno on/off - + Help, About YACReader - Aiuto, Crediti YACReader + Aiuto, Crediti YACReader - + Add new folder - Aggiungi una nuova cartella + Aggiungi una nuova cartella - + Add new folder to the current library - Aggiungi una nuova cartella alla libreria corrente + Aggiungi una nuova cartella alla libreria corrente - + Delete folder - Cancella Cartella + Cancella Cartella - + Delete current folder from disk - Cancella la cartella corrente dal disco + Cancella la cartella corrente dal disco - + Select root node - Seleziona il nodo principale + Seleziona il nodo principale - + Expand all nodes - Espandi tutti i nodi + Espandi tutti i nodi - + Collapse all nodes - Compatta tutti i nodi + Compatta tutti i nodi - + Show options dialog - Mostra le opzioni + Mostra le opzioni - + Show comics server options dialog - Mostra le opzioni per il server dei fumetti + Mostra le opzioni per il server dei fumetti - - + + Change between comics views - Cambia tra i modi di visualizzazione dei fumetti + Cambia tra i modi di visualizzazione dei fumetti - + Open folder... - Apri Cartella... + Apri Cartella... - + Set as uncompleted - Segna come non completo + Segna come non completo - + Set as completed - Segna come completo + Segna come completo - + Set custom cover - + Imposta la copertina personalizzata - + Delete custom cover - + Elimina la copertina personalizzata - + western manga (left to right) - + manga occidentale (da sinistra a destra) - + Open containing folder... - Apri la cartella dei contenuti... + Apri la cartella dei contenuti... - + Reset comic rating - Resetta la valutazione dei fumetti + Resetta la valutazione dei fumetti - + Select all comics - Seleziona tutti i fumetti + Seleziona tutti i fumetti - + Edit - Edita + Edita - + Assign current order to comics - Assegna l'ordinamento corrente ai fumetti + Assegna l'ordinamento corrente ai fumetti - + Update cover - Aggiorna copertina + Aggiorna copertina - + Delete selected comics - Cancella i fumetti selezionati + Cancella i fumetti selezionati - + Delete metadata from selected comics - + Elimina i metadati dai fumetti selezionati - + Download tags from Comic Vine - Scarica i Tag da Comic Vine + Scarica i Tag da Comic Vine - + Focus search line - + Mettere a fuoco la linea di ricerca - + Focus comics view - + Focus sulla visualizzazione dei fumetti - + Edit shortcuts - + Edita scorciatoie - + &Quit - + &Esci - + Update folder - Aggiorna Cartella + Aggiorna Cartella - + Update current folder - Aggiorna la cartella corrente + Aggiorna la cartella corrente - + Scan legacy XML metadata - + Scansione dei metadati XML legacy - + Add new reading list - Aggiorna la lista di lettura + Aggiorna la lista di lettura - + Add a new reading list to the current library - Aggiungi una lista di lettura alla libreria corrente + Aggiungi una lista di lettura alla libreria corrente - + Remove reading list - Rimuovi la lista di lettura + Rimuovi la lista di lettura - + Remove current reading list from the library - Rimuovi la lista di lettura dalla libreria + Rimuovi la lista di lettura dalla libreria - + Add new label - Aggiungi una nuova etichetta + Aggiungi una nuova etichetta - + Add a new label to this library - Aggiungi una nuova etichetta a questa libreria + Aggiungi una nuova etichetta a questa libreria - + Rename selected list - Rinomina la lista selezionata + Rinomina la lista selezionata - + Rename any selected labels or lists - Rinomina qualsiasi etichetta o lista selezionata + Rinomina qualsiasi etichetta o lista selezionata - + Add to... - Aggiungi a... + Aggiungi a... - + Favorites - Favoriti + Favoriti - + Add selected comics to favorites list - Aggiungi i fumetti selezionati alla lista dei favoriti + Aggiungi i fumetti selezionati alla lista dei favoriti @@ -1824,328 +2008,499 @@ YACReader non ti fermerà dal creare altre librerie ma è meglio se terrai il nu Nome file - - LogWindow - - - Log window - - - - - &Pause - - - - - &Save - - - - - C&lear - - - - - &Copy - - - - - Level: - - - - - &Auto scroll - - - NoLibrariesWidget - + create your first library Crea la tua prima libreria - - You don't have any libraries yet + + You don't have any libraries yet Per ora non hai ancora nessuna libreria - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>Puoi creare una libreria in qualsiasi cartella, YACReader importerà tutti i fumetti e struttura da questa certella. Se hai creato una qualsiasia libreria nel passato la puoi aprire. </p><p>Non dimenticare che puoi usare YACReader come applicazione stand alone per leggere i fumetti sul tuo PC.</p> - + add an existing one Aggiungine una esistente + + NoSearchResultsWidget + + + No results + Nessun risultato + + OptionsDialog - + Restore defautls Resetta al Default - + Background Sfondo - + Blur level Livello di sfumatura - + Enable background image - Abilita l'immagine di sfondo + Abilita l'immagine di sfondo - + + Options Opzioni - + Comic Vine API key API di ComicVine - + Edit Comic Vine API key - Edita l'API di ComicVine + Edita l'API di ComicVine - + Opacity level Livello di opacità - + + General Generale - + Use selected comic cover as background Usa la cover del fumetto selezionato come sfondo - + Comic Flow - Flusso dei fumetti + Comic Flow - - + + Libraries - Librerie + Librerie - + Grid view Vista a Griglia - + + + Appearance + Aspetto + + + + + Language + Lingua + + + + + Application language + Lingua dell'applicazione + + + + + System default + Predefinita del sistema + + + Tray icon settings (experimental) - + Impostazioni dell'icona nella barra delle applicazioni (sperimentale) - + Close to tray - + Vicino al vassoio - + Start into the system tray - + Inizia nella barra delle applicazioni - + ComicInfo.xml legacy support - + Supporto legacy ComicInfo.xml - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Importa metadati da ComicInfo.xml quando aggiungi nuovi fumetti - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + Considera gli elementi "recenti" aggiunti o aggiornati da X giorni fa - + Third party reader - + Lettore di terze parti - + Write {comic_file_path} where the path should go in the command - + Scrivi {comic_file_path} dove dovrebbe andare il percorso nel comando - + + Clear - + Cancella - + Update libraries at startup - + Aggiorna le librerie all'avvio - + Try to detect changes automatically - + Prova a rilevare automaticamente le modifiche - + Update libraries periodically - + Aggiorna periodicamente le librerie - + Interval: - + Intervallo: - + 30 minutes - + 30 minuti - + 1 hour - + 1 ora - + 2 hours - + 2 ore - + 4 hours - + 4 ore - + 8 hours - + 8 ore - + 12 hours - + 12 ore - + daily - + quotidiano - + Update libraries at certain time - + Aggiorna le librerie in determinati orari - + Time: - + Tempo: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + AVVERTIMENTO! Durante gli aggiornamenti della libreria le scritture sul database sono disabilitate! +Non pianificare gli aggiornamenti mentre potresti utilizzare l'app attivamente. +Durante gli aggiornamenti automatici l'app bloccherà alcune azioni fino al termine dell'aggiornamento. +Per interrompere un aggiornamento automatico, tocca l'indicatore di caricamento accanto al titolo Librerie. - + Modifications detection - + Rilevamento delle modifiche - + Compare the modified date of files when updating a library (not recommended) - + Confronta la data di modifica dei file durante l'aggiornamento di una libreria (non consigliato) - + Display continue reading banner - + Visualizza il banner continua a leggere - + Display current comic banner - + Visualizza il banner del fumetto corrente - + Continue reading - + Continua a leggere - - - PropertiesDialog - - Day: - Giorno: + + My comics path + Percorso dei miei fumetti - - Plot - Trama + + Display + Visualizzazione - - Size: - Dimesioni: + + Show time in current page information label + Mostra l'ora nell'etichetta delle informazioni della pagina corrente - - Year: - Anno: + + "Go to flow" size + Dimensione di "Vai a Comic Flow" - - Inker(s): - Inchiostratore(i): + + Background color + Colore di sfondo - - Publishing - Pubblicazione + + Choose + Scegli - - Publisher: - Editore: + + Scroll behaviour + Comportamento di scorrimento - - General info - Informazioni generali + + Disable scroll animations and smooth scrolling + Disabilita le animazioni di scorrimento e lo scorrimento fluido - - Color/BW: + + Do not turn page using scroll + Non voltare pagina utilizzando lo scorrimento + + + + Use single scroll step to turn page + Utilizzare un singolo passaggio di scorrimento per voltare pagina + + + + Mouse mode + Modalità mouse + + + + Only Back/Forward buttons can turn pages + Solo i pulsanti Indietro/Avanti possono girare le pagine + + + + Use the Left/Right buttons to turn pages. + Utilizzare i pulsanti Sinistra/Destra per girare le pagine. + + + + Click left or right half of the screen to turn pages. + Fare clic sulla metà sinistra o destra dello schermo per girare le pagine. + + + + Quick Navigation Mode + Modo navigazione rapida + + + + Disable mouse over activation + Disabilita il mouse all'attivazione + + + + Brightness + Luminosità + + + + Contrast + Contrasto + + + + Gamma + Valore gamma + + + + Reset + Resetta + + + + Image options + Opzione immagine + + + + Fit options + Opzioni di adattamento + + + + Enlarge images to fit width/height + Ingrandisci le immagini per adattarle alla larghezza/altezza + + + + Double Page options + Opzioni doppia pagina + + + + Show covers as single page + Mostra le copertine come pagina singola + + + + Scaling + Ridimensionamento + + + + Scaling method + Metodo di scala + + + + Nearest (fast, low quality) + Più vicino (veloce, bassa qualità) + + + + Bilinear + Bilineare + + + + Lanczos (better quality) + Lanczos (qualità migliore) + + + + Page Flow + Flusso pagine + + + + Image adjustment + Correzioni immagine + + + + + Restart is needed + Riavvio Necessario + + + + Comics directory + Cartella Fumetti + + + + PropertiesDialog + + + Day: + Giorno: + + + + Plot + Trama + + + + Size: + Dimesioni: + + + + Year: + Anno: + + + + Inker(s): + Inchiostratore(i): + + + + Publishing + Pubblicazione + + + + Publisher: + Editore: + + + + General info + Informazioni generali + + + + Color/BW: Colore o B/N: @@ -2171,32 +2526,32 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Notes - + Note Load previous page as cover - + Carica la pagina precedente come copertina Load next page as cover - + Carica la pagina successiva come copertina Reset cover to the default image - + Ripristina la copertina sull'immagine predefinita Load custom cover image - + Carica l'immagine di copertina personalizzata Series: - Serie: + Serie: @@ -2206,27 +2561,27 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + alt. numero: Alternate series: - + Serie alternative: Series Group: - + Gruppo di serie: Editor(s): - + Redattore(i): Imprint: - + Impronta: @@ -2236,32 +2591,32 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + Tipo: Language (ISO): - + Lingua (ISO): Teams: - + Squadre: Locations: - + Posizioni: Main character or team: - + Personaggio principale o squadra: Review: - + Revisione: @@ -2271,12 +2626,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Invalid cover - + Copertina non valida The image is invalid. - + L'immagine non è valida. @@ -2321,7 +2676,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + tag: @@ -2345,8 +2700,8 @@ To stop an automatic update tap on the loading indicator next to the Libraries t - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Vai </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Vai </a> @@ -2368,12 +2723,28 @@ To stop an automatic update tap on the loading indicator next to the Libraries t of: - + Di: Arc number: - + Numero dell'arco: + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer è la versione headless (senza GUI) di YACReaderLibrary. + +Questa applicazione supporta le impostazioni persistenti, per configurarle modifica questo file %1 +Per conoscere le impostazioni disponibili, consultare la documentazione su https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md @@ -2391,89 +2762,73 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Trace - + Traccia Debug - + Diagnostica Info - + Informazioni Warning - + Avvertimento Error - + Errore Fatal - + Fatale - + Select custom cover - + Seleziona la copertina personalizzata - + Images (%1) - - - - - QsLogging::LogWindowModel - - - Time - - - - - Level - + Immagini (%1) - - Message - + + The file could not be read or is not valid JSON. + Impossibile leggere il file o non è un JSON valido. - - - QsLogging::Window - - &Pause - + + This theme is for %1, not %2. + Questo tema è per %1, non %2. - - &Resume - + + Libraries + Librerie - - Save log - + + Folders + Cartelle - - Log file (*.log) - + + Reading Lists + Lista di lettura RenameLibraryDialog - + Rename current library Rinomina la libreria corrente @@ -2496,18 +2851,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of %1 found : %2 Numero di %1 trovati; %2 - - + + page %1 of %2 pagina %1 di %2 - + Number of volumes found : %1 Numero di volumi trovati: %1 @@ -2518,17 +2873,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - Per favore aggiugi informazioni addizionali. + Per favore aggiugi informazioni addizionali. - + Series: Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Utilizza la ricerca con corrispondenza esatta. Disabilitare se si desidera trovare volumi che corrispondono ad alcune delle parole nel nome. @@ -2539,40 +2894,40 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Per favore aggiugi informazioni addizionali. - + Series: Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Utilizza la ricerca con corrispondenza esatta. Disabilitare se si desidera trovare volumi che corrispondono ad alcune delle parole nel nome. SelectComic - + loading description Caricamento descrizione - + comics Fumetti - + loading cover Caricamento copertine - + comic description unavailable - + descrizione del fumetto non disponibile - + Please, select the right comic info. Per favore seleziona le informazioni corrette per il fumetto. @@ -2584,37 +2939,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + loading description Caricamento descrizione - + Please, select the right series for your comic. Per favore seleziona la serie corretta per il fumetto. - + Filter: - + Filtro: - + Nothing found, clear the filter if any. - + Non è stato trovato nulla, cancella il filtro se presente. - + loading cover Caricamento copertine - + volume description unavailable - + descrizione del volume non disponibile - + volumes Volumi @@ -2626,12 +2981,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SeriesQuestion - + no No - + yes Si @@ -2644,21 +2999,21 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + Port Porta - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - YACReader è disponibile per dispositivi iOS. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Provalo! </a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + YACReader è disponibile per dispositivi iOS. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Provalo! </a> - + enable the server Abilita il server - + Server connectivity information Informazioni sulla connettività del server @@ -2669,7 +3024,7 @@ to improve the performance Migliora le prestazioni! - + Scan it! Scansiona! @@ -2678,17 +3033,17 @@ Migliora le prestazioni! Errore nel generatore QR! - + set port Configura porta - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader è disponibile per dispositivi iOS e Android.<br/>Scoprilo per <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> o <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address Scegli un indirizzo IP @@ -2696,28 +3051,28 @@ Migliora le prestazioni! SortVolumeComics - + remove selected comics Rimuovi i fumetti selezionati - + sort comics to match comic information Ordina i fumetti per far corrispondere le informazioni - + restore all removed comics Ripristina tutti i fumetti rimossi - + issues Emissione - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. Per favore ordina la lista dei fumetti a sinistra sino a che corrisponde alle informazioni dei fumetti. @@ -2726,309 +3081,1130 @@ Migliora le prestazioni! - TitleHeader + ThemeEditorDialog - - SEARCH - CERCA + + Theme Editor + Redattore del tema - - - UpdateLibraryDialog - - Update library - Aggiorna Libreria + + + + + - - Cancel - Cancella + + - + - - - Updating.... - Aggiornamento... + + i + io - - - VolumeComicsModel - - title - Titolo + + Expand all + Espandi tutto - - - VolumesModel - - year - Anno + + Collapse all + Comprimi tutto - - issues - Emissione + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Tieni premuto per far lampeggiare il valore selezionato nell'interfaccia utente (magenta / alternato / 0↔10). Le versioni ripristinano l'originale. - - publisher - Pubblicato da + + Search… + Ricerca… - - - YACReader::TrayIconController - - &Restore - + + Light + Luminoso - - Systray - + + Dark + Buio - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - + + ID: + Identificativo: - - - YACReader::WhatsNewDialog - - Close - + + Display name: + Nome da visualizzare: - - - YACReaderDeletingProgress - - cancel - Cancella + + Variant: + Variante: - - Please wait, deleting in progress... - Aspetta, cancellazione in corso... + + Theme info + Informazioni sul tema - - - YACReaderFieldEdit - - Restore to default - Resetta al Default + + Parameter + Parametro - - - Click to overwrite - Clikka per sovrascrivere + + Value + Valore - - - YACReaderFieldPlainTextEdit - - Restore to default - Resetta al Default + + Save and apply + Salva e applica - - - - - Click to overwrite - Clikka per sovrascrivere + + Export to file... + Esporta su file... - - - YACReaderFlowConfigWidget - - CoverFlow look - Aspetto del flusso copertine + + Load from file... + Carica da file... - - How to show covers: - Come mostrare le copertine: + + Close + Chiudi - - Stripe look - Aspetto a striscia + + Double-click to edit color + Fare doppio clic per modificare il colore - - Overlapped Stripe look - Aspetto a striscia sovrapposta + + + + + + + true + VERO - - - YACReaderGLFlowConfigWidget - - Zoom - Zoom + + + + + false + falso - - Light - Luminoso + + Double-click to toggle + Fare doppio clic per attivare/disattivare - - Show advanced settings - Mostra le impostazioni avanzate + + Double-click to edit value + Fare doppio clic per modificare il valore - - Roulette look - Aspetto a Roulette + + + + Edit: %1 + Modifica: %1 - - Cover Angle - Angolo copertine + + Save theme + Salva tema - - Stripe look - Aspetto a striscia + + + JSON files (*.json);;All files (*) + File JSON (*.json);;Tutti i file (*) - - Position - Posizione + + Save failed + Salvataggio non riuscito - - Z offset - Traslazione Z + + Could not open file for writing: +%1 + Impossibile aprire il file per la scrittura: +%1 - - Y offset - Traslazione Y + + Load theme + Carica tema - - Central gap - Distanza centrale + + + + Load failed + Caricamento non riuscito - - Presets: - Preselezione: + + Could not open file: +%1 + Impossibile aprire il file: +%1 - - Overlapped Stripe look - Aspetto a Striscia sovrapposto + + Invalid JSON: +%1 + JSON non valido: +%1 - - Modern look - Aspetto moderno + + Expected a JSON object. + Era previsto un oggetto JSON. + + + TitleHeader - - View angle - Vista ad Angolo + + SEARCH + CERCA + + + UpdateLibraryDialog - - Max angle - Angolo massimo + + Update library + Aggiorna Libreria - - Custom: - Personalizza: + + Cancel + Cancella - - Classic look - Aspetto Classico + + Updating.... + Aggiornamento... - - + + + Viewer + + + + Press 'O' to open comic. + Premi "O" per aprire il fumettto. + + + + Not found + Non trovato + + + + Comic not found + Fumetto non trovato + + + + Error opening comic + Errore nell'apertura + + + + CRC Error + Errore CRC + + + + Loading...please wait! + In caricamento...Attendi! + + + + Page not available! + Pagina non disponibile! + + + + Cover! + Copertina! + + + + Last page! + Ultima pagina! + + + + VolumeComicsModel + + + title + Titolo + + + + VolumesModel + + + year + Anno + + + + issues + Emissione + + + + publisher + Pubblicato da + + + + YACReader3DFlowConfigWidget + + + Presets: + Preselezione: + + + + Classic look + Aspetto Classico + + + + Stripe look + Aspetto a striscia + + + + Overlapped Stripe look + Aspetto a strisce sovrapposto + + + + Modern look + Aspetto moderno + + + + Roulette look + Aspetto a Roulette + + + + Show advanced settings + Mostra le impostazioni avanzate + + + + Custom: + Personalizza: + + + + View angle + Vista ad Angolo + + + + Position + Posizione + + + Cover gap Distanza tra le Cover - + + Central gap + Distanza centrale + + + + Zoom + Ingrandimento + + + + Y offset + Traslazione Y + + + + Z offset + Traslazione Z + + + + Cover Angle + Angolo copertine + + + + Visibility + Visibilità + + + + Light + Luminoso + + + + Max angle + Angolo massimo + + + + Low Performance + Basse Prestazioni + + + High Performance Alte Prestazioni - + + Use VSync (improve the image quality in fullscreen mode, worse performance) + UIsa VSync. (Migliora la qualità dell'immagine a modalità tutto schermo, peggiora le prestazioni) + + + Performance: Prestazioni: + + + YACReader::MainWindowViewer + + + &Open + &Apri + + + + Open a comic + Apri un Fumetto + + + + New instance + Nuova istanza + + + + Open Folder + Apri una cartella + + + + Open image folder + Apri la crettal immagini + + + + Open latest comic + Apri l'ultimo fumetto + + + + Open the latest comic opened in the previous reading session + Apri l'ultimo fumetto aperto nella sessione precedente + + + + Clear + Cancella + + + + Clear open recent list + Svuota la lista degli aperti + + + + Save + Salva + + + + + Save current page + Salva la pagina corrente + + + + Previous Comic + Fumetto precendente + + + + + + Open previous comic + Apri il fumetto precendente + + + + Next Comic + Prossimo fumetto + + + + + + Open next comic + Apri il prossimo fumetto + + + + &Previous + &Precedente + + + + + + Go to previous page + Vai alla pagina precedente + + + + &Next + &Prossimo + + + + + + Go to next page + Vai alla prossima Pagina + + + + Fit Height + Adatta altezza + + + + Fit image to height + Adatta immagine all'altezza + + + + Fit Width + Adatta Larghezza + + + + Fit image to width + Adatta immagine in larghezza + + + + Show full size + Mostra dimesioni reali + + + + Fit to page + Adatta alla pagina + + + + Continuous scroll + Scorrimento continuo + + + + Switch to continuous scroll mode + Passa alla modalità di scorrimento continuo + + + + Reset zoom + Resetta Zoom + + + + Show zoom slider + Mostra cursore di zoom + + + + Zoom+ + Aumenta + + + + Zoom- + Riduci + + + + Rotate image to the left + Ruota immagine a sinistra + + + + Rotate image to the right + Ruota immagine a destra + + + + Double page mode + Modalita doppia pagina + + + + Switch to double page mode + Passa alla modalità doppia pagina + + + + Double page manga mode + Modalità doppia pagina Manga + + + + Reverse reading order in double page mode + Ordine lettura inverso in modo doppia pagina + + + + Go To + Vai a + + + + Go to page ... + Vai a Pagina ... + + + + Options + Opzioni + + + + YACReader options + Opzioni YACReader + + + + + Help + Aiuto + + + + Help, About YACReader + Aiuto, Crediti YACReader + + + + Magnifying glass + Lente ingrandimento + + + + Switch Magnifying glass + Passa a lente ingrandimento + + + + Set bookmark + Imposta Segnalibro + + + + Set a bookmark on the current page + Imposta segnalibro a pagina corrente + + + + Show bookmarks + Mostra segnalibro + + + + Show the bookmarks of the current comic + Mostra il segnalibro del fumetto corrente + + + + Show keyboard shortcuts + Mostra scorciatoie da tastiera + + + + Show Info + Mostra info + + + + Close + Chiudi + + + + Show Dictionary + Mostra dizionario + + + + Show go to flow + Mostra "Vai a Comic Flow" + + + + Edit shortcuts + Edita scorciatoie + + + + &File + &Documento + + + + + Open recent + Apri i recenti + + + + File + Documento + + + + Edit + Edita + + + + View + Mostra + + + + Go + Vai + + + + Window + Finestra + + + + + + Open Comic + Apri Fumetto + + + + + + Comic files + File Fumetto + + + + Open folder + Apri cartella + + + + page_%1.jpg + Pagina_%1.jpg + + + + Image files (*.jpg) + File immagine (*.jpg) + + + + + Comics + Fumetto + + + + + General + Generale + + + + + Magnifiying glass + Lente ingrandimento + + + + + Page adjustement + Correzioni di pagna + + + + + Reading + Leggi + + + + Toggle fullscreen mode + Attiva/Disattiva schermo intero + + + + Hide/show toolbar + Mostra/Nascondi Barra strumenti + + + + Size up magnifying glass + Ingrandisci lente ingrandimento + + + + Size down magnifying glass + Riduci lente ingrandimento + + + + Zoom in magnifying glass + Ingrandisci in lente di ingrandimento + + + + Zoom out magnifying glass + Riduci in lente di ingrandimento + + + + Reset magnifying glass + Reimposta la lente d'ingrandimento + + + + Toggle between fit to width and fit to height + Passa tra adatta in larghezza ad altezza + + + + Autoscroll down + Autoscorri Giù + + + + Autoscroll up + Autoscorri Sù + + + + Autoscroll forward, horizontal first + Autoscorri avanti, priorità Orizzontale + + + + Autoscroll backward, horizontal first + Autoscorri indietro, priorità Orizzontale + + + + Autoscroll forward, vertical first + Autoscorri avanti, priorità Verticale + + + + Autoscroll backward, vertical first + Autoscorri indietro, priorità Verticale + + + + Move down + Muovi Giù + + + + Move up + Muovi Sù + + + + Move left + Muovi Sinistra + + + + Move right + Muovi Destra + + + + Go to the first page + Vai alla pagina iniziale + + + + Go to the last page + Vai all'ultima pagina + + + + Offset double page to the left + Doppia pagina spostata a sinistra + + + + Offset double page to the right + Doppia pagina spostata a destra + + + + There is a new version available + Nuova versione disponibile + + + + Do you want to download the new version? + Vuoi scaricare la nuova versione? + + + + Remind me in 14 days + Ricordamelo in 14 giorni + + + + Not now + Non ora + + + + YACReader::TrayIconController + + + &Restore + &Ripristina + + + + Systray + Area di notifica + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuerà a essere eseguito nella barra delle applicazioni. Per terminare il programma, scegli <b>Esci</b> nel menu contestuale dell'icona nella barra delle applicazioni. + + + + YACReaderFieldEdit + + + Restore to default + Resetta al Default + + + + + Click to overwrite + Clikka per sovrascrivere + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Resetta al Default + + + + + + + Click to overwrite + Clikka per sovrascrivere + + + + YACReaderFlowConfigWidget + + CoverFlow look + Aspetto del flusso copertine + + + How to show covers: + Come mostrare le copertine: + + + Stripe look + Aspetto a striscia + + + Overlapped Stripe look + Aspetto a striscia sovrapposta + + + + YACReaderGLFlowConfigWidget + + Zoom + Ingrandimento + + + Light + Luminoso + + + Show advanced settings + Mostra le impostazioni avanzate + + + Roulette look + Aspetto a Roulette + + + Cover Angle + Angolo copertine + + + Stripe look + Aspetto a striscia + + + Position + Posizione + + + Z offset + Traslazione Z + + + Y offset + Traslazione Y + + + Central gap + Distanza centrale + + + Presets: + Preselezione: + + + Overlapped Stripe look + Aspetto a Striscia sovrapposto + + + Modern look + Aspetto moderno + + + View angle + Vista ad Angolo + + + Max angle + Angolo massimo + + + Custom: + Personalizza: + + + Classic look + Aspetto Classico + + + Cover gap + Distanza tra le Cover + + + High Performance + Alte Prestazioni + + + Performance: + Prestazioni: + - Use VSync (improve the image quality in fullscreen mode, worse performance) - UIsa VSync. (Migliora la qualità dell'immagine a modalità tutto schermo, peggiora le prestazioni) + UIsa VSync. (Migliora la qualità dell'immagine a modalità tutto schermo, peggiora le prestazioni) - Visibility - Visibilità + Visibilità - Low Performance - Basse Prestazioni + Basse Prestazioni YACReaderNavigationController - You are not reading anything yet, come on!! - Non stai ancora leggendo nulla, Forza!! + Non stai ancora leggendo nulla, Forza!! - - There are no recent comics! - - - - No favorites - Nessun Favorito + Nessun Favorito YACReaderOptionsDialog - + Save Salva - Use hardware acceleration (restart needed) - Usa accelerazione hardware (necessita riavvio) + Usa accelerazione hardware (necessita riavvio) - + Cancel Cancella - + Shortcuts Scorciatoie - + Edit shortcuts Modifica scorciatoia @@ -3036,7 +4212,7 @@ Migliora le prestazioni! YACReaderSearchLineEdit - + type to search Digita per cercare @@ -3044,34 +4220,60 @@ Migliora le prestazioni! YACReaderSideBar - Reading Lists - Lista di lettura + Lista di lettura - LIBRARIES - LIBRERIE + LIBRERIE - Libraries - Librerie + Librerie - FOLDERS - CARTELLE + CARTELLE - Folders - Cartelle + Cartelle - READING LISTS - LISTA DI LETTURA + LISTA DI LETTURA + + + + YACReaderSlider + + + Reset + Resetta + + + + YACReaderTranslator + + + YACReader translator + Traduttore YACReader + + + + + Translation + Traduzione + + + + clear + Cancella + + + + Service not available + Servizio non disponibile diff --git a/YACReaderLibrary/yacreaderlibrary_nl.ts b/YACReaderLibrary/yacreaderlibrary_nl.ts index e53185efa..6c31e09a7 100644 --- a/YACReaderLibrary/yacreaderlibrary_nl.ts +++ b/YACReaderLibrary/yacreaderlibrary_nl.ts @@ -6,90 +6,30 @@ None - + Geen AddLabelDialog - + cancel annuleren - + Label name: - + Labelnaam: - + Choose a color: - - - - - red - - - - - orange - - - - - yellow - - - - - green - - - - - cyan - - - - - blue - - - - - violet - - - - - purple - - - - - pink - - - - - white - - - - - light - - - - - dark - + Kies een kleur: - + accept - + accepteren @@ -100,7 +40,7 @@ Toevoegen - + Add an existing library Voeg een bestaand bibliotheek toe @@ -129,109 +69,249 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Voordat je verbinding kunt maken met Comic Vine, heb je een eigen API-sleutel nodig. Vraag er <a href="http://www.comicvine.com/api/">hier</a> één gratis aan Paste here your Comic Vine API key - + Plak hier uw Comic Vine API-sleutel Accept - + Accepteren + + + + AppearanceTabWidget + + + Color scheme + Kleurenschema + + + + System + Systeem + + + + Light + Licht + + + + Dark + Donker + + + + Custom + Aangepast + + + + Remove + Verwijderen + + + + Remove this user-imported theme + Verwijder dit door de gebruiker geïmporteerde thema + + + + Light: + Licht: + + + + Dark: + Donker: + + + + Custom: + Aangepast: + + + + Import theme... + Thema importeren... + + + + Theme + Thema + + + + Theme editor + Thema-editor + + + + Open Theme Editor... + Thema-editor openen... + + + + Theme editor error + Fout in de thema-editor + + + + The current theme JSON could not be loaded. + De huidige thema-JSON kan niet worden geladen. + + + + Import theme + Thema importeren + + + + JSON files (*.json);;All files (*) + JSON-bestanden (*.json);;Alle bestanden (*) + + + + Could not import theme from: +%1 + Kan thema niet importeren uit: +%1 + + + + Could not import theme from: +%1 + +%2 + Kan thema niet importeren uit: +%1 + +%2 + + + + Import failed + Importeren is mislukt + + + + BookmarksDialog + + + Lastest Page + Laatste Pagina + + + + Close + Sluiten + + + + Click on any image to go to the bookmark + Klik op een afbeelding om naar de bladwijzer te gaan + + + + + Loading... + Inladen... ClassicComicsView - + Hide comic flow - Sluit de Omslagbrowser + Comic Flow verbergen ComicInfoView - + + Characters + Personages + + + Main character or team - + Hoofdpersoon of team - + Teams - + Ploegen - + Locations - + Locaties - + Authors Auteurs - + writer - + schrijver - + penciller - + tekenaar - + inker - + inker - + colorist - + inkleurder - + letterer - + letteraar - + cover artist - + covertekenaar - + editor - + redacteur - + imprint - + fondslabel - + Publisher - + Uitgever - + color - + kleur - + b/w - - - - - Characters - + z/w @@ -259,7 +339,7 @@ Pages - Pagina's + Pagina's @@ -274,105 +354,113 @@ Current Page - + Huidige pagina Publication Date - + Publicatiedatum Rating - + Beoordeling Series - + Serie Volume - + Deel Story Arc - + Verhaalboog ComicVineDialog - + skip - + overslaan - + back - + rug - + next - + volgende - + search - + zoekopdracht - + close - + dichtbij - - - + + + Looking for volume... - + Op zoek naar volumes... - - + + comic %1 of %2 - %3 - + strip %1 van %2 - %3 - + %1 comics selected - + %1 strips geselecteerd - + Error connecting to ComicVine - + Fout bij verbinden met ComicVine - - + + Retrieving tags for : %1 - + Tags ophalen voor: %1 - + Retrieving volume info... - + Volume-informatie ophalen... - + Looking for comic... - + Op zoek naar komische... + + + + ContinuousPageWidget + + + Loading page %1 + Pagina laden %1 CreateLibraryDialog - + Create new library Een nieuwe Bibliotheek aanmaken @@ -392,7 +480,7 @@ Een bibliotheek aanmaken kan enkele minuten duren. U kunt het proces stoppen en de bibliotheek later voltooien. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder De geselecteerde pad bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map @@ -407,7 +495,7 @@ Bibliotheek Naam : - + Path not found Pad niet gevonden @@ -417,54 +505,43 @@ Restore defaults - + Standaardwaarden herstellen To change a shortcut, double click in the key combination and type the new keys. - + Om een ​​snelkoppeling te wijzigen, dubbelklikt u op de toetsencombinatie en typt u de nieuwe toetsen. Shortcuts settings - + Instellingen voor snelkoppelingen - + Shortcut in use - + Snelkoppeling in gebruik - - The shortcut "%1" is already assigned to other function - + + The shortcut "%1" is already assigned to other function + De sneltoets "%1" is al aan een andere functie toegewezen EmptyFolderWidget - - - Subfolders in this folder - - - - - Empty folder - - - - - Drag and drop folders and comics here - + + This folder doesn't contain comics yet + Deze map bevat nog geen strips EmptyLabelWidget - - This label doesn't contain comics yet - + + This label doesn't contain comics yet + Dit label bevat nog geen strips @@ -472,7 +549,25 @@ This reading list does not contain any comics yet - + Deze leeslijst bevat nog geen strips + + + + EmptySpecialListWidget + + + No favorites + Geen favorieten + + + + You are not reading anything yet, come on!! + Je leest nog niets, kom op!! + + + + There are no recent comics! + Er zijn geen recente strips! @@ -483,7 +578,7 @@ Uitvoerbestand: - + Destination database name Bestemmingsdatabase naam @@ -498,17 +593,17 @@ Aanmaken - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Het gekozen pad voor het uitvoerbestand bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map - + Export comics info Strip info exporteren - + Problem found while writing Probleem bij het schrijven @@ -526,7 +621,7 @@ Aanmaken - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Het gekozen pad voor het uitvoerbestand bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map @@ -536,17 +631,17 @@ Uitvoermap : - + Problem found while writing Probleem bij het schrijven - + Create covers package Aanmaken omslag pakket - + Destination directory Doeldirectory @@ -561,57 +656,86 @@ CRC error on page (%1): some of the pages will not be displayed correctly - + CRC-fout op pagina (%1): sommige pagina's worden niet correct weergegeven Unknown error opening the file - + Onbekende fout bij het openen van het bestand Format not supported - + Formaat niet ondersteund FolderContentView - + Continue Reading... - + Verder lezen... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Pagina : + + + + Go To + Ga Naar + + + + Cancel + Annuleren + + + + + Total pages : + Totaal aantal pagina's : + + + + Go to... + Ga naar... + + + + GoToFlowToolBar + + + Page : + Pagina : GridComicsView - + Show info - + Toon informatie HelpAboutDialog - + Help - Help + Hulp - + System info - + Systeeminformatie - + About Over @@ -639,7 +763,7 @@ Strip info Importeren - + Comics info file (*.ydb) Strips info bestand ( * .ydb) @@ -662,7 +786,7 @@ Uitpakken - + Compresed library covers (*.clc) Compresed omslag- bibliotheek ( * .clc) @@ -677,7 +801,7 @@ Bibliotheek Naam : - + Extract a catalog Een catalogus uitpakken @@ -685,54 +809,54 @@ ImportWidget - + stop - stop + Stoppen - + Importing comics Strips importeren - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <P>YACReaderLibrary maak nu een nieuwe bibliotheek. < /p> <p>Een bibliotheek aanmaken kan enkele minuten duren. U kunt het proces stoppen en de bibliotheek later voltooien. < /p> - + Some of the comics being added... Enkele strips zijn toegevoegd ... - + Updating the library Actualisering van de bibliotheek - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <P>De huidige bibliotheek wordt bijgewerkt. Voor snellere updates, update uw bibliotheken regelmatig. < /p> <p>u kunt het proces stoppen om later bij te werken. < /p> - + Upgrading the library - + Het upgraden van de bibliotheek - + <p>The current library is being upgraded, please wait.</p> - + <p>De huidige bibliotheek wordt geüpgraded. Een ogenblik geduld.</p> - + Scanning the library - + De bibliotheek scannen - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>De huidige bibliotheek wordt gescand op oudere XML-metadata-informatie.</p><p>Dit is slechts één keer nodig en alleen als de bibliotheek is ingepakt met YACReaderLibrary 9.8.2 of eerder.</p> @@ -742,17 +866,17 @@ Bewerken - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. De geselecteerde map bevat geen bibliotheek. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Deze bibliotheek is gemaakt met een vorige versie van YACReaderLibrary. Het moet worden bijgewerkt. Nu bijwerken? - + Error opening the library Fout bij openen Bibliotheek @@ -773,12 +897,12 @@ Strip Instellen als gelezen - + Remove and delete metadata Verwijder metagegevens - + Old library Oude Bibliotheek @@ -787,7 +911,7 @@ Strip omslagen bijwerken - + Library Bibliotheek @@ -800,7 +924,7 @@ Volledig scherm modus aan/of - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Deze bibliotheek is gemaakt met een nieuwere versie van YACReaderLibrary. Download de nieuwe versie? @@ -813,26 +937,26 @@ Huidige Bibliotheek bijwerken - - Library '%1' is no longer available. Do you want to remove it? - Bibliotheek ' %1' is niet langer beschikbaar. Wilt u het verwijderen? + + Library '%1' is no longer available. Do you want to remove it? + Bibliotheek ' %1' is niet langer beschikbaar. Wilt u het verwijderen? Update library Bibliotheek bijwerken - + Open folder... Map openen ... - + Do you want remove Wilt u verwijderen - + Error updating the library Fout bij bijwerken Bibliotheek @@ -841,16 +965,16 @@ Alle categorieën uitklappen - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - Bibliotheek ' %1' is gemaakt met een oudere versie van YACReaderLibrary. Zij moet opnieuw worden aangemaakt. Wilt u de bibliotheek nu aanmaken? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Bibliotheek ' %1' is gemaakt met een oudere versie van YACReaderLibrary. Zij moet opnieuw worden aangemaakt. Wilt u de bibliotheek nu aanmaken? Pack covers Inpakken strip voorbladen - + Set as read Instellen als gelezen @@ -871,7 +995,7 @@ Maak een nieuwe Bibliotheek - + Library not available Bibliotheek niet beschikbaar @@ -884,12 +1008,12 @@ Huidige strip openen - + YACReader Library YACReader Bibliotheek - + Error creating the library Fout bij aanmaken Bibliotheek @@ -898,7 +1022,7 @@ Uitpakken voorbladen - + Update needed Bijwerken is nodig @@ -907,22 +1031,22 @@ Open een bestaande Bibliotheek - + Library name already exists Bibliotheek naam bestaat al - - There is another library with the name '%1'. - Er is al een bibliotheek met de naam ' %1 '. + + There is another library with the name '%1'. + Er is al een bibliotheek met de naam ' %1 '. - + Download new version Nieuwe versie ophalen - + Delete comics Strips verwijderen @@ -951,18 +1075,18 @@ Uitpaken van een catalogus - + All the selected comics will be deleted from your disk. Are you sure? Alle geselecteerde strips worden verwijderd van uw schijf. Weet u het zeker? - - + + Set as unread Instellen als ongelezen - + Library not found Bibliotheek niet gevonden @@ -975,734 +1099,738 @@ Bibliotheek verwijderen - - - + + + manga - + Manga - - - + + + comic - + grappig - - - + + + western manga (left to right) - + westerse manga (van links naar rechts) Open containing folder... Open map ... - - - + + + 4koma (top to botom) 4koma (top to botom - + 4koma (van boven naar beneden) - + library? Bibliotheek? - + Are you sure? Weet u het zeker? - + Rescan library for XML info - + Bibliotheek opnieuw scannen op XML-info - - - + + + web comic - + web-strip - + Add new folder - + Nieuwe map toevoegen - + Delete folder - + Map verwijderen - + Set as uncompleted - + Ingesteld als onvoltooid - + Set as completed - + Instellen als voltooid - + Update folder - + Map bijwerken - + Folder - + Map - + Comic - + Grappig - + Upgrade failed - + Upgrade mislukt - + There were errors during library upgrade in: - + Er zijn fouten opgetreden tijdens de bibliotheekupgrade in: - - + + Copying comics... - + Strips kopiëren... - - + + Moving comics... - + Strips verplaatsen... - + Folder name: - + Mapnaam: - + No folder selected - + Geen map geselecteerd - + Please, select a folder first - + Selecteer eerst een map - + Error in path - + Fout in pad - - There was an error accessing the folder's path - + + There was an error accessing the folder's path + Er is een fout opgetreden bij het verkrijgen van toegang tot het pad van de map - + The selected folder and all its contents will be deleted from your disk. Are you sure? - + De geselecteerde map en de volledige inhoud ervan worden van uw schijf verwijderd. Weet je het zeker? - - + + Unable to delete - + Kan niet verwijderen - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - + Er is een probleem opgetreden bij het verwijderen van de geselecteerde mappen. Controleer of er schrijfrechten zijn en zorg ervoor dat alle toepassingen deze mappen of een van de daarin opgenomen bestanden gebruiken. - + Add new reading lists - + Voeg nieuwe leeslijsten toe - - + + List name: - + Lijstnaam: - + Delete list/label - + Lijst/label verwijderen - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? - + Het geselecteerde item wordt verwijderd, uw strips of mappen worden NIET van uw schijf verwijderd. Weet je het zeker? - + Rename list name - + Hernoem de lijstnaam - - - - + + + + Set type - + Soort instellen - + Set custom cover - + Aangepaste omslag instellen - + Delete custom cover - + Aangepaste omslag verwijderen - + Save covers - + Bewaar hoesjes - + You are adding too many libraries. - + U voegt te veel bibliotheken toe. - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. - + U voegt te veel bibliotheken toe. + +Je hebt waarschijnlijk maar één bibliotheek nodig in je stripmap op het hoogste niveau. Je kunt door alle submappen bladeren met behulp van het mappengedeelte in de linkerzijbalk. + +YACReaderLibrary zal u er niet van weerhouden om meer bibliotheken te creëren, maar u moet het aantal bibliotheken laag houden. - - + + YACReader not found - + YACReader niet gevonden - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader niet gevonden. YACReader moet in dezelfde map worden geïnstalleerd als YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. - + YACReader niet gevonden. Er is mogelijk een probleem met uw YACReader-installatie. - + Error - + Fout - + Error opening comic with third party reader. - + Fout bij het openen van een strip met een lezer van een derde partij. - + Library info - + Bibliotheekinformatie - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - + Er is een probleem opgetreden bij het verwijderen van de geselecteerde strips. Controleer of er schrijfrechten zijn voor de geselecteerde bestanden of de map waarin deze zich bevinden. - + Assign comics numbers - + Wijs stripnummers toe - + Assign numbers starting in: - + Nummers toewijzen beginnend met: - + Invalid image - + Ongeldige afbeelding - + The selected file is not a valid image. - + Het geselecteerde bestand is geen geldige afbeelding. - + Error saving cover - + Fout bij opslaan van dekking - + There was an error saving the cover image. - + Er is een fout opgetreden bij het opslaan van de omslagafbeelding. - + Remove comics - + Verwijder strips - + Comics will only be deleted from the current label/list. Are you sure? - + Strips worden alleen verwijderd van het huidige label/de huidige lijst. Weet je het zeker? LibraryWindowActions - + Create a new library - Maak een nieuwe Bibliotheek + Maak een nieuwe Bibliotheek - + Open an existing library - Open een bestaande Bibliotheek + Open een bestaande Bibliotheek - - + + Export comics info - + Strip info exporteren - - + + Import comics info - + Strip info Importeren - + Pack covers - Inpakken strip voorbladen + Inpakken strip voorbladen - + Pack the covers of the selected library - Inpakken alle strip voorbladen van de geselecteerde Bibliotheek + Inpakken alle strip voorbladen van de geselecteerde Bibliotheek - + Unpack covers - Uitpakken voorbladen + Uitpakken voorbladen - + Unpack a catalog - Uitpaken van een catalogus + Uitpaken van een catalogus - + Update library - Bibliotheek bijwerken + Bibliotheek bijwerken - + Update current library - Huidige Bibliotheek bijwerken + Huidige Bibliotheek bijwerken - + Rename library - Bibliotheek hernoemen + Bibliotheek hernoemen - + Rename current library - + Huidige Bibliotheek hernoemen - + Remove library - Bibliotheek verwijderen + Bibliotheek verwijderen - + Remove current library from your collection - De huidige Bibliotheek verwijderen uit uw verzameling + De huidige Bibliotheek verwijderen uit uw verzameling - + Rescan library for XML info - + Bibliotheek opnieuw scannen op XML-info - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Probeert XML-informatie te vinden die is ingebed in stripbestanden. U hoeft dit alleen te doen als de bibliotheek is gemaakt met versie 9.8.2 of eerdere versies of als u software van derden gebruikt om XML-informatie in de bestanden in te sluiten. - + Show library info - + Bibliotheekinfo tonen - + Show information about the current library - + Toon informatie over de huidige bibliotheek - + Open current comic - Huidige strip openen + Huidige strip openen - + Open current comic on YACReader - Huidige strip openen in YACReader + Huidige strip openen in YACReader - + Save selected covers to... - + Geselecteerde omslagen opslaan in... - + Save covers of the selected comics as JPG files - + Sla covers van de geselecteerde strips op als JPG-bestanden - - + + Set as read - Instellen als gelezen + Instellen als gelezen - + Set comic as read - Strip Instellen als gelezen + Strip Instellen als gelezen - - + + Set as unread - Instellen als ongelezen + Instellen als ongelezen - + Set comic as unread - Strip Instellen als ongelezen + Strip Instellen als ongelezen - - + + manga - + Manga - + Set issue as manga - + Stel het probleem in als manga - - + + comic - + grappig - + Set issue as normal - + Stel het probleem in als normaal - + western manga - + westerse manga - + Set issue as western manga - + Stel het probleem in als westerse manga - - + + web comic - + web-strip - + Set issue as web comic - + Stel het probleem in als webstrip - - + + yonkoma - + yokoma - + Set issue as yonkoma - + Stel het probleem in als yonkoma - + Show/Hide marks - Toon/Verberg markeringen + Toon/Verberg markeringen - + Show or hide read marks - + Toon of verberg leesmarkeringen - + Show/Hide recent indicator - + Recente indicator tonen/verbergen - + Show or hide recent indicator - + Toon of verberg recente indicator - - + + Fullscreen mode on/off - Volledig scherm modus aan/of + Volledig scherm modus aan/of - + Help, About YACReader - Help, Over YACReader + Help, Over YACReader - + Add new folder - + Nieuwe map toevoegen - + Add new folder to the current library - + Voeg een nieuwe map toe aan de huidige bibliotheek - + Delete folder - + Map verwijderen - + Delete current folder from disk - + Verwijder de huidige map van schijf - + Select root node - Selecteer de hoofd categorie + Selecteer de hoofd categorie - + Expand all nodes - Alle categorieën uitklappen + Alle categorieën uitklappen - + Collapse all nodes - + Vouw alle knooppunten samen - + Show options dialog - Toon opties dialoog + Toon opties dialoog - + Show comics server options dialog - Toon strips-server opties dialoog + Toon strips-server opties dialoog - - + + Change between comics views - + Wisselen tussen stripweergaven - + Open folder... - Map openen ... + Map openen ... - + Set as uncompleted - + Ingesteld als onvoltooid - + Set as completed - + Instellen als voltooid - + Set custom cover - + Aangepaste omslag instellen - + Delete custom cover - + Aangepaste omslag verwijderen - + western manga (left to right) - + westerse manga (van links naar rechts) - + Open containing folder... - Open map ... + Open map ... - + Reset comic rating - + Stripbeoordeling opnieuw instellen - + Select all comics - Selecteer alle strips + Selecteer alle strips - + Edit - Bewerken + Bewerken - + Assign current order to comics - + Wijs de huidige volgorde toe aan strips - + Update cover - Strip omslagen bijwerken + Strip omslagen bijwerken - + Delete selected comics - Geselecteerde strips verwijderen + Geselecteerde strips verwijderen - + Delete metadata from selected comics - + Verwijder metadata uit geselecteerde strips - + Download tags from Comic Vine - + Tags downloaden van Comic Vine - + Focus search line - + Focus zoeklijn - + Focus comics view - + Focus stripweergave - + Edit shortcuts - + Snelkoppelingen bewerken - + &Quit - + &Afsluiten - + Update folder - + Map bijwerken - + Update current folder - + Werk de huidige map bij - + Scan legacy XML metadata - + Scan oudere XML-metagegevens - + Add new reading list - + Nieuwe leeslijst toevoegen - + Add a new reading list to the current library - + Voeg een nieuwe leeslijst toe aan de huidige bibliotheek - + Remove reading list - + Leeslijst verwijderen - + Remove current reading list from the library - + Verwijder de huidige leeslijst uit de bibliotheek - + Add new label - + Nieuw etiket toevoegen - + Add a new label to this library - + Voeg een nieuw label toe aan deze bibliotheek - + Rename selected list - + Hernoem de geselecteerde lijst - + Rename any selected labels or lists - + Hernoem alle geselecteerde labels of lijsten - + Add to... - + Toevoegen aan... - + Favorites - + Favorieten - + Add selected comics to favorites list - + Voeg geselecteerde strips toe aan de favorietenlijst @@ -1710,301 +1838,472 @@ YACReaderLibrary will not stop you from creating more libraries but you should k file name - - - - - LogWindow - - - Log window - - - - - &Pause - - - - - &Save - - - - - C&lear - - - - - &Copy - - - - - Level: - - - - - &Auto scroll - + bestandsnaam NoLibrariesWidget - + create your first library Maak uw eerste bibliotheek - - You don't have any libraries yet + + You don't have any libraries yet Je hebt geen nog libraries - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <P>u kunt een bibliotheek maken in een willekeurige map, YACReaderLibrary importeert alle strips en mappen uit deze map. Alle bibliotheek aangemaakt in het verleden kan je openen. < /p> <p>vergeet niet dat u YACReader kan gebruiken als stand-alone applicatie voor het lezen van de strips op de computer. < /p> - + add an existing one voeg een bestaande bibliotheek toe + + NoSearchResultsWidget + + + No results + Geen resultaten + + OptionsDialog - + + + Appearance + Verschijning + + + + Options Opties - + + + Language + Taal + + + + + Application language + Applicatietaal + + + + + System default + Standaard van het systeem + + + Tray icon settings (experimental) - + Instellingen voor ladepictogram (experimenteel) - + Close to tray - + Dicht bij lade - + Start into the system tray - + Begin in het systeemvak - + Edit Comic Vine API key - + Bewerk de Comic Vine API-sleutel - + Comic Vine API key - + Comic Vine API-sleutel - + ComicInfo.xml legacy support - + ComicInfo.xml verouderde ondersteuning - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Importeer metagegevens uit ComicInfo.xml wanneer u nieuwe strips toevoegt - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + Overweeg 'recente' items die sinds X dagen geleden zijn toegevoegd of bijgewerkt - + Third party reader - + Lezer van derden - + Write {comic_file_path} where the path should go in the command - + Schrijf {comic_file_path} waar het pad naartoe moet in de opdracht - + + Clear - + Duidelijk - + Update libraries at startup - + Update bibliotheken bij het opstarten - + Try to detect changes automatically - + Probeer wijzigingen automatisch te detecteren - + Update libraries periodically - + Update bibliotheken regelmatig - + Interval: - + Tijdsinterval: - + 30 minutes - + 30 minuten - + 1 hour - + 1 uur - + 2 hours - + 2 uur - + 4 hours - + 4 uur - + 8 hours - + 8 uur - + 12 hours - + 12 uur - + daily - + dagelijks - + Update libraries at certain time - + Update bibliotheken op een bepaald tijdstip - + Time: - + Tijd: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + WAARSCHUWING! Tijdens bibliotheekupdates is schrijven naar de database uitgeschakeld! +Plan geen updates terwijl u de app mogelijk actief gebruikt. +During automatic updates the app will block some of the actions until the update is finished. +Om een ​​automatische update te stoppen, tikt u op de laadindicator naast de titel van Bibliotheken. - + Modifications detection - + Detectie van wijzigingen - + Compare the modified date of files when updating a library (not recommended) - + Vergelijk de wijzigingsdatum van bestanden bij het updaten van een bibliotheek (niet aanbevolen) - + Enable background image - + Achtergrondafbeelding inschakelen - + Opacity level - + Dekkingsniveau - + Blur level - + Vervagingsniveau - + Use selected comic cover as background - + Gebruik geselecteerde stripomslag als achtergrond - + Restore defautls - + Standaardwaarden herstellen - + Background - + Achtergrond - + Display continue reading banner - + Toon de banner voor verder lezen - + Display current comic banner - + Toon huidige stripbanner - + Continue reading - + Lees verder - + Comic Flow - + Comic Flow - - + + Libraries - + Bibliotheken - + Grid view - + Rasterweergave - + + General - + Algemeen - - - PropertiesDialog - - Day: - Dag: + + My comics path + Pad naar mijn strips - - Plot - Verhaal + + Display + Weergave - - Size: + + Show time in current page information label + Toon de tijd in het informatielabel van de huidige pagina + + + + "Go to flow" size + Grootte van "Ga naar Comic Flow" + + + + Background color + Achtergrondkleur + + + + Choose + Kies + + + + Scroll behaviour + Scrollgedrag + + + + Disable scroll animations and smooth scrolling + Schakel scrollanimaties en soepel scrollen uit + + + + Do not turn page using scroll + Sla de pagina niet om met scrollen + + + + Use single scroll step to turn page + Gebruik een enkele scrollstap om de pagina om te slaan + + + + Mouse mode + Muismodus + + + + Only Back/Forward buttons can turn pages + Alleen de knoppen Terug/Vooruit kunnen pagina's omslaan + + + + Use the Left/Right buttons to turn pages. + Gebruik de knoppen Links/Rechts om pagina's om te slaan. + + + + Click left or right half of the screen to turn pages. + Klik op de linker- of rechterhelft van het scherm om pagina's om te slaan. + + + + Quick Navigation Mode + Snelle navigatiemodus + + + + Disable mouse over activation + Schakel muis-over-activering uit + + + + Brightness + Helderheid + + + + Contrast + Contrastwaarde + + + + Gamma + Gammawaarde + + + + Reset + Standaardwaarden terugzetten + + + + Image options + Afbeelding opties + + + + Fit options + Pas opties + + + + Enlarge images to fit width/height + Vergroot afbeeldingen zodat ze in de breedte/hoogte passen + + + + Double Page options + Opties voor dubbele pagina's + + + + Show covers as single page + Toon omslagen als enkele pagina + + + + Scaling + Schalen + + + + Scaling method + Schaalmethode + + + + Nearest (fast, low quality) + Dichtstbijzijnde (snel, lage kwaliteit) + + + + Bilinear + Bilineair + + + + Lanczos (better quality) + Lanczos (betere kwaliteit) + + + + Page Flow + Omslagbrowser + + + + Image adjustment + Beeldaanpassing + + + + + Restart is needed + Herstart is nodig + + + + Comics directory + Strips map + + + + PropertiesDialog + + + Day: + Dag: + + + + Plot + Verhaal + + + + Size: Grootte(MB): @@ -2015,7 +2314,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Inker(s): - Inker(s): + Inkt(en): @@ -2055,37 +2354,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Genre: - Genre: + Genretype: Notes - + Opmerkingen Load previous page as cover - + Laad de vorige pagina als omslag Load next page as cover - + Laad de volgende pagina als omslag Reset cover to the default image - + Zet de omslag terug naar de standaardafbeelding Load custom cover image - + Aangepaste omslagafbeelding laden Series: - + Serie: @@ -2095,27 +2394,27 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + alt. nummer: Alternate series: - + Alternatieve serie: Series Group: - + Seriegroep: Editor(s): - + Redacteur(en): Imprint: - + Opdruk: @@ -2125,32 +2424,32 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + Soort: Language (ISO): - + Taal (ISO): Teams: - + Ploegen: Locations: - + Locaties: Main character or team: - + Hoofdpersoon of team: Review: - + Beoordeling: @@ -2160,17 +2459,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Invalid cover - + Ongeldige dekking The image is invalid. - + De afbeelding is ongeldig. Synopsis: - Synopsis: + Samenvatting: @@ -2210,7 +2509,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + Labels: @@ -2252,17 +2551,33 @@ To stop an automatic update tap on the loading indicator next to the Libraries t of: - + van: Arc number: - + Boognummer: - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine-link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> bekijken </a> + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer is de headless (geen gui) versie van YACReaderLibrary. + +Deze applicatie ondersteunt permanente instellingen. Om ze in te stellen, bewerk dit bestand %1 +Voor meer informatie over de beschikbare instellingen kunt u de documentatie raadplegen op https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md @@ -2270,99 +2585,83 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 7z lib not found - + 7z-lib niet gevonden unable to load 7z lib from ./utils - + kan 7z lib niet laden vanuit ./utils Trace - + Spoor Debug - + Foutopsporing Info - + Informatie Warning - + Waarschuwing Error - + Fout Fatal - + Fataal - + Select custom cover - + Selecteer een aangepaste omslag - + Images (%1) - - - - - QsLogging::LogWindowModel - - - Time - - - - - Level - + Afbeeldingen (%1) - - Message - + + The file could not be read or is not valid JSON. + Het bestand kan niet worden gelezen of is geen geldige JSON. - - - QsLogging::Window - - &Pause - + + This theme is for %1, not %2. + Dit thema is voor %1, niet voor %2. - - &Resume - + + Libraries + Bibliotheken - - Save log - + + Folders + Mappen - - Log file (*.log) - + + Reading Lists + Leeslijsten RenameLibraryDialog - + Rename current library Hernoem de huidige bibiliotheek @@ -2385,20 +2684,20 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of volumes found : %1 - + Aantal gevonden volumes: %1 - - + + page %1 of %2 - + pagina %1 van %2 - + Number of %1 found : %2 - + Aantal %1 gevonden: %2 @@ -2407,17 +2706,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - + Geef wat aanvullende informatie op voor deze strip. - + Series: - + Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Gebruik exacte matchzoekopdrachten. Schakel dit uit als u volumes wilt vinden die overeenkomen met enkele woorden in de naam. @@ -2425,516 +2724,1336 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information. - + Geef alstublieft wat aanvullende informatie op. - + Series: - + Serie: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Gebruik exacte matchzoekopdrachten. Schakel dit uit als u volumes wilt vinden die overeenkomen met enkele woorden in de naam. SelectComic - + Please, select the right comic info. - + Selecteer de juiste stripinformatie. - + comics - + strips - + loading cover - + laaddeksel - + loading description - + beschrijving laden - + comic description unavailable - + komische beschrijving niet beschikbaar SelectVolume - + Please, select the right series for your comic. - + Selecteer de juiste serie voor jouw strip. - + Filter: - + Selectiefilter: - + volumes - + delen - + Nothing found, clear the filter if any. - + Niets gevonden. Wis eventueel het filter. - + loading cover - + laaddeksel - + loading description - + beschrijving laden - + volume description unavailable - + volumebeschrijving niet beschikbaar SeriesQuestion - + no neen - + yes Ja You are trying to get information for various comics at once, are they part of the same series? - + Je probeert informatie voor verschillende strips tegelijk te krijgen. Maken ze deel uit van dezelfde serie? ServerConfigDialog - + Port Poort - + enable the server De server instellen - + set port Poort instellen - + Server connectivity information - + Informatie over serverconnectiviteit - + Scan it! - + Scan het! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader is beschikbaar voor iOS- en Android-apparaten.<br/>Ontdek het voor <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> of <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address - + Kies een IP-adres SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. - + + Please, sort the list of comics on the left until it matches the comics' information. + Sorteer de lijst met strips aan de linkerkant totdat deze overeenkomt met de informatie over de strips. - + sort comics to match comic information - + sorteer strips zodat ze overeenkomen met stripinformatie - + issues - + problemen - + remove selected comics - + verwijder geselecteerde strips - + restore all removed comics - + herstel alle verwijderde strips - TitleHeader + ThemeEditorDialog - - SEARCH - + + Theme Editor + Thema-editor - - - UpdateLibraryDialog - - Update library - Bibliotheek bijwerken + + + + + - - Cancel - Annuleren + + - + - - - Updating.... - Bijwerken.... + + i + ? - - - VolumeComicsModel - - title - + + Expand all + Alles uitvouwen - - - VolumesModel - - year - + + Collapse all + Alles samenvouwen - - issues - + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Houd ingedrukt om de geselecteerde waarde in de gebruikersinterface te laten knipperen (magenta / geschakeld / 0↔10). Loslaten herstelt het origineel. - - publisher - + + Search… + Zoekopdracht… - - - YACReader::TrayIconController - - &Restore - + + Light + Licht - - Systray - + + Dark + Donker - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - + + ID: + Identiteitskaart: - - - YACReader::WhatsNewDialog - - Close - + + Display name: + Weergavenaam: - - - YACReaderDeletingProgress - - cancel - annuleren + + Variant: + Variatie: - - Please wait, deleting in progress... - Even geduld, verwijderen ... + + Theme info + Thema-informatie - - - YACReaderFieldEdit - - Restore to default - Standaardwaarden herstellen + + Parameter + Instelwaarde - - - Click to overwrite - Klik hier om te overschrijven + + Value + Waarde - - - YACReaderFieldPlainTextEdit - - Restore to default - Standaardwaarden herstellen + + Save and apply + Opslaan en toepassen - - - - - Click to overwrite - Klik hier om te overschrijven + + Export to file... + Exporteren naar bestand... - - - YACReaderFlowConfigWidget - - CoverFlow look - Omslagbrowser uiterlijk + + Load from file... + Laden uit bestand... - - How to show covers: - Hoe omslagbladen bekijken: + + Close + Sluiten - - Stripe look - Brede band + + Double-click to edit color + Dubbelklik om de kleur te bewerken - - Overlapped Stripe look - Overlappende band + + + + + + + true + WAAR - - - YACReaderGLFlowConfigWidget - - Zoom - Zoom + + + + + false + vals - - Light - Licht + + Double-click to toggle + Dubbelklik om te schakelen - - Show advanced settings - Toon geavanceerde instellingen + + Double-click to edit value + Dubbelklik om de waarde te bewerken - - Roulette look - Roulette + + + + Edit: %1 + Bewerken: %1 - - Cover Angle - Omslag hoek + + Save theme + Thema opslaan - - Stripe look - Brede band + + + JSON files (*.json);;All files (*) + JSON-bestanden (*.json);;Alle bestanden (*) - - Position - Positie + + Save failed + Opslaan mislukt - - Z offset - Z- positie + + Could not open file for writing: +%1 + Kan bestand niet openen om te schrijven: +%1 - - Y offset - Y-positie + + Load theme + Thema laden - - Central gap - Centrale ruimte + + + + Load failed + Laden mislukt - - Presets: - Voorinstellingen: + + Could not open file: +%1 + Kan bestand niet openen: +%1 - - Overlapped Stripe look - Overlappende band + + Invalid JSON: +%1 + Ongeldige JSON: +%1 - - Modern look - Modern + + Expected a JSON object. + Er werd een JSON-object verwacht. + + + TitleHeader - - View angle - Kijkhoek + + SEARCH + ZOEKOPDRACHT + + + UpdateLibraryDialog - - Max angle - Maximale hoek + + Update library + Bibliotheek bijwerken - - Custom: - Aangepast: + + Cancel + Annuleren - - Classic look - Klassiek + + Updating.... + Bijwerken.... + + + Viewer - - Cover gap - Ruimte tss Omslag + + + Press 'O' to open comic. + Druk 'O' om een strip te openen. - - High Performance - Hoge Prestaties + + Not found + Niet gevonden - - Performance: - Prestatie: + + Comic not found + Strip niet gevonden - - Use VSync (improve the image quality in fullscreen mode, worse performance) - Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) + + Error opening comic + Fout bij openen strip - - Visibility - Zichtbaarheid + + CRC Error + CRC-fout - - Low Performance - Lage Prestaties + + Loading...please wait! + Inladen...even wachten! - - - YACReaderNavigationController - - No favorites - + + Page not available! + Pagina niet beschikbaar! - - You are not reading anything yet, come on!! - + + Cover! + Omslag! - - There are no recent comics! - + + Last page! + Laatste pagina! - YACReaderOptionsDialog + VolumeComicsModel - - Save - Bewaar + + title + titel - - - Use hardware acceleration (restart needed) - Gebruik hardware versnelling (opnieuw opstarten vereist) + + + VolumesModel + + + year + jaar + + + + issues + problemen + + + + publisher + uitgever + + + + YACReader3DFlowConfigWidget + + + Presets: + Voorinstellingen: + + + + Classic look + Klassiek + + + + Stripe look + Brede band + + + + Overlapped Stripe look + Overlappende band + + + + Modern look + Modern + + + + Roulette look + Roulette + + + + Show advanced settings + Toon geavanceerde instellingen + + + + Custom: + Aangepast: + + + + View angle + Kijkhoek + + + + Position + Positie + + + + Cover gap + Ruimte tss Omslag + + + + Central gap + Centrale ruimte + + + + Zoom + Vergroting + + + + Y offset + Y-positie + + + + Z offset + Z- positie + + + + Cover Angle + Omslag hoek + + + + Visibility + Zichtbaarheid + + + + Light + Licht + + + + Max angle + Maximale hoek + + + + Low Performance + Lage Prestaties + + + + High Performance + Hoge Prestaties + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) + + + + Performance: + Prestatie: + + + + YACReader::MainWindowViewer + + + &Open + &Openen + + + + Open a comic + Open een strip + + + + New instance + Nieuw exemplaar + + + + Open Folder + Map Openen + + + + Open image folder + Open afbeeldings map + + + + Open latest comic + Open de nieuwste strip + + + + Open the latest comic opened in the previous reading session + Open de nieuwste strip die in de vorige leessessie is geopend + + + + Clear + Duidelijk + + + + Clear open recent list + Wis geopende recente lijst + + + + Save + Bewaar + + + + + Save current page + Bewaren huidige pagina + + + + Previous Comic + Vorige Strip + + + + + + Open previous comic + Open de vorige strip + + + + Next Comic + Volgende Strip + + + + + + Open next comic + Open volgende strip + + + + &Previous + &Vorige + + + + + + Go to previous page + Ga naar de vorige pagina + + + + &Next + &Volgende + + + + + + Go to next page + Ga naar de volgende pagina + + + + Fit Height + Geschikte hoogte + + + + Fit image to height + Afbeelding aanpassen aan hoogte + + + + Fit Width + Vensterbreedte aanpassen + + + + Fit image to width + Afbeelding aanpassen aan breedte + + + + Show full size + Volledig Scherm + + + + Fit to page + Aanpassen aan pagina + + + + Continuous scroll + Continu scrollen + + + + Switch to continuous scroll mode + Schakel over naar de continue scrollmodus + + + + Reset zoom + Zoom opnieuw instellen + + + + Show zoom slider + Zoomschuifregelaar tonen + + + + Zoom+ + Inzoomen + + + + Zoom- + Uitzoomen + + + + Rotate image to the left + Links omdraaien + + + + Rotate image to the right + Rechts omdraaien + + + + Double page mode + Dubbele bladzijde modus + + + + Switch to double page mode + Naar dubbele bladzijde modus + + + + Double page manga mode + Manga-modus met dubbele pagina + + + + Reverse reading order in double page mode + Omgekeerde leesvolgorde in dubbele paginamodus + + + + Go To + Ga Naar + + + + Go to page ... + Ga naar bladzijde ... + + + + Options + Opties + + + + YACReader options + YACReader opties + + + + + Help + Hulp + + + + Help, About YACReader + Help, Over YACReader + + + + Magnifying glass + Vergrootglas + + + + Switch Magnifying glass + Overschakelen naar Vergrootglas + + + + Set bookmark + Bladwijzer instellen + + + + Set a bookmark on the current page + Een bladwijzer toevoegen aan de huidige pagina + + + + Show bookmarks + Bladwijzers weergeven + + + + Show the bookmarks of the current comic + Toon de bladwijzers van de huidige strip + + + + Show keyboard shortcuts + Toon de sneltoetsen + + + + Show Info + Info tonen + + + + Close + Sluiten + + + + Show Dictionary + Woordenlijst weergeven + + + + Show go to flow + "Ga naar Comic Flow" tonen + + + + Edit shortcuts + Snelkoppelingen bewerken + + + + &File + &Bestand + + + + + Open recent + Recent geopend + + + + File + Bestand - + + Edit + Bewerken + + + + View + Weergave + + + + Go + Gaan + + + + Window + Raam + + + + + + Open Comic + Open een Strip + + + + + + Comic files + Strip bestanden + + + + Open folder + Open een Map + + + + page_%1.jpg + pagina_%1.jpg + + + + Image files (*.jpg) + Afbeelding bestanden (*.jpg) + + + + + Comics + Strips + + + + + General + Algemeen + + + + + Magnifiying glass + Vergrootglas + + + + + Page adjustement + Pagina-aanpassing + + + + + Reading + Lezing + + + + Toggle fullscreen mode + Schakel de modus Volledig scherm in + + + + Hide/show toolbar + Werkbalk verbergen/tonen + + + + Size up magnifying glass + Vergrootglas vergroten + + + + Size down magnifying glass + Vergrootglas kleiner maken + + + + Zoom in magnifying glass + Zoom in vergrootglas + + + + Zoom out magnifying glass + Uitzoomen vergrootglas + + + + Reset magnifying glass + Vergrootglas opnieuw instellen + + + + Toggle between fit to width and fit to height + Schakel tussen Aanpassen aan breedte en Aanpassen aan hoogte + + + + Autoscroll down + Automatisch naar beneden scrollen + + + + Autoscroll up + Automatisch omhoog scrollen + + + + Autoscroll forward, horizontal first + Automatisch vooruit scrollen, eerst horizontaal + + + + Autoscroll backward, horizontal first + Automatisch achteruit scrollen, eerst horizontaal + + + + Autoscroll forward, vertical first + Automatisch vooruit scrollen, eerst verticaal + + + + Autoscroll backward, vertical first + Automatisch achteruit scrollen, eerst verticaal + + + + Move down + Ga naar beneden + + + + Move up + Ga omhoog + + + + Move left + Ga naar links + + + + Move right + Ga naar rechts + + + + Go to the first page + Ga naar de eerste pagina + + + + Go to the last page + Ga naar de laatste pagina + + + + Offset double page to the left + Dubbele pagina naar links verschoven + + + + Offset double page to the right + Offset dubbele pagina naar rechts + + + + There is a new version available + Er is een nieuwe versie beschikbaar + + + + Do you want to download the new version? + Wilt u de nieuwe versie downloaden? + + + + Remind me in 14 days + Herinner mij er over 14 dagen aan + + + + Not now + Niet nu + + + + YACReader::TrayIconController + + + &Restore + &Herstellen + + + + Systray + Systeemvak + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary blijft actief in het systeemvak. Om het programma te beëindigen, kiest u <b>Afsluiten</b> in het contextmenu van het systeemvakpictogram. + + + + YACReaderFieldEdit + + + Restore to default + Standaardwaarden herstellen + + + + + Click to overwrite + Klik hier om te overschrijven + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Standaardwaarden herstellen + + + + + + + Click to overwrite + Klik hier om te overschrijven + + + + YACReaderFlowConfigWidget + + CoverFlow look + Omslagbrowser uiterlijk + + + How to show covers: + Hoe omslagbladen bekijken: + + + Stripe look + Brede band + + + Overlapped Stripe look + Overlappende band + + + + YACReaderGLFlowConfigWidget + + Zoom + Vergroting + + + Light + Licht + + + Show advanced settings + Toon geavanceerde instellingen + + + Roulette look + Roulette + + + Cover Angle + Omslag hoek + + + Stripe look + Brede band + + + Position + Positie + + + Z offset + Z- positie + + + Y offset + Y-positie + + + Central gap + Centrale ruimte + + + Presets: + Voorinstellingen: + + + Overlapped Stripe look + Overlappende band + + + Modern look + Modern + + + View angle + Kijkhoek + + + Max angle + Maximale hoek + + + Custom: + Aangepast: + + + Classic look + Klassiek + + + Cover gap + Ruimte tss Omslag + + + High Performance + Hoge Prestaties + + + Performance: + Prestatie: + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) + + + Visibility + Zichtbaarheid + + + Low Performance + Lage Prestaties + + + + YACReaderOptionsDialog + + + Save + Bewaar + + + Use hardware acceleration (restart needed) + Gebruik hardware versnelling (opnieuw opstarten vereist) + + + Cancel Annuleren - + Edit shortcuts - + Snelkoppelingen bewerken - + Shortcuts - + Snelkoppelingen YACReaderSearchLineEdit - + type to search - + typ om te zoeken YACReaderSideBar - LIBRARIES - BIBLIOTHEKEN + BIBLIOTHEKEN - FOLDERS - MAPPEN + MAPPEN + + + + YACReaderSlider + + + Reset + Standaardwaarden terugzetten + + + YACReaderTranslator - - Libraries - + + YACReader translator + YACReader-vertaler - - Folders - + + + Translation + Vertaling - - Reading Lists - + + clear + duidelijk - - READING LISTS - + + Service not available + Dienst niet beschikbaar diff --git a/YACReaderLibrary/yacreaderlibrary_pt.ts b/YACReaderLibrary/yacreaderlibrary_pt.ts index f116002c4..e5e3ee717 100644 --- a/YACReaderLibrary/yacreaderlibrary_pt.ts +++ b/YACReaderLibrary/yacreaderlibrary_pt.ts @@ -6,90 +6,30 @@ None - + Nenhum AddLabelDialog - + Label name: - + Nome da etiqueta: - + Choose a color: - - - - - red - - - - - orange - - - - - yellow - - - - - green - - - - - cyan - - - - - blue - - - - - violet - - - - - purple - - - - - pink - - - - - white - - - - - light - - - - - dark - + Escolha uma cor: - + accept - + aceitar - + cancel - + cancelar @@ -100,7 +40,7 @@ Adicionar - + Add an existing library Adicionar uma biblioteca existente @@ -129,109 +69,249 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Antes de se conectar ao Comic Vine, você precisa de sua própria chave de API. Por favor, ganhe um <a href="http://www.comicvine.com/api/">aqui</a> grátis Paste here your Comic Vine API key - + Cole aqui sua chave API do Comic Vine Accept - + Aceitar + + + + AppearanceTabWidget + + + Color scheme + Esquema de cores + + + + System + Sistema + + + + Light + Luz + + + + Dark + Escuro + + + + Custom + Personalizado + + + + Remove + Remover + + + + Remove this user-imported theme + Remova este tema importado pelo usuário + + + + Light: + Luz: + + + + Dark: + Escuro: + + + + Custom: + Personalizado: + + + + Import theme... + Importar tema... + + + + Theme + Tema + + + + Theme editor + Editor de tema + + + + Open Theme Editor... + Abra o Editor de Tema... + + + + Theme editor error + Erro no editor de tema + + + + The current theme JSON could not be loaded. + O tema atual JSON não pôde ser carregado. + + + + Import theme + Importar tema + + + + JSON files (*.json);;All files (*) + Arquivos JSON (*.json);;Todos os arquivos (*) + + + + Could not import theme from: +%1 + Não foi possível importar o tema de: +%1 + + + + Could not import theme from: +%1 + +%2 + Não foi possível importar o tema de: +%1 + +%2 + + + + Import failed + Falha na importação + + + + BookmarksDialog + + + Lastest Page + Última Página + + + + Close + Fechar + + + + Click on any image to go to the bookmark + Clique em qualquer imagem para ir para o marcador + + + + + Loading... + Carregando... ClassicComicsView - + Hide comic flow - + Ocultar Comic Flow ComicInfoView - + + Characters + Personagens + + + Main character or team - + Personagem principal ou equipa - + Teams - + Equipas - + Locations - + Localizações - + Authors - + Autores - + writer - + argumentista - + penciller - + desenhador (lápis) - + inker - + arte-finalista - + colorist - + colorista - + letterer - + letreirista - + cover artist - + artista de capa - + editor - + editor - + imprint - + chancela editorial - + Publisher - + Editora - + color - + cor - + b/w - - - - - Characters - + p/b @@ -239,140 +319,148 @@ yes - + sim no - + não Title - + Título File Name - + Nome do arquivo Pages - + Páginas Size - + Tamanho Read - + Ler Current Page - + Página atual Publication Date - + Data de publicação Rating - + Avaliação Series - + Série Volume - + Tomo Story Arc - + Arco de história ComicVineDialog - + skip - + pular - + back - + voltar - + next - + próximo - + search - + procurar - + close - + fechar - - - + + + Looking for volume... - + Procurando volume... - - + + comic %1 of %2 - %3 - + história em quadrinhos %1 de %2 - %3 - + %1 comics selected - + %1 quadrinhos selecionados - + Error connecting to ComicVine - + Erro ao conectar-se ao ComicVine - - + + Retrieving tags for : %1 - + Recuperando tags para: %1 - + Retrieving volume info... - + Recuperando informações de volume... - + Looking for comic... - + Procurando quadrinhos... + + + + ContinuousPageWidget + + + Loading page %1 + Carregando página %1 CreateLibraryDialog - + Create new library Criar uma nova biblioteca @@ -399,17 +487,17 @@ Create a library could take several minutes. You can stop the process and update the library later for completing the task. - + Criar uma biblioteca pode levar vários minutos. Você pode interromper o processo e atualizar a biblioteca posteriormente para concluir a tarefa. - + Path not found - + Caminho não encontrado - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder - + O caminho selecionado não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta @@ -417,54 +505,43 @@ Restore defaults - + Restaurar padrões To change a shortcut, double click in the key combination and type the new keys. - + Para alterar um atalho, clique duas vezes na combinação de teclas e digite as novas teclas. Shortcuts settings - + Configurações de atalhos - + Shortcut in use - + Atalho em uso - - The shortcut "%1" is already assigned to other function - + + The shortcut "%1" is already assigned to other function + O atalho "%1" já está atribuído a outra função EmptyFolderWidget - - - Subfolders in this folder - - - - - Empty folder - - - - - Drag and drop folders and comics here - + + This folder doesn't contain comics yet + Esta pasta ainda não contém quadrinhos EmptyLabelWidget - - This label doesn't contain comics yet - + + This label doesn't contain comics yet + Este rótulo ainda não contém quadrinhos @@ -472,7 +549,25 @@ This reading list does not contain any comics yet - + Esta lista de leitura ainda não contém quadrinhos + + + + EmptySpecialListWidget + + + No favorites + Sem favoritos + + + + You are not reading anything yet, come on!! + Você ainda não está lendo nada, vamos lá!! + + + + There are no recent comics! + Não há quadrinhos recentes! @@ -490,27 +585,27 @@ Output file : - + Arquivo de saída: - + Export comics info - + Exportar informa??es dos quadrinhos - + Destination database name - + Nome do banco de dados de destino - + Problem found while writing - + Problema encontrado ao escrever - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - + O caminho selecionado para o arquivo de saída não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta @@ -531,24 +626,24 @@ Pasta de saída : - + Create covers package Criar pacote de capas - + Destination directory Diretório de destino - + Problem found while writing - + Problema encontrado ao escrever - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder - + O caminho selecionado para o arquivo de saída não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta @@ -561,59 +656,88 @@ CRC error on page (%1): some of the pages will not be displayed correctly - + Erro CRC na página (%1): algumas páginas não serão exibidas corretamente Unknown error opening the file - + Erro desconhecido ao abrir o arquivo Format not supported - + Formato não suportado FolderContentView - + Continue Reading... - + Continuar a ler... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Página : + + + + Go To + Ir Para + + + + Cancel + Cancelar + + + + + Total pages : + Total de páginas : + + + + Go to... + Ir para... + + + + GoToFlowToolBar + + + Page : + Página : GridComicsView - + Show info - + Mostrar informações HelpAboutDialog - + About - + Sobre - + Help - + Ajuda - + System info - + Informações do sistema @@ -626,22 +750,22 @@ Import comics info - + Importar informa??es dos quadrinhos Info database location : - + Localização do banco de dados de informações: Import - + Importar - + Comics info file (*.ydb) - + Arquivo de informações de quadrinhos (*.ydb) @@ -662,7 +786,7 @@ Desempacotar - + Compresed library covers (*.clc) Capas da biblioteca compactada (*.clc) @@ -677,7 +801,7 @@ Nome da Biblioteca : - + Extract a catalog Extrair um catálogo @@ -685,54 +809,54 @@ ImportWidget - + stop - + parar - + Some of the comics being added... - + Alguns dos quadrinhos sendo adicionados... - + Importing comics - + Importando quadrinhos - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> - + <p>YACReaderLibrary está criando uma nova biblioteca.</p><p>A criação de uma biblioteca pode levar vários minutos. Você pode interromper o processo e atualizar a biblioteca posteriormente para concluir a tarefa.</p> - + Updating the library - + Atualizando a biblioteca - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> - + <p>A biblioteca atual está sendo atualizada. Para atualizações mais rápidas, atualize suas bibliotecas com frequência.</p><p>Você pode interromper o processo e continuar atualizando esta biblioteca mais tarde.</p> - + Upgrading the library - + Atualizando a biblioteca - + <p>The current library is being upgraded, please wait.</p> - + <p>A biblioteca atual está sendo atualizada. Aguarde.</p> - + Scanning the library - + Digitalizando a biblioteca - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>A biblioteca atual está sendo verificada em busca de informações de metadados XML legados.</p><p>Isso só será necessário uma vez e somente se a biblioteca tiver sido criada com YACReaderLibrary 9.8.2 ou anterior.</p> @@ -742,7 +866,7 @@ Remover biblioteca atual da sua coleção - + Library Biblioteca @@ -759,27 +883,27 @@ Atualizar biblioteca atual - + Open folder... Abrir pasta... - - - + + + western manga (left to right) - + mangá ocidental (da esquerda para a direita) - - - + + + 4koma (top to botom) 4koma (top to botom - + 4koma (de cima para baixo) - + Do you want remove Você deseja remover @@ -796,7 +920,7 @@ Criar uma nova biblioteca - + YACReader Library Biblioteca YACReader @@ -809,18 +933,18 @@ Pacote de capas da biblioteca selecionada - - - + + + manga - + mangá - - - + + + comic - + cômico Help, About YACReader @@ -839,802 +963,806 @@ Abrir a pasta contendo... - + Are you sure? Você tem certeza? - + Rescan library for XML info - + Reanalisar biblioteca para informa??es XML - + Set as read - + Definir como lido - - + + Set as unread - + Definir como não lido - - - + + + web comic - + quadrinhos da web - + Add new folder - + Adicionar nova pasta - + Delete folder - + Excluir pasta - + Set as uncompleted - + Definir como incompleto - + Set as completed - + Definir como concluído - + Update folder - + Atualizar pasta - + Folder - + Pasta - + Comic - + Quadrinhos - + Upgrade failed - + Falha na atualização - + There were errors during library upgrade in: - + Ocorreram erros durante a atualização da biblioteca em: - + Update needed - + Atualização necessária - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? - + Esta biblioteca foi criada com uma versão anterior do YACReaderLibrary. Ele precisa ser atualizado. Atualizar agora? - + Download new version - + Baixe a nova versão - + This library was created with a newer version of YACReaderLibrary. Download the new version now? - + Esta biblioteca foi criada com uma versão mais recente do YACReaderLibrary. Baixe a nova versão agora? - + Library not available - + Biblioteca não disponível - - Library '%1' is no longer available. Do you want to remove it? - + + Library '%1' is no longer available. Do you want to remove it? + A biblioteca '%1' não está mais disponível. Você quer removê-lo? - + Old library - + Biblioteca antiga - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + A biblioteca '%1' foi criada com uma versão mais antiga do YACReaderLibrary. Deve ser criado novamente. Deseja criar a biblioteca agora? - - + + Copying comics... - + Copiando quadrinhos... - - + + Moving comics... - + Quadrinhos em movimento... - + Folder name: - + Nome da pasta: - + No folder selected - + Nenhuma pasta selecionada - + Please, select a folder first - + Por favor, selecione uma pasta primeiro - + Error in path - + Erro no caminho - - There was an error accessing the folder's path - + + There was an error accessing the folder's path + Ocorreu um erro ao acessar o caminho da pasta - + The selected folder and all its contents will be deleted from your disk. Are you sure? - + A pasta selecionada e todo o seu conteúdo serão excluídos do disco. Tem certeza? - - + + Unable to delete - + Não foi possível excluir - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - + Ocorreu um problema ao tentar excluir as pastas selecionadas. Por favor, verifique as permissões de gravação e certifique-se de que algum aplicativo esteja usando essas pastas ou qualquer um dos arquivos contidos. - + Add new reading lists - + Adicione novas listas de leitura - - + + List name: - + Nome da lista: - + Delete list/label - + Excluir lista/rótulo - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? - + O item selecionado será excluído, seus quadrinhos ou pastas NÃO serão excluídos do disco. Tem certeza? - + Rename list name - + Renomear nome da lista - - - - + + + + Set type - + Definir tipo - + Set custom cover - + Definir capa personalizada - + Delete custom cover - + Excluir capa personalizada - + Save covers - + Salvar capas - + You are adding too many libraries. - + Você está adicionando muitas bibliotecas. - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. - + Você está adicionando muitas bibliotecas. + +Você provavelmente só precisa de uma biblioteca em sua pasta de quadrinhos de nível superior. Você pode navegar em qualquer subpasta usando a seção de pastas na barra lateral esquerda. + +YACReaderLibrary não impedirá você de criar mais bibliotecas, mas você deve manter o número de bibliotecas baixo. - - + + YACReader not found - + YACReader não encontrado - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader não encontrado. YACReader deve ser instalado na mesma pasta que YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. - + YACReader não encontrado. Pode haver um problema com a instalação do YACReader. - + Error - + Erro - + Error opening comic with third party reader. - + Erro ao abrir o quadrinho com leitor de terceiros. - + Library not found - + Biblioteca não encontrada - - The selected folder doesn't contain any library. - + + The selected folder doesn't contain any library. + A pasta selecionada não contém nenhuma biblioteca. - + library? - + biblioteca? - + Remove and delete metadata - + Remover e excluir metadados - + Library info - + Informações da biblioteca - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - + Ocorreu um problema ao tentar excluir os quadrinhos selecionados. Por favor, verifique as permissões de gravação nos arquivos selecionados ou na pasta que os contém. - + Assign comics numbers - + Atribuir números de quadrinhos - + Assign numbers starting in: - + Atribua números começando em: - + Invalid image - + Imagem inválida - + The selected file is not a valid image. - + O arquivo selecionado não é uma imagem válida. - + Error saving cover - + Erro ao salvar a capa - + There was an error saving the cover image. - + Ocorreu um erro ao salvar a imagem da capa. - + Error creating the library - + Erro ao criar a biblioteca - + Error updating the library - + Erro ao atualizar a biblioteca - + Error opening the library - + Erro ao abrir a biblioteca - + Delete comics - + Excluir quadrinhos - + All the selected comics will be deleted from your disk. Are you sure? - + Todos os quadrinhos selecionados serão excluídos do seu disco. Tem certeza? - + Remove comics - + Remover quadrinhos - + Comics will only be deleted from the current label/list. Are you sure? - + Os quadrinhos serão excluídos apenas do rótulo/lista atual. Tem certeza? - + Library name already exists - + O nome da biblioteca já existe - - There is another library with the name '%1'. - + + There is another library with the name '%1'. + Existe outra biblioteca com o nome '%1'. LibraryWindowActions - + Create a new library - Criar uma nova biblioteca + Criar uma nova biblioteca - + Open an existing library - Abrir uma biblioteca existente + Abrir uma biblioteca existente - - + + Export comics info - + Exportar informa??es dos quadrinhos - - + + Import comics info - + Importar informa??es dos quadrinhos - + Pack covers - + Empacotar capas - + Pack the covers of the selected library - Pacote de capas da biblioteca selecionada + Pacote de capas da biblioteca selecionada - + Unpack covers - + Desempacotar capas - + Unpack a catalog - Desempacotar um catálogo + Desempacotar um catálogo - + Update library - + Atualizar biblioteca - + Update current library - Atualizar biblioteca atual + Atualizar biblioteca atual - + Rename library - + Renomear biblioteca - + Rename current library - Renomear biblioteca atual + Renomear biblioteca atual - + Remove library - + Remover biblioteca - + Remove current library from your collection - Remover biblioteca atual da sua coleção + Remover biblioteca atual da sua coleção - + Rescan library for XML info - + Reanalisar biblioteca para informa??es XML - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Tenta encontrar informações XML incorporadas em arquivos de quadrinhos. Você só precisa fazer isso se a biblioteca foi criada com versões 9.8.2 ou anteriores ou se você estiver usando software de terceiros para incorporar informações XML nos arquivos. - + Show library info - + Mostrar informa??es da biblioteca - + Show information about the current library - + Mostrar informações sobre a biblioteca atual - + Open current comic - + Abrir quadrinho atual - + Open current comic on YACReader - Abrir quadrinho atual no YACReader + Abrir quadrinho atual no YACReader - + Save selected covers to... - + Salvar capas selecionadas em... - + Save covers of the selected comics as JPG files - + Salve as capas dos quadrinhos selecionados como arquivos JPG - - + + Set as read - + Definir como lido - + Set comic as read - + Definir quadrinhos como lidos - - + + Set as unread - + Definir como não lido - + Set comic as unread - + Definir quadrinhos como não lidos - - + + manga - + mangá - + Set issue as manga - + Definir problema como mangá - - + + comic - + cômico - + Set issue as normal - + Defina o problema como normal - + western manga - + mangá ocidental - + Set issue as western manga - + Definir problema como mangá ocidental - - + + web comic - + quadrinhos da web - + Set issue as web comic - + Definir o problema como web comic - - + + yonkoma - + tira yonkoma - + Set issue as yonkoma - + Definir problema como yonkoma - + Show/Hide marks - + Mostrar/ocultar marcas - + Show or hide read marks - + Mostrar ou ocultar marcas de leitura - + Show/Hide recent indicator - + Mostrar/ocultar indicador recente - + Show or hide recent indicator - + Mostrar ou ocultar indicador recente - - + + Fullscreen mode on/off - + Modo tela cheia ativado/desativado - + Help, About YACReader - Ajuda, Sobre o YACReader + Ajuda, Sobre o YACReader - + Add new folder - + Adicionar nova pasta - + Add new folder to the current library - + Adicionar nova pasta à biblioteca atual - + Delete folder - + Excluir pasta - + Delete current folder from disk - + Exclua a pasta atual do disco - + Select root node - Selecionar raiz + Selecionar raiz - + Expand all nodes - Expandir todos + Expandir todos - + Collapse all nodes - + Recolher todos os nós - + Show options dialog - Mostrar opções + Mostrar opções - + Show comics server options dialog - + Mostrar caixa de diálogo de opções do servidor de quadrinhos - - + + Change between comics views - + Alterar entre visualizações de quadrinhos - + Open folder... - Abrir pasta... + Abrir pasta... - + Set as uncompleted - + Definir como incompleto - + Set as completed - + Definir como concluído - + Set custom cover - + Definir capa personalizada - + Delete custom cover - + Excluir capa personalizada - + western manga (left to right) - + mangá ocidental (da esquerda para a direita) - + Open containing folder... - Abrir a pasta contendo... + Abrir a pasta contendo... - + Reset comic rating - + Redefinir classificação de quadrinhos - + Select all comics - + Selecione todos os quadrinhos - + Edit - + Editar - + Assign current order to comics - + Atribuir ordem atual aos quadrinhos - + Update cover - + Atualizar capa - + Delete selected comics - + Excluir quadrinhos selecionados - + Delete metadata from selected comics - + Excluir metadados dos quadrinhos selecionados - + Download tags from Comic Vine - + Baixe tags do Comic Vine - + Focus search line - + Linha de pesquisa de foco - + Focus comics view - + Visualização de quadrinhos em foco - + Edit shortcuts - + Editar atalhos - + &Quit - + &Qfato - + Update folder - + Atualizar pasta - + Update current folder - + Atualizar pasta atual - + Scan legacy XML metadata - + Digitalize metadados XML legados - + Add new reading list - + Adicionar nova lista de leitura - + Add a new reading list to the current library - + Adicione uma nova lista de leitura à biblioteca atual - + Remove reading list - + Remover lista de leitura - + Remove current reading list from the library - + Remover lista de leitura atual da biblioteca - + Add new label - + Adicionar novo rótulo - + Add a new label to this library - + Adicione um novo rótulo a esta biblioteca - + Rename selected list - + Renomear lista selecionada - + Rename any selected labels or lists - + Renomeie quaisquer rótulos ou listas selecionados - + Add to... - + Adicionar à... - + Favorites - + Favoritos - + Add selected comics to favorites list - + Adicione quadrinhos selecionados à lista de favoritos @@ -1642,559 +1770,746 @@ YACReaderLibrary will not stop you from creating more libraries but you should k file name - + nome do arquivo - LogWindow - - - Log window - - - - - &Pause - - - - - &Save - - + NoLibrariesWidget - - C&lear - + + You don't have any libraries yet + Você ainda não tem nenhuma biblioteca - - &Copy - + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Você pode criar uma biblioteca em qualquer pasta, YACReaderLibrary importará todos os quadrinhos e pastas desta pasta. Se você já criou alguma biblioteca, poderá abri-la.</p><p>Não se esqueça de que você pode usar o YACReader como um aplicativo independente para ler quadrinhos em seu computador.</p> - - Level: - + + create your first library + crie sua primeira biblioteca - - &Auto scroll - + + add an existing one + adicione um existente - NoLibrariesWidget + NoSearchResultsWidget - - You don't have any libraries yet - + + No results + Nenhum resultado + + + OptionsDialog - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> - + + + Language + Idioma - - create your first library - + + + Application language + Idioma do aplicativo - - add an existing one - + + + System default + Padrão do sistema - - - OptionsDialog - + Tray icon settings (experimental) - + Configurações do ícone da bandeja (experimental) - + Close to tray - + Perto da bandeja - + Start into the system tray - + Comece na bandeja do sistema - + Edit Comic Vine API key - + Editar chave da API Comic Vine - + Comic Vine API key - + Chave de API do Comic Vine - + ComicInfo.xml legacy support - + Suporte legado ComicInfo.xml - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Importe metadados de ComicInfo.xml ao adicionar novos quadrinhos - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + Considere itens 'recentes' adicionados ou atualizados há X dias - + Third party reader - + Leitor de terceiros - + Write {comic_file_path} where the path should go in the command - + Escreva {comic_file_path} onde o caminho deve ir no comando - + + Clear - + Claro - + Update libraries at startup - + Atualizar bibliotecas na inicialização - + Try to detect changes automatically - + Tente detectar alterações automaticamente - + Update libraries periodically - + Atualize bibliotecas periodicamente - + Interval: - + Intervalo: - + 30 minutes - + 30 minutos - + 1 hour - + 1 hora - + 2 hours - + 2 horas - + 4 hours - + 4 horas - + 8 hours - + 8 horas - + 12 hours - + 12 horas - + daily - + diário - + Update libraries at certain time - + Atualizar bibliotecas em determinado momento - + Time: - + Tempo: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + AVISO! Durante as atualizações da biblioteca, as gravações no banco de dados são desativadas! +Não agende atualizações enquanto estiver usando o aplicativo ativamente. +Durante as atualizações automáticas, o aplicativo bloqueará algumas ações até que a atualização seja concluída. +Para interromper uma atualização automática, toque no indicador de carregamento próximo ao título Bibliotecas. - + Modifications detection - + Detecção de modificações - + Compare the modified date of files when updating a library (not recommended) - + Compare a data de modificação dos arquivos ao atualizar uma biblioteca (não recomendado) - + Enable background image - + Ativar imagem de fundo - + Opacity level - + Nível de opacidade - + Blur level - + Nível de desfoque - + Use selected comic cover as background - + Use a capa de quadrinhos selecionada como plano de fundo - + Restore defautls - + Restaurar padrões - + Background - + Fundo - + Display continue reading banner - + Exibir banner para continuar lendo - + Display current comic banner - + Exibir banner de quadrinhos atual - + Continue reading - + Continuar lendo - + Comic Flow - + Comic Flow - - + + Libraries - + Bibliotecas - + Grid view - + Visualização em grade - + + General - + Em geral + + + + + Appearance + Aparência - + + Options - + Opções - - - PropertiesDialog - - General info - + + My comics path + Meu caminho de quadrinhos - - Authors - + + Display + Mostrar - - Publishing - + + Show time in current page information label + Mostrar hora no rótulo de informações da página atual - - Plot - + + "Go to flow" size + Tamanho de "Ir para Comic Flow" - - Notes - + + Background color + Cor de fundo - - Cover page - + + Choose + Escolher - - Load previous page as cover - + + Scroll behaviour + Comportamento de rolagem - - Load next page as cover - + + Disable scroll animations and smooth scrolling + Desative animações de rolagem e rolagem suave - - Reset cover to the default image - + + Do not turn page using scroll + Não vire a página usando scroll - - Load custom cover image - + + Use single scroll step to turn page + Use uma única etapa de rolagem para virar a página - - Series: - + + Mouse mode + Modo mouse - - Title: - + + Only Back/Forward buttons can turn pages + Apenas os botões Voltar/Avançar podem virar páginas - + + Use the Left/Right buttons to turn pages. + Use os botões Esquerda/Direita para virar as páginas. + + + + Click left or right half of the screen to turn pages. + Clique na metade esquerda ou direita da tela para virar as páginas. + + + + Quick Navigation Mode + Modo de navegação rápida + + + + Disable mouse over activation + Desativar ativação do mouse sobre + + + + Brightness + Brilho + + + + Contrast + Contraste + + + + Gamma + Gama + + + + Reset + Reiniciar + + + + Image options + Opções de imagem + + + + Fit options + Opções de ajuste + + + + Enlarge images to fit width/height + Amplie as imagens para caber na largura/altura + + + + Double Page options + Opções de página dupla + + + + Show covers as single page + Mostrar capas como página única + + + + Scaling + Dimensionamento + + + + Scaling method + Método de dimensionamento + + + + Nearest (fast, low quality) + Mais próximo (rápido, baixa qualidade) + + + + Bilinear + Interpola??o bilinear + + + + Lanczos (better quality) + Lanczos (melhor qualidade) + + + + Page Flow + Fluxo de página + + + + Image adjustment + Ajuste de imagem + + + + + Restart is needed + Reiniciar é necessário + + + + Comics directory + Diretório de quadrinhos + + + + PropertiesDialog + + + General info + Informações gerais + + + + Authors + Autores + + + + Publishing + Publicação + + + + Plot + Trama + + + + Notes + Notas + + + + Cover page + Página de rosto + + + + Load previous page as cover + Carregar página anterior como capa + + + + Load next page as cover + Carregar a próxima página como capa + + + + Reset cover to the default image + Redefinir a capa para a imagem padrão + + + + Load custom cover image + Carregar imagem de capa personalizada + + + + Series: + Série: + + + + Title: + Título: + + + of: - + de: Issue number: - + Número de emissão: Volume: - + Tomo: Arc number: - + Número do arco: Story arc: - + Arco da história: alt. number: - + alt. número: Alternate series: - + Série alternativa: Series Group: - + Grupo de séries: Genre: - + Gênero: Size: - + Tamanho: Writer(s): - + Escritor(es): Penciller(s): - + Desenhador(es): Inker(s): - + Tinteiro(s): Colorist(s): - + Colorista(s): Letterer(s): - + Letrista(s): Cover Artist(s): - + Artista(s) da capa: Editor(s): - + Editor(es): Imprint: - + Imprimir: Day: - + Dia: Month: - + Mês: Year: - + Ano: Publisher: - + Editor: Format: - + Formatar: Color/BW: - + Cor/PB: Age rating: - + Classificação etária: Type: - + Tipo: Language (ISO): - + Idioma (ISO): Synopsis: - + Sinopse: Characters: - + Personagens: Teams: - + Equipes: Locations: - + Locais: Main character or team: - + Personagem principal ou equipe: Review: - + Análise: Notes: - + Notas: Tags: - + Etiquetas: - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Link do Comic Vine: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> visualizar </a> Not found - + Não encontrado Comic not found. You should update your library. - + Quadrinho não encontrado. Você deve atualizar sua biblioteca. Edit selected comics information - + Edite as informações dos quadrinhos selecionados Invalid cover - + Capa inválida The image is invalid. - + A imagem é inválida. Edit comic information - + Editar informações dos quadrinhos + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer é a versão sem cabeça (sem interface gráfica) do YACReaderLibrary. + +Este aplicativo suporta configurações persistentes, para configurá-las edite este arquivo %1 +Para saber mais sobre as configurações disponíveis, verifique a documentação em https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md @@ -2202,99 +2517,83 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 7z lib not found - + Biblioteca 7z não encontrada unable to load 7z lib from ./utils - + não é possível carregar 7z lib de ./utils Trace - + Rastreamento Debug - + Depurar Info - + Informações Warning - + Aviso Error - + Erro Fatal - + Cr?tico - + Select custom cover - + Selecione a capa personalizada - + Images (%1) - - - - - QsLogging::LogWindowModel - - - Time - - - - - Level - + Imagens (%1) - - Message - + + The file could not be read or is not valid JSON. + O arquivo não pôde ser lido ou não é JSON válido. - - - QsLogging::Window - - &Pause - + + This theme is for %1, not %2. + Este tema é para %1, não %2. - - &Resume - + + Libraries + Bibliotecas - - Save log - + + Folders + Pastas - - Log file (*.log) - + + Reading Lists + Listas de leitura RenameLibraryDialog - + Rename current library Renomear biblioteca atual @@ -2317,20 +2616,20 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of volumes found : %1 - + Número de volumes encontrados: %1 - - + + page %1 of %2 - + página %1 de %2 - + Number of %1 found : %2 - + Número de %1 encontrado: %2 @@ -2339,17 +2638,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - + Forneça algumas informações adicionais para esta história em quadrinhos. - + Series: - + Série: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Use a pesquisa de correspondência exata. Desative se quiser encontrar volumes que correspondam a algumas das palavras do nome. @@ -2357,83 +2656,83 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information. - + Forneça algumas informações adicionais. - + Series: - + Série: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Use a pesquisa de correspondência exata. Desative se quiser encontrar volumes que correspondam a algumas das palavras do nome. SelectComic - + Please, select the right comic info. - + Por favor, selecione as informações corretas dos quadrinhos. - + comics - + quadrinhos - + loading cover - + tampa de carregamento - + loading description - + descrição de carregamento - + comic description unavailable - + descrição do quadrinho indisponível SelectVolume - + Please, select the right series for your comic. - + Por favor, selecione a série certa para o seu quadrinho. - + Filter: - + Filtro: - + volumes - + tomos - + Nothing found, clear the filter if any. - + Nada encontrado, limpe o filtro, se houver. - + loading cover - + tampa de carregamento - + loading description - + descrição de carregamento - + volume description unavailable - + descrição do volume indisponível @@ -2441,432 +2740,1153 @@ To stop an automatic update tap on the loading indicator next to the Libraries t You are trying to get information for various comics at once, are they part of the same series? - + Você está tentando obter informações sobre vários quadrinhos ao mesmo tempo. Eles fazem parte da mesma série? - + yes - + sim - + no - + não ServerConfigDialog - + set port - + definir porta - + Server connectivity information - + Informações de conectividade do servidor - + Scan it! - + Digitalize! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + O YACReader está disponível para dispositivos iOS e Android.<br/>Descubra-o para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> ou <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address - + Escolha um endereço IP - + Port - + Porta - + enable the server - + habilitar o servidor SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. - + + Please, sort the list of comics on the left until it matches the comics' information. + Por favor, classifique a lista de quadrinhos à esquerda até que corresponda às informações dos quadrinhos. - + sort comics to match comic information - + classifique os quadrinhos para corresponder às informações dos quadrinhos - + issues - + problemas - + remove selected comics - + remover quadrinhos selecionados - + restore all removed comics - + restaurar todos os quadrinhos removidos - TitleHeader + ThemeEditorDialog - - SEARCH - + + Theme Editor + Editor de Tema - - - UpdateLibraryDialog - - Cancel - Cancelar + + + + + - - Updating.... - Atualizando.... + + - + - - - Update library - + + i + eu - - - VolumeComicsModel - - title - + + Expand all + Expandir tudo - - - VolumesModel - - year - + + Collapse all + Recolher tudo - - issues - + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Segure para piscar o valor selecionado na UI (magenta/alternado/0↔10). Os lançamentos restauram o original. - - publisher - + + Search… + Procurar… - - - YACReader::TrayIconController - - &Restore - + + Light + Luz - - Systray - + + Dark + Escuro - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - + + ID: + EU IA: - - - YACReader::WhatsNewDialog - - Close - + + Display name: + Nome de exibição: - - - YACReaderDeletingProgress - - Please wait, deleting in progress... - + + Variant: + Variante: - - cancel - + + Theme info + Informações do tema - - - YACReaderFieldEdit - - - Click to overwrite - + + Parameter + Parâmetro - - Restore to default - + + Value + Valor - - - YACReaderFieldPlainTextEdit - - - - - Click to overwrite - + + Save and apply + Salvar e aplicar - - Restore to default - + + Export to file... + Exportar para arquivo... - - - YACReaderFlowConfigWidget - - CoverFlow look - Olhar capa cheia + + Load from file... + Carregar do arquivo... - - How to show covers: - Como mostrar capas: + + Close + Fechar - - Stripe look - Olhar lista + + Double-click to edit color + Clique duas vezes para editar a cor - - Overlapped Stripe look - Olhar lista sobreposta + + + + + + + true + verdadeiro - - - YACReaderGLFlowConfigWidget - - Stripe look - Olhar lista + + + + + false + falso - - Overlapped Stripe look - Olhar lista sobreposta + + Double-click to toggle + Clique duas vezes para alternar - - Presets: - + + Double-click to edit value + Clique duas vezes para editar o valor - - Classic look - + + + + Edit: %1 + Editar: %1 - - Modern look - + + Save theme + Salvar tema - - Roulette look - + + + JSON files (*.json);;All files (*) + Arquivos JSON (*.json);;Todos os arquivos (*) - - Show advanced settings - + + Save failed + Falha ao salvar - - Custom: - + + Could not open file for writing: +%1 + Não foi possível abrir o arquivo para gravação: +%1 - - View angle - + + Load theme + Carregar tema - - Position - + + + + Load failed + Falha no carregamento - - Cover gap - + + Could not open file: +%1 + Não foi possível abrir o arquivo: +%1 - - Central gap - + + Invalid JSON: +%1 + JSON inválido: +%1 - - Zoom - + + Expected a JSON object. + Esperava um objeto JSON. + + + TitleHeader - - Y offset - + + SEARCH + PROCURAR + + + UpdateLibraryDialog - - Z offset - + + Cancel + Cancelar - - Cover Angle - + + Updating.... + Atualizando.... - - Visibility - + + Update library + Atualizar biblioteca + + + Viewer - - Light - + + + Press 'O' to open comic. + Pressione 'O' para abrir um quadrinho. - - Max angle - + + Not found + Não encontrado - - Low Performance - + + Comic not found + Quadrinho não encontrado - - High Performance - + + Error opening comic + Erro ao abrir quadrinho - - Use VSync (improve the image quality in fullscreen mode, worse performance) - + + CRC Error + Erro CRC - - Performance: - + + Loading...please wait! + Carregando... por favor, aguarde! - - - YACReaderNavigationController - - No favorites - + + Page not available! + Página não disponível! - - You are not reading anything yet, come on!! - + + Cover! + Cobrir! - - There are no recent comics! - + + Last page! + Última página! - YACReaderOptionsDialog + VolumeComicsModel - - Save - Salvar + + title + título + + + VolumesModel - - Cancel - Cancelar + + year + ano - - Edit shortcuts - + + issues + problemas - - Shortcuts - + + publisher + editor - - - Use hardware acceleration (restart needed) - + + + YACReader3DFlowConfigWidget + + + Presets: + Predefinições: + + + + Classic look + Aparência clássica + + + + Stripe look + Olhar lista + + + + Overlapped Stripe look + Olhar lista sobreposta + + + + Modern look + Aparência moderna + + + + Roulette look + Aparência de roleta + + + + Show advanced settings + Mostrar configurações avançadas + + + + Custom: + Personalizado: + + + + View angle + Ângulo de visão + + + + Position + Posição + + + + Cover gap + Cubra a lacuna + + + + Central gap + Lacuna central + + + + Zoom + Amplia??o + + + + Y offset + Deslocamento Y + + + + Z offset + Deslocamento Z + + + + Cover Angle + Ângulo de cobertura + + + + Visibility + Visibilidade + + + + Light + Luz + + + + Max angle + Ângulo máximo + + + + Low Performance + Baixo desempenho + + + + High Performance + Alto desempenho + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Use VSync (melhora a qualidade da imagem em modo tela cheia, pior desempenho) + + + + Performance: + Desempenho: - YACReaderSearchLineEdit + YACReader::MainWindowViewer - - type to search - + + &Open + &Abrir + + + + Open a comic + Abrir um quadrinho + + + + New instance + Nova instância + + + + Open Folder + Abrir Pasta + + + + Open image folder + Abra a pasta de imagens + + + + Open latest comic + Abra o último quadrinho + + + + Open the latest comic opened in the previous reading session + Abra o último quadrinho aberto na sessão de leitura anterior + + + + Clear + Claro + + + + Clear open recent list + Limpar lista recente aberta + + + + Save + Salvar + + + + + Save current page + Salvar página atual + + + + Previous Comic + Quadrinho Anterior + + + + + + Open previous comic + Abrir quadrinho anterior + + + + Next Comic + Próximo Quadrinho + + + + + + Open next comic + Abrir próximo quadrinho + + + + &Previous + A&nterior + + + + + + Go to previous page + Ir para a página anterior + + + + &Next + &Próxima + + + + + + Go to next page + Ir para a próxima página + + + + Fit Height + Ajustar Altura + + + + Fit image to height + Ajustar imagem à altura + + + + Fit Width + Ajustar à Largura + + + + Fit image to width + Ajustar imagem à largura + + + + Show full size + Mostrar tamanho grande + + + + Fit to page + Ajustar à página + + + + Continuous scroll + Rolagem contínua + + + + Switch to continuous scroll mode + Mudar para o modo de rolagem contínua + + + + Reset zoom + Redefinir zoom + + + + Show zoom slider + Mostrar controle deslizante de zoom + + + + Zoom+ + Ampliar + + + + Zoom- + Reduzir + + + + Rotate image to the left + Girar imagem à esquerda + + + + Rotate image to the right + Girar imagem à direita + + + + Double page mode + Modo dupla página + + + + Switch to double page mode + Alternar para o modo dupla página + + + + Double page manga mode + Modo mangá de página dupla + + + + Reverse reading order in double page mode + Ordem de leitura inversa no modo de página dupla + + + + Go To + Ir Para + + + + Go to page ... + Ir para a página... + + + + Options + Opções + + + + YACReader options + Opções do YACReader + + + + + Help + Ajuda + + + + Help, About YACReader + Ajuda, Sobre o YACReader + + + + Magnifying glass + Lupa + + + + Switch Magnifying glass + Alternar Lupa + + + + Set bookmark + Definir marcador + + + + Set a bookmark on the current page + Definir um marcador na página atual + + + + Show bookmarks + Mostrar marcadores + + + + Show the bookmarks of the current comic + Mostrar os marcadores do quadrinho atual + + + + Show keyboard shortcuts + Mostrar teclas de atalhos + + + + Show Info + Mostrar Informações + + + + Close + Fechar + + + + Show Dictionary + Mostrar dicionário + + + + Show go to flow + Mostrar "Ir para Comic Flow" + + + + Edit shortcuts + Editar atalhos + + + + &File + &Arquivo + + + + + Open recent + Abrir recente + + + + File + Arquivo + + + + Edit + Editar + + + + View + Visualizar + + + + Go + Ir + + + + Window + Janela + + + + + + Open Comic + Abrir Quadrinho + + + + + + Comic files + Arquivos de quadrinhos + + + + Open folder + Abrir pasta + + + + page_%1.jpg + página_%1.jpg + + + + Image files (*.jpg) + Arquivos de imagem (*.jpg) + + + + + Comics + Quadrinhos + + + + + General + Em geral + + + + + Magnifiying glass + Lupa + + + + + Page adjustement + Ajuste de página + + + + + Reading + Leitura + + + + Toggle fullscreen mode + Alternar modo de tela cheia + + + + Hide/show toolbar + Ocultar/mostrar barra de ferramentas + + + + Size up magnifying glass + Dimensione a lupa + + + + Size down magnifying glass + Diminuir o tamanho da lupa + + + + Zoom in magnifying glass + Zoom na lupa + + + + Zoom out magnifying glass + Diminuir o zoom da lupa + + + + Reset magnifying glass + Redefinir lupa + + + + Toggle between fit to width and fit to height + Alternar entre ajustar à largura e ajustar à altura + + + + Autoscroll down + Rolagem automática para baixo + + + + Autoscroll up + Rolagem automática para cima + + + + Autoscroll forward, horizontal first + Rolagem automática para frente, horizontal primeiro + + + + Autoscroll backward, horizontal first + Rolagem automática para trás, horizontal primeiro + + + + Autoscroll forward, vertical first + Rolagem automática para frente, vertical primeiro + + + + Autoscroll backward, vertical first + Rolagem automática para trás, vertical primeiro + + + + Move down + Mover para baixo + + + + Move up + Subir + + + + Move left + Mover para a esquerda + + + + Move right + Mover para a direita + + + + Go to the first page + Vá para a primeira página + + + + Go to the last page + Ir para a última página + + + + Offset double page to the left + Deslocar página dupla para a esquerda + + + + Offset double page to the right + Deslocar página dupla para a direita + + + + There is a new version available + Há uma nova versão disponível + + + + Do you want to download the new version? + Você deseja baixar a nova versão? + + + + Remind me in 14 days + Lembre-me em 14 dias + + + + Not now + Agora não - YACReaderSideBar + YACReader::TrayIconController - - Libraries - + + &Restore + &Rloja - - Folders - + + Systray + Bandeja do sistema - - Reading Lists - + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuará em execução na bandeja do sistema. Para encerrar o programa, escolha <b>Sair</b> no menu de contexto do ícone da bandeja do sistema. + + + + YACReaderFieldEdit + + + + Click to overwrite + Clique para substituir + + + + Restore to default + Restaurar para o padrão + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Clique para substituir + + + + Restore to default + Restaurar para o padrão + + + + YACReaderFlowConfigWidget + + CoverFlow look + Olhar capa cheia + + + How to show covers: + Como mostrar capas: + + + Stripe look + Olhar lista + + + Overlapped Stripe look + Olhar lista sobreposta + + + + YACReaderGLFlowConfigWidget + + Stripe look + Olhar lista + + + Overlapped Stripe look + Olhar lista sobreposta + + + + YACReaderOptionsDialog + + + Save + Salvar + + + + Cancel + Cancelar + + + + Edit shortcuts + Editar atalhos + + + + Shortcuts + Atalhos + + + + YACReaderSearchLineEdit + + + type to search + digite para pesquisar + + + + YACReaderSlider + + + Reset + Reiniciar + + + + YACReaderTranslator + + + YACReader translator + Tradutor YACReader - - LIBRARIES - + + + Translation + Tradução - - FOLDERS - + + clear + claro - - READING LISTS - + + Service not available + Serviço não disponível diff --git a/YACReaderLibrary/yacreaderlibrary_ru.ts b/YACReaderLibrary/yacreaderlibrary_ru.ts index d99a7977b..80745af3a 100644 --- a/YACReaderLibrary/yacreaderlibrary_ru.ts +++ b/YACReaderLibrary/yacreaderlibrary_ru.ts @@ -6,88 +6,76 @@ None - + Никто AddLabelDialog - red - красный + красный - blue - синий + синий - dark - темный + темный - cyan - голубой + голубой - pink - розовый + розовый - green - зеленый + зеленый - light - серый + серый - white - белый + белый - + Choose a color: Выбрать цвет: - + accept добавить - + cancel отменить - orange - оранжевый + оранжевый - purple - пурпурный + пурпурный - violet - фиолетовый + фиолетовый - yellow - желтый + желтый - + Label name: Название ярлыка: @@ -100,7 +88,7 @@ Добавить - + Add an existing library Добавить в существующую библиотеку @@ -134,8 +122,8 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - Для подключения к Comic Vine вам потребуется ваш личный API ключ. Приобретите его бесплатно вот <a href="http://www.comicvine.com/api/">здесь</a> + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Для подключения к Comic Vine вам потребуется ваш личный API ключ. Приобретите его бесплатно вот <a href="http://www.comicvine.com/api/">здесь</a> @@ -143,95 +131,235 @@ Вставьте сюда ваш Comic Vine API ключ + + AppearanceTabWidget + + + Color scheme + Цветовая гамма + + + + System + Система + + + + Light + Осветить + + + + Dark + Темный + + + + Custom + Обычай + + + + Remove + Удалять + + + + Remove this user-imported theme + Удалить эту импортированную пользователем тему + + + + Light: + Свет: + + + + Dark: + Темный: + + + + Custom: + Пользовательский: + + + + Import theme... + Импортировать тему... + + + + Theme + Тема + + + + Theme editor + Редактор тем + + + + Open Theme Editor... + Открыть редактор тем... + + + + Theme editor error + Ошибка редактора темы + + + + The current theme JSON could not be loaded. + Не удалось загрузить JSON текущей темы. + + + + Import theme + Импортировать тему + + + + JSON files (*.json);;All files (*) + Файлы JSON (*.json);;Все файлы (*) + + + + Could not import theme from: +%1 + Не удалось импортировать тему из: +%1 + + + + Could not import theme from: +%1 + +%2 + Не удалось импортировать тему из: +%1 + +%2 + + + + Import failed + Импорт не удался + + + + BookmarksDialog + + + Lastest Page + Последняя страница + + + + Close + Закрыть + + + + Click on any image to go to the bookmark + Нажмите на любое изображение чтобы перейти к закладке + + + + + Loading... + Загрузка... + + ClassicComicsView - + Hide comic flow - Показать/скрыть поток комиксов + Скрыть Comic Flow ComicInfoView - + + Characters + Персонажи + + + Main character or team - + Главный герой или команда - + Teams - + Команды - + Locations - + Местоположение - + Authors Авторы - + writer - + сценарист - + penciller - + художник - + inker - + инкер - + colorist - + колорист - + letterer - + леттерер - + cover artist - + художник обложки - + editor - + редактор - + imprint - + импринт - + Publisher - + Издатель - + color - + цвет - + b/w - - - - - Characters - + ч/б @@ -254,17 +382,17 @@ Series - + Ряд Volume - + Объем Story Arc - + Сюжетная арка @@ -294,7 +422,7 @@ Publication Date - + Дата публикации @@ -305,74 +433,82 @@ ComicVineDialog - + back назад - + next дальше - + skip пропустить - + close закрыть - - + + Retrieving tags for : %1 Получение тегов для : %1 - + Looking for comic... Поиск комикса... - + search искать - - - + + + Looking for volume... Поиск информации... - - + + comic %1 of %2 - %3 комикс %1 of %2 - %3 - + %1 comics selected %1 было выбрано - + Error connecting to ComicVine Ошибка поключения к ComicVine - + Retrieving volume info... Получение информации... + + ContinuousPageWidget + + + Loading page %1 + Загрузка страницы %1 + + CreateLibraryDialog - + Create new library Создать новую библиотеку @@ -392,7 +528,7 @@ Создание библиотеки может занять несколько минут. Вы можете остановить процесс и обновить библиотеку позже для завершения задачи. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder Выбранный путь отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке @@ -407,7 +543,7 @@ Имя библиотеки: - + Path not found Путь не найден @@ -415,7 +551,7 @@ EditShortcutsDialog - + Shortcut in use Горячая клавиша уже занята @@ -430,9 +566,9 @@ Горячие клавиши - - The shortcut "%1" is already assigned to other function - Сочетание клавиш "%1" уже назначено для другой функции + + The shortcut "%1" is already assigned to other function + Сочетание клавиш "%1" уже назначено для другой функции @@ -443,27 +579,28 @@ EmptyFolderWidget - Empty folder - Пустая папка + Пустая папка - - Subfolders in this folder - Подпапки в этой папке + Подпапки в этой папке - Drag and drop folders and comics here - Перетащите папки и комиксы сюда + Перетащите папки и комиксы сюда + + + + This folder doesn't contain comics yet + В этой папке еще нет комиксов EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet Этот ярлык пока ничего не содержит @@ -475,6 +612,24 @@ Этот список чтения пока ничего не содержит + + EmptySpecialListWidget + + + No favorites + Нет избранного + + + + You are not reading anything yet, come on!! + Вы пока ничего не читаете. Может самое время почитать? + + + + There are no recent comics! + Свежих комиксов нет! + + ExportComicsInfoDialog @@ -483,7 +638,7 @@ Выходной файл (*.ydb) : - + Destination database name Имя этой базы данных @@ -498,17 +653,17 @@ Создать - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Выбранный путь для импортируемого файла отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке - + Export comics info Экспортировать информацию комикса - + Problem found while writing Обнаружена Ошибка записи @@ -526,7 +681,7 @@ Создать - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Выбранный путь для импортируемого файла отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке @@ -536,17 +691,17 @@ Папка вывода : - + Problem found while writing Проблема при написании - + Create covers package Создать комплект обложек - + Destination directory Назначенная директория @@ -577,23 +732,52 @@ FolderContentView - + Continue Reading... - + Продолжить чтение... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Страница : + + + + Go To + Перейти к странице... + + + + Cancel + Отмена + + + + + Total pages : + Общее количество страниц : + + + + Go to... + Перейти к странице... + + + + GoToFlowToolBar + + + Page : + Страница : GridComicsView - + Show info Показать информацию @@ -601,17 +785,17 @@ HelpAboutDialog - + Help Настройки - + System info - + Информация о системе - + About О программе @@ -639,7 +823,7 @@ Импортировать информацию комикса - + Comics info file (*.ydb) Инфо файл комикса (*.ydb) @@ -662,7 +846,7 @@ Распаковать - + Compresed library covers (*.clc) Сжатая библиотека обложек (*.clc) @@ -677,7 +861,7 @@ Имя библиотеки : - + Extract a catalog Извлечь каталог @@ -685,54 +869,54 @@ ImportWidget - + stop Остановить - + Importing comics Импорт комиксов - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderLibrary сейчас создает библиотеку.</p><p> Создание библиотеки может занять несколько минут. Вы можете остановить процесс и обновить библиотеку позже для завершения задачи.</p> - + Some of the comics being added... Поиск новых комиксов... - + Updating the library Обновление библиотеки - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>Текущая библиотека обновляется. Для более быстрого обновления в дальнейшем старайтесь почаще обновлять вашу библиотеку после добавления новых комиксов.</p><p>Вы можете остановить этот процесс и продолжить обновление этой библиотеки позже.</p> - + Upgrading the library - + Обновление библиотеки - + <p>The current library is being upgraded, please wait.</p> - + <p>Текущая библиотека обновляется, подождите.</p> - + Scanning the library - + Сканирование библиотеки - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>Текущая библиотека сканируется на предмет устаревших метаданных XML.</p><p>Это необходимо только один раз и только в том случае, если библиотека была создана с помощью YACReaderLibrary 9.8.2 или более ранней версии.</p> @@ -742,27 +926,27 @@ Редактировать информацию - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. Выбранная папка не содержит ни одной библиотеки. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Эта библиотека была создана с предыдущей версией YACReaderLibrary. Она должна быть обновлена. Обновить сейчас? - + Comic Комикс - + Folder name: Имя папки: - + The selected folder and all its contents will be deleted from your disk. Are you sure? Выбранная папка и все ее содержимое будет удалено с вашего жёсткого диска. Вы уверены? @@ -771,7 +955,7 @@ Обновить выбранную папку - + Error opening the library Ошибка открытия библиотеки @@ -780,8 +964,8 @@ Показать/Спрятать пометки - - + + YACReader not found YACReader не найден @@ -790,7 +974,7 @@ Настройки сервера YACReader - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. Возникла проблема при удалении выбранных папок. Пожалуйста, проверьте права на запись и убедитесь что другие приложения не используют эти папки или файлы. @@ -803,7 +987,7 @@ Отметить комикс как прочитано - + Rename list name Изменить имя списка @@ -812,12 +996,12 @@ Добавить выбранные комиксы в список избранного - + Remove and delete metadata Удаление метаданных - + Old library Библиотека из старой версии YACreader @@ -830,17 +1014,17 @@ Переименовать выбранный ярлык/список чтения - + Set as completed Отметить как завершено - - There was an error accessing the folder's path + + There was an error accessing the folder's path Ошибка доступа к пути папки - + Library Библиотека @@ -849,7 +1033,7 @@ Добавить новую папку в текущую библиотеку - + Comics will only be deleted from the current label/list. Are you sure? Комиксы будут удалены только из выбранного списка/ярлыка. Вы уверены? @@ -862,13 +1046,13 @@ Полноэкранный режим включить/выключить - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Эта библиотека была создана новой версией YACReaderLibrary. Скачать новую версию сейчас? - - + + Moving comics... Переместить комиксы... @@ -881,37 +1065,37 @@ Обновить эту библиотеку - - + + Copying comics... Скопировать комиксы... - - Library '%1' is no longer available. Do you want to remove it? - Библиотека '%1' больше не доступна. Вы хотите удалить ее? + + Library '%1' is no longer available. Do you want to remove it? + Библиотека '%1' больше не доступна. Вы хотите удалить ее? Update library Обновить библиотеку - + Open folder... Открыть папку... - + Do you want remove Вы хотите удалить библиотеку - + Set as uncompleted Отметить как не завершено - + Error in path Ошибка в пути @@ -920,17 +1104,17 @@ Сбросить рейтинг комикса - + Error updating the library Ошибка обновления библиотеки - + Folder Папка - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? Выбранные элементы будут удалены, ваши комиксы или папки НЕ БУДУТ удалены с вашего жёсткого диска. Вы уверены? @@ -943,8 +1127,8 @@ Удалить выбранную папку с жёсткого диска - - + + List name: Имя списка: @@ -953,16 +1137,16 @@ Добавить в... - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - Библиотека '%1' была создана старой версией YACReaderLibrary. Она должна быть вновь создана. Вы хотите создать библиотеку сейчас? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Библиотека '%1' была создана старой версией YACReaderLibrary. Она должна быть вновь создана. Вы хотите создать библиотеку сейчас? Pack covers Запаковать обложки - + Save covers Сохранить обложки @@ -975,12 +1159,12 @@ Удалить выбранный ярлык/список чтения - + Add new reading lists Добавить новый список чтения - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -993,17 +1177,17 @@ YACReaderLibrary will not stop you from creating more libraries but you should k YACReaderLibrary не помешает вам создать больше библиотек, но вы должны иметь не большое количество библиотек. - + Set as read Отметить как прочитано - + Library info - + Информация о библиотеке - + Assign comics numbers Порядковый номер @@ -1020,7 +1204,7 @@ YACReaderLibrary не помешает вам создать больше биб Настройки - + Please, select a folder first Пожалуйста, сначала выберите папку @@ -1029,7 +1213,7 @@ YACReaderLibrary не помешает вам создать больше биб Создать новую библиотеку - + Library not available Библиотека не доступна @@ -1038,7 +1222,7 @@ YACReaderLibrary не помешает вам создать больше биб Импортировать информацию комикса - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. Возникла проблема при удалении выбранных комиксов. Пожалуйста, проверьте права на запись для выбранных файлов или содержащую их папку. @@ -1055,7 +1239,7 @@ YACReaderLibrary не помешает вам создать больше биб Открыть выбранный комикс - + YACReader Library Библиотека YACReader @@ -1064,17 +1248,17 @@ YACReaderLibrary не помешает вам создать больше биб Создать новый список чтения - + Error creating the library Ошибка создания библиотеки - + You are adding too many libraries. Вы добавляете слишком много библиотек. - + Update folder Обновить папку @@ -1083,7 +1267,7 @@ YACReaderLibrary не помешает вам создать больше биб Распаковать обложки - + Update needed Необходимо обновление @@ -1096,61 +1280,61 @@ YACReaderLibrary не помешает вам создать больше биб Показать или спрятать отметку прочтено - + Library name already exists Имя папки уже используется - - There is another library with the name '%1'. - Уже существует другая папка с именем '%1'. + + There is another library with the name '%1'. + Уже существует другая папка с именем '%1'. Remove reading list Удалить список чтения - + Delete folder Удалить папку - + Assign numbers starting in: Назначить порядковый номер начиная с: - + Download new version Загрузить новую версию - + Invalid image - + Неверное изображение - + The selected file is not a valid image. - + Выбранный файл не является допустимым изображением. - + Error saving cover - + Не удалось сохранить обложку. - + There was an error saving the cover image. - + Не удалось сохранить изображение обложки. - + Delete comics Удалить комиксы - + Add new folder Добавить новую папку @@ -1183,7 +1367,7 @@ YACReaderLibrary не помешает вам создать больше биб Переименовать выбранный список - + Delete list/label Удалить список/ярлык @@ -1200,7 +1384,7 @@ YACReaderLibrary не помешает вам создать больше биб Домашняя папка - + No folder selected Ни одна папка не была выбрана @@ -1209,7 +1393,7 @@ YACReaderLibrary не помешает вам создать больше биб Распаковать каталог - + All the selected comics will be deleted from your disk. Are you sure? Все выбранные комиксы будут удалены с вашего жёсткого диска. Вы уверены? @@ -1218,7 +1402,7 @@ YACReaderLibrary не помешает вам создать больше биб Скачать теги из Comic Vine - + Remove comics Убрать комиксы @@ -1227,13 +1411,13 @@ YACReaderLibrary не помешает вам создать больше биб Создать новый ярлык - - + + Set as unread Отметить как не прочитано - + Library not found Библиотека не найдена @@ -1246,32 +1430,32 @@ YACReaderLibrary не помешает вам создать больше биб Удалить библиотеку - - - + + + manga - + манга - - - + + + comic - + комикс - - - + + + web comic - + веб-комикс - - - + + + western manga (left to right) - + западная манга (слева направо) Open containing folder... @@ -1282,48 +1466,48 @@ YACReaderLibrary не помешает вам создать больше биб Создать новый ярлык - - + + Unable to delete Не удалось удалить - - - + + + 4koma (top to botom) - + 4кома (сверху вниз) - - - - + + + + Set type - + Тип установки - + Set custom cover - + Установить собственную обложку - + Delete custom cover - + Удалить пользовательскую обложку - + Error - + Ошибка - + Error opening comic with third party reader. - + Ошибка при открытии комикса с помощью сторонней программы чтения. - + library? ? @@ -1332,472 +1516,472 @@ YACReaderLibrary не помешает вам создать больше биб Сохранить обложки выбранных комиксов как JPG файлы - + Are you sure? Вы уверены? - + Rescan library for XML info - + Повторное сканирование библиотеки для получения информации XML - + Upgrade failed - + Обновление не удалось - + There were errors during library upgrade in: - + При обновлении библиотеки возникли ошибки: - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - + YACReader не найден. YACReader должен быть установлен в ту же папку, что и YACReaderLibrary. - + YACReader not found. There might be a problem with your YACReader installation. - + YACReader не найден. Возможно, возникла проблема с установкой YACReader. LibraryWindowActions - + Create a new library - Создать новую библиотеку + Создать новую библиотеку - + Open an existing library - Открыть существующую библиотеку + Открыть существующую библиотеку - - + + Export comics info - Экспортировать информацию комикса + Экспортировать информацию комикса - - + + Import comics info - Импортировать информацию комикса + Импортировать информацию комикса - + Pack covers - Запаковать обложки + Запаковать обложки - + Pack the covers of the selected library - Запаковать обложки выбранной библиотеки + Запаковать обложки выбранной библиотеки - + Unpack covers - Распаковать обложки + Распаковать обложки - + Unpack a catalog - Распаковать каталог + Распаковать каталог - + Update library - Обновить библиотеку + Обновить библиотеку - + Update current library - Обновить эту библиотеку + Обновить эту библиотеку - + Rename library - Переименовать библиотеку + Переименовать библиотеку - + Rename current library - Переименовать эту библиотеку + Переименовать эту библиотеку - + Remove library - Удалить библиотеку + Удалить библиотеку - + Remove current library from your collection - Удалить эту библиотеку из своей коллекции + Удалить эту библиотеку из своей коллекции - + Rescan library for XML info - + Повторное сканирование библиотеки для получения информации XML - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Пытается найти информацию XML, встроенную в файлы комиксов. Это необходимо делать только в том случае, если библиотека была создана с помощью версии 9.8.2 или более ранней, или если вы используете стороннее программное обеспечение для встраивания информации XML в файлы. - + Show library info - + Показать информацию о библиотеке - + Show information about the current library - + Показать информацию о текущей библиотеке - + Open current comic - Открыть выбранный комикс + Открыть выбранный комикс - + Open current comic on YACReader - Открыть комикс в YACReader + Открыть комикс в YACReader - + Save selected covers to... - Сохранить выбранные обложки в... + Сохранить выбранные обложки в... - + Save covers of the selected comics as JPG files - Сохранить обложки выбранных комиксов как JPG файлы + Сохранить обложки выбранных комиксов как JPG файлы - - + + Set as read - Отметить как прочитано + Отметить как прочитано - + Set comic as read - Отметить комикс как прочитано + Отметить комикс как прочитано - - + + Set as unread - Отметить как не прочитано + Отметить как не прочитано - + Set comic as unread - Отметить комикс как не прочитано + Отметить комикс как не прочитано - - + + manga - + манга - + Set issue as manga - + Установить выпуск как мангу - - + + comic - + комикс - + Set issue as normal - + Установите проблему как обычно - + western manga - + вестерн манга - + Set issue as western manga - + Установить выпуск как западную мангу - - + + web comic - + веб-комикс - + Set issue as web comic - + Установить выпуск как веб-комикс - - + + yonkoma - + йонкома - + Set issue as yonkoma - + Установить проблему как йонкома - + Show/Hide marks - Показать/Спрятать пометки + Показать/Спрятать пометки - + Show or hide read marks - Показать или спрятать отметку прочтено + Показать или спрятать отметку прочтено - + Show/Hide recent indicator - + Показать/скрыть индикатор последних событий - + Show or hide recent indicator - + Показать или скрыть недавний индикатор - - + + Fullscreen mode on/off - Полноэкранный режим включить/выключить + Полноэкранный режим включить/выключить - + Help, About YACReader - О программе + О программе - + Add new folder - Добавить новую папку + Добавить новую папку - + Add new folder to the current library - Добавить новую папку в текущую библиотеку + Добавить новую папку в текущую библиотеку - + Delete folder - Удалить папку + Удалить папку - + Delete current folder from disk - Удалить выбранную папку с жёсткого диска + Удалить выбранную папку с жёсткого диска - + Select root node - Домашняя папка + Домашняя папка - + Expand all nodes - Раскрыть все папки + Раскрыть все папки - + Collapse all nodes - Свернуть все папки + Свернуть все папки - + Show options dialog - Настройки + Настройки - + Show comics server options dialog - Настройки сервера YACReader + Настройки сервера YACReader - - + + Change between comics views - Изменение внешнего вида потока комиксов + Изменение внешнего вида потока комиксов - + Open folder... - Открыть папку... + Открыть папку... - + Set as uncompleted - Отметить как не завершено + Отметить как не завершено - + Set as completed - Отметить как завершено + Отметить как завершено - + Set custom cover - + Установить собственную обложку - + Delete custom cover - + Удалить пользовательскую обложку - + western manga (left to right) - + западная манга (слева направо) - + Open containing folder... - Открыть выбранную папку... + Открыть выбранную папку... - + Reset comic rating - Сбросить рейтинг комикса + Сбросить рейтинг комикса - + Select all comics - Выбрать все комиксы + Выбрать все комиксы - + Edit - Редактировать информацию + Редактировать информацию - + Assign current order to comics - Назначить порядковый номер + Назначить порядковый номер - + Update cover - Обновить обложки + Обновить обложки - + Delete selected comics - Удалить выбранное + Удалить выбранное - + Delete metadata from selected comics - + Удалить метаданные из выбранных комиксов - + Download tags from Comic Vine - Скачать теги из Comic Vine + Скачать теги из Comic Vine - + Focus search line - + Строка поиска фокуса - + Focus comics view - + Просмотр комиксов в фокусе - + Edit shortcuts - Редактировать горячие клавиши + Редактировать горячие клавиши - + &Quit - + &Qкостюм - + Update folder - Обновить папку + Обновить папку - + Update current folder - Обновить выбранную папку + Обновить выбранную папку - + Scan legacy XML metadata - + Сканировать устаревшие метаданные XML - + Add new reading list - Создать новый список чтения + Создать новый список чтения - + Add a new reading list to the current library - Создать новый список чтения + Создать новый список чтения - + Remove reading list - Удалить список чтения + Удалить список чтения - + Remove current reading list from the library - Удалить выбранный ярлык/список чтения + Удалить выбранный ярлык/список чтения - + Add new label - Создать новый ярлык + Создать новый ярлык - + Add a new label to this library - Создать новый ярлык + Создать новый ярлык - + Rename selected list - Переименовать выбранный список + Переименовать выбранный список - + Rename any selected labels or lists - Переименовать выбранный ярлык/список чтения + Переименовать выбранный ярлык/список чтения - + Add to... - Добавить в... + Добавить в... - + Favorites - Избранное + Избранное - + Add selected comics to favorites list - Добавить выбранные комиксы в список избранного + Добавить выбранные комиксы в список избранного @@ -1808,328 +1992,499 @@ YACReaderLibrary не помешает вам создать больше биб имя файла - - LogWindow - - - Log window - - - - - &Pause - - - - - &Save - - - - - C&lear - - - - - &Copy - - - - - Level: - - - - - &Auto scroll - - - NoLibrariesWidget - + create your first library создайте свою первую библиотеку - - You don't have any libraries yet + + You don't have any libraries yet У вас нет ни одной библиотеки - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>Вы можете создать библиотеку в любой папке, YACReaderLibrary будет импортировать все комиксы и папки из этой папки. Если вы уже ранее создавали библиотеки, их можно будет открыть.< / p > <p>Не забывайте, что Вы можете использовать YACReader в качестве отдельного приложения для чтения комиксов на вашем компьютере.</п> - + add an existing one добавить уже существующую + + NoSearchResultsWidget + + + No results + Нет результатов + + OptionsDialog - + Restore defautls Вернуть к первоначальным значениям - + Background Фоновое изображение - + Blur level Уровень размытия - + Enable background image Включить фоновое изображение - + + Options Настройки - + Comic Vine API key Comic Vine API ключ - + Edit Comic Vine API key Редактировать Comic Vine API ключ - + Opacity level Уровень непрозрачности - + + General Основные - + Use selected comic cover as background Обложка комикса фоновое изображение - + Comic Flow - Поток комиксов + Comic Flow - - + + Libraries - Библиотеки + Библиотеки - + Grid view Фоновое изображение - + + + Appearance + Появление + + + + + Language + Язык + + + + + Application language + Язык приложения + + + + + System default + Системный по умолчанию + + + Tray icon settings (experimental) - + Настройки значков в трее (экспериментально) - + Close to tray - + Рядом с лотком - + Start into the system tray - + Запустите в системном трее - + ComicInfo.xml legacy support - + Поддержка устаревших версий ComicInfo.xml - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Импортируйте метаданные из ComicInfo.xml при добавлении новых комиксов. - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + Учитывайте «недавние» элементы, добавленные или обновленные X дней назад. - + Third party reader - + Сторонний читатель - + Write {comic_file_path} where the path should go in the command - + Напишите {comic_file_path}, где должен идти путь в команде. - + + Clear - + Очистить - + Update libraries at startup - + Обновлять библиотеки при запуске - + Try to detect changes automatically - + Попробуйте обнаружить изменения автоматически - + Update libraries periodically - + Периодически обновляйте библиотеки - + Interval: - + Интервал: - + 30 minutes - + 30 минут - + 1 hour - + 1 час - + 2 hours - + 2 часа - + 4 hours - + 4 часа - + 8 hours - + 8 часов - + 12 hours - + 12 часов - + daily - + ежедневно - + Update libraries at certain time - + Обновлять библиотеки в определенное время - + Time: - + Время: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + ПРЕДУПРЕЖДЕНИЕ! Во время обновления библиотеки запись в базу данных отключена! +Не планируйте обновления, пока вы активно используете приложение. +Во время автоматического обновления приложение будет блокировать некоторые действия до завершения обновления. +Чтобы остановить автоматическое обновление, нажмите на индикатор загрузки рядом с названием «Библиотеки». - + Modifications detection - + Обнаружение модификаций - + Compare the modified date of files when updating a library (not recommended) - + Сравните дату изменения файлов при обновлении библиотеки (не рекомендуется) - + Display continue reading banner - + Отображение баннера продолжения чтения - + Display current comic banner - + Отображать текущий комикс-баннер - + Continue reading - + Продолжить чтение - - - PropertiesDialog - - Day: - День: + + My comics path + Папка комиксов - - Plot - Сюжет + + Display + Отображать - - Size: - Размер: + + Show time in current page information label + Показывать время в информационной метке текущей страницы - - Year: - Год: + + "Go to flow" size + Размер "Перейти к Comic Flow" - - Inker(s): - Контуровщик(и): + + Background color + Фоновый цвет - - Publishing - Издатели + + Choose + Выбрать - - Publisher: - Издатель: + + Scroll behaviour + Поведение прокрутки - - General info - Общая информация + + Disable scroll animations and smooth scrolling + Отключить анимацию прокрутки и плавную прокрутку - - Color/BW: + + Do not turn page using scroll + Не переворачивайте страницу с помощью прокрутки + + + + Use single scroll step to turn page + Используйте один шаг прокрутки, чтобы перевернуть страницу + + + + Mouse mode + Режим мыши + + + + Only Back/Forward buttons can turn pages + Только кнопки «Назад/Вперед» могут перелистывать страницы. + + + + Use the Left/Right buttons to turn pages. + Используйте кнопки «Влево/Вправо», чтобы перелистывать страницы. + + + + Click left or right half of the screen to turn pages. + Нажмите левую или правую половину экрана, чтобы перелистывать страницы. + + + + Quick Navigation Mode + Ползунок для быстрой навигации по страницам + + + + Disable mouse over activation + Отключить активацию потока при наведении мыши + + + + Brightness + Яркость + + + + Contrast + Контраст + + + + Gamma + Гамма + + + + Reset + Вернуть к первоначальным значениям + + + + Image options + Настройки изображения + + + + Fit options + Варианты подгонки + + + + Enlarge images to fit width/height + Увеличьте изображения по ширине/высоте + + + + Double Page options + Параметры двойной страницы + + + + Show covers as single page + Показывать обложки на одной странице + + + + Scaling + Масштабирование + + + + Scaling method + Метод масштабирования + + + + Nearest (fast, low quality) + Ближайший (быстро, низкое качество) + + + + Bilinear + Билинейный + + + + Lanczos (better quality) + Ланцос (лучшее качество) + + + + Page Flow + Поток Страниц + + + + Image adjustment + Настройка изображения + + + + + Restart is needed + Требуется перезагрузка + + + + Comics directory + Папка комиксов + + + + PropertiesDialog + + + Day: + День: + + + + Plot + Сюжет + + + + Size: + Размер: + + + + Year: + Год: + + + + Inker(s): + Контуровщик(и): + + + + Publishing + Издатели + + + + Publisher: + Издатель: + + + + General info + Общая информация + + + + Color/BW: Цвет/BW: @@ -2155,32 +2510,32 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Notes - + Примечания Load previous page as cover - + Загрузить предыдущую страницу в качестве обложки Load next page as cover - + Загрузить следующую страницу в качестве обложки Reset cover to the default image - + Сбросить обложку к изображению по умолчанию Load custom cover image - + Загрузить собственное изображение обложки Series: - Серия: + Серия: @@ -2190,27 +2545,27 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + альт. число: Alternate series: - + Альтернативный сериал: Series Group: - + Группа серий: Editor(s): - + Редактор(ы): Imprint: - + Выходные данные: @@ -2220,32 +2575,32 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + Тип: Language (ISO): - + Язык (ISO): Teams: - + Команды: Locations: - + Местоположение: Main character or team: - + Главный герой или команда: Review: - + Обзор: @@ -2255,12 +2610,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Invalid cover - + Неверное покрытие The image is invalid. - + Изображение недействительно. @@ -2305,7 +2660,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + Теги: @@ -2329,8 +2684,8 @@ To stop an automatic update tap on the loading indicator next to the Libraries t - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - <a style='color: ##666666; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Открыть страницу этого комикса на сайте Comic Vine </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + <a style='color: ##666666; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Открыть страницу этого комикса на сайте Comic Vine </a> @@ -2352,12 +2707,28 @@ To stop an automatic update tap on the loading indicator next to the Libraries t of: - + из: Arc number: - + Номер дуги: + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer — это безголовая (без графического интерфейса) версия YACReaderLibrary. + +Это приложение поддерживает постоянные настройки. Чтобы настроить их, отредактируйте этот файл %1. +Чтобы узнать о доступных настройках, ознакомьтесь с документацией по адресу https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md. @@ -2375,89 +2746,73 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Trace - + След Debug - + Отлаживать Info - + Информация Warning - + Предупреждение Error - + Ошибка Fatal - + Фатальный - + Select custom cover - + Выбрать индивидуальную обложку - + Images (%1) - - - - - QsLogging::LogWindowModel - - - Time - - - - - Level - + Изображения (%1) - - Message - + + The file could not be read or is not valid JSON. + Файл не может быть прочитан или имеет недопустимый формат JSON. - - - QsLogging::Window - - &Pause - + + This theme is for %1, not %2. + Эта тема предназначена для %1, а не для %2. - - &Resume - + + Libraries + Библиотеки - - Save log - + + Folders + Папки - - Log file (*.log) - + + Reading Lists + Списки чтения RenameLibraryDialog - + Rename current library Переименовать эту библиотеку @@ -2480,18 +2835,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of %1 found : %2 Количество из %1 найдено : %2 - - + + page %1 of %2 страница %1 из %2 - + Number of volumes found : %1 Количество найденных томов : %1 @@ -2502,17 +2857,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - Пожалуйста, введите инфомарцию для поиска. + Пожалуйста, введите инфомарцию для поиска. - + Series: Серия: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Используйте поиск по точному совпадению. Отключите, если хотите найти тома, соответствующие некоторым словам в названии. @@ -2523,40 +2878,40 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Пожалуйста, введите инфомарцию для поиска. - + Series: Серия: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Используйте поиск по точному совпадению. Отключите, если хотите найти тома, соответствующие некоторым словам в названии. SelectComic - + loading description загрузка описания - + comics комиксы - + loading cover загрузка обложки - + comic description unavailable - + Описание комикса недоступно - + Please, select the right comic info. Пожалуйста, выберите правильную информацию об комиксе. @@ -2568,37 +2923,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + loading description загрузка описания - + Please, select the right series for your comic. Пожалуйста, выберите правильную серию для вашего комикса. - + Filter: - + Фильтр: - + Nothing found, clear the filter if any. - + Ничего не найдено, очистите фильтр, если есть. - + loading cover загрузка обложки - + volume description unavailable - + описание тома недоступно - + volumes тома @@ -2610,12 +2965,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SeriesQuestion - + no нет - + yes да @@ -2628,21 +2983,21 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + Port Порт - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - <a href='http://ios.yacreader.com' style='color:rgb(102,102,102)'>YACReader доступен для устройств с iOS.</a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + <a href='http://ios.yacreader.com' style='color:rgb(102,102,102)'>YACReader доступен для устройств с iOS.</a> - + enable the server активировать сервер - + Server connectivity information Информация о подключении @@ -2653,22 +3008,22 @@ to improve the performance для улучшения производительности - + Scan it! Сканируйте! - + set port указать порт - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader доступен для устройств iOS и Android.<br/>Найдите его для <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> или <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + Choose an IP address Выбрать IP адрес @@ -2676,335 +3031,1156 @@ to improve the performance SortVolumeComics - + remove selected comics удалить выбранные комиксы - + sort comics to match comic information сортировать комиксы, чтобы соответствовать информации комиксов - + restore all removed comics восстановить все удаленные комиксы - + issues выпуск - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. Пожалуйста, отсортируйте список комиксов слева, пока он не будет соответствовать информации комикса. - TitleHeader - - - SEARCH - ПОИСК - - - - UpdateLibraryDialog + ThemeEditorDialog - - Update library - Обновить библиотеку + + Theme Editor + Редактор тем - - Cancel - Отмена + + + + + - - Updating.... - Обновление... + + - + - - - - VolumeComicsModel - - title - название + + i + я - - - VolumesModel - - year - год + + Expand all + Развернуть все - - issues - выпуск + + Collapse all + Свернуть все - - publisher - издатель + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Удерживайте, чтобы выбранное значение мигало в пользовательском интерфейсе (пурпурный / переключено / 0↔10). Релизы восстанавливают оригинал. - - - YACReader::TrayIconController - - &Restore - + + Search… + Поиск… - - Systray - + + Light + Осветить - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - + + Dark + Темный - - - YACReader::WhatsNewDialog - - Close - + + ID: + ИДЕНТИФИКАТОР: - - - YACReaderDeletingProgress - - cancel - отменить + + Display name: + Отображаемое имя: - - Please wait, deleting in progress... - Пожалуйста подождите, удаление в процессе... + + Variant: + Вариант: - - - YACReaderFieldEdit - - Restore to default - Вернуть к первоначальным значениям + + Theme info + Информация о теме - - - Click to overwrite - Изменить + + Parameter + Параметр - - - YACReaderFieldPlainTextEdit - - Restore to default - Вернуть к первоначальным значениям + + Value + Ценить - - - - - Click to overwrite - Изменить + + Save and apply + Сохраните и примените - - - YACReaderFlowConfigWidget - - CoverFlow look - Рулеткой + + Export to file... + Экспортировать в файл... - - How to show covers: - Выбрать внешний вид потока обложек: + + Load from file... + Загрузить из файла... - - Stripe look - Вид полосами + + Close + Закрыть - - Overlapped Stripe look - Вид перекрывающимися полосами + + Double-click to edit color + Дважды щелкните, чтобы изменить цвет - - - YACReaderGLFlowConfigWidget - - Zoom - Масштабировать + + + + + + + true + истинный - - Light - Осветить + + + + + false + ЛОЖЬ - - Show advanced settings - Показать дополнительные настройки + + Double-click to toggle + Дважды щелкните, чтобы переключиться - - Roulette look - Вид рулеткой + + Double-click to edit value + Дважды щелкните, чтобы изменить значение - - Cover Angle - Охватить угол + + + + Edit: %1 + Изменить: %1 - - Stripe look - Вид полосами + + Save theme + Сохранить тему - - Position - Позиция + + + JSON files (*.json);;All files (*) + Файлы JSON (*.json);;Все файлы (*) - - Z offset - Смещение по Z + + Save failed + Сохранить не удалось - - Y offset - Смещение по Y + + Could not open file for writing: +%1 + Не удалось открыть файл для записи: +%1 - - Central gap - Сфокусировать разрыв + + Load theme + Загрузить тему - - Presets: - Предустановки: + + + + Load failed + Загрузка не удалась - - Overlapped Stripe look - Вид перекрывающимися полосами + + Could not open file: +%1 + Не удалось открыть файл: +%1 - - Modern look - Современный вид + + Invalid JSON: +%1 + Неверный JSON: +%1 - - View angle - Угол зрения + + Expected a JSON object. + Ожидается объект JSON. + + + TitleHeader - - Max angle - Максимальный угол + + SEARCH + ПОИСК + + + UpdateLibraryDialog - - Custom: - Пользовательский: + + Update library + Обновить библиотеку - - Classic look - Классический вид + + Cancel + Отмена - + + Updating.... + Обновление... + + + + Viewer + + + + Press 'O' to open comic. + Нажмите "O" чтобы открыть комикс. + + + + Not found + Не найдено + + + + Comic not found + Комикс не найден + + + + Error opening comic + Ошибка открытия комикса + + + + CRC Error + Ошибка CRC + + + + Loading...please wait! + Загрузка... Пожалуйста подождите! + + + + Page not available! + Страница недоступна! + + + + Cover! + Начало! + + + + Last page! + Конец! + + + + VolumeComicsModel + + + title + название + + + + VolumesModel + + + year + год + + + + issues + выпуск + + + + publisher + издатель + + + + YACReader3DFlowConfigWidget + + + Presets: + Предустановки: + + + + Classic look + Классический вид + + + + Stripe look + Вид полосами + + + + Overlapped Stripe look + Вид перекрывающимися полосами + + + + Modern look + Современный вид + + + + Roulette look + Вид рулеткой + + + + Show advanced settings + Показать дополнительные настройки + + + + Custom: + Пользовательский: + + + + View angle + Угол зрения + + + + Position + Позиция + + + Cover gap Охватить разрыв - + + Central gap + Сфокусировать разрыв + + + + Zoom + Масштабировать + + + + Y offset + Смещение по Y + + + + Z offset + Смещение по Z + + + + Cover Angle + Охватить угол + + + + Visibility + Прозрачность + + + + Light + Осветить + + + + Max angle + Максимальный угол + + + + Low Performance + Минимальная производительность + + + High Performance Максимальная производительность - + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Использовать VSync (повысить качество изображения в полноэкранном режиме , хуже производительность) + + + Performance: Производительность: + + + YACReader::MainWindowViewer + + + &Open + &Открыть + + + + Open a comic + Открыть комикс + + + + New instance + Новый экземпляр + + + + Open Folder + Открыть папку + + + + Open image folder + Открыть папку с изображениями + + + + Open latest comic + Открыть последний комикс + + + + Open the latest comic opened in the previous reading session + Открыть комикс открытый в предыдущем сеансе чтения + + + + Clear + Очистить + + + + Clear open recent list + Очистить список недавно открытых файлов + + + + Save + Сохранить + + + + + Save current page + Сохранить текущию страницу + + + + Previous Comic + Предыдущий комикс + + + + + + Open previous comic + Открыть предыдуший комикс + + + + Next Comic + Следующий комикс + + + + + + Open next comic + Открыть следующий комикс + + + + &Previous + &Предыдущий + + + + + + Go to previous page + Перейти к предыдущей странице + + + + &Next + &Следующий + + + + + + Go to next page + Перейти к следующей странице + + + + Fit Height + Подогнать по высоте + + + + Fit image to height + Подогнать по высоте + + + + Fit Width + Подогнать по ширине + + + + Fit image to width + Подогнать по ширине + + + + Show full size + Показать в полном размере + + + + Fit to page + Подогнать под размер страницы + + + + Continuous scroll + Непрерывная прокрутка + + + + Switch to continuous scroll mode + Переключиться в режим непрерывной прокрутки + + + + Reset zoom + Сбросить масштаб + + + + Show zoom slider + Показать ползунок масштабирования + + + + Zoom+ + Увеличить масштаб + + + + Zoom- + Уменьшить масштаб + + + + Rotate image to the left + Повернуть изображение против часовой стрелки + + + + Rotate image to the right + Повернуть изображение по часовой стрелке + + + + Double page mode + Двухстраничный режим + + + + Switch to double page mode + Двухстраничный режим + + + + Double page manga mode + Двухстраничный режим манги + + + + Reverse reading order in double page mode + Двухстраничный режим манги + + + + Go To + Перейти к странице... + + + + Go to page ... + Перейти к странице... + + + + Options + Настройки + + + + YACReader options + Настройки + + + + + Help + Настройки + + + + Help, About YACReader + О программе + + + + Magnifying glass + Увеличительное стекло + + + + Switch Magnifying glass + Увеличительное стекло + + + + Set bookmark + Установить закладку + + + + Set a bookmark on the current page + Установить закладку на текущей странице + + + + Show bookmarks + Показать закладки + + + + Show the bookmarks of the current comic + Показать закладки в текущем комиксе + + + + Show keyboard shortcuts + Показать горячие клавиши + + + + Show Info + Показать/скрыть номер страницы и текущее время + + + + Close + Закрыть + + + + Show Dictionary + Переводчик YACreader + + + + Show go to flow + Показать "Перейти к Comic Flow" + + + + Edit shortcuts + Редактировать горячие клавиши + + + + &File + &Отображать панель инструментов + + + + + Open recent + Открыть недавние + + + + File + Файл + + + + Edit + Редактировать информацию + + + + View + Посмотреть + + + + Go + Перейти + + + + Window + Окно + + + + + + Open Comic + Открыть комикс + + + + + + Comic files + Файлы комикса + + + + Open folder + Открыть папку + + + + page_%1.jpg + страница_%1.jpg + + + + Image files (*.jpg) + Файлы изображений (*.jpg) + + + + + Comics + Комикс + + + + + General + Основные + + + + + Magnifiying glass + Увеличительное стекло + + + + + Page adjustement + Настройка страницы + + + + + Reading + Чтение + + + + Toggle fullscreen mode + Полноэкранный режим включить/выключить + + + + Hide/show toolbar + Показать/скрыть панель инструментов + + + + Size up magnifying glass + Увеличение размера окошка увеличительного стекла + + + + Size down magnifying glass + Уменьшение размера окошка увеличительного стекла + + + + Zoom in magnifying glass + Увеличить + + + + Zoom out magnifying glass + Уменьшить + + + + Reset magnifying glass + Сбросить увеличительное стекло + + + + Toggle between fit to width and fit to height + Переключение режима подгонки страницы по ширине/высоте + + + + Autoscroll down + Автопрокрутка вниз + + + + Autoscroll up + Автопрокрутка вверх + + + + Autoscroll forward, horizontal first + Автопрокрутка вперед, горизонтальная + + + + Autoscroll backward, horizontal first + Автопрокрутка назад, горизонтальная + + + + Autoscroll forward, vertical first + Автопрокрутка вперед, вертикальная + + + + Autoscroll backward, vertical first + Автопрокрутка назад, вертикальная + + + + Move down + Переместить вниз + + + + Move up + Переместить вверх + + + + Move left + Переместить влево + + + + Move right + Переместить вправо + + + + Go to the first page + Перейти к первой странице + + + + Go to the last page + Перейти к последней странице + + + + Offset double page to the left + Смещение разворота влево + + + + Offset double page to the right + Смещение разворота вправо + + + + There is a new version available + Доступна новая версия + + + + Do you want to download the new version? + Хотите загрузить новую версию ? + + + + Remind me in 14 days + Напомнить через 14 дней + + + + Not now + Не сейчас + + + + YACReader::TrayIconController + + + &Restore + &Rмагазин + + + + Systray + Систрей + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary продолжит работать в системном трее. Чтобы завершить работу программы, выберите <b>Выход</b> в контекстном меню значка на панели задач. + + + + YACReaderFieldEdit + + + Restore to default + Вернуть к первоначальным значениям + + + + + Click to overwrite + Изменить + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Вернуть к первоначальным значениям + + + + + + + Click to overwrite + Изменить + + + + YACReaderFlowConfigWidget + + CoverFlow look + Рулеткой + + + How to show covers: + Выбрать внешний вид потока обложек: + + + Stripe look + Вид полосами + + + Overlapped Stripe look + Вид перекрывающимися полосами + + + + YACReaderGLFlowConfigWidget + + Zoom + Масштабировать + + + Light + Осветить + + + Show advanced settings + Показать дополнительные настройки + + + Roulette look + Вид рулеткой + + + Cover Angle + Охватить угол + + + Stripe look + Вид полосами + + + Position + Позиция + + + Z offset + Смещение по Z + + + Y offset + Смещение по Y + + + Central gap + Сфокусировать разрыв + + + Presets: + Предустановки: + + + Overlapped Stripe look + Вид перекрывающимися полосами + + + Modern look + Современный вид + + + View angle + Угол зрения + + + Max angle + Максимальный угол + + + Custom: + Пользовательский: + + + Classic look + Классический вид + + + Cover gap + Охватить разрыв + + + High Performance + Максимальная производительность + + + Performance: + Производительность: + - Use VSync (improve the image quality in fullscreen mode, worse performance) - Использовать VSync (повысить качество изображения в полноэкранном режиме , хуже производительность) + Использовать VSync (повысить качество изображения в полноэкранном режиме , хуже производительность) - Visibility - Прозрачность + Прозрачность - Low Performance - Минимальная производительность + Минимальная производительность YACReaderNavigationController - You are not reading anything yet, come on!! - Вы пока ничего не читаете. Может самое время почитать? - - - - There are no recent comics! - + Вы пока ничего не читаете. Может самое время почитать? - No favorites - Нет избранного + Нет избранного YACReaderOptionsDialog - + Save Сохранить - Use hardware acceleration (restart needed) - Использовать аппаратное ускорение (необходима перезагрузка) + Использовать аппаратное ускорение (необходима перезагрузка) - + Cancel Отмена - + Shortcuts Горячие клавиши - + Edit shortcuts Редактировать горячие клавиши @@ -3012,7 +4188,7 @@ to improve the performance YACReaderSearchLineEdit - + type to search Начать поиск @@ -3020,34 +4196,60 @@ to improve the performance YACReaderSideBar - Reading Lists - Списки чтения + Списки чтения - LIBRARIES - БИБЛИОТЕКИ + БИБЛИОТЕКИ - Libraries - Библиотеки + Библиотеки - FOLDERS - ПАПКИ + ПАПКИ - Folders - Папки + Папки - READING LISTS - СПИСКИ ЧТЕНИЯ + СПИСКИ ЧТЕНИЯ + + + + YACReaderSlider + + + Reset + Вернуть к первоначальным значениям + + + + YACReaderTranslator + + + YACReader translator + Переводчик YACReader + + + + + Translation + Перевод + + + + clear + очистить + + + + Service not available + Сервис недоступен diff --git a/YACReaderLibrary/yacreaderlibrary_source.ts b/YACReaderLibrary/yacreaderlibrary_source.ts index 87e652144..11890d95a 100644 --- a/YACReaderLibrary/yacreaderlibrary_source.ts +++ b/YACReaderLibrary/yacreaderlibrary_source.ts @@ -4,7 +4,7 @@ ActionsShortcutsModel - + None @@ -12,142 +12,217 @@ AddLabelDialog - + Label name: - + Choose a color: - - red + + accept - - orange + + cancel + + + AddLibraryDialog - - yellow + + Add - - green + + Add an existing library - - cyan + + Cancel - - blue + + Comics folder : - - violet + + Library name : + + + ApiKeyDialog - - purple + + Cancel - - pink + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - - white + + Paste here your Comic Vine API key - - light + + Accept + + + AppearanceTabWidget - - dark + + Color scheme - - accept + + System - - cancel + + Light - - - AddLibraryDialog - - Comics folder : + + Dark - - Library name : - Library Name : + + Custom - - Add + + Remove - - Cancel + + Remove this user-imported theme - - Add an existing library + + Light: + + + + + Dark: + + + + + Custom: + + + + + Import theme... + + + + + Theme + + + + + Theme editor + + + + + Open Theme Editor... + + + + + Theme editor error + + + + + The current theme JSON could not be loaded. + + + + + Import theme + + + + + JSON files (*.json);;All files (*) + + + + + Could not import theme from: +%1 + + + + + Could not import theme from: +%1 + +%2 + + + + + Import failed - ApiKeyDialog + BookmarksDialog - - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + + Lastest Page - - Paste here your Comic Vine API key + + Close - - Accept + + Click on any image to go to the bookmark - - Cancel + + + Loading... ClassicComicsView - + Hide comic flow @@ -155,108 +230,153 @@ ComicInfoView - + + Characters + + + + + Main character or team + + + + + Teams + + + + + Locations + + + + Authors - + writer - + penciller - + inker - + colorist - + letterer - + cover artist - - Publisher + + editor - - color + + imprint - - b/w + + Publisher - - Characters + + color + + + + + b/w ComicModel - + yes - + no - + Title - + File Name - + Pages - + Size - + Read - + Current Page - + + Publication Date + + + + Rating + + + Series + + + + + Volume + + + + + Story Arc + + ComicVineDialog @@ -287,85 +407,91 @@ - - - - + + Looking for volume... - - + + comic %1 of %2 - %3 - + %1 comics selected - + Error connecting to ComicVine - - + + Retrieving tags for : %1 - + Retrieving volume info... - + Looking for comic... + + ContinuousPageWidget + + + Loading page %1 + + + CreateLibraryDialog - - Comics folder : + + Create new library - - Library Name : + + Cancel - + Create - - Cancel + + Comics folder : - - Create a library could take several minutes. You can stop the process and update the library later for completing the task. + + Library Name : - - Create new library + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. - + Path not found - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder @@ -373,27 +499,27 @@ EditShortcutsDialog - + Restore defaults - + To change a shortcut, double click in the key combination and type the new keys. - + Shortcuts settings - + Shortcut in use - + The shortcut "%1" is already assigned to other function @@ -401,26 +527,15 @@ EmptyFolderWidget - - - Subfolders in this folder - - - - - Empty folder - - - - - Drag and drop folders and comics here + + This folder doesn't contain comics yet EmptyLabelWidget - + This label doesn't contain comics yet @@ -430,15 +545,32 @@ This reading list does not contain any comics yet - This reading list doesn't contain any comics yet + + + + + EmptySpecialListWidget + + + No favorites + + + + + You are not reading anything yet, come on!! + + + + + There are no recent comics! ExportComicsInfoDialog - - Output file : + + Cancel @@ -447,27 +579,27 @@ - - Cancel + + Output file : - + Export comics info - + Destination database name - + Problem found while writing - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder @@ -475,8 +607,8 @@ ExportLibraryDialog - - Output folder : + + Cancel @@ -485,33 +617,38 @@ - - Cancel + + Output folder : - + Create covers package - - Problem found while writing + + Destination directory - - The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + + Problem found while writing - - Destination directory + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder FileComic + + + 7z not found + + CRC error on page (%1): some of the pages will not be displayed correctly @@ -523,20 +660,60 @@ - - 7z not found + + Format not supported + + + FolderContentView - - Format not supported + + Continue Reading... + + + + + GoToDialog + + + Page : + + + + + Go To + + + + + Cancel + + + + + + Total pages : + + + + + Go to... + + + + + GoToFlowToolBar + + + Page : GridComicsView - + Show info @@ -544,18 +721,28 @@ HelpAboutDialog - + About - + Help + + + System info + + ImportComicsInfoDialog + + + Cancel + + Import comics info @@ -572,1700 +759,3115 @@ - - Cancel - - - - + Comics info file (*.ydb) ImportLibraryDialog - - - Library Name : - - - - - Package location : - - Destination folder : - - - Unpack - - Cancel - - Extract a catalog + + Unpack - + Compresed library covers (*.clc) - - - ImportWidget - + + Package location : + + + + + Library Name : + + + + + Extract a catalog + + + + + ImportWidget + + stop - + Some of the comics being added... - + Importing comics - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> - + Updating the library - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> - + Upgrading the library - + <p>The current library is being upgraded, please wait.</p> + + + Scanning the library + + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + + LibraryWindow - - YACReader Library - + Remove current library from your collection + Remover biblioteca atual da sua coleção - + Library - - Create a new library - + Rename current library + Renomear biblioteca atual - - Open an existing library - + Open current comic on YACReader + Abrir quadrinho atual no YACReader - - - Export comics info - + Update current library + Atualizar biblioteca atual - - - Import comics info + + Open folder... - - Pack covers + + + + western manga (left to right) - - Pack the covers of the selected library + + + + 4koma (top to botom) + 4koma (top to botom - - Unpack covers + + Do you want remove - - Unpack a catalog - + Expand all nodes + Expandir todos - - Update library - + Show options dialog + Mostrar opções - - Update current library - + Create a new library + Criar uma nova biblioteca - - Rename library + + YACReader Library - - Rename current library - + Open an existing library + Abrir uma biblioteca existente - - Remove library - + Pack the covers of the selected library + Pacote de capas da biblioteca selecionada - - Remove current library from your collection + + + + manga - - Open current comic + + + + comic - - Open current comic on YACReader - + Help, About YACReader + Ajuda, Sobre o YACReader - - Save selected covers to... - + Select root node + Selecionar raiz - - Save covers of the selected comics as JPG files + Unpack a catalog + Desempacotar um catálogo + + + Open containing folder... + Abrir a pasta contendo... + + + + Are you sure? - - - Set as read + + Rescan library for XML info - - Set comic as read + + Set as read - - + + Set as unread - - Set comic as unread + + + + web comic - - Show/Hide marks + + Add new folder - - Collapse all nodes + + Delete folder - - Assign current order to comics + + Set as uncompleted - - Library not available - Library ' + + Set as completed - - - Fullscreen mode on/off + + Update folder - - - Set as manga + + Folder - - Set issue as manga + + Comic - - Set as normal + + Upgrade failed - - Set issue as normal + + There were errors during library upgrade in: - - Help, About YACReader + + Update needed - - - Delete folder + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? - - Select root node + + Download new version - - Expand all nodes + + This library was created with a newer version of YACReaderLibrary. Download the new version now? - - Show options dialog + + Library not available - - Show comics server options dialog + + Library '%1' is no longer available. Do you want to remove it? - - Open folder... + + Old library - - Set as uncompleted + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - - Set as completed + + + Copying comics... - - Set as comic + + + Moving comics... - - Open containing folder... + + Folder name: - - Reset comic rating + + No folder selected - - Select all comics + + Please, select a folder first - - Edit + + Error in path - - Update cover + + There was an error accessing the folder's path - - Delete selected comics + + The selected folder and all its contents will be deleted from your disk. Are you sure? - - Download tags from Comic Vine + + + Unable to delete - - Edit shortcuts + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. - - Update folder + + Add new reading lists - - Update current folder + + + List name: - - Add new reading list + + Delete list/label - - Add a new reading list to the current library + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? - - Remove reading list + + Rename list name - - Remove current reading list from the library + + + + + Set type - - Add new label + + Set custom cover - - Add a new label to this library + + Delete custom cover - - Rename selected list + + Save covers - - Rename any selected labels or lists + + You are adding too many libraries. - - Add to... + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. - - Favorites + + + YACReader not found - - Add selected comics to favorites list + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. - - Folder + + YACReader not found. There might be a problem with your YACReader installation. - - Comic + + Error - - Upgrade failed + + Error opening comic with third party reader. - - There were errors during library upgrade in: + + Library not found - - Update needed + + The selected folder doesn't contain any library. - - This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + + library? - - Download new version + + Remove and delete metadata - - This library was created with a newer version of YACReaderLibrary. Download the new version now? + + Library info - - Library '%1' is no longer available. Do you want to remove it? + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. - - Old library + + Assign comics numbers - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + + Assign numbers starting in: - - - Copying comics... + + Invalid image - - - Moving comics... + + The selected file is not a valid image. - - Folder name: + + Error saving cover - - No folder selected + + There was an error saving the cover image. - - Please, select a folder first + + Error creating the library - - Error in path + + Error updating the library - - There was an error accessing the folder's path + + Error opening the library - - The selected folder and all its contents will be deleted from your disk. Are you sure? + + Delete comics - - There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + + All the selected comics will be deleted from your disk. Are you sure? - - Add new reading lists + + Remove comics - - - List name: + + Comics will only be deleted from the current label/list. Are you sure? - - Delete list/label + + Library name already exists - - The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + + There is another library with the name '%1'. + + + LibraryWindowActions - - Rename list name + + Create a new library - - Save covers + + Open an existing library - - You are adding too many libraries. + + + Export comics info - - You are adding too many libraries. - -You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. - -YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + + + Import comics info - - - YACReader not found + + Pack covers - - Library not found + + Pack the covers of the selected library - - The selected folder doesn't contain any library. + + Unpack covers - - Are you sure? + + Unpack a catalog - - Do you want remove + + Update library - - library? + + Update current library - - Remove and delete metadata + + Rename library - - Assign comics numbers + + Rename current library - - Assign numbers starting in: + + Remove library - - - Unable to delete + + Remove current library from your collection - - Show or hide read marks + + Rescan library for XML info - - - Add new folder + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - - Add new folder to the current library + + Show library info - - Delete current folder from disk + + Show information about the current library - - - Change between comics views + + Open current comic - - YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + + Open current comic on YACReader - - YACReader not found. There might be a problem with your YACReader installation. + + Save selected covers to... - - There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + + Save covers of the selected comics as JPG files - - Error creating the library + + + Set as read - - Error updating the library + + Set comic as read - - Error opening the library + + + Set as unread - - Delete comics + + Set comic as unread - - All the selected comics will be deleted from your disk. Are you sure? + + + manga - - Remove comics + + Set issue as manga - - Comics will only be deleted from the current label/list. Are you sure? + + + comic - - Library name already exists + + Set issue as normal + + + + + western manga + + + + + Set issue as western manga + + + + + + web comic + + + + + Set issue as web comic + + + + + + yonkoma + + + + + Set issue as yonkoma + + + + + Show/Hide marks + + + + + Show or hide read marks + + + + + Show/Hide recent indicator + + + + + Show or hide recent indicator + + + + + + Fullscreen mode on/off + + + + + Help, About YACReader + + + + + Add new folder + + + + + Add new folder to the current library + + + + + Delete folder + + + + + Delete current folder from disk + + + + + Select root node + + + + + Expand all nodes + + + + + Collapse all nodes + + + + + Show options dialog + + + + + Show comics server options dialog + + + + + + Change between comics views + + + + + Open folder... + + + + + Set as uncompleted + + + + + Set as completed + + + + + Set custom cover + + + + + Delete custom cover + + + + + western manga (left to right) + + + + + Open containing folder... + + + + + Reset comic rating + + + + + Select all comics + + + + + Edit + + + + + Assign current order to comics + + + + + Update cover + + + + + Delete selected comics + + + + + Delete metadata from selected comics + + + + + Download tags from Comic Vine + + + + + Focus search line + + + + + Focus comics view + + + + + Edit shortcuts + + + + + &Quit + + + + + Update folder + + + + + Update current folder + + + + + Scan legacy XML metadata + + + + + Add new reading list + + + + + Add a new reading list to the current library + + + + + Remove reading list + + + + + Remove current reading list from the library + + + + + Add new label + + + + + Add a new label to this library + + + + + Rename selected list + + + + + Rename any selected labels or lists + + + + + Add to... + + + + + Favorites + + + + + Add selected comics to favorites list + + + + + LocalComicListModel + + + file name + + + + + NoLibrariesWidget + + + You don't have any libraries yet + + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + + + + create your first library + + + + + add an existing one + + + + + NoSearchResultsWidget + + + No results + + + + + OptionsDialog + + + + Language + + + + + + Application language + + + + + + System default + + + + + Tray icon settings (experimental) + + + + + Close to tray + + + + + Start into the system tray + + + + + Edit Comic Vine API key + + + + + Comic Vine API key + + + + + ComicInfo.xml legacy support + + + + + Import metadata from ComicInfo.xml when adding new comics + Import metada from ComicInfo.xml when adding new comics + + + + + Consider 'recent' items added or updated since X days ago + + + + + Third party reader + + + + + Write {comic_file_path} where the path should go in the command + + + + + + Clear + + + + + Update libraries at startup + + + + + Try to detect changes automatically + + + + + Update libraries periodically + + + + + Interval: + + + + + 30 minutes + + + + + 1 hour + + + + + 2 hours + + + + + 4 hours + + + + + 8 hours + + + + + 12 hours + + + + + daily + + + + + Update libraries at certain time + + + + + Time: + + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +To stop an automatic update tap on the loading indicator next to the Libraries title. + + + + + Modifications detection + + + + + Compare the modified date of files when updating a library (not recommended) + + + + + Enable background image + + + + + Opacity level + + + + + Blur level + + + + + Use selected comic cover as background + + + + + Restore defautls + + + + + Background + + + + + Display continue reading banner + + + + + Display current comic banner + + + + + Continue reading + + + + + Comic Flow + + + + + + Libraries + + + + + Grid view + + + + + + General + + + + + + Appearance + + + + + + Options + + + + + My comics path + + + + + Display + + + + + Show time in current page information label + + + + + "Go to flow" size + + + + + Background color + + + + + Choose + + + + + Scroll behaviour + + + + + Disable scroll animations and smooth scrolling + + + + + Do not turn page using scroll + + + + + Use single scroll step to turn page + + + + + Mouse mode + + + + + Only Back/Forward buttons can turn pages + + + + + Use the Left/Right buttons to turn pages. + + + + + Click left or right half of the screen to turn pages. + + + + + Quick Navigation Mode + + + + + Disable mouse over activation + + + + + Brightness + + + + + Contrast + + + + + Gamma + + + + + Reset + + + + + Image options + + + + + Fit options + + + + + Enlarge images to fit width/height + + + + + Double Page options + + + + + Show covers as single page + + + + + Scaling + + + + + Scaling method + + + + + Nearest (fast, low quality) + + + + + Bilinear + + + + + Lanczos (better quality) + + + + + Page Flow + + + + + Image adjustment + + + + + + Restart is needed + + + + + Comics directory + + + + + PropertiesDialog + + + General info + + + + + Authors + + + + + Publishing + + + + + Plot + + + + + Notes + + + + + Cover page + + + + + Load previous page as cover + + + + + Load next page as cover + + + + + Reset cover to the default image + + + + + Load custom cover image + + + + + Series: + + + + + Title: + + + + + + + of: + + + + + Issue number: + + + + + Volume: + + + + + Arc number: + + + + + Story arc: + + + + + alt. number: + + + + + Alternate series: + + + + + Series Group: + + + + + Genre: + + + + + Size: + + + + + Writer(s): + + + + + Penciller(s): + + + + + Inker(s): + + + + + Colorist(s): + + + + + Letterer(s): + + + + + Cover Artist(s): + + + + + Editor(s): + + + + + Imprint: + + + + + Day: + + + + + Month: + + + + + Year: + + + + + Publisher: + + + + + Format: + + + + + Color/BW: + + + + + Age rating: + + + + + Type: + + + + + Language (ISO): + + + + + Synopsis: + + + + + Characters: + + + + + Teams: + + + + + Locations: + + + + + Main character or team: + + + + + Review: + + + + + Notes: + + + + + Tags: + + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + + + + + Not found + + + + + Comic not found. You should update your library. + + + + + Edit selected comics information + + + + + Invalid cover + + + + + The image is invalid. + + + + + Edit comic information + + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + + QObject + + + 7z lib not found + + + + + unable to load 7z lib from ./utils + + + + + Trace + + + + + Debug + + + + + Info + + + + + Warning + + + + + Error + + + + + Fatal + + + + + Select custom cover + + + + + Images (%1) + + + + + The file could not be read or is not valid JSON. + + + + + This theme is for %1, not %2. + + + + + Libraries + + + + + Folders + + + + + Reading Lists + + + + + RenameLibraryDialog + + + Rename current library + + + + + Cancel + + + + + Rename + + + + + New Library Name : + + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + + + + + + page %1 of %2 + + + + + Number of %1 found : %2 + + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Please provide some additional information. + + + + + Series: + + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + + + + + SearchVolume + + + Please provide some additional information. + + + + + Series: + + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + + + + + SelectComic + + + Please, select the right comic info. + + + + + comics + + + + + loading cover + + + + + loading description + + + + + comic description unavailable + + + + + SelectVolume + + + Please, select the right series for your comic. + + + + + Filter: - - There is another library with the name '%1'. + + volumes + + + + + Nothing found, clear the filter if any. + + + + + loading cover + + + + + loading description + + + + + volume description unavailable - LocalComicListModel + SeriesQuestion - - file name + + You are trying to get information for various comics at once, are they part of the same series? + + + + + yes + + + + + no - LogWindow + ServerConfigDialog - - Log window + + set port - - &Pause + + Server connectivity information - - &Save + + Scan it! - - C&lear + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - - &Copy + + Choose an IP address - - Level: + + Port - - &Auto scroll + + enable the server - NoLibrariesWidget + SortVolumeComics - - You don't have any libraries yet + + Please, sort the list of comics on the left until it matches the comics' information. - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + sort comics to match comic information - - create your first library + + issues - - add an existing one + + remove selected comics + + + + + restore all removed comics - OptionsDialog + ThemeEditorDialog - - Tray icon settings (experimental) + + Theme Editor - - Close to tray + + + - - Start into the system tray + + - - - Edit Comic Vine API key + + i - - Comic Vine API key + + Expand all - - Enable background image + + Collapse all - - Opacity level + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. - - Blur level + + Search… - - Use selected comic cover as background + + Light - - Restore defautls + + Dark - - Background + + ID: - - Display continue reading banner + + Display name: - - Continue reading + + Variant: - - Comic Flow + + Theme info - - Grid view + + Parameter - - General + + Value - - Options + + Save and apply + + + + + Export to file... + + + + + Load from file... + + + + + Close + + + + + Double-click to edit color + + + + + + + + + + true + + + + + + + + false + + + + + Double-click to toggle + + + + + Double-click to edit value + + + + + + + Edit: %1 + + + + + Save theme + + + + + + JSON files (*.json);;All files (*) + + + + + Save failed + + + + + Could not open file for writing: +%1 + + + + + Load theme + + + + + + + Load failed + + + + + Could not open file: +%1 + + + + + Invalid JSON: +%1 + + + + + Expected a JSON object. - PropertiesDialog + TitleHeader - - General info + + SEARCH + + + UpdateLibraryDialog - - Authors + + Cancel - - Publishing + + Updating.... - - Plot + + Update library + + + Viewer - - Cover page + + + Press 'O' to open comic. - - Title: + + Not found - - - of: + + Comic not found - - Issue number: + + Error opening comic - - Volume: + + CRC Error - - Arc number: + + Loading...please wait! - - Story arc: + + Page not available! - - Genre: - Genere: + + Cover! - - Size: + + Last page! + + + VolumeComicsModel - - Writer(s): + + title + + + VolumesModel - - Penciller(s): + + year - - Inker(s): + + issues - - Colorist(s): + + publisher + + + YACReader3DFlowConfigWidget - - Letterer(s): + + Presets: - - Cover Artist(s): + + Classic look - - Day: + + Stripe look - - Month: + + Overlapped Stripe look - - Year: + + Modern look - - Publisher: + + Roulette look - - Format: + + Show advanced settings - - Color/BW: + + Custom: + + + + + View angle + + + + + Position + + + + + Cover gap + + + + + Central gap + + + + + Zoom + + + + + Y offset + + + + + Z offset + + + + + Cover Angle + + + + + Visibility + + + + + Light + + + + + Max angle + + + + + Low Performance + + + + + High Performance + + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + + + + + Performance: + + + YACReader::MainWindowViewer - - Age rating: + + &Open - - Manga: + + Open a comic - - Synopsis: + + New instance - - Characters: + + Open Folder - - Notes: + + Open image folder - - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + + Open latest comic - - Not found + + Open the latest comic opened in the previous reading session - - Comic not found. You should update your library. + + Clear - - Edit selected comics information + + Clear open recent list - - Edit comic information + + Save - - - QObject - - 7z lib not found + + + Save current page - - unable to load 7z lib from ./utils + + Previous Comic - - Trace + + + + Open previous comic - - Debug + + Next Comic - - Info + + + + Open next comic - - Warning + + &Previous - - Error + + + + Go to previous page - - Fatal + + &Next - - - QsLogging::LogWindowModel - - Time + + + + Go to next page - - Level + + Fit Height - - Message + + Fit image to height - - - QsLogging::Window - - &Pause + + Fit Width - - &Resume + + Fit image to width - - Save log + + Show full size - - Log file (*.log) + + Fit to page - - - RenameLibraryDialog - - New Library Name : + + Continuous scroll - - Rename + + Switch to continuous scroll mode - - Cancel + + Reset zoom - - Rename current library + + Show zoom slider - - - ScraperResultsPaginator - - Number of volumes found : %1 + + Zoom+ - - - page %1 of %2 + + Zoom- - - Number of %1 found : %2 + + Rotate image to the left - - - SearchSingleComic - - Please provide some additional information. + + Rotate image to the right - - Series: + + Double page mode - - - SearchVolume - - Please provide some additional information. + + Switch to double page mode - - Series: + + Double page manga mode - - - SelectComic - - Please, select the right comic info. + + Reverse reading order in double page mode - - comics + + Go To - - loading cover + + Go to page ... - - loading description + + Options - - description unavailable + + YACReader options - - - SelectVolume - - Please, select the right series for your comic. + + + Help - - volumes + + Help, About YACReader - - loading cover + + Magnifying glass - - loading description + + Switch Magnifying glass - - description unavailable + + Set bookmark - - - SeriesQuestion - - You are trying to get information for various comics at once, are they part of the same series? + + Set a bookmark on the current page - - yes + + Show bookmarks - - no + + Show the bookmarks of the current comic - - - ServerConfigDialog - - set port + + Show keyboard shortcuts - - Server connectivity information + + Show Info - - Scan it! + + Close - - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + + Show Dictionary - - Choose an IP address + + Show go to flow - - Port + + Edit shortcuts - - enable the server + + &File - - display less information about folders in the browser -to improve the performance + + + Open recent - - Could not load libqrencode. + + File - - - SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. + + Edit - - sort comics to match comic information + + View - - issues + + Go - - remove selected comics + + Window - - restore all removed comics + + + + Open Comic - - - TitleHeader - - SEARCH + + + + Comic files - - - UpdateLibraryDialog - - Updating.... + + Open folder - - Cancel + + page_%1.jpg - - Update library + + Image files (*.jpg) - - - VolumeComicsModel - - title + + + Comics - - - VolumesModel - - year + + + General - - issues + + + Magnifiying glass - - publisher + + + Page adjustement - - - YACReader::TrayIconController - - &Restore + + + Reading - - &Quit + + Toggle fullscreen mode - - Systray + + Hide/show toolbar - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + + Size up magnifying glass - - - YACReader::WhatsNewDialog - - Close + + Size down magnifying glass - - - YACReaderDeletingProgress - - Please wait, deleting in progress... + + Zoom in magnifying glass - - cancel + + Zoom out magnifying glass - - - YACReaderFieldEdit - - - Click to overwrite + + Reset magnifying glass - - Restore to default + + Toggle between fit to width and fit to height - - - YACReaderFieldPlainTextEdit - - - - - Click to overwrite + + Autoscroll down - - Restore to default + + Autoscroll up - - - YACReaderFlowConfigWidget - - How to show covers: + + Autoscroll forward, horizontal first - - CoverFlow look + + Autoscroll backward, horizontal first - - Stripe look + + Autoscroll forward, vertical first - - Overlapped Stripe look + + Autoscroll backward, vertical first - - - YACReaderGLFlowConfigWidget - - Presets: + + Move down - - Classic look + + Move up - - Stripe look + + Move left - - Overlapped Stripe look + + Move right - - Modern look + + Go to the first page - - Roulette look + + Go to the last page - - Show advanced settings + + Offset double page to the left - - Custom: + + Offset double page to the right - - View angle + + There is a new version available - - Position + + Do you want to download the new version? - - Cover gap + + Remind me in 14 days - - Central gap + + Not now + + + YACReader::TrayIconController - - Zoom + + &Restore - - Y offset + + Systray - - Z offset + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + + + YACReaderFieldEdit - - Cover Angle + + + Click to overwrite - - Visibility + + Restore to default + + + YACReaderFieldPlainTextEdit - - Light + + + + + Click to overwrite - - Max angle + + Restore to default + + + YACReaderFlowConfigWidget - - Low Performance - + CoverFlow look + Olhar capa cheia - - High Performance - + How to show covers: + Como mostrar capas: - - Use VSync (improve the image quality in fullscreen mode, worse performance) - + Stripe look + Olhar lista - - Performance: - + Overlapped Stripe look + Olhar lista sobreposta - YACReaderNavigationController + YACReaderGLFlowConfigWidget - - No favorites - + Stripe look + Olhar lista - - You are not reading anything yet, come on!! - + Overlapped Stripe look + Olhar lista sobreposta YACReaderOptionsDialog - + Save - + Cancel - + Edit shortcuts - + Shortcuts - - - Use hardware acceleration (restart needed) - - YACReaderSearchLineEdit - + type to search - YACReaderSideBar + YACReaderSlider - - Libraries - - - - - Folders + + Reset + + + YACReaderTranslator - - Reading Lists + + YACReader translator - - LIBRARIES + + + Translation - - FOLDERS + + clear - - READING LISTS + + Service not available diff --git a/YACReaderLibrary/yacreaderlibrary_tr.ts b/YACReaderLibrary/yacreaderlibrary_tr.ts index 2f3463669..78eb8d1f6 100644 --- a/YACReaderLibrary/yacreaderlibrary_tr.ts +++ b/YACReaderLibrary/yacreaderlibrary_tr.ts @@ -12,82 +12,70 @@ AddLabelDialog - + cancel vazgeç - + Label name: Etiket adı: - + Choose a color: Renk seçiniz: - red - kırmızı + kırmızı - orange - turuncu + turuncu - yellow - sarı + sarı - green - yeşil + yeşil - cyan - camgöbeği + camgöbeği - blue - mavi + mavi - violet - menekşe + menekşe - purple - mor + mor - pink - pembe + pembe - white - beyaz + beyaz - light - açık + açık - dark - koyu + koyu - + accept kabul et @@ -100,7 +88,7 @@ Ekle - + Add an existing library Kütüphaneye ekle @@ -129,8 +117,8 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - Comic Vine'a bağlanmadan önce kendi API anahtarınıza ihtiyacınız var. Lütfen <a href="http://www.comicvine.com/api/">buradan</a> ücretsiz bir tane edinin + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Comic Vine'a bağlanmadan önce kendi API anahtarınıza ihtiyacınız var. Lütfen <a href="http://www.comicvine.com/api/">buradan</a> ücretsiz bir tane edinin @@ -143,93 +131,233 @@ Kabul et + + AppearanceTabWidget + + + Color scheme + Renk şeması + + + + System + Sistem + + + + Light + Işık + + + + Dark + Karanlık + + + + Custom + Gelenek + + + + Remove + Kaldırmak + + + + Remove this user-imported theme + Kullanıcı tarafından içe aktarılan bu temayı kaldır + + + + Light: + Işık: + + + + Dark: + Karanlık: + + + + Custom: + Kişisel: + + + + Import theme... + Temayı içe aktar... + + + + Theme + Tema + + + + Theme editor + Tema düzenleyici + + + + Open Theme Editor... + Tema Düzenleyiciyi Aç... + + + + Theme editor error + Tema düzenleyici hatası + + + + The current theme JSON could not be loaded. + Geçerli tema JSON yüklenemedi. + + + + Import theme + Temayı içe aktar + + + + JSON files (*.json);;All files (*) + JSON dosyaları (*.json);;Tüm dosyalar (*) + + + + Could not import theme from: +%1 + Tema şu kaynaktan içe aktarılamadı: +%1 + + + + Could not import theme from: +%1 + +%2 + Tema şu kaynaktan içe aktarılamadı: +%1 + +%2 + + + + Import failed + İçe aktarma başarısız oldu + + + + BookmarksDialog + + + Lastest Page + Son Sayfa + + + + Close + Kapat + + + + Click on any image to go to the bookmark + Yer imine git + + + + + Loading... + Yükleniyor... + + ClassicComicsView - + Hide comic flow - Çizgi roman akışını gizle + Comic Flow'u gizle ComicInfoView - + Main character or team - + Ana karakter veya takım - + Teams - + Takımlar - + Locations - + Konumlar - + Authors Yazarlar - + writer yazar - + penciller - kalemci + çizer - + inker - mürekkepçi + mürekkepleyen - + colorist renklendiren - + letterer - metinlendiren + harflendiren - + cover artist - kapak sanatçısı + kapak çizeri - + editor - + editör - + imprint - + yayın markası - + Publisher - Yayıncı + Yayınevi - + color renk - + b/w s/b - + Characters Karakterler @@ -279,7 +407,7 @@ Publication Date - + Yayın Tarihi @@ -289,90 +417,98 @@ Series - + Seri Volume - + Hacim Story Arc - + Hikaye Arkı ComicVineDialog - + skip geç - + back geri - + next sonraki - + search ara - + close kapat - - - + + + Looking for volume... Sayılar aranıyor... - - + + comic %1 of %2 - %3 çizgi roman %1 / %2 - %3 - + %1 comics selected %1 çizgi roman seçildi - + Error connecting to ComicVine ComicVine sitesine bağlanılırken hata - - + + Retrieving tags for : %1 %1 için etiketler alınıyor - + Retrieving volume info... Sayı bilgileri alınıyor... - + Looking for comic... Çizgi romanlar aranıyor... + + ContinuousPageWidget + + + Loading page %1 + %1 sayfası yükleniyor + + CreateLibraryDialog - + Create new library Yeni kütüphane oluştur @@ -392,7 +528,7 @@ Yeni kütüphanenin oluşturulması birkaç dakika sürecek. - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol @@ -407,7 +543,7 @@ Kütüphane Adı : - + Path not found Dizin bulunamadı @@ -430,40 +566,41 @@ Kısayol ayarları - + Shortcut in use Kısayol kullanımda - - The shortcut "%1" is already assigned to other function - "%1" kısayalou zaten başka bir işlev tarafından kullanılıyor + + The shortcut "%1" is already assigned to other function + "%1" kısayalou zaten başka bir işlev tarafından kullanılıyor EmptyFolderWidget - - Subfolders in this folder - Bu klasörde alt klasörler + Bu klasörde alt klasörler - Empty folder - Boş klasör + Boş klasör - Drag and drop folders and comics here - Klasörleri ve çizgi romanları sürükleyip buraya bırakın + Klasörleri ve çizgi romanları sürükleyip buraya bırakın + + + + This folder doesn't contain comics yet + Bu klasör henüz çizgi roman içermiyor EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet Bu etiket henüz çizgi roman içermiyor @@ -475,6 +612,24 @@ Bu okuma listesi henüz çizgi roman içermiyor + + EmptySpecialListWidget + + + No favorites + Favoriler boş + + + + You are not reading anything yet, come on!! + Henüz bir şey okumuyorsun, hadi ama! + + + + There are no recent comics! + Yeni çizgi roman yok! + + ExportComicsInfoDialog @@ -483,7 +638,7 @@ Çıkış dosyası : - + Destination database name Hedef adı @@ -498,17 +653,17 @@ Oluştur - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol - + Export comics info Çizgi roman bilgilerini göster - + Problem found while writing Yazma sırasında bir problem oldu @@ -526,7 +681,7 @@ Yeni bir tane yap - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder Seçilen konuma yeni bir kütüphane yazılamıyor @@ -536,17 +691,17 @@ Çıktı klasörü : - + Problem found while writing Yazım aşamasında bir problem bulundu - + Create covers package Kapak paketi oluştur - + Destination directory Hedef dizin @@ -577,23 +732,52 @@ FolderContentView - + Continue Reading... - + Okumaya Devam Et... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + Sayfa : + + + + Go To + Git + + + + Cancel + Vazgeç + + + + + Total pages : + Toplam sayfa: + + + + Go to... + Git... + + + + GoToFlowToolBar + + + Page : + Sayfa : GridComicsView - + Show info Bilgi göster @@ -601,17 +785,17 @@ HelpAboutDialog - + Help Yardım - + System info - + Sistem bilgisi - + About Hakkında @@ -639,7 +823,7 @@ Çizgi roman bilgilerini çıkart - + Comics info file (*.ydb) Çizgi roman bilgi dosyası (*.ydb) @@ -662,7 +846,7 @@ Paketten çıkar - + Compresed library covers (*.clc) Sıkıştırılmış kütüphane kapakları (*.clc) @@ -677,7 +861,7 @@ Kütüphane Adı : - + Extract a catalog Katalog ayıkla @@ -685,54 +869,54 @@ ImportWidget - + stop dur - + Importing comics önemli çizgi romanlar - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderKütüphane şu anda yeni bir kütüphane oluşturuyor</p><p>Kütüphanenin oluşturulması birkaç dakika alacak.</p> - + Some of the comics being added... Bazı çizgi romanlar önceden eklenmiş... - + Updating the library Kütüphaneyi güncelle - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>Kütüphane güncelleniyor</p><p>Güncellemeyi daha sonra iptal edebilirsin.</p> - + Upgrading the library Kütüphane güncelleniyor - + <p>The current library is being upgraded, please wait.</p> <p>Mevcut kütüphane güncelleniyor, lütfen bekleyin.</p> - + Scanning the library - + Kütüphaneyi taramak - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> - + <p>Geçerli kitaplık, eski XML meta veri bilgileri için taranıyor.</p><p>Bu yalnızca bir kez gereklidir ve yalnızca kitaplığın YACReaderLibrary 9.8.2 veya daha eski bir sürümle oluşturulmuş olması durumunda gereklidir.</p> @@ -742,17 +926,17 @@ Düzenle - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. Seçilen dosya kütüphanede yok. - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Bu kütüphane YACReaderKütüphabenin bir önceki versiyonun oluşturulmuş, güncellemeye ihtiyacın var. Şimdi güncellemek ister misin ? - + Error opening the library Haa kütüphanesini aç @@ -773,12 +957,12 @@ Çizgi romanı okundu olarak işaretle - + Remove and delete metadata - Metadata'yı kaldır ve sil + Metadata'yı kaldır ve sil - + Old library Eski kütüphane @@ -787,7 +971,7 @@ Kapağı güncelle - + Library Kütüphane @@ -800,40 +984,40 @@ Tam ekran modu açık/kapalı - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Bu kütüphane YACRKütüphanenin üst bir versiyonunda oluşturulmu. Yeni versiyonu indirmek ister misiniz ? Open current comic on YACReader - YACReader'ı geçerli çizgi roman okuyucsu seç + YACReader'ı geçerli çizgi roman okuyucsu seç Update current library Kütüphaneyi güncelle - - Library '%1' is no longer available. Do you want to remove it? - Kütüphane '%1'ulaşılabilir değil. Kaldırmak ister misin? + + Library '%1' is no longer available. Do you want to remove it? + Kütüphane '%1'ulaşılabilir değil. Kaldırmak ister misin? Update library Kütüphaneyi güncelle - + Open folder... Dosyayı aç... - + Do you want remove Kaldırmak ister misin - + Error updating the library Kütüphane güncelleme sorunu @@ -842,16 +1026,16 @@ Tüm düğümleri büyüt - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - Kütüphane '%1 YACRKütüphanenin eski bir sürümünde oluşturulmuş, Kütüphaneyi yeniden oluşturmak ister misin? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Kütüphane '%1 YACRKütüphanenin eski bir sürümünde oluşturulmuş, Kütüphaneyi yeniden oluşturmak ister misin? Pack covers Paket kapakları - + Set as read Okundu olarak işaretle @@ -872,7 +1056,7 @@ Yeni kütüphane oluştur - + Library not available Kütüphane ulaşılabilir değil @@ -885,12 +1069,12 @@ Seçili çizgi romanı aç - + YACReader Library YACReader Kütüphane - + Error creating the library Kütüphane oluşturma sorunu @@ -899,7 +1083,7 @@ Kapakları aç - + Update needed Güncelleme gerekli @@ -908,22 +1092,22 @@ Çıkış kütüphanesini aç - + Library name already exists Kütüphane ismi zaten alınmış - - There is another library with the name '%1'. - Bu başka bir kütüphanenin adı '%1'. + + There is another library with the name '%1'. + Bu başka bir kütüphanenin adı '%1'. - + Download new version Yeni versiyonu indir - + Delete comics Çizgi romanları sil @@ -952,18 +1136,18 @@ Kataloğu çkart - + All the selected comics will be deleted from your disk. Are you sure? Seçilen tüm çizgi romanlar diskten silinecek emin misin ? - - + + Set as unread Hepsini okunmadı işaretle - + Library not found Kütüphane bulunamadı @@ -976,45 +1160,45 @@ Kütüphaneyi sil - - - + + + manga - + manga t?r? - - - + + + comic - + komik - - - + + + western manga (left to right) - + Batı mangası (soldan sağa) Open containing folder... Klasör açılıyor... - - - + + + 4koma (top to botom) 4koma (top to botom - + 4koma (yukarıdan aşağıya) - + library? kütüphane? - + Are you sure? Emin misin? @@ -1023,9 +1207,9 @@ Seçilen kapakları şuraya kaydet... - + Rescan library for XML info - + XML bilgisi için kitaplığı yeniden tarayın Save covers of the selected comics as JPG files @@ -1048,18 +1232,18 @@ Sayıyı normal olarak ayarla - - - + + + web comic - + web çizgi romanı Show or hide read marks Okundu işaretlerini göster yada gizle - + Add new folder Yeni klasör ekle @@ -1068,7 +1252,7 @@ Geçerli kitaplığa yeni klasör ekle - + Delete folder Klasörü sil @@ -1085,12 +1269,12 @@ Çizgi roman görünümleri arasında değiştir - + Set as uncompleted Tamamlanmamış olarak ayarla - + Set as completed Tamamlanmış olarak ayarla @@ -1119,7 +1303,7 @@ &Çıkış - + Update folder Klasörü güncelle @@ -1172,134 +1356,134 @@ Seçilen çizgi romanları favoriler listesine ekle - + Folder Klasör - + Comic Çizgi roman - + Upgrade failed Yükseltme başarısız oldu - + There were errors during library upgrade in: Kütüphane yükseltmesi sırasında hatalar oluştu: - - + + Copying comics... Çizgi romanlar kopyalanıyor... - - + + Moving comics... Çizgi romanlar taşınıyor... - + Folder name: Klasör adı: - + No folder selected Hiçbir klasör seçilmedi - + Please, select a folder first Lütfen, önce bir klasör seçiniz - + Error in path Yolda hata - - There was an error accessing the folder's path + + There was an error accessing the folder's path Klasörün yoluna erişilirken hata oluştu - + The selected folder and all its contents will be deleted from your disk. Are you sure? Seçilen klasör ve tüm içeriği diskinizden silinecek. Emin misin? - - + + Unable to delete Silinemedi - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. Seçili klasörleri silmeye çalışırken bir sorun oluştu. Lütfen yazma izinlerini kontrol edin ve herhangi bir uygulamanın bu klasörleri veya içerdiği dosyalardan herhangi birini kullandığından emin olun. - + Add new reading lists Yeni okuma listeleri ekle - - + + List name: Liste adı: - + Delete list/label Listeyi/Etiketi sil - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? Seçilen öğe silinecek, çizgi romanlarınız veya klasörleriniz diskinizden SİLİNMEYECEKTİR. Emin misin? - + Rename list name Listeyi yeniden adlandır - - - - + + + + Set type - + Türü ayarla - + Set custom cover - + Özel kapak ayarla - + Delete custom cover - + Özel kapağı sil - + Save covers Kapakları kaydet - + You are adding too many libraries. Çok fazla kütüphane ekliyorsunuz. - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -1312,78 +1496,78 @@ Muhtemelen üst düzey çizgi roman klasörünüzde yalnızca bir kütüphaneye YACReaderLibrary daha fazla kütüphane oluşturmanıza engel olmaz ancak kütüphane sayısını düşük tutmalısınız. - - + + YACReader not found YACReader bulunamadı - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. YACReader bulunamadı. YACReader, YACReaderLibrary ile aynı klasöre kurulmalıdır. - + YACReader not found. There might be a problem with your YACReader installation. YACReader bulunamadı. YACReader kurulumunuzda bir sorun olabilir. - + Error - Hata + Hata - + Error opening comic with third party reader. - + Çizgi roman üçüncü taraf okuyucuyla açılırken hata oluştu. - + Library info - + Kütüphane bilgisi - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. Seçilen çizgi romanlar silinmeye çalışılırken bir sorun oluştu. Lütfen seçilen dosyalarda veya klasörleri içeren yazma izinlerini kontrol edin. - + Assign comics numbers Çizgi roman numaraları ata - + Assign numbers starting in: Şunlardan başlayarak numaralar ata: - + Invalid image - + Geçersiz resim - + The selected file is not a valid image. - + Seçilen dosya geçerli bir resim değil. - + Error saving cover - + Kapak kaydedilirken hata oluştu - + There was an error saving the cover image. - + Kapak resmi kaydedilirken bir hata oluştu. - + Remove comics Çizgi romanları kaldır - + Comics will only be deleted from the current label/list. Are you sure? Çizgi romanlar yalnızca mevcut etiketten/listeden silinecektir. Emin misin? @@ -1391,439 +1575,439 @@ YACReaderLibrary daha fazla kütüphane oluşturmanıza engel olmaz ancak kütü LibraryWindowActions - + Create a new library - Yeni kütüphane oluştur + Yeni kütüphane oluştur - + Open an existing library - Çıkış kütüphanesini aç + Çıkış kütüphanesini aç - - + + Export comics info - + Çizgi roman bilgilerini göster - - + + Import comics info - + Çizgi roman bilgilerini çıkart - + Pack covers - Paket kapakları + Paket kapakları - + Pack the covers of the selected library - Kütüphanede ki kapakları paketle + Kütüphanede ki kapakları paketle - + Unpack covers - Kapakları aç + Kapakları aç - + Unpack a catalog - Kataloğu çkart + Kataloğu çkart - + Update library - Kütüphaneyi güncelle + Kütüphaneyi güncelle - + Update current library - Kütüphaneyi güncelle + Kütüphaneyi güncelle - + Rename library - Kütüphaneyi yeniden adlandır + Kütüphaneyi yeniden adlandır - + Rename current library - + Kütüphaneyi adlandır - + Remove library - Kütüphaneyi sil + Kütüphaneyi sil - + Remove current library from your collection - Kütüphaneyi koleksiyonundan kaldır + Kütüphaneyi koleksiyonundan kaldır - + Rescan library for XML info - + XML bilgisi için kitaplığı yeniden tarayın - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - + Komik dosyalara gömülü XML bilgilerini bulmaya çalışır. Bunu yalnızca kitaplık 9.8.2 veya önceki sürümlerle oluşturulmuşsa veya XML bilgilerini dosyalara eklemek için üçüncü taraf yazılım kullanıyorsanız yapmanız gerekir. - + Show library info - + Kitaplık bilgilerini göster - + Show information about the current library - + Geçerli kitaplık hakkındaki bilgileri göster - + Open current comic - Seçili çizgi romanı aç + Seçili çizgi romanı aç - + Open current comic on YACReader - YACReader'ı geçerli çizgi roman okuyucsu seç + YACReader'ı geçerli çizgi roman okuyucsu seç - + Save selected covers to... - Seçilen kapakları şuraya kaydet... + Seçilen kapakları şuraya kaydet... - + Save covers of the selected comics as JPG files - Seçilen çizgi romanların kapaklarını JPG dosyaları olarak kaydet + Seçilen çizgi romanların kapaklarını JPG dosyaları olarak kaydet - - + + Set as read - Okundu olarak işaretle + Okundu olarak işaretle - + Set comic as read - Çizgi romanı okundu olarak işaretle + Çizgi romanı okundu olarak işaretle - - + + Set as unread - Hepsini okunmadı işaretle + Hepsini okunmadı işaretle - + Set comic as unread - Çizgi Romanı okunmadı olarak seç + Çizgi Romanı okunmadı olarak seç - - + + manga - + manga t?r? - + Set issue as manga - Sayıyı manga olarak ayarla + Sayıyı manga olarak ayarla - - + + comic - + komik - + Set issue as normal - Sayıyı normal olarak ayarla + Sayıyı normal olarak ayarla - + western manga - + batı mangası - + Set issue as western manga - + Konuyu western mangası olarak ayarla - - + + web comic - + web çizgi romanı - + Set issue as web comic - + Sorunu web çizgi romanı olarak ayarla - - + + yonkoma - + d?rt panelli - + Set issue as yonkoma - + Sorunu yonkoma olarak ayarla - + Show/Hide marks - Altçizgileri aç/kapa + Altçizgileri aç/kapa - + Show or hide read marks - Okundu işaretlerini göster yada gizle + Okundu işaretlerini göster yada gizle - + Show/Hide recent indicator - + Son göstergeyi Göster/Gizle - + Show or hide recent indicator - + Son göstergeyi göster veya gizle - - + + Fullscreen mode on/off - Tam ekran modu açık/kapalı + Tam ekran modu açık/kapalı - + Help, About YACReader - Yardım, Bigli, YACReader + Yardım, Bigli, YACReader - + Add new folder - Yeni klasör ekle + Yeni klasör ekle - + Add new folder to the current library - Geçerli kitaplığa yeni klasör ekle + Geçerli kitaplığa yeni klasör ekle - + Delete folder - Klasörü sil + Klasörü sil - + Delete current folder from disk - Geçerli klasörü diskten sil + Geçerli klasörü diskten sil - + Select root node - Kökü seçin + Kökü seçin - + Expand all nodes - Tüm düğümleri büyüt + Tüm düğümleri büyüt - + Collapse all nodes - Tüm düğümleri kapat + Tüm düğümleri kapat - + Show options dialog - Ayarları göster + Ayarları göster - + Show comics server options dialog - Çizgi romanların server ayarlarını göster + Çizgi romanların server ayarlarını göster - - + + Change between comics views - Çizgi roman görünümleri arasında değiştir + Çizgi roman görünümleri arasında değiştir - + Open folder... - Dosyayı aç... + Dosyayı aç... - + Set as uncompleted - Tamamlanmamış olarak ayarla + Tamamlanmamış olarak ayarla - + Set as completed - Tamamlanmış olarak ayarla + Tamamlanmış olarak ayarla - + Set custom cover - + Özel kapak ayarla - + Delete custom cover - + Özel kapağı sil - + western manga (left to right) - + Batı mangası (soldan sağa) - + Open containing folder... - Klasör açılıyor... + Klasör açılıyor... - + Reset comic rating - Çizgi roman reytingini sıfırla + Çizgi roman reytingini sıfırla - + Select all comics - Tüm çizgi romanları seç + Tüm çizgi romanları seç - + Edit - Düzenle + Düzenle - + Assign current order to comics - Geçerli sırayı çizgi romanlara ata + Geçerli sırayı çizgi romanlara ata - + Update cover - Kapağı güncelle + Kapağı güncelle - + Delete selected comics - Seçili çizgi romanları sil + Seçili çizgi romanları sil - + Delete metadata from selected comics - + Seçilen çizgi romanlardan meta verileri sil - + Download tags from Comic Vine - Etiketleri Comic Vine sitesinden indir + Etiketleri Comic Vine sitesinden indir - + Focus search line - + Arama satırına odaklan - + Focus comics view - + Çizgi roman görünümüne odaklanın - + Edit shortcuts - Kısayolları düzenle + Kısayolları düzenle - + &Quit - &Çıkış + &Çıkış - + Update folder - Klasörü güncelle + Klasörü güncelle - + Update current folder - Geçerli klasörü güncelle + Geçerli klasörü güncelle - + Scan legacy XML metadata - + Eski XML meta verilerini tarayın - + Add new reading list - Yeni okuma listesi ekle + Yeni okuma listesi ekle - + Add a new reading list to the current library - Geçerli kitaplığa yeni bir okuma listesi ekle + Geçerli kitaplığa yeni bir okuma listesi ekle - + Remove reading list - Okuma listesini kaldır + Okuma listesini kaldır - + Remove current reading list from the library - Geçerli okuma listesini kütüphaneden kaldır + Geçerli okuma listesini kütüphaneden kaldır - + Add new label - Yeni etiket ekle + Yeni etiket ekle - + Add a new label to this library - Bu kitaplığa yeni bir etiket ekle + Bu kitaplığa yeni bir etiket ekle - + Rename selected list - Seçilen listeyi yeniden adlandır + Seçilen listeyi yeniden adlandır - + Rename any selected labels or lists - Seçilen etiketleri ya da listeleri yeniden adlandır + Seçilen etiketleri ya da listeleri yeniden adlandır - + Add to... - Şuraya ekle... + Şuraya ekle... - + Favorites - Favoriler + Favoriler - + Add selected comics to favorites list - Seçilen çizgi romanları favoriler listesine ekle + Seçilen çizgi romanları favoriler listesine ekle @@ -1837,361 +2021,563 @@ YACReaderLibrary daha fazla kütüphane oluşturmanıza engel olmaz ancak kütü LogWindow - Log window - Günlük penceresi + Günlük penceresi - &Pause - &Duraklak + &Duraklak - &Save - &Kaydet + &Kaydet - C&lear - &Temizle + &Temizle - &Copy - &Kopyala + &Kopyala - Level: - Düzey: + Düzey: - &Auto scroll - &Otomatik kaydır + &Otomatik kaydır NoLibrariesWidget - + create your first library İlk kütüphaneni oluştur - - You don't have any libraries yet + + You don't have any libraries yet Henüz bir kütüphaneye sahip değilsin - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>Yeni bir kütüphane oluşturabilmeniçin kütüphane</p><p>No olvides que puedes usar YACReader como una aplicación independiente para leer los cómics en tu ordenador.</p> - + add an existing one Var olan bir tane ekle + + NoSearchResultsWidget + + + No results + Sonuç yok + + OptionsDialog - + + + Appearance + Dış görünüş + + + + Options Ayarlar - + + + Language + Dil + + + + + Application language + Uygulama dili + + + + + System default + Sistem varsayılanı + + + Tray icon settings (experimental) Tepsi simgesi ayarları (deneysel) - + Close to tray Tepsiyi kapat - + Start into the system tray Sistem tepsisinde başlat - + Edit Comic Vine API key Comic Vine API anahtarını düzenle - + Comic Vine API key Comic Vine API anahtarı - + ComicInfo.xml legacy support - + ComicInfo.xml eski desteği - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + Yeni çizgi roman eklerken meta verileri ComicInfo.xml'den içe aktarın - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + X gün öncesinden bu yana eklenen veya güncellenen 'en son' öğeleri göz önünde bulundurun - + Third party reader - + Üçüncü taraf okuyucu - + Write {comic_file_path} where the path should go in the command - + Komutta yolun gitmesi gereken yere {comic_file_path} yazın - + + Clear - + Temizle - + Update libraries at startup - + Başlangıçta kitaplıkları güncelleyin - + Try to detect changes automatically - + Değişiklikleri otomatik olarak algılamayı deneyin - + Update libraries periodically - + Kitaplıkları düzenli aralıklarla güncelleyin - + Interval: - + Aralık: - + 30 minutes - + 30 dakika - + 1 hour - + 1 saat - + 2 hours - + 2 saat - + 4 hours - + 4 saat - + 8 hours - + 8 saat - + 12 hours - + 12 saat - + daily - + günlük - + Update libraries at certain time - + Kitaplıkları belirli bir zamanda güncelle - + Time: - + Zaman: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + UYARI! Kütüphane güncellemeleri sırasında veritabanına yazma işlemi devre dışı bırakılır! +Uygulamayı aktif olarak kullanırken güncelleme planlamayın. +Otomatik güncellemeler sırasında uygulama, güncelleme bitene kadar bazı eylemleri engelleyecektir. +Otomatik güncellemeyi durdurmak için Kitaplıklar başlığının yanındaki yükleme göstergesine dokunun. - + Modifications detection - + Değişiklik tespiti - + Compare the modified date of files when updating a library (not recommended) - + Kitaplığı güncellerken dosyaların değiştirilme tarihini karşılaştırın (önerilmez) - + Enable background image Arka plan resmini etkinleştir - + Opacity level Matlık düzeyi - + Blur level Bulanıklık düzeyi - + Use selected comic cover as background Seçilen çizgi roman kapanığı arka plan olarak kullan - + Restore defautls Varsayılanları geri yükle - + Background Arka plan - + Display continue reading banner Okuma devam et bannerını göster - + Display current comic banner - + Mevcut çizgi roman banner'ını görüntüle - + Continue reading Okumaya devam et - + Comic Flow - Çizgi Roman Akışı + Comic Flow - - + + Libraries - Kütüphaneler + Kütüphaneler - + Grid view Izgara görünümü - + + General Genel - - - PropertiesDialog - - Day: - Gün: + + My comics path + Çizgi Romanlarım - - Plot - Argumento + + Display + Görüntülemek - - Size: - Boyut: + + Show time in current page information label + Geçerli sayfa bilgisi etiketinde zamanı göster - - Year: - Yıl: + + "Go to flow" size + "Comic Flow'a git" boyutu - - Inker(s): - Mürekkep(ler): + + Background color + Arka plan rengi - - Publishing - Yayın + + Choose + Seç - - Publisher: - Yayıncı: + + Scroll behaviour + Kaydırma davranışı - - General info - Genel bilgi + + Disable scroll animations and smooth scrolling + Kaydırma animasyonlarını ve düzgün kaydırmayı devre dışı bırakın - - Color/BW: - Renk/BW: + + Do not turn page using scroll + Kaydırmayı kullanarak sayfayı çevirmeyin - - Edit selected comics information - Seçilen çizgi roman bilgilerini düzenle + + Use single scroll step to turn page + Sayfayı çevirmek için tek kaydırma adımını kullanın - - Penciller(s): - Çizenler: + + Mouse mode + Fare modu - - Colorist(s): - Renklendiren: + + Only Back/Forward buttons can turn pages + Yalnızca Geri/İleri düğmeleri sayfaları çevirebilir - - Issue number: - Yayın numarası: + + Use the Left/Right buttons to turn pages. + Sayfaları çevirmek için Sol/Sağ tuşlarını kullanın. - - Month: - Ay: + + Click left or right half of the screen to turn pages. + Sayfaları çevirmek için ekranın sol veya sağ yarısına tıklayın. - - Notes: - Notlar: + + Quick Navigation Mode + Hızlı Gezinti Kipi - - Synopsis: - Özet: + + Disable mouse over activation + Etkinleştirme üzerinde fareyi devre dışı bırak + + + + Brightness + Parlaklık + + + + Contrast + Kontrast + + + + Gamma + Gama + + + + Reset + Yeniden başlat + + + + Image options + Sayfa ayarları + + + + Fit options + Sığdırma seçenekleri + + + + Enlarge images to fit width/height + Genişliğe/yüksekliği sığmaları için resimleri genişlet + + + + Double Page options + Çift Sayfa seçenekleri + + + + Show covers as single page + Kapakları tek sayfa olarak göster + + + + Scaling + Ölçeklendirme + + + + Scaling method + Ölçeklendirme yöntemi + + + + Nearest (fast, low quality) + En yakın (hızlı, düşük kalite) + + + + Bilinear + Çift doğrusal + + + + Lanczos (better quality) + Lanczos (daha kaliteli) + + + + Page Flow + Sayfa akışı + + + + Image adjustment + Resim ayarları + + + + + Restart is needed + Yeniden başlatılmalı + + + + Comics directory + Çizgi roman konumu + + + + PropertiesDialog + + + Day: + Gün: + + + + Plot + Argumento + + + + Size: + Boyut: + + + + Year: + Yıl: + + + + Inker(s): + Mürekkep(ler): + + + + Publishing + Yayın + + + + Publisher: + Yayıncı: + + + + General info + Genel bilgi + + + + Color/BW: + Renk/BW: + + + + Edit selected comics information + Seçilen çizgi roman bilgilerini düzenle + + + + Penciller(s): + Çizenler: + + + + Colorist(s): + Renklendiren: + + + + Issue number: + Yayın numarası: + + + + Month: + Ay: + + + + Notes: + Notlar: + + + + Synopsis: + Özet: @@ -2226,47 +2612,47 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Notes - + Notlar Load previous page as cover - + Önceki sayfayı kapak olarak yükle Load next page as cover - + Sonraki sayfayı kapak olarak yükle Reset cover to the default image - + Kapağı varsayılan görüntüye sıfırla Load custom cover image - + Özel kapak resmini yükle Series: - Seriler: + Seriler: alt. number: - + alternatif sayı: Alternate series: - + Alternatif seri: Series Group: - + Seri Grubu: @@ -2276,47 +2662,47 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Editor(s): - + Editör(ler): Imprint: - + Künye: Type: - + Tip: Language (ISO): - + Dil (ISO): Teams: - + Takımlar: Locations: - + Konumlar: Main character or team: - + Ana karakter veya takım: Review: - + Gözden geçirmek: Tags: - + Etiketler: @@ -2331,12 +2717,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Invalid cover - + Geçersiz kapak The image is invalid. - + Resim geçersiz. @@ -2368,12 +2754,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t of: - + ile ilgili: Arc number: - + Ark numarası: @@ -2382,12 +2768,28 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Manga: - Manga: + Manga t?r?: - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine bağlantısı: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> görüntüle </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine bağlantısı: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> görüntüle </a> + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer, YACReaderLibrary'nin başsız (gui yok) sürümüdür. + +Bu uygulama kalıcı ayarları destekler, bunları ayarlamak için bu dosyayı düzenleyin %1 +Mevcut ayarlar hakkında bilgi edinmek için lütfen https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md adresindeki belgelere bakın. @@ -2400,7 +2802,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t unable to load 7z lib from ./utils - ./utils'den 7z lib yüklenemiyor + ./utils'den 7z lib yüklenemiyor @@ -2433,61 +2835,79 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Ölümcül - + Select custom cover - + Özel kapak seçin - + Images (%1) - + Resimler (%1) + + + + The file could not be read or is not valid JSON. + Dosya okunamadı veya geçerli bir JSON değil. + + + + This theme is for %1, not %2. + Bu tema %2 için değil, %1 içindir. + + + + Libraries + Kütüphaneler + + + + Folders + Klasör + + + + Reading Lists + Okuma Listeleri QsLogging::LogWindowModel - Time - Süre + Süre - Level - Düzel + Düzel - Message - Mesaj + Mesaj QsLogging::Window - &Pause - &Duraklak + &Duraklak - &Resume - &Sürdür + &Sürdür - Save log - Günlük tut + Günlük tut - Log file (*.log) - Günlük dosyası (*.log) + Günlük dosyası (*.log) RenameLibraryDialog - + Rename current library Kütüphaneyi yeniden adlandır @@ -2510,18 +2930,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of volumes found : %1 Bulunan bölüm sayısı: %1 - - + + page %1 of %2 sayfa %1 / %2 - + Number of %1 found : %2 Sayı %1, bulunan : %2 @@ -2532,17 +2952,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - Lütfen bazı ek bilgiler sağlayın. + Lütfen bazı ek bilgiler sağlayın. - + Series: Seriler: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Tam eşleme aramasını kullanın. Addaki bazı sözcüklerle eşleşen ciltleri bulmak istiyorsanız devre dışı bırakın. @@ -2553,42 +2973,42 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Lütfen bazı ek bilgiler sağlayın. - + Series: Seriler: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + Tam eşleme aramasını kullanın. Addaki bazı sözcüklerle eşleşen ciltleri bulmak istiyorsanız devre dışı bırakın. SelectComic - + Please, select the right comic info. Lütfen, doğru çizgi roman bilgisini seçin. - + comics çizgi roman - + loading cover kapak yükleniyor - + loading description açıklama yükleniyor - + comic description unavailable - + çizgi roman açıklaması mevcut değil description unavailable @@ -2598,39 +3018,39 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + Please, select the right series for your comic. Çizgi romanınız için doğru seriyi seçin. - + Filter: - + Filtre: - + volumes sayı - + Nothing found, clear the filter if any. - + Hiçbir şey bulunamadı, varsa filtreyi temizleyin. - + loading cover kapak yükleniyor - + loading description açıklama yükleniyor - + volume description unavailable - + cilt açıklaması kullanılamıyor description unavailable @@ -2640,12 +3060,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SeriesQuestion - + no hayır - + yes evet @@ -2658,41 +3078,41 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + Port - Port + Liman - + enable the server erişilebilir server - + set port Port Ayarla - + Server connectivity information Sunucu bağlantı bilgileri - + Scan it! Tara! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader, iOS ve Android cihazlarda kullanılabilir.<br/>Bunu <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> veya <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a> için keşfedin. - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - YACReader, iOS cihazlar için kullanılabilir. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Keşfedin! </a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + YACReader, iOS cihazlar için kullanılabilir. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Keşfedin! </a> - + Choose an IP address IP adresi seçin @@ -2710,339 +3130,1167 @@ performansı iyileştirmek için SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. Lütfen, çizgi romanların bilgileriyle eşleşene kadar soldaki çizgi roman listesini sıralayın. - + sort comics to match comic information çizgi roman bilgilerini eşleştirmek için çizgi romanları sıralayın - + issues sayı - + remove selected comics seçilen çizgi romanları kaldır - + restore all removed comics tüm seçilen çizgi romanları geri yükle - TitleHeader + ThemeEditorDialog - - SEARCH - ARA + + Theme Editor + Tema Düzenleyici - - - UpdateLibraryDialog - - Update library - Kütüphaneyi güncelle + + + + + - - Cancel - Vazgeç + + - + - - - Updating.... - Güncelleniyor... + + i + Ben - - - VolumeComicsModel - - title - başlık + + Expand all + Tümünü genişlet - - - VolumesModel - - year - yıl + + Collapse all + Tümünü daralt - - issues - sayı + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Kullanıcı arayüzünde seçilen değeri (macenta / geçişli / 0↔10) yanıp sönmek için basılı tutun. Sürümler orijinali geri yükler. - - publisher - yayıncı + + Search… + Aramak… - - - YACReader::TrayIconController - - &Restore - &Geri Yükle + + Light + Işık - &Quit - &Çıkış + + Dark + Karanlık - - Systray - Sistem tepsisi + + ID: + İD: - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - YACReaderLibrary sistem tepsisinde çalışmaya devam edecektir. Programı sonlandırmak için sistem tepsisi simgesinin bağlam menüsünden <b>Çık</b>'ı seçin. + + Display name: + Ekran adı: - - - YACReader::WhatsNewDialog - - Close - Kapat + + Variant: + Varyant: - - - YACReaderDeletingProgress - - cancel - vazgeç + + Theme info + Tema bilgisi - - Please wait, deleting in progress... - Lütfen bekleyin, silme işlemi yapılıyor... + + Parameter + Parametre - - - YACReaderFieldEdit - - Restore to default - Varsayılana dön + + Value + Değer - - - Click to overwrite - Üstüne yazmak için tıkla + + Save and apply + Kaydet ve uygula - - - YACReaderFieldPlainTextEdit - - Restore to default - Varsayılana dön + + Export to file... + Dosyaya aktar... - - - - - Click to overwrite - Üstüne yazmak için tıkla + + Load from file... + Dosyadan yükle... - - - YACReaderFlowConfigWidget - - CoverFlow look - Kapak akışı görünümü + + Close + Kapat - - How to show covers: - Kapaklar nasıl gözüksün: + + Double-click to edit color + Rengi düzenlemek için çift tıklayın - - Stripe look - Şerit görünüm + + + + + + + true + doğru - - Overlapped Stripe look - Çakışan şerit görünüm + + + + + false + YANLIŞ - - - YACReaderGLFlowConfigWidget - - Zoom - Zoom + + Double-click to toggle + Geçiş yapmak için çift tıklayın - - Light - Işık + + Double-click to edit value + Değeri düzenlemek için çift tıklayın - - Show advanced settings - Daha fazla ayar göster + + + + Edit: %1 + Düzenleme: %1 - - Roulette look - Rulet görünüm + + Save theme + Temayı kaydet - - Cover Angle - Kapak Açısı + + + JSON files (*.json);;All files (*) + JSON dosyaları (*.json);;Tüm dosyalar (*) - - Stripe look - Strip görünüm + + Save failed + Kaydetme başarısız oldu - - Position - Pozisyon + + Could not open file for writing: +%1 + Dosya yazmak için açılamadı: +%1 - - Z offset - Z dengesi + + Load theme + Temayı yükle - - Y offset - Y dengesi + + + + Load failed + Yükleme başarısız oldu - - Central gap - Boş merkez + + Could not open file: +%1 + Dosya açılamadı: +%1 + + + + Invalid JSON: +%1 + Geçersiz JSON: +%1 + + + + Expected a JSON object. + Bir JSON nesnesi bekleniyordu. + + + + TitleHeader + + + SEARCH + ARA + + + + UpdateLibraryDialog + + + Update library + Kütüphaneyi güncelle + + + + Cancel + Vazgeç + + + + Updating.... + Güncelleniyor... + + + + Viewer + + + + Press 'O' to open comic. + 'O'ya basarak aç. + + + + Not found + Bulunamad + + + + Comic not found + Çizgi roman bulunamadı + + + + Error opening comic + Çizgi roman açılırken hata + + + + CRC Error + CRC Hatası + + + + Loading...please wait! + Yükleniyor... lütfen bekleyin! + + + + Page not available! + Sayfa bulunamadı! + + + + Cover! + Kapak! + + + + Last page! + Son sayfa! + + + + VolumeComicsModel + + + title + başlık + + + + VolumesModel + + + year + yıl + + + + issues + sayı + + + + publisher + yayıncı + + + + YACReader3DFlowConfigWidget + + + Presets: + Hazırlayan: + + + + Classic look + Klasik görünüm + + + + Stripe look + Şerit görünüm + + + + Overlapped Stripe look + Çakışan şerit görünüm + + + + Modern look + Modern görünüm + + + + Roulette look + Rulet görünüm + + + + Show advanced settings + Daha fazla ayar göster + + + + Custom: + Kişisel: + + + + View angle + Bakış açısı + + + + Position + Pozisyon + + + + Cover gap + Kapak boşluğu + + + + Central gap + Boş merkez + + + + Zoom + Yakınlaş + + + + Y offset + Y dengesi + + + + Z offset + Z dengesi + + + + Cover Angle + Kapak Açısı + + + + Visibility + Görünülebilirlik + + + + Light + Işık + + + + Max angle + Maksimum açı + + + + Low Performance + Düşük Performans + + + + High Performance + Yüksek Performans + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + VSync kullan + + + + Performance: + Performans: + + + + YACReader::MainWindowViewer + + + &Open + &Aç + + + + Open a comic + Çizgi romanı aç + + + + New instance + Yeni örnek + + + + Open Folder + Dosyayı Aç + + + + Open image folder + Resim dosyasınıaç + + + + Open latest comic + En son çizgi romanı aç + + + + Open the latest comic opened in the previous reading session + Önceki okuma oturumunda açılan en son çizgi romanı aç + + + + Clear + Temizle + + + + Clear open recent list + Son açılanlar listesini temizle + + + + Save + Kaydet + + + + + Save current page + Geçerli sayfayı kaydet + + + + Previous Comic + Önce ki çizgi roman + + + + + + Open previous comic + Önceki çizgi romanı aç + + + + Next Comic + Sırada ki çizgi roman + + + + + + Open next comic + Sıradaki çizgi romanı aç + + + + &Previous + &Geri + + + + + + Go to previous page + Önceki sayfaya dön + + + + &Next + &İleri + + + + + + Go to next page + Sonra ki sayfaya geç + + + + Fit Height + Yüksekliğe Sığdır + + + + Fit image to height + Uygun yüksekliğe getir + + + + Fit Width + Uygun Genişlik + + + + Fit image to width + Görüntüyü sığdır + + + + Show full size + Tam erken + + + + Fit to page + Sayfaya sığdır + + + + Continuous scroll + Sürekli kaydırma + + + + Switch to continuous scroll mode + Sürekli kaydırma moduna geç + + + + Reset zoom + Yakınlaştırmayı sıfırla + + + + Show zoom slider + Yakınlaştırma çubuğunu göster + + + + Zoom+ + Yakınlaştır + + + + Zoom- + Uzaklaştır + + + + Rotate image to the left + Sayfayı sola yatır + + + + Rotate image to the right + Sayfayı sağa yator + + + + Double page mode + Çift sayfa modu + + + + Switch to double page mode + Çift sayfa moduna geç + + + + Double page manga mode + Çift sayfa manga kipi + + + + Reverse reading order in double page mode + Çift sayfa kipinde ters okuma sırası + + + + Go To + Git + + + + Go to page ... + Sayfata git... + + + + Options + Ayarlar + + + + YACReader options + YACReader ayarları + + + + + Help + Yardım + + + + Help, About YACReader + Yardım, Bigli, YACReader + + + + Magnifying glass + Büyüteç + + + + Switch Magnifying glass + Büyüteç + + + + Set bookmark + Yer imi yap + + + + Set a bookmark on the current page + Sayfayı yer imi olarak ayarla + + + + Show bookmarks + Yer imlerini göster + + + + Show the bookmarks of the current comic + Bu çizgi romanın yer imlerini göster + + + + Show keyboard shortcuts + Klavye kısayollarını göster + + + + Show Info + Bilgiyi göster + + + + Close + Kapat + + + + Show Dictionary + Sözlüğü göster + + + + Show go to flow + "Comic Flow'a git"i göster + + + + Edit shortcuts + Kısayolları düzenle + + + + &File + &Dosya + + + + + Open recent + Son dosyaları aç + + + + File + Dosya + + + + Edit + Düzenle + + + + View + Görünüm + + + + Go + Git + + + + Window + Pencere + + + + + + Open Comic + Çizgi Romanı Aç + + + + + + Comic files + Çizgi Roman Dosyaları + + + + Open folder + Dosyayı aç + + + + page_%1.jpg + sayfa_%1.jpg + + + + Image files (*.jpg) + Resim dosyaları (*.jpg) + + + + + Comics + Çizgi Roman + + + + + General + Genel + + + + + Magnifiying glass + Büyüteç + + + + + Page adjustement + Sayfa ayarı + + + + + Reading + Okuma + + + + Toggle fullscreen mode + Tam ekran kipini aç/kapat + + + + Hide/show toolbar + Araç çubuğunu göster/gizle + + + + Size up magnifying glass + Büyüteci büyüt + + + + Size down magnifying glass + Büyüteci küçült + + + + Zoom in magnifying glass + Büyüteci yakınlaştır + + + + Zoom out magnifying glass + Büyüteci uzaklaştır + + + + Reset magnifying glass + Büyüteci sıfırla + + + + Toggle between fit to width and fit to height + Genişliğe sığdır ile yüksekliğe sığdır arasında geçiş yap + + + + Autoscroll down + Otomatik aşağı kaydır + + + + Autoscroll up + Otomatik yukarı kaydır + + + + Autoscroll forward, horizontal first + Otomatik ileri kaydır, önce yatay + + + + Autoscroll backward, horizontal first + Otomatik geri kaydır, önce yatay + + + + Autoscroll forward, vertical first + Otomatik ileri kaydır, önce dikey + + + + Autoscroll backward, vertical first + Otomatik geri kaydır, önce dikey + + + + Move down + Aşağı git + + + + Move up + Yukarı git + + + + Move left + Sola git + + + + Move right + Sağa git + + + + Go to the first page + İlk sayfaya git + + + + Go to the last page + En son sayfaya git + + + + Offset double page to the left + Çift sayfayı sola kaydır + + + + Offset double page to the right + Çift sayfayı sağa kaydır + + + + There is a new version available + Yeni versiyon mevcut + + + + Do you want to download the new version? + Yeni versiyonu indirmek ister misin ? + + + + Remind me in 14 days + 14 gün içinde hatırlat + + + + Not now + Şimdi değil + + + + YACReader::TrayIconController + + + &Restore + &Geri Yükle + + + &Quit + &Çıkış + + + + Systray + Sistem tepsisi + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary sistem tepsisinde çalışmaya devam edecektir. Programı sonlandırmak için sistem tepsisi simgesinin bağlam menüsünden <b>Çık</b>'ı seçin. + + + + YACReader::WhatsNewDialog + + Close + Kapat + + + + YACReaderFieldEdit + + + Restore to default + Varsayılana dön + + + + + Click to overwrite + Üstüne yazmak için tıkla + + + + YACReaderFieldPlainTextEdit + + + Restore to default + Varsayılana dön + + + + + + + Click to overwrite + Üstüne yazmak için tıkla + + + + YACReaderFlowConfigWidget + + CoverFlow look + Kapak akışı görünümü + + + How to show covers: + Kapaklar nasıl gözüksün: + + + Stripe look + Şerit görünüm + + + Overlapped Stripe look + Çakışan şerit görünüm + + + + YACReaderGLFlowConfigWidget + + Zoom + Yakınlaş + + + Light + Işık + + + Show advanced settings + Daha fazla ayar göster + + + Roulette look + Rulet görünüm + + + Cover Angle + Kapak Açısı + + + Stripe look + Strip görünüm + + + Position + Pozisyon + + + Z offset + Z dengesi + + + Y offset + Y dengesi + + + Central gap + Boş merkez - Presets: - Hazırlayan: + Hazırlayan: - Overlapped Stripe look - Çakışan şerit görünüm + Çakışan şerit görünüm - Modern look - Modern görünüm + Modern görünüm - View angle - Bakış açısı + Bakış açısı - Max angle - Maksimum açı + Maksimum açı - Custom: - Kişisel: + Kişisel: - Classic look - Klasik görünüm + Klasik görünüm - Cover gap - Kapak boşluğu + Kapak boşluğu - High Performance - Yüksek Performans + Yüksek Performans - Performance: - Performans: + Performans: - Use VSync (improve the image quality in fullscreen mode, worse performance) - VSync kullan + VSync kullan - Visibility - Görünülebilirlik + Görünülebilirlik - Low Performance - Düşük Performans + Düşük Performans YACReaderNavigationController - No favorites - Favoriler boş + Favoriler boş - You are not reading anything yet, come on!! - Henüz bir şey okumuyorsun, hadi ama! - - - - There are no recent comics! - + Henüz bir şey okumuyorsun, hadi ama! YACReaderOptionsDialog - + Save Kaydet - Use hardware acceleration (restart needed) - Yüksek donanımlı kullan (yeniden başlatmak gerekli) + Yüksek donanımlı kullan (yeniden başlatmak gerekli) - + Cancel Vazgeç - + Edit shortcuts Kısayolları düzenle - + Shortcuts Kısayollar @@ -3050,7 +4298,7 @@ performansı iyileştirmek için YACReaderSearchLineEdit - + type to search aramak için yazınız @@ -3058,34 +4306,60 @@ performansı iyileştirmek için YACReaderSideBar - LIBRARIES - KÜTÜPHANELER + KÜTÜPHANELER - FOLDERS - DOSYALAR + DOSYALAR - Libraries - Kütüphaneler + Kütüphaneler - Folders - Klasör + Klasör - Reading Lists - Okuma Listeleri + Okuma Listeleri - READING LISTS - OKUMA LİSTELERİ + OKUMA LİSTELERİ + + + + YACReaderSlider + + + Reset + Yeniden başlat + + + + YACReaderTranslator + + + YACReader translator + YACReader çevirmeni + + + + + Translation + Çeviri + + + + clear + temizle + + + + Service not available + Servis kullanılamıyor diff --git a/YACReaderLibrary/yacreaderlibrary_zh_CN.ts b/YACReaderLibrary/yacreaderlibrary_zh_CN.ts index 0b3755536..2223ff004 100644 --- a/YACReaderLibrary/yacreaderlibrary_zh_CN.ts +++ b/YACReaderLibrary/yacreaderlibrary_zh_CN.ts @@ -12,82 +12,70 @@ AddLabelDialog - red - + - blue - + - dark - 深色 + 深色 - cyan - + - pink - + - green - 绿 + 绿 - light - 浅色 + 浅色 - white - + - + Choose a color: 选择标签颜色: - + accept 接受 - + cancel 取消 - orange - + - purple - + - violet - 紫罗兰 + 紫罗兰 - yellow - + - + Label name: 标签名称: @@ -100,7 +88,7 @@ 添加 - + Add an existing library 添加一个现有库 @@ -134,8 +122,8 @@ - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - 你需要拥有自己的API密钥才能够连接Comic Vine. 你可以通过这个链接获得一个免费的<a href="http://www.comicvine.com/api/">API</a>密钥 + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要拥有自己的API密钥才能够连接Comic Vine. 你可以通过这个链接获得一个免费的<a href="http://www.comicvine.com/api/">API</a>密钥 @@ -143,95 +131,235 @@ 在此粘贴你的Comic Vine API + + AppearanceTabWidget + + + Color scheme + 配色方案 + + + + System + 系统 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 风俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 删除此用户导入的主题 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定义: + + + + Import theme... + 导入主题... + + + + Theme + 主题 + + + + Theme editor + 主题编辑器 + + + + Open Theme Editor... + 打开主题编辑器... + + + + Theme editor error + 主题编辑器错误 + + + + The current theme JSON could not be loaded. + 无法加载当前主题 JSON。 + + + + Import theme + 导入主题 + + + + JSON files (*.json);;All files (*) + JSON 文件 (*.json);;所有文件 (*) + + + + Could not import theme from: +%1 + 无法从以下位置导入主题: +%1 + + + + Could not import theme from: +%1 + +%2 + 无法从以下位置导入主题: +%1 + +%2 + + + + Import failed + 导入失败 + + + + BookmarksDialog + + + Lastest Page + 尾页 + + + + Close + 关闭 + + + + Click on any image to go to the bookmark + 点击任意图片以跳转至相应书签位置 + + + + + Loading... + 载入中... + + ClassicComicsView - + Hide comic flow - 隐藏漫画流 + 隐藏 Comic Flow ComicInfoView - + b/w 黑白 - + cover artist - 封面设计 + 封面画师 - + imprint - 压印 + 出版品牌 - + Teams 团队 - + color 彩色 - + inker - 上墨师 + 墨线师 - + Main character or team 主要角色或团队 - + penciller - 线稿师 + 铅笔画师 - + colorist 上色师 - + editor 编辑 - + writer - 作者 + 编剧 - + Characters 角色 - + Authors 作者 - + Publisher - 出版商 + 出版社 - + Locations 地点 - + letterer - 嵌字师 + 字效师 @@ -305,74 +433,82 @@ ComicVineDialog - + back 返回 - + next 下一步 - + skip 忽略 - + close 关闭 - - + + Retrieving tags for : %1 正在检索标签: %1 - + Looking for comic... 搜索漫画中... - + search 搜索 - - - + + + Looking for volume... 搜索卷... - - + + comic %1 of %2 - %3 第 %1 本 共 %2 本 - %3 - + %1 comics selected 已选择 %1 本漫画 - + Error connecting to ComicVine ComicVine 连接时出错 - + Retrieving volume info... 正在接收卷信息... + + ContinuousPageWidget + + + Loading page %1 + 正在加载页面 %1 + + CreateLibraryDialog - + Create new library 创建新的漫画库 @@ -392,7 +528,7 @@ 创建一个新的库可能需要几分钟时间,您可以先停止该进程,稍后可以通过更新库选项来更新数据。 - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder 所选路径不存在或不是有效路径. 确保您具有此文件夹的写入权限 @@ -407,7 +543,7 @@ 库名: - + Path not found 未找到路径 @@ -415,7 +551,7 @@ EditShortcutsDialog - + Shortcut in use 快捷键被占用 @@ -430,9 +566,9 @@ 快捷键设置 - - The shortcut "%1" is already assigned to other function - 快捷键 "%1" 已被映射至其他功能 + + The shortcut "%1" is already assigned to other function + 快捷键 "%1" 已被映射至其他功能 @@ -443,27 +579,28 @@ EmptyFolderWidget - Empty folder - 空文件夹 + 空文件夹 - - Subfolders in this folder - 建立子文件夹 + 建立子文件夹 - Drag and drop folders and comics here - 拖动文件夹或者漫画到这里 + 拖动文件夹或者漫画到这里 + + + + This folder doesn't contain comics yet + 该文件夹还没有漫画 EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet 此标签尚未包含漫画 @@ -475,6 +612,24 @@ 此阅读列表尚未包含任何漫画 + + EmptySpecialListWidget + + + No favorites + 没有收藏 + + + + You are not reading anything yet, come on!! + 你还没有阅读任何东西,加油!! + + + + There are no recent comics! + 没有最近的漫画! + + ExportComicsInfoDialog @@ -483,7 +638,7 @@ 输出文件: - + Destination database name 目标数据库名称 @@ -498,17 +653,17 @@ 创建 - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder 选定的输出文件路径不存在或路径无效. 确保您具有此文件夹的写入权限 - + Export comics info 导出漫画信息 - + Problem found while writing 写入时出现问题 @@ -526,7 +681,7 @@ 创建 - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder 选定的输出文件路径不存在或路径无效. 确保您具有此文件夹的写入权限 @@ -536,17 +691,17 @@ 输出文件夹: - + Problem found while writing 写入时出现问题 - + Create covers package 创建封面包 - + Destination directory 目标目录 @@ -577,7 +732,7 @@ FolderContentView - + Continue Reading... 继续阅读... @@ -585,15 +740,51 @@ FolderContentView6 - Continue Reading... - 继续阅读... + 继续阅读... + + + + GoToDialog + + + Page : + 页码 : + + + + Go To + 跳转 + + + + Cancel + 取消 + + + + + Total pages : + 总页数: + + + + Go to... + 跳转至 ... + + + + GoToFlowToolBar + + + Page : + 页码 : GridComicsView - + Show info 显示信息 @@ -601,17 +792,17 @@ HelpAboutDialog - + Help 帮助 - + About 关于 - + System info 系统信息 @@ -639,7 +830,7 @@ 导入漫画信息 - + Comics info file (*.ydb) 漫画信息文件(*.ydb) @@ -662,7 +853,7 @@ 解压 - + Compresed library covers (*.clc) 已压缩的库封面 (*.clc) @@ -677,7 +868,7 @@ 库名: - + Extract a catalog 提取目录 @@ -685,52 +876,52 @@ ImportWidget - + stop 停止 - + Importing comics 正在导入漫画 - + Scanning the library 正在扫描库 - + Upgrading the library 正在更新库 - + <p>The current library is being upgraded, please wait.</p> <p>正在更新当前漫画库, 请稍候.</p> - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderLibrary现在正在创建一个新库。</p><p>这可能需要几分钟时间,您可以先停止该进程,稍后可以通过更新库选项来更新数据。</p> - + Some of the comics being added... 正在添加漫画... - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> <p>正在扫描当前库的旧版 XML metadata 信息。</p><p>这只需要执行一次,且只有当创建库的 YACReaderLibrary 版本低于 9.8.2 时。</p> - + Updating the library 正在更新库 - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>正在更新当前库。要获得更快的更新,请经常更新您的库。</p><p>您可以停止该进程,稍后继续更新操作。</p> @@ -742,12 +933,12 @@ 编辑 - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. 所选文件夹不包含任何库。 - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? 此库是使用旧版本的YACReaderLibrary创建的. 它需要更新. 现在更新? @@ -756,12 +947,12 @@ 退出(&Q) - + Upgrade failed 更新失败 - + Comic 漫画 @@ -770,16 +961,16 @@ 四格漫画 - - - + + + comic 漫画 - - - + + + manga 日本漫画 @@ -788,12 +979,12 @@ 设置为正常向 - + Folder name: 文件夹名称: - + The selected folder and all its contents will be deleted from your disk. Are you sure? 所选文件夹及其所有内容将从磁盘中删除。 你确定吗? @@ -810,12 +1001,12 @@ 设为日漫 - + Rescan library for XML info 重新扫描库的 XML 信息 - + Error opening the library 打开库时出错 @@ -824,8 +1015,8 @@ 显示/隐藏标记 - - + + YACReader not found YACReader 未找到 @@ -834,7 +1025,7 @@ 显示漫画服务器选项对话框 - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. 尝试删除所选文件夹时出现问题。 请检查写入权限,并确保没有其他应用程序在使用这些文件夹或文件。 @@ -847,7 +1038,7 @@ 漫画设为已读 - + Rename list name 重命名列表 @@ -856,17 +1047,17 @@ 将所选漫画添加到收藏夹列表 - + Remove and delete metadata 移除并删除元数据 - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. 未找到YACReader. YACReader应安装在与YACReaderLibrary相同的文件夹中. - + Old library 旧的库 @@ -879,17 +1070,17 @@ 重命名任何选定的标签或列表 - + Set as completed 设为已完成 - - There was an error accessing the folder's path + + There was an error accessing the folder's path 访问文件夹的路径时出错 - + Library @@ -898,7 +1089,7 @@ 在当前库下添加新的文件夹 - + Comics will only be deleted from the current label/list. Are you sure? 漫画只会从当前标签/列表中删除。 你确定吗? @@ -911,13 +1102,13 @@ 全屏模式 开/关 - + This library was created with a newer version of YACReaderLibrary. Download the new version now? 此库是使用较新版本的YACReaderLibrary创建的。 立即下载新版本? - - + + Moving comics... 移动漫画中... @@ -930,64 +1121,64 @@ 更新当前库 - - + + Copying comics... 复制漫画中... - - Library '%1' is no longer available. Do you want to remove it? - 库 '%1' 不再可用。 你想删除它吗? + + Library '%1' is no longer available. Do you want to remove it? + 库 '%1' 不再可用。 你想删除它吗? Update library 更新库 - - - + + + web comic 网络漫画 - + Open folder... 打开文件夹... - + Set custom cover - + 设置自定义封面 - + Delete custom cover - + 删除自定义封面 - + Error - 错误 + 错误 - + Error opening comic with third party reader. - + 使用第三方阅读器打开漫画时出错。 - + Do you want remove 你想要删除 - + Set as uncompleted 设为未完成 - + Error in path 路径错误 @@ -996,24 +1187,24 @@ 重置漫画评分 - + Error updating the library 更新库时出错 - + Folder 文件夹 - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? 所选项目将被删除,您的漫画或文件夹将不会从您的磁盘中删除。 你确定吗? - - - + + + western manga (left to right) 欧美漫画(从左到右) @@ -1042,8 +1233,8 @@ 设置漫画为 - - + + List name: 列表名称: @@ -1052,16 +1243,16 @@ 添加到... - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - 库 '%1' 是通过旧版本的YACReaderLibrary创建的。 必须再次创建。 你想现在创建吗? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 库 '%1' 是通过旧版本的YACReaderLibrary创建的。 必须再次创建。 你想现在创建吗? Pack covers 打包封面 - + Save covers 保存封面 @@ -1074,17 +1265,17 @@ 从当前库移除阅读列表 - + YACReader not found. There might be a problem with your YACReader installation. 未找到YACReader. YACReader的安装可能有问题. - + Add new reading lists 添加新的阅读列表 - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -1097,17 +1288,17 @@ YACReaderLibrary will not stop you from creating more libraries but you should k YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低的库数量来提升性能。 - + Set as read 设为已读 - + Assign comics numbers 分配漫画编号 - + There were errors during library upgrade in: 漫画库更新时出现错误: @@ -1124,7 +1315,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 显示选项对话框 - + Please, select a folder first 请先选择一个文件夹 @@ -1133,7 +1324,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 创建一个新的库 - + Library not available 库不可用 @@ -1142,7 +1333,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 导入漫画信息 - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. 尝试删除所选漫画时出现问题。 请检查所选文件或包含文件夹中的写入权限。 @@ -1163,30 +1354,30 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 打开当前漫画 - + YACReader Library YACReader 库 Set issue as manga - Set issue as manga + 将问题设置为漫画 Add a new reading list to the current library 在当前库添加新的阅读列表 - + Error creating the library 创建库时出错 - + You are adding too many libraries. 您添加的库太多了。 - + Update folder 更新文件夹 @@ -1199,7 +1390,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 解压封面 - + Update needed 需要更新 @@ -1212,69 +1403,69 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 显示或隐藏阅读标记 - + Library name already exists 库名已存在 - - There is another library with the name '%1'. - 已存在另一个名为'%1'的库。 + + There is another library with the name '%1'. + 已存在另一个名为'%1'的库。 Remove reading list 移除阅读列表 - + Delete folder 删除文件夹 - + Assign numbers starting in: 从以下位置开始分配编号: - + Download new version 下载新版本 - - - - + + + + Set type 设置类型 - + Library info - + 图书馆信息 - + Invalid image - + 图片无效 - + The selected file is not a valid image. - + 所选文件不是有效图像。 - + Error saving cover - + 保存封面时出错 - + There was an error saving the cover image. - + 保存封面图像时出错。 - + Delete comics 删除漫画 @@ -1283,7 +1474,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 聚焦于搜索行 - + Add new folder 添加新的文件夹 @@ -1316,7 +1507,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 重命名列表 - + Delete list/label 删除 列表/标签 @@ -1337,7 +1528,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 选择根节点 - + No folder selected 没有选中的文件夹 @@ -1350,7 +1541,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 解压目录 - + All the selected comics will be deleted from your disk. Are you sure? 所有选定的漫画都将从您的磁盘中删除。你确定吗? @@ -1363,7 +1554,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 从 Comic Vine 下载标签 - + Remove comics 移除漫画 @@ -1372,8 +1563,8 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 在当前库添加标签 - - + + Set as unread 设为未读 @@ -1382,7 +1573,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 尝试查找漫画文件内嵌的 XML 信息。只有当创建库的 YACReaderLibrary 版本低于 9.8.2 或者使用第三方软件嵌入 XML 信息时,才需要执行该操作。 - + Library not found 未找到库 @@ -1407,20 +1598,20 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 聚焦于漫画视图 - - + + Unable to delete 无法删除 - - - + + + 4koma (top to botom) 四格漫画(从上到下) - + library? 库? @@ -1429,7 +1620,7 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 保存所选的封面为jpg - + Are you sure? 你确定吗? @@ -1437,439 +1628,439 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 LibraryWindowActions - + Create a new library - 创建一个新的库 + 创建一个新的库 - + Open an existing library - 打开现有的库 + 打开现有的库 - - + + Export comics info - 导出漫画信息 + 导出漫画信息 - - + + Import comics info - 导入漫画信息 + 导入漫画信息 - + Pack covers - 打包封面 + 打包封面 - + Pack the covers of the selected library - 打包所选库的封面 + 打包所选库的封面 - + Unpack covers - 解压封面 + 解压封面 - + Unpack a catalog - 解压目录 + 解压目录 - + Update library - 更新库 + 更新库 - + Update current library - 更新当前库 + 更新当前库 - + Rename library - 重命名库 + 重命名库 - + Rename current library - 重命名当前库 + 重命名当前库 - + Remove library - 移除库 + 移除库 - + Remove current library from your collection - 从您的集合中移除当前库 + 从您的集合中移除当前库 - + Rescan library for XML info - 重新扫描库的 XML 信息 + 重新扫描库的 XML 信息 - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - 尝试查找漫画文件内嵌的 XML 信息。只有当创建库的 YACReaderLibrary 版本低于 9.8.2 或者使用第三方软件嵌入 XML 信息时,才需要执行该操作。 + 尝试查找漫画文件内嵌的 XML 信息。只有当创建库的 YACReaderLibrary 版本低于 9.8.2 或者使用第三方软件嵌入 XML 信息时,才需要执行该操作。 - + Show library info - + 显示图书馆信息 - + Show information about the current library - + 显示当前库的信息 - + Open current comic - 打开当前漫画 + 打开当前漫画 - + Open current comic on YACReader - 用YACReader打开漫画 + 用YACReader打开漫画 - + Save selected covers to... - 选中的封面保存到... + 选中的封面保存到... - + Save covers of the selected comics as JPG files - 保存所选的封面为jpg + 保存所选的封面为jpg - - + + Set as read - 设为已读 + 设为已读 - + Set comic as read - 漫画设为已读 + 漫画设为已读 - - + + Set as unread - 设为未读 + 设为未读 - + Set comic as unread - 漫画设为未读 + 漫画设为未读 - - + + manga - 日本漫画 + 日本漫画 - + Set issue as manga - Set issue as manga + 将问题设置为漫画 - - + + comic - 漫画 + 漫画 - + Set issue as normal - 设置漫画为 + 设置漫画为 - + western manga - 欧美漫画 + 欧美漫画 - + Set issue as western manga - 设置为欧美漫画 + 设置为欧美漫画 - - + + web comic - 网络漫画 + 网络漫画 - + Set issue as web comic - 设置为网络漫画 + 设置为网络漫画 - - + + yonkoma - 四格漫画 + 四格漫画 - + Set issue as yonkoma - 设置为四格漫画 + 设置为四格漫画 - + Show/Hide marks - 显示/隐藏标记 + 显示/隐藏标记 - + Show or hide read marks - 显示或隐藏阅读标记 + 显示或隐藏阅读标记 - + Show/Hide recent indicator - 显示/隐藏最近的指示标志 + 显示/隐藏最近的指示标志 - + Show or hide recent indicator - 显示或隐藏最近的指示标志 + 显示或隐藏最近的指示标志 - - + + Fullscreen mode on/off - 全屏模式 开/关 + 全屏模式 开/关 - + Help, About YACReader - 帮助, 关于 YACReader + 帮助, 关于 YACReader - + Add new folder - 添加新的文件夹 + 添加新的文件夹 - + Add new folder to the current library - 在当前库下添加新的文件夹 + 在当前库下添加新的文件夹 - + Delete folder - 删除文件夹 + 删除文件夹 - + Delete current folder from disk - 从磁盘上删除当前文件夹 + 从磁盘上删除当前文件夹 - + Select root node - 选择根节点 + 选择根节点 - + Expand all nodes - 展开所有节点 + 展开所有节点 - + Collapse all nodes - 折叠所有节点 + 折叠所有节点 - + Show options dialog - 显示选项对话框 + 显示选项对话框 - + Show comics server options dialog - 显示漫画服务器选项对话框 + 显示漫画服务器选项对话框 - - + + Change between comics views - 漫画视图之间的变化 + 漫画视图之间的变化 - + Open folder... - 打开文件夹... + 打开文件夹... - + Set as uncompleted - 设为未完成 + 设为未完成 - + Set as completed - 设为已完成 + 设为已完成 - + Set custom cover - + 设置自定义封面 - + Delete custom cover - + 删除自定义封面 - + western manga (left to right) - 欧美漫画(从左到右) + 欧美漫画(从左到右) - + Open containing folder... - 打开包含文件夹... + 打开包含文件夹... - + Reset comic rating - 重置漫画评分 + 重置漫画评分 - + Select all comics - 全选漫画 + 全选漫画 - + Edit - 编辑 + 编辑 - + Assign current order to comics - 将当前序号分配给漫画 + 将当前序号分配给漫画 - + Update cover - 更新封面 + 更新封面 - + Delete selected comics - 删除所选的漫画 + 删除所选的漫画 - + Delete metadata from selected comics - 从选定的漫画中删除元数据 + 从选定的漫画中删除元数据 - + Download tags from Comic Vine - 从 Comic Vine 下载标签 + 从 Comic Vine 下载标签 - + Focus search line - 聚焦于搜索行 + 聚焦于搜索行 - + Focus comics view - 聚焦于漫画视图 + 聚焦于漫画视图 - + Edit shortcuts - 编辑快捷键 + 编辑快捷键 - + &Quit - 退出(&Q) + 退出(&Q) - + Update folder - 更新文件夹 + 更新文件夹 - + Update current folder - 更新当前文件夹 + 更新当前文件夹 - + Scan legacy XML metadata - 扫描旧版 XML 元数据 + 扫描旧版 XML 元数据 - + Add new reading list - 添加新的阅读列表 + 添加新的阅读列表 - + Add a new reading list to the current library - 在当前库添加新的阅读列表 + 在当前库添加新的阅读列表 - + Remove reading list - 移除阅读列表 + 移除阅读列表 - + Remove current reading list from the library - 从当前库移除阅读列表 + 从当前库移除阅读列表 - + Add new label - 添加新标签 + 添加新标签 - + Add a new label to this library - 在当前库添加标签 + 在当前库添加标签 - + Rename selected list - 重命名列表 + 重命名列表 - + Rename any selected labels or lists - 重命名任何选定的标签或列表 + 重命名任何选定的标签或列表 - + Add to... - 添加到... + 添加到... - + Favorites - 收藏夹 + 收藏夹 - + Add selected comics to favorites list - 将所选漫画添加到收藏夹列表 + 将所选漫画添加到收藏夹列表 @@ -1883,88 +2074,89 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 LogWindow - &Copy - 复制(&C) + 复制(&C) - &Save - 保存(&S) + 保存(&S) - &Pause - 中止(&P) + 中止(&P) - C&lear - 清空(&l) + 清空(&l) - Level: - 等级: + 等级: - &Auto scroll - 自动滚动(&A) + 自动滚动(&A) - Log window - 日志窗口 + 日志窗口 NoLibrariesWidget - + create your first library 创建你的第一个库 - - You don't have any libraries yet + + You don't have any libraries yet 你还没有库 - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>您可以在任何文件夹中创建库,YACReaderLibrary将导入此文件夹中的所有漫画和文件夹。如果已有库,则可以打开它们。</p><p>您可以把YACReader当成独立应用来阅读电脑上的漫画。</p> - + add an existing one 添加一个现有库 + + NoSearchResultsWidget + + + No results + 没有结果 + + OptionsDialog - + Modifications detection 修改检测 - + Time: 时间: - + daily 每天 - + Restore defautls 恢复默认值 - + Close to tray 关闭至托盘 @@ -1973,145 +2165,171 @@ YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低 添加新漫画时从 ComicInfo.xml 导入元数据 - + Background 背景 - + Update libraries at certain time 定时更新库 - + 1 hour 1小时 - + Start into the system tray 启动至系统托盘 - + Display current comic banner - + 显示当前漫画横幅 - + Continue reading 继续阅读 - + Update libraries at startup 启动时更新库 - + + + Appearance + 外貌 + + + + + Language + 语言 + + + + + Application language + 应用程序语言 + + + + + System default + 系统默认 + + + Third party reader - + 第三方阅读器 - + Write {comic_file_path} where the path should go in the command - + 在命令中应将路径写入 {comic_file_path} - + + Clear - + 清空 - + 30 minutes 30分钟 - + 2 hours 2小时 - + 12 hours 12小时 - + Blur level 模糊 - + Compare the modified date of files when updating a library (not recommended) 更新库时比较文件的修改日期(不推荐) - + Import metadata from ComicInfo.xml when adding new comics 添加新漫画时从 ComicInfo.xml 导入元数据 - + Enable background image 启用背景图片 - + 4 hours 4小时 - + + Options 选项 - + Comic Vine API key Comic Vine API 密匙 - + Edit Comic Vine API key 编辑Comic Vine API 密匙 - + Tray icon settings (experimental) 托盘图标设置 (实验特性) - - + + Libraries - + 8 hours 8小时 - + Try to detect changes automatically 尝试自动检测变化 - + Interval: 间隔: - + ComicInfo.xml legacy support ComicInfo.xml 旧版支持 - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. 警告! 在库更新期间,将禁用对数据库的写入! @@ -2120,119 +2338,291 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 要停止自动更新,请点击库标题旁边的加载指示器。 - + Opacity level 透明度 - + Display continue reading banner 显示继续阅读横幅 - + + General 常规 - - Consider 'recent' items added or updated since X days ago + + Consider 'recent' items added or updated since X days ago 参考自 X 天前添加或更新的“最近”项目 - + Update libraries periodically 定期更新库 - + Use selected comic cover as background 使用选定的漫画封面做背景 - + Comic Flow - 漫画流 + Comic Flow - + Grid view 网格视图 - - - PropertiesDialog - - - - of: - of: + + My comics path + 我的漫画路径 - - Day: - 日: + + Display + 展示 - - Plot - 情节 + + Show time in current page information label + 在当前页面信息标签中显示时间 - - Notes - 笔记 + + "Go to flow" size + “转到 Comic Flow”大小 - - Load previous page as cover - + + Background color + 背景颜色 - - Load next page as cover - + + Choose + 选择 - - Reset cover to the default image - + + Scroll behaviour + 滚动效果 - - Load custom cover image - + + Disable scroll animations and smooth scrolling + 禁用滚动动画和平滑滚动 - - Size: - 大小: + + Do not turn page using scroll + 滚动时不翻页 - - Tags: - 标签: + + Use single scroll step to turn page + 使用单滚动步骤翻页 - - Invalid cover - + + Mouse mode + 鼠标模式 - - The image is invalid. - + + Only Back/Forward buttons can turn pages + 只有后退/前进按钮可以翻页 - - Type: - 类型: + + Use the Left/Right buttons to turn pages. + 使用向左/向右按钮翻页。 - - Year: - 年: + + Click left or right half of the screen to turn pages. + 单击屏幕的左半部分或右半部分即可翻页。 + + + + Quick Navigation Mode + 快速导航模式 + + + + Disable mouse over activation + 禁用鼠标激活 + + + + Brightness + 亮度 + + + + Contrast + 对比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 图片选项 + + + + Fit options + 适应项 + + + + Enlarge images to fit width/height + 放大图片以适应宽度/高度 + + + + Double Page options + 双页选项 + + + + Show covers as single page + 显示封面为单页 + + + + Scaling + 缩放 + + + + Scaling method + 缩放方法 + + + + Nearest (fast, low quality) + 最近(快速,低质量) + + + + Bilinear + 双线性 + + + + Lanczos (better quality) + Lanczos(质量更好) + + + + Page Flow + 页面流 + + + + Image adjustment + 图像调整 + + + + + Restart is needed + 需要重启 + + + + Comics directory + 漫画目录 + + + + PropertiesDialog + + + + + of: + 的: + + + + Day: + 日: + + + + Plot + 情节 + + + + Notes + 笔记 + + + + Load previous page as cover + 加载上一页作为封面 + + + + Load next page as cover + 加载下一页作为封面 + + + + Reset cover to the default image + 将封面重置为默认图像 + + + + Load custom cover image + 加载自定义封面图片 + + + + Size: + 大小: + + + + Tags: + 标签: + + + + Invalid cover + 封面无效 + + + + The image is invalid. + 该图像无效。 + + + + Type: + 类型: + + + + Year: + 年: @@ -2420,8 +2810,8 @@ To stop an automatic update tap on the loading indicator next to the Libraries t - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine 连接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 连接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> @@ -2439,6 +2829,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 嵌字师: + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的无头(无 GUI)版本。 + +此应用程序支持持久设置,要设置它们,请编辑此文件 %1 +要了解可用设置,请查看文档:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + QObject @@ -2482,61 +2888,79 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 警告 - + Select custom cover - + 选择自定义封面 - + Images (%1) - + 图片 (%1) + + + + The file could not be read or is not valid JSON. + 无法读取该文件或者该文件不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主题适用于 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 文件夹 + + + + Reading Lists + 阅读列表 QsLogging::LogWindowModel - Time - 时间 + 时间 - Level - 等级 + 等级 - Message - 信息 + 信息 QsLogging::Window - &Pause - 中止(&P) + 中止(&P) - Save log - 保存日志 + 保存日志 - &Resume - 恢复(&R) + 恢复(&R) - Log file (*.log) - 日志文件 (*.log) + 日志文件 (*.log) RenameLibraryDialog - + Rename current library 重命名当前库 @@ -2559,18 +2983,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of %1 found : %2 第 %1 页 共: %2 条 - - + + page %1 of %2 第 %1 页 共 %2 页 - + Number of volumes found : %1 搜索结果: %1 @@ -2581,17 +3005,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - 请提供附加信息. + 请提供附加信息. - + Series: 系列: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + 使用精确匹配搜索。如果您想要查找与名称中某些单词匹配的卷,请禁用。 @@ -2602,40 +3026,40 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 请提供附加信息. - + Series: 系列: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + 使用精确匹配搜索。如果您想要查找与名称中某些单词匹配的卷,请禁用。 SelectComic - + loading description 加载描述 - + comics 漫画 - + loading cover 加载封面 - + comic description unavailable - + 漫画描述不可用 - + Please, select the right comic info. 请正确选择漫画信息. @@ -2647,37 +3071,37 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + loading description 加载描述 - + Nothing found, clear the filter if any. 未找到任何内容,如果有,请清除筛选器。 - + Please, select the right series for your comic. 请选择正确的漫画系列。 - + loading cover 加载封面 - + volume description unavailable - + 卷描述不可用 - + Filter: 筛选: - + volumes @@ -2689,12 +3113,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SeriesQuestion - + no - + yes @@ -2707,16 +3131,16 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + Port 端口 - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - YACReader适用于iOS设备. <a href='http://ios.yacreader.com'style ='color:rgb(193,148,65)'>下载</a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + YACReader适用于iOS设备. <a href='http://ios.yacreader.com'style ='color:rgb(193,148,65)'>下载</a> - + enable the server 启用服务器 @@ -2725,7 +3149,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 无法载入libqrencode. - + Server connectivity information 服务器连接信息 @@ -2736,358 +3160,1190 @@ to improve the performance 以提升浏览性能 - + Scan it! 扫一扫! - + set port 设置端口 - + Choose an IP address 选择IP地址 - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - YACReader 适用于 iOS 和 Android 设备。<br/>搜索 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 适用于 iOS 和 Android 设备。<br/>搜索 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. SortVolumeComics - + remove selected comics 移除所选漫画 - + sort comics to match comic information 排序漫画以匹配漫画信息 - + restore all removed comics 恢复所有移除的漫画 - + issues 发行 - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. 请在左侧对漫画列表进行排序,直到它与漫画的信息相符。 - TitleHeader + ThemeEditorDialog - - SEARCH - 搜索 + + Theme Editor + 主题编辑器 - - - UpdateLibraryDialog - - Update library - 更新库 + + + + + - - Cancel - 取消 + + - + - - - Updating.... - 更新中... + + i + - - - VolumeComicsModel - - title - 标题 + + Expand all + 全部展开 - - - VolumesModel - - year - + + Collapse all + 全部折叠 - - issues - 发行 + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中闪烁所选值(洋红色/切换/0↔10)。发布后恢复原样。 - - publisher - 出版者 + + Search… + 搜索… - - - YACReader::TrayIconController - - &Restore - 复位(&R) + + Light + 亮度 - - Systray - 系统托盘 + + Dark + 黑暗的 - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - YACReaderLibrary 将继续在系统托盘中运行. 想要终止程序, 请在系统托盘图标的上下文菜单中选择<b>退出</b>. + + ID: + ID: - - - YACReader::WhatsNewDialog - - Close - 关闭 + + Display name: + 显示名称: - - - YACReaderDeletingProgress - - cancel - 取消 + + Variant: + 变体: - - Please wait, deleting in progress... - 请稍候,正在删除... + + Theme info + 主题信息 - - - YACReaderFieldEdit - - Restore to default - 恢复默认 + + Parameter + 范围 - - - Click to overwrite - 点击以覆盖 + + Value + 价值 - - - YACReaderFieldPlainTextEdit - - Restore to default - 恢复默认 + + Save and apply + 保存并应用 - - - - - Click to overwrite - 点击以覆盖 + + Export to file... + 导出到文件... - - - YACReaderFlowConfigWidget - - CoverFlow look - 封面流 + + Load from file... + 从文件加载... - - How to show covers: - 封面显示方式: + + Close + 关闭 - - Stripe look - 条状 + + Double-click to edit color + 双击编辑颜色 - - Overlapped Stripe look - 重叠条状 + + + + + + + true + 真的 - - - YACReaderGLFlowConfigWidget - - Zoom - 缩放 + + + + + false + 错误的 - - Light - 亮度 + + Double-click to toggle + 双击切换 - - Show advanced settings - 显示高级选项 + + Double-click to edit value + 双击编辑值 - - Roulette look - 轮盘 + + + + Edit: %1 + 编辑:%1 - - Cover Angle - 封面角度 + + Save theme + 保存主题 - - Stripe look - 条状 + + + JSON files (*.json);;All files (*) + JSON 文件 (*.json);;所有文件 (*) - - Position - 位置 + + Save failed + 保存失败 - - Z offset - Z位移 + + Could not open file for writing: +%1 + 无法打开文件进行写入: +%1 - - Y offset - Y位移 + + Load theme + 加载主题 - - Central gap - 中心间距 + + + + Load failed + 加载失败 - - Presets: - 预设: + + Could not open file: +%1 + 无法打开文件: +%1 - - Overlapped Stripe look - 重叠条状 + + Invalid JSON: +%1 + 无效的 JSON: +%1 - - Modern look - 现代 + + Expected a JSON object. + 需要一个 JSON 对象。 - - - View angle + + + TitleHeader + + + SEARCH + 搜索 + + + + UpdateLibraryDialog + + + Update library + 更新库 + + + + Cancel + 取消 + + + + Updating.... + 更新中... + + + + Viewer + + + + Press 'O' to open comic. + 按下 'O' 以打开漫画. + + + + Not found + 未找到 + + + + Comic not found + 未找到漫画 + + + + Error opening comic + 打开漫画时发生错误 + + + + CRC Error + CRC 校验失败 + + + + Loading...please wait! + 载入中... 请稍候! + + + + Page not available! + 页面不可用! + + + + Cover! + 封面! + + + + Last page! + 尾页! + + + + VolumeComicsModel + + + title + 标题 + + + + VolumesModel + + + year + + + + + issues + 发行 + + + + publisher + 出版者 + + + + YACReader3DFlowConfigWidget + + + Presets: + 预设: + + + + Classic look + 经典 + + + + Stripe look + 条状 + + + + Overlapped Stripe look + 重叠条状 + + + + Modern look + 现代 + + + + Roulette look + 轮盘 + + + + Show advanced settings + 显示高级选项 + + + + Custom: + 自定义: + + + + View angle 视角 - + + Position + 位置 + + + + Cover gap + 封面间距 + + + + Central gap + 中心间距 + + + + Zoom + 缩放 + + + + Y offset + Y位移 + + + + Z offset + Z位移 + + + + Cover Angle + 封面角度 + + + + Visibility + 透明度 + + + + Light + 亮度 + + + + Max angle + 最大角度 + + + + Low Performance + 低性能 + + + + High Performance + 高性能 + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高图像质量, 性能更差) + + + + Performance: + 性能: + + + + YACReader::MainWindowViewer + + + &Open + 打开(&O) + + + + Open a comic + 打开漫画 + + + + New instance + 新建实例 + + + + Open Folder + 打开文件夹 + + + + Open image folder + 打开图片文件夹 + + + + Open latest comic + 打开最近的漫画 + + + + Open the latest comic opened in the previous reading session + 打开最近阅读漫画 + + + + Clear + 清空 + + + + Clear open recent list + 清空最近访问列表 + + + + Save + 保存 + + + + + Save current page + 保存当前页面 + + + + Previous Comic + 上一个漫画 + + + + + + Open previous comic + 打开上一个漫画 + + + + Next Comic + 下一个漫画 + + + + + + Open next comic + 打开下一个漫画 + + + + &Previous + 上一页(&P) + + + + + + Go to previous page + 转至上一页 + + + + &Next + 下一页(&N) + + + + + + Go to next page + 转至下一页 + + + + Fit Height + 适应高度 + + + + Fit image to height + 缩放图片以适应高度 + + + + Fit Width + 适合宽度 + + + + Fit image to width + 缩放图片以适应宽度 + + + + Show full size + 显示全尺寸 + + + + Fit to page + 适应页面 + + + + Continuous scroll + 连续滚动 + + + + Switch to continuous scroll mode + 切换到连续滚动模式 + + + + Reset zoom + 重置缩放 + + + + Show zoom slider + 显示缩放滑块 + + + + Zoom+ + 放大 + + + + Zoom- + 缩小 + + + + Rotate image to the left + 向左旋转图片 + + + + Rotate image to the right + 向右旋转图片 + + + + Double page mode + 双页模式 + + + + Switch to double page mode + 切换至双页模式 + + + + Double page manga mode + 双页漫画模式 + + + + Reverse reading order in double page mode + 双页模式 (逆序阅读) + + + + Go To + 跳转 + + + + Go to page ... + 跳转至页面 ... + + + + Options + 选项 + + + + YACReader options + YACReader 选项 + + + + + Help + 帮助 + + + + Help, About YACReader + 帮助, 关于 YACReader + + + + Magnifying glass + 放大镜 + + + + Switch Magnifying glass + 切换放大镜 + + + + Set bookmark + 设置书签 + + + + Set a bookmark on the current page + 在当前页面设置书签 + + + + Show bookmarks + 显示书签 + + + + Show the bookmarks of the current comic + 显示当前漫画的书签 + + + + Show keyboard shortcuts + 显示键盘快捷键 + + + + Show Info + 显示信息 + + + + Close + 关闭 + + + + Show Dictionary + 显示字典 + + + + Show go to flow + 显示“转到 Comic Flow” + + + + Edit shortcuts + 编辑快捷键 + + + + &File + 文件(&F) + + + + + Open recent + 最近打开的文件 + + + + File + 文件 + + + + Edit + 编辑 + + + + View + 查看 + + + + Go + 转到 + + + + Window + 窗口 + + + + + + Open Comic + 打开漫画 + + + + + + Comic files + 漫画文件 + + + + Open folder + 打开文件夹 + + + + page_%1.jpg + 页_%1.jpg + + + + Image files (*.jpg) + 图像文件 (*.jpg) + + + + + Comics + 漫画 + + + + + General + 常规 + + + + + Magnifiying glass + 放大镜 + + + + + Page adjustement + 页面调整 + + + + + Reading + 阅读 + + + + Toggle fullscreen mode + 切换全屏模式 + + + + Hide/show toolbar + 隐藏/显示 工具栏 + + + + Size up magnifying glass + 增大放大镜尺寸 + + + + Size down magnifying glass + 减小放大镜尺寸 + + + + Zoom in magnifying glass + 增大缩放级别 + + + + Zoom out magnifying glass + 减小缩放级别 + + + + Reset magnifying glass + 重置放大镜 + + + + Toggle between fit to width and fit to height + 切换显示为"适应宽度"或"适应高度" + + + + Autoscroll down + 向下自动滚动 + + + + Autoscroll up + 向上自动滚动 + + + + Autoscroll forward, horizontal first + 向前自动滚动,水平优先 + + + + Autoscroll backward, horizontal first + 向后自动滚动,水平优先 + + + + Autoscroll forward, vertical first + 向前自动滚动,垂直优先 + + + + Autoscroll backward, vertical first + 向后自动滚动,垂直优先 + + + + Move down + 向下移动 + + + + Move up + 向上移动 + + + + Move left + 向左移动 + + + + Move right + 向右移动 + + + + Go to the first page + 转到第一页 + + + + Go to the last page + 转到最后一页 + + + + Offset double page to the left + 双页向左偏移 + + + + Offset double page to the right + 双页向右偏移 + + + + There is a new version available + 有新版本可用 + + + + Do you want to download the new version? + 你要下载新版本吗? + + + + Remind me in 14 days + 14天后提醒我 + + + + Not now + 现在不 + + + + YACReader::TrayIconController + + + &Restore + 复位(&R) + + + + Systray + 系统托盘 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 将继续在系统托盘中运行. 想要终止程序, 请在系统托盘图标的上下文菜单中选择<b>退出</b>. + + + + YACReader::WhatsNewDialog + + Close + 关闭 + + + + YACReaderFieldEdit + + + Restore to default + 恢复默认 + + + + + Click to overwrite + 点击以覆盖 + + + + YACReaderFieldPlainTextEdit + + + Restore to default + 恢复默认 + + + + + + + Click to overwrite + 点击以覆盖 + + + + YACReaderFlowConfigWidget + + CoverFlow look + 封面流 + + + How to show covers: + 封面显示方式: + + + Stripe look + 条状 + + + Overlapped Stripe look + 重叠条状 + + + + YACReaderGLFlowConfigWidget + + Zoom + 缩放 + + + Light + 亮度 + + + Show advanced settings + 显示高级选项 + + + Roulette look + 轮盘 + + + Cover Angle + 封面角度 + + + Stripe look + 条状 + + + Position + 位置 + + + Z offset + Z位移 + + + Y offset + Y位移 + + + Central gap + 中心间距 + + + Presets: + 预设: + + + Overlapped Stripe look + 重叠条状 + + + Modern look + 现代 + + + View angle + 视角 + + Max angle - 最大角度 + 最大角度 - Custom: - 自定义: + 自定义: - Classic look - 经典 + 经典 - Cover gap - 封面间距 + 封面间距 - High Performance - 高性能 + 高性能 - Performance: - 性能: + 性能: - Use VSync (improve the image quality in fullscreen mode, worse performance) - 使用VSync (在全屏模式下提高图像质量, 性能更差) + 使用VSync (在全屏模式下提高图像质量, 性能更差) - Visibility - 透明度 + 透明度 - Low Performance - 低性能 + 低性能 YACReaderNavigationController - You are not reading anything yet, come on!! - 你还没有阅读任何东西,加油!! + 你还没有阅读任何东西,加油!! - There are no recent comics! - 没有最近的漫画! + 没有最近的漫画! - No favorites - 没有收藏 + 没有收藏 YACReaderOptionsDialog - + Save 保存 - Use hardware acceleration (restart needed) - 使用硬件加速 (需要重启) + 使用硬件加速 (需要重启) - + Cancel 取消 - + Shortcuts 快捷键 - + Edit shortcuts 编辑快捷键 @@ -3095,7 +4351,7 @@ to improve the performance YACReaderSearchLineEdit - + type to search 搜索类型 @@ -3103,34 +4359,60 @@ to improve the performance YACReaderSideBar - Reading Lists - 阅读列表 + 阅读列表 - LIBRARIES - + - Libraries - + - FOLDERS - 文件夹 + 文件夹 - Folders - 文件夹 + 文件夹 - READING LISTS - 阅读列表 + 阅读列表 + + + + YACReaderSlider + + + Reset + 重置 + + + + YACReaderTranslator + + + YACReader translator + YACReader 翻译 + + + + + Translation + 翻译 + + + + clear + 清空 + + + + Service not available + 服务不可用 diff --git a/YACReaderLibrary/yacreaderlibrary_zh_HK.ts b/YACReaderLibrary/yacreaderlibrary_zh_HK.ts index 8c1f52aa5..fad7af818 100644 --- a/YACReaderLibrary/yacreaderlibrary_zh_HK.ts +++ b/YACReaderLibrary/yacreaderlibrary_zh_HK.ts @@ -12,82 +12,70 @@ AddLabelDialog - + Label name: 標籤名稱: - + Choose a color: 選擇標籤顏色: - red - + - orange - + - yellow - + - green - + - cyan - + - blue - + - violet - 紫羅蘭 + 紫羅蘭 - purple - + - pink - + - white - + - light - 淺色 + 淺色 - dark - 深色 + 深色 - + accept 接受 - + cancel 取消 @@ -116,7 +104,7 @@ 取消 - + Add an existing library 添加一個現有庫 @@ -125,8 +113,8 @@ ApiKeyDialog - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 @@ -144,95 +132,235 @@ 取消 + + AppearanceTabWidget + + + Color scheme + 配色方案 + + + + System + 系統 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 風俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 刪除此使用者匯入的主題 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定義: + + + + Import theme... + 導入主題... + + + + Theme + 主題 + + + + Theme editor + 主題編輯器 + + + + Open Theme Editor... + 開啟主題編輯器... + + + + Theme editor error + 主題編輯器錯誤 + + + + The current theme JSON could not be loaded. + 無法載入目前主題 JSON。 + + + + Import theme + 導入主題 + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Could not import theme from: +%1 + 無法從以下位置匯入主題: +%1 + + + + Could not import theme from: +%1 + +%2 + 無法從以下位置匯入主題: +%1 + +%2 + + + + Import failed + 導入失敗 + + + + BookmarksDialog + + + Lastest Page + 尾頁 + + + + Close + 關閉 + + + + Click on any image to go to the bookmark + 點擊任意圖片以跳轉至相應書簽位置 + + + + + Loading... + 載入中... + + ClassicComicsView - + Hide comic flow - 隱藏漫畫流 + 隱藏 Comic Flow ComicInfoView - + + Characters + 角色 + + + Main character or team - + 主要角色或團隊 - + Teams - + 團隊 - + Locations - + 地點 - + Authors - 作者 + 作者 - + writer - + 編劇 - + penciller - + 鉛筆畫師 - + inker - + 墨線師 - + colorist - + 上色師 - + letterer - + 字效師 - + cover artist - + 封面畫師 - + editor - + 編輯 - + imprint - + 出版品牌 - + Publisher - + 出版社 - + color - + 彩色 - + b/w - - - - - Characters - + 黑白 @@ -290,86 +418,94 @@ Series - + 系列 Volume - + 體積 Story Arc - + 故事線 ComicVineDialog - + skip 忽略 - + back 返回 - + next 下一步 - + search 搜索 - + close 關閉 - - - + + + Looking for volume... 搜索卷... - - + + comic %1 of %2 - %3 第 %1 本 共 %2 本 - %3 - + %1 comics selected 已選擇 %1 本漫畫 - + Error connecting to ComicVine ComicVine 連接時出錯 - - + + Retrieving tags for : %1 正在檢索標籤: %1 - + Retrieving volume info... 正在接收卷資訊... - + Looking for comic... 搜索漫畫中... + + ContinuousPageWidget + + + Loading page %1 + 正在載入頁面 %1 + + CreateLibraryDialog @@ -398,17 +534,17 @@ 創建一個新的庫可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。 - + Create new library 創建新的漫畫庫 - + Path not found 未找到路徑 - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder 所選路徑不存在或不是有效路徑. 確保您具有此檔夾的寫入許可權 @@ -431,40 +567,41 @@ 快捷鍵設置 - + Shortcut in use 快捷鍵被佔用 - - The shortcut "%1" is already assigned to other function - 快捷鍵 "%1" 已被映射至其他功能 + + The shortcut "%1" is already assigned to other function + 快捷鍵 "%1" 已被映射至其他功能 EmptyFolderWidget - - Subfolders in this folder - 建立子檔夾 + 建立子檔夾 - Empty folder - 空文件夾 + 空文件夾 - Drag and drop folders and comics here - 拖動檔夾或者漫畫到這裏 + 拖動檔夾或者漫畫到這裏 + + + + This folder doesn't contain comics yet + 該資料夾還沒有漫畫 EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet 此標籤尚未包含漫畫 @@ -473,10 +610,28 @@ This reading list does not contain any comics yet - This reading list doesn't contain any comics yet + This reading list doesn't contain any comics yet 此閱讀列表尚未包含任何漫畫 + + EmptySpecialListWidget + + + No favorites + 沒有收藏 + + + + You are not reading anything yet, come on!! + 你還沒有閱讀任何東西,加油!! + + + + There are no recent comics! + 沒有最近的漫畫! + + ExportComicsInfoDialog @@ -495,22 +650,22 @@ 取消 - + Export comics info 導出漫畫資訊 - + Destination database name 目標資料庫名稱 - + Problem found while writing 寫入時出現問題 - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 @@ -533,22 +688,22 @@ 取消 - + Create covers package 創建封面包 - + Problem found while writing 寫入時出現問題 - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 - + Destination directory 目標目錄 @@ -579,23 +734,52 @@ FolderContentView - + Continue Reading... - + 繼續閱讀... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + 頁碼 : + + + + Go To + 跳轉 + + + + Cancel + 取消 + + + + + Total pages : + 總頁數: + + + + Go to... + 跳轉至 ... + + + + GoToFlowToolBar + + + Page : + 頁碼 : GridComicsView - + Show info 顯示資訊 @@ -603,17 +787,17 @@ HelpAboutDialog - + About 關於 - + Help 幫助 - + System info 系統資訊 @@ -641,7 +825,7 @@ 取消 - + Comics info file (*.ydb) 漫畫資訊檔(*.ydb) @@ -674,12 +858,12 @@ 取消 - + Extract a catalog 提取目錄 - + Compresed library covers (*.clc) 已壓縮的庫封面 (*.clc) @@ -687,52 +871,52 @@ ImportWidget - + stop 停止 - + Some of the comics being added... 正在添加漫畫... - + Importing comics 正在導入漫畫 - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderLibrary現在正在創建一個新庫。</p><p>這可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。</p> - + Updating the library 正在更新庫 - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>正在更新當前庫。要獲得更快的更新,請經常更新您的庫。</p><p>您可以停止該進程,稍後繼續更新操作。</p> - + Upgrading the library 正在更新庫 - + <p>The current library is being upgraded, please wait.</p> <p>正在更新當前漫畫庫, 請稍候.</p> - + Scanning the library 正在掃描庫 - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> <p>正在掃描當前庫的舊版 XML metadata 資訊。</p><p>這只需要執行一次,且只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 時。</p> @@ -740,12 +924,12 @@ LibraryWindow - + YACReader Library YACReader 庫 - + Library @@ -822,7 +1006,7 @@ 保存所選的封面為jpg - + Set as read 設為已讀 @@ -831,8 +1015,8 @@ 漫畫設為已讀 - - + + Set as unread 設為未讀 @@ -841,25 +1025,25 @@ 漫畫設為未讀 - - - + + + manga - + 漫畫 - - - + + + comic - + 漫畫 - - - + + + web comic - + 網路漫畫 Show/Hide marks @@ -870,20 +1054,20 @@ 折疊所有節點 - - - + + + western manga (left to right) - + 西方漫畫(從左到右) Assign current order to comics 將當前序號分配給漫畫 - + Library not available - Library ' + Library ' 庫不可用 @@ -891,7 +1075,7 @@ 全屏模式 開/關 - + Rescan library for XML info 重新掃描庫的 XML 資訊 @@ -905,7 +1089,7 @@ Set issue as manga - Set issue as manga + 將問題設定為漫畫 Set as normal @@ -920,7 +1104,7 @@ 幫助, 關於 YACReader - + Delete folder 刪除檔夾 @@ -941,17 +1125,17 @@ 顯示漫畫伺服器選項對話框 - + Open folder... 打開檔夾... - + Set as uncompleted 設為未完成 - + Set as completed 設為已完成 @@ -1004,7 +1188,7 @@ 退出(&Q) - + Update folder 更新檔夾 @@ -1057,170 +1241,170 @@ 將所選漫畫添加到收藏夾列表 - + Folder 檔夾 - + Comic 漫畫 - + Upgrade failed 更新失敗 - + There were errors during library upgrade in: 漫畫庫更新時出現錯誤: - + Update needed 需要更新 - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? 此庫是使用舊版本的YACReaderLibrary創建的. 它需要更新. 現在更新? - + Download new version 下載新版本 - + This library was created with a newer version of YACReaderLibrary. Download the new version now? 此庫是使用較新版本的YACReaderLibrary創建的。 立即下載新版本? - - Library '%1' is no longer available. Do you want to remove it? - 庫 '%1' 不再可用。 你想刪除它嗎? + + Library '%1' is no longer available. Do you want to remove it? + 庫 '%1' 不再可用。 你想刪除它嗎? - + Old library 舊的庫 - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? - - + + Copying comics... 複製漫畫中... - - + + Moving comics... 移動漫畫中... - + Folder name: 檔夾名稱: - + No folder selected 沒有選中的檔夾 - + Please, select a folder first 請先選擇一個檔夾 - + Error in path 路徑錯誤 - - There was an error accessing the folder's path + + There was an error accessing the folder's path 訪問檔夾的路徑時出錯 - + The selected folder and all its contents will be deleted from your disk. Are you sure? 所選檔夾及其所有內容將從磁片中刪除。 你確定嗎? - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. 嘗試刪除所選檔夾時出現問題。 請檢查寫入許可權,並確保沒有其他應用程式在使用這些檔夾或檔。 - + Add new reading lists 添加新的閱讀列表 - - + + List name: 列表名稱: - + Delete list/label 刪除 列表/標籤 - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? 所選項目將被刪除,您的漫畫或檔夾將不會從您的磁片中刪除。 你確定嗎? - + Rename list name 重命名列表 - - - + + + 4koma (top to botom) - + 4koma(由上至下) - - - - + + + + Set type - + 套裝類型 - + Set custom cover - + 設定自訂封面 - + Delete custom cover - + 刪除自訂封面 - + Save covers 保存封面 - + You are adding too many libraries. 您添加的庫太多了。 - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -1233,69 +1417,69 @@ YACReaderLibrary will not stop you from creating more libraries but you should k YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低的庫數量來提升性能。 - - + + YACReader not found YACReader 未找到 - + Error - 錯誤 + 錯誤 - + Error opening comic with third party reader. - + 使用第三方閱讀器開啟漫畫時出錯。 - + Library not found 未找到庫 - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. 所選檔夾不包含任何庫。 - + Are you sure? 你確定嗎? - + Do you want remove 你想要刪除 - + library? 庫? - + Remove and delete metadata 移除並刪除元數據 - + Library info - + 圖書館資訊 - + Assign comics numbers 分配漫畫編號 - + Assign numbers starting in: 從以下位置開始分配編號: - - + + Unable to delete 無法刪除 @@ -1304,7 +1488,7 @@ YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低 顯示或隱藏閱讀標記 - + Add new folder 添加新的檔夾 @@ -1321,522 +1505,522 @@ YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低 漫畫視圖之間的變化 - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. 未找到YACReader. YACReader應安裝在與YACReaderLibrary相同的檔夾中. - + YACReader not found. There might be a problem with your YACReader installation. 未找到YACReader. YACReader的安裝可能有問題. - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. 嘗試刪除所選漫畫時出現問題。 請檢查所選檔或包含檔夾中的寫入許可權。 - + Invalid image - + 圖片無效 - + The selected file is not a valid image. - + 所選檔案不是有效影像。 - + Error saving cover - + 儲存封面時發生錯誤 - + There was an error saving the cover image. - + 儲存封面圖片時發生錯誤。 - + Error creating the library 創建庫時出錯 - + Error updating the library 更新庫時出錯 - + Error opening the library 打開庫時出錯 - + Delete comics 刪除漫畫 - + All the selected comics will be deleted from your disk. Are you sure? 所有選定的漫畫都將從您的磁片中刪除。你確定嗎? - + Remove comics 移除漫畫 - + Comics will only be deleted from the current label/list. Are you sure? 漫畫只會從當前標籤/列表中刪除。 你確定嗎? - + Library name already exists 庫名已存在 - - There is another library with the name '%1'. - 已存在另一個名為'%1'的庫。 + + There is another library with the name '%1'. + 已存在另一個名為'%1'的庫。 LibraryWindowActions - + Create a new library - 創建一個新的庫 + 創建一個新的庫 - + Open an existing library - 打開現有的庫 + 打開現有的庫 - - + + Export comics info - 導出漫畫資訊 + 導出漫畫資訊 - - + + Import comics info - 導入漫畫資訊 + 導入漫畫資訊 - + Pack covers - 打包封面 + 打包封面 - + Pack the covers of the selected library - 打包所選庫的封面 + 打包所選庫的封面 - + Unpack covers - 解壓封面 + 解壓封面 - + Unpack a catalog - 解壓目錄 + 解壓目錄 - + Update library - 更新庫 + 更新庫 - + Update current library - 更新當前庫 + 更新當前庫 - + Rename library - 重命名庫 + 重命名庫 - + Rename current library - 重命名當前庫 + 重命名當前庫 - + Remove library - 移除庫 + 移除庫 - + Remove current library from your collection - 從您的集合中移除當前庫 + 從您的集合中移除當前庫 - + Rescan library for XML info - 重新掃描庫的 XML 資訊 + 重新掃描庫的 XML 資訊 - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 + 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 - + Show library info - + 顯示圖書館資訊 - + Show information about the current library - + 顯示當前庫的信息 - + Open current comic - 打開當前漫畫 + 打開當前漫畫 - + Open current comic on YACReader - 用YACReader打開漫畫 + 用YACReader打開漫畫 - + Save selected covers to... - 選中的封面保存到... + 選中的封面保存到... - + Save covers of the selected comics as JPG files - 保存所選的封面為jpg + 保存所選的封面為jpg - - + + Set as read - 設為已讀 + 設為已讀 - + Set comic as read - 漫畫設為已讀 + 漫畫設為已讀 - - + + Set as unread - 設為未讀 + 設為未讀 - + Set comic as unread - 漫畫設為未讀 + 漫畫設為未讀 - - + + manga - + 漫畫 - + Set issue as manga - Set issue as manga + 將問題設定為漫畫 - - + + comic - + 漫畫 - + Set issue as normal - 設置發行狀態為正常發行 + 設置發行狀態為正常發行 - + western manga - + 西方漫畫 - + Set issue as western manga - + 將問題設定為西方漫畫 - - + + web comic - + 網路漫畫 - + Set issue as web comic - + 將問題設定為網路漫畫 - - + + yonkoma - + 四科馬 - + Set issue as yonkoma - + 將問題設定為 yonkoma - + Show/Hide marks - 顯示/隱藏標記 + 顯示/隱藏標記 - + Show or hide read marks - 顯示或隱藏閱讀標記 + 顯示或隱藏閱讀標記 - + Show/Hide recent indicator - + 顯示/隱藏最近的指標 - + Show or hide recent indicator - + 顯示或隱藏最近的指示器 - - + + Fullscreen mode on/off - 全屏模式 開/關 + 全屏模式 開/關 - + Help, About YACReader - 幫助, 關於 YACReader + 幫助, 關於 YACReader - + Add new folder - 添加新的檔夾 + 添加新的檔夾 - + Add new folder to the current library - 在當前庫下添加新的檔夾 + 在當前庫下添加新的檔夾 - + Delete folder - 刪除檔夾 + 刪除檔夾 - + Delete current folder from disk - 從磁片上刪除當前檔夾 + 從磁片上刪除當前檔夾 - + Select root node - 選擇根節點 + 選擇根節點 - + Expand all nodes - 展開所有節點 + 展開所有節點 - + Collapse all nodes - 折疊所有節點 + 折疊所有節點 - + Show options dialog - 顯示選項對話框 + 顯示選項對話框 - + Show comics server options dialog - 顯示漫畫伺服器選項對話框 + 顯示漫畫伺服器選項對話框 - - + + Change between comics views - 漫畫視圖之間的變化 + 漫畫視圖之間的變化 - + Open folder... - 打開檔夾... + 打開檔夾... - + Set as uncompleted - 設為未完成 + 設為未完成 - + Set as completed - 設為已完成 + 設為已完成 - + Set custom cover - + 設定自訂封面 - + Delete custom cover - + 刪除自訂封面 - + western manga (left to right) - + 西方漫畫(從左到右) - + Open containing folder... - 打開包含檔夾... + 打開包含檔夾... - + Reset comic rating - 重置漫畫評分 + 重置漫畫評分 - + Select all comics - 全選漫畫 + 全選漫畫 - + Edit - 編輯 + 編輯 - + Assign current order to comics - 將當前序號分配給漫畫 + 將當前序號分配給漫畫 - + Update cover - 更新封面 + 更新封面 - + Delete selected comics - 刪除所選的漫畫 + 刪除所選的漫畫 - + Delete metadata from selected comics - + 從選定的漫畫中刪除元數據 - + Download tags from Comic Vine - 從 Comic Vine 下載標籤 + 從 Comic Vine 下載標籤 - + Focus search line - 聚焦於搜索行 + 聚焦於搜索行 - + Focus comics view - 聚焦於漫畫視圖 + 聚焦於漫畫視圖 - + Edit shortcuts - 編輯快捷鍵 + 編輯快捷鍵 - + &Quit - 退出(&Q) + 退出(&Q) - + Update folder - 更新檔夾 + 更新檔夾 - + Update current folder - 更新當前檔夾 + 更新當前檔夾 - + Scan legacy XML metadata - + 掃描舊版 XML 元數據 - + Add new reading list - 添加新的閱讀列表 + 添加新的閱讀列表 - + Add a new reading list to the current library - 在當前庫添加新的閱讀列表 + 在當前庫添加新的閱讀列表 - + Remove reading list - 移除閱讀列表 + 移除閱讀列表 - + Remove current reading list from the library - 從當前庫移除閱讀列表 + 從當前庫移除閱讀列表 - + Add new label - 添加新標籤 + 添加新標籤 - + Add a new label to this library - 在當前庫添加標籤 + 在當前庫添加標籤 - + Rename selected list - 重命名列表 + 重命名列表 - + Rename any selected labels or lists - 重命名任何選定的標籤或列表 + 重命名任何選定的標籤或列表 - + Add to... - 添加到... + 添加到... - + Favorites - 收藏夾 + 收藏夾 - + Add selected comics to favorites list - 將所選漫畫添加到收藏夾列表 + 將所選漫畫添加到收藏夾列表 @@ -1850,352 +2034,554 @@ YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低 LogWindow - Log window - 日誌窗口 + 日誌窗口 - &Pause - 中止(&P) + 中止(&P) - &Save - 保存(&S) + 保存(&S) - C&lear - 清空(&l) + 清空(&l) - &Copy - 複製(&C) + 複製(&C) - Level: - 等級: + 等級: - &Auto scroll - 自動滾動(&A) + 自動滾動(&A) NoLibrariesWidget - - You don't have any libraries yet + + You don't have any libraries yet 你還沒有庫 - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>您可以在任何檔夾中創建庫,YACReaderLibrary將導入此檔夾中的所有漫畫和文件夾。如果已有庫,則可以打開它們。</p><p>您可以把YACReader當成獨立應用來閱讀電腦上的漫畫。</p> - + create your first library 創建你的第一個庫 - + add an existing one 添加一個現有庫 + + NoSearchResultsWidget + + + No results + 沒有結果 + + OptionsDialog - + + + Language + 語言 + + + + + Application language + 應用程式語言 + + + + + System default + 系統預設 + + + Tray icon settings (experimental) 託盤圖示設置 (實驗特性) - + Close to tray 關閉至託盤 - + Start into the system tray 啟動至系統託盤 - + Edit Comic Vine API key 編輯Comic Vine API 密匙 - + Comic Vine API key Comic Vine API 密匙 - + ComicInfo.xml legacy support - + ComicInfo.xml 遺留支持 - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + 新增漫畫時從 ComicInfo.xml 匯入元數據 - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + 考慮自 X 天前新增或更新的「最近」項目 - + Third party reader - + 第三方閱讀器 - + Write {comic_file_path} where the path should go in the command - + 在命令中應將路徑寫入 {comic_file_path} - + + Clear - + 清空 - + Update libraries at startup - + 啟動時更新庫 - + Try to detect changes automatically - + 嘗試自動偵測變化 - + Update libraries periodically - + 定期更新庫 - + Interval: - + 間隔: - + 30 minutes - + 30分鐘 - + 1 hour - + 1小時 - + 2 hours - + 2小時 - + 4 hours - + 4小時 - + 8 hours - + 8小時 - + 12 hours - + 12小時 - + daily - + 日常的 - + Update libraries at certain time - + 定時更新庫 - + Time: - + 時間: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + 警告!在庫更新期間,將停用對資料庫的寫入! +當您可能正在積極使用應用程式時,請勿安排更新。 +在自動更新期間,應用程式將阻止某些操作,直到更新完成。 +若要停止自動更新,請點選庫標題旁的載入指示器。 - + Modifications detection - + 修改檢測 - + Compare the modified date of files when updating a library (not recommended) - + 更新庫時比較文件的修改日期(不建議) - + Enable background image 啟用背景圖片 - + Opacity level 透明度 - + Blur level 模糊 - + Use selected comic cover as background 使用選定的漫畫封面做背景 - + Restore defautls 恢復默認值 - + Background 背景 - + Display continue reading banner 顯示繼續閱讀橫幅 - + Display current comic banner - + 顯示目前漫畫橫幅 - + Continue reading 繼續閱讀 - + Comic Flow - 漫畫流 + Comic Flow - - + + Libraries - + - + Grid view 網格視圖 - + + General 常規 - + + + Appearance + 外貌 + + + + Options 選項 - - - PropertiesDialog - - General info - 基本資訊 + + My comics path + 我的漫畫路徑 - - Authors - 作者 + + Display + 展示 - - Publishing - 出版 + + Show time in current page information label + 在目前頁面資訊標籤中顯示時間 - - Plot - 情節 + + "Go to flow" size + 「前往 Comic Flow」大小 - - Notes - + + Background color + 背景顏色 - - Cover page - 封面 + + Choose + 選擇 - - Load previous page as cover - + + Scroll behaviour + 滾動效果 - - Load next page as cover - + + Disable scroll animations and smooth scrolling + 停用滾動動畫和平滑滾動 - - Reset cover to the default image - + + Do not turn page using scroll + 滾動時不翻頁 - - Load custom cover image - + + Use single scroll step to turn page + 使用單滾動步驟翻頁 - - Series: - 系列: + + Mouse mode + 滑鼠模式 - - Title: - 標題: + + Only Back/Forward buttons can turn pages + 只有後退/前進按鈕可以翻頁 - - - - of: - of: + + Use the Left/Right buttons to turn pages. + 使用向左/向右按鈕翻頁。 - - Issue number: + + Click left or right half of the screen to turn pages. + 點擊螢幕的左半部或右半部即可翻頁。 + + + + Quick Navigation Mode + 快速導航模式 + + + + Disable mouse over activation + 禁用滑鼠啟動 + + + + Brightness + 亮度 + + + + Contrast + 對比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 圖片選項 + + + + Fit options + 適應項 + + + + Enlarge images to fit width/height + 放大圖片以適應寬度/高度 + + + + Double Page options + 雙頁選項 + + + + Show covers as single page + 顯示封面為單頁 + + + + Scaling + 縮放 + + + + Scaling method + 縮放方法 + + + + Nearest (fast, low quality) + 最近(快速,低品質) + + + + Bilinear + 雙線性 + + + + Lanczos (better quality) + Lanczos(品質更好) + + + + Page Flow + 頁面流 + + + + Image adjustment + 圖像調整 + + + + + Restart is needed + 需要重啟 + + + + Comics directory + 漫畫目錄 + + + + PropertiesDialog + + + General info + 基本資訊 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Plot + 情節 + + + + Notes + 筆記 + + + + Cover page + 封面 + + + + Load previous page as cover + 載入上一頁作為封面 + + + + Load next page as cover + 載入下一頁作為封面 + + + + Reset cover to the default image + 將封面重設為預設圖片 + + + + Load custom cover image + 載入自訂封面圖片 + + + + Series: + 系列: + + + + Title: + 標題: + + + + + + of: + 的: + + + + Issue number: 發行數量: @@ -2216,17 +2602,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + 替代。數字: Alternate series: - + 替代系列: Series Group: - + 系列組: @@ -2272,12 +2658,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Editor(s): - + 編輯: Imprint: - + 印記: @@ -2317,22 +2703,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + 類型: Language (ISO): - + 語言(ISO): Invalid cover - + 封面無效 The image is invalid. - + 該圖像無效。 Manga: @@ -2351,22 +2737,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Teams: - + 團隊: Locations: - + 地點: Main character or team: - + 主要角色或團隊: Review: - + 審查: @@ -2376,12 +2762,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + 標籤: - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> @@ -2404,6 +2790,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 編輯漫畫資訊 + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的無頭(無 GUI)版本。 + +此應用程式支援持久性設置,要設定它們,請編輯此文件 %1 +若要了解可用設置,請查看文件:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + QObject @@ -2447,55 +2849,73 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 嚴重錯誤 - + Select custom cover - + 選擇自訂封面 - + Images (%1) - + 圖片 (%1) + + + + The file could not be read or is not valid JSON. + 無法讀取該檔案或該檔案不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主題適用於 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 檔夾 + + + + Reading Lists + 閱讀列表 QsLogging::LogWindowModel - Time - 時間 + 時間 - Level - 等級 + 等級 - Message - 資訊 + 資訊 QsLogging::Window - &Pause - 中止(&P) + 中止(&P) - &Resume - 恢復(&R) + 恢復(&R) - Save log - 保存日誌 + 保存日誌 - Log file (*.log) - 日誌檔 (*.log) + 日誌檔 (*.log) @@ -2516,7 +2936,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 取消 - + Rename current library 重命名當前庫 @@ -2524,18 +2944,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of volumes found : %1 搜索結果: %1 - - + + page %1 of %2 第 %1 頁 共 %2 頁 - + Number of %1 found : %2 第 %1 頁 共: %2 條 @@ -2546,17 +2966,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - 請提供附加資訊. + 請提供附加資訊. - + Series: 系列: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 @@ -2567,42 +2987,42 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 請提供附加資訊. - + Series: 系列: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 SelectComic - + Please, select the right comic info. 請正確選擇漫畫資訊. - + comics 漫畫 - + loading cover 加載封面 - + loading description 加載描述 - + comic description unavailable - + 漫畫描述不可用 description unavailable @@ -2612,39 +3032,39 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + Please, select the right series for your comic. 請選擇正確的漫畫系列。 - + Filter: - + 篩選: - + volumes - + Nothing found, clear the filter if any. - + 未找到任何內容,如果有,請清除過濾器。 - + loading cover 加載封面 - + loading description 加載描述 - + volume description unavailable - + 卷描述不可用 description unavailable @@ -2659,12 +3079,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 您正在嘗試同時獲取各種漫畫的資訊,它們是同一系列的嗎? - + yes - + no @@ -2672,41 +3092,41 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + set port 設置端口 - + Server connectivity information 伺服器連接資訊 - + Scan it! 掃一掃! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 適用於 iOS 和 Android 裝置。 <br/>發現它適用於 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> 或 <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>。 - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - YACReader適用於iOS設備. <a href='http://ios.yacreader.com'style ='color:rgb(193,148,65)'>下載</a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + YACReader適用於iOS設備. <a href='http://ios.yacreader.com'style ='color:rgb(193,148,65)'>下載</a> - + Choose an IP address 選擇IP地址 - + Port 端口 - + enable the server 啟用伺服器 @@ -2724,343 +3144,1171 @@ to improve the performance SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. 請在左側對漫畫列表進行排序,直到它與漫畫的資訊相符。 - + sort comics to match comic information 排序漫畫以匹配漫畫資訊 - + issues 發行 - + remove selected comics 移除所選漫畫 - + restore all removed comics 恢復所有移除的漫畫 - TitleHeader + ThemeEditorDialog - - SEARCH - 搜索 + + Theme Editor + 主題編輯器 - - - UpdateLibraryDialog - - Updating.... - 更新中... + + + + + - - Cancel - 取消 + + - + - - - Update library - 更新庫 + + i + - - - VolumeComicsModel - - title - 標題 + + Expand all + 全部展開 - - - VolumesModel - - year - + + Collapse all + 全部折疊 - - issues - 發行 + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中閃爍所選值(洋紅色/切換/0↔10)。發布後恢復原樣。 - - publisher - 出版者 + + Search… + 搜尋… - - - YACReader::TrayIconController - - &Restore - 複位(&R) + + Light + 亮度 - - Systray - 系統託盤 + + Dark + 黑暗的 - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + ID: + ID: - - - YACReader::WhatsNewDialog - - Close - 關閉 + + Display name: + 顯示名稱: - - - YACReaderDeletingProgress - - Please wait, deleting in progress... - 請稍候,正在刪除... + + Variant: + 變體: - - cancel - 取消 + + Theme info + 主題訊息 - - - YACReaderFieldEdit - - - Click to overwrite - 點擊以覆蓋 + + Parameter + 範圍 - - Restore to default - 恢復默認 + + Value + 價值 - - - YACReaderFieldPlainTextEdit - - - - - Click to overwrite - 點擊以覆蓋 + + Save and apply + 儲存並應用 - - Restore to default - 恢復默認 + + Export to file... + 匯出到文件... - - - YACReaderFlowConfigWidget - - How to show covers: - 封面顯示方式: + + Load from file... + 從檔案載入... - - CoverFlow look - 封面流 + + Close + 關閉 - - Stripe look - 條狀 + + Double-click to edit color + 雙擊編輯顏色 - - Overlapped Stripe look - 重疊條狀 + + + + + + + true + 真的 - - - YACReaderGLFlowConfigWidget - - Presets: - 預設: + + + + + false + 錯誤的 - - Classic look - 經典 + + Double-click to toggle + 按兩下切換 - - Stripe look - 條狀 + + Double-click to edit value + 雙擊編輯值 - - Overlapped Stripe look - 重疊條狀 + + + + Edit: %1 + 編輯:%1 - - Modern look - 現代 + + Save theme + 儲存主題 - - Roulette look - 輪盤 + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) - - Show advanced settings - 顯示高級選項 + + Save failed + 保存失敗 - - Custom: - 自定義: + + Could not open file for writing: +%1 + 無法開啟文件進行寫入: +%1 - - View angle - 視角 + + Load theme + 載入主題 - - Position - 位置 + + + + Load failed + 載入失敗 - - Cover gap - 封面間距 + + Could not open file: +%1 + 無法開啟檔案: +%1 - - Central gap - 中心間距 + + Invalid JSON: +%1 + 無效的 JSON: +%1 - - Zoom - 縮放 + + Expected a JSON object. + 需要一個 JSON 物件。 - - - Y offset + + + TitleHeader + + + SEARCH + 搜索 + + + + UpdateLibraryDialog + + + Updating.... + 更新中... + + + + Cancel + 取消 + + + + Update library + 更新庫 + + + + Viewer + + + + Press 'O' to open comic. + 按下 'O' 以打開漫畫. + + + + Not found + 未找到 + + + + Comic not found + 未找到漫畫 + + + + Error opening comic + 打開漫畫時發生錯誤 + + + + CRC Error + CRC 校驗失敗 + + + + Loading...please wait! + 載入中... 請稍候! + + + + Page not available! + 頁面不可用! + + + + Cover! + 封面! + + + + Last page! + 尾頁! + + + + VolumeComicsModel + + + title + 標題 + + + + VolumesModel + + + year + + + + + issues + 發行 + + + + publisher + 出版者 + + + + YACReader3DFlowConfigWidget + + + Presets: + 預設: + + + + Classic look + 經典 + + + + Stripe look + 條狀 + + + + Overlapped Stripe look + 重疊條狀 + + + + Modern look + 現代 + + + + Roulette look + 輪盤 + + + + Show advanced settings + 顯示高級選項 + + + + Custom: + 自定義: + + + + View angle + 視角 + + + + Position + 位置 + + + + Cover gap + 封面間距 + + + + Central gap + 中心間距 + + + + Zoom + 縮放 + + + + Y offset Y位移 - + Z offset Z位移 - + Cover Angle 封面角度 - + Visibility 透明度 - + Light 亮度 - + Max angle 最大角度 - + Low Performance 低性能 - + High Performance 高性能 - + Use VSync (improve the image quality in fullscreen mode, worse performance) 使用VSync (在全屏模式下提高圖像品質, 性能更差) - + Performance: 性能: + + YACReader::MainWindowViewer + + + &Open + 打開(&O) + + + + Open a comic + 打開漫畫 + + + + New instance + 新建實例 + + + + Open Folder + 打開檔夾 + + + + Open image folder + 打開圖片檔夾 + + + + Open latest comic + 打開最近的漫畫 + + + + Open the latest comic opened in the previous reading session + 打開最近閱讀漫畫 + + + + Clear + 清空 + + + + Clear open recent list + 清空最近訪問列表 + + + + Save + 保存 + + + + + Save current page + 保存當前頁面 + + + + Previous Comic + 上一個漫畫 + + + + + + Open previous comic + 打開上一個漫畫 + + + + Next Comic + 下一個漫畫 + + + + + + Open next comic + 打開下一個漫畫 + + + + &Previous + 上一頁(&P) + + + + + + Go to previous page + 轉至上一頁 + + + + &Next + 下一頁(&N) + + + + + + Go to next page + 轉至下一頁 + + + + Fit Height + 適應高度 + + + + Fit image to height + 縮放圖片以適應高度 + + + + Fit Width + 適合寬度 + + + + Fit image to width + 縮放圖片以適應寬度 + + + + Show full size + 顯示全尺寸 + + + + Fit to page + 適應頁面 + + + + Continuous scroll + 連續滾動 + + + + Switch to continuous scroll mode + 切換到連續滾動模式 + + + + Reset zoom + 重置縮放 + + + + Show zoom slider + 顯示縮放滑塊 + + + + Zoom+ + 放大 + + + + Zoom- + 縮小 + + + + Rotate image to the left + 向左旋轉圖片 + + + + Rotate image to the right + 向右旋轉圖片 + + + + Double page mode + 雙頁模式 + + + + Switch to double page mode + 切換至雙頁模式 + + + + Double page manga mode + 雙頁漫畫模式 + + + + Reverse reading order in double page mode + 雙頁模式 (逆序閱讀) + + + + Go To + 跳轉 + + + + Go to page ... + 跳轉至頁面 ... + + + + Options + 選項 + + + + YACReader options + YACReader 選項 + + + + + Help + 幫助 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Magnifying glass + 放大鏡 + + + + Switch Magnifying glass + 切換放大鏡 + + + + Set bookmark + 設置書簽 + + + + Set a bookmark on the current page + 在當前頁面設置書簽 + + + + Show bookmarks + 顯示書簽 + + + + Show the bookmarks of the current comic + 顯示當前漫畫的書簽 + + + + Show keyboard shortcuts + 顯示鍵盤快捷鍵 + + + + Show Info + 顯示資訊 + + + + Close + 關閉 + + + + Show Dictionary + 顯示字典 + + + + Show go to flow + 顯示「前往 Comic Flow」 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &File + 檔(&F) + + + + + Open recent + 最近打開的檔 + + + + File + + + + + Edit + 編輯 + + + + View + 查看 + + + + Go + 轉到 + + + + Window + 窗口 + + + + + + Open Comic + 打開漫畫 + + + + + + Comic files + 漫畫檔 + + + + Open folder + 打開檔夾 + + + + page_%1.jpg + 頁_%1.jpg + + + + Image files (*.jpg) + 圖像檔 (*.jpg) + + + + + Comics + 漫畫 + + + + + General + 常規 + + + + + Magnifiying glass + 放大鏡 + + + + + Page adjustement + 頁面調整 + + + + + Reading + 閱讀 + + + + Toggle fullscreen mode + 切換全屏模式 + + + + Hide/show toolbar + 隱藏/顯示 工具欄 + + + + Size up magnifying glass + 增大放大鏡尺寸 + + + + Size down magnifying glass + 減小放大鏡尺寸 + + + + Zoom in magnifying glass + 增大縮放級別 + + + + Zoom out magnifying glass + 減小縮放級別 + + + + Reset magnifying glass + 重置放大鏡 + + + + Toggle between fit to width and fit to height + 切換顯示為"適應寬度"或"適應高度" + + + + Autoscroll down + 向下自動滾動 + + + + Autoscroll up + 向上自動滾動 + + + + Autoscroll forward, horizontal first + 向前自動滾動,水準優先 + + + + Autoscroll backward, horizontal first + 向後自動滾動,水準優先 + + + + Autoscroll forward, vertical first + 向前自動滾動,垂直優先 + + + + Autoscroll backward, vertical first + 向後自動滾動,垂直優先 + + + + Move down + 向下移動 + + + + Move up + 向上移動 + + + + Move left + 向左移動 + + + + Move right + 向右移動 + + + + Go to the first page + 轉到第一頁 + + + + Go to the last page + 轉到最後一頁 + + + + Offset double page to the left + 雙頁向左偏移 + + + + Offset double page to the right + 雙頁向右偏移 + + + + There is a new version available + 有新版本可用 + + + + Do you want to download the new version? + 你要下載新版本嗎? + + + + Remind me in 14 days + 14天後提醒我 + + + + Not now + 現在不 + + + + YACReader::TrayIconController + + + &Restore + 複位(&R) + + + + Systray + 系統託盤 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + + + YACReader::WhatsNewDialog + + Close + 關閉 + + + + YACReaderFieldEdit + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderFlowConfigWidget + + How to show covers: + 封面顯示方式: + + + CoverFlow look + 封面流 + + + Stripe look + 條狀 + + + Overlapped Stripe look + 重疊條狀 + + + + YACReaderGLFlowConfigWidget + + Presets: + 預設: + + + Classic look + 經典 + + + Stripe look + 條狀 + + + Overlapped Stripe look + 重疊條狀 + + + Modern look + 現代 + + + Roulette look + 輪盤 + + + Show advanced settings + 顯示高級選項 + + + Custom: + 自定義: + + + View angle + 視角 + + + Position + 位置 + + + Cover gap + 封面間距 + + + Central gap + 中心間距 + + + Zoom + 縮放 + + + Y offset + Y位移 + + + Z offset + Z位移 + + + Cover Angle + 封面角度 + + + Visibility + 透明度 + + + Light + 亮度 + + + Max angle + 最大角度 + + + Low Performance + 低性能 + + + High Performance + 高性能 + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) + + + Performance: + 性能: + + YACReaderNavigationController - No favorites - 沒有收藏 + 沒有收藏 - You are not reading anything yet, come on!! - 你還沒有閱讀任何東西,加油!! - - - - There are no recent comics! - + 你還沒有閱讀任何東西,加油!! YACReaderOptionsDialog - + Save 保存 - + Cancel 取消 - + Edit shortcuts 編輯快捷鍵 - + Shortcuts 快捷鍵 - Use hardware acceleration (restart needed) - 使用硬體加速 (需要重啟) + 使用硬體加速 (需要重啟) YACReaderSearchLineEdit - + type to search 搜索類型 @@ -3068,34 +4316,60 @@ to improve the performance YACReaderSideBar - Libraries - + - Folders - 檔夾 + 檔夾 - Reading Lists - 閱讀列表 + 閱讀列表 - LIBRARIES - + - FOLDERS - 檔夾 + 檔夾 - READING LISTS - 閱讀列表 + 閱讀列表 + + + + YACReaderSlider + + + Reset + 重置 + + + + YACReaderTranslator + + + YACReader translator + YACReader 翻譯 + + + + + Translation + 翻譯 + + + + clear + 清空 + + + + Service not available + 服務不可用 diff --git a/YACReaderLibrary/yacreaderlibrary_zh_TW.ts b/YACReaderLibrary/yacreaderlibrary_zh_TW.ts index f7042bb62..0320b163d 100644 --- a/YACReaderLibrary/yacreaderlibrary_zh_TW.ts +++ b/YACReaderLibrary/yacreaderlibrary_zh_TW.ts @@ -12,82 +12,70 @@ AddLabelDialog - + Label name: 標籤名稱: - + Choose a color: 選擇標籤顏色: - red - + - orange - + - yellow - + - green - + - cyan - + - blue - + - violet - 紫羅蘭 + 紫羅蘭 - purple - + - pink - + - white - + - light - 淺色 + 淺色 - dark - 深色 + 深色 - + accept 接受 - + cancel 取消 @@ -116,7 +104,7 @@ 取消 - + Add an existing library 添加一個現有庫 @@ -125,8 +113,8 @@ ApiKeyDialog - Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> - 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 @@ -144,95 +132,235 @@ 取消 + + AppearanceTabWidget + + + Color scheme + 配色方案 + + + + System + 系統 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 風俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 刪除此使用者匯入的主題 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定義: + + + + Import theme... + 導入主題... + + + + Theme + 主題 + + + + Theme editor + 主題編輯器 + + + + Open Theme Editor... + 開啟主題編輯器... + + + + Theme editor error + 主題編輯器錯誤 + + + + The current theme JSON could not be loaded. + 無法載入目前主題 JSON。 + + + + Import theme + 導入主題 + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Could not import theme from: +%1 + 無法從以下位置匯入主題: +%1 + + + + Could not import theme from: +%1 + +%2 + 無法從以下位置匯入主題: +%1 + +%2 + + + + Import failed + 導入失敗 + + + + BookmarksDialog + + + Lastest Page + 尾頁 + + + + Close + 關閉 + + + + Click on any image to go to the bookmark + 點擊任意圖片以跳轉至相應書簽位置 + + + + + Loading... + 載入中... + + ClassicComicsView - + Hide comic flow - 隱藏漫畫流 + 隱藏 Comic Flow ComicInfoView - + + Characters + 角色 + + + Main character or team - + 主要角色或團隊 - + Teams - + 團隊 - + Locations - + 地點 - + Authors - 作者 + 作者 - + writer - + 編劇 - + penciller - + 鉛筆畫師 - + inker - + 墨線師 - + colorist - + 上色師 - + letterer - + 字效師 - + cover artist - + 封面畫師 - + editor - + 編輯 - + imprint - + 出版品牌 - + Publisher - + 出版社 - + color - + 彩色 - + b/w - - - - - Characters - + 黑白 @@ -290,86 +418,94 @@ Series - + 系列 Volume - + 體積 Story Arc - + 故事線 ComicVineDialog - + skip 忽略 - + back 返回 - + next 下一步 - + search 搜索 - + close 關閉 - - - + + + Looking for volume... 搜索卷... - - + + comic %1 of %2 - %3 第 %1 本 共 %2 本 - %3 - + %1 comics selected 已選擇 %1 本漫畫 - + Error connecting to ComicVine ComicVine 連接時出錯 - - + + Retrieving tags for : %1 正在檢索標籤: %1 - + Retrieving volume info... 正在接收卷資訊... - + Looking for comic... 搜索漫畫中... + + ContinuousPageWidget + + + Loading page %1 + 正在載入頁面 %1 + + CreateLibraryDialog @@ -398,17 +534,17 @@ 創建一個新的庫可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。 - + Create new library 創建新的漫畫庫 - + Path not found 未找到路徑 - + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder 所選路徑不存在或不是有效路徑. 確保您具有此檔夾的寫入許可權 @@ -431,40 +567,41 @@ 快捷鍵設置 - + Shortcut in use 快捷鍵被佔用 - - The shortcut "%1" is already assigned to other function - 快捷鍵 "%1" 已被映射至其他功能 + + The shortcut "%1" is already assigned to other function + 快捷鍵 "%1" 已被映射至其他功能 EmptyFolderWidget - - Subfolders in this folder - 建立子檔夾 + 建立子檔夾 - Empty folder - 空文件夾 + 空文件夾 - Drag and drop folders and comics here - 拖動檔夾或者漫畫到這裏 + 拖動檔夾或者漫畫到這裏 + + + + This folder doesn't contain comics yet + 該資料夾還沒有漫畫 EmptyLabelWidget - - This label doesn't contain comics yet + + This label doesn't contain comics yet 此標籤尚未包含漫畫 @@ -473,10 +610,28 @@ This reading list does not contain any comics yet - This reading list doesn't contain any comics yet + This reading list doesn't contain any comics yet 此閱讀列表尚未包含任何漫畫 + + EmptySpecialListWidget + + + No favorites + 沒有收藏 + + + + You are not reading anything yet, come on!! + 你還沒有閱讀任何東西,加油!! + + + + There are no recent comics! + 沒有最近的漫畫! + + ExportComicsInfoDialog @@ -495,22 +650,22 @@ 取消 - + Export comics info 導出漫畫資訊 - + Destination database name 目標資料庫名稱 - + Problem found while writing 寫入時出現問題 - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 @@ -533,22 +688,22 @@ 取消 - + Create covers package 創建封面包 - + Problem found while writing 寫入時出現問題 - + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 - + Destination directory 目標目錄 @@ -579,23 +734,52 @@ FolderContentView - + Continue Reading... - + 繼續閱讀... - FolderContentView6 + GoToDialog - - Continue Reading... - + + Page : + 頁碼 : + + + + Go To + 跳轉 + + + + Cancel + 取消 + + + + + Total pages : + 總頁數: + + + + Go to... + 跳轉至 ... + + + + GoToFlowToolBar + + + Page : + 頁碼 : GridComicsView - + Show info 顯示資訊 @@ -603,17 +787,17 @@ HelpAboutDialog - + About 關於 - + Help 幫助 - + System info 系統資訊 @@ -641,7 +825,7 @@ 取消 - + Comics info file (*.ydb) 漫畫資訊檔(*.ydb) @@ -674,12 +858,12 @@ 取消 - + Extract a catalog 提取目錄 - + Compresed library covers (*.clc) 已壓縮的庫封面 (*.clc) @@ -687,52 +871,52 @@ ImportWidget - + stop 停止 - + Some of the comics being added... 正在添加漫畫... - + Importing comics 正在導入漫畫 - + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> <p>YACReaderLibrary現在正在創建一個新庫。</p><p>這可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。</p> - + Updating the library 正在更新庫 - + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> <p>正在更新當前庫。要獲得更快的更新,請經常更新您的庫。</p><p>您可以停止該進程,稍後繼續更新操作。</p> - + Upgrading the library 正在更新庫 - + <p>The current library is being upgraded, please wait.</p> <p>正在更新當前漫畫庫, 請稍候.</p> - + Scanning the library 正在掃描庫 - + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> <p>正在掃描當前庫的舊版 XML metadata 資訊。</p><p>這只需要執行一次,且只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 時。</p> @@ -740,12 +924,12 @@ LibraryWindow - + YACReader Library YACReader 庫 - + Library @@ -822,7 +1006,7 @@ 保存所選的封面為jpg - + Set as read 設為已讀 @@ -831,8 +1015,8 @@ 漫畫設為已讀 - - + + Set as unread 設為未讀 @@ -841,25 +1025,25 @@ 漫畫設為未讀 - - - + + + manga - + 漫畫 - - - + + + comic - + 漫畫 - - - + + + web comic - + 網路漫畫 Show/Hide marks @@ -870,20 +1054,20 @@ 折疊所有節點 - - - + + + western manga (left to right) - + 西方漫畫(從左到右) Assign current order to comics 將當前序號分配給漫畫 - + Library not available - Library ' + Library ' 庫不可用 @@ -891,7 +1075,7 @@ 全屏模式 開/關 - + Rescan library for XML info 重新掃描庫的 XML 資訊 @@ -905,7 +1089,7 @@ Set issue as manga - Set issue as manga + 將問題設定為漫畫 Set as normal @@ -920,7 +1104,7 @@ 幫助, 關於 YACReader - + Delete folder 刪除檔夾 @@ -941,17 +1125,17 @@ 顯示漫畫伺服器選項對話框 - + Open folder... 打開檔夾... - + Set as uncompleted 設為未完成 - + Set as completed 設為已完成 @@ -1004,7 +1188,7 @@ 退出(&Q) - + Update folder 更新檔夾 @@ -1057,170 +1241,170 @@ 將所選漫畫添加到收藏夾列表 - + Folder 檔夾 - + Comic 漫畫 - + Upgrade failed 更新失敗 - + There were errors during library upgrade in: 漫畫庫更新時出現錯誤: - + Update needed 需要更新 - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? 此庫是使用舊版本的YACReaderLibrary創建的. 它需要更新. 現在更新? - + Download new version 下載新版本 - + This library was created with a newer version of YACReaderLibrary. Download the new version now? 此庫是使用較新版本的YACReaderLibrary創建的。 立即下載新版本? - - Library '%1' is no longer available. Do you want to remove it? - 庫 '%1' 不再可用。 你想刪除它嗎? + + Library '%1' is no longer available. Do you want to remove it? + 庫 '%1' 不再可用。 你想刪除它嗎? - + Old library 舊的庫 - - Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? - 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? - - + + Copying comics... 複製漫畫中... - - + + Moving comics... 移動漫畫中... - + Folder name: 檔夾名稱: - + No folder selected 沒有選中的檔夾 - + Please, select a folder first 請先選擇一個檔夾 - + Error in path 路徑錯誤 - - There was an error accessing the folder's path + + There was an error accessing the folder's path 訪問檔夾的路徑時出錯 - + The selected folder and all its contents will be deleted from your disk. Are you sure? 所選檔夾及其所有內容將從磁片中刪除。 你確定嗎? - + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. 嘗試刪除所選檔夾時出現問題。 請檢查寫入許可權,並確保沒有其他應用程式在使用這些檔夾或檔。 - + Add new reading lists 添加新的閱讀列表 - - + + List name: 列表名稱: - + Delete list/label 刪除 列表/標籤 - + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? 所選項目將被刪除,您的漫畫或檔夾將不會從您的磁片中刪除。 你確定嗎? - + Rename list name 重命名列表 - - - + + + 4koma (top to botom) - + 4koma(由上至下) - - - - + + + + Set type - + 套裝類型 - + Set custom cover - + 設定自訂封面 - + Delete custom cover - + 刪除自訂封面 - + Save covers 保存封面 - + You are adding too many libraries. 您添加的庫太多了。 - + You are adding too many libraries. You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. @@ -1233,69 +1417,69 @@ YACReaderLibrary will not stop you from creating more libraries but you should k YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低的庫數量來提升性能。 - - + + YACReader not found YACReader 未找到 - + Error - 錯誤 + 錯誤 - + Error opening comic with third party reader. - + 使用第三方閱讀器開啟漫畫時出錯。 - + Library not found 未找到庫 - - The selected folder doesn't contain any library. + + The selected folder doesn't contain any library. 所選檔夾不包含任何庫。 - + Are you sure? 你確定嗎? - + Do you want remove 你想要刪除 - + library? 庫? - + Remove and delete metadata 移除並刪除元數據 - + Library info - + 圖書館資訊 - + Assign comics numbers 分配漫畫編號 - + Assign numbers starting in: 從以下位置開始分配編號: - - + + Unable to delete 無法刪除 @@ -1304,7 +1488,7 @@ YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低 顯示或隱藏閱讀標記 - + Add new folder 添加新的檔夾 @@ -1321,522 +1505,522 @@ YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低 漫畫視圖之間的變化 - + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. 未找到YACReader. YACReader應安裝在與YACReaderLibrary相同的檔夾中. - + YACReader not found. There might be a problem with your YACReader installation. 未找到YACReader. YACReader的安裝可能有問題. - + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. 嘗試刪除所選漫畫時出現問題。 請檢查所選檔或包含檔夾中的寫入許可權。 - + Invalid image - + 圖片無效 - + The selected file is not a valid image. - + 所選檔案不是有效影像。 - + Error saving cover - + 儲存封面時發生錯誤 - + There was an error saving the cover image. - + 儲存封面圖片時發生錯誤。 - + Error creating the library 創建庫時出錯 - + Error updating the library 更新庫時出錯 - + Error opening the library 打開庫時出錯 - + Delete comics 刪除漫畫 - + All the selected comics will be deleted from your disk. Are you sure? 所有選定的漫畫都將從您的磁片中刪除。你確定嗎? - + Remove comics 移除漫畫 - + Comics will only be deleted from the current label/list. Are you sure? 漫畫只會從當前標籤/列表中刪除。 你確定嗎? - + Library name already exists 庫名已存在 - - There is another library with the name '%1'. - 已存在另一個名為'%1'的庫。 + + There is another library with the name '%1'. + 已存在另一個名為'%1'的庫。 LibraryWindowActions - + Create a new library - 創建一個新的庫 + 創建一個新的庫 - + Open an existing library - 打開現有的庫 + 打開現有的庫 - - + + Export comics info - 導出漫畫資訊 + 導出漫畫資訊 - - + + Import comics info - 導入漫畫資訊 + 導入漫畫資訊 - + Pack covers - 打包封面 + 打包封面 - + Pack the covers of the selected library - 打包所選庫的封面 + 打包所選庫的封面 - + Unpack covers - 解壓封面 + 解壓封面 - + Unpack a catalog - 解壓目錄 + 解壓目錄 - + Update library - 更新庫 + 更新庫 - + Update current library - 更新當前庫 + 更新當前庫 - + Rename library - 重命名庫 + 重命名庫 - + Rename current library - 重命名當前庫 + 重命名當前庫 - + Remove library - 移除庫 + 移除庫 - + Remove current library from your collection - 從您的集合中移除當前庫 + 從您的集合中移除當前庫 - + Rescan library for XML info - 重新掃描庫的 XML 資訊 + 重新掃描庫的 XML 資訊 - + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. - 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 + 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 - + Show library info - + 顯示圖書館資訊 - + Show information about the current library - + 顯示當前庫的信息 - + Open current comic - 打開當前漫畫 + 打開當前漫畫 - + Open current comic on YACReader - 用YACReader打開漫畫 + 用YACReader打開漫畫 - + Save selected covers to... - 選中的封面保存到... + 選中的封面保存到... - + Save covers of the selected comics as JPG files - 保存所選的封面為jpg + 保存所選的封面為jpg - - + + Set as read - 設為已讀 + 設為已讀 - + Set comic as read - 漫畫設為已讀 + 漫畫設為已讀 - - + + Set as unread - 設為未讀 + 設為未讀 - + Set comic as unread - 漫畫設為未讀 + 漫畫設為未讀 - - + + manga - + 漫畫 - + Set issue as manga - Set issue as manga + 將問題設定為漫畫 - - + + comic - + 漫畫 - + Set issue as normal - 設置發行狀態為正常發行 + 設置發行狀態為正常發行 - + western manga - + 西方漫畫 - + Set issue as western manga - + 將問題設定為西方漫畫 - - + + web comic - + 網路漫畫 - + Set issue as web comic - + 將問題設定為網路漫畫 - - + + yonkoma - + 四科馬 - + Set issue as yonkoma - + 將問題設定為 yonkoma - + Show/Hide marks - 顯示/隱藏標記 + 顯示/隱藏標記 - + Show or hide read marks - 顯示或隱藏閱讀標記 + 顯示或隱藏閱讀標記 - + Show/Hide recent indicator - + 顯示/隱藏最近的指標 - + Show or hide recent indicator - + 顯示或隱藏最近的指示器 - - + + Fullscreen mode on/off - 全屏模式 開/關 + 全屏模式 開/關 - + Help, About YACReader - 幫助, 關於 YACReader + 幫助, 關於 YACReader - + Add new folder - 添加新的檔夾 + 添加新的檔夾 - + Add new folder to the current library - 在當前庫下添加新的檔夾 + 在當前庫下添加新的檔夾 - + Delete folder - 刪除檔夾 + 刪除檔夾 - + Delete current folder from disk - 從磁片上刪除當前檔夾 + 從磁片上刪除當前檔夾 - + Select root node - 選擇根節點 + 選擇根節點 - + Expand all nodes - 展開所有節點 + 展開所有節點 - + Collapse all nodes - 折疊所有節點 + 折疊所有節點 - + Show options dialog - 顯示選項對話框 + 顯示選項對話框 - + Show comics server options dialog - 顯示漫畫伺服器選項對話框 + 顯示漫畫伺服器選項對話框 - - + + Change between comics views - 漫畫視圖之間的變化 + 漫畫視圖之間的變化 - + Open folder... - 打開檔夾... + 打開檔夾... - + Set as uncompleted - 設為未完成 + 設為未完成 - + Set as completed - 設為已完成 + 設為已完成 - + Set custom cover - + 設定自訂封面 - + Delete custom cover - + 刪除自訂封面 - + western manga (left to right) - + 西方漫畫(從左到右) - + Open containing folder... - 打開包含檔夾... + 打開包含檔夾... - + Reset comic rating - 重置漫畫評分 + 重置漫畫評分 - + Select all comics - 全選漫畫 + 全選漫畫 - + Edit - 編輯 + 編輯 - + Assign current order to comics - 將當前序號分配給漫畫 + 將當前序號分配給漫畫 - + Update cover - 更新封面 + 更新封面 - + Delete selected comics - 刪除所選的漫畫 + 刪除所選的漫畫 - + Delete metadata from selected comics - + 從選定的漫畫中刪除元數據 - + Download tags from Comic Vine - 從 Comic Vine 下載標籤 + 從 Comic Vine 下載標籤 - + Focus search line - 聚焦於搜索行 + 聚焦於搜索行 - + Focus comics view - 聚焦於漫畫視圖 + 聚焦於漫畫視圖 - + Edit shortcuts - 編輯快捷鍵 + 編輯快捷鍵 - + &Quit - 退出(&Q) + 退出(&Q) - + Update folder - 更新檔夾 + 更新檔夾 - + Update current folder - 更新當前檔夾 + 更新當前檔夾 - + Scan legacy XML metadata - + 掃描舊版 XML 元數據 - + Add new reading list - 添加新的閱讀列表 + 添加新的閱讀列表 - + Add a new reading list to the current library - 在當前庫添加新的閱讀列表 + 在當前庫添加新的閱讀列表 - + Remove reading list - 移除閱讀列表 + 移除閱讀列表 - + Remove current reading list from the library - 從當前庫移除閱讀列表 + 從當前庫移除閱讀列表 - + Add new label - 添加新標籤 + 添加新標籤 - + Add a new label to this library - 在當前庫添加標籤 + 在當前庫添加標籤 - + Rename selected list - 重命名列表 + 重命名列表 - + Rename any selected labels or lists - 重命名任何選定的標籤或列表 + 重命名任何選定的標籤或列表 - + Add to... - 添加到... + 添加到... - + Favorites - 收藏夾 + 收藏夾 - + Add selected comics to favorites list - 將所選漫畫添加到收藏夾列表 + 將所選漫畫添加到收藏夾列表 @@ -1850,352 +2034,554 @@ YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低 LogWindow - Log window - 日誌窗口 + 日誌窗口 - &Pause - 中止(&P) + 中止(&P) - &Save - 保存(&S) + 保存(&S) - C&lear - 清空(&l) + 清空(&l) - &Copy - 複製(&C) + 複製(&C) - Level: - 等級: + 等級: - &Auto scroll - 自動滾動(&A) + 自動滾動(&A) NoLibrariesWidget - - You don't have any libraries yet + + You don't have any libraries yet 你還沒有庫 - - <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> <p>您可以在任何檔夾中創建庫,YACReaderLibrary將導入此檔夾中的所有漫畫和文件夾。如果已有庫,則可以打開它們。</p><p>您可以把YACReader當成獨立應用來閱讀電腦上的漫畫。</p> - + create your first library 創建你的第一個庫 - + add an existing one 添加一個現有庫 + + NoSearchResultsWidget + + + No results + 沒有結果 + + OptionsDialog - + + + Language + 語言 + + + + + Application language + 應用程式語言 + + + + + System default + 系統預設 + + + Tray icon settings (experimental) 託盤圖示設置 (實驗特性) - + Close to tray 關閉至託盤 - + Start into the system tray 啟動至系統託盤 - + Edit Comic Vine API key 編輯Comic Vine API 密匙 - + Comic Vine API key Comic Vine API 密匙 - + ComicInfo.xml legacy support - + ComicInfo.xml 遺留支持 - + Import metadata from ComicInfo.xml when adding new comics Import metada from ComicInfo.xml when adding new comics - + 新增漫畫時從 ComicInfo.xml 匯入元數據 - - Consider 'recent' items added or updated since X days ago - + + Consider 'recent' items added or updated since X days ago + 考慮自 X 天前新增或更新的「最近」項目 - + Third party reader - + 第三方閱讀器 - + Write {comic_file_path} where the path should go in the command - + 在命令中應將路徑寫入 {comic_file_path} - + + Clear - + 清空 - + Update libraries at startup - + 啟動時更新庫 - + Try to detect changes automatically - + 嘗試自動偵測變化 - + Update libraries periodically - + 定期更新庫 - + Interval: - + 間隔: - + 30 minutes - + 30分鐘 - + 1 hour - + 1小時 - + 2 hours - + 2小時 - + 4 hours - + 4小時 - + 8 hours - + 8小時 - + 12 hours - + 12小時 - + daily - + 日常的 - + Update libraries at certain time - + 定時更新庫 - + Time: - + 時間: - + WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. During automatic updates the app will block some of the actions until the update is finished. To stop an automatic update tap on the loading indicator next to the Libraries title. WARNING! During library updates writes to the database are disabled! -Don't schedule updates while you may be using the app actively. +Don't schedule updates while you may be using the app actively. To stop an automatic update tap on the loading indicator next to the Libraries title. - + 警告!在庫更新期間,將停用對資料庫的寫入! +當您可能正在積極使用應用程式時,請勿安排更新。 +在自動更新期間,應用程式將阻止某些操作,直到更新完成。 +若要停止自動更新,請點選庫標題旁的載入指示器。 - + Modifications detection - + 修改檢測 - + Compare the modified date of files when updating a library (not recommended) - + 更新庫時比較文件的修改日期(不建議) - + Enable background image 啟用背景圖片 - + Opacity level 透明度 - + Blur level 模糊 - + Use selected comic cover as background 使用選定的漫畫封面做背景 - + Restore defautls 恢復默認值 - + Background 背景 - + Display continue reading banner 顯示繼續閱讀橫幅 - + Display current comic banner - + 顯示目前漫畫橫幅 - + Continue reading 繼續閱讀 - + Comic Flow - 漫畫流 + Comic Flow - - + + Libraries - + - + Grid view 網格視圖 - + + General 常規 - + + + Appearance + 外貌 + + + + Options 選項 - - - PropertiesDialog - - General info - 基本資訊 + + My comics path + 我的漫畫路徑 - - Authors - 作者 + + Display + 展示 - - Publishing - 出版 + + Show time in current page information label + 在目前頁面資訊標籤中顯示時間 - - Plot - 情節 + + "Go to flow" size + 「前往 Comic Flow」大小 - - Notes - + + Background color + 背景顏色 - - Cover page - 封面 + + Choose + 選擇 - - Load previous page as cover - + + Scroll behaviour + 滾動效果 - - Load next page as cover - + + Disable scroll animations and smooth scrolling + 停用滾動動畫和平滑滾動 - - Reset cover to the default image - + + Do not turn page using scroll + 滾動時不翻頁 - - Load custom cover image - + + Use single scroll step to turn page + 使用單滾動步驟翻頁 - - Series: - 系列: + + Mouse mode + 滑鼠模式 - - Title: - 標題: + + Only Back/Forward buttons can turn pages + 只有後退/前進按鈕可以翻頁 - - - - of: - of: + + Use the Left/Right buttons to turn pages. + 使用向左/向右按鈕翻頁。 - - Issue number: + + Click left or right half of the screen to turn pages. + 點擊螢幕的左半部或右半部即可翻頁。 + + + + Quick Navigation Mode + 快速導航模式 + + + + Disable mouse over activation + 禁用滑鼠啟動 + + + + Brightness + 亮度 + + + + Contrast + 對比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 圖片選項 + + + + Fit options + 適應項 + + + + Enlarge images to fit width/height + 放大圖片以適應寬度/高度 + + + + Double Page options + 雙頁選項 + + + + Show covers as single page + 顯示封面為單頁 + + + + Scaling + 縮放 + + + + Scaling method + 縮放方法 + + + + Nearest (fast, low quality) + 最近(快速,低品質) + + + + Bilinear + 雙線性 + + + + Lanczos (better quality) + Lanczos(品質更好) + + + + Page Flow + 頁面流 + + + + Image adjustment + 圖像調整 + + + + + Restart is needed + 需要重啟 + + + + Comics directory + 漫畫目錄 + + + + PropertiesDialog + + + General info + 基本資訊 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Plot + 情節 + + + + Notes + 筆記 + + + + Cover page + 封面 + + + + Load previous page as cover + 載入上一頁作為封面 + + + + Load next page as cover + 載入下一頁作為封面 + + + + Reset cover to the default image + 將封面重設為預設圖片 + + + + Load custom cover image + 載入自訂封面圖片 + + + + Series: + 系列: + + + + Title: + 標題: + + + + + + of: + 的: + + + + Issue number: 發行數量: @@ -2216,17 +2602,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t alt. number: - + 替代。數字: Alternate series: - + 替代系列: Series Group: - + 系列組: @@ -2272,12 +2658,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Editor(s): - + 編輯: Imprint: - + 印記: @@ -2317,22 +2703,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Type: - + 類型: Language (ISO): - + 語言(ISO): Invalid cover - + 封面無效 The image is invalid. - + 該圖像無效。 Manga: @@ -2351,22 +2737,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Teams: - + 團隊: Locations: - + 地點: Main character or team: - + 主要角色或團隊: Review: - + 審查: @@ -2376,12 +2762,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Tags: - + 標籤: - Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> - Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> @@ -2404,6 +2790,22 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 編輯漫畫資訊 + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的無頭(無 GUI)版本。 + +此應用程式支援持久性設置,要設定它們,請編輯此文件 %1 +若要了解可用設置,請查看文件:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + QObject @@ -2447,55 +2849,73 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 嚴重錯誤 - + Select custom cover - + 選擇自訂封面 - + Images (%1) - + 圖片 (%1) + + + + The file could not be read or is not valid JSON. + 無法讀取該檔案或該檔案不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主題適用於 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 檔夾 + + + + Reading Lists + 閱讀列表 QsLogging::LogWindowModel - Time - 時間 + 時間 - Level - 等級 + 等級 - Message - 資訊 + 資訊 QsLogging::Window - &Pause - 中止(&P) + 中止(&P) - &Resume - 恢復(&R) + 恢復(&R) - Save log - 保存日誌 + 保存日誌 - Log file (*.log) - 日誌檔 (*.log) + 日誌檔 (*.log) @@ -2516,7 +2936,7 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 取消 - + Rename current library 重命名當前庫 @@ -2524,18 +2944,18 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ScraperResultsPaginator - + Number of volumes found : %1 搜索結果: %1 - - + + page %1 of %2 第 %1 頁 共 %2 頁 - + Number of %1 found : %2 第 %1 頁 共: %2 條 @@ -2546,17 +2966,17 @@ To stop an automatic update tap on the loading indicator next to the Libraries t Please provide some additional information for this comic. Please provide some additional information. - 請提供附加資訊. + 請提供附加資訊. - + Series: 系列: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 @@ -2567,42 +2987,42 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 請提供附加資訊. - + Series: 系列: - + Use exact match search. Disable if you want to find volumes that match some of the words in the name. - + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 SelectComic - + Please, select the right comic info. 請正確選擇漫畫資訊. - + comics 漫畫 - + loading cover 加載封面 - + loading description 加載描述 - + comic description unavailable - + 漫畫描述不可用 description unavailable @@ -2612,39 +3032,39 @@ To stop an automatic update tap on the loading indicator next to the Libraries t SelectVolume - + Please, select the right series for your comic. 請選擇正確的漫畫系列。 - + Filter: - + 篩選: - + volumes - + Nothing found, clear the filter if any. - + 未找到任何內容,如果有,請清除過濾器。 - + loading cover 加載封面 - + loading description 加載描述 - + volume description unavailable - + 卷描述不可用 description unavailable @@ -2659,12 +3079,12 @@ To stop an automatic update tap on the loading indicator next to the Libraries t 您正在嘗試同時獲取各種漫畫的資訊,它們是同一系列的嗎? - + yes - + no @@ -2672,41 +3092,41 @@ To stop an automatic update tap on the loading indicator next to the Libraries t ServerConfigDialog - + set port 設置端口 - + Server connectivity information 伺服器連接資訊 - + Scan it! 掃一掃! - - YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. - + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 適用於 iOS 和 Android 裝置。 <br/>發現它適用於 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> 或 <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>。 - YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> - YACReader適用於iOS設備. <a href='http://ios.yacreader.com'style ='color:rgb(193,148,65)'>下載</a> + YACReader is available for iOS devices. <a href='http://ios.yacreader.com' style='color:rgb(193, 148, 65)'> Discover it! </a> + YACReader適用於iOS設備. <a href='http://ios.yacreader.com'style ='color:rgb(193,148,65)'>下載</a> - + Choose an IP address 選擇IP地址 - + Port 端口 - + enable the server 啟用伺服器 @@ -2724,343 +3144,1171 @@ to improve the performance SortVolumeComics - - Please, sort the list of comics on the left until it matches the comics' information. + + Please, sort the list of comics on the left until it matches the comics' information. 請在左側對漫畫列表進行排序,直到它與漫畫的資訊相符。 - + sort comics to match comic information 排序漫畫以匹配漫畫資訊 - + issues 發行 - + remove selected comics 移除所選漫畫 - + restore all removed comics 恢復所有移除的漫畫 - TitleHeader + ThemeEditorDialog - - SEARCH - 搜索 + + Theme Editor + 主題編輯器 - - - UpdateLibraryDialog - - Updating.... - 更新中... + + + + + - - Cancel - 取消 + + - + - - - Update library - 更新庫 + + i + - - - VolumeComicsModel - - title - 標題 + + Expand all + 全部展開 - - - VolumesModel - - year - + + Collapse all + 全部折疊 - - issues - 發行 + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中閃爍所選值(洋紅色/切換/0↔10)。發布後恢復原樣。 - - publisher - 出版者 + + Search… + 搜尋… - - - YACReader::TrayIconController - - &Restore - 複位(&R) + + Light + 亮度 - - Systray - 系統託盤 + + Dark + 黑暗的 - - YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. - YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + ID: + ID: - - - YACReader::WhatsNewDialog - - Close - 關閉 + + Display name: + 顯示名稱: - - - YACReaderDeletingProgress - - Please wait, deleting in progress... - 請稍候,正在刪除... + + Variant: + 變體: - - cancel - 取消 + + Theme info + 主題訊息 - - - YACReaderFieldEdit - - - Click to overwrite - 點擊以覆蓋 + + Parameter + 範圍 - - Restore to default - 恢復默認 + + Value + 價值 - - - YACReaderFieldPlainTextEdit - - - - - Click to overwrite - 點擊以覆蓋 + + Save and apply + 儲存並應用 - - Restore to default - 恢復默認 + + Export to file... + 匯出到文件... - - - YACReaderFlowConfigWidget - - How to show covers: - 封面顯示方式: + + Load from file... + 從檔案載入... - - CoverFlow look - 封面流 + + Close + 關閉 - - Stripe look - 條狀 + + Double-click to edit color + 雙擊編輯顏色 - - Overlapped Stripe look - 重疊條狀 + + + + + + + true + 真的 - - - YACReaderGLFlowConfigWidget - - Presets: - 預設: + + + + + false + 錯誤的 - - Classic look - 經典 + + Double-click to toggle + 按兩下切換 - - Stripe look - 條狀 + + Double-click to edit value + 雙擊編輯值 - - Overlapped Stripe look - 重疊條狀 + + + + Edit: %1 + 編輯:%1 - - Modern look - 現代 + + Save theme + 儲存主題 - - Roulette look - 輪盤 + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) - - Show advanced settings - 顯示高級選項 + + Save failed + 保存失敗 - - Custom: - 自定義: + + Could not open file for writing: +%1 + 無法開啟文件進行寫入: +%1 - - View angle - 視角 + + Load theme + 載入主題 - - Position - 位置 + + + + Load failed + 載入失敗 - - Cover gap - 封面間距 + + Could not open file: +%1 + 無法開啟檔案: +%1 - - Central gap - 中心間距 + + Invalid JSON: +%1 + 無效的 JSON: +%1 - - Zoom - 縮放 + + Expected a JSON object. + 需要一個 JSON 物件。 - - - Y offset + + + TitleHeader + + + SEARCH + 搜索 + + + + UpdateLibraryDialog + + + Updating.... + 更新中... + + + + Cancel + 取消 + + + + Update library + 更新庫 + + + + Viewer + + + + Press 'O' to open comic. + 按下 'O' 以打開漫畫. + + + + Not found + 未找到 + + + + Comic not found + 未找到漫畫 + + + + Error opening comic + 打開漫畫時發生錯誤 + + + + CRC Error + CRC 校驗失敗 + + + + Loading...please wait! + 載入中... 請稍候! + + + + Page not available! + 頁面不可用! + + + + Cover! + 封面! + + + + Last page! + 尾頁! + + + + VolumeComicsModel + + + title + 標題 + + + + VolumesModel + + + year + + + + + issues + 發行 + + + + publisher + 出版者 + + + + YACReader3DFlowConfigWidget + + + Presets: + 預設: + + + + Classic look + 經典 + + + + Stripe look + 條狀 + + + + Overlapped Stripe look + 重疊條狀 + + + + Modern look + 現代 + + + + Roulette look + 輪盤 + + + + Show advanced settings + 顯示高級選項 + + + + Custom: + 自定義: + + + + View angle + 視角 + + + + Position + 位置 + + + + Cover gap + 封面間距 + + + + Central gap + 中心間距 + + + + Zoom + 縮放 + + + + Y offset Y位移 - + Z offset Z位移 - + Cover Angle 封面角度 - + Visibility 透明度 - + Light 亮度 - + Max angle 最大角度 - + Low Performance 低性能 - + High Performance 高性能 - + Use VSync (improve the image quality in fullscreen mode, worse performance) 使用VSync (在全屏模式下提高圖像品質, 性能更差) - + Performance: 性能: + + YACReader::MainWindowViewer + + + &Open + 打開(&O) + + + + Open a comic + 打開漫畫 + + + + New instance + 新建實例 + + + + Open Folder + 打開檔夾 + + + + Open image folder + 打開圖片檔夾 + + + + Open latest comic + 打開最近的漫畫 + + + + Open the latest comic opened in the previous reading session + 打開最近閱讀漫畫 + + + + Clear + 清空 + + + + Clear open recent list + 清空最近訪問列表 + + + + Save + 保存 + + + + + Save current page + 保存當前頁面 + + + + Previous Comic + 上一個漫畫 + + + + + + Open previous comic + 打開上一個漫畫 + + + + Next Comic + 下一個漫畫 + + + + + + Open next comic + 打開下一個漫畫 + + + + &Previous + 上一頁(&P) + + + + + + Go to previous page + 轉至上一頁 + + + + &Next + 下一頁(&N) + + + + + + Go to next page + 轉至下一頁 + + + + Fit Height + 適應高度 + + + + Fit image to height + 縮放圖片以適應高度 + + + + Fit Width + 適合寬度 + + + + Fit image to width + 縮放圖片以適應寬度 + + + + Show full size + 顯示全尺寸 + + + + Fit to page + 適應頁面 + + + + Continuous scroll + 連續滾動 + + + + Switch to continuous scroll mode + 切換到連續滾動模式 + + + + Reset zoom + 重置縮放 + + + + Show zoom slider + 顯示縮放滑塊 + + + + Zoom+ + 放大 + + + + Zoom- + 縮小 + + + + Rotate image to the left + 向左旋轉圖片 + + + + Rotate image to the right + 向右旋轉圖片 + + + + Double page mode + 雙頁模式 + + + + Switch to double page mode + 切換至雙頁模式 + + + + Double page manga mode + 雙頁漫畫模式 + + + + Reverse reading order in double page mode + 雙頁模式 (逆序閱讀) + + + + Go To + 跳轉 + + + + Go to page ... + 跳轉至頁面 ... + + + + Options + 選項 + + + + YACReader options + YACReader 選項 + + + + + Help + 幫助 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Magnifying glass + 放大鏡 + + + + Switch Magnifying glass + 切換放大鏡 + + + + Set bookmark + 設置書簽 + + + + Set a bookmark on the current page + 在當前頁面設置書簽 + + + + Show bookmarks + 顯示書簽 + + + + Show the bookmarks of the current comic + 顯示當前漫畫的書簽 + + + + Show keyboard shortcuts + 顯示鍵盤快捷鍵 + + + + Show Info + 顯示資訊 + + + + Close + 關閉 + + + + Show Dictionary + 顯示字典 + + + + Show go to flow + 顯示「前往 Comic Flow」 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &File + 檔(&F) + + + + + Open recent + 最近打開的檔 + + + + File + + + + + Edit + 編輯 + + + + View + 查看 + + + + Go + 轉到 + + + + Window + 窗口 + + + + + + Open Comic + 打開漫畫 + + + + + + Comic files + 漫畫檔 + + + + Open folder + 打開檔夾 + + + + page_%1.jpg + 頁_%1.jpg + + + + Image files (*.jpg) + 圖像檔 (*.jpg) + + + + + Comics + 漫畫 + + + + + General + 常規 + + + + + Magnifiying glass + 放大鏡 + + + + + Page adjustement + 頁面調整 + + + + + Reading + 閱讀 + + + + Toggle fullscreen mode + 切換全屏模式 + + + + Hide/show toolbar + 隱藏/顯示 工具欄 + + + + Size up magnifying glass + 增大放大鏡尺寸 + + + + Size down magnifying glass + 減小放大鏡尺寸 + + + + Zoom in magnifying glass + 增大縮放級別 + + + + Zoom out magnifying glass + 減小縮放級別 + + + + Reset magnifying glass + 重置放大鏡 + + + + Toggle between fit to width and fit to height + 切換顯示為"適應寬度"或"適應高度" + + + + Autoscroll down + 向下自動滾動 + + + + Autoscroll up + 向上自動滾動 + + + + Autoscroll forward, horizontal first + 向前自動滾動,水準優先 + + + + Autoscroll backward, horizontal first + 向後自動滾動,水準優先 + + + + Autoscroll forward, vertical first + 向前自動滾動,垂直優先 + + + + Autoscroll backward, vertical first + 向後自動滾動,垂直優先 + + + + Move down + 向下移動 + + + + Move up + 向上移動 + + + + Move left + 向左移動 + + + + Move right + 向右移動 + + + + Go to the first page + 轉到第一頁 + + + + Go to the last page + 轉到最後一頁 + + + + Offset double page to the left + 雙頁向左偏移 + + + + Offset double page to the right + 雙頁向右偏移 + + + + There is a new version available + 有新版本可用 + + + + Do you want to download the new version? + 你要下載新版本嗎? + + + + Remind me in 14 days + 14天後提醒我 + + + + Not now + 現在不 + + + + YACReader::TrayIconController + + + &Restore + 複位(&R) + + + + Systray + 系統託盤 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + + + YACReader::WhatsNewDialog + + Close + 關閉 + + + + YACReaderFieldEdit + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderFlowConfigWidget + + How to show covers: + 封面顯示方式: + + + CoverFlow look + 封面流 + + + Stripe look + 條狀 + + + Overlapped Stripe look + 重疊條狀 + + + + YACReaderGLFlowConfigWidget + + Presets: + 預設: + + + Classic look + 經典 + + + Stripe look + 條狀 + + + Overlapped Stripe look + 重疊條狀 + + + Modern look + 現代 + + + Roulette look + 輪盤 + + + Show advanced settings + 顯示高級選項 + + + Custom: + 自定義: + + + View angle + 視角 + + + Position + 位置 + + + Cover gap + 封面間距 + + + Central gap + 中心間距 + + + Zoom + 縮放 + + + Y offset + Y位移 + + + Z offset + Z位移 + + + Cover Angle + 封面角度 + + + Visibility + 透明度 + + + Light + 亮度 + + + Max angle + 最大角度 + + + Low Performance + 低性能 + + + High Performance + 高性能 + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) + + + Performance: + 性能: + + YACReaderNavigationController - No favorites - 沒有收藏 + 沒有收藏 - You are not reading anything yet, come on!! - 你還沒有閱讀任何東西,加油!! - - - - There are no recent comics! - + 你還沒有閱讀任何東西,加油!! YACReaderOptionsDialog - + Save 保存 - + Cancel 取消 - + Edit shortcuts 編輯快捷鍵 - + Shortcuts 快捷鍵 - Use hardware acceleration (restart needed) - 使用硬體加速 (需要重啟) + 使用硬體加速 (需要重啟) YACReaderSearchLineEdit - + type to search 搜索類型 @@ -3068,34 +4316,60 @@ to improve the performance YACReaderSideBar - Libraries - + - Folders - 檔夾 + 檔夾 - Reading Lists - 閱讀列表 + 閱讀列表 - LIBRARIES - + - FOLDERS - 檔夾 + 檔夾 - READING LISTS - 閱讀列表 + 閱讀列表 + + + + YACReaderSlider + + + Reset + 重置 + + + + YACReaderTranslator + + + YACReader translator + YACReader 翻譯 + + + + + Translation + 翻譯 + + + + clear + 清空 + + + + Service not available + 服務不可用 diff --git a/YACReaderLibraryServer/CMakeLists.txt b/YACReaderLibraryServer/CMakeLists.txt new file mode 100644 index 000000000..ed45d4535 --- /dev/null +++ b/YACReaderLibraryServer/CMakeLists.txt @@ -0,0 +1,95 @@ +# YACReaderLibraryServer - Headless REST server + +qt_add_executable(YACReaderLibraryServer + main.cpp + console_ui_library_creator.h + console_ui_library_creator.cpp + libraries_updater.h + libraries_updater.cpp +) +yacreader_apply_build_options(YACReaderLibraryServer) + +target_include_directories(YACReaderLibraryServer PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/YACReaderLibrary + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db +) + +target_compile_definitions(YACReaderLibraryServer PRIVATE + SERVER_RELEASE + YACREADER_LIBRARY +) +if(BUILD_NUMBER) + target_compile_definitions(YACReaderLibraryServer PRIVATE "BUILD_NUMBER=\"${BUILD_NUMBER}\"") +endif() + +# Translations +qt_add_translations(YACReaderLibraryServer + TS_FILES + yacreaderlibraryserver_es.ts + yacreaderlibraryserver_ru.ts + yacreaderlibraryserver_pt.ts + yacreaderlibraryserver_fr.ts + yacreaderlibraryserver_nl.ts + yacreaderlibraryserver_tr.ts + yacreaderlibraryserver_de.ts + yacreaderlibraryserver_zh_CN.ts + yacreaderlibraryserver_zh_TW.ts + yacreaderlibraryserver_zh_HK.ts + yacreaderlibraryserver_source.ts +) + +target_link_libraries(YACReaderLibraryServer PRIVATE + Qt6::Core + Qt6::Network + Qt6::Sql + Qt6::Core5Compat + library_common + db_helper + comic_backend + common_all + naturalsort + cbx_backend + server + QsLog + QrCode +) + +# Platform-specific +if(WIN32) + target_link_libraries(YACReaderLibraryServer PRIVATE oleaut32 ole32 shell32 user32) +endif() + +if(APPLE) + set_target_properties(YACReaderLibraryServer PROPERTIES + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_GUI_IDENTIFIER "com.yacreader.YACReaderLibraryServer" + MACOSX_BUNDLE_BUNDLE_NAME "YACReaderLibraryServer" + ) + target_link_libraries(YACReaderLibraryServer PRIVATE + "-framework Foundation" + "-framework ApplicationServices" + "-framework AppKit" + ) +endif() + +# Linux install rules +if(UNIX AND NOT APPLE) + target_compile_definitions(YACReaderLibraryServer PRIVATE + "LIBDIR=\"${CMAKE_INSTALL_FULL_LIBDIR}\"" + "DATADIR=\"${CMAKE_INSTALL_FULL_DATADIR}\"" + "BINDIR=\"${CMAKE_INSTALL_FULL_BINDIR}\"" + ) + + install(TARGETS YACReaderLibraryServer RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + # Standalone server: install server web files alongside the binary + if(BUILD_SERVER_STANDALONE) + install(DIRECTORY "${PROJECT_SOURCE_DIR}/release/server" + DESTINATION ${CMAKE_INSTALL_DATADIR}/yacreader) + endif() + + # systemd service + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/yacreaderlibraryserver.service" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/systemd/user) +endif() diff --git a/YACReaderLibraryServer/YACReaderLibraryServer.pro b/YACReaderLibraryServer/YACReaderLibraryServer.pro deleted file mode 100644 index ed7ca78f8..000000000 --- a/YACReaderLibraryServer/YACReaderLibraryServer.pro +++ /dev/null @@ -1,180 +0,0 @@ -TEMPLATE = app -TARGET = YACReaderLibraryServer - -QMAKE_TARGET_BUNDLE_PREFIX = "com.yacreader" - -CONFIG += console -DEPENDPATH += ../YACReaderLibrary -INCLUDEPATH += ../YACReaderLibrary \ - ../common \ - ../YACReaderLibrary/server \ - ../YACReaderLibrary/db - -DEFINES += SERVER_RELEASE YACREADER_LIBRARY -# load default build flags -# do a basic dependency check -include(headless_config.pri) -include(../dependencies/pdf_backend.pri) -include(../third_party/QrCode/QrCode.pri) - -greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat - -win32 { - LIBS += -loleaut32 -lole32 -lshell32 -luser32 - msvc { - QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT /GL - QMAKE_LFLAGS_RELEASE += /LTCG - } - CONFIG -= embed_manifest_exe -} - -macx { - LIBS += -framework Foundation -framework ApplicationServices -framework AppKit - CONFIG += objective_c -} - -#CONFIG += release -CONFIG -= flat -QT += core sql network - -greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat - -# Source files -HEADERS += ../YACReaderLibrary/library_creator.h \ - ../YACReaderLibrary/package_manager.h \ - ../YACReaderLibrary/bundle_creator.h \ - ../YACReaderLibrary/db_helper.h \ - ../YACReaderLibrary/db/data_base_management.h \ - ../YACReaderLibrary/db/reading_list.h \ - ../YACReaderLibrary/initial_comic_info_extractor.h \ - ../YACReaderLibrary/xml_info_parser.h \ - ../YACReaderLibrary/xml_info_library_scanner.h \ - ../common/comic_db.h \ - ../common/folder.h \ - ../common/library_item.h \ - ../common/comic.h \ - ../common/pdf_comic.h \ - ../common/bookmarks.h \ - ../common/qnaturalsorting.h \ - ../common/yacreader_global.h \ - ../common/cover_utils.h \ - ../YACReaderLibrary/yacreader_local_server.h \ - ../YACReaderLibrary/comics_remover.h \ - ../common/http_worker.h \ - ../YACReaderLibrary/yacreader_libraries.h \ - ../YACReaderLibrary/comic_files_manager.h \ - console_ui_library_creator.h \ - libraries_updater.h \ - ../YACReaderLibrary/ip_config_helper.h \ - ../YACReaderLibrary/db/query_lexer.h \ - ../YACReaderLibrary/db/query_parser.h \ - ../YACReaderLibrary/db/search_query.h \ - ../YACReaderLibrary/libraries_update_coordinator.h \ - ../common/global_info_provider.h \ - - -SOURCES += ../YACReaderLibrary/library_creator.cpp \ - ../YACReaderLibrary/package_manager.cpp \ - ../YACReaderLibrary/bundle_creator.cpp \ - ../YACReaderLibrary/db_helper.cpp \ - ../YACReaderLibrary/db/data_base_management.cpp \ - ../YACReaderLibrary/db/reading_list.cpp \ - ../YACReaderLibrary/initial_comic_info_extractor.cpp \ - ../YACReaderLibrary/xml_info_parser.cpp \ - ../YACReaderLibrary/xml_info_library_scanner.cpp \ - ../common/comic_db.cpp \ - ../common/folder.cpp \ - ../common/library_item.cpp \ - ../common/comic.cpp \ - ../common/bookmarks.cpp \ - ../common/qnaturalsorting.cpp \ - ../common/cover_utils.cpp \ - ../YACReaderLibrary/yacreader_local_server.cpp \ - ../YACReaderLibrary/comics_remover.cpp \ - ../common/http_worker.cpp \ - ../common/yacreader_global.cpp \ - ../YACReaderLibrary/yacreader_libraries.cpp \ - ../YACReaderLibrary/comic_files_manager.cpp \ - console_ui_library_creator.cpp \ - main.cpp \ - libraries_updater.cpp \ - ../YACReaderLibrary/ip_config_helper.cpp \ - ../YACReaderLibrary/db/query_lexer.cpp \ - ../YACReaderLibrary/db/query_parser.cpp \ - ../YACReaderLibrary/db/search_query.cpp \ - ../YACReaderLibrary/libraries_update_coordinator.cpp \ - ../common/global_info_provider.cpp \ - -include(../YACReaderLibrary/server/server.pri) - -CONFIG(7zip) { -include(../compressed_archive/wrapper.pri) -} else:CONFIG(unarr) { -include(../compressed_archive/unarr/unarr-wrapper.pri) -} else:CONFIG(libarchive) { -include(../compressed_archive/libarchive/libarchive-wrapper.pri) -} else { - error(No compression backend specified. Did you mess with the build system?) -} -include(../third_party/QsLog/QsLog.pri) - -TRANSLATIONS = yacreaderlibraryserver_es.ts \ - yacreaderlibraryserver_ru.ts \ - yacreaderlibraryserver_pt.ts \ - yacreaderlibraryserver_fr.ts \ - yacreaderlibraryserver_nl.ts \ - yacreaderlibraryserver_tr.ts \ - yacreaderlibraryserver_de.ts \ - yacreaderlibraryserver_zh_CN.ts \ - yacreaderlibraryserver_zh_TW.ts \ - yacreaderlibraryserver_zh_HK.ts \ - yacreaderlibraryserver_source.ts - -RESOURCES += images.qrc - -contains(QMAKE_TARGET.arch, x86_64) { - Release:DESTDIR = ../release64 - Debug:DESTDIR = ../debug64 -} else { - Release:DESTDIR = ../release - Debug:DESTDIR = ../debug -} - -unix:!macx { -#set install prefix if it's empty - -DEFINES += "LIBDIR=\\\"$$LIBDIR\\\"" "DATADIR=\\\"$$DATADIR\\\"" "BINDIR=\\\"$$BINDIR\\\"" - -#make install - -!CONFIG(server_bundled):!CONFIG(server_standalone): { - CONFIG+=server_bundled - message("No build type specified. Defaulting to bundled server build (CONFIG+=server_bundled).") - message("If you wish to run YACReaderLibraryServer on a system without an existing install of YACReaderLibrary,\ - please specify CONFIG+=server_standalone as an option when running qmake to avoid missing dependencies.") -} - -CONFIG(server_standalone) { - INSTALLS += bin server systemd -} -else:CONFIG(server_bundled) { - INSTALLS += bin systemd -} - -bin.path = $$BINDIR -isEmpty(DESTDIR) { - bin.files = YACReaderLibraryServer -} else { - bin.files = $$DESTDIR/YACReaderLibraryServer -} - -server.path = $$DATADIR/yacreader -server.files = ../release/server - -systemd.path = $$LIBDIR/systemd/user -systemd.files = yacreaderlibraryserver.service - -# TODO: We need a manpage for yaclibserver -#manpage.path = $$DATADIR/man/man1 -#manpage.files = ../YACReaderLibrary.1 -} diff --git a/YACReaderLibraryServer/console_ui_library_creator.cpp b/YACReaderLibraryServer/console_ui_library_creator.cpp index 9fa3d33ff..e4f6a2517 100644 --- a/YACReaderLibraryServer/console_ui_library_creator.cpp +++ b/YACReaderLibraryServer/console_ui_library_creator.cpp @@ -1,10 +1,10 @@ #include "console_ui_library_creator.h" -#include - #include "library_creator.h" -#include "yacreader_libraries.h" #include "xml_info_library_scanner.h" +#include "yacreader_libraries.h" + +#include using namespace YACReader; diff --git a/YACReaderLibraryServer/headless_config.pri b/YACReaderLibraryServer/headless_config.pri deleted file mode 100644 index 4e499be4d..000000000 --- a/YACReaderLibraryServer/headless_config.pri +++ /dev/null @@ -1,37 +0,0 @@ -# functions to automatically initialize some of YACReaderLibraryServer's build -# options to default values if they're not set at build time -# for a more detailed description, see INSTALL.TXT - -include (../config.pri) - -unix!macx { - !contains(QT_CONFIG, no-pkg-config) { - packagesExist(Qt5Core) { - message("Found Qt5Core") - } else: { - message("Missing dependency: Qt5Core") - } - packagesExist(Qt5Gui) { - message("Found Qt5Gui") - } else: { - message("Missing dependency: Qt5Gui") - } - packagesExist(Qt5Network) { - message("Found Qt5Network") - } else: { - message("Missing dependency: Qt5Network") - } - packagesExist(Qt5Sql) { - message("Found Qt5Sql") - } else: { - message("Missing dependency: Qt5Sql") - } - packagesExist(sqlite3) { - message("Found sqlite3") - } else: { - message("Missing dependency: sqlite3") - } - } else { - message("Qmake was compiled without support for pkg-config. Skipping dependency checks.") - } -} diff --git a/YACReaderLibraryServer/images.qrc b/YACReaderLibraryServer/images.qrc deleted file mode 100644 index 1ea3a08e0..000000000 --- a/YACReaderLibraryServer/images.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - ../images/f_overlayed.png - ../images/f_overlayed_retina.png - - diff --git a/YACReaderLibraryServer/libraries_updater.cpp b/YACReaderLibraryServer/libraries_updater.cpp index c49aaa9b5..1b2631eb8 100644 --- a/YACReaderLibraryServer/libraries_updater.cpp +++ b/YACReaderLibraryServer/libraries_updater.cpp @@ -1,7 +1,10 @@ #include "libraries_updater.h" -#include "yacreader_libraries.h" #include "data_base_management.h" +#include "yacreader_global.h" +#include "yacreader_libraries.h" + +#include LibrariesUpdater::LibrariesUpdater() { @@ -13,7 +16,7 @@ void LibrariesUpdater::updateIfNeeded() libraries.load(); - foreach (QString name, libraries.getNames()) { + for (const QString &name : libraries.getNames()) { QString libraryPath = libraries.getPath(name); QString libraryDataPath = YACReader::LibraryPaths::libraryDataPath(libraryPath); QString databasePath = YACReader::LibraryPaths::libraryDatabasePath(libraryPath); diff --git a/YACReaderLibraryServer/main.cpp b/YACReaderLibraryServer/main.cpp index 2d27c1897..fc988ec7e 100644 --- a/YACReaderLibraryServer/main.cpp +++ b/YACReaderLibraryServer/main.cpp @@ -1,30 +1,24 @@ -#include -#include -#include -#include -#include - +#include "QsLog.h" +#include "QsLogDest.h" #include "comic_db.h" +#include "console_ui_library_creator.h" #include "data_base_management.h" #include "db_helper.h" -#include "yacreader_http_server.h" -#include "yacreader_global.h" -#include "yacreader_libraries.h" -#include "yacreader_local_server.h" #include "global_info_provider.h" - +#include "ip_config_helper.h" #include "libraries_update_coordinator.h" - #include "libraries_updater.h" - -#include "console_ui_library_creator.h" - -#include - -#include "QsLog.h" -#include "QsLogDest.h" #include "qrcodegen.hpp" -#include "ip_config_helper.h" +#include "yacreader_global.h" +#include "yacreader_http_server.h" +#include "yacreader_libraries.h" +#include "yacreader_local_server.h" + +#include +#include +#include +#include +#include using namespace QsLogging; @@ -50,12 +44,11 @@ int main(int argc, char **argv) QCoreApplication app(argc, argv); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QImageReader::setAllocationLimit(0); -#endif app.setApplicationName("YACReaderLibrary"); app.setOrganizationName("YACReader"); + YACReader::initializeSharedPluginPaths(); QString buildNumber = ".0"; @@ -487,9 +480,9 @@ void printServerInfo(YACReaderHttpServer *httpServer) for (int x = -border - 1; x < code.getSize() + border + 1; x++) { QRCodeString.append((code.getModule(x, y) && code.getModule(x, y + 1)) ? " " - : code.getModule(x, y + 1) ? u8"\u2580" - : code.getModule(x, y) ? u8"\u2584" - : u8"\u2588"); + : code.getModule(x, y + 1) ? "\u2580" + : code.getModule(x, y) ? "\u2584" + : "\u2588"); } QLOG_INFO() << QRCodeString; } diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_de.ts b/YACReaderLibraryServer/yacreaderlibraryserver_de.ts index 5bdf41ea3..cde929dc3 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_de.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_de.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Keine + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Label-Name: - - 7z not found - + + Choose a color: + Wähle eine Farbe: - - Format not supported - + + accept + Akzeptieren + + + + cancel + Abbrechen - LogWindow + AddLibraryDialog + + + Comics folder : + Comics-Ordner : + + + + Library name : + Bibliothek-Name : + - - Log window - + + Add + Hinzufügen - - &Pause - + + Cancel + Abbrechen - - &Save - + + Add an existing library + Eine vorhandene Bibliothek hinzufügen + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Bevor du dich mit Comic Vine verbindest, brauchst du deinen eigenen API-Schlüssel. Du kannst <a href="http://www.comicvine.com/api/">hier</a> einen kostenlosen bekommen. - - &Copy - + + Paste here your Comic Vine API key + Füge hier deinen Comic Vine API-Schlüssel ein. - - Level: - + + Accept + Akzeptieren - - &Auto scroll - + + Cancel + Abbrechen - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Farbschema + + + + System + Systemumgebung + + + + Light + Licht + + + + Dark + Dunkel + + + + Custom + Brauch + + + + Remove + Entfernen + + + + Remove this user-imported theme + Entfernen Sie dieses vom Benutzer importierte Design + + + + Light: + Licht: + + + + Dark: + Dunkel: + + + + Custom: + Benutzerdefiniert: + + + + Import theme... + Theme importieren... + + + + Theme + Thema + + + + Theme editor + Theme-Editor + + + + Open Theme Editor... + Theme-Editor öffnen... + + + + Theme editor error + Fehler im Theme-Editor + + + + The current theme JSON could not be loaded. + Der aktuelle Theme-JSON konnte nicht geladen werden. + + + + Import theme + Thema importieren + + + + JSON files (*.json);;All files (*) + JSON-Dateien (*.json);;Alle Dateien (*) + + + + Could not import theme from: +%1 + Theme konnte nicht importiert werden von: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + Theme konnte nicht importiert werden von: +%1 + +%2 + + + + Import failed + Der Import ist fehlgeschlagen - QObject + BookmarksDialog - - Trace - + + Lastest Page + Neueste Seite - - Debug - + + Close + Schliessen - - Info - + + Click on any image to go to the bookmark + Klicke auf ein beliebiges Bild, um zum Lesezeichen zu gehen - - Warning - + + + Loading... + Laden... + + + ClassicComicsView - - Error - + + Hide comic flow + Comic Flow ausblenden + + + + ComicModel + + + yes + Ja - - Fatal - + + no + Nein + + + + Title + Titel + + + + File Name + Dateiname + + + + Pages + Seiten + + + + Size + Größe + + + + Read + Lesen + + + + Current Page + Aktuelle Seite + + + + Publication Date + Veröffentlichungsdatum + + + + Rating + Bewertung + + + + Series + Serie + + + + Volume + Volumen + + + + Story Arc + Handlungsbogen + + + + ComicVineDialog + + + skip + überspringen + + + + back + zurück + + + + next + nächste + + + + search + suche + + + + close + schließen + + + + + comic %1 of %2 - %3 + Comic %1 von %2 - %3 + + + + + + Looking for volume... + Suche nach Band.... + + + + %1 comics selected + %1 Comic ausgewählt + + + + Error connecting to ComicVine + Fehler bei Verbindung zu ComicVine + + + + + Retrieving tags for : %1 + Herunterladen von Tags für : %1 + + + + Retrieving volume info... + Herunterladen von Info zu Ausgabe... + + + + Looking for comic... + Suche nach Comic... + + + + ContinuousPageWidget + + + Loading page %1 + Seite wird geladen %1 + + + + CreateLibraryDialog + + + Comics folder : + Comics-Ordner : + + + + Library Name : + Bibliothek-Name : + + + + Create + Erstellen + + + + Cancel + Abbrechen + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Es kann einige Minuten dauern, eine neue Bibliothek zu erstellen. Sie können den Prozess abbrechen und die Bibliothek später aktualisieren, um den Vorgang abzuschließen. + + + + Create new library + Erstelle eine neue Bibliothek + + + + Path not found + Pfad nicht gefunden + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben + + + + EditShortcutsDialog + + + Restore defaults + Standardwerte wiederherstellen + + + + To change a shortcut, double click in the key combination and type the new keys. + Um ein Kürzel zu ändern, klicke doppelt auf die Tastenkombination und füge die neuen Tasten ein. + + + + Shortcuts settings + Kürzel-Einstellungen + + + + Shortcut in use + Genutzte Kürzel + + + + The shortcut "%1" is already assigned to other function + Das Kürzel "%1" ist bereits für eine andere Funktion in Verwendung + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Dieser Ordner enthält noch keine Comics + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Dieses Label enthält noch keine Comics + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Diese Leseliste enthält noch keine Comics + + + + EmptySpecialListWidget + + + No favorites + Keine Favoriten + + + + You are not reading anything yet, come on!! + Sie lesen noch nichts, starten Sie!! + + + + There are no recent comics! + Es gibt keine aktuellen Comics! + + + + ExportComicsInfoDialog + + + Output file : + Zieldatei : + + + + Create + Erstellen + + + + Cancel + Abbrechen + + + + Export comics info + Comicinfo exportieren + + + + Destination database name + Ziel-Datenbank Name + + + + Problem found while writing + Problem beim Schreiben + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben + + + + ExportLibraryDialog + + + Output folder : + Ziel-Ordner : + + + + Create + Erstellen + + + + Cancel + Abbrechen + + + + Create covers package + Erzeuge Titelbild-Paket + + + + Problem found while writing + Problem beim Schreiben + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Der gewählte Pfad existiert nicht oder ist kein gültiger Pfad. Stellen Sie sicher, dass Sie Schreibzugriff zu dem Ordner haben + + + + Destination directory + Ziel-Verzeichnis + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + CRC Error auf Seite (%1): Einige Seiten werden nicht korrekt dargestellt + + + + Unknown error opening the file + Unbekannter Fehler beim Öffnen des Files + + + + 7z not found + 7z nicht gefunden + + + + Format not supported + Format wird nicht unterstützt + + + + GoToDialog + + + Page : + Seite : + + + + Go To + Gehe zu + + + + Cancel + Abbrechen + + + + + Total pages : + Seiten gesamt : + + + + Go to... + Gehe zu... + + + + GoToFlowToolBar + + + Page : + Seite : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Info anzeigen + + + HelpAboutDialog - - Level - + + About + Über - - Message - + + Help + Hilfe + + + + System info + Systeminformationen + + + + ImportComicsInfoDialog + + + Import comics info + Importiere Comic-Info + + + + Info database location : + Info-Datenbank Speicherort : + + + + Import + Importieren + + + + Cancel + Abbrechen + + + + Comics info file (*.ydb) + Comics-Info-Datei (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Bibliothek-Name : + + + + Package location : + Paket Ort : + + + + Destination folder : + Zielordner : + + + + Unpack + Entpacken + + + + Cancel + Abbrechen + + + + Extract a catalog + Einen Katalog extrahieren + + + + Compresed library covers (*.clc) + Komprimierte Bibliothek Cover (*.clc) + + + + ImportWidget + + + stop + Stopp + + + + Some of the comics being added... + Einige der Comics werden hinzugefügt... + + + + Importing comics + Comics werden importiert + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary erstellt nun eine neue Bibliothek. </p><p>Es kann einige Minuten dauern, eine neue Bibliothek zu erstellen. Sie können den Prozess abbrechen und die Bibliothek später aktualisieren, um den Vorgang abzuschließen.</p> + + + + Updating the library + Aktualisierung der Bibliothek + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Die aktuelle Bibliothek wird gerade aktualisiert. Für eine schnellere Aktualisierung, aktualisieren Sie die Bibliothek bitte regelmäßig.</p><p>Sie können den Prozess abbrechen und mit der Aktualisierung später fortfahren.<p> + + + + Upgrading the library + Upgrade der Bibliothek + + + + <p>The current library is being upgraded, please wait.</p> + Die aktuelle Bibliothek wird gerade upgegradet, bitte warten. + + + + Scanning the library + Durchsuchen der Bibliothek + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Die aktuelle Bibliothek wird nach alten XML-Metadateninformationen durchsucht.</p><p>Dies ist nur einmal erforderlich und nur, wenn die Bibliothek mit YACReaderLibrary 9.8.2 oder früher erstellt wurde.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Bibliothek + + + + + + comic + komisch + + + + + + manga + Manga + + + + + + western manga (left to right) + Western-Manga (von links nach rechts) + + + + + + web comic + Webcomic + + + + + + 4koma (top to botom) + 4koma (von oben nach unten) + + + + + + + Set type + Typ festlegen + + + + Library + Bibliothek + + + + Folder + Ordner + + + + Comic + Komisch + + + + Upgrade failed + Update gescheitert + + + + There were errors during library upgrade in: + Beim Upgrade der Bibliothek kam es zu Fehlern in: + + + + Update needed + Update benötigt + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Diese Bibliothek wurde mit einer älteren Version von YACReader erzeugt. Sie muss geupdated werden. Jetzt updaten? + + + + Download new version + Neue Version herunterladen + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Die Bibliothek wurde mit einer neueren Version von YACReader erstellt. Die neue Version jetzt herunterladen? + + + + Library not available + Bibliothek nicht verfügbar + + + + Library '%1' is no longer available. Do you want to remove it? + Bibliothek '%1' ist nicht mehr verfügbar. Wollen Sie sie entfernen? + + + + Old library + Alte Bibliothek + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Bibliothek '%1' wurde mit einer älteren Version von YACReader erstellt. Sie muss neu erzeugt werden. Wollen Sie die Bibliothek jetzt erzeugen? + + + + + Copying comics... + Kopieren von Comics... + + + + + Moving comics... + Verschieben von Comics... + + + + Add new folder + Neuen Ordner erstellen + + + + Folder name: + Ordnername + + + + No folder selected + Kein Ordner ausgewählt + + + + Please, select a folder first + Bitte wählen Sie zuerst einen Ordner aus + + + + Error in path + Fehler im Pfad + + + + There was an error accessing the folder's path + Beim Aufrufen des Ordnerpfades kam es zu einem Fehler + + + + Delete folder + Ordner löschen + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Der ausgewählte Ordner und sein gesamter Inhalt wird von Ihrer Festplatte gelöscht. Sind Sie sicher? + + + + + Unable to delete + Löschen nicht möglich + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Beim Löschen des ausgewählten Ordners ist ein Problem aufgetreten. Bitte überprüfen Sie die Schreibrechte und stellen Sie sicher, dass keine Anwendung diese Ordner oder die darin enthaltenen Dateien verwendet. + + + + Add new reading lists + Neue Leseliste hinzufügen + + + + + List name: + Name der Liste + + + + Delete list/label + Ausgewählte/s Liste/Label löschen + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Das ausgewählte Element wird gelöscht; Ihre Comics oder Ordner werden NICHT von Ihrer Festplatte gelöscht. Sind Sie sicher? + + + + Rename list name + Listenname ändern + + + + Open folder... + Öffne Ordner... + + + + Update folder + Ordner aktualisieren + + + + Rescan library for XML info + Durchsuchen Sie die Bibliothek erneut nach XML-Informationen + + + + Set as uncompleted + Als nicht gelesen markieren + + + + Set as completed + Als gelesen markieren + + + + Set as read + Als gelesen markieren + + + + + Set as unread + Als ungelesen markieren + + + + Set custom cover + Legen Sie ein benutzerdefiniertes Cover fest + + + + Delete custom cover + Benutzerdefiniertes Cover löschen + + + + Save covers + Titelbilder speichern + + + + You are adding too many libraries. + Sie fügen zu viele Bibliotheken hinzu. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Sie fügen zu viele Bibliotheken hinzu. + +Wahrscheinlich brauchen Sie nur eine Bibliothek in Ihrem obersten Comic-Ordner, Sie können alle Unterordner mit Hilfe des Ordnerbereichs in der linken Seitenleiste durchsuchen. + +YACReaderLibrary wird Sie nicht daran hindern, weitere Bibliotheken zu erstellen, aber Sie sollten die Anzahl der Bibliotheken gering halten. + + + + + YACReader not found + YACReader nicht gefunden + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader nicht gefunden. YACReader muss im gleichen Ordner installiert sein wie YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader nicht gefunden. Eventuell besteht ein Problem mit Ihrer YACReader-Installation. + + + + Error + Fehler + + + + Error opening comic with third party reader. + Beim Öffnen des Comics mit dem Drittanbieter-Reader ist ein Fehler aufgetreten. + + + + Library not found + Bibliothek nicht gefunden + + + + The selected folder doesn't contain any library. + Der ausgewählte Ordner enthält keine Bibliothek. + + + + Are you sure? + Sind Sie sicher? + + + + Do you want remove + Möchten Sie entfernen + + + + library? + Bibliothek? + + + + Remove and delete metadata + Entferne und lösche Metadaten + + + + Library info + Informationen zur Bibliothek + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Es gab ein Problem beim Löschen der ausgewählten Comics. Überprüfen Sie bitte die Schreibberechtigung für die ausgewählten Dateien oder Ordner. + + + + Assign comics numbers + Comics Nummern zuweisen + + + + Assign numbers starting in: + Nummern zuweisen, beginnend mit: + + + + Invalid image + Ungültiges Bild + + + + The selected file is not a valid image. + Die ausgewählte Datei ist kein gültiges Bild. + + + + Error saving cover + Fehler beim Speichern des Covers + + + + There was an error saving the cover image. + Beim Speichern des Titelbildes ist ein Fehler aufgetreten. + + + + Error creating the library + Fehler beim Erstellen der Bibliothek + + + + Error updating the library + Fehler beim Updaten der Bibliothek + + + + Error opening the library + Fehler beim Öffnen der Bibliothek + + + + Delete comics + Comics löschen + + + + All the selected comics will be deleted from your disk. Are you sure? + Alle ausgewählten Comics werden von Ihrer Festplatte gelöscht. Sind Sie sicher? + + + + Remove comics + Comics löschen + + + + Comics will only be deleted from the current label/list. Are you sure? + Comics werden nur vom aktuellen Label/der aktuellen Liste gelöscht. Sind Sie sicher? + + + + Library name already exists + Bibliothek-Name bereits vorhanden + + + + There is another library with the name '%1'. + Es gibt bereits eine Bibliothek mit dem Namen '%1'. + + + + LibraryWindowActions + + + Create a new library + Neue Bibliothek erstellen + + + + Open an existing library + Eine vorhandede Bibliothek öffnen + + + + + Export comics info + Comicinfo exportieren + + + + + Import comics info + Importiere Comic-Info + + + + Pack covers + Titelbild-Paket erzeugen + + + + Pack the covers of the selected library + Packe die Titelbilder der ausgewählten Bibliothek in ein Paket + + + + Unpack covers + Titelbilder entpacken + + + + Unpack a catalog + Katalog entpacken + + + + Update library + Bibliothek updaten + + + + Update current library + Aktuelle Bibliothek updaten + + + + Rename library + Bibliothek umbenennen + + + + Rename current library + Aktuelle Bibliothek umbenennen + + + + Remove library + Bibliothek entfernen + + + + Remove current library from your collection + Aktuelle Bibliothek aus der Sammlung entfernen + + + + Rescan library for XML info + Durchsuchen Sie die Bibliothek erneut nach XML-Informationen + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Versucht, in Comic-Dateien eingebettete XML-Informationen zu finden. Sie müssen dies nur tun, wenn die Bibliothek mit 9.8.2 oder früheren Versionen erstellt wurde oder wenn Sie Software von Drittanbietern verwenden, um XML-Informationen in die Dateien einzubetten. + + + + Show library info + Bibliotheksinformationen anzeigen + + + + Show information about the current library + Informationen zur aktuellen Bibliothek anzeigen + + + + Open current comic + Aktuellen Comic öffnen + + + + Open current comic on YACReader + Aktuellen Comic mit YACReader öffnen + + + + Save selected covers to... + Ausgewählte Titelbilder speichern in... + + + + Save covers of the selected comics as JPG files + Titelbilder der ausgewählten Comics als JPG-Datei speichern + + + + + Set as read + Als gelesen markieren + + + + Set comic as read + Comic als gelesen markieren + + + + + Set as unread + Als ungelesen markieren + + + + Set comic as unread + Comic als ungelesen markieren + + + + + manga + Manga + + + + Set issue as manga + Ausgabe als Manga festlegen + + + + + comic + komisch + + + + Set issue as normal + Ausgabe als normal festlegen + + + + western manga + Western-Manga + + + + Set issue as western manga + Ausgabe als Western-Manga festlegen + + + + + web comic + Webcomic + + + + Set issue as web comic + Ausgabe als Webcomic festlegen + + + + + yonkoma + Yonkoma + + + + Set issue as yonkoma + Stellen Sie das Problem als Yonkoma ein + + + + Show/Hide marks + Zeige/Verberge Markierungen + + + + Show or hide read marks + Gelesen-Markierungen anzeigen oder verbergen + + + + Show/Hide recent indicator + Aktuelle Anzeige ein-/ausblenden + + + + Show or hide recent indicator + Aktuelle Anzeige anzeigen oder ausblenden + + + + + Fullscreen mode on/off + Vollbildmodus an/aus + + + + Help, About YACReader + Hilfe, über YACReader + + + + Add new folder + Neuen Ordner erstellen + + + + Add new folder to the current library + Neuen Ordner in der aktuellen Bibliothek erstellen + + + + Delete folder + Ordner löschen + + + + Delete current folder from disk + Aktuellen Ordner von der Festplatte löschen + + + + Select root node + Ursprungsordner auswählen + + + + Expand all nodes + Alle Unterordner anzeigen + + + + Collapse all nodes + Alle Unterordner einklappen + + + + Show options dialog + Zeige den Optionen-Dialog + + + + Show comics server options dialog + Zeige Comic-Server-Optionen-Dialog + + + + + Change between comics views + Zwischen Comic-Anzeigemodi wechseln + + + + Open folder... + Öffne Ordner... + + + + Set as uncompleted + Als nicht gelesen markieren + + + + Set as completed + Als gelesen markieren + + + + Set custom cover + Legen Sie ein benutzerdefiniertes Cover fest + + + + Delete custom cover + Benutzerdefiniertes Cover löschen + + + + western manga (left to right) + Western-Manga (von links nach rechts) + + + + Open containing folder... + Öffne aktuellen Ordner... + + + + Reset comic rating + Comic-Bewertung zurücksetzen + + + + Select all comics + Alle Comics auswählen + + + + Edit + Ändern + + + + Assign current order to comics + Aktuele Sortierung auf Comics anwenden + + + + Update cover + Titelbild updaten + + + + Delete selected comics + Ausgewählte Comics löschen + + + + Delete metadata from selected comics + Metadaten aus ausgewählten Comics löschen + + + + Download tags from Comic Vine + Tags von Comic Vine herunterladen + + + + Focus search line + Suchzeile fokussieren + + + + Focus comics view + Fokus-Comic-Ansicht + + + + Edit shortcuts + Kürzel ändern + + + + &Quit + &Schließen + + + + Update folder + Ordner aktualisieren + + + + Update current folder + Aktuellen Ordner aktualisieren + + + + Scan legacy XML metadata + Scannen Sie ältere XML-Metadaten + + + + Add new reading list + Neue Leseliste hinzufügen + + + + Add a new reading list to the current library + Neue Leseliste zur aktuellen Bibliothek hinzufügen + + + + Remove reading list + Leseliste entfernen + + + + Remove current reading list from the library + Aktuelle Leseliste von der Bibliothek entfernen + + + + Add new label + Neues Label hinzufügen + + + + Add a new label to this library + Neues Label zu dieser Bibliothek hinzufügen + + + + Rename selected list + Ausgewählte Liste umbenennen + + + + Rename any selected labels or lists + Ausgewählte Labels oder Listen umbenennen + + + + Add to... + Hinzufügen zu... + + + + Favorites + Favoriten + + + + Add selected comics to favorites list + Ausgewählte Comics zu Favoriten hinzufügen + + + + LocalComicListModel + + + file name + Dateiname + + + + NoLibrariesWidget + + + You don't have any libraries yet + Sie haben aktuell noch keine Bibliothek + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Sie können eine Bibliothek in jedem beliebigen Ordner erstellen, YACReaderLibrary wird alle Comics und Unterordner von diesem Ordner importieren. Wenn Sie bereits eine Bibliothek erstellt haben, können Sie sie öffnen.</p><p>Vergessen Sie nicht, dass Sie YACReader als eigentsändige Anwendung nutzen können, um Comics auf Ihrem Computer zu lesen.</p> + + + + create your first library + Erstellen Sie Ihre erste Bibliothek + + + + add an existing one + Existierende hinzufügen + + + + NoSearchResultsWidget + + + No results + Keine Ergebnisse + + + + OptionsDialog + + + + General + Allgemein + + + + + Libraries + Bibliotheken + + + + Comic Flow + Comic Flow + + + + Grid view + Rasteransicht + + + + + Appearance + Aussehen + + + + + Options + Optionen + + + + + Language + Sprache + + + + + Application language + Anwendungssprache + + + + + System default + Systemstandard + + + + Tray icon settings (experimental) + Taskleisten-Einstellungen (experimentell) + + + + Close to tray + In Taskleiste schließen + + + + Start into the system tray + In die Taskleiste starten + + + + Edit Comic Vine API key + Comic Vine API-Schlüssel ändern + + + + Comic Vine API key + Comic Vine API Schlüssel + + + + ComicInfo.xml legacy support + ComicInfo.xml-Legacy-Unterstützung + + + + Import metadata from ComicInfo.xml when adding new comics + Importieren Sie Metadaten aus ComicInfo.xml, wenn Sie neue Comics hinzufügen + + + + Consider 'recent' items added or updated since X days ago + Berücksichtigen Sie „neue“ Elemente, die seit X Tagen hinzugefügt oder aktualisiert wurden + + + + Third party reader + Drittanbieter-Reader + + + + Write {comic_file_path} where the path should go in the command + Schreiben Sie {comic_file_path}, wohin der Pfad im Befehl gehen soll + + + + + Clear + Löschen + + + + Update libraries at startup + Aktualisieren Sie die Bibliotheken beim Start + + + + Try to detect changes automatically + Versuchen Sie, Änderungen automatisch zu erkennen + + + + Update libraries periodically + Aktualisieren Sie die Bibliotheken regelmäßig + + + + Interval: + Intervall: + + + + 30 minutes + 30 Minuten + + + + 1 hour + 1 Stunde + + + + 2 hours + 2 Stunden + + + + 4 hours + 4 Stunden + + + + 8 hours + 8 Stunden + + + + 12 hours + 12 Stunden + + + + daily + täglich + + + + Update libraries at certain time + Aktualisieren Sie Bibliotheken zu einem bestimmten Zeitpunkt + + + + Time: + Zeit: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + WARNUNG! Während Bibliotheksaktualisierungen sind Schreibvorgänge in die Datenbank deaktiviert! +Planen Sie keine Updates, während Sie die App möglicherweise aktiv nutzen. +Bei automatischen Updates blockiert die App einige Aktionen, bis das Update abgeschlossen ist. +Um eine automatische Aktualisierung zu stoppen, tippen Sie auf die Ladeanzeige neben dem Titel „Bibliotheken“. + + + + Modifications detection + Erkennung von Änderungen + + + + Compare the modified date of files when updating a library (not recommended) + Vergleichen Sie das Änderungsdatum von Dateien beim Aktualisieren einer Bibliothek (nicht empfohlen) + + + + Enable background image + Hintergrundbild aktivieren + + + + Opacity level + Deckkraft-Stufe + + + + Blur level + Unschärfe-Stufe + + + + Use selected comic cover as background + Den ausgewählten Comic als Hintergrund verwenden + + + + Restore defautls + Standardwerte wiederherstellen + + + + Background + Hintergrund + + + + Display continue reading banner + Weiterlesen-Banner anzeigen + + + + Display current comic banner + Aktuelles Comic-Banner anzeigen + + + + Continue reading + Weiterlesen + + + + My comics path + Meine Comics-Pfad + + + + Display + Anzeige + + + + Show time in current page information label + Zeit im Informationsetikett der aktuellen Seite anzeigen + + + + "Go to flow" size + Größe von "Gehe zu Comic Flow" + + + + Background color + Hintergrundfarbe + + + + Choose + Auswählen + + + + Scroll behaviour + Scrollverhalten + + + + Disable scroll animations and smooth scrolling + Scroll-Animationen und sanftes Scrollen deaktivieren + + + + Do not turn page using scroll + Blättern Sie nicht mit dem Scrollen um + + + + Use single scroll step to turn page + Verwenden Sie einen einzelnen Bildlaufschritt, um die Seite umzublättern + + + + Mouse mode + Mausmodus + + + + Only Back/Forward buttons can turn pages + Nur mit den Zurück-/Vorwärts-Tasten können Seiten umgeblättert werden + + + + Use the Left/Right buttons to turn pages. + Verwenden Sie die Links-/Rechts-Tasten, um Seiten umzublättern. + + + + Click left or right half of the screen to turn pages. + Klicken Sie auf die linke oder rechte Hälfte des Bildschirms, um die Seiten umzublättern. + + + + Quick Navigation Mode + Schnellnavigations-Modus + + + + Disable mouse over activation + Aktivierung durch Maus deaktivieren + + + + Brightness + Helligkeit + + + + Contrast + Kontrast + + + + Gamma + Gammawert + + + + Reset + Zurücksetzen + + + + Image options + Bilderoptionen + + + + Fit options + Anpassungsoptionen + + + + Enlarge images to fit width/height + Bilder vergrößern, um sie Breite/Höhe anzupassen + + + + Double Page options + Doppelseiten-Einstellungen + + + + Show covers as single page + Cover als eine Seite darstellen + + + + Scaling + Skalierung + + + + Scaling method + Skalierungsmethode + + + + Nearest (fast, low quality) + Am nächsten (schnell, niedrige Qualität) + + + + Bilinear + Bilinear-Filter + + + + Lanczos (better quality) + Lanczos (bessere Qualität) + + + + Page Flow + Seitenfluss + + + + Image adjustment + Bildanpassung + + + + + Restart is needed + Neustart erforderlich + + + + Comics directory + Comics-Verzeichnis + + + + PropertiesDialog + + + General info + Allgemeine Info + + + + Plot + Inhalt + + + + Authors + Autoren + + + + Publishing + Veröffentlichung + + + + Notes + Notizen + + + + Cover page + Titelbild + + + + Load previous page as cover + Vorherige Seite als Cover laden + + + + Load next page as cover + Nächste Seite als Cover laden + + + + Reset cover to the default image + Cover auf das Standardbild zurücksetzen + + + + Load custom cover image + Laden Sie ein benutzerdefiniertes Titelbild + + + + Series: + Serie: + + + + Title: + Titel: + + + + + + of: + von + + + + Issue number: + Ausgabennummer: + + + + Volume: + Band: + + + + Arc number: + Handlungsbogen Nummer: + + + + Story arc: + Handlung: + + + + alt. number: + alt. Nummer: + + + + Alternate series: + Alternative Serie: + + + + Series Group: + Seriengruppe: + + + + Genre: + Gattung: + + + + Size: + Größe: + + + + Writer(s): + Autor(en): + + + + Penciller(s): + Künstler(Bleistift): + + + + Inker(s): + Künstler(Tinte): + + + + Colorist(s): + Künstler(Farbe): + + + + Letterer(s): + Künstler(Schrift): + + + + Cover Artist(s): + Titelbild-Künstler: + + + + Editor(s): + Herausgeber(n): + + + + Imprint: + Impressum: + + + + Day: + Tag: + + + + Month: + Monat: + + + + Year: + Jahr: + + + + Publisher: + Verlag: + + + + Format: + Formatangabe: + + + + Color/BW: + Farbe/Schwarz-Weiß: + + + + Age rating: + Altersangabe: + + + + Type: + Typ: + + + + Language (ISO): + Sprache (ISO): + + + + Synopsis: + Zusammenfassung: + + + + Characters: + Charaktere: + + + + Teams: + Mannschaften: + + + + Locations: + Standorte: + + + + Main character or team: + Hauptfigur oder Team: + + + + Review: + Rezension: + + + + Notes: + Anmerkungen: + + + + Tags: + Schlagworte: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine-Link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ansehen </a> + + + + Not found + Nicht gefunden + + + + Comic not found. You should update your library. + Comic nicht gefunden. Sie sollten Ihre Bibliothek updaten. + + + + Edit comic information + Comic-Informationen bearbeiten + + + + Edit selected comics information + Ausgewählte Comic-Informationen bearbeiten + + + + Invalid cover + Ungültiger Versicherungsschutz + + + + The image is invalid. + Das Bild ist ungültig. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer ist die Headless-Version (keine GUI) von YACReaderLibrary. + +Diese Anwendung unterstützt dauerhafte Einstellungen. Um sie einzurichten, bearbeiten Sie diese Datei %1 +Um mehr über die verfügbaren Einstellungen zu erfahren, lesen Sie bitte die Dokumentation unter https://raw.githubusercontent.com/YACReader/yareader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + Verfolgen + + + + Debug + Fehlersuche + + + + Info + Information + + + + Warning + Warnung + + + + Error + Fehler + + + + Fatal + Tödlich + + + + Select custom cover + Wählen Sie ein benutzerdefiniertes Cover + + + + Images (%1) + Bilder (%1) + + + + 7z lib not found + 7z-Verzeichnis nicht gefunden + + + + unable to load 7z lib from ./utils + 7z -erzeichnis kann von ./utils nicht geladen werden + + + + The file could not be read or is not valid JSON. + Die Datei konnte nicht gelesen werden oder ist kein gültiges JSON. + + + + This theme is for %1, not %2. + Dieses Thema ist für %1, nicht für %2. + + + + Libraries + Bibliotheken + + + + Folders + Ordner + + + + Reading Lists + Leselisten + + + + RenameLibraryDialog + + + New Library Name : + Neuer Bibliotheksname : + + + + Rename + Umbenennen + + + + Cancel + Abbrechen + + + + Rename current library + Aktuelle Bibliothek umbenennen + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Anzahl der gefundenen Bände: %1 + + + + + page %1 of %2 + Seite %1 von %2 + + + + Number of %1 found : %2 + Anzahl von %1 gefunden : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Bitte stellen Sie weitere Informationen zur Verfügung. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Verwenden Sie die Suche nach exakten Übereinstimmungen. Deaktivieren Sie diese Option, wenn Sie Bände finden möchten, die mit einigen Wörtern im Namen übereinstimmen. + + + + SearchVolume + + + Please provide some additional information. + Bitte stellen Sie weitere Informationen zur Verfügung. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Verwenden Sie die Suche nach exakten Übereinstimmungen. Deaktivieren Sie diese Option, wenn Sie Bände finden möchten, die mit einigen Wörtern im Namen übereinstimmen. + + + + SelectComic + + + Please, select the right comic info. + Bitte wählen Sie die korrekte Comic-Information aus. + + + + comics + Comics + + + + loading cover + Titelbild wird geladen + + + + loading description + Beschreibung wird laden + + + + comic description unavailable + Comic-Beschreibung nicht verfügbar + + + + SelectVolume + + + Please, select the right series for your comic. + Bitte wählen Sie die korrekte Serie für Ihre Comics aus. + + + + Filter: + Filteroption: + + + + volumes + Bände + + + + Nothing found, clear the filter if any. + Nichts gefunden. Löschen Sie ggf. den Filter. + + + + loading cover + Titelbild wird geladen + + + + loading description + Beschreibung wird laden + + + + volume description unavailable + Bandbeschreibung nicht verfügbar + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Sie versuchen, Informationen zu mehreren Comics gleichzeitig zu laden, sind diese Teil einer Serie? + + + + yes + Ja + + + + no + Nein + + + + ServerConfigDialog + + + set port + Anschluss wählen + + + + Server connectivity information + Serveranschluss-Information + + + + Scan it! + Durchsuchen! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader ist für iOS- und Android-Geräte verfügbar.<br/>Entdecken Sie es für <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> oder <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + IP-Adresse auswählen + + + + Port + Anschluss + + + + enable the server + Server aktivieren + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Sortieren Sie bitte die Comic-Informationen links, bis die Informationen mit den Comics übereinstimmen. + + + + sort comics to match comic information + Comics laut Comic-Information sortieren + + + + issues + Ausgaben + + + + remove selected comics + Ausgewählte Comics entfernen + + + + restore all removed comics + Alle entfernten Comics wiederherstellen + + + + ThemeEditorDialog + + + Theme Editor + Theme-Editor + + + + + + + + + + + - + - + + + + i + ich + + + + Expand all + Alles erweitern + + + + Collapse all + Alles einklappen + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Halten Sie gedrückt, um den ausgewählten Wert in der Benutzeroberfläche zu blinken (Magenta / umgeschaltet / 0↔10). Loslassen stellt das Original wieder her. + + + + Search… + Suchen… + + + + Light + Licht + + + + Dark + Dunkel + + + + ID: + AUSWEIS: + + + + Display name: + Anzeigename: + + + + Variant: + Variante: + + + + Theme info + Themeninfo + + + + Parameter + Parameterwert + + + + Value + Wert + + + + Save and apply + Speichern und anwenden + + + + Export to file... + In Datei exportieren... + + + + Load from file... + Aus Datei laden... + + + + Close + Schliessen + + + + Double-click to edit color + Doppelklicken Sie, um die Farbe zu bearbeiten + + + + + + + + + true + WAHR + + + + + + + false + FALSCH + + + + Double-click to toggle + Zum Umschalten doppelklicken + + + + Double-click to edit value + Doppelklicken Sie, um den Wert zu bearbeiten + + + + + + Edit: %1 + Bearbeiten: %1 + + + + Save theme + Thema speichern + + + + + JSON files (*.json);;All files (*) + JSON-Dateien (*.json);;Alle Dateien (*) + + + + Save failed + Speichern fehlgeschlagen + + + + Could not open file for writing: +%1 + Die Datei konnte nicht zum Schreiben geöffnet werden: +%1 + + + + Load theme + Theme laden + + + + + + Load failed + Das Laden ist fehlgeschlagen + + + + Could not open file: +%1 + Datei konnte nicht geöffnet werden: +%1 + + + + Invalid JSON: +%1 + Ungültiger JSON: +%1 + + + + Expected a JSON object. + Es wurde ein JSON-Objekt erwartet. + + + + TitleHeader + + + SEARCH + Suchen + + + + UpdateLibraryDialog + + + Updating.... + Aktualisierung.... + + + + Cancel + Abbrechen + + + + Update library + Bibliothek updaten + + + + Viewer + + + + Press 'O' to open comic. + 'O' drücken, um Comic zu öffnen. + + + + Not found + Nicht gefunden + + + + Comic not found + Comic nicht gefunden + + + + Error opening comic + Fehler beim Öffnen des Comics + + + + CRC Error + CRC Fehler + + + + Loading...please wait! + Ladevorgang... Bitte warten! + + + + Page not available! + Seite nicht verfügbar! + + + + Cover! + Titelseite! + + + + Last page! + Letzte Seite! + + + + VolumeComicsModel + + + title + Titel + + + + VolumesModel + + + year + Jahr + + + + issues + Ausgaben + + + + publisher + Herausgeber + + + + YACReader3DFlowConfigWidget + + + Presets: + Voreinstellungen: + + + + Classic look + Klassische Ansicht + + + + Stripe look + Streifen-Ansicht + + + + Overlapped Stripe look + Überlappende Streifen-Ansicht + + + + Modern look + Moderne Ansicht + + + + Roulette look + Zufalls-Ansicht + + + + Show advanced settings + Zeige erweiterte Einstellungen + + + + Custom: + Benutzerdefiniert: + + + + View angle + Anzeige-Winkel + + + + Position + Lage + + + + Cover gap + Titelbild-Abstand + + + + Central gap + Mittiger Abstand + + + + Zoom + Vergrößern + + + + Y offset + Y-Anpassung + + + + Z offset + Z-Anpassung + + + + Cover Angle + Titelbild Ansichtswinkel + + + + Visibility + Sichtbarkeit + + + + Light + Licht + + + + Max angle + Maximaler Winkel + + + + Low Performance + Niedrige Leistung + + + + High Performance + Hohe Leistung + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Benutze VSync (verbessert die Bildqualität im Vollanzeigemodus, schlechtere Leistung) + + + + Performance: + Leistung: + + + + YACReader::MainWindowViewer + + + &Open + &Öffnen + + + + Open a comic + Comic öffnen + + + + New instance + Neuer Fall + + + + Open Folder + Ordner öffnen + + + + Open image folder + Bilder-Ordner öffnen + + + + Open latest comic + Neuesten Comic öffnen + + + + Open the latest comic opened in the previous reading session + Öffne den neuesten Comic deiner letzten Sitzung + + + + Clear + Löschen + + + + Clear open recent list + Lösche Liste zuletzt geöffneter Elemente + + + + Save + Speichern + + + + + Save current page + Aktuelle Seite speichern + + + + Previous Comic + Voheriger Comic + + + + + + Open previous comic + Vorherigen Comic öffnen + + + + Next Comic + Nächster Comic + + + + + + Open next comic + Nächsten Comic öffnen + + + + &Previous + &Vorherige + + + + + + Go to previous page + Zur vorherigen Seite gehen + + + + &Next + &Nächstes + + + + + + Go to next page + Zur nächsten Seite gehen + + + + Fit Height + Höhe anpassen + + + + Fit image to height + Bild an Höhe anpassen + + + + Fit Width + Breite anpassen + + + + Fit image to width + Bildbreite anpassen + + + + Show full size + Vollansicht anzeigen + + + + Fit to page + An Seite anpassen + + + + Continuous scroll + Kontinuierliches Scrollen + + + + Switch to continuous scroll mode + Wechseln Sie in den kontinuierlichen Bildlaufmodus + + + + Reset zoom + Zoom zurücksetzen + + + + Show zoom slider + Zoomleiste anzeigen + + + + Zoom+ + Vergr??ern+ + + + + Zoom- + Verkleinern- + + + + Rotate image to the left + Bild nach links drehen + + + + Rotate image to the right + Bild nach rechts drehen + + + + Double page mode + Doppelseiten-Modus + + + + Switch to double page mode + Zum Doppelseiten-Modus wechseln + + + + Double page manga mode + Doppelseiten-Manga-Modus + + + + Reverse reading order in double page mode + Umgekehrte Lesereihenfolge im Doppelseiten-Modus + + + + Go To + Gehe zu + + + + Go to page ... + Gehe zu Seite ... + + + + Options + Optionen + + + + YACReader options + YACReader Optionen + + + + + Help + Hilfe + + + + Help, About YACReader + Hilfe, über YACReader + + + + Magnifying glass + Vergößerungsglas + + + + Switch Magnifying glass + Vergrößerungsglas wechseln + + + + Set bookmark + Lesezeichen setzen + + + + Set a bookmark on the current page + Lesezeichen auf dieser Seite setzen + + + + Show bookmarks + Lesezeichen anzeigen + + + + Show the bookmarks of the current comic + Lesezeichen für diesen Comic anzeigen + + + + Show keyboard shortcuts + Tastenkürzel anzeigen + + + + Show Info + Info anzeigen + + + + Close + Schliessen + + + + Show Dictionary + Wörterbuch anzeigen + + + + Show go to flow + "Gehe zu Comic Flow" anzeigen + + + + Edit shortcuts + Kürzel ändern + + + + &File + &Datei + + + + + Open recent + Kürzlich geöffnet + + + + File + Datei + + + + Edit + Ändern + + + + View + Anzeigen + + + + Go + Los + + + + Window + Fenster + + + + + + Open Comic + Comic öffnen + + + + + + Comic files + Comic-Dateien + + + + Open folder + Ordner öffnen + + + + page_%1.jpg + Seite_%1.jpg + + + + Image files (*.jpg) + Bildateien (*.jpg) + + + + + Comics + Comichefte + + + + + General + Allgemein + + + + + Magnifiying glass + Vergrößerungsglas + + + + + Page adjustement + Seitenanpassung + + + + + Reading + Lesend + + + + Toggle fullscreen mode + Vollbild-Modus umschalten + + + + Hide/show toolbar + Symbolleiste anzeigen/verstecken + + + + Size up magnifying glass + Vergrößerungsglas vergrößern + + + + Size down magnifying glass + Vergrößerungsglas verkleinern + + + + Zoom in magnifying glass + Vergrößerungsglas reinzoomen + + + + Zoom out magnifying glass + Vergrößerungsglas rauszoomen + + + + Reset magnifying glass + Lupe zurücksetzen + + + + Toggle between fit to width and fit to height + Zwischen Anpassung an Seite und Höhe wechseln + + + + Autoscroll down + Automatisches Runterscrollen + + + + Autoscroll up + Automatisches Raufscrollen + + + + Autoscroll forward, horizontal first + Automatisches Vorwärtsscrollen, horizontal zuerst + + + + Autoscroll backward, horizontal first + Automatisches Zurückscrollen, horizontal zuerst + + + + Autoscroll forward, vertical first + Automatisches Vorwärtsscrollen, vertikal zuerst + + + + Autoscroll backward, vertical first + Automatisches Zurückscrollen, vertikal zuerst + + + + Move down + Nach unten + + + + Move up + Nach oben + + + + Move left + Nach links + + + + Move right + Nach rechts + + + + Go to the first page + Zur ersten Seite gehen + + + + Go to the last page + Zur letzten Seite gehen + + + + Offset double page to the left + Doppelseite nach links versetzt + + + + Offset double page to the right + Doppelseite nach rechts versetzt + + + + There is a new version available + Neue Version verfügbar + + + + Do you want to download the new version? + Möchten Sie die neue Version herunterladen? + + + + Remind me in 14 days + In 14 Tagen erneut erinnern + + + + Not now + Nicht jetzt + + + + YACReader::TrayIconController + + + &Restore + &Wiederherstellen + + + + Systray + Taskleiste + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary wird im Hintergrund weiterlaufen. Um das Programm zu schließen, wählen Sie <b>Schließen</b> im Kontextmenü des Taskleisten-Symbols. + + + + YACReaderFieldEdit + + + + Click to overwrite + Anklicken, um zu überschreiben + + + + Restore to default + Ursprungszustand wiederherstellen + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Anklicken, um zu überschreiben + + + + Restore to default + Ursprungszustand wiederherstellen + + + + YACReaderOptionsDialog + + + Save + Speichern + + + + Cancel + Abbrechen + + + + Edit shortcuts + Kürzel ändern + + + + Shortcuts + Kürzel + + + + YACReaderSearchLineEdit + + + type to search + tippen, um zu suchen + + + + YACReaderSlider + + + Reset + Zurücksetzen - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + YACReader Übersetzer - - &Resume - + + + Translation + Übersetzung - - Save log - + + clear + Löschen - - Log file (*.log) - + + Service not available + Service nicht verfügbar diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_es.ts b/YACReaderLibraryServer/yacreaderlibraryserver_es.ts index 747d30579..b7b49cab0 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_es.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_es.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Ninguno + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Nombre de la etiqueta: - - 7z not found - + + Choose a color: + Elige un color: - - Format not supported - + + accept + aceptar + + + + cancel + Cancelar - LogWindow + AddLibraryDialog + + + Comics folder : + Carpeta de cómics : + + + + Library name : + Nombre de la biblioteca : + - - Log window - + + Add + Añadir - - &Pause - + + Cancel + Cancelar - - &Save - + + Add an existing library + Añadir una biblioteca existente + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Antes de que te puedas conectar a Comic Vine necesitas tu propia clave API. Por favor, obtén una gratis <a href="http://www.comicvine.com/api/">aquí</a> - - &Copy - + + Paste here your Comic Vine API key + Pega aquí tu clave API de Comic Vine - - Level: - + + Accept + Aceptar - - &Auto scroll - + + Cancel + Cancelar - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Esquema de color + + + + System + Sistema + + + + Light + Luz + + + + Dark + Oscuro + + + + Custom + Personalizado + + + + Remove + Eliminar + + + + Remove this user-imported theme + Eliminar este tema importado por el usuario + + + + Light: + Claro: + + + + Dark: + Oscuro: + + + + Custom: + Personalizado: + + + + Import theme... + Importar tema... + + + + Theme + Tema + + + + Theme editor + Editor de temas + + + + Open Theme Editor... + Abrir editor de temas... + + + + Theme editor error + Error del editor de temas + + + + The current theme JSON could not be loaded. + No se ha podido cargar el JSON del tema actual. + + + + Import theme + Importar tema + + + + JSON files (*.json);;All files (*) + Archivos JSON (*.json);;Todos los archivos (*) + + + + Could not import theme from: +%1 + No se pudo importar el tema desde: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + No se pudo importar el tema desde: +%1 + +%2 + + + + Import failed + Error al importar - QObject + BookmarksDialog - - Trace - + + Lastest Page + Última página - - Debug - + + Close + Cerrar - - Info - + + Click on any image to go to the bookmark + Pulsa en cualquier imagen para ir al marcador - - Warning - + + + Loading... + Cargando... + + + ClassicComicsView - - Error - + + Hide comic flow + Ocultar Comic Flow + + + + ComicModel + + + yes + - - Fatal - + + no + No + + + + Title + Título + + + + File Name + Nombre de archivo + + + + Pages + Páginas + + + + Size + Tamaño + + + + Read + Leído + + + + Current Page + Página Actual + + + + Publication Date + Fecha de publicación + + + + Rating + Nota + + + + Series + Serie + + + + Volume + Volumen + + + + Story Arc + Arco argumental + + + + ComicVineDialog + + + skip + omitir + + + + back + atrás + + + + next + siguiente + + + + search + buscar + + + + close + Cerrar + + + + + comic %1 of %2 - %3 + cómic %1 de %2 - %3 + + + + + + Looking for volume... + Buscando volumen... + + + + %1 comics selected + %1 cómics seleccionados + + + + Error connecting to ComicVine + Error conectando a ComicVine + + + + + Retrieving tags for : %1 + Recuperando etiquetas para : %1 + + + + Retrieving volume info... + Recuperando información del volumen... + + + + Looking for comic... + Buscando cómic... + + + + ContinuousPageWidget + + + Loading page %1 + Cargando página %1 + + + + CreateLibraryDialog + + + Comics folder : + Carpeta de cómics : + + + + Library Name : + Nombre de la biblioteca : + + + + Create + Crear + + + + Cancel + Cancelar + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Crear una biblioteca puede llevar varios minutos. Puedes parar el proceso en cualquier momento y completar la tarea más tarde. + + + + Create new library + Crear la nueva biblioteca + + + + Path not found + Ruta no encontrada + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + La ruta seleccionada no existe o no es válida. Asegúrate de que tienes privilegios de escritura en esta carpeta + + + + EditShortcutsDialog + + + Restore defaults + Restaurar los valores predeterminados + + + + To change a shortcut, double click in the key combination and type the new keys. + Para cambiar un atajo, haz doble clic en la combinación de teclas y escribe las nuevas teclas. + + + + Shortcuts settings + Configuración de accesos directos + + + + Shortcut in use + Accesos directos en uso + + + + The shortcut "%1" is already assigned to other function + El acceso directo "%1" ya está asignado a otra función + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Esta carpeta aún no contiene cómics + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Esta etiqueta aún no contiene ningún cómic + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Esta lista de tectura aún no contiene ningún cómic + + + + EmptySpecialListWidget + + + No favorites + Ningún favorito + + + + You are not reading anything yet, come on!! + No estás leyendo nada aún, ¡vamos! + + + + There are no recent comics! + ¡No hay comics recientes! + + + + ExportComicsInfoDialog + + + Output file : + Archivo de salida : + + + + Create + Crear + + + + Cancel + Cancelar + + + + Export comics info + Exportar información de los cómics + + + + Destination database name + Nombre de la base de datos de destino + + + + Problem found while writing + Problema encontrado mientras se escribía + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + La ruta seleccionada para el archivo de salida no existe o no es una ruta válida. Asegúrate de que tienes permisos de escritura en esta carpeta + + + + ExportLibraryDialog + + + Output folder : + Carpeta de destino : + + + + Create + Crear + + + + Cancel + Cancelar + + + + Create covers package + Crear paquete de portadas + + + + Problem found while writing + Problema encontrado mientras se escribía + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + La ruta seleccionada para el archivo de salida no existe o no es una ruta válida. Asegúrate de que tienes permisos de escritura en esta carpeta + + + + Destination directory + Carpeta de destino + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + Error CRC en la página (%1): algunas de las páginas no se mostrarán correctamente + + + + Unknown error opening the file + Error desconocido abriendo el archivo + + + + 7z not found + 7z no encontrado + + + + Format not supported + Formato no soportado + + + + GoToDialog + + + Page : + Página : + + + + Go To + Ir a + + + + Cancel + Cancelar + + + + + Total pages : + Páginas totales : + + + + Go to... + Ir a... + + + + GoToFlowToolBar + + + Page : + Página : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Mostrar información + + + HelpAboutDialog - - Level - + + About + Acerca de - - Message - + + Help + Ayuda + + + + System info + Información de sistema + + + + ImportComicsInfoDialog + + + Import comics info + Importar información de cómics + + + + Info database location : + Ubicación de la base de datos de información : + + + + Import + Importar + + + + Cancel + Cancelar + + + + Comics info file (*.ydb) + Archivo de información de cómics (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nombre de la biblioteca : + + + + Package location : + Ubicación del paquete : + + + + Destination folder : + Directorio de destino : + + + + Unpack + Desempaquetar + + + + Cancel + Cancelar + + + + Extract a catalog + Extraer un catálogo + + + + Compresed library covers (*.clc) + Portadas de biblioteca comprimidas (*.clc) + + + + ImportWidget + + + stop + parar + + + + Some of the comics being added... + Algunos de los cómics que estan siendo añadidos.... + + + + Importing comics + Importando cómics + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary está creando una nueva biblioteca.</p><p>Crear una biblioteca puede llevar varios minutos. Puedes parar el proceso en cualquier momento y actualizar la biblioteca más tarde para completar el proceso.</p> + + + + Updating the library + Actualizando la biblioteca + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>La biblioteca actual está siendo actualizada. Para actualizaciones más rápidas, por favor, actualiza tus bibliotecas frecuentemente.</p><p>Puedes parar el proceso y continunar la actualización más tarde.</p> + + + + Upgrading the library + Actualizando la biblioteca + + + + <p>The current library is being upgraded, please wait.</p> + <p>La biblioteca actual está siendo actualizadad, espera por favor.</p> + + + + Scanning the library + Escaneando la biblioteca + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>La biblioteca está siendo escaneada para encontrar metadatos en formato XML.</p><p>Sólo necesitas hacer esto una vez, y sólo si la biblioteca fue creada con YACReaderLibrary 9.8.2 o antes.</p> + + + + LibraryWindow + + + YACReader Library + Biblioteca YACReader + + + + + + comic + Cómic + + + + + + manga + historieta manga + + + + + + western manga (left to right) + manga occidental (izquierda a derecha) + + + + + + web comic + cómic web + + + + + + 4koma (top to botom) + 4koma (de arriba a abajo) + + + + + + + Set type + Establecer tipo + + + + Library + Librería + + + + Folder + Carpeta + + + + Comic + Cómic + + + + Upgrade failed + La actualización falló + + + + There were errors during library upgrade in: + Hubo errores durante la actualización de la biblioteca en: + + + + Update needed + Se necesita actualizar + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Esta biblioteca fue creada con una versión anterior de YACReaderLibrary. Es necesario que se actualice. ¿Deseas hacerlo ahora? + + + + Download new version + Descargar la nueva versión + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Esta biblioteca fue creada con una versión más nueva de YACReaderLibrary. ¿Deseas descargar la nueva versión ahora? + + + + Library not available + Biblioteca no disponible + + + + Library '%1' is no longer available. Do you want to remove it? + La biblioteca '%1' no está disponible. ¿Deseas eliminarla? + + + + Old library + Biblioteca antigua + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La biblioteca '%1' ha sido creada con una versión más antigua de YACReaderLibrary y debe ser creada de nuevo. ¿Deseas crear la biblioteca ahora? + + + + + Copying comics... + Copiando cómics... + + + + + Moving comics... + Moviendo cómics... + + + + Add new folder + Añadir carpeta + + + + Folder name: + Nombre de la carpeta: + + + + No folder selected + No has selecionado ninguna carpeta + + + + Please, select a folder first + Por favor, selecciona una carpeta primero + + + + Error in path + Error en la ruta + + + + There was an error accessing the folder's path + Hubo un error al acceder a la ruta de la carpeta + + + + Delete folder + Borrar carpeta + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + ¿Estás seguro de que deseas eliminar la carpeta seleccionada y todo su contenido de tu disco? + + + + + Unable to delete + No se ha podido borrar + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Se produjo un problema al intentar eliminar las carpetas seleccionadas. Por favor, verifica los permisos de escritura y asegúrate de que no haya aplicaciones usando estas carpetas o alguno de los archivos contenidos en ellas. + + + + Add new reading lists + Añadir nuevas listas de lectura + + + + + List name: + Nombre de la lista: + + + + Delete list/label + Eliminar lista/etiqueta + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + El elemento seleccionado se eliminará, tus cómics o carpetas NO se eliminarán de tu disco. ¿Estás seguro? + + + + Rename list name + Renombrar lista + + + + Open folder... + Abrir carpeta... + + + + Update folder + Actualizar carpeta + + + + Rescan library for XML info + Volver a escanear la biblioteca en busca de información XML + + + + Set as uncompleted + Marcar como incompleto + + + + Set as completed + Marcar como completo + + + + Set as read + Marcar como leído + + + + + Set as unread + Marcar como no leído + + + + Set custom cover + Establecer portada personalizada + + + + Delete custom cover + Eliminar portada personalizada + + + + Save covers + Guardar portadas + + + + You are adding too many libraries. + Estás añadiendo demasiadas bibliotecas. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Estás añadiendo demasiadas bibliotecas. + +Probablemente solo necesites una biblioteca en la carpeta principal de tus cómics, puedes explorar cualquier subcarpeta utilizando la sección de carpetas en la barra lateral izquierda. + +YACReaderLibrary no te detendrá de crear más bibliotecas, pero deberías mantener el número de bibliotecas bajo control. + + + + + YACReader not found + YACReader no encontrado + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader no encontrado. YACReader debería estar instalado en la misma carpeta que YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader no encontrado. Podría haber un problema con tu instalación de YACReader. + + + + Error + Fallo + + + + Error opening comic with third party reader. + Error al abrir el cómic con una aplicación de terceros. + + + + Library not found + Biblioteca no encontrada + + + + The selected folder doesn't contain any library. + La carpeta seleccionada no contiene ninguna biblioteca. + + + + Are you sure? + ¿Estás seguro? + + + + Do you want remove + ¿Deseas eliminar la biblioteca + + + + library? + ? + + + + Remove and delete metadata + Eliminar y borrar metadatos + + + + Library info + Información de la biblioteca + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Ha habido algún problema intentando borrar los cómics selecionados. Por favor, verifica los permisos de escritura en los arhicovs seleccionados o los directorios que los conienen. + + + + Assign comics numbers + Asignar números a los cómics + + + + Assign numbers starting in: + Asignar números comenzando en: + + + + Invalid image + Imagen inválida + + + + The selected file is not a valid image. + El archivo seleccionado no es una imagen válida. + + + + Error saving cover + Error guardando portada + + + + There was an error saving the cover image. + Hubo un error guardando la image de portada. + + + + Error creating the library + Errar creando la biblioteca + + + + Error updating the library + Error actualizando la biblioteca + + + + Error opening the library + Error abriendo la biblioteca + + + + Delete comics + Borrar cómics + + + + All the selected comics will be deleted from your disk. Are you sure? + Todos los cómics seleccionados serán borrados de tu disco. ¿Estás seguro? + + + + Remove comics + Eliminar cómics + + + + Comics will only be deleted from the current label/list. Are you sure? + Los cómics sólo se eliminarán de la etiqueta/lista actual. ¿Estás seguro? + + + + Library name already exists + Ya existe el nombre de la biblioteca + + + + There is another library with the name '%1'. + Hay otra biblioteca con el nombre '%1'. + + + + LibraryWindowActions + + + Create a new library + Crear una nueva biblioteca + + + + Open an existing library + Abrir una biblioteca existente + + + + + Export comics info + Exportar información de los cómics + + + + + Import comics info + Importar información de cómics + + + + Pack covers + Empaquetar portadas + + + + Pack the covers of the selected library + Empaquetar las portadas de la biblioteca seleccionada + + + + Unpack covers + Desempaquetar portadas + + + + Unpack a catalog + Desempaquetar un catálogo + + + + Update library + Actualizar biblioteca + + + + Update current library + Actualizar la biblioteca seleccionada + + + + Rename library + Renombrar biblioteca + + + + Rename current library + Renombrar la biblioteca seleccionada + + + + Remove library + Eliminar biblioteca + + + + Remove current library from your collection + Eliminar biblioteca de la colección + + + + Rescan library for XML info + Volver a escanear la biblioteca en busca de información XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Intenta encontrar información XML incrustada en los archivos de cómic. Solo necesitas hacer esto si la biblioteca fue creada con la versión 9.8.2 o versiones anteriores o si estás utilizando software de terceros para incrustar información XML en los archivos. + + + + Show library info + Mostrar información de la biblioteca + + + + Show information about the current library + Mostrar información de la biblioteca actual + + + + Open current comic + Abrir cómic actual + + + + Open current comic on YACReader + Abrir el cómic actual en YACReader + + + + Save selected covers to... + Guardar las portadas seleccionadas en... + + + + Save covers of the selected comics as JPG files + Guardar las portadas de los cómics seleccionados como archivos JPG + + + + + Set as read + Marcar como leído + + + + Set comic as read + Marcar cómic como leído + + + + + Set as unread + Marcar como no leído + + + + Set comic as unread + Marcar cómic como no leído + + + + + manga + historieta manga + + + + Set issue as manga + Marcar número como manga + + + + + comic + Cómic + + + + Set issue as normal + Marcar número como cómic + + + + western manga + manga occidental + + + + Set issue as western manga + Marcar número como manga occidental + + + + + web comic + cómic web + + + + Set issue as web comic + Marcar número como cómic web + + + + + yonkoma + tira yonkoma + + + + Set issue as yonkoma + Marcar número como yonkoma + + + + Show/Hide marks + Mostrar/Ocultar marcas + + + + Show or hide read marks + Mostrar u ocultar marcas + + + + Show/Hide recent indicator + Mostrar/Ocultar el indicador reciente + + + + Show or hide recent indicator + Mostrar o ocultar el indicador reciente + + + + + Fullscreen mode on/off + Modo a pantalla completa on/off + + + + Help, About YACReader + Ayuda, Sobre YACReader + + + + Add new folder + Añadir carpeta + + + + Add new folder to the current library + Añadir carpeta a la biblioteca actual + + + + Delete folder + Borrar carpeta + + + + Delete current folder from disk + Borrar carpeta actual del disco + + + + Select root node + Seleccionar el nodo raíz + + + + Expand all nodes + Expandir todos los nodos + + + + Collapse all nodes + Contraer todos los nodos + + + + Show options dialog + Mostrar opciones + + + + Show comics server options dialog + Mostrar el diálogo de opciones del servidor de cómics + + + + + Change between comics views + Cambiar entre vistas de cómics + + + + Open folder... + Abrir carpeta... + + + + Set as uncompleted + Marcar como incompleto + + + + Set as completed + Marcar como completo + + + + Set custom cover + Establecer portada personalizada + + + + Delete custom cover + Eliminar portada personalizada + + + + western manga (left to right) + manga occidental (izquierda a derecha) + + + + Open containing folder... + Abrir carpeta contenedora... + + + + Reset comic rating + Reseteal cómic rating + + + + Select all comics + Seleccionar todos los cómics + + + + Edit + Editar + + + + Assign current order to comics + Asignar el orden actual a los cómics + + + + Update cover + Actualizar portada + + + + Delete selected comics + Borrar los cómics seleccionados + + + + Delete metadata from selected comics + Borrar metadatos de los cómics seleccionados + + + + Download tags from Comic Vine + Descargar etiquetas de Comic Vine + + + + Focus search line + Selecionar el campo de búsqueda + + + + Focus comics view + Selecionar la vista de cómics + + + + Edit shortcuts + Editar accesos directos + + + + &Quit + &Salir + + + + Update folder + Actualizar carpeta + + + + Update current folder + Actualizar carpeta actual + + + + Scan legacy XML metadata + Escaneal metadatos XML + + + + Add new reading list + Añadir lista de lectura + + + + Add a new reading list to the current library + Añadir una nueva lista de lectura a la biblioteca actual + + + + Remove reading list + Eliminar lista de lectura + + + + Remove current reading list from the library + Eliminar la lista de lectura actual de la biblioteca + + + + Add new label + Añadir etiqueta + + + + Add a new label to this library + Añadir etiqueta a esta biblioteca + + + + Rename selected list + Renombrar la lista seleccionada + + + + Rename any selected labels or lists + Renombrar las etiquetas o listas seleccionadas + + + + Add to... + Añadir a... + + + + Favorites + Favoritos + + + + Add selected comics to favorites list + Añadir cómics seleccionados a la lista de favoritos + + + + LocalComicListModel + + + file name + Nombre de archivo + + + + NoLibrariesWidget + + + You don't have any libraries yet + Aún no tienes ninguna biblioteca + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Puedes crear una biblioteca en cualquier carpeta, YACReaderLibrary importará todos las carpetas y cómics de esa carpeta. Si has creado alguna biblioteca anteriormente, puedes abrirla sin volver a crearla.</p><p>No olvides que puedes usar YACReader como una aplicación independiente para leer los cómics en tu ordenador.</p> + + + + create your first library + crea tu primera biblioteca + + + + add an existing one + añade una existente + + + + NoSearchResultsWidget + + + No results + Sin resultados + + + + OptionsDialog + + + + General + Opciones generales + + + + + Libraries + Bibliotecas + + + + Comic Flow + Comic Flow + + + + Grid view + Vista en cuadrícula + + + + + Appearance + Apariencia + + + + + Options + Opciones + + + + + Language + Idioma + + + + + Application language + Idioma de la aplicación + + + + + System default + Predeterminado del sistema + + + + Tray icon settings (experimental) + Opciones de bandeja de sistema (experimental) + + + + Close to tray + Cerrar a la bandeja + + + + Start into the system tray + Comenzar en la bandeja de sistema + + + + Edit Comic Vine API key + Editar la clave API de Comic Vine + + + + Comic Vine API key + Clave API de Comic Vine + + + + ComicInfo.xml legacy support + Soporte para ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importar metadatos desde ComicInfo.xml al añadir nuevos cómics + + + + Consider 'recent' items added or updated since X days ago + Considerar elementos 'recientes' añadidos o actualizados desde hace X días + + + + Third party reader + Lector externo + + + + Write {comic_file_path} where the path should go in the command + Escribe {comic_file_path} donde la ruta al cómic debería ir en el comando + + + + + Clear + Limpiar + + + + Update libraries at startup + Actualizar bibliotecas al inicio + + + + Try to detect changes automatically + Intentar detectar cambios automáticamente + + + + Update libraries periodically + Actualizar bibliotecas periódicamente + + + + Interval: + Intervalo: + + + + 30 minutes + 30 minutos + + + + 1 hour + 1 hora + + + + 2 hours + 2 horas + + + + 4 hours + 4 horas + + + + 8 hours + 8 horas + + + + 12 hours + 12 horas + + + + daily + dirariamente + + + + Update libraries at certain time + Actualizar bibliotecas en un momento determinado + + + + Time: + Hora: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + ¡ADVERTENCIA! Durante las actualizaciones de la biblioteca se desactivan las escrituras en la base de datos. +No programes actualizaciones mientras puedas estar usando la aplicación activamente. +Durante las actualizaciones automáticas, la aplicación bloqueará algunas de las acciones hasta que la actualización esté terminada. +Para detener una actualización automática, toca en el indicador de carga junto al título de Bibliotecas. + + + + Modifications detection + Detección de modificaciones + + + + Compare the modified date of files when updating a library (not recommended) + Comparar la fecha de modificación de los archivos al actualizar una biblioteca (no recomendado) + + + + Enable background image + Activar imagen de fondo + + + + Opacity level + Nivel de opacidad + + + + Blur level + Nivel de desenfoque + + + + Use selected comic cover as background + Usar la portada del cómic seleccionado como fondo + + + + Restore defautls + Restaurar valores predeterminados + + + + Background + Fondo + + + + Display continue reading banner + Mostrar banner de "Continuar leyendo" + + + + Display current comic banner + Mostar el báner del cómic actual + + + + Continue reading + Continuar leyendo + + + + My comics path + Ruta a mis cómics + + + + Display + Visualización + + + + Show time in current page information label + Mostrar la hora en la etiqueta de información de la página actual + + + + "Go to flow" size + Tamaño de "Ir a Comic Flow" + + + + Background color + Color de fondo + + + + Choose + Elegir + + + + Scroll behaviour + Comportamiento del scroll + + + + Disable scroll animations and smooth scrolling + Desactivar animaciones de desplazamiento y desplazamiento suave + + + + Do not turn page using scroll + No cambiar de página usando el scroll + + + + Use single scroll step to turn page + Usar un solo paso de desplazamiento para cambiar de página + + + + Mouse mode + Modo del ratón + + + + Only Back/Forward buttons can turn pages + Solo los botones Atrás/Adelante pueden cambiar de página + + + + Use the Left/Right buttons to turn pages. + Usar los botones Izquierda/Derecha para cambiar de página. + + + + Click left or right half of the screen to turn pages. + Hacer clic en la mitad izquierda o derecha de la pantalla para cambiar de página. + + + + Quick Navigation Mode + Modo de navegación rápida + + + + Disable mouse over activation + Desactivar activación al pasar el ratón + + + + Brightness + Brillo + + + + Contrast + Contraste + + + + Gamma + Gama + + + + Reset + Restablecer + + + + Image options + Opciones de imagen + + + + Fit options + Opciones de ajuste + + + + Enlarge images to fit width/height + Ampliar imágenes para ajustarse al ancho/alto + + + + Double Page options + Opciones de doble página + + + + Show covers as single page + Mostrar portadas como página única + + + + Scaling + Escalado + + + + Scaling method + Método de escalado + + + + Nearest (fast, low quality) + Vecino más cercano (rápido, baja calidad) + + + + Bilinear + Bilineal + + + + Lanczos (better quality) + Lanczos (mejor calidad) + + + + Page Flow + Flujo de página + + + + Image adjustment + Ajustes de imagen + + + + + Restart is needed + Es necesario reiniciar + + + + Comics directory + Directorio de cómics + + + + PropertiesDialog + + + General info + Información general + + + + Plot + Argumento + + + + Authors + Autores + + + + Publishing + Publicación + + + + Notes + Notas + + + + Cover page + Página de portada + + + + Load previous page as cover + Cargar página anterior como portada + + + + Load next page as cover + Cargar página siguiente como portada + + + + Reset cover to the default image + Restaurar la portada por defecto + + + + Load custom cover image + Cargar portada personalizada + + + + Series: + Serie: + + + + Title: + Título: + + + + + + of: + de: + + + + Issue number: + Número: + + + + Volume: + Volumen: + + + + Arc number: + Número de arco: + + + + Story arc: + Arco argumental: + + + + alt. number: + número alternativo: + + + + Alternate series: + Serie alternativa: + + + + Series Group: + Grupo de series: + + + + Genre: + Género: + + + + Size: + Tamaño: + + + + Writer(s): + Guionista(s): + + + + Penciller(s): + Dibujant(es): + + + + Inker(s): + Entintador(es): + + + + Colorist(s): + Color: + + + + Letterer(s): + Rotulista(s): + + + + Cover Artist(s): + Artista(s) portada: + + + + Editor(s): + Editor(es): + + + + Imprint: + Sello: + + + + Day: + Día: + + + + Month: + Mes: + + + + Year: + Año: + + + + Publisher: + Editorial: + + + + Format: + Formato: + + + + Color/BW: + Color/BN: + + + + Age rating: + Casificación edades: + + + + Type: + Tipo: + + + + Language (ISO): + Idioma (ISO): + + + + Synopsis: + Sinopsis: + + + + Characters: + Personajes: + + + + Teams: + Equipos: + + + + Locations: + Lugares: + + + + Main character or team: + Personaje o equipo principal: + + + + Review: + Reseña: + + + + Notes: + Notas: + + + + Tags: + Etiquetas: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> ver </a> + + + + Not found + No encontrado + + + + Comic not found. You should update your library. + Cómic no encontrado. Deberias actualizar tu biblioteca. + + + + Edit comic information + Editar la información del cócmic + + + + Edit selected comics information + Editar la información de los cómics seleccionados + + + + Invalid cover + Portada inválida + + + + The image is invalid. + La imagen no es válida. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer es la versión sin interfaz gráfica (headless) de YACReaderLibrary. + +Esta aplicación admite ajustes persistentes; para configurarlos, edita este archivo %1 +Para conocer los ajustes disponibles, consulta la documentación en https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + Traza + + + + Debug + Depuración + + + + Info + Información + + + + Warning + Advertencia + + + + Error + Fallo + + + + Fatal + Cr?tico + + + + Select custom cover + Seleccionar portada personalizada + + + + Images (%1) + Imágenes (%1) + + + + 7z lib not found + 7z lib no encontrado + + + + unable to load 7z lib from ./utils + imposible cargar 7z lib de ./utils + + + + The file could not be read or is not valid JSON. + No se pudo leer el archivo o no es un JSON válido. + + + + This theme is for %1, not %2. + Este tema es para %1, no para %2. + + + + Libraries + Bibliotecas + + + + Folders + CARPETAS + + + + Reading Lists + Listas de lectura + + + + RenameLibraryDialog + + + New Library Name : + Nuevo nombre de la biblioteca : + + + + Rename + Renombrar + + + + Cancel + Cancelar + + + + Rename current library + Renombrar la biblioteca seleccionada + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Número de volúmenes encontrados : %1 + + + + + page %1 of %2 + página %1 de %2 + + + + Number of %1 found : %2 + Número de %1 encontrados : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Por favor, proporciona alguna información adicional para éste cómic. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Usar búsqueda exacta. Desactívala si quieres encontrar volúmenes que coincidan con algunas palabras del nombre. + + + + SearchVolume + + + Please provide some additional information. + Por favor, proporciona alguna informacion adicional. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Usar búsqueda exacta. Desactívala si quieres encontrar volúmenes que coincidan con algunas palabras del nombre. + + + + SelectComic + + + Please, select the right comic info. + Por favor, selecciona la información correcta. + + + + comics + Cómics + + + + loading cover + cargando portada + + + + loading description + cargando descripción + + + + comic description unavailable + Descripción del cómic no disponible + + + + SelectVolume + + + Please, select the right series for your comic. + Por favor, seleciona la serie correcta para tu cómic. + + + + Filter: + Filtro: + + + + volumes + volúmenes + + + + Nothing found, clear the filter if any. + No se encontró nada, limpia el filtro si lo hubiera. + + + + loading cover + cargando portada + + + + loading description + cargando descripción + + + + volume description unavailable + Descripción del volumen no disponible + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Estás intentando obtener información de varios cómics a la vez, ¿son parte de la misma serie? + + + + yes + + + + + no + No + + + + ServerConfigDialog + + + set port + fijar puerto + + + + Server connectivity information + Infomación de conexión del servidor + + + + Scan it! + ¡Escaneálo! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader está disponible para iOS y Android.<br/> Descúbrela para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a>o <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Elige una dirección IP + + + + Port + Puerto + + + + enable the server + activar el servidor + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Por favor, ordena la lista de cómics en la izquiera hasta que coincida con la información adecuada. + + + + sort comics to match comic information + ordena los cómics para coincidir con la información + + + + issues + números + + + + remove selected comics + eliminar cómics seleccionados + + + + restore all removed comics + restaurar todos los cómics eliminados + + + + ThemeEditorDialog + + + Theme Editor + Editor de temas + + + + + + + + + + + - + - + + + + i + ? + + + + Expand all + Expandir todo + + + + Collapse all + Contraer todo + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Mantén pulsado para resaltar temporalmente el valor seleccionado en la interfaz (magenta / alternado / 0↔10). Al soltar se restaura el original. + + + + Search… + Buscar… + + + + Light + Luz + + + + Dark + Oscuro + + + + ID: + IDENTIFICACIÓN: + + + + Display name: + Nombre para mostrar: + + + + Variant: + Variante: + + + + Theme info + Información del tema + + + + Parameter + Parámetro + + + + Value + Valor + + + + Save and apply + Guardar y aplicar + + + + Export to file... + Exportar a archivo... + + + + Load from file... + Cargar desde archivo... + + + + Close + Cerrar + + + + Double-click to edit color + Doble clic para editar el color + + + + + + + + + true + verdadero + + + + + + + false + falso + + + + Double-click to toggle + Doble clic para alternar + + + + Double-click to edit value + Doble clic para editar el valor + + + + + + Edit: %1 + Editar: %1 + + + + Save theme + Guardar tema + + + + + JSON files (*.json);;All files (*) + Archivos JSON (*.json);;Todos los archivos (*) + + + + Save failed + Error al guardar + + + + Could not open file for writing: +%1 + No se pudo abrir el archivo para escribir: +%1 + + + + Load theme + Cargar tema + + + + + + Load failed + Error al cargar + + + + Could not open file: +%1 + No se pudo abrir el archivo: +%1 + + + + Invalid JSON: +%1 + JSON no válido: +%1 + + + + Expected a JSON object. + Se esperaba un objeto JSON. + + + + TitleHeader + + + SEARCH + buscar + + + + UpdateLibraryDialog + + + Updating.... + Actualizado... + + + + Cancel + Cancelar + + + + Update library + Actualizar biblioteca + + + + Viewer + + + + Press 'O' to open comic. + Pulsa 'O' para abrir un fichero. + + + + Not found + No encontrado + + + + Comic not found + Cómic no encontrado + + + + Error opening comic + Error abriendo cómic + + + + CRC Error + Error CRC + + + + Loading...please wait! + Cargando...espere, por favor! + + + + Page not available! + ¡Página no disponible! + + + + Cover! + ¡Portada! + + + + Last page! + ¡Última página! + + + + VolumeComicsModel + + + title + Título + + + + VolumesModel + + + year + año + + + + issues + números + + + + publisher + Editorial + + + + YACReader3DFlowConfigWidget + + + Presets: + Predefinidos: + + + + Classic look + Tipo clásico + + + + Stripe look + Tipo tira + + + + Overlapped Stripe look + Tipo tira solapada + + + + Modern look + Tipo moderno + + + + Roulette look + Tipo ruleta + + + + Show advanced settings + Opciones avanzadas + + + + Custom: + Personalizado: + + + + View angle + Ángulo de vista + + + + Position + Posición + + + + Cover gap + Hueco entre portadas + + + + Central gap + Hueco central + + + + Zoom + Ampliaci?n + + + + Y offset + Desplazamiento en Y + + + + Z offset + Desplazamiento en Z + + + + Cover Angle + Ángulo de las portadas + + + + Visibility + Visibilidad + + + + Light + Luz + + + + Max angle + Ángulo máximo + + + + Low Performance + Rendimiento bajo + + + + High Performance + Alto rendimiento + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Utilizar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + + + + Performance: + Rendimiento: + + + + YACReader::MainWindowViewer + + + &Open + &Abrir + + + + Open a comic + Abrir cómic + + + + New instance + Nueva instancia + + + + Open Folder + Abrir carpeta + + + + Open image folder + Abrir carpeta de imágenes + + + + Open latest comic + Abrir el cómic más reciente + + + + Open the latest comic opened in the previous reading session + Abrir el cómic más reciente abierto en la sesión de lectura anterior + + + + Clear + Limpiar + + + + Clear open recent list + Limpiar lista de abiertos recientemente + + + + Save + Guardar + + + + + Save current page + Guardar la página actual + + + + Previous Comic + Cómic anterior + + + + + + Open previous comic + Abrir cómic anterior + + + + Next Comic + Siguiente Cómic + + + + + + Open next comic + Abrir siguiente cómic + + + + &Previous + A&nterior + + + + + + Go to previous page + Ir a la página anterior + + + + &Next + Siguie&nte + + + + + + Go to next page + Ir a la página siguiente + + + + Fit Height + Ajustar altura + + + + Fit image to height + Ajustar página a lo alto + + + + Fit Width + Ajustar anchura + + + + Fit image to width + Ajustar página a lo ancho + + + + Show full size + Mostrar a tamaño original + + + + Fit to page + Ajustar a página + + + + Continuous scroll + Desplazamiento continuo + + + + Switch to continuous scroll mode + Cambiar al modo de desplazamiento continuo + + + + Reset zoom + Restablecer zoom + + + + Show zoom slider + Mostrar control deslizante de zoom + + + + Zoom+ + Ampliar+ + + + + Zoom- + Reducir + + + + Rotate image to the left + Rotar imagen a la izquierda + + + + Rotate image to the right + Rotar imagen a la derecha + + + + Double page mode + Modo a doble página + + + + Switch to double page mode + Cambiar a modo de doble página + + + + Double page manga mode + Modo de manga de página doble + + + + Reverse reading order in double page mode + Invertir el orden de lectura en modo de página doble + + + + Go To + Ir a + + + + Go to page ... + Ir a página... + + + + Options + Opciones + + + + YACReader options + Opciones de YACReader + + + + + Help + Ayuda + + + + Help, About YACReader + Ayuda, Sobre YACReader + + + + Magnifying glass + Lupa + + + + Switch Magnifying glass + Lupa On/Off + + + + Set bookmark + Añadir marcador + + + + Set a bookmark on the current page + Añadir un marcador en la página actual + + + + Show bookmarks + Mostrar marcadores + + + + Show the bookmarks of the current comic + Mostrar los marcadores del cómic actual + + + + Show keyboard shortcuts + Mostrar atajos de teclado + + + + Show Info + Mostrar información + + + + Close + Cerrar + + + + Show Dictionary + Mostrar diccionario + + + + Show go to flow + Mostrar "Ir a Comic Flow" + + + + Edit shortcuts + Editar accesos directos + + + + &File + &Archivo + + + + + Open recent + Abrir reciente + + + + File + Archivo + + + + Edit + Editar + + + + View + Ver + + + + Go + Ir + + + + Window + Ventana + + + + + + Open Comic + Abrir cómic + + + + + + Comic files + Archivos de cómic + + + + Open folder + Abrir carpeta + + + + page_%1.jpg + página_%1.jpg + + + + Image files (*.jpg) + Archivos de imagen (*.jpg) + + + + + Comics + Cómics + + + + + General + Opciones generales + + + + + Magnifiying glass + Lupa + + + + + Page adjustement + Ajuste de página + + + + + Reading + Leyendo + + + + Toggle fullscreen mode + Alternar modo de pantalla completa + + + + Hide/show toolbar + Ocultar/mostrar barra de herramientas + + + + Size up magnifying glass + Aumentar tamaño de la lupa + + + + Size down magnifying glass + Disminuir tamaño de lupa + + + + Zoom in magnifying glass + Incrementar el aumento de la lupa + + + + Zoom out magnifying glass + Reducir el aumento de la lupa + + + + Reset magnifying glass + Resetear lupa + + + + Toggle between fit to width and fit to height + Alternar entre ajuste al ancho y ajuste al alto + + + + Autoscroll down + Desplazamiento automático hacia abajo + + + + Autoscroll up + Desplazamiento automático hacia arriba + + + + Autoscroll forward, horizontal first + Desplazamiento automático hacia adelante, primero horizontal + + + + Autoscroll backward, horizontal first + Desplazamiento automático hacia atrás, primero horizontal + + + + Autoscroll forward, vertical first + Desplazamiento automático hacia adelante, primero vertical + + + + Autoscroll backward, vertical first + Desplazamiento automático hacia atrás, primero vertical + + + + Move down + Mover abajo + + + + Move up + Mover arriba + + + + Move left + Mover a la izquierda + + + + Move right + Mover a la derecha + + + + Go to the first page + Ir a la primera página + + + + Go to the last page + Ir a la última página + + + + Offset double page to the left + Mover una página a la izquierda + + + + Offset double page to the right + Mover una página a la derecha + + + + There is a new version available + Hay una nueva versión disponible + + + + Do you want to download the new version? + ¿Desea descargar la nueva versión? + + + + Remind me in 14 days + Recordar en 14 días + + + + Not now + Ahora no + + + + YACReader::TrayIconController + + + &Restore + &Restaurar + + + + Systray + Bandeja del sistema + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary se continuará ejecutando en la bandeja del sistema. Para cerrar el programa elige <b>Cerrar</b> en el menú contextual del icono de la aplicación en la bandeja del sistema. + + + + YACReaderFieldEdit + + + + Click to overwrite + Clic para sobrescribir + + + + Restore to default + Restaurar valor por defecto + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Clic para sobrescribir + + + + Restore to default + Restaurar valor por defecto + + + + YACReaderOptionsDialog + + + Save + Guardar + + + + Cancel + Cancelar + + + + Edit shortcuts + Editar accesos directos + + + + Shortcuts + Accesos directos + + + + YACReaderSearchLineEdit + + + type to search + escribe para buscar + + + + YACReaderSlider + + + Reset + Restablecer - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + Traductor YACReader - - &Resume - + + + Translation + Traducción - - Save log - + + clear + Limpiar - - Log file (*.log) - + + Service not available + Servicio no disponible diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_fr.ts b/YACReaderLibraryServer/yacreaderlibraryserver_fr.ts index 43ac18d56..d5aef3804 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_fr.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_fr.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Rien + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Nom de l'étiquette : - - 7z not found - + + Choose a color: + Choisissez une couleur: - - Format not supported - + + accept + accepter + + + + cancel + Annuler - LogWindow + AddLibraryDialog + + + Comics folder : + Dossier des bandes dessinées : + + + + Library name : + Nom de la librairie : + - - Log window - + + Add + Ajouter - - &Pause - + + Cancel + Annuler - - &Save - + + Add an existing library + Ajouter une librairie existante + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Avant de pouvoir vous connecter à Comic Vine, vous avez besoin de votre propre clé API. Veuillez en obtenir une gratuitement ici: <a href="http://www.comicvine.com/api/"></a> - - &Copy - + + Paste here your Comic Vine API key + Collez ici votre clé API Comic Vine - - Level: - + + Accept + Accepter - - &Auto scroll - + + Cancel + Annuler - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Jeu de couleurs + + + + System + Système + + + + Light + Lumière + + + + Dark + Sombre + + + + Custom + Coutume + + + + Remove + Retirer + + + + Remove this user-imported theme + Supprimer ce thème importé par l'utilisateur + + + + Light: + Lumière: + + + + Dark: + Sombre: + + + + Custom: + Personnalisation: + + + + Import theme... + Importer le thème... + + + + Theme + Thème + + + + Theme editor + Éditeur de thème + + + + Open Theme Editor... + Ouvrir l'éditeur de thème... + + + + Theme editor error + Erreur de l'éditeur de thème + + + + The current theme JSON could not be loaded. + Le thème actuel JSON n'a pas pu être chargé. + + + + Import theme + Importer un thème + + + + JSON files (*.json);;All files (*) + Fichiers JSON (*.json);;Tous les fichiers (*) + + + + Could not import theme from: +%1 + Impossible d'importer le thème depuis : +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + Impossible d'importer le thème depuis : +%1 + +%2 + + + + Import failed + Échec de l'importation - QObject + BookmarksDialog - - Trace - + + Lastest Page + Aller à la dernière page - - Debug - + + Close + Fermer - - Info - + + Click on any image to go to the bookmark + Cliquez sur une image pour aller au marque-page - - Warning - + + + Loading... + Chargement... + + + ClassicComicsView - - Error - + + Hide comic flow + Masquer Comic Flow + + + + ComicModel + + + yes + oui - - Fatal - + + no + non + + + + Title + Titre + + + + File Name + Nom du fichier + + + + Pages + Feuilles + + + + Size + Taille + + + + Read + Lu + + + + Current Page + Page en cours + + + + Publication Date + Date de publication + + + + Rating + Note + + + + Series + Série + + + + Volume + Tome + + + + Story Arc + Arc d'histoire + + + + ComicVineDialog + + + skip + passer + + + + back + retour + + + + next + suivant + + + + search + chercher + + + + close + fermer + + + + + comic %1 of %2 - %3 + bande dessinée %1 sur %2 - %3 + + + + + + Looking for volume... + Vous cherchez du volume... + + + + %1 comics selected + %1 bande(s) dessinnée(s) sélectionnée(s) + + + + Error connecting to ComicVine + Erreur de connexion à Comic Vine + + + + + Retrieving tags for : %1 + Retrouver les infomartions de: %1 + + + + Retrieving volume info... + Récupération des informations sur le volume... + + + + Looking for comic... + Vous cherchez une bande dessinée ... + + + + ContinuousPageWidget + + + Loading page %1 + Chargement de la page %1 + + + + CreateLibraryDialog + + + Comics folder : + Dossier des bandes dessinées : + + + + Library Name : + Nom de la librairie : + + + + Create + Créer + + + + Cancel + Annuler + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et continuer plus tard. + + + + Create new library + Créer une nouvelle librairie + + + + Path not found + Chemin introuvable + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Le chemin sélectionné n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + + + + EditShortcutsDialog + + + Restore defaults + Réinitialiser + + + + To change a shortcut, double click in the key combination and type the new keys. + Pour modifier un raccourci, double-cliquez sur la combinaison de touches et tapez les nouvelles clés. + + + + Shortcuts settings + Paramètres de raccourcis + + + + Shortcut in use + Raccourci en cours d'utilisation + + + + The shortcut "%1" is already assigned to other function + Le raccourci "%1" est déjà affecté à une autre fonction + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Ce dossier ne contient pas encore de bandes dessinées + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Ce dossier ne contient pas encore de bandes dessinées + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Cette liste de lecture ne contient aucune bande dessinée + + + + EmptySpecialListWidget + + + No favorites + Pas de favoris + + + + You are not reading anything yet, come on!! + Vous ne lisez rien encore, allez !! + + + + There are no recent comics! + Il n'y a pas de BD récente ! + + + + ExportComicsInfoDialog + + + Output file : + Fichier de sortie : + + + + Create + Créer + + + + Cancel + Annuler + + + + Export comics info + Exporter les infos des bandes dessinées + + + + Destination database name + Nom de la base de données de destination + + + + Problem found while writing + Problème durant l'écriture + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + + + + ExportLibraryDialog + + + Output folder : + Dossier de sortie : + + + + Create + Créer + + + + Cancel + Annuler + + + + Create covers package + Créer un pack de couvertures + + + + Problem found while writing + Problème durant l'écriture + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Le chemin sélectionné pour le fichier n'existe pas ou contient un chemin invalide. Assurez-vous d'avoir les droits d'accès à ce dossier + + + + Destination directory + Répertoire de destination + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + Erreur CRC sur la page (%1): certaines pages ne s'afficheront pas correctement + + + + Unknown error opening the file + Erreur inconnue lors de l'ouverture du fichier + + + + 7z not found + 7z introuvable + + + + Format not supported + Format non supporté + + + + GoToDialog + + + Page : + Feuille : + + + + Go To + Aller à + + + + Cancel + Annuler + + + + + Total pages : + Nombre de pages : + + + + Go to... + Aller à... + + + + GoToFlowToolBar + + + Page : + Feuille : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Afficher les informations + + + HelpAboutDialog - - Level - + + About + A propos - - Message - + + Help + Aide + + + + System info + Informations système + + + + ImportComicsInfoDialog + + + Import comics info + Importer les infos des bandes dessinées + + + + Info database location : + Emplacement des infos: + + + + Import + Importer + + + + Cancel + Annuler + + + + Comics info file (*.ydb) + Fichier infos BD (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nom de la librairie : + + + + Package location : + Emplacement : + + + + Destination folder : + Dossier de destination : + + + + Unpack + Désarchiver + + + + Cancel + Annuler + + + + Extract a catalog + Extraire un catalogue + + + + Compresed library covers (*.clc) + Couvertures de bibliothèque compressées (*.clc) + + + + ImportWidget + + + stop + Arrêter + + + + Some of the comics being added... + Ajout de bande dessinée... + + + + Importing comics + Importation de bande dessinée + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary est en train de créer une nouvelle librairie.</p><p>La création d'une librairie peut prendre quelques minutes. Vous pouvez arrêter le processus et poursuivre plus tard.</p> + + + + Updating the library + Mise à jour de la librairie + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Mise à jour de la librairie. Pour plus de rapidité lors de la mise à jour, veuillez effectuer cette dernière régulièrement.</p><p>Vous pouvez arrêter le processus et poursuivre plus tard.</p> + + + + Upgrading the library + Mise à niveau de la bibliothèque + + + + <p>The current library is being upgraded, please wait.</p> + <p>La bibliothèque actuelle est en cours de mise à niveau, veuillez patienter.</p> + + + + Scanning the library + Scanner la bibliothèque + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>La bibliothèque actuelle est en cours d'analyse pour rechercher des informations sur les métadonnées XML héritées.</p><p>Ceci n'est nécessaire qu'une seule fois, et uniquement si la bibliothèque a été créée avec YACReaderLibrary 9.8.2 ou une version antérieure.</p> + + + + LibraryWindow + + + YACReader Library + Librairie de YACReader + + + + + + comic + comique + + + + + + manga + mangas + + + + + + western manga (left to right) + manga occidental (de gauche à droite) + + + + + + web comic + bande dessinée Web + + + + + + 4koma (top to botom) + 4koma (de haut en bas) + + + + + + + Set type + Définir le type + + + + Library + Librairie + + + + Folder + Dossier + + + + Comic + Bande dessinée + + + + Upgrade failed + La mise à niveau a échoué + + + + There were errors during library upgrade in: + Des erreurs se sont produites lors de la mise à niveau de la bibliothèque dans : + + + + Update needed + Mise à jour requise + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Cette librairie a été créée avec une ancienne version de YACReaderLibrary. Mise à jour necessaire. Mettre à jour? + + + + Download new version + Téléchrger la nouvelle version + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Cette librairie a été créée avec une version plus récente de YACReaderLibrary. Télécharger la nouvelle version? + + + + Library not available + Librairie non disponible + + + + Library '%1' is no longer available. Do you want to remove it? + La librarie '%1' n'est plus disponible. Voulez-vous la supprimer? + + + + Old library + Ancienne librairie + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + La librarie '%1' a été créée avec une ancienne version de YACReaderLibrary. Elle doit être re-créée. Voulez-vous créer la librairie? + + + + + Copying comics... + Copier la bande dessinée... + + + + + Moving comics... + Déplacer la bande dessinée... + + + + Add new folder + Ajouter un nouveau dossier + + + + Folder name: + Nom du dossier : + + + + No folder selected + Aucun dossier sélectionné + + + + Please, select a folder first + Veuillez d'abord sélectionner un dossier + + + + Error in path + Erreur dans le chemin + + + + There was an error accessing the folder's path + Une erreur s'est produite lors de l'accès au chemin du dossier + + + + Delete folder + Supprimer le dossier + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Le dossier sélectionné et tout son contenu seront supprimés de votre disque. Es-tu sûr? + + + + + Unable to delete + Impossible de supprimer + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Un problème est survenu lors de la tentative de suppression des dossiers sélectionnés. Veuillez vérifier les autorisations d'écriture et assurez-vous que toutes les applications utilisent ces dossiers ou l'un des fichiers contenus. + + + + Add new reading lists + Ajouter de nouvelles listes de lecture + + + + + List name: + Nom de la liste : + + + + Delete list/label + Supprimer la liste/l'étiquette + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + L'élément sélectionné sera supprimé, vos bandes dessinées ou dossiers ne seront pas supprimés de votre disque. Êtes-vous sûr? + + + + Rename list name + Renommer le nom de la liste + + + + Open folder... + Ouvrir le dossier... + + + + Update folder + Mettre à jour le dossier + + + + Rescan library for XML info + Réanalyser la bibliothèque pour les informations XML + + + + Set as uncompleted + Marquer comme incomplet + + + + Set as completed + Marquer comme complet + + + + Set as read + Marquer comme lu + + + + + Set as unread + Marquer comme non-lu + + + + Set custom cover + Définir une couverture personnalisée + + + + Delete custom cover + Supprimer la couverture personnalisée + + + + Save covers + Enregistrer les couvertures + + + + You are adding too many libraries. + Vous ajoutez trop de bibliothèques. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Vous ajoutez trop de bibliothèques. + +Vous n'avez probablement besoin que d'une bibliothèque dans votre dossier BD de niveau supérieur, vous pouvez parcourir les sous-dossiers en utilisant la section des dossiers dans la barre latérale gauche. + +YACReaderLibrary ne vous empêchera pas de créer plus de bibliothèques, mais vous devriez garder le nombre de bibliothèques bas. + + + + + YACReader not found + YACReader introuvable + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader introuvable. YACReader doit être installé dans le même dossier que YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader introuvable. Il se peut qu'il y ait un problème avec votre installation de YACReader. + + + + Error + Erreur + + + + Error opening comic with third party reader. + Erreur lors de l'ouverture de la bande dessinée avec un lecteur tiers. + + + + Library not found + Librairie introuvable + + + + The selected folder doesn't contain any library. + Le dossier sélectionné ne contient aucune librairie. + + + + Are you sure? + Êtes-vous sûr? + + + + Do you want remove + Voulez-vous supprimer + + + + library? + la librairie? + + + + Remove and delete metadata + Supprimer les métadata + + + + Library info + Informations sur la bibliothèque + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Un problème est survenu lors de la tentative de suppression des bandes dessinées sélectionnées. Veuillez vérifier les autorisations d'écriture dans les fichiers sélectionnés ou le dossier contenant. + + + + Assign comics numbers + Attribuer des numéros de bandes dessinées + + + + Assign numbers starting in: + Attribuez des numéros commençant par : + + + + Invalid image + Image invalide + + + + The selected file is not a valid image. + Le fichier sélectionné n'est pas une image valide. + + + + Error saving cover + Erreur lors de l'enregistrement de la couverture + + + + There was an error saving the cover image. + Une erreur s'est produite lors de l'enregistrement de l'image de couverture. + + + + Error creating the library + Erreur lors de la création de la librairie + + + + Error updating the library + Erreur lors de la mise à jour de la librairie + + + + Error opening the library + Erreur lors de l'ouverture de la librairie + + + + Delete comics + Supprimer les comics + + + + All the selected comics will be deleted from your disk. Are you sure? + Tous les comics sélectionnés vont être supprimés de votre disque. Êtes-vous sûr? + + + + Remove comics + Supprimer les bandes dessinées + + + + Comics will only be deleted from the current label/list. Are you sure? + Les bandes dessinées seront uniquement supprimées du label/liste actuelle. Es-tu sûr? + + + + Library name already exists + Le nom de la librairie existe déjà + + + + There is another library with the name '%1'. + Une autre librairie a le nom '%1'. + + + + LibraryWindowActions + + + Create a new library + Créer une nouvelle librairie + + + + Open an existing library + Ouvrir une librairie existante + + + + + Export comics info + Exporter les infos des bandes dessinées + + + + + Import comics info + Importer les infos des bandes dessinées + + + + Pack covers + Archiver les couvertures + + + + Pack the covers of the selected library + Archiver les couvertures de la librairie sélectionnée + + + + Unpack covers + Désarchiver les couvertures + + + + Unpack a catalog + Désarchiver un catalogue + + + + Update library + Mettre la librairie à jour + + + + Update current library + Mettre à jour la librairie actuelle + + + + Rename library + Renommer la librairie + + + + Rename current library + Renommer la librairie actuelle + + + + Remove library + Supprimer la librairie + + + + Remove current library from your collection + Enlever cette librairie de votre collection + + + + Rescan library for XML info + Réanalyser la bibliothèque pour les informations XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Essaie de trouver des informations XML intégrées dans des fichiers de bandes dessinées. Vous ne devez le faire que si la bibliothèque a été créée avec la version 9.8.2 ou des versions antérieures ou si vous utilisez un logiciel tiers pour intégrer des informations XML dans les fichiers. + + + + Show library info + Afficher les informations sur la bibliothèque + + + + Show information about the current library + Afficher des informations sur la bibliothèque actuelle + + + + Open current comic + Ouvrir cette bande dessinée + + + + Open current comic on YACReader + Ouvrir cette bande dessinée dans YACReader + + + + Save selected covers to... + Exporter la couverture vers... + + + + Save covers of the selected comics as JPG files + Enregistrer les couvertures des bandes dessinées sélectionnées en tant que fichiers JPG + + + + + Set as read + Marquer comme lu + + + + Set comic as read + Marquer cette bande dessinée comme lu + + + + + Set as unread + Marquer comme non-lu + + + + Set comic as unread + Marquer cette bande dessinée comme non-lu + + + + + manga + mangas + + + + Set issue as manga + Définir le problème comme manga + + + + + comic + comique + + + + Set issue as normal + Définir le problème comme d'habitude + + + + western manga + manga occidental + + + + Set issue as western manga + Définir le problème comme un manga occidental + + + + + web comic + bande dessinée Web + + + + Set issue as web comic + Définir le problème comme bande dessinée Web + + + + + yonkoma + Yonkoma + + + + Set issue as yonkoma + Définir le problème comme Yonkoma + + + + Show/Hide marks + Afficher/Cacher les marqueurs + + + + Show or hide read marks + Afficher ou masquer les marques de lecture + + + + Show/Hide recent indicator + Afficher/Masquer l'indicateur récent + + + + Show or hide recent indicator + Afficher ou masquer l'indicateur récent + + + + + Fullscreen mode on/off + Mode plein écran activé/désactivé + + + + Help, About YACReader + Aide, à propos de YACReader + + + + Add new folder + Ajouter un nouveau dossier + + + + Add new folder to the current library + Ajouter un nouveau dossier à la bibliothèque actuelle + + + + Delete folder + Supprimer le dossier + + + + Delete current folder from disk + Supprimer le dossier actuel du disque + + + + Select root node + Allerà la racine + + + + Expand all nodes + Afficher tous les noeuds + + + + Collapse all nodes + Réduire tous les nœuds + + + + Show options dialog + Ouvrir la boite de dialogue + + + + Show comics server options dialog + Ouvrir la boite de dialogue du serveur + + + + + Change between comics views + Changement entre les vues de bandes dessinées + + + + Open folder... + Ouvrir le dossier... + + + + Set as uncompleted + Marquer comme incomplet + + + + Set as completed + Marquer comme complet + + + + Set custom cover + Définir une couverture personnalisée + + + + Delete custom cover + Supprimer la couverture personnalisée + + + + western manga (left to right) + manga occidental (de gauche à droite) + + + + Open containing folder... + Ouvrir le dossier... + + + + Reset comic rating + Supprimer la note d'évaluation + + + + Select all comics + Sélectionner toutes les bandes dessinées + + + + Edit + Editer + + + + Assign current order to comics + Assigner l'ordre actuel aux bandes dessinées + + + + Update cover + Mise à jour des couvertures + + + + Delete selected comics + Supprimer la bande dessinée sélectionnée + + + + Delete metadata from selected comics + Supprimer les métadonnées des bandes dessinées sélectionnées + + + + Download tags from Comic Vine + Télécharger les informations de Comic Vine + + + + Focus search line + Ligne de recherche ciblée + + + + Focus comics view + Focus sur la vue des bandes dessinées + + + + Edit shortcuts + Modifier les raccourcis + + + + &Quit + &Quitter + + + + Update folder + Mettre à jour le dossier + + + + Update current folder + Mettre à jour ce dossier + + + + Scan legacy XML metadata + Analyser les métadonnées XML héritées + + + + Add new reading list + Ajouter une nouvelle liste de lecture + + + + Add a new reading list to the current library + Ajouter une nouvelle liste de lecture à la bibliothèque actuelle + + + + Remove reading list + Supprimer la liste de lecture + + + + Remove current reading list from the library + Supprimer la liste de lecture actuelle de la bibliothèque + + + + Add new label + Ajouter une nouvelle étiquette + + + + Add a new label to this library + Ajouter une nouvelle étiquette à cette bibliothèque + + + + Rename selected list + Renommer la liste sélectionnée + + + + Rename any selected labels or lists + Renommer toutes les étiquettes ou listes sélectionnées + + + + Add to... + Ajouter à... + + + + Favorites + Favoris + + + + Add selected comics to favorites list + Ajouter la bande dessinée sélectionnée à la liste des favoris + + + + LocalComicListModel + + + file name + nom de fichier + + + + NoLibrariesWidget + + + You don't have any libraries yet + Vous n'avez pas encore de librairie + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Vous pouvez creer une librairie dans n'importe quel dossierr, YACReaderLibrary importera les dossiers et les bandes dessinées contenus dans ce dossier. Si vous avez déjà crer des librairies, vous pouvez les ouvrir.</p><p>N'oubliez pas que vous pouvez utiliser YACReader en tant que stand alone pour lire vos bandes dessinées sur votre ordinateur.</p> + + + + create your first library + Créez votre première librairie + + + + add an existing one + Ajouter une librairie existante + + + + NoSearchResultsWidget + + + No results + Aucun résultat + + + + OptionsDialog + + + + General + Général + + + + + Libraries + Bibliothèques + + + + Comic Flow + Comic Flow + + + + Grid view + Vue grille + + + + + Appearance + Apparence + + + + + Options + Possibilités + + + + + Language + Langue + + + + + Application language + Langue de l'application + + + + + System default + Par défaut du système + + + + Tray icon settings (experimental) + Paramètres de l'icône de la barre d'état (expérimental) + + + + Close to tray + Près du plateau + + + + Start into the system tray + Commencez dans la barre d'état système + + + + Edit Comic Vine API key + Modifier la clé API Comic Vine + + + + Comic Vine API key + Clé API Comic Vine + + + + ComicInfo.xml legacy support + Prise en charge héritée de ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importer des métadonnées depuis ComicInfo.xml lors de l'ajout de nouvelles bandes dessinées + + + + Consider 'recent' items added or updated since X days ago + Considérez les éléments « récents » ajoutés ou mis à jour depuis X jours + + + + Third party reader + Lecteur tiers + + + + Write {comic_file_path} where the path should go in the command + Écrivez {comic_file_path} où le chemin doit aller dans la commande + + + + + Clear + Clair + + + + Update libraries at startup + Mettre à jour les bibliothèques au démarrage + + + + Try to detect changes automatically + Essayez de détecter automatiquement les changements + + + + Update libraries periodically + Mettre à jour les bibliothèques périodiquement + + + + Interval: + Intervalle: + + + + 30 minutes + 30 min + + + + 1 hour + 1 heure + + + + 2 hours + 2 heures + + + + 4 hours + 4 heures + + + + 8 hours + 8 heures + + + + 12 hours + 12 heures + + + + daily + tous les jours + + + + Update libraries at certain time + Mettre à jour les bibliothèques à un certain moment + + + + Time: + Temps: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + AVERTISSEMENT! Lors des mises à jour de la bibliothèque, les écritures dans la base de données sont désactivées ! +Ne planifiez pas de mises à jour pendant que vous utilisez activement l'application. +Lors des mises à jour automatiques, l'application bloquera certaines actions jusqu'à ce que la mise à jour soit terminée. +Pour arrêter une mise à jour automatique, appuyez sur l'indicateur de chargement à côté du titre Bibliothèques. + + + + Modifications detection + Détection des modifications + + + + Compare the modified date of files when updating a library (not recommended) + Comparer la date de modification des fichiers lors de la mise à jour d'une bibliothèque (déconseillé) + + + + Enable background image + Activer l'image d'arrière-plan + + + + Opacity level + Niveau d'opacité + + + + Blur level + Niveau de flou + + + + Use selected comic cover as background + Utiliser la couverture de bande dessinée sélectionnée comme arrière-plan + + + + Restore defautls + Restaurer les valeurs par défaut + + + + Background + Arrière-plan + + + + Display continue reading banner + Afficher la bannière de lecture continue + + + + Display current comic banner + Afficher la bannière de bande dessinée actuelle + + + + Continue reading + Continuer la lecture + + + + My comics path + Chemin de mes bandes dessinées + + + + Display + Afficher + + + + Show time in current page information label + Afficher l'heure dans l'étiquette d'information de la page actuelle + + + + "Go to flow" size + Taille de "Aller à Comic Flow" + + + + Background color + Couleur d'arrière plan + + + + Choose + Choisir + + + + Scroll behaviour + Comportement de défilement + + + + Disable scroll animations and smooth scrolling + Désactiver les animations de défilement et le défilement fluide + + + + Do not turn page using scroll + Ne tournez pas la page en utilisant le défilement + + + + Use single scroll step to turn page + Utilisez une seule étape de défilement pour tourner la page + + + + Mouse mode + Mode souris + + + + Only Back/Forward buttons can turn pages + Seuls les boutons Précédent/Avant peuvent tourner les pages + + + + Use the Left/Right buttons to turn pages. + Utilisez les boutons Gauche/Droite pour tourner les pages. + + + + Click left or right half of the screen to turn pages. + Cliquez sur la moitié gauche ou droite de l'écran pour tourner les pages. + + + + Quick Navigation Mode + Mode navigation rapide + + + + Disable mouse over activation + Désactiver la souris sur l'activation + + + + Brightness + Luminosité + + + + Contrast + Contraste + + + + Gamma + Valeur gamma + + + + Reset + Remise à zéro + + + + Image options + Option de l'image + + + + Fit options + Options d'ajustement + + + + Enlarge images to fit width/height + Agrandir les images pour les adapter à la largeur/hauteur + + + + Double Page options + Options de double page + + + + Show covers as single page + Afficher les couvertures sur une seule page + + + + Scaling + Mise à l'échelle + + + + Scaling method + Méthode de mise à l'échelle + + + + Nearest (fast, low quality) + Le plus proche (rapide, mauvaise qualité) + + + + Bilinear + Bilinéaire + + + + Lanczos (better quality) + Lanczos (meilleure qualité) + + + + Page Flow + Flux des pages + + + + Image adjustment + Ajustement de l'image + + + + + Restart is needed + Redémarrage nécessaire + + + + Comics directory + Répertoire des bandes dessinées + + + + PropertiesDialog + + + General info + Infos générales + + + + Plot + Intrigue + + + + Authors + Auteurs + + + + Publishing + Publication + + + + Notes + Remarques + + + + Cover page + Couverture + + + + Load previous page as cover + Charger la page précédente comme couverture + + + + Load next page as cover + Charger la page suivante comme couverture + + + + Reset cover to the default image + Réinitialiser la couverture à l'image par défaut + + + + Load custom cover image + Charger une image de couverture personnalisée + + + + Series: + Série: + + + + Title: + Titre: + + + + + + of: + sur: + + + + Issue number: + Numéro: + + + + Volume: + Tome : + + + + Arc number: + Arc numéro: + + + + Story arc: + Arc narratif: + + + + alt. number: + alt. nombre: + + + + Alternate series: + Série alternative : + + + + Series Group: + Groupe de séries : + + + + Genre: + Genre : + + + + Size: + Taille: + + + + Writer(s): + Scénariste(s): + + + + Penciller(s): + Dessinateur(s): + + + + Inker(s): + Encreur(s): + + + + Colorist(s): + Coloriste(s): + + + + Letterer(s): + Lettreur(s): + + + + Cover Artist(s): + Artiste(s) de couverture: + + + + Editor(s): + Editeur(s) : + + + + Imprint: + Imprimer: + + + + Day: + Jour: + + + + Month: + Mois: + + + + Year: + Année: + + + + Publisher: + Editeur: + + + + Format: + Format : + + + + Color/BW: + Couleur/Noir et blanc: + + + + Age rating: + Limite d'âge: + + + + Type: + Taper: + + + + Language (ISO): + Langue (ISO) : + + + + Synopsis: + Synopsis : + + + + Characters: + Personnages: + + + + Teams: + Équipes : + + + + Locations: + Emplacements : + + + + Main character or team: + Personnage principal ou équipe : + + + + Review: + Revoir: + + + + Notes: + Remarques : + + + + Tags: + Balises : + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Lien Comic Vine : <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> vue </a> + + + + Not found + Introuvable + + + + Comic not found. You should update your library. + Comic introuvable. Vous devriez mettre à jour votre librairie. + + + + Edit comic information + Editer les informations du comic + + + + Edit selected comics information + Editer les informations du comic sélectionné + + + + Invalid cover + Couverture invalide + + + + The image is invalid. + L'image n'est pas valide. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer est la version sans tête (sans interface graphique) de YACReaderLibrary. + +Cette application prend en charge les paramètres persistants, pour les configurer, modifiez ce fichier %1 +Pour en savoir plus sur les paramètres disponibles, veuillez consulter la documentation sur https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + Tracer + + + + Debug + Déboguer + + + + Info + Informations + + + + Warning + Avertissement + + + + Error + Erreur + + + + Fatal + Critique + + + + Select custom cover + Sélectionnez une couverture personnalisée + + + + Images (%1) + Illustrations (%1) + + + + 7z lib not found + lib 7z introuvable + + + + unable to load 7z lib from ./utils + impossible de charger 7z depuis ./utils + + + + The file could not be read or is not valid JSON. + Le fichier n'a pas pu être lu ou n'est pas un JSON valide. + + + + This theme is for %1, not %2. + Ce thème est pour %1, pas pour %2. + + + + Libraries + Bibliothèques + + + + Folders + Dossiers + + + + Reading Lists + Listes de lecture + + + + RenameLibraryDialog + + + New Library Name : + Nouveau nom de librairie: + + + + Rename + Renommer + + + + Cancel + Annuler + + + + Rename current library + Renommer la librairie actuelle + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Nombre de volumes trouvés : %1 + + + + + page %1 of %2 + page %1 de %2 + + + + Number of %1 found : %2 + Nombre de %1 trouvés : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Veuillez fournir des informations supplémentaires pour cette bande dessinée. + + + + Series: + Série: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Utilisez la recherche de correspondance exacte. Désactivez-la si vous souhaitez rechercher des volumes correspondant à certains mots du nom. + + + + SearchVolume + + + Please provide some additional information. + Veuillez fournir quelques informations supplémentaires. + + + + Series: + Série: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Utilisez la recherche de correspondance exacte. Désactivez-la si vous souhaitez rechercher des volumes correspondant à certains mots du nom. + + + + SelectComic + + + Please, select the right comic info. + Veuillez sélectionner les bonnes informations sur la bande dessinée. + + + + comics + bandes dessinées + + + + loading cover + couvercle de chargement + + + + loading description + description du chargement + + + + comic description unavailable + description de la bande dessinée indisponible + + + + SelectVolume + + + Please, select the right series for your comic. + Veuillez sélectionner la bonne série pour votre bande dessinée. + + + + Filter: + Filtre: + + + + volumes + tomes + + + + Nothing found, clear the filter if any. + Rien trouvé, effacez le filtre le cas échéant. + + + + loading cover + couvercle de chargement + + + + loading description + description du chargement + + + + volume description unavailable + description du volume indisponible + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Vous essayez d’obtenir des informations sur plusieurs bandes dessinées à la fois, font-elles partie de la même série ? + + + + yes + oui + + + + no + non + + + + ServerConfigDialog + + + set port + Configurer le port + + + + Server connectivity information + Informations sur la connectivité du serveur + + + + Scan it! + Scannez-le ! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader est disponible pour les appareils iOS et Android.<br/>Découvrez-le pour <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> ou <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Choisissez une adresse IP + + + + Port + Port r?seau + + + + enable the server + Autoriser le serveur + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Veuillez trier la liste des bandes dessinées sur la gauche jusqu'à ce qu'elle corresponde aux informations des bandes dessinées. + + + + sort comics to match comic information + trier les bandes dessinées pour qu'elles correspondent aux informations sur les bandes dessinées + + + + issues + problèmes + + + + remove selected comics + supprimer les bandes dessinées sélectionnées + + + + restore all removed comics + restaurer toutes les bandes dessinées supprimées + + + + ThemeEditorDialog + + + Theme Editor + Éditeur de thème + + + + + + + + + + + - + - + + + + i + je + + + + Expand all + Tout développer + + + + Collapse all + Tout réduire + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Maintenez enfoncé pour faire clignoter la valeur sélectionnée dans l'interface utilisateur (magenta / basculé / 0↔10). Les versions restaurent l'original. + + + + Search… + Rechercher… + + + + Light + Lumière + + + + Dark + Sombre + + + + ID: + IDENTIFIANT: + + + + Display name: + Nom d'affichage : + + + + Variant: + Variante: + + + + Theme info + Informations sur le thème + + + + Parameter + Paramètre + + + + Value + Valeur + + + + Save and apply + Enregistrer et postuler + + + + Export to file... + Exporter vers un fichier... + + + + Load from file... + Charger à partir du fichier... + + + + Close + Fermer + + + + Double-click to edit color + Double-cliquez pour modifier la couleur + + + + + + + + + true + vrai + + + + + + + false + FAUX + + + + Double-click to toggle + Double-cliquez pour basculer + + + + Double-click to edit value + Double-cliquez pour modifier la valeur + + + + + + Edit: %1 + Modifier : %1 + + + + Save theme + Enregistrer le thème + + + + + JSON files (*.json);;All files (*) + Fichiers JSON (*.json);;Tous les fichiers (*) + + + + Save failed + Échec de l'enregistrement + + + + Could not open file for writing: +%1 + Impossible d'ouvrir le fichier en écriture : +%1 + + + + Load theme + Charger le thème + + + + + + Load failed + Échec du chargement + + + + Could not open file: +%1 + Impossible d'ouvrir le fichier : +%1 + + + + Invalid JSON: +%1 + JSON invalide : +%1 + + + + Expected a JSON object. + Attendu un objet JSON. + + + + TitleHeader + + + SEARCH + RECHERCHE + + + + UpdateLibraryDialog + + + Updating.... + Mise à jour... + + + + Cancel + Annuler + + + + Update library + Mettre la librairie à jour + + + + Viewer + + + + Press 'O' to open comic. + Appuyez sur "O" pour ouvrir une bande dessinée. + + + + Not found + Introuvable + + + + Comic not found + Bande dessinée introuvable + + + + Error opening comic + Erreur d'ouverture de la bande dessinée + + + + CRC Error + Erreur CRC + + + + Loading...please wait! + Chargement... Patientez + + + + Page not available! + Page non disponible ! + + + + Cover! + Couverture! + + + + Last page! + Dernière page! + + + + VolumeComicsModel + + + title + titre + + + + VolumesModel + + + year + année + + + + issues + problèmes + + + + publisher + éditeur + + + + YACReader3DFlowConfigWidget + + + Presets: + Réglages: + + + + Classic look + Vue classique + + + + Stripe look + Vue alignée + + + + Overlapped Stripe look + Vue superposée + + + + Modern look + Vue moderne + + + + Roulette look + Vue roulette + + + + Show advanced settings + Voir les paramètres avancés + + + + Custom: + Personnalisation: + + + + View angle + Angle de vue + + + + Position + Positionnement + + + + Cover gap + Espace entre les couvertures + + + + Central gap + Espace couverture centrale + + + + Zoom + Agrandissement + + + + Y offset + Axe Y + + + + Z offset + Axe Z + + + + Cover Angle + Angle des couvertures + + + + Visibility + Visibilité + + + + Light + Lumière + + + + Max angle + Angle Maximum + + + + Low Performance + Faible performance + + + + High Performance + Haute performance + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Utiliser VSync (Améliore la qualité d'image en mode plein écran, ralentit la performance) + + + + Performance: + Performance : + + + + YACReader::MainWindowViewer + + + &Open + &Ouvrir + + + + Open a comic + Ouvrir une bande dessinée + + + + New instance + Nouvelle instance + + + + Open Folder + Ouvrir un dossier + + + + Open image folder + Ouvrir un dossier d'images + + + + Open latest comic + Ouvrir la dernière bande dessinée + + + + Open the latest comic opened in the previous reading session + Ouvrir la dernière bande dessinée ouverte lors de la session de lecture précédente + + + + Clear + Clair + + + + Clear open recent list + Vider la liste d'ouverture récente + + + + Save + Sauvegarder + + + + + Save current page + Sauvegarder la page actuelle + + + + Previous Comic + Bande dessinée précédente + + + + + + Open previous comic + Ouvrir la bande dessiné précédente + + + + Next Comic + Bande dessinée suivante + + + + + + Open next comic + Ouvrir la bande dessinée suivante + + + + &Previous + &Précédent + + + + + + Go to previous page + Aller à la page précédente + + + + &Next + &Suivant + + + + + + Go to next page + Aller à la page suivante + + + + Fit Height + Ajuster la hauteur + + + + Fit image to height + Ajuster l'image à la hauteur + + + + Fit Width + Ajuster la largeur + + + + Fit image to width + Ajuster l'image à la largeur + + + + Show full size + Plein écran + + + + Fit to page + Ajuster à la page + + + + Continuous scroll + Défilement continu + + + + Switch to continuous scroll mode + Passer en mode défilement continu + + + + Reset zoom + Réinitialiser le zoom + + + + Show zoom slider + Afficher le curseur de zoom + + + + Zoom+ + Agrandir + + + + Zoom- + R?duire + + + + Rotate image to the left + Rotation à gauche + + + + Rotate image to the right + Rotation à droite + + + + Double page mode + Mode double page + + + + Switch to double page mode + Passer en mode double page + + + + Double page manga mode + Mode manga en double page + + + + Reverse reading order in double page mode + Ordre de lecture inversée en mode double page + + + + Go To + Aller à + + + + Go to page ... + Aller à la page ... + + + + Options + Possibilités + + + + YACReader options + Options de YACReader + + + + + Help + Aide + + + + Help, About YACReader + Aide, à propos de YACReader + + + + Magnifying glass + Loupe + + + + Switch Magnifying glass + Utiliser la loupe + + + + Set bookmark + Placer un marque-page + + + + Set a bookmark on the current page + Placer un marque-page sur la page actuelle + + + + Show bookmarks + Voir les marque-pages + + + + Show the bookmarks of the current comic + Voir les marque-pages de cette bande dessinée + + + + Show keyboard shortcuts + Voir les raccourcis + + + + Show Info + Voir les infos + + + + Close + Fermer + + + + Show Dictionary + Dictionnaire + + + + Show go to flow + Afficher "Aller à Comic Flow" + + + + Edit shortcuts + Modifier les raccourcis + + + + &File + &Fichier + + + + + Open recent + Ouvrir récent + + + + File + Fichier + + + + Edit + Editer + + + + View + Vue + + + + Go + Aller + + + + Window + Fenêtre + + + + + + Open Comic + Ouvrir la bande dessinée + + + + + + Comic files + Bande dessinée + + + + Open folder + Ouvirir le dossier + + + + page_%1.jpg + feuille_%1.jpg + + + + Image files (*.jpg) + Image(*.jpg) + + + + + Comics + Bandes dessinées + + + + + General + Général + + + + + Magnifiying glass + Loupe + + + + + Page adjustement + Ajustement de la page + + + + + Reading + Lecture + + + + Toggle fullscreen mode + Basculer en mode plein écran + + + + Hide/show toolbar + Masquer / afficher la barre d'outils + + + + Size up magnifying glass + Augmenter la taille de la loupe + + + + Size down magnifying glass + Réduire la taille de la loupe + + + + Zoom in magnifying glass + Zoomer + + + + Zoom out magnifying glass + Dézoomer + + + + Reset magnifying glass + Réinitialiser la loupe + + + + Toggle between fit to width and fit to height + Basculer entre adapter à la largeur et adapter à la hauteur + + + + Autoscroll down + Défilement automatique vers le bas + + + + Autoscroll up + Défilement automatique vers le haut + + + + Autoscroll forward, horizontal first + Défilement automatique en avant, horizontal + + + + Autoscroll backward, horizontal first + Défilement automatique en arrière horizontal + + + + Autoscroll forward, vertical first + Défilement automatique en avant, vertical + + + + Autoscroll backward, vertical first + Défilement automatique en arrière, verticak + + + + Move down + Descendre + + + + Move up + Monter + + + + Move left + Déplacer à gauche + + + + Move right + Déplacer à droite + + + + Go to the first page + Aller à la première page + + + + Go to the last page + Aller à la dernière page + + + + Offset double page to the left + Double page décalée vers la gauche + + + + Offset double page to the right + Double page décalée à droite + + + + There is a new version available + Une nouvelle version est disponible + + + + Do you want to download the new version? + Voulez-vous télécharger la nouvelle version? + + + + Remind me in 14 days + Rappelez-moi dans 14 jours + + + + Not now + Pas maintenant + + + + YACReader::TrayIconController + + + &Restore + &Restaurer + + + + Systray + Zone de notification + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuera à fonctionner dans la barre d'état système. Pour terminer le programme, choisissez <b>Quitter</b> dans le menu contextuel de l'icône de la barre d'état système. + + + + YACReaderFieldEdit + + + + Click to overwrite + Cliquez pour remplacer + + + + Restore to default + Rétablir les paramètres par défaut + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Cliquez pour remplacer + + + + Restore to default + Rétablir les paramètres par défaut + + + + YACReaderOptionsDialog + + + Save + Sauvegarder + + + + Cancel + Annuler + + + + Edit shortcuts + Modifier les raccourcis + + + + Shortcuts + Raccourcis + + + + YACReaderSearchLineEdit + + + type to search + tapez pour rechercher + + + + YACReaderSlider + + + Reset + Remise à zéro - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + Traducteur YACReader - - &Resume - + + + Translation + Traduction - - Save log - + + clear + effacer - - Log file (*.log) - + + Service not available + Service non disponible diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_nl.ts b/YACReaderLibraryServer/yacreaderlibraryserver_nl.ts index 67bca4f97..f80557d24 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_nl.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_nl.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Geen + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Labelnaam: - - 7z not found - + + Choose a color: + Kies een kleur: - - Format not supported - + + accept + accepteren + + + + cancel + annuleren - LogWindow + AddLibraryDialog + + + Comics folder : + Strips map: + + + + Library name : + Bibliotheek Naam : + - - Log window - + + Add + Toevoegen - - &Pause - + + Cancel + Annuleren - - &Save - + + Add an existing library + Voeg een bestaand bibliotheek toe + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Voordat je verbinding kunt maken met Comic Vine, heb je een eigen API-sleutel nodig. Vraag er <a href="http://www.comicvine.com/api/">hier</a> één gratis aan - - &Copy - + + Paste here your Comic Vine API key + Plak hier uw Comic Vine API-sleutel - - Level: - + + Accept + Accepteren - - &Auto scroll - + + Cancel + Annuleren - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Kleurenschema + + + + System + Systeem + + + + Light + Licht + + + + Dark + Donker + + + + Custom + Aangepast + + + + Remove + Verwijderen + + + + Remove this user-imported theme + Verwijder dit door de gebruiker geïmporteerde thema + + + + Light: + Licht: + + + + Dark: + Donker: + + + + Custom: + Aangepast: + + + + Import theme... + Thema importeren... + + + + Theme + Thema + + + + Theme editor + Thema-editor + + + + Open Theme Editor... + Thema-editor openen... + + + + Theme editor error + Fout in de thema-editor + + + + The current theme JSON could not be loaded. + De huidige thema-JSON kan niet worden geladen. + + + + Import theme + Thema importeren + + + + JSON files (*.json);;All files (*) + JSON-bestanden (*.json);;Alle bestanden (*) + + + + Could not import theme from: +%1 + Kan thema niet importeren uit: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + Kan thema niet importeren uit: +%1 + +%2 + + + + Import failed + Importeren is mislukt - QObject + BookmarksDialog - - Trace - + + Lastest Page + Laatste Pagina - - Debug - + + Close + Sluiten - - Info - + + Click on any image to go to the bookmark + Klik op een afbeelding om naar de bladwijzer te gaan - - Warning - + + + Loading... + Inladen... + + + ClassicComicsView - - Error - + + Hide comic flow + Comic Flow verbergen + + + + ComicModel + + + yes + Ja - - Fatal - + + no + neen + + + + Title + Titel + + + + File Name + Bestandsnaam + + + + Pages + Pagina's + + + + Size + Grootte(MB) + + + + Read + Gelezen + + + + Current Page + Huidige pagina + + + + Publication Date + Publicatiedatum + + + + Rating + Beoordeling + + + + Series + Serie + + + + Volume + Deel + + + + Story Arc + Verhaalboog + + + + ComicVineDialog + + + skip + overslaan + + + + back + rug + + + + next + volgende + + + + search + zoekopdracht + + + + close + dichtbij + + + + + comic %1 of %2 - %3 + strip %1 van %2 - %3 + + + + + + Looking for volume... + Op zoek naar volumes... + + + + %1 comics selected + %1 strips geselecteerd + + + + Error connecting to ComicVine + Fout bij verbinden met ComicVine + + + + + Retrieving tags for : %1 + Tags ophalen voor: %1 + + + + Retrieving volume info... + Volume-informatie ophalen... + + + + Looking for comic... + Op zoek naar komische... + + + + ContinuousPageWidget + + + Loading page %1 + Pagina laden %1 + + + + CreateLibraryDialog + + + Comics folder : + Strips map: + + + + Library Name : + Bibliotheek Naam : + + + + Create + Aanmaken + + + + Cancel + Annuleren + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Een bibliotheek aanmaken kan enkele minuten duren. U kunt het proces stoppen en de bibliotheek later voltooien. + + + + Create new library + Een nieuwe Bibliotheek aanmaken + + + + Path not found + Pad niet gevonden + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + De geselecteerde pad bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map + + + + EditShortcutsDialog + + + Restore defaults + Standaardwaarden herstellen + + + + To change a shortcut, double click in the key combination and type the new keys. + Om een ​​snelkoppeling te wijzigen, dubbelklikt u op de toetsencombinatie en typt u de nieuwe toetsen. + + + + Shortcuts settings + Instellingen voor snelkoppelingen + + + + Shortcut in use + Snelkoppeling in gebruik + + + + The shortcut "%1" is already assigned to other function + De sneltoets "%1" is al aan een andere functie toegewezen + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Deze map bevat nog geen strips + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Dit label bevat nog geen strips + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Deze leeslijst bevat nog geen strips + + + + EmptySpecialListWidget + + + No favorites + Geen favorieten + + + + You are not reading anything yet, come on!! + Je leest nog niets, kom op!! + + + + There are no recent comics! + Er zijn geen recente strips! + + + + ExportComicsInfoDialog + + + Output file : + Uitvoerbestand: + + + + Create + Aanmaken + + + + Cancel + Annuleren + + + + Export comics info + Strip info exporteren + + + + Destination database name + Bestemmingsdatabase naam + + + + Problem found while writing + Probleem bij het schrijven + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Het gekozen pad voor het uitvoerbestand bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map + + + + ExportLibraryDialog + + + Output folder : + Uitvoermap : + + + + Create + Aanmaken + + + + Cancel + Annuleren + + + + Create covers package + Aanmaken omslag pakket + + + + Problem found while writing + Probleem bij het schrijven + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Het gekozen pad voor het uitvoerbestand bestaat niet of is geen geldig pad. Controleer of u schrijftoegang hebt tot deze map + + + + Destination directory + Doeldirectory + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + CRC-fout op pagina (%1): sommige pagina's worden niet correct weergegeven + + + + Unknown error opening the file + Onbekende fout bij het openen van het bestand + + + + 7z not found + 7Z Archiefbestand niet gevonden + + + + Format not supported + Formaat niet ondersteund + + + + GoToDialog + + + Page : + Pagina : + + + + Go To + Ga Naar + + + + Cancel + Annuleren + + + + + Total pages : + Totaal aantal pagina's : + + + + Go to... + Ga naar... + + + + GoToFlowToolBar + + + Page : + Pagina : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Toon informatie + + + HelpAboutDialog - - Level - + + About + Over - - Message - + + Help + Hulp + + + + System info + Systeeminformatie + + + + ImportComicsInfoDialog + + + Import comics info + Strip info Importeren + + + + Info database location : + Info database locatie : + + + + Import + Importeren + + + + Cancel + Annuleren + + + + Comics info file (*.ydb) + Strips info bestand ( * .ydb) + + + + ImportLibraryDialog + + + Library Name : + Bibliotheek Naam : + + + + Package location : + Arrangement locatie : + + + + Destination folder : + Doelmap: + + + + Unpack + Uitpakken + + + + Cancel + Annuleren + + + + Extract a catalog + Een catalogus uitpakken + + + + Compresed library covers (*.clc) + Compresed omslag- bibliotheek ( * .clc) + + + + ImportWidget + + + stop + Stoppen + + + + Some of the comics being added... + Enkele strips zijn toegevoegd ... + + + + Importing comics + Strips importeren + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <P>YACReaderLibrary maak nu een nieuwe bibliotheek. < /p> <p>Een bibliotheek aanmaken kan enkele minuten duren. U kunt het proces stoppen en de bibliotheek later voltooien. < /p> + + + + Updating the library + Actualisering van de bibliotheek + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <P>De huidige bibliotheek wordt bijgewerkt. Voor snellere updates, update uw bibliotheken regelmatig. < /p> <p>u kunt het proces stoppen om later bij te werken. < /p> + + + + Upgrading the library + Het upgraden van de bibliotheek + + + + <p>The current library is being upgraded, please wait.</p> + <p>De huidige bibliotheek wordt geüpgraded. Een ogenblik geduld.</p> + + + + Scanning the library + De bibliotheek scannen + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>De huidige bibliotheek wordt gescand op oudere XML-metadata-informatie.</p><p>Dit is slechts één keer nodig en alleen als de bibliotheek is ingepakt met YACReaderLibrary 9.8.2 of eerder.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Bibliotheek + + + + + + comic + grappig + + + + + + manga + Manga + + + + + + western manga (left to right) + westerse manga (van links naar rechts) + + + + + + web comic + web-strip + + + + + + 4koma (top to botom) + 4koma (van boven naar beneden) + + + + + + + Set type + Soort instellen + + + + Library + Bibliotheek + + + + Folder + Map + + + + Comic + Grappig + + + + Upgrade failed + Upgrade mislukt + + + + There were errors during library upgrade in: + Er zijn fouten opgetreden tijdens de bibliotheekupgrade in: + + + + Update needed + Bijwerken is nodig + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Deze bibliotheek is gemaakt met een vorige versie van YACReaderLibrary. Het moet worden bijgewerkt. Nu bijwerken? + + + + Download new version + Nieuwe versie ophalen + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Deze bibliotheek is gemaakt met een nieuwere versie van YACReaderLibrary. Download de nieuwe versie? + + + + Library not available + Bibliotheek niet beschikbaar + + + + Library '%1' is no longer available. Do you want to remove it? + Bibliotheek ' %1' is niet langer beschikbaar. Wilt u het verwijderen? + + + + Old library + Oude Bibliotheek + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Bibliotheek ' %1' is gemaakt met een oudere versie van YACReaderLibrary. Zij moet opnieuw worden aangemaakt. Wilt u de bibliotheek nu aanmaken? + + + + + Copying comics... + Strips kopiëren... + + + + + Moving comics... + Strips verplaatsen... + + + + Add new folder + Nieuwe map toevoegen + + + + Folder name: + Mapnaam: + + + + No folder selected + Geen map geselecteerd + + + + Please, select a folder first + Selecteer eerst een map + + + + Error in path + Fout in pad + + + + There was an error accessing the folder's path + Er is een fout opgetreden bij het verkrijgen van toegang tot het pad van de map + + + + Delete folder + Map verwijderen + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + De geselecteerde map en de volledige inhoud ervan worden van uw schijf verwijderd. Weet je het zeker? + + + + + Unable to delete + Kan niet verwijderen + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Er is een probleem opgetreden bij het verwijderen van de geselecteerde mappen. Controleer of er schrijfrechten zijn en zorg ervoor dat alle toepassingen deze mappen of een van de daarin opgenomen bestanden gebruiken. + + + + Add new reading lists + Voeg nieuwe leeslijsten toe + + + + + List name: + Lijstnaam: + + + + Delete list/label + Lijst/label verwijderen + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Het geselecteerde item wordt verwijderd, uw strips of mappen worden NIET van uw schijf verwijderd. Weet je het zeker? + + + + Rename list name + Hernoem de lijstnaam + + + + Open folder... + Map openen ... + + + + Update folder + Map bijwerken + + + + Rescan library for XML info + Bibliotheek opnieuw scannen op XML-info + + + + Set as uncompleted + Ingesteld als onvoltooid + + + + Set as completed + Instellen als voltooid + + + + Set as read + Instellen als gelezen + + + + + Set as unread + Instellen als ongelezen + + + + Set custom cover + Aangepaste omslag instellen + + + + Delete custom cover + Aangepaste omslag verwijderen + + + + Save covers + Bewaar hoesjes + + + + You are adding too many libraries. + U voegt te veel bibliotheken toe. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + U voegt te veel bibliotheken toe. + +Je hebt waarschijnlijk maar één bibliotheek nodig in je stripmap op het hoogste niveau. Je kunt door alle submappen bladeren met behulp van het mappengedeelte in de linkerzijbalk. + +YACReaderLibrary zal u er niet van weerhouden om meer bibliotheken te creëren, maar u moet het aantal bibliotheken laag houden. + + + + + YACReader not found + YACReader niet gevonden + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader niet gevonden. YACReader moet in dezelfde map worden geïnstalleerd als YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader niet gevonden. Er is mogelijk een probleem met uw YACReader-installatie. + + + + Error + Fout + + + + Error opening comic with third party reader. + Fout bij het openen van een strip met een lezer van een derde partij. + + + + Library not found + Bibliotheek niet gevonden + + + + The selected folder doesn't contain any library. + De geselecteerde map bevat geen bibliotheek. + + + + Are you sure? + Weet u het zeker? + + + + Do you want remove + Wilt u verwijderen + + + + library? + Bibliotheek? + + + + Remove and delete metadata + Verwijder metagegevens + + + + Library info + Bibliotheekinformatie + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Er is een probleem opgetreden bij het verwijderen van de geselecteerde strips. Controleer of er schrijfrechten zijn voor de geselecteerde bestanden of de map waarin deze zich bevinden. + + + + Assign comics numbers + Wijs stripnummers toe + + + + Assign numbers starting in: + Nummers toewijzen beginnend met: + + + + Invalid image + Ongeldige afbeelding + + + + The selected file is not a valid image. + Het geselecteerde bestand is geen geldige afbeelding. + + + + Error saving cover + Fout bij opslaan van dekking + + + + There was an error saving the cover image. + Er is een fout opgetreden bij het opslaan van de omslagafbeelding. + + + + Error creating the library + Fout bij aanmaken Bibliotheek + + + + Error updating the library + Fout bij bijwerken Bibliotheek + + + + Error opening the library + Fout bij openen Bibliotheek + + + + Delete comics + Strips verwijderen + + + + All the selected comics will be deleted from your disk. Are you sure? + Alle geselecteerde strips worden verwijderd van uw schijf. Weet u het zeker? + + + + Remove comics + Verwijder strips + + + + Comics will only be deleted from the current label/list. Are you sure? + Strips worden alleen verwijderd van het huidige label/de huidige lijst. Weet je het zeker? + + + + Library name already exists + Bibliotheek naam bestaat al + + + + There is another library with the name '%1'. + Er is al een bibliotheek met de naam ' %1 '. + + + + LibraryWindowActions + + + Create a new library + Maak een nieuwe Bibliotheek + + + + Open an existing library + Open een bestaande Bibliotheek + + + + + Export comics info + Strip info exporteren + + + + + Import comics info + Strip info Importeren + + + + Pack covers + Inpakken strip voorbladen + + + + Pack the covers of the selected library + Inpakken alle strip voorbladen van de geselecteerde Bibliotheek + + + + Unpack covers + Uitpakken voorbladen + + + + Unpack a catalog + Uitpaken van een catalogus + + + + Update library + Bibliotheek bijwerken + + + + Update current library + Huidige Bibliotheek bijwerken + + + + Rename library + Bibliotheek hernoemen + + + + Rename current library + Huidige Bibliotheek hernoemen + + + + Remove library + Bibliotheek verwijderen + + + + Remove current library from your collection + De huidige Bibliotheek verwijderen uit uw verzameling + + + + Rescan library for XML info + Bibliotheek opnieuw scannen op XML-info + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Probeert XML-informatie te vinden die is ingebed in stripbestanden. U hoeft dit alleen te doen als de bibliotheek is gemaakt met versie 9.8.2 of eerdere versies of als u software van derden gebruikt om XML-informatie in de bestanden in te sluiten. + + + + Show library info + Bibliotheekinfo tonen + + + + Show information about the current library + Toon informatie over de huidige bibliotheek + + + + Open current comic + Huidige strip openen + + + + Open current comic on YACReader + Huidige strip openen in YACReader + + + + Save selected covers to... + Geselecteerde omslagen opslaan in... + + + + Save covers of the selected comics as JPG files + Sla covers van de geselecteerde strips op als JPG-bestanden + + + + + Set as read + Instellen als gelezen + + + + Set comic as read + Strip Instellen als gelezen + + + + + Set as unread + Instellen als ongelezen + + + + Set comic as unread + Strip Instellen als ongelezen + + + + + manga + Manga + + + + Set issue as manga + Stel het probleem in als manga + + + + + comic + grappig + + + + Set issue as normal + Stel het probleem in als normaal + + + + western manga + westerse manga + + + + Set issue as western manga + Stel het probleem in als westerse manga + + + + + web comic + web-strip + + + + Set issue as web comic + Stel het probleem in als webstrip + + + + + yonkoma + yokoma + + + + Set issue as yonkoma + Stel het probleem in als yonkoma + + + + Show/Hide marks + Toon/Verberg markeringen + + + + Show or hide read marks + Toon of verberg leesmarkeringen + + + + Show/Hide recent indicator + Recente indicator tonen/verbergen + + + + Show or hide recent indicator + Toon of verberg recente indicator + + + + + Fullscreen mode on/off + Volledig scherm modus aan/of + + + + Help, About YACReader + Help, Over YACReader + + + + Add new folder + Nieuwe map toevoegen + + + + Add new folder to the current library + Voeg een nieuwe map toe aan de huidige bibliotheek + + + + Delete folder + Map verwijderen + + + + Delete current folder from disk + Verwijder de huidige map van schijf + + + + Select root node + Selecteer de hoofd categorie + + + + Expand all nodes + Alle categorieën uitklappen + + + + Collapse all nodes + Vouw alle knooppunten samen + + + + Show options dialog + Toon opties dialoog + + + + Show comics server options dialog + Toon strips-server opties dialoog + + + + + Change between comics views + Wisselen tussen stripweergaven + + + + Open folder... + Map openen ... + + + + Set as uncompleted + Ingesteld als onvoltooid + + + + Set as completed + Instellen als voltooid + + + + Set custom cover + Aangepaste omslag instellen + + + + Delete custom cover + Aangepaste omslag verwijderen + + + + western manga (left to right) + westerse manga (van links naar rechts) + + + + Open containing folder... + Open map ... + + + + Reset comic rating + Stripbeoordeling opnieuw instellen + + + + Select all comics + Selecteer alle strips + + + + Edit + Bewerken + + + + Assign current order to comics + Wijs de huidige volgorde toe aan strips + + + + Update cover + Strip omslagen bijwerken + + + + Delete selected comics + Geselecteerde strips verwijderen + + + + Delete metadata from selected comics + Verwijder metadata uit geselecteerde strips + + + + Download tags from Comic Vine + Tags downloaden van Comic Vine + + + + Focus search line + Focus zoeklijn + + + + Focus comics view + Focus stripweergave + + + + Edit shortcuts + Snelkoppelingen bewerken + + + + &Quit + &Afsluiten + + + + Update folder + Map bijwerken + + + + Update current folder + Werk de huidige map bij + + + + Scan legacy XML metadata + Scan oudere XML-metagegevens + + + + Add new reading list + Nieuwe leeslijst toevoegen + + + + Add a new reading list to the current library + Voeg een nieuwe leeslijst toe aan de huidige bibliotheek + + + + Remove reading list + Leeslijst verwijderen + + + + Remove current reading list from the library + Verwijder de huidige leeslijst uit de bibliotheek + + + + Add new label + Nieuw etiket toevoegen + + + + Add a new label to this library + Voeg een nieuw label toe aan deze bibliotheek + + + + Rename selected list + Hernoem de geselecteerde lijst + + + + Rename any selected labels or lists + Hernoem alle geselecteerde labels of lijsten + + + + Add to... + Toevoegen aan... + + + + Favorites + Favorieten + + + + Add selected comics to favorites list + Voeg geselecteerde strips toe aan de favorietenlijst + + + + LocalComicListModel + + + file name + bestandsnaam + + + + NoLibrariesWidget + + + You don't have any libraries yet + Je hebt geen nog libraries + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <P>u kunt een bibliotheek maken in een willekeurige map, YACReaderLibrary importeert alle strips en mappen uit deze map. Alle bibliotheek aangemaakt in het verleden kan je openen. < /p> <p>vergeet niet dat u YACReader kan gebruiken als stand-alone applicatie voor het lezen van de strips op de computer. < /p> + + + + create your first library + Maak uw eerste bibliotheek + + + + add an existing one + voeg een bestaande bibliotheek toe + + + + NoSearchResultsWidget + + + No results + Geen resultaten + + + + OptionsDialog + + + + General + Algemeen + + + + + Libraries + Bibliotheken + + + + Comic Flow + Comic Flow + + + + Grid view + Rasterweergave + + + + + Appearance + Verschijning + + + + + Options + Opties + + + + + Language + Taal + + + + + Application language + Applicatietaal + + + + + System default + Standaard van het systeem + + + + Tray icon settings (experimental) + Instellingen voor ladepictogram (experimenteel) + + + + Close to tray + Dicht bij lade + + + + Start into the system tray + Begin in het systeemvak + + + + Edit Comic Vine API key + Bewerk de Comic Vine API-sleutel + + + + Comic Vine API key + Comic Vine API-sleutel + + + + ComicInfo.xml legacy support + ComicInfo.xml verouderde ondersteuning + + + + Import metadata from ComicInfo.xml when adding new comics + Importeer metagegevens uit ComicInfo.xml wanneer u nieuwe strips toevoegt + + + + Consider 'recent' items added or updated since X days ago + Overweeg 'recente' items die sinds X dagen geleden zijn toegevoegd of bijgewerkt + + + + Third party reader + Lezer van derden + + + + Write {comic_file_path} where the path should go in the command + Schrijf {comic_file_path} waar het pad naartoe moet in de opdracht + + + + + Clear + Duidelijk + + + + Update libraries at startup + Update bibliotheken bij het opstarten + + + + Try to detect changes automatically + Probeer wijzigingen automatisch te detecteren + + + + Update libraries periodically + Update bibliotheken regelmatig + + + + Interval: + Tijdsinterval: + + + + 30 minutes + 30 minuten + + + + 1 hour + 1 uur + + + + 2 hours + 2 uur + + + + 4 hours + 4 uur + + + + 8 hours + 8 uur + + + + 12 hours + 12 uur + + + + daily + dagelijks + + + + Update libraries at certain time + Update bibliotheken op een bepaald tijdstip + + + + Time: + Tijd: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + WAARSCHUWING! Tijdens bibliotheekupdates is schrijven naar de database uitgeschakeld! +Plan geen updates terwijl u de app mogelijk actief gebruikt. +During automatic updates the app will block some of the actions until the update is finished. +Om een ​​automatische update te stoppen, tikt u op de laadindicator naast de titel van Bibliotheken. + + + + Modifications detection + Detectie van wijzigingen + + + + Compare the modified date of files when updating a library (not recommended) + Vergelijk de wijzigingsdatum van bestanden bij het updaten van een bibliotheek (niet aanbevolen) + + + + Enable background image + Achtergrondafbeelding inschakelen + + + + Opacity level + Dekkingsniveau + + + + Blur level + Vervagingsniveau + + + + Use selected comic cover as background + Gebruik geselecteerde stripomslag als achtergrond + + + + Restore defautls + Standaardwaarden herstellen + + + + Background + Achtergrond + + + + Display continue reading banner + Toon de banner voor verder lezen + + + + Display current comic banner + Toon huidige stripbanner + + + + Continue reading + Lees verder + + + + My comics path + Pad naar mijn strips + + + + Display + Weergave + + + + Show time in current page information label + Toon de tijd in het informatielabel van de huidige pagina + + + + "Go to flow" size + Grootte van "Ga naar Comic Flow" + + + + Background color + Achtergrondkleur + + + + Choose + Kies + + + + Scroll behaviour + Scrollgedrag + + + + Disable scroll animations and smooth scrolling + Schakel scrollanimaties en soepel scrollen uit + + + + Do not turn page using scroll + Sla de pagina niet om met scrollen + + + + Use single scroll step to turn page + Gebruik een enkele scrollstap om de pagina om te slaan + + + + Mouse mode + Muismodus + + + + Only Back/Forward buttons can turn pages + Alleen de knoppen Terug/Vooruit kunnen pagina's omslaan + + + + Use the Left/Right buttons to turn pages. + Gebruik de knoppen Links/Rechts om pagina's om te slaan. + + + + Click left or right half of the screen to turn pages. + Klik op de linker- of rechterhelft van het scherm om pagina's om te slaan. + + + + Quick Navigation Mode + Snelle navigatiemodus + + + + Disable mouse over activation + Schakel muis-over-activering uit + + + + Brightness + Helderheid + + + + Contrast + Contrastwaarde + + + + Gamma + Gammawaarde + + + + Reset + Standaardwaarden terugzetten + + + + Image options + Afbeelding opties + + + + Fit options + Pas opties + + + + Enlarge images to fit width/height + Vergroot afbeeldingen zodat ze in de breedte/hoogte passen + + + + Double Page options + Opties voor dubbele pagina's + + + + Show covers as single page + Toon omslagen als enkele pagina + + + + Scaling + Schalen + + + + Scaling method + Schaalmethode + + + + Nearest (fast, low quality) + Dichtstbijzijnde (snel, lage kwaliteit) + + + + Bilinear + Bilineair + + + + Lanczos (better quality) + Lanczos (betere kwaliteit) + + + + Page Flow + Omslagbrowser + + + + Image adjustment + Beeldaanpassing + + + + + Restart is needed + Herstart is nodig + + + + Comics directory + Strips map + + + + PropertiesDialog + + + General info + Algemene Info + + + + Plot + Verhaal + + + + Authors + Auteurs + + + + Publishing + Uitgever + + + + Notes + Opmerkingen + + + + Cover page + Omslag + + + + Load previous page as cover + Laad de vorige pagina als omslag + + + + Load next page as cover + Laad de volgende pagina als omslag + + + + Reset cover to the default image + Zet de omslag terug naar de standaardafbeelding + + + + Load custom cover image + Aangepaste omslagafbeelding laden + + + + Series: + Serie: + + + + Title: + Titel: + + + + + + of: + van: + + + + Issue number: + Ids: + + + + Volume: + Inhoud: + + + + Arc number: + Boognummer: + + + + Story arc: + Verhaallijn: + + + + alt. number: + alt. nummer: + + + + Alternate series: + Alternatieve serie: + + + + Series Group: + Seriegroep: + + + + Genre: + Genretype: + + + + Size: + Grootte(MB): + + + + Writer(s): + Schrijver(s): + + + + Penciller(s): + Tekenaar(s): + + + + Inker(s): + Inkt(en): + + + + Colorist(s): + Inkleurder(s): + + + + Letterer(s): + Letterzetter(s): + + + + Cover Artist(s): + Omslag ontwikkelaar(s): + + + + Editor(s): + Redacteur(en): + + + + Imprint: + Opdruk: + + + + Day: + Dag: + + + + Month: + Maand: + + + + Year: + Jaar: + + + + Publisher: + Uitgever: + + + + Format: + Formaat: + + + + Color/BW: + Kleur/ZW: + + + + Age rating: + Leeftijdsbeperking: + + + + Type: + Soort: + + + + Language (ISO): + Taal (ISO): + + + + Synopsis: + Samenvatting: + + + + Characters: + Personages: + + + + Teams: + Ploegen: + + + + Locations: + Locaties: + + + + Main character or team: + Hoofdpersoon of team: + + + + Review: + Beoordeling: + + + + Notes: + Opmerkingen: + + + + Tags: + Labels: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine-link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> bekijken </a> + + + + Not found + Niet gevonden + + + + Comic not found. You should update your library. + Strip niet gevonden. U moet uw bibliotheek.bijwerken. + + + + Edit comic information + Strip informatie bijwerken + + + + Edit selected comics information + Geselecteerde strip informatie bijwerken + + + + Invalid cover + Ongeldige dekking + + + + The image is invalid. + De afbeelding is ongeldig. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer is de headless (geen gui) versie van YACReaderLibrary. + +Deze applicatie ondersteunt permanente instellingen. Om ze in te stellen, bewerk dit bestand %1 +Voor meer informatie over de beschikbare instellingen kunt u de documentatie raadplegen op https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + Spoor + + + + Debug + Foutopsporing + + + + Info + Informatie + + + + Warning + Waarschuwing + + + + Error + Fout + + + + Fatal + Fataal + + + + Select custom cover + Selecteer een aangepaste omslag + + + + Images (%1) + Afbeeldingen (%1) + + + + 7z lib not found + 7z-lib niet gevonden + + + + unable to load 7z lib from ./utils + kan 7z lib niet laden vanuit ./utils + + + + The file could not be read or is not valid JSON. + Het bestand kan niet worden gelezen of is geen geldige JSON. + + + + This theme is for %1, not %2. + Dit thema is voor %1, niet voor %2. + + + + Libraries + Bibliotheken + + + + Folders + Mappen + + + + Reading Lists + Leeslijsten + + + + RenameLibraryDialog + + + New Library Name : + Nieuwe Bibliotheek Naam : + + + + Rename + Hernoem + + + + Cancel + Annuleren + + + + Rename current library + Huidige Bibliotheek hernoemen + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Aantal gevonden volumes: %1 + + + + + page %1 of %2 + pagina %1 van %2 + + + + Number of %1 found : %2 + Aantal %1 gevonden: %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Geef wat aanvullende informatie op voor deze strip. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Gebruik exacte matchzoekopdrachten. Schakel dit uit als u volumes wilt vinden die overeenkomen met enkele woorden in de naam. + + + + SearchVolume + + + Please provide some additional information. + Geef alstublieft wat aanvullende informatie op. + + + + Series: + Serie: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Gebruik exacte matchzoekopdrachten. Schakel dit uit als u volumes wilt vinden die overeenkomen met enkele woorden in de naam. + + + + SelectComic + + + Please, select the right comic info. + Selecteer de juiste stripinformatie. + + + + comics + strips + + + + loading cover + laaddeksel + + + + loading description + beschrijving laden + + + + comic description unavailable + komische beschrijving niet beschikbaar + + + + SelectVolume + + + Please, select the right series for your comic. + Selecteer de juiste serie voor jouw strip. + + + + Filter: + Selectiefilter: + + + + volumes + delen + + + + Nothing found, clear the filter if any. + Niets gevonden. Wis eventueel het filter. + + + + loading cover + laaddeksel + + + + loading description + beschrijving laden + + + + volume description unavailable + volumebeschrijving niet beschikbaar + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Je probeert informatie voor verschillende strips tegelijk te krijgen. Maken ze deel uit van dezelfde serie? + + + + yes + Ja + + + + no + neen + + + + ServerConfigDialog + + + set port + Poort instellen + + + + Server connectivity information + Informatie over serverconnectiviteit + + + + Scan it! + Scan het! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader is beschikbaar voor iOS- en Android-apparaten.<br/>Ontdek het voor <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> of <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Kies een IP-adres + + + + Port + Poort + + + + enable the server + De server instellen + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Sorteer de lijst met strips aan de linkerkant totdat deze overeenkomt met de informatie over de strips. + + + + sort comics to match comic information + sorteer strips zodat ze overeenkomen met stripinformatie + + + + issues + problemen + + + + remove selected comics + verwijder geselecteerde strips + + + + restore all removed comics + herstel alle verwijderde strips + + + + ThemeEditorDialog + + + Theme Editor + Thema-editor + + + + + + + + + + + - + - + + + + i + ? + + + + Expand all + Alles uitvouwen + + + + Collapse all + Alles samenvouwen + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Houd ingedrukt om de geselecteerde waarde in de gebruikersinterface te laten knipperen (magenta / geschakeld / 0↔10). Loslaten herstelt het origineel. + + + + Search… + Zoekopdracht… + + + + Light + Licht + + + + Dark + Donker + + + + ID: + Identiteitskaart: + + + + Display name: + Weergavenaam: + + + + Variant: + Variatie: + + + + Theme info + Thema-informatie + + + + Parameter + Instelwaarde + + + + Value + Waarde + + + + Save and apply + Opslaan en toepassen + + + + Export to file... + Exporteren naar bestand... + + + + Load from file... + Laden uit bestand... + + + + Close + Sluiten + + + + Double-click to edit color + Dubbelklik om de kleur te bewerken + + + + + + + + + true + WAAR + + + + + + + false + vals + + + + Double-click to toggle + Dubbelklik om te schakelen + + + + Double-click to edit value + Dubbelklik om de waarde te bewerken + + + + + + Edit: %1 + Bewerken: %1 + + + + Save theme + Thema opslaan + + + + + JSON files (*.json);;All files (*) + JSON-bestanden (*.json);;Alle bestanden (*) + + + + Save failed + Opslaan mislukt + + + + Could not open file for writing: +%1 + Kan bestand niet openen om te schrijven: +%1 + + + + Load theme + Thema laden + + + + + + Load failed + Laden mislukt + + + + Could not open file: +%1 + Kan bestand niet openen: +%1 + + + + Invalid JSON: +%1 + Ongeldige JSON: +%1 + + + + Expected a JSON object. + Er werd een JSON-object verwacht. + + + + TitleHeader + + + SEARCH + ZOEKOPDRACHT + + + + UpdateLibraryDialog + + + Updating.... + Bijwerken.... + + + + Cancel + Annuleren + + + + Update library + Bibliotheek bijwerken + + + + Viewer + + + + Press 'O' to open comic. + Druk 'O' om een strip te openen. + + + + Not found + Niet gevonden + + + + Comic not found + Strip niet gevonden + + + + Error opening comic + Fout bij openen strip + + + + CRC Error + CRC-fout + + + + Loading...please wait! + Inladen...even wachten! + + + + Page not available! + Pagina niet beschikbaar! + + + + Cover! + Omslag! + + + + Last page! + Laatste pagina! + + + + VolumeComicsModel + + + title + titel + + + + VolumesModel + + + year + jaar + + + + issues + problemen + + + + publisher + uitgever + + + + YACReader3DFlowConfigWidget + + + Presets: + Voorinstellingen: + + + + Classic look + Klassiek + + + + Stripe look + Brede band + + + + Overlapped Stripe look + Overlappende band + + + + Modern look + Modern + + + + Roulette look + Roulette + + + + Show advanced settings + Toon geavanceerde instellingen + + + + Custom: + Aangepast: + + + + View angle + Kijkhoek + + + + Position + Positie + + + + Cover gap + Ruimte tss Omslag + + + + Central gap + Centrale ruimte + + + + Zoom + Vergroting + + + + Y offset + Y-positie + + + + Z offset + Z- positie + + + + Cover Angle + Omslag hoek + + + + Visibility + Zichtbaarheid + + + + Light + Licht + + + + Max angle + Maximale hoek + + + + Low Performance + Lage Prestaties + + + + High Performance + Hoge Prestaties + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Gebruik VSync (verbetering van de beeldkwaliteit in de modus volledig scherm, slechtere prestatie) + + + + Performance: + Prestatie: + + + + YACReader::MainWindowViewer + + + &Open + &Openen + + + + Open a comic + Open een strip + + + + New instance + Nieuw exemplaar + + + + Open Folder + Map Openen + + + + Open image folder + Open afbeeldings map + + + + Open latest comic + Open de nieuwste strip + + + + Open the latest comic opened in the previous reading session + Open de nieuwste strip die in de vorige leessessie is geopend + + + + Clear + Duidelijk + + + + Clear open recent list + Wis geopende recente lijst + + + + Save + Bewaar + + + + + Save current page + Bewaren huidige pagina + + + + Previous Comic + Vorige Strip + + + + + + Open previous comic + Open de vorige strip + + + + Next Comic + Volgende Strip + + + + + + Open next comic + Open volgende strip + + + + &Previous + &Vorige + + + + + + Go to previous page + Ga naar de vorige pagina + + + + &Next + &Volgende + + + + + + Go to next page + Ga naar de volgende pagina + + + + Fit Height + Geschikte hoogte + + + + Fit image to height + Afbeelding aanpassen aan hoogte + + + + Fit Width + Vensterbreedte aanpassen + + + + Fit image to width + Afbeelding aanpassen aan breedte + + + + Show full size + Volledig Scherm + + + + Fit to page + Aanpassen aan pagina + + + + Continuous scroll + Continu scrollen + + + + Switch to continuous scroll mode + Schakel over naar de continue scrollmodus + + + + Reset zoom + Zoom opnieuw instellen + + + + Show zoom slider + Zoomschuifregelaar tonen + + + + Zoom+ + Inzoomen + + + + Zoom- + Uitzoomen + + + + Rotate image to the left + Links omdraaien + + + + Rotate image to the right + Rechts omdraaien + + + + Double page mode + Dubbele bladzijde modus + + + + Switch to double page mode + Naar dubbele bladzijde modus + + + + Double page manga mode + Manga-modus met dubbele pagina + + + + Reverse reading order in double page mode + Omgekeerde leesvolgorde in dubbele paginamodus + + + + Go To + Ga Naar + + + + Go to page ... + Ga naar bladzijde ... + + + + Options + Opties + + + + YACReader options + YACReader opties + + + + + Help + Hulp + + + + Help, About YACReader + Help, Over YACReader + + + + Magnifying glass + Vergrootglas + + + + Switch Magnifying glass + Overschakelen naar Vergrootglas + + + + Set bookmark + Bladwijzer instellen + + + + Set a bookmark on the current page + Een bladwijzer toevoegen aan de huidige pagina + + + + Show bookmarks + Bladwijzers weergeven + + + + Show the bookmarks of the current comic + Toon de bladwijzers van de huidige strip + + + + Show keyboard shortcuts + Toon de sneltoetsen + + + + Show Info + Info tonen + + + + Close + Sluiten + + + + Show Dictionary + Woordenlijst weergeven + + + + Show go to flow + "Ga naar Comic Flow" tonen + + + + Edit shortcuts + Snelkoppelingen bewerken + + + + &File + &Bestand + + + + + Open recent + Recent geopend + + + + File + Bestand + + + + Edit + Bewerken + + + + View + Weergave + + + + Go + Gaan + + + + Window + Raam + + + + + + Open Comic + Open een Strip + + + + + + Comic files + Strip bestanden + + + + Open folder + Open een Map + + + + page_%1.jpg + pagina_%1.jpg + + + + Image files (*.jpg) + Afbeelding bestanden (*.jpg) + + + + + Comics + Strips + + + + + General + Algemeen + + + + + Magnifiying glass + Vergrootglas + + + + + Page adjustement + Pagina-aanpassing + + + + + Reading + Lezing + + + + Toggle fullscreen mode + Schakel de modus Volledig scherm in + + + + Hide/show toolbar + Werkbalk verbergen/tonen + + + + Size up magnifying glass + Vergrootglas vergroten + + + + Size down magnifying glass + Vergrootglas kleiner maken + + + + Zoom in magnifying glass + Zoom in vergrootglas + + + + Zoom out magnifying glass + Uitzoomen vergrootglas + + + + Reset magnifying glass + Vergrootglas opnieuw instellen + + + + Toggle between fit to width and fit to height + Schakel tussen Aanpassen aan breedte en Aanpassen aan hoogte + + + + Autoscroll down + Automatisch naar beneden scrollen + + + + Autoscroll up + Automatisch omhoog scrollen + + + + Autoscroll forward, horizontal first + Automatisch vooruit scrollen, eerst horizontaal + + + + Autoscroll backward, horizontal first + Automatisch achteruit scrollen, eerst horizontaal + + + + Autoscroll forward, vertical first + Automatisch vooruit scrollen, eerst verticaal + + + + Autoscroll backward, vertical first + Automatisch achteruit scrollen, eerst verticaal + + + + Move down + Ga naar beneden + + + + Move up + Ga omhoog + + + + Move left + Ga naar links + + + + Move right + Ga naar rechts + + + + Go to the first page + Ga naar de eerste pagina + + + + Go to the last page + Ga naar de laatste pagina + + + + Offset double page to the left + Dubbele pagina naar links verschoven + + + + Offset double page to the right + Offset dubbele pagina naar rechts + + + + There is a new version available + Er is een nieuwe versie beschikbaar + + + + Do you want to download the new version? + Wilt u de nieuwe versie downloaden? + + + + Remind me in 14 days + Herinner mij er over 14 dagen aan + + + + Not now + Niet nu + + + + YACReader::TrayIconController + + + &Restore + &Herstellen + + + + Systray + Systeemvak + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary blijft actief in het systeemvak. Om het programma te beëindigen, kiest u <b>Afsluiten</b> in het contextmenu van het systeemvakpictogram. + + + + YACReaderFieldEdit + + + + Click to overwrite + Klik hier om te overschrijven + + + + Restore to default + Standaardwaarden herstellen + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Klik hier om te overschrijven + + + + Restore to default + Standaardwaarden herstellen + + + + YACReaderOptionsDialog + + + Save + Bewaar + + + + Cancel + Annuleren + + + + Edit shortcuts + Snelkoppelingen bewerken + + + + Shortcuts + Snelkoppelingen + + + + YACReaderSearchLineEdit + + + type to search + typ om te zoeken + + + + YACReaderSlider + + + Reset + Standaardwaarden terugzetten - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + YACReader-vertaler - - &Resume - + + + Translation + Vertaling - - Save log - + + clear + duidelijk - - Log file (*.log) - + + Service not available + Dienst niet beschikbaar diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_pt.ts b/YACReaderLibraryServer/yacreaderlibraryserver_pt.ts index a506a2a66..cfba41b35 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_pt.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_pt.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Nenhum + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Nome da etiqueta: - - 7z not found - + + Choose a color: + Escolha uma cor: - - Format not supported - + + accept + aceitar + + + + cancel + cancelar - LogWindow + AddLibraryDialog + + + Comics folder : + Pasta dos quadrinhos : + + + + Library name : + Nome da Biblioteca : + - - Log window - + + Add + Adicionar - - &Pause - + + Cancel + Cancelar - - &Save - + + Add an existing library + Adicionar uma biblioteca existente + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Antes de se conectar ao Comic Vine, você precisa de sua própria chave de API. Por favor, ganhe um <a href="http://www.comicvine.com/api/">aqui</a> grátis - - &Copy - + + Paste here your Comic Vine API key + Cole aqui sua chave API do Comic Vine - - Level: - + + Accept + Aceitar - - &Auto scroll - + + Cancel + Cancelar - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Esquema de cores + + + + System + Sistema + + + + Light + Luz + + + + Dark + Escuro + + + + Custom + Personalizado + + + + Remove + Remover + + + + Remove this user-imported theme + Remova este tema importado pelo usuário + + + + Light: + Luz: + + + + Dark: + Escuro: + + + + Custom: + Personalizado: + + + + Import theme... + Importar tema... + + + + Theme + Tema + + + + Theme editor + Editor de tema + + + + Open Theme Editor... + Abra o Editor de Tema... + + + + Theme editor error + Erro no editor de tema + + + + The current theme JSON could not be loaded. + O tema atual JSON não pôde ser carregado. + + + + Import theme + Importar tema + + + + JSON files (*.json);;All files (*) + Arquivos JSON (*.json);;Todos os arquivos (*) + + + + Could not import theme from: +%1 + Não foi possível importar o tema de: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + Não foi possível importar o tema de: +%1 + +%2 + + + + Import failed + Falha na importação - QObject + BookmarksDialog - - Trace - + + Lastest Page + Última Página - - Debug - + + Close + Fechar - - Info - + + Click on any image to go to the bookmark + Clique em qualquer imagem para ir para o marcador - - Warning - + + + Loading... + Carregando... + + + ClassicComicsView - - Error - + + Hide comic flow + Ocultar Comic Flow + + + + ComicModel + + + yes + sim - - Fatal - + + no + não + + + + Title + Título + + + + File Name + Nome do arquivo + + + + Pages + Páginas + + + + Size + Tamanho + + + + Read + Ler + + + + Current Page + Página atual + + + + Publication Date + Data de publicação + + + + Rating + Avaliação + + + + Series + Série + + + + Volume + Tomo + + + + Story Arc + Arco de história + + + + ComicVineDialog + + + skip + pular + + + + back + voltar + + + + next + próximo + + + + search + procurar + + + + close + fechar + + + + + comic %1 of %2 - %3 + história em quadrinhos %1 de %2 - %3 + + + + + + Looking for volume... + Procurando volume... + + + + %1 comics selected + %1 quadrinhos selecionados + + + + Error connecting to ComicVine + Erro ao conectar-se ao ComicVine + + + + + Retrieving tags for : %1 + Recuperando tags para: %1 + + + + Retrieving volume info... + Recuperando informações de volume... + + + + Looking for comic... + Procurando quadrinhos... + + + + ContinuousPageWidget + + + Loading page %1 + Carregando página %1 + + + + CreateLibraryDialog + + + Comics folder : + Pasta dos quadrinhos : + + + + Library Name : + Nome da Biblioteca : + + + + Create + Criar + + + + Cancel + Cancelar + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Criar uma biblioteca pode levar vários minutos. Você pode interromper o processo e atualizar a biblioteca posteriormente para concluir a tarefa. + + + + Create new library + Criar uma nova biblioteca + + + + Path not found + Caminho não encontrado + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + O caminho selecionado não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta + + + + EditShortcutsDialog + + + Restore defaults + Restaurar padrões + + + + To change a shortcut, double click in the key combination and type the new keys. + Para alterar um atalho, clique duas vezes na combinação de teclas e digite as novas teclas. + + + + Shortcuts settings + Configurações de atalhos + + + + Shortcut in use + Atalho em uso + + + + The shortcut "%1" is already assigned to other function + O atalho "%1" já está atribuído a outra função + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Esta pasta ainda não contém quadrinhos + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Este rótulo ainda não contém quadrinhos + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Esta lista de leitura ainda não contém quadrinhos + + + + EmptySpecialListWidget + + + No favorites + Sem favoritos + + + + You are not reading anything yet, come on!! + Você ainda não está lendo nada, vamos lá!! + + + + There are no recent comics! + Não há quadrinhos recentes! + + + + ExportComicsInfoDialog + + + Output file : + Arquivo de saída: + + + + Create + Criar + + + + Cancel + Cancelar + + + + Export comics info + Exportar informações de quadrinhos + + + + Destination database name + Nome do banco de dados de destino + + + + Problem found while writing + Problema encontrado ao escrever + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + O caminho selecionado para o arquivo de saída não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta + + + + ExportLibraryDialog + + + Output folder : + Pasta de saída : + + + + Create + Criar + + + + Cancel + Cancelar + + + + Create covers package + Criar pacote de capas + + + + Problem found while writing + Problema encontrado ao escrever + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + O caminho selecionado para o arquivo de saída não existe ou não é um caminho válido. Certifique-se de ter acesso de gravação a esta pasta + + + + Destination directory + Diretório de destino + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + Erro CRC na página (%1): algumas páginas não serão exibidas corretamente + + + + Unknown error opening the file + Erro desconhecido ao abrir o arquivo + + + + 7z not found + 7z não encontrado + + + + Format not supported + Formato não suportado + + + + GoToDialog + + + Page : + Página : + + + + Go To + Ir Para + + + + Cancel + Cancelar + + + + + Total pages : + Total de páginas : + + + + Go to... + Ir para... + + + + GoToFlowToolBar + + + Page : + Página : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Mostrar informações + + + HelpAboutDialog - - Level - + + About + Sobre - - Message - + + Help + Ajuda + + + + System info + Informações do sistema + + + + ImportComicsInfoDialog + + + Import comics info + Importar informações de quadrinhos + + + + Info database location : + Localização do banco de dados de informações: + + + + Import + Importar + + + + Cancel + Cancelar + + + + Comics info file (*.ydb) + Arquivo de informações de quadrinhos (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Nome da Biblioteca : + + + + Package location : + Local do pacote : + + + + Destination folder : + Pasta de destino : + + + + Unpack + Desempacotar + + + + Cancel + Cancelar + + + + Extract a catalog + Extrair um catálogo + + + + Compresed library covers (*.clc) + Capas da biblioteca compactada (*.clc) + + + + ImportWidget + + + stop + parar + + + + Some of the comics being added... + Alguns dos quadrinhos sendo adicionados... + + + + Importing comics + Importando quadrinhos + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary está criando uma nova biblioteca.</p><p>A criação de uma biblioteca pode levar vários minutos. Você pode interromper o processo e atualizar a biblioteca posteriormente para concluir a tarefa.</p> + + + + Updating the library + Atualizando a biblioteca + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>A biblioteca atual está sendo atualizada. Para atualizações mais rápidas, atualize suas bibliotecas com frequência.</p><p>Você pode interromper o processo e continuar atualizando esta biblioteca mais tarde.</p> + + + + Upgrading the library + Atualizando a biblioteca + + + + <p>The current library is being upgraded, please wait.</p> + <p>A biblioteca atual está sendo atualizada. Aguarde.</p> + + + + Scanning the library + Digitalizando a biblioteca + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>A biblioteca atual está sendo verificada em busca de informações de metadados XML legados.</p><p>Isso só será necessário uma vez e somente se a biblioteca tiver sido criada com YACReaderLibrary 9.8.2 ou anterior.</p> + + + + LibraryWindow + + + YACReader Library + Biblioteca YACReader + + + + + + comic + cômico + + + + + + manga + mangá + + + + + + western manga (left to right) + mangá ocidental (da esquerda para a direita) + + + + + + web comic + quadrinhos da web + + + + + + 4koma (top to botom) + 4koma (de cima para baixo) + + + + + + + Set type + Definir tipo + + + + Library + Biblioteca + + + + Folder + Pasta + + + + Comic + Quadrinhos + + + + Upgrade failed + Falha na atualização + + + + There were errors during library upgrade in: + Ocorreram erros durante a atualização da biblioteca em: + + + + Update needed + Atualização necessária + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Esta biblioteca foi criada com uma versão anterior do YACReaderLibrary. Ele precisa ser atualizado. Atualizar agora? + + + + Download new version + Baixe a nova versão + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Esta biblioteca foi criada com uma versão mais recente do YACReaderLibrary. Baixe a nova versão agora? + + + + Library not available + Biblioteca não disponível + + + + Library '%1' is no longer available. Do you want to remove it? + A biblioteca '%1' não está mais disponível. Você quer removê-lo? + + + + Old library + Biblioteca antiga + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + A biblioteca '%1' foi criada com uma versão mais antiga do YACReaderLibrary. Deve ser criado novamente. Deseja criar a biblioteca agora? + + + + + Copying comics... + Copiando quadrinhos... + + + + + Moving comics... + Quadrinhos em movimento... + + + + Add new folder + Adicionar nova pasta + + + + Folder name: + Nome da pasta: + + + + No folder selected + Nenhuma pasta selecionada + + + + Please, select a folder first + Por favor, selecione uma pasta primeiro + + + + Error in path + Erro no caminho + + + + There was an error accessing the folder's path + Ocorreu um erro ao acessar o caminho da pasta + + + + Delete folder + Excluir pasta + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + A pasta selecionada e todo o seu conteúdo serão excluídos do disco. Tem certeza? + + + + + Unable to delete + Não foi possível excluir + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Ocorreu um problema ao tentar excluir as pastas selecionadas. Por favor, verifique as permissões de gravação e certifique-se de que algum aplicativo esteja usando essas pastas ou qualquer um dos arquivos contidos. + + + + Add new reading lists + Adicione novas listas de leitura + + + + + List name: + Nome da lista: + + + + Delete list/label + Excluir lista/rótulo + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + O item selecionado será excluído, seus quadrinhos ou pastas NÃO serão excluídos do disco. Tem certeza? + + + + Rename list name + Renomear nome da lista + + + + Open folder... + Abrir pasta... + + + + Update folder + Atualizar pasta + + + + Rescan library for XML info + Digitalizar novamente a biblioteca em busca de informações XML + + + + Set as uncompleted + Definir como incompleto + + + + Set as completed + Definir como concluído + + + + Set as read + Definir como lido + + + + + Set as unread + Definir como não lido + + + + Set custom cover + Definir capa personalizada + + + + Delete custom cover + Excluir capa personalizada + + + + Save covers + Salvar capas + + + + You are adding too many libraries. + Você está adicionando muitas bibliotecas. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Você está adicionando muitas bibliotecas. + +Você provavelmente só precisa de uma biblioteca em sua pasta de quadrinhos de nível superior. Você pode navegar em qualquer subpasta usando a seção de pastas na barra lateral esquerda. + +YACReaderLibrary não impedirá você de criar mais bibliotecas, mas você deve manter o número de bibliotecas baixo. + + + + + YACReader not found + YACReader não encontrado + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader não encontrado. YACReader deve ser instalado na mesma pasta que YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader não encontrado. Pode haver um problema com a instalação do YACReader. + + + + Error + Erro + + + + Error opening comic with third party reader. + Erro ao abrir o quadrinho com leitor de terceiros. + + + + Library not found + Biblioteca não encontrada + + + + The selected folder doesn't contain any library. + A pasta selecionada não contém nenhuma biblioteca. + + + + Are you sure? + Você tem certeza? + + + + Do you want remove + Você deseja remover + + + + library? + biblioteca? + + + + Remove and delete metadata + Remover e excluir metadados + + + + Library info + Informações da biblioteca + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Ocorreu um problema ao tentar excluir os quadrinhos selecionados. Por favor, verifique as permissões de gravação nos arquivos selecionados ou na pasta que os contém. + + + + Assign comics numbers + Atribuir números de quadrinhos + + + + Assign numbers starting in: + Atribua números começando em: + + + + Invalid image + Imagem inválida + + + + The selected file is not a valid image. + O arquivo selecionado não é uma imagem válida. + + + + Error saving cover + Erro ao salvar a capa + + + + There was an error saving the cover image. + Ocorreu um erro ao salvar a imagem da capa. + + + + Error creating the library + Erro ao criar a biblioteca + + + + Error updating the library + Erro ao atualizar a biblioteca + + + + Error opening the library + Erro ao abrir a biblioteca + + + + Delete comics + Excluir quadrinhos + + + + All the selected comics will be deleted from your disk. Are you sure? + Todos os quadrinhos selecionados serão excluídos do seu disco. Tem certeza? + + + + Remove comics + Remover quadrinhos + + + + Comics will only be deleted from the current label/list. Are you sure? + Os quadrinhos serão excluídos apenas do rótulo/lista atual. Tem certeza? + + + + Library name already exists + O nome da biblioteca já existe + + + + There is another library with the name '%1'. + Existe outra biblioteca com o nome '%1'. + + + + LibraryWindowActions + + + Create a new library + Criar uma nova biblioteca + + + + Open an existing library + Abrir uma biblioteca existente + + + + + Export comics info + Exportar informações de quadrinhos + + + + + Import comics info + Importar informações de quadrinhos + + + + Pack covers + Capas de pacote + + + + Pack the covers of the selected library + Pacote de capas da biblioteca selecionada + + + + Unpack covers + Desembale as capas + + + + Unpack a catalog + Desempacotar um catálogo + + + + Update library + Atualizar biblioteca + + + + Update current library + Atualizar biblioteca atual + + + + Rename library + Renomear biblioteca + + + + Rename current library + Renomear biblioteca atual + + + + Remove library + Remover biblioteca + + + + Remove current library from your collection + Remover biblioteca atual da sua coleção + + + + Rescan library for XML info + Digitalizar novamente a biblioteca em busca de informações XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Tenta encontrar informações XML incorporadas em arquivos de quadrinhos. Você só precisa fazer isso se a biblioteca foi criada com versões 9.8.2 ou anteriores ou se você estiver usando software de terceiros para incorporar informações XML nos arquivos. + + + + Show library info + Mostrar informações da biblioteca + + + + Show information about the current library + Mostrar informações sobre a biblioteca atual + + + + Open current comic + Abrir quadrinho atual + + + + Open current comic on YACReader + Abrir quadrinho atual no YACReader + + + + Save selected covers to... + Salvar capas selecionadas em... + + + + Save covers of the selected comics as JPG files + Salve as capas dos quadrinhos selecionados como arquivos JPG + + + + + Set as read + Definir como lido + + + + Set comic as read + Definir quadrinhos como lidos + + + + + Set as unread + Definir como não lido + + + + Set comic as unread + Definir quadrinhos como não lidos + + + + + manga + mangá + + + + Set issue as manga + Definir problema como mangá + + + + + comic + cômico + + + + Set issue as normal + Defina o problema como normal + + + + western manga + mangá ocidental + + + + Set issue as western manga + Definir problema como mangá ocidental + + + + + web comic + quadrinhos da web + + + + Set issue as web comic + Definir o problema como web comic + + + + + yonkoma + tira yonkoma + + + + Set issue as yonkoma + Definir problema como yonkoma + + + + Show/Hide marks + Mostrar/ocultar marcas + + + + Show or hide read marks + Mostrar ou ocultar marcas de leitura + + + + Show/Hide recent indicator + Mostrar/ocultar indicador recente + + + + Show or hide recent indicator + Mostrar ou ocultar indicador recente + + + + + Fullscreen mode on/off + Modo tela cheia ativado/desativado + + + + Help, About YACReader + Ajuda, Sobre o YACReader + + + + Add new folder + Adicionar nova pasta + + + + Add new folder to the current library + Adicionar nova pasta à biblioteca atual + + + + Delete folder + Excluir pasta + + + + Delete current folder from disk + Exclua a pasta atual do disco + + + + Select root node + Selecionar raiz + + + + Expand all nodes + Expandir todos + + + + Collapse all nodes + Recolher todos os nós + + + + Show options dialog + Mostrar opções + + + + Show comics server options dialog + Mostrar caixa de diálogo de opções do servidor de quadrinhos + + + + + Change between comics views + Alterar entre visualizações de quadrinhos + + + + Open folder... + Abrir pasta... + + + + Set as uncompleted + Definir como incompleto + + + + Set as completed + Definir como concluído + + + + Set custom cover + Definir capa personalizada + + + + Delete custom cover + Excluir capa personalizada + + + + western manga (left to right) + mangá ocidental (da esquerda para a direita) + + + + Open containing folder... + Abrir a pasta contendo... + + + + Reset comic rating + Redefinir classificação de quadrinhos + + + + Select all comics + Selecione todos os quadrinhos + + + + Edit + Editar + + + + Assign current order to comics + Atribuir ordem atual aos quadrinhos + + + + Update cover + Atualizar capa + + + + Delete selected comics + Excluir quadrinhos selecionados + + + + Delete metadata from selected comics + Excluir metadados dos quadrinhos selecionados + + + + Download tags from Comic Vine + Baixe tags do Comic Vine + + + + Focus search line + Linha de pesquisa de foco + + + + Focus comics view + Visualização de quadrinhos em foco + + + + Edit shortcuts + Editar atalhos + + + + &Quit + &Qfato + + + + Update folder + Atualizar pasta + + + + Update current folder + Atualizar pasta atual + + + + Scan legacy XML metadata + Digitalize metadados XML legados + + + + Add new reading list + Adicionar nova lista de leitura + + + + Add a new reading list to the current library + Adicione uma nova lista de leitura à biblioteca atual + + + + Remove reading list + Remover lista de leitura + + + + Remove current reading list from the library + Remover lista de leitura atual da biblioteca + + + + Add new label + Adicionar novo rótulo + + + + Add a new label to this library + Adicione um novo rótulo a esta biblioteca + + + + Rename selected list + Renomear lista selecionada + + + + Rename any selected labels or lists + Renomeie quaisquer rótulos ou listas selecionados + + + + Add to... + Adicionar à... + + + + Favorites + Favoritos + + + + Add selected comics to favorites list + Adicione quadrinhos selecionados à lista de favoritos + + + + LocalComicListModel + + + file name + nome do arquivo + + + + NoLibrariesWidget + + + You don't have any libraries yet + Você ainda não tem nenhuma biblioteca + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Você pode criar uma biblioteca em qualquer pasta, YACReaderLibrary importará todos os quadrinhos e pastas desta pasta. Se você já criou alguma biblioteca, poderá abri-la.</p><p>Não se esqueça de que você pode usar o YACReader como um aplicativo independente para ler quadrinhos em seu computador.</p> + + + + create your first library + crie sua primeira biblioteca + + + + add an existing one + adicione um existente + + + + NoSearchResultsWidget + + + No results + Nenhum resultado + + + + OptionsDialog + + + + General + Em geral + + + + + Libraries + Bibliotecas + + + + Comic Flow + Comic Flow + + + + Grid view + Visualização em grade + + + + + Appearance + Aparência + + + + + Options + Opções + + + + + Language + Idioma + + + + + Application language + Idioma do aplicativo + + + + + System default + Padrão do sistema + + + + Tray icon settings (experimental) + Configurações do ícone da bandeja (experimental) + + + + Close to tray + Perto da bandeja + + + + Start into the system tray + Comece na bandeja do sistema + + + + Edit Comic Vine API key + Editar chave da API Comic Vine + + + + Comic Vine API key + Chave de API do Comic Vine + + + + ComicInfo.xml legacy support + Suporte legado ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Importe metadados de ComicInfo.xml ao adicionar novos quadrinhos + + + + Consider 'recent' items added or updated since X days ago + Considere itens 'recentes' adicionados ou atualizados há X dias + + + + Third party reader + Leitor de terceiros + + + + Write {comic_file_path} where the path should go in the command + Escreva {comic_file_path} onde o caminho deve ir no comando + + + + + Clear + Claro + + + + Update libraries at startup + Atualizar bibliotecas na inicialização + + + + Try to detect changes automatically + Tente detectar alterações automaticamente + + + + Update libraries periodically + Atualize bibliotecas periodicamente + + + + Interval: + Intervalo: + + + + 30 minutes + 30 minutos + + + + 1 hour + 1 hora + + + + 2 hours + 2 horas + + + + 4 hours + 4 horas + + + + 8 hours + 8 horas + + + + 12 hours + 12 horas + + + + daily + diário + + + + Update libraries at certain time + Atualizar bibliotecas em determinado momento + + + + Time: + Tempo: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + AVISO! Durante as atualizações da biblioteca, as gravações no banco de dados são desativadas! +Não agende atualizações enquanto estiver usando o aplicativo ativamente. +Durante as atualizações automáticas, o aplicativo bloqueará algumas ações até que a atualização seja concluída. +Para interromper uma atualização automática, toque no indicador de carregamento próximo ao título Bibliotecas. + + + + Modifications detection + Detecção de modificações + + + + Compare the modified date of files when updating a library (not recommended) + Compare a data de modificação dos arquivos ao atualizar uma biblioteca (não recomendado) + + + + Enable background image + Ativar imagem de fundo + + + + Opacity level + Nível de opacidade + + + + Blur level + Nível de desfoque + + + + Use selected comic cover as background + Use a capa de quadrinhos selecionada como plano de fundo + + + + Restore defautls + Restaurar padrões + + + + Background + Fundo + + + + Display continue reading banner + Exibir banner para continuar lendo + + + + Display current comic banner + Exibir banner de quadrinhos atual + + + + Continue reading + Continuar lendo + + + + My comics path + Meu caminho de quadrinhos + + + + Display + Mostrar + + + + Show time in current page information label + Mostrar hora no rótulo de informações da página atual + + + + "Go to flow" size + Tamanho de "Ir para Comic Flow" + + + + Background color + Cor de fundo + + + + Choose + Escolher + + + + Scroll behaviour + Comportamento de rolagem + + + + Disable scroll animations and smooth scrolling + Desative animações de rolagem e rolagem suave + + + + Do not turn page using scroll + Não vire a página usando scroll + + + + Use single scroll step to turn page + Use uma única etapa de rolagem para virar a página + + + + Mouse mode + Modo mouse + + + + Only Back/Forward buttons can turn pages + Apenas os botões Voltar/Avançar podem virar páginas + + + + Use the Left/Right buttons to turn pages. + Use os botões Esquerda/Direita para virar as páginas. + + + + Click left or right half of the screen to turn pages. + Clique na metade esquerda ou direita da tela para virar as páginas. + + + + Quick Navigation Mode + Modo de navegação rápida + + + + Disable mouse over activation + Desativar ativação do mouse sobre + + + + Brightness + Brilho + + + + Contrast + Contraste + + + + Gamma + Gama + + + + Reset + Reiniciar + + + + Image options + Opções de imagem + + + + Fit options + Opções de ajuste + + + + Enlarge images to fit width/height + Amplie as imagens para caber na largura/altura + + + + Double Page options + Opções de página dupla + + + + Show covers as single page + Mostrar capas como página única + + + + Scaling + Dimensionamento + + + + Scaling method + Método de dimensionamento + + + + Nearest (fast, low quality) + Mais próximo (rápido, baixa qualidade) + + + + Bilinear + Interpola??o bilinear + + + + Lanczos (better quality) + Lanczos (melhor qualidade) + + + + Page Flow + Fluxo de página + + + + Image adjustment + Ajuste de imagem + + + + + Restart is needed + Reiniciar é necessário + + + + Comics directory + Diretório de quadrinhos + + + + PropertiesDialog + + + General info + Informações gerais + + + + Plot + Trama + + + + Authors + Autores + + + + Publishing + Publicação + + + + Notes + Notas + + + + Cover page + Página de rosto + + + + Load previous page as cover + Carregar página anterior como capa + + + + Load next page as cover + Carregar a próxima página como capa + + + + Reset cover to the default image + Redefinir a capa para a imagem padrão + + + + Load custom cover image + Carregar imagem de capa personalizada + + + + Series: + Série: + + + + Title: + Título: + + + + + + of: + de: + + + + Issue number: + Número de emissão: + + + + Volume: + Tomo: + + + + Arc number: + Número do arco: + + + + Story arc: + Arco da história: + + + + alt. number: + alt. número: + + + + Alternate series: + Série alternativa: + + + + Series Group: + Grupo de séries: + + + + Genre: + Gênero: + + + + Size: + Tamanho: + + + + Writer(s): + Escritor(es): + + + + Penciller(s): + Desenhador(es): + + + + Inker(s): + Tinteiro(s): + + + + Colorist(s): + Colorista(s): + + + + Letterer(s): + Letrista(s): + + + + Cover Artist(s): + Artista(s) da capa: + + + + Editor(s): + Editor(es): + + + + Imprint: + Imprimir: + + + + Day: + Dia: + + + + Month: + Mês: + + + + Year: + Ano: + + + + Publisher: + Editor: + + + + Format: + Formatar: + + + + Color/BW: + Cor/PB: + + + + Age rating: + Classificação etária: + + + + Type: + Tipo: + + + + Language (ISO): + Idioma (ISO): + + + + Synopsis: + Sinopse: + + + + Characters: + Personagens: + + + + Teams: + Equipes: + + + + Locations: + Locais: + + + + Main character or team: + Personagem principal ou equipe: + + + + Review: + Análise: + + + + Notes: + Notas: + + + + Tags: + Etiquetas: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Link do Comic Vine: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> visualizar </a> + + + + Not found + Não encontrado + + + + Comic not found. You should update your library. + Quadrinho não encontrado. Você deve atualizar sua biblioteca. + + + + Edit comic information + Editar informações dos quadrinhos + + + + Edit selected comics information + Edite as informações dos quadrinhos selecionados + + + + Invalid cover + Capa inválida + + + + The image is invalid. + A imagem é inválida. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer é a versão sem cabeça (sem interface gráfica) do YACReaderLibrary. + +Este aplicativo suporta configurações persistentes, para configurá-las edite este arquivo %1 +Para saber mais sobre as configurações disponíveis, verifique a documentação em https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + Rastreamento + + + + Debug + Depurar + + + + Info + Informações + + + + Warning + Aviso + + + + Error + Erro + + + + Fatal + Cr?tico + + + + Select custom cover + Selecione a capa personalizada + + + + Images (%1) + Imagens (%1) + + + + 7z lib not found + Biblioteca 7z não encontrada + + + + unable to load 7z lib from ./utils + não é possível carregar 7z lib de ./utils + + + + The file could not be read or is not valid JSON. + O arquivo não pôde ser lido ou não é JSON válido. + + + + This theme is for %1, not %2. + Este tema é para %1, não %2. + + + + Libraries + Bibliotecas + + + + Folders + Pastas + + + + Reading Lists + Listas de leitura + + + + RenameLibraryDialog + + + New Library Name : + Novo nome da biblioteca : + + + + Rename + Renomear + + + + Cancel + Cancelar + + + + Rename current library + Renomear biblioteca atual + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Número de volumes encontrados: %1 + + + + + page %1 of %2 + página %1 de %2 + + + + Number of %1 found : %2 + Número de %1 encontrado: %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Forneça algumas informações adicionais para esta história em quadrinhos. + + + + Series: + Série: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Use a pesquisa de correspondência exata. Desative se quiser encontrar volumes que correspondam a algumas das palavras do nome. + + + + SearchVolume + + + Please provide some additional information. + Forneça algumas informações adicionais. + + + + Series: + Série: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Use a pesquisa de correspondência exata. Desative se quiser encontrar volumes que correspondam a algumas das palavras do nome. + + + + SelectComic + + + Please, select the right comic info. + Por favor, selecione as informações corretas dos quadrinhos. + + + + comics + quadrinhos + + + + loading cover + tampa de carregamento + + + + loading description + descrição de carregamento + + + + comic description unavailable + descrição do quadrinho indisponível + + + + SelectVolume + + + Please, select the right series for your comic. + Por favor, selecione a série certa para o seu quadrinho. + + + + Filter: + Filtro: + + + + volumes + tomos + + + + Nothing found, clear the filter if any. + Nada encontrado, limpe o filtro, se houver. + + + + loading cover + tampa de carregamento + + + + loading description + descrição de carregamento + + + + volume description unavailable + descrição do volume indisponível + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Você está tentando obter informações sobre vários quadrinhos ao mesmo tempo. Eles fazem parte da mesma série? + + + + yes + sim + + + + no + não + + + + ServerConfigDialog + + + set port + definir porta + + + + Server connectivity information + Informações de conectividade do servidor + + + + Scan it! + Digitalize! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + O YACReader está disponível para dispositivos iOS e Android.<br/>Descubra-o para <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> ou <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Escolha um endereço IP + + + + Port + Porta + + + + enable the server + habilitar o servidor + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Por favor, classifique a lista de quadrinhos à esquerda até que corresponda às informações dos quadrinhos. + + + + sort comics to match comic information + classifique os quadrinhos para corresponder às informações dos quadrinhos + + + + issues + problemas + + + + remove selected comics + remover quadrinhos selecionados + + + + restore all removed comics + restaurar todos os quadrinhos removidos + + + + ThemeEditorDialog + + + Theme Editor + Editor de Tema + + + + + + + + + + + - + - + + + + i + eu + + + + Expand all + Expandir tudo + + + + Collapse all + Recolher tudo + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Segure para piscar o valor selecionado na UI (magenta/alternado/0↔10). Os lançamentos restauram o original. + + + + Search… + Procurar… + + + + Light + Luz + + + + Dark + Escuro + + + + ID: + EU IA: + + + + Display name: + Nome de exibição: + + + + Variant: + Variante: + + + + Theme info + Informações do tema + + + + Parameter + Parâmetro + + + + Value + Valor + + + + Save and apply + Salvar e aplicar + + + + Export to file... + Exportar para arquivo... + + + + Load from file... + Carregar do arquivo... + + + + Close + Fechar + + + + Double-click to edit color + Clique duas vezes para editar a cor + + + + + + + + + true + verdadeiro + + + + + + + false + falso + + + + Double-click to toggle + Clique duas vezes para alternar + + + + Double-click to edit value + Clique duas vezes para editar o valor + + + + + + Edit: %1 + Editar: %1 + + + + Save theme + Salvar tema + + + + + JSON files (*.json);;All files (*) + Arquivos JSON (*.json);;Todos os arquivos (*) + + + + Save failed + Falha ao salvar + + + + Could not open file for writing: +%1 + Não foi possível abrir o arquivo para gravação: +%1 + + + + Load theme + Carregar tema + + + + + + Load failed + Falha no carregamento + + + + Could not open file: +%1 + Não foi possível abrir o arquivo: +%1 + + + + Invalid JSON: +%1 + JSON inválido: +%1 + + + + Expected a JSON object. + Esperava um objeto JSON. + + + + TitleHeader + + + SEARCH + PROCURAR + + + + UpdateLibraryDialog + + + Updating.... + Atualizando.... + + + + Cancel + Cancelar + + + + Update library + Atualizar biblioteca + + + + Viewer + + + + Press 'O' to open comic. + Pressione 'O' para abrir um quadrinho. + + + + Not found + Não encontrado + + + + Comic not found + Quadrinho não encontrado + + + + Error opening comic + Erro ao abrir quadrinho + + + + CRC Error + Erro CRC + + + + Loading...please wait! + Carregando... por favor, aguarde! + + + + Page not available! + Página não disponível! + + + + Cover! + Cobrir! + + + + Last page! + Última página! + + + + VolumeComicsModel + + + title + título + + + + VolumesModel + + + year + ano + + + + issues + problemas + + + + publisher + editor + + + + YACReader3DFlowConfigWidget + + + Presets: + Predefinições: + + + + Classic look + Aparência clássica + + + + Stripe look + Olhar lista + + + + Overlapped Stripe look + Olhar lista sobreposta + + + + Modern look + Aparência moderna + + + + Roulette look + Aparência de roleta + + + + Show advanced settings + Mostrar configurações avançadas + + + + Custom: + Personalizado: + + + + View angle + Ângulo de visão + + + + Position + Posição + + + + Cover gap + Cubra a lacuna + + + + Central gap + Lacuna central + + + + Zoom + Amplia??o + + + + Y offset + Deslocamento Y + + + + Z offset + Deslocamento Z + + + + Cover Angle + Ângulo de cobertura + + + + Visibility + Visibilidade + + + + Light + Luz + + + + Max angle + Ângulo máximo + + + + Low Performance + Baixo desempenho + + + + High Performance + Alto desempenho + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Use VSync (melhora a qualidade da imagem em modo tela cheia, pior desempenho) + + + + Performance: + Desempenho: + + + + YACReader::MainWindowViewer + + + &Open + &Abrir + + + + Open a comic + Abrir um quadrinho + + + + New instance + Nova instância + + + + Open Folder + Abrir Pasta + + + + Open image folder + Abra a pasta de imagens + + + + Open latest comic + Abra o último quadrinho + + + + Open the latest comic opened in the previous reading session + Abra o último quadrinho aberto na sessão de leitura anterior + + + + Clear + Claro + + + + Clear open recent list + Limpar lista recente aberta + + + + Save + Salvar + + + + + Save current page + Salvar página atual + + + + Previous Comic + Quadrinho Anterior + + + + + + Open previous comic + Abrir quadrinho anterior + + + + Next Comic + Próximo Quadrinho + + + + + + Open next comic + Abrir próximo quadrinho + + + + &Previous + A&nterior + + + + + + Go to previous page + Ir para a página anterior + + + + &Next + &Próxima + + + + + + Go to next page + Ir para a próxima página + + + + Fit Height + Ajustar Altura + + + + Fit image to height + Ajustar imagem à altura + + + + Fit Width + Ajustar à Largura + + + + Fit image to width + Ajustar imagem à largura + + + + Show full size + Mostrar tamanho grande + + + + Fit to page + Ajustar à página + + + + Continuous scroll + Rolagem contínua + + + + Switch to continuous scroll mode + Mudar para o modo de rolagem contínua + + + + Reset zoom + Redefinir zoom + + + + Show zoom slider + Mostrar controle deslizante de zoom + + + + Zoom+ + Ampliar + + + + Zoom- + Reduzir + + + + Rotate image to the left + Girar imagem à esquerda + + + + Rotate image to the right + Girar imagem à direita + + + + Double page mode + Modo dupla página + + + + Switch to double page mode + Alternar para o modo dupla página + + + + Double page manga mode + Modo mangá de página dupla + + + + Reverse reading order in double page mode + Ordem de leitura inversa no modo de página dupla + + + + Go To + Ir Para + + + + Go to page ... + Ir para a página... + + + + Options + Opções + + + + YACReader options + Opções do YACReader + + + + + Help + Ajuda + + + + Help, About YACReader + Ajuda, Sobre o YACReader + + + + Magnifying glass + Lupa + + + + Switch Magnifying glass + Alternar Lupa + + + + Set bookmark + Definir marcador + + + + Set a bookmark on the current page + Definir um marcador na página atual + + + + Show bookmarks + Mostrar marcadores + + + + Show the bookmarks of the current comic + Mostrar os marcadores do quadrinho atual + + + + Show keyboard shortcuts + Mostrar teclas de atalhos + + + + Show Info + Mostrar Informações + + + + Close + Fechar + + + + Show Dictionary + Mostrar dicionário + + + + Show go to flow + Mostrar "Ir para Comic Flow" + + + + Edit shortcuts + Editar atalhos + + + + &File + &Arquivo + + + + + Open recent + Abrir recente + + + + File + Arquivo + + + + Edit + Editar + + + + View + Visualizar + + + + Go + Ir + + + + Window + Janela + + + + + + Open Comic + Abrir Quadrinho + + + + + + Comic files + Arquivos de quadrinhos + + + + Open folder + Abrir pasta + + + + page_%1.jpg + página_%1.jpg + + + + Image files (*.jpg) + Arquivos de imagem (*.jpg) + + + + + Comics + Quadrinhos + + + + + General + Em geral + + + + + Magnifiying glass + Lupa + + + + + Page adjustement + Ajuste de página + + + + + Reading + Leitura + + + + Toggle fullscreen mode + Alternar modo de tela cheia + + + + Hide/show toolbar + Ocultar/mostrar barra de ferramentas + + + + Size up magnifying glass + Dimensione a lupa + + + + Size down magnifying glass + Diminuir o tamanho da lupa + + + + Zoom in magnifying glass + Zoom na lupa + + + + Zoom out magnifying glass + Diminuir o zoom da lupa + + + + Reset magnifying glass + Redefinir lupa + + + + Toggle between fit to width and fit to height + Alternar entre ajustar à largura e ajustar à altura + + + + Autoscroll down + Rolagem automática para baixo + + + + Autoscroll up + Rolagem automática para cima + + + + Autoscroll forward, horizontal first + Rolagem automática para frente, horizontal primeiro + + + + Autoscroll backward, horizontal first + Rolagem automática para trás, horizontal primeiro + + + + Autoscroll forward, vertical first + Rolagem automática para frente, vertical primeiro + + + + Autoscroll backward, vertical first + Rolagem automática para trás, vertical primeiro + + + + Move down + Mover para baixo + + + + Move up + Subir + + + + Move left + Mover para a esquerda + + + + Move right + Mover para a direita + + + + Go to the first page + Vá para a primeira página + + + + Go to the last page + Ir para a última página + + + + Offset double page to the left + Deslocar página dupla para a esquerda + + + + Offset double page to the right + Deslocar página dupla para a direita + + + + There is a new version available + Há uma nova versão disponível + + + + Do you want to download the new version? + Você deseja baixar a nova versão? + + + + Remind me in 14 days + Lembre-me em 14 dias + + + + Not now + Agora não + + + + YACReader::TrayIconController + + + &Restore + &Rloja + + + + Systray + Bandeja do sistema + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary continuará em execução na bandeja do sistema. Para encerrar o programa, escolha <b>Sair</b> no menu de contexto do ícone da bandeja do sistema. + + + + YACReaderFieldEdit + + + + Click to overwrite + Clique para substituir + + + + Restore to default + Restaurar para o padrão + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Clique para substituir + + + + Restore to default + Restaurar para o padrão + + + + YACReaderOptionsDialog + + + Save + Salvar + + + + Cancel + Cancelar + + + + Edit shortcuts + Editar atalhos + + + + Shortcuts + Atalhos + + + + YACReaderSearchLineEdit + + + type to search + digite para pesquisar + + + + YACReaderSlider + + + Reset + Reiniciar - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + Tradutor YACReader - - &Resume - + + + Translation + Tradução - - Save log - + + clear + claro - - Log file (*.log) - + + Service not available + Serviço não disponível diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_ru.ts b/YACReaderLibraryServer/yacreaderlibraryserver_ru.ts index fc4f9988b..bf471a703 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_ru.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_ru.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Никто + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Название ярлыка: - - 7z not found - + + Choose a color: + Выбрать цвет: - - Format not supported - + + accept + добавить + + + + cancel + отменить - LogWindow + AddLibraryDialog + + + Comics folder : + Папка комиксов : + + + + Library name : + Имя библиотеки : + - - Log window - + + Add + Добавить - - &Pause - + + Cancel + Отмена - - &Save - + + Add an existing library + Добавить в существующую библиотеку + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Для подключения к Comic Vine вам потребуется ваш личный API ключ. Приобретите его бесплатно вот <a href="http://www.comicvine.com/api/">здесь</a> - - &Copy - + + Paste here your Comic Vine API key + Вставьте сюда ваш Comic Vine API ключ - - Level: - + + Accept + Принять - - &Auto scroll - + + Cancel + Отмена - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Цветовая гамма + + + + System + Система + + + + Light + Осветить + + + + Dark + Темный + + + + Custom + Обычай + + + + Remove + Удалять + + + + Remove this user-imported theme + Удалить эту импортированную пользователем тему + + + + Light: + Свет: + + + + Dark: + Темный: + + + + Custom: + Пользовательский: + + + + Import theme... + Импортировать тему... + + + + Theme + Тема + + + + Theme editor + Редактор тем + + + + Open Theme Editor... + Открыть редактор тем... + + + + Theme editor error + Ошибка редактора темы + + + + The current theme JSON could not be loaded. + Не удалось загрузить JSON текущей темы. + + + + Import theme + Импортировать тему + + + + JSON files (*.json);;All files (*) + Файлы JSON (*.json);;Все файлы (*) + + + + Could not import theme from: +%1 + Не удалось импортировать тему из: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + Не удалось импортировать тему из: +%1 + +%2 + + + + Import failed + Импорт не удался - QObject + BookmarksDialog - - Trace - + + Lastest Page + Последняя страница - - Debug - + + Close + Закрыть - - Info - + + Click on any image to go to the bookmark + Нажмите на любое изображение чтобы перейти к закладке - - Warning - + + + Loading... + Загрузка... + + + ClassicComicsView - - Error - + + Hide comic flow + Скрыть Comic Flow + + + + ComicModel + + + yes + да - - Fatal - + + no + нет + + + + Title + Заголовок + + + + File Name + Имя файла + + + + Pages + Всего страниц + + + + Size + Размер + + + + Read + Прочитано + + + + Current Page + Текущая страница + + + + Publication Date + Дата публикации + + + + Rating + Рейтинг + + + + Series + Ряд + + + + Volume + Объем + + + + Story Arc + Сюжетная арка + + + + ComicVineDialog + + + skip + пропустить + + + + back + назад + + + + next + дальше + + + + search + искать + + + + close + закрыть + + + + + comic %1 of %2 - %3 + комикс %1 of %2 - %3 + + + + + + Looking for volume... + Поиск информации... + + + + %1 comics selected + %1 было выбрано + + + + Error connecting to ComicVine + Ошибка поключения к ComicVine + + + + + Retrieving tags for : %1 + Получение тегов для : %1 + + + + Retrieving volume info... + Получение информации... + + + + Looking for comic... + Поиск комикса... + + + + ContinuousPageWidget + + + Loading page %1 + Загрузка страницы %1 + + + + CreateLibraryDialog + + + Comics folder : + Папка комиксов : + + + + Library Name : + Имя библиотеки: + + + + Create + Создать + + + + Cancel + Отмена + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Создание библиотеки может занять несколько минут. Вы можете остановить процесс и обновить библиотеку позже для завершения задачи. + + + + Create new library + Создать новую библиотеку + + + + Path not found + Путь не найден + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Выбранный путь отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке + + + + EditShortcutsDialog + + + Restore defaults + Восстановить значения по умолчанию + + + + To change a shortcut, double click in the key combination and type the new keys. + Чтобы изменить горячую клавишу дважды щелкните по выбранной комбинации клавиш и введите новые сочетания клавиш. + + + + Shortcuts settings + Горячие клавиши + + + + Shortcut in use + Горячая клавиша уже занята + + + + The shortcut "%1" is already assigned to other function + Сочетание клавиш "%1" уже назначено для другой функции + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + В этой папке еще нет комиксов + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Этот ярлык пока ничего не содержит + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Этот список чтения пока ничего не содержит + + + + EmptySpecialListWidget + + + No favorites + Нет избранного + + + + You are not reading anything yet, come on!! + Вы пока ничего не читаете. Может самое время почитать? + + + + There are no recent comics! + Свежих комиксов нет! + + + + ExportComicsInfoDialog + + + Output file : + Выходной файл (*.ydb) : + + + + Create + Создать + + + + Cancel + Отмена + + + + Export comics info + Экспортировать информацию комикса + + + + Destination database name + Имя этой базы данных + + + + Problem found while writing + Обнаружена Ошибка записи + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Выбранный путь для импортируемого файла отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке + + + + ExportLibraryDialog + + + Output folder : + Папка вывода : + + + + Create + Создать + + + + Cancel + Отмена + + + + Create covers package + Создать комплект обложек + + + + Problem found while writing + Обнаружена Ошибка записи + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Выбранный путь для импортируемого файла отсутствует, либо неверен. Убедитесь , что у вас есть доступ к этой папке + + + + Destination directory + Назначенная директория + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + Ошибка контрольной суммы CRC на странице (%1): некоторые страницы будут отображаться неправильно + + + + Unknown error opening the file + Неизвестная ошибка при открытии файла + + + + 7z not found + 7z не найден + + + + Format not supported + Формат не поддерживается + + + + GoToDialog + + + Page : + Страница : + + + + Go To + Перейти к странице... + + + + Cancel + Отмена + + + + + Total pages : + Общее количество страниц : + + + + Go to... + Перейти к странице... + + + + GoToFlowToolBar + + + Page : + Страница : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Показать информацию + + + HelpAboutDialog - - Level - + + About + О программе - - Message - + + Help + Справка + + + + System info + Информация о системе + + + + ImportComicsInfoDialog + + + Import comics info + Импортировать информацию комикса + + + + Info database location : + Путь к файлу (*.ydb) : + + + + Import + Импортировать + + + + Cancel + Отмена + + + + Comics info file (*.ydb) + Инфо файл комикса (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Имя библиотеки: + + + + Package location : + Местоположение комплекта : + + + + Destination folder : + Папка назначения : + + + + Unpack + Распаковать + + + + Cancel + Отмена + + + + Extract a catalog + Извлечь каталог + + + + Compresed library covers (*.clc) + Сжатая библиотека обложек (*.clc) + + + + ImportWidget + + + stop + Остановить + + + + Some of the comics being added... + Поиск новых комиксов... + + + + Importing comics + Импорт комиксов + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary сейчас создает библиотеку.</p><p> Создание библиотеки может занять несколько минут. Вы можете остановить процесс и обновить библиотеку позже для завершения задачи.</p> + + + + Updating the library + Обновление библиотеки + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Текущая библиотека обновляется. Для более быстрого обновления в дальнейшем старайтесь почаще обновлять вашу библиотеку после добавления новых комиксов.</p><p>Вы можете остановить этот процесс и продолжить обновление этой библиотеки позже.</p> + + + + Upgrading the library + Обновление библиотеки + + + + <p>The current library is being upgraded, please wait.</p> + <p>Текущая библиотека обновляется, подождите.</p> + + + + Scanning the library + Сканирование библиотеки + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Текущая библиотека сканируется на предмет устаревших метаданных XML.</p><p>Это необходимо только один раз и только в том случае, если библиотека была создана с помощью YACReaderLibrary 9.8.2 или более ранней версии.</p> + + + + LibraryWindow + + + YACReader Library + Библиотека YACReader + + + + + + comic + комикс + + + + + + manga + манга + + + + + + western manga (left to right) + западная манга (слева направо) + + + + + + web comic + веб-комикс + + + + + + 4koma (top to botom) + 4кома (сверху вниз) + + + + + + + Set type + Тип установки + + + + Library + Библиотека + + + + Folder + Папка + + + + Comic + Комикс + + + + Upgrade failed + Обновление не удалось + + + + There were errors during library upgrade in: + При обновлении библиотеки возникли ошибки: + + + + Update needed + Необходимо обновление + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Эта библиотека была создана с предыдущей версией YACReaderLibrary. Она должна быть обновлена. Обновить сейчас? + + + + Download new version + Загрузить новую версию + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Эта библиотека была создана новой версией YACReaderLibrary. Скачать новую версию сейчас? + + + + Library not available + Библиотека не доступна + + + + Library '%1' is no longer available. Do you want to remove it? + Библиотека '%1' больше не доступна. Вы хотите удалить ее? + + + + Old library + Библиотека из старой версии YACreader + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Библиотека '%1' была создана старой версией YACReaderLibrary. Она должна быть вновь создана. Вы хотите создать библиотеку сейчас? + + + + + Copying comics... + Скопировать комиксы... + + + + + Moving comics... + Переместить комиксы... + + + + Add new folder + Добавить новую папку + + + + Folder name: + Имя папки: + + + + No folder selected + Ни одна папка не была выбрана + + + + Please, select a folder first + Пожалуйста, сначала выберите папку + + + + Error in path + Ошибка в пути + + + + There was an error accessing the folder's path + Ошибка доступа к пути папки + + + + Delete folder + Удалить папку + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Выбранная папка и все ее содержимое будет удалено с вашего жёсткого диска. Вы уверены? + + + + + Unable to delete + Не удалось удалить + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Возникла проблема при удалении выбранных папок. Пожалуйста, проверьте права на запись и убедитесь что другие приложения не используют эти папки или файлы. + + + + Add new reading lists + Добавить новый список чтения + + + + + List name: + Имя списка: + + + + Delete list/label + Удалить список/ярлык + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Выбранные элементы будут удалены, ваши комиксы или папки НЕ БУДУТ удалены с вашего жёсткого диска. Вы уверены? + + + + Rename list name + Изменить имя списка + + + + Open folder... + Открыть папку... + + + + Update folder + Обновить папку + + + + Rescan library for XML info + Повторное сканирование библиотеки для получения информации XML + + + + Set as uncompleted + Отметить как не завершено + + + + Set as completed + Отметить как завершено + + + + Set as read + Отметить как прочитано + + + + + Set as unread + Отметить как не прочитано + + + + Set custom cover + Установить собственную обложку + + + + Delete custom cover + Удалить пользовательскую обложку + + + + Save covers + Сохранить обложки + + + + You are adding too many libraries. + Вы добавляете слишком много библиотек. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Вы добавляете слишком много библиотек. + +Вероятно, вам нужна только одна библиотека в папке комиксов верхнего уровня, вы можете просматривать любые подпапки, используя раздел папок на левой боковой панели. + +YACReaderLibrary не помешает вам создать больше библиотек, но вы должны иметь не большое количество библиотек. + + + + + YACReader not found + YACReader не найден + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader не найден. YACReader должен быть установлен в ту же папку, что и YACReaderLibrary. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader не найден. Возможно, возникла проблема с установкой YACReader. + + + + Error + Ошибка + + + + Error opening comic with third party reader. + Ошибка при открытии комикса с помощью сторонней программы чтения. + + + + Library not found + Библиотека не найдена + + + + The selected folder doesn't contain any library. + Выбранная папка не содержит ни одной библиотеки. + + + + Are you sure? + Вы уверены? + + + + Do you want remove + Вы хотите удалить библиотеку + + + + library? + ? + + + + Remove and delete metadata + Удаление метаданных + + + + Library info + Информация о библиотеке + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Возникла проблема при удалении выбранных комиксов. Пожалуйста, проверьте права на запись для выбранных файлов или содержащую их папку. + + + + Assign comics numbers + Порядковый номер + + + + Assign numbers starting in: + Назначить порядковый номер начиная с: + + + + Invalid image + Неверное изображение + + + + The selected file is not a valid image. + Выбранный файл не является допустимым изображением. + + + + Error saving cover + Не удалось сохранить обложку. + + + + There was an error saving the cover image. + Не удалось сохранить изображение обложки. + + + + Error creating the library + Ошибка создания библиотеки + + + + Error updating the library + Ошибка обновления библиотеки + + + + Error opening the library + Ошибка открытия библиотеки + + + + Delete comics + Удалить комиксы + + + + All the selected comics will be deleted from your disk. Are you sure? + Все выбранные комиксы будут удалены с вашего жёсткого диска. Вы уверены? + + + + Remove comics + Убрать комиксы + + + + Comics will only be deleted from the current label/list. Are you sure? + Комиксы будут удалены только из выбранного списка/ярлыка. Вы уверены? + + + + Library name already exists + Имя папки уже используется + + + + There is another library with the name '%1'. + Уже существует другая папка с именем '%1'. + + + + LibraryWindowActions + + + Create a new library + Создать новую библиотеку + + + + Open an existing library + Открыть существующую библиотеку + + + + + Export comics info + Экспортировать информацию комикса + + + + + Import comics info + Импортировать информацию комикса + + + + Pack covers + Запаковать обложки + + + + Pack the covers of the selected library + Запаковать обложки выбранной библиотеки + + + + Unpack covers + Распаковать обложки + + + + Unpack a catalog + Распаковать каталог + + + + Update library + Обновить библиотеку + + + + Update current library + Обновить эту библиотеку + + + + Rename library + Переименовать библиотеку + + + + Rename current library + Переименовать эту библиотеку + + + + Remove library + Удалить библиотеку + + + + Remove current library from your collection + Удалить эту библиотеку из своей коллекции + + + + Rescan library for XML info + Повторное сканирование библиотеки для получения информации XML + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Пытается найти информацию XML, встроенную в файлы комиксов. Это необходимо делать только в том случае, если библиотека была создана с помощью версии 9.8.2 или более ранней, или если вы используете стороннее программное обеспечение для встраивания информации XML в файлы. + + + + Show library info + Показать информацию о библиотеке + + + + Show information about the current library + Показать информацию о текущей библиотеке + + + + Open current comic + Открыть выбранный комикс + + + + Open current comic on YACReader + Открыть комикс в YACReader + + + + Save selected covers to... + Сохранить выбранные обложки в... + + + + Save covers of the selected comics as JPG files + Сохранить обложки выбранных комиксов как JPG файлы + + + + + Set as read + Отметить как прочитано + + + + Set comic as read + Отметить комикс как прочитано + + + + + Set as unread + Отметить как не прочитано + + + + Set comic as unread + Отметить комикс как не прочитано + + + + + manga + манга + + + + Set issue as manga + Установить выпуск как мангу + + + + + comic + комикс + + + + Set issue as normal + Установите проблему как обычно + + + + western manga + вестерн манга + + + + Set issue as western manga + Установить выпуск как западную мангу + + + + + web comic + веб-комикс + + + + Set issue as web comic + Установить выпуск как веб-комикс + + + + + yonkoma + йонкома + + + + Set issue as yonkoma + Установить проблему как йонкома + + + + Show/Hide marks + Показать/Спрятать пометки + + + + Show or hide read marks + Показать или спрятать отметку прочтено + + + + Show/Hide recent indicator + Показать/скрыть индикатор последних событий + + + + Show or hide recent indicator + Показать или скрыть недавний индикатор + + + + + Fullscreen mode on/off + Полноэкранный режим включить/выключить + + + + Help, About YACReader + Справка + + + + Add new folder + Добавить новую папку + + + + Add new folder to the current library + Добавить новую папку в текущую библиотеку + + + + Delete folder + Удалить папку + + + + Delete current folder from disk + Удалить выбранную папку с жёсткого диска + + + + Select root node + Домашняя папка + + + + Expand all nodes + Раскрыть все папки + + + + Collapse all nodes + Свернуть все папки + + + + Show options dialog + Настройки + + + + Show comics server options dialog + Настройки сервера YACReader + + + + + Change between comics views + Изменение внешнего вида потока комиксов + + + + Open folder... + Открыть папку... + + + + Set as uncompleted + Отметить как не завершено + + + + Set as completed + Отметить как завершено + + + + Set custom cover + Установить собственную обложку + + + + Delete custom cover + Удалить пользовательскую обложку + + + + western manga (left to right) + западная манга (слева направо) + + + + Open containing folder... + Открыть выбранную папку... + + + + Reset comic rating + Сбросить рейтинг комикса + + + + Select all comics + Выбрать все комиксы + + + + Edit + Редактировать + + + + Assign current order to comics + Назначить порядковый номер + + + + Update cover + Обновить обложки + + + + Delete selected comics + Удалить выбранное + + + + Delete metadata from selected comics + Удалить метаданные из выбранных комиксов + + + + Download tags from Comic Vine + Скачать теги из Comic Vine + + + + Focus search line + Строка поиска фокуса + + + + Focus comics view + Просмотр комиксов в фокусе + + + + Edit shortcuts + Редактировать горячие клавиши + + + + &Quit + &Qкостюм + + + + Update folder + Обновить папку + + + + Update current folder + Обновить выбранную папку + + + + Scan legacy XML metadata + Сканировать устаревшие метаданные XML + + + + Add new reading list + Создать новый список чтения + + + + Add a new reading list to the current library + Создать новый список чтения + + + + Remove reading list + Удалить список чтения + + + + Remove current reading list from the library + Удалить выбранный ярлык/список чтения + + + + Add new label + Создать новый ярлык + + + + Add a new label to this library + Создать новый ярлык + + + + Rename selected list + Переименовать выбранный список + + + + Rename any selected labels or lists + Переименовать выбранный ярлык/список чтения + + + + Add to... + Добавить в... + + + + Favorites + Избранное + + + + Add selected comics to favorites list + Добавить выбранные комиксы в список избранного + + + + LocalComicListModel + + + file name + имя файла + + + + NoLibrariesWidget + + + You don't have any libraries yet + У вас нет ни одной библиотеки + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Вы можете создать библиотеку в любой папке, YACReaderLibrary будет импортировать все комиксы и папки из этой папки. Если вы уже ранее создавали библиотеки, их можно будет открыть.< / p > <p>Не забывайте, что Вы можете использовать YACReader в качестве отдельного приложения для чтения комиксов на вашем компьютере.</п> + + + + create your first library + создайте свою первую библиотеку + + + + add an existing one + добавить уже существующую + + + + NoSearchResultsWidget + + + No results + Нет результатов + + + + OptionsDialog + + + + General + Общие + + + + + Libraries + Библиотеки + + + + Comic Flow + Comic Flow + + + + Grid view + Фоновое изображение + + + + + Appearance + Появление + + + + + Options + Настройки + + + + + Language + Язык + + + + + Application language + Язык приложения + + + + + System default + Системный по умолчанию + + + + Tray icon settings (experimental) + Настройки значков в трее (экспериментально) + + + + Close to tray + Рядом с лотком + + + + Start into the system tray + Запустите в системном трее + + + + Edit Comic Vine API key + Редактировать Comic Vine API ключ + + + + Comic Vine API key + Comic Vine API ключ + + + + ComicInfo.xml legacy support + Поддержка устаревших версий ComicInfo.xml + + + + Import metadata from ComicInfo.xml when adding new comics + Импортируйте метаданные из ComicInfo.xml при добавлении новых комиксов. + + + + Consider 'recent' items added or updated since X days ago + Учитывайте «недавние» элементы, добавленные или обновленные X дней назад. + + + + Third party reader + Сторонний читатель + + + + Write {comic_file_path} where the path should go in the command + Напишите {comic_file_path}, где должен идти путь в команде. + + + + + Clear + Очистить + + + + Update libraries at startup + Обновлять библиотеки при запуске + + + + Try to detect changes automatically + Попробуйте обнаружить изменения автоматически + + + + Update libraries periodically + Периодически обновляйте библиотеки + + + + Interval: + Интервал: + + + + 30 minutes + 30 минут + + + + 1 hour + 1 час + + + + 2 hours + 2 часа + + + + 4 hours + 4 часа + + + + 8 hours + 8 часов + + + + 12 hours + 12 часов + + + + daily + ежедневно + + + + Update libraries at certain time + Обновлять библиотеки в определенное время + + + + Time: + Время: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + ПРЕДУПРЕЖДЕНИЕ! Во время обновления библиотеки запись в базу данных отключена! +Не планируйте обновления, пока вы активно используете приложение. +Во время автоматического обновления приложение будет блокировать некоторые действия до завершения обновления. +Чтобы остановить автоматическое обновление, нажмите на индикатор загрузки рядом с названием «Библиотеки». + + + + Modifications detection + Обнаружение модификаций + + + + Compare the modified date of files when updating a library (not recommended) + Сравните дату изменения файлов при обновлении библиотеки (не рекомендуется) + + + + Enable background image + Включить фоновое изображение + + + + Opacity level + Уровень непрозрачности + + + + Blur level + Уровень размытия + + + + Use selected comic cover as background + Обложка комикса фоновое изображение + + + + Restore defautls + Вернуть к первоначальным значениям + + + + Background + Фоновое изображение + + + + Display continue reading banner + Отображение баннера продолжения чтения + + + + Display current comic banner + Отображать текущий комикс-баннер + + + + Continue reading + Продолжить чтение + + + + My comics path + Папка комиксов + + + + Display + Отображать + + + + Show time in current page information label + Показывать время в информационной метке текущей страницы + + + + "Go to flow" size + Размер "Перейти к Comic Flow" + + + + Background color + Фоновый цвет + + + + Choose + Выбрать + + + + Scroll behaviour + Поведение прокрутки + + + + Disable scroll animations and smooth scrolling + Отключить анимацию прокрутки и плавную прокрутку + + + + Do not turn page using scroll + Не переворачивайте страницу с помощью прокрутки + + + + Use single scroll step to turn page + Используйте один шаг прокрутки, чтобы перевернуть страницу + + + + Mouse mode + Режим мыши + + + + Only Back/Forward buttons can turn pages + Только кнопки «Назад/Вперед» могут перелистывать страницы. + + + + Use the Left/Right buttons to turn pages. + Используйте кнопки «Влево/Вправо», чтобы перелистывать страницы. + + + + Click left or right half of the screen to turn pages. + Нажмите левую или правую половину экрана, чтобы перелистывать страницы. + + + + Quick Navigation Mode + Ползунок для быстрой навигации по страницам + + + + Disable mouse over activation + Отключить активацию потока при наведении мыши + + + + Brightness + Яркость + + + + Contrast + Контраст + + + + Gamma + Гамма + + + + Reset + Вернуть к первоначальным значениям + + + + Image options + Настройки изображения + + + + Fit options + Варианты подгонки + + + + Enlarge images to fit width/height + Увеличьте изображения по ширине/высоте + + + + Double Page options + Параметры двойной страницы + + + + Show covers as single page + Показывать обложки на одной странице + + + + Scaling + Масштабирование + + + + Scaling method + Метод масштабирования + + + + Nearest (fast, low quality) + Ближайший (быстро, низкое качество) + + + + Bilinear + Билинейный + + + + Lanczos (better quality) + Ланцос (лучшее качество) + + + + Page Flow + Поток Страниц + + + + Image adjustment + Настройка изображения + + + + + Restart is needed + Требуется перезагрузка + + + + Comics directory + Папка комиксов + + + + PropertiesDialog + + + General info + Общая информация + + + + Plot + Сюжет + + + + Authors + Авторы + + + + Publishing + Издатели + + + + Notes + Примечания + + + + Cover page + Страница обложки + + + + Load previous page as cover + Загрузить предыдущую страницу в качестве обложки + + + + Load next page as cover + Загрузить следующую страницу в качестве обложки + + + + Reset cover to the default image + Сбросить обложку к изображению по умолчанию + + + + Load custom cover image + Загрузить собственное изображение обложки + + + + Series: + Серия: + + + + Title: + Заголовок: + + + + + + of: + из: + + + + Issue number: + Номер выпуска + + + + Volume: + Объём : + + + + Arc number: + Номер дуги: + + + + Story arc: + Сюжетная арка: + + + + alt. number: + альт. число: + + + + Alternate series: + Альтернативный сериал: + + + + Series Group: + Группа серий: + + + + Genre: + Жанр: + + + + Size: + Размер: + + + + Writer(s): + Писатель(и): + + + + Penciller(s): + Художник(и): + + + + Inker(s): + Контуровщик(и): + + + + Colorist(s): + Колорист(ы): + + + + Letterer(s): + Гравёр-шрифтовик(и): + + + + Cover Artist(s): + Художник(и) Обложки: + + + + Editor(s): + Редактор(ы): + + + + Imprint: + Выходные данные: + + + + Day: + День: + + + + Month: + Месяц: + + + + Year: + Год: + + + + Publisher: + Издатель: + + + + Format: + Формат: + + + + Color/BW: + Цвет/BW: + + + + Age rating: + Возрастной рейтинг: + + + + Type: + Тип: + + + + Language (ISO): + Язык (ISO): + + + + Synopsis: + Описание: + + + + Characters: + Персонажи: + + + + Teams: + Команды: + + + + Locations: + Местоположение: + + + + Main character or team: + Главный герой или команда: + + + + Review: + Обзор: + + + + Notes: + Заметки: + + + + Tags: + Теги: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + <a style='color: ##666666; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> Открыть страницу этого комикса на сайте Comic Vine </a> + + + + Not found + Не найдено + + + + Comic not found. You should update your library. + Комикс не найден. Обновите вашу библиотеку. + + + + Edit comic information + Редактировать информацию комикса + + + + Edit selected comics information + Редактировать информацию выбранного комикса + + + + Invalid cover + Неверное покрытие + + + + The image is invalid. + Изображение недействительно. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer — это безголовая (без графического интерфейса) версия YACReaderLibrary. + +Это приложение поддерживает постоянные настройки. Чтобы настроить их, отредактируйте этот файл %1. +Чтобы узнать о доступных настройках, ознакомьтесь с документацией по адресу https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md. + + + + QObject + + + Trace + След + + + + Debug + Отлаживать + + + + Info + Информация + + + + Warning + Предупреждение + + + + Error + Ошибка + + + + Fatal + Фатальный + + + + Select custom cover + Выбрать индивидуальную обложку + + + + Images (%1) + Изображения (%1) + + + + 7z lib not found + Библиотека распаковщика 7z не найдена + + + + unable to load 7z lib from ./utils + не удается загрузить 7z lib из ./ utils + + + + The file could not be read or is not valid JSON. + Файл не может быть прочитан или имеет недопустимый формат JSON. + + + + This theme is for %1, not %2. + Эта тема предназначена для %1, а не для %2. + + + + Libraries + Библиотеки + + + + Folders + Папки + + + + Reading Lists + Списки чтения + + + + RenameLibraryDialog + + + New Library Name : + Новое имя библиотеки: + + + + Rename + Переименовать + + + + Cancel + Отмена + + + + Rename current library + Переименовать эту библиотеку + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Количество найденных томов : %1 + + + + + page %1 of %2 + страница %1 из %2 + + + + Number of %1 found : %2 + Количество из %1 найдено : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Пожалуйста, введите инфомарцию для поиска. + + + + Series: + Серия: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Используйте поиск по точному совпадению. Отключите, если хотите найти тома, соответствующие некоторым словам в названии. + + + + SearchVolume + + + Please provide some additional information. + Пожалуйста, введите инфомарцию для поиска. + + + + Series: + Серия: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Используйте поиск по точному совпадению. Отключите, если хотите найти тома, соответствующие некоторым словам в названии. + + + + SelectComic + + + Please, select the right comic info. + Пожалуйста, выберите правильную информацию об комиксе. + + + + comics + комиксы + + + + loading cover + загрузка обложки + + + + loading description + загрузка описания + + + + comic description unavailable + Описание комикса недоступно + + + + SelectVolume + + + Please, select the right series for your comic. + Пожалуйста, выберите правильную серию для вашего комикса. + + + + Filter: + Фильтр: + + + + volumes + тома + + + + Nothing found, clear the filter if any. + Ничего не найдено, очистите фильтр, если есть. + + + + loading cover + загрузка обложки + + + + loading description + загрузка описания + + + + volume description unavailable + описание тома недоступно + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Вы пытаетесь получить информацию для нескольких комиксов одновременно, являются ли они все частью одной серии? + + + + yes + да + + + + no + нет + + + + ServerConfigDialog + + + set port + указать порт + + + + Server connectivity information + Информация о подключении + + + + Scan it! + Сканируйте! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader доступен для устройств iOS и Android.<br/>Найдите его для <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> или <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + Выбрать IP адрес + + + + Port + Порт + + + + enable the server + активировать сервер + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Пожалуйста, отсортируйте список комиксов слева, пока он не будет соответствовать информации комикса. + + + + sort comics to match comic information + сортировать комиксы, чтобы соответствовать информации комиксов + + + + issues + выпуск + + + + remove selected comics + удалить выбранные комиксы + + + + restore all removed comics + восстановить все удаленные комиксы + + + + ThemeEditorDialog + + + Theme Editor + Редактор тем + + + + + + + + + + + - + - + + + + i + я + + + + Expand all + Развернуть все + + + + Collapse all + Свернуть все + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Удерживайте, чтобы выбранное значение мигало в пользовательском интерфейсе (пурпурный / переключено / 0↔10). Релизы восстанавливают оригинал. + + + + Search… + Поиск… + + + + Light + Осветить + + + + Dark + Темный + + + + ID: + ИДЕНТИФИКАТОР: + + + + Display name: + Отображаемое имя: + + + + Variant: + Вариант: + + + + Theme info + Информация о теме + + + + Parameter + Параметр + + + + Value + Ценить + + + + Save and apply + Сохраните и примените + + + + Export to file... + Экспортировать в файл... + + + + Load from file... + Загрузить из файла... + + + + Close + Закрыть + + + + Double-click to edit color + Дважды щелкните, чтобы изменить цвет + + + + + + + + + true + истинный + + + + + + + false + ЛОЖЬ + + + + Double-click to toggle + Дважды щелкните, чтобы переключиться + + + + Double-click to edit value + Дважды щелкните, чтобы изменить значение + + + + + + Edit: %1 + Изменить: %1 + + + + Save theme + Сохранить тему + + + + + JSON files (*.json);;All files (*) + Файлы JSON (*.json);;Все файлы (*) + + + + Save failed + Сохранить не удалось + + + + Could not open file for writing: +%1 + Не удалось открыть файл для записи: +%1 + + + + Load theme + Загрузить тему + + + + + + Load failed + Загрузка не удалась + + + + Could not open file: +%1 + Не удалось открыть файл: +%1 + + + + Invalid JSON: +%1 + Неверный JSON: +%1 + + + + Expected a JSON object. + Ожидается объект JSON. + + + + TitleHeader + + + SEARCH + ПОИСК + + + + UpdateLibraryDialog + + + Updating.... + Обновление... + + + + Cancel + Отмена + + + + Update library + Обновить библиотеку + + + + Viewer + + + + Press 'O' to open comic. + Нажмите "O" чтобы открыть комикс. + + + + Not found + Не найдено + + + + Comic not found + Комикс не найден + + + + Error opening comic + Ошибка открытия комикса + + + + CRC Error + Ошибка CRC + + + + Loading...please wait! + Загрузка... Пожалуйста подождите! + + + + Page not available! + Страница недоступна! + + + + Cover! + Начало! + + + + Last page! + Конец! + + + + VolumeComicsModel + + + title + название + + + + VolumesModel + + + year + год + + + + issues + выпуск + + + + publisher + издатель + + + + YACReader3DFlowConfigWidget + + + Presets: + Предустановки: + + + + Classic look + Классический вид + + + + Stripe look + Вид полосами + + + + Overlapped Stripe look + Вид перекрывающимися полосами + + + + Modern look + Современный вид + + + + Roulette look + Вид рулеткой + + + + Show advanced settings + Показать дополнительные настройки + + + + Custom: + Пользовательский: + + + + View angle + Угол зрения + + + + Position + Позиция + + + + Cover gap + Осветить разрыв + + + + Central gap + Сфокусировать разрыв + + + + Zoom + Масштабировать + + + + Y offset + Смещение по Y + + + + Z offset + Смещение по Z + + + + Cover Angle + Охватить угол + + + + Visibility + Прозрачность + + + + Light + Осветить + + + + Max angle + Максимальный угол + + + + Low Performance + Минимальная производительность + + + + High Performance + Максимальная производительность + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Использовать VSync (повысить формат изображения в полноэкранном режиме , хуже производительность) + + + + Performance: + Производительность: + + + + YACReader::MainWindowViewer + + + &Open + &Открыть + + + + Open a comic + Открыть комикс + + + + New instance + Новый экземпляр + + + + Open Folder + Открыть папку + + + + Open image folder + Открыть папку с изображениями + + + + Open latest comic + Открыть последний комикс + + + + Open the latest comic opened in the previous reading session + Открыть комикс открытый в предыдущем сеансе чтения + + + + Clear + Очистить + + + + Clear open recent list + Очистить список недавно открытых файлов + + + + Save + Сохранить + + + + + Save current page + Сохранить текущию страницу + + + + Previous Comic + Предыдущий комикс + + + + + + Open previous comic + Открыть предыдуший комикс + + + + Next Comic + Следующий комикс + + + + + + Open next comic + Открыть следующий комикс + + + + &Previous + &Предыдущий + + + + + + Go to previous page + Перейти к предыдущей странице + + + + &Next + &Следующий + + + + + + Go to next page + Перейти к следующей странице + + + + Fit Height + Подогнать по высоте + + + + Fit image to height + Подогнать по высоте + + + + Fit Width + Подогнать по ширине + + + + Fit image to width + Подогнать по ширине + + + + Show full size + Показать в полном размере + + + + Fit to page + Подогнать под размер страницы + + + + Continuous scroll + Непрерывная прокрутка + + + + Switch to continuous scroll mode + Переключиться в режим непрерывной прокрутки + + + + Reset zoom + Сбросить масштаб + + + + Show zoom slider + Показать ползунок масштабирования + + + + Zoom+ + Увеличить масштаб + + + + Zoom- + Уменьшить масштаб + + + + Rotate image to the left + Повернуть изображение против часовой стрелки + + + + Rotate image to the right + Повернуть изображение по часовой стрелке + + + + Double page mode + Двухстраничный режим + + + + Switch to double page mode + Двухстраничный режим + + + + Double page manga mode + Двухстраничный режим манги + + + + Reverse reading order in double page mode + Двухстраничный режим манги + + + + Go To + Перейти к странице... + + + + Go to page ... + Перейти к странице... + + + + Options + Настройки + + + + YACReader options + Настройки + + + + + Help + Справка + + + + Help, About YACReader + Справка + + + + Magnifying glass + Увеличительное стекло + + + + Switch Magnifying glass + Увеличительное стекло + + + + Set bookmark + Установить закладку + + + + Set a bookmark on the current page + Установить закладку на текущей странице + + + + Show bookmarks + Показать закладки + + + + Show the bookmarks of the current comic + Показать закладки в текущем комиксе + + + + Show keyboard shortcuts + Показать горячие клавиши + + + + Show Info + Показать/скрыть номер страницы и текущее время + + + + Close + Закрыть + + + + Show Dictionary + Переводчик YACreader + + + + Show go to flow + Показать "Перейти к Comic Flow" + + + + Edit shortcuts + Редактировать горячие клавиши + + + + &File + &Отображать панель инструментов + + + + + Open recent + Открыть недавние + + + + File + Файл + + + + Edit + Редактировать + + + + View + Посмотреть + + + + Go + Перейти + + + + Window + Окно + + + + + + Open Comic + Открыть комикс + + + + + + Comic files + Файлы комикса + + + + Open folder + Открыть папку + + + + page_%1.jpg + страница_%1.jpg + + + + Image files (*.jpg) + Файлы изображений (*.jpg) + + + + + Comics + Комикс + + + + + General + Общие + + + + + Magnifiying glass + Увеличительное стекло + + + + + Page adjustement + Настройка страницы + + + + + Reading + Чтение + + + + Toggle fullscreen mode + Полноэкранный режим включить/выключить + + + + Hide/show toolbar + Показать/скрыть панель инструментов + + + + Size up magnifying glass + Увеличение размера окошка увеличительного стекла + + + + Size down magnifying glass + Уменьшение размера окошка увеличительного стекла + + + + Zoom in magnifying glass + Увеличить + + + + Zoom out magnifying glass + Уменьшить + + + + Reset magnifying glass + Сбросить увеличительное стекло + + + + Toggle between fit to width and fit to height + Переключение режима подгонки страницы по ширине/высоте + + + + Autoscroll down + Автопрокрутка вниз + + + + Autoscroll up + Автопрокрутка вверх + + + + Autoscroll forward, horizontal first + Автопрокрутка вперед, горизонтальная + + + + Autoscroll backward, horizontal first + Автопрокрутка назад, горизонтальная + + + + Autoscroll forward, vertical first + Автопрокрутка вперед, вертикальная + + + + Autoscroll backward, vertical first + Автопрокрутка назад, вертикальная + + + + Move down + Переместить вниз + + + + Move up + Переместить вверх + + + + Move left + Переместить влево + + + + Move right + Переместить вправо + + + + Go to the first page + Перейти к первой странице + + + + Go to the last page + Перейти к последней странице + + + + Offset double page to the left + Смещение разворота влево + + + + Offset double page to the right + Смещение разворота вправо + + + + There is a new version available + Доступна новая версия + + + + Do you want to download the new version? + Хотите загрузить новую версию ? + + + + Remind me in 14 days + Напомнить через 14 дней + + + + Not now + Не сейчас + + + + YACReader::TrayIconController + + + &Restore + &Rмагазин + + + + Systray + Систрей + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary продолжит работать в системном трее. Чтобы завершить работу программы, выберите <b>Выход</b> в контекстном меню значка на панели задач. + + + + YACReaderFieldEdit + + + + Click to overwrite + Изменить + + + + Restore to default + Восстановить значения по умолчанию + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Изменить + + + + Restore to default + Восстановить значения по умолчанию + + + + YACReaderOptionsDialog + + + Save + Сохранить + + + + Cancel + Отмена + + + + Edit shortcuts + Редактировать горячие клавиши + + + + Shortcuts + Горячие клавиши + + + + YACReaderSearchLineEdit + + + type to search + Начать поиск + + + + YACReaderSlider + + + Reset + Вернуть к первоначальным значениям - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + Переводчик YACReader - - &Resume - + + + Translation + Перевод - - Save log - + + clear + очистить - - Log file (*.log) - + + Service not available + Сервис недоступен diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_tr.ts b/YACReaderLibraryServer/yacreaderlibraryserver_tr.ts index f83835c4f..8189dc920 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_tr.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_tr.ts @@ -2,150 +2,3713 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + Hiçbiri + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + Etiket adı: - - 7z not found - + + Choose a color: + Renk seçiniz: - - Format not supported - + + accept + kabul et + + + + cancel + vazgeç - LogWindow + AddLibraryDialog + + + Comics folder : + Çizgi roman klasörü : + + + + Library name : + Kütüphane adı : + - - Log window - + + Add + Ekle - - &Pause - + + Cancel + Vazgeç - - &Save - + + Add an existing library + Kütüphaneye ekle + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + Comic Vine'a bağlanmadan önce kendi API anahtarınıza ihtiyacınız var. Lütfen <a href="http://www.comicvine.com/api/">buradan</a> ücretsiz bir tane edinin - - &Copy - + + Paste here your Comic Vine API key + Comic Vine API anahtarınızı buraya yapıştırın - - Level: - + + Accept + Kabul et - - &Auto scroll - + + Cancel + Vazgeç - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + Renk şeması + + + + System + Sistem + + + + Light + Işık + + + + Dark + Karanlık + + + + Custom + Gelenek + + + + Remove + Kaldırmak + + + + Remove this user-imported theme + Kullanıcı tarafından içe aktarılan bu temayı kaldır + + + + Light: + Işık: + + + + Dark: + Karanlık: + + + + Custom: + Kişisel: + + + + Import theme... + Temayı içe aktar... + + + + Theme + Tema + + + + Theme editor + Tema düzenleyici + + + + Open Theme Editor... + Tema Düzenleyiciyi Aç... + + + + Theme editor error + Tema düzenleyici hatası + + + + The current theme JSON could not be loaded. + Geçerli tema JSON yüklenemedi. + + + + Import theme + Temayı içe aktar + + + + JSON files (*.json);;All files (*) + JSON dosyaları (*.json);;Tüm dosyalar (*) + + + + Could not import theme from: +%1 + Tema şu kaynaktan içe aktarılamadı: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + Tema şu kaynaktan içe aktarılamadı: +%1 + +%2 + + + + Import failed + İçe aktarma başarısız oldu - QObject + BookmarksDialog - - Trace - + + Lastest Page + Son Sayfa - - Debug - + + Close + Kapat - - Info - + + Click on any image to go to the bookmark + Yer imine git - - Warning - + + + Loading... + Yükleniyor... + + + ClassicComicsView - - Error - + + Hide comic flow + Comic Flow'u gizle + + + + ComicModel + + + yes + evet - - Fatal - + + no + hayır + + + + Title + Başlık + + + + File Name + Dosya Adı + + + + Pages + Sayfalar + + + + Size + Boyut + + + + Read + Oku + + + + Current Page + Geçreli Sayfa + + + + Publication Date + Yayın Tarihi + + + + Rating + Reyting + + + + Series + Seri + + + + Volume + Hacim + + + + Story Arc + Hikaye Arkı + + + + ComicVineDialog + + + skip + geç + + + + back + geri + + + + next + sonraki + + + + search + ara + + + + close + kapat + + + + + comic %1 of %2 - %3 + çizgi roman %1 / %2 - %3 + + + + + + Looking for volume... + Sayılar aranıyor... + + + + %1 comics selected + %1 çizgi roman seçildi + + + + Error connecting to ComicVine + ComicVine sitesine bağlanılırken hata + + + + + Retrieving tags for : %1 + %1 için etiketler alınıyor + + + + Retrieving volume info... + Sayı bilgileri alınıyor... + + + + Looking for comic... + Çizgi romanlar aranıyor... + + + + ContinuousPageWidget + + + Loading page %1 + %1 sayfası yükleniyor + + + + CreateLibraryDialog + + + Comics folder : + Çizgi roman klasörü : + + + + Library Name : + Kütüphane Adı : + + + + Create + Oluştur + + + + Cancel + Vazgeç + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + Yeni kütüphanenin oluşturulması birkaç dakika sürecek. + + + + Create new library + Yeni kütüphane oluştur + + + + Path not found + Dizin bulunamadı + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol + + + + EditShortcutsDialog + + + Restore defaults + Varsayılarları geri yükle + + + + To change a shortcut, double click in the key combination and type the new keys. + Bir kısayolu değiştirmek için tuş kombinasyonuna çift tıklayın ve yeni tuşları girin. + + + + Shortcuts settings + Kısayol oyarları + + + + Shortcut in use + Kısayol kullanımda + + + + The shortcut "%1" is already assigned to other function + "%1" kısayolu bir başka işleve zaten atanmış + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + Bu klasör henüz çizgi roman içermiyor + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + Bu etiket henüz çizgi roman içermiyor + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + Bu okuma listesi henüz çizgi roman içermiyor + + + + EmptySpecialListWidget + + + No favorites + Favoriler boş + + + + You are not reading anything yet, come on!! + Henüz bir şey okumuyorsun, hadi ama! + + + + There are no recent comics! + Yeni çizgi roman yok! + + + + ExportComicsInfoDialog + + + Output file : + Çıkış dosyası : + + + + Create + Oluştur + + + + Cancel + Vazgeç + + + + Export comics info + Çizgi roman bilgilerini göster + + + + Destination database name + Hedef adı + + + + Problem found while writing + Yazma sırasında bir problem oldu + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol + + + + ExportLibraryDialog + + + Output folder : + Çıktı klasörü : + + + + Create + Oluştur + + + + Cancel + Vazgeç + + + + Create covers package + Kapak paketi oluştur + + + + Problem found while writing + Yazma sırasında bir problem oldu + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + Seçilen dizine yazma iznimiz yok yazma izni olduğundan emin ol + + + + Destination directory + Hedef dizin + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + (%1). sayfada CRC hatası : bazı sayfalar düzgün görüntülenmeyecek + + + + Unknown error opening the file + Dosya açılırken bilinmeyen hata + + + + 7z not found + 7z bulunamadı + + + + Format not supported + Biçim desteklenmiyor + + + + GoToDialog + + + Page : + Sayfa : + + + + Go To + Git + + + + Cancel + Vazgeç + + + + + Total pages : + Toplam sayfa: + + + + Go to... + Git... + + + + GoToFlowToolBar + + + Page : + Sayfa : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + Bilgi göster + + + HelpAboutDialog - - Level - + + About + Hakkında - - Message - + + Help + Yardım + + + + System info + Sistem bilgisi + + + + ImportComicsInfoDialog + + + Import comics info + Çizgi roman bilgilerini çıkart + + + + Info database location : + Bilgi veritabanı konumu : + + + + Import + Çıkart + + + + Cancel + Vazgeç + + + + Comics info file (*.ydb) + Çizgi roman bilgi dosyası (*.ydb) + + + + ImportLibraryDialog + + + Library Name : + Kütüphane Adı : + + + + Package location : + Paket konumu : + + + + Destination folder : + Hedef klasör : + + + + Unpack + Paketten çıkar + + + + Cancel + Vazgeç + + + + Extract a catalog + Katalog ayıkla + + + + Compresed library covers (*.clc) + Sıkıştırılmış kütüphane kapakları (*.clc) + + + + ImportWidget + + + stop + dur + + + + Some of the comics being added... + Bazı çizgi romanlar önceden eklenmiş... + + + + Importing comics + önemli çizgi romanlar + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderKütüphane şu anda yeni bir kütüphane oluşturuyor</p><p>Kütüphanenin oluşturulması birkaç dakika alacak.</p> + + + + Updating the library + Kütüphaneyi güncelle + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>Kütüphane güncelleniyor</p><p>Güncellemeyi daha sonra iptal edebilirsin.</p> + + + + Upgrading the library + Kütüphane güncelleniyor + + + + <p>The current library is being upgraded, please wait.</p> + <p>Mevcut kütüphane güncelleniyor, lütfen bekleyin.</p> + + + + Scanning the library + Kütüphaneyi taramak + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>Geçerli kitaplık, eski XML meta veri bilgileri için taranıyor.</p><p>Bu yalnızca bir kez gereklidir ve yalnızca kitaplığın YACReaderLibrary 9.8.2 veya daha eski bir sürümle oluşturulmuş olması durumunda gereklidir.</p> + + + + LibraryWindow + + + YACReader Library + YACReader Kütüphane + + + + + + comic + komik + + + + + + manga + manga t?r? + + + + + + western manga (left to right) + Batı mangası (soldan sağa) + + + + + + web comic + web çizgi romanı + + + + + + 4koma (top to botom) + 4koma (yukarıdan aşağıya) + + + + + + + Set type + Türü ayarla + + + + Library + Kütüphane + + + + Folder + Klasör + + + + Comic + Çizgi roman + + + + Upgrade failed + Yükseltme başarısız oldu + + + + There were errors during library upgrade in: + Kütüphane yükseltmesi sırasında hatalar oluştu: + + + + Update needed + Güncelleme gerekli + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + Bu kütüphane YACReaderKütüphabenin bir önceki versiyonun oluşturulmuş, güncellemeye ihtiyacın var. Şimdi güncellemek ister misin ? + + + + Download new version + Yeni versiyonu indir + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + Bu kütüphane YACRKütüphanenin üst bir versiyonunda oluşturulmu. Yeni versiyonu indirmek ister misiniz ? + + + + + Library not available + Kütüphane ulaşılabilir değil + + + + Library '%1' is no longer available. Do you want to remove it? + Kütüphane '%1'ulaşılabilir değil. Kaldırmak ister misin? + + + + Old library + Eski kütüphane + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + Kütüphane '%1 YACRKütüphanenin eski bir sürümünde oluşturulmuş, Kütüphaneyi yeniden oluşturmak ister misin? + + + + + Copying comics... + Çizgi romanlar kopyalanıyor... + + + + + Moving comics... + Çizgi romanlar taşınıyor... + + + + Add new folder + Yeni klasör ekle + + + + Folder name: + Klasör adı: + + + + No folder selected + Hiçbir klasör seçilmedi + + + + Please, select a folder first + Lütfen, önce bir klasör seçiniz + + + + Error in path + Yolda hata + + + + There was an error accessing the folder's path + Klasörün yoluna erişilirken hata oluştu + + + + Delete folder + Klasörü sil + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + Seçilen klasör ve tüm içeriği diskinizden silinecek. Emin misin? + + + + + Unable to delete + Silinemedi + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + Seçili klasörleri silmeye çalışırken bir sorun oluştu. Lütfen yazma izinlerini kontrol edin ve herhangi bir uygulamanın bu klasörleri veya içerdiği dosyalardan herhangi birini kullandığından emin olun. + + + + Add new reading lists + Yeni okuma listeleri ekle + + + + + List name: + Liste adı: + + + + Delete list/label + Listeyi/Etiketi sil + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + Seçilen öğe silinecek, çizgi romanlarınız veya klasörleriniz diskinizden SİLİNMEYECEKTİR. Emin misin? + + + + Rename list name + Listeyi yeniden adlandır + + + + Open folder... + Dosyayı aç... + + + + Update folder + Klasörü güncelle + + + + Rescan library for XML info + XML bilgisi için kitaplığı yeniden tarayın + + + + Set as uncompleted + Tamamlanmamış olarak ayarla + + + + Set as completed + Tamamlanmış olarak ayarla + + + + Set as read + Okundu olarak işaretle + + + + + Set as unread + Hepsini okunmadı işaretle + + + + Set custom cover + Özel kapak ayarla + + + + Delete custom cover + Özel kapağı sil + + + + Save covers + Kapakları kaydet + + + + You are adding too many libraries. + Çok fazla kütüphane ekliyorsunuz. + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + Çok fazla kütüphane ekliyorsunuz. + +Muhtemelen üst düzey çizgi roman klasörünüzde yalnızca bir kütüphaneye ihtiyacınız vardır, sol kenar çubuğundaki klasörler bölümünü kullanarak herhangi bir alt klasöre göz atabilirsiniz. + +YACReaderLibrary daha fazla kütüphane oluşturmanıza engel olmaz ancak kütüphane sayısını düşük tutmalısınız. + + + + + YACReader not found + YACReader bulunamadı + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + YACReader bulunamadı. YACReader, YACReaderLibrary ile aynı klasöre kurulmalıdır. + + + + YACReader not found. There might be a problem with your YACReader installation. + YACReader bulunamadı. YACReader kurulumunuzda bir sorun olabilir. + + + + Error + Hata + + + + Error opening comic with third party reader. + Çizgi roman üçüncü taraf okuyucuyla açılırken hata oluştu. + + + + Library not found + Kütüphane bulunamadı + + + + The selected folder doesn't contain any library. + Seçilen dosya kütüphanede yok. + + + + Are you sure? + Emin misin? + + + + Do you want remove + Kaldırmak ister misin + + + + library? + kütüphane? + + + + Remove and delete metadata + Metadata'yı kaldır ve sil + + + + Library info + Kütüphane bilgisi + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + Seçilen çizgi romanlar silinmeye çalışılırken bir sorun oluştu. Lütfen seçilen dosyalarda veya klasörleri içeren yazma izinlerini kontrol edin. + + + + Assign comics numbers + Çizgi roman numaraları ata + + + + Assign numbers starting in: + Şunlardan başlayarak numaralar ata: + + + + Invalid image + Geçersiz resim + + + + The selected file is not a valid image. + Seçilen dosya geçerli bir resim değil. + + + + Error saving cover + Kapak kaydedilirken hata oluştu + + + + There was an error saving the cover image. + Kapak resmi kaydedilirken bir hata oluştu. + + + + Error creating the library + Kütüphane oluşturma sorunu + + + + Error updating the library + Kütüphane güncelleme sorunu + + + + Error opening the library + Haa kütüphanesini aç + + + + Delete comics + Çizgi romanları sil + + + + All the selected comics will be deleted from your disk. Are you sure? + Seçilen tüm çizgi romanlar diskten silinecek emin misin ? + + + + Remove comics + Çizgi romanları kaldır + + + + Comics will only be deleted from the current label/list. Are you sure? + Çizgi romanlar yalnızca mevcut etiketten/listeden silinecektir. Emin misin? + + + + Library name already exists + Kütüphane ismi zaten alınmış + + + + There is another library with the name '%1'. + Bu başka bir kütüphanenin adı '%1'. + + + + LibraryWindowActions + + + Create a new library + Yeni kütüphane oluştur + + + + Open an existing library + Çıkış kütüphanesini aç + + + + + Export comics info + Çizgi roman bilgilerini göster + + + + + Import comics info + Çizgi roman bilgilerini çıkart + + + + Pack covers + Paket kapakları + + + + Pack the covers of the selected library + Kütüphanede ki kapakları paketle + + + + Unpack covers + Kapakları aç + + + + Unpack a catalog + Kataloğu çkart + + + + Update library + Kütüphaneyi güncelle + + + + Update current library + Kütüphaneyi güncelle + + + + Rename library + Kütüphaneyi yeniden adlandır + + + + Rename current library + Kütüphaneyi adlandır + + + + Remove library + Kütüphaneyi sil + + + + Remove current library from your collection + Kütüphaneyi koleksiyonundan kaldır + + + + Rescan library for XML info + XML bilgisi için kitaplığı yeniden tarayın + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + Komik dosyalara gömülü XML bilgilerini bulmaya çalışır. Bunu yalnızca kitaplık 9.8.2 veya önceki sürümlerle oluşturulmuşsa veya XML bilgilerini dosyalara eklemek için üçüncü taraf yazılım kullanıyorsanız yapmanız gerekir. + + + + Show library info + Kitaplık bilgilerini göster + + + + Show information about the current library + Geçerli kitaplık hakkındaki bilgileri göster + + + + Open current comic + Seçili çizgi romanı aç + + + + Open current comic on YACReader + YACReader'ı geçerli çizgi roman okuyucsu seç + + + + Save selected covers to... + Seçilen kapakları şuraya kaydet... + + + + Save covers of the selected comics as JPG files + Seçilen çizgi romanların kapaklarını JPG dosyaları olarak kaydet + + + + + Set as read + Okundu olarak işaretle + + + + Set comic as read + Çizgi romanı okundu olarak işaretle + + + + + Set as unread + Hepsini okunmadı işaretle + + + + Set comic as unread + Çizgi Romanı okunmadı olarak seç + + + + + manga + manga t?r? + + + + Set issue as manga + Sayıyı manga olarak ayarla + + + + + comic + komik + + + + Set issue as normal + Sayıyı normal olarak ayarla + + + + western manga + batı mangası + + + + Set issue as western manga + Konuyu western mangası olarak ayarla + + + + + web comic + web çizgi romanı + + + + Set issue as web comic + Sorunu web çizgi romanı olarak ayarla + + + + + yonkoma + d?rt panelli + + + + Set issue as yonkoma + Sorunu yonkoma olarak ayarla + + + + Show/Hide marks + Altçizgileri aç/kapa + + + + Show or hide read marks + Okundu işaretlerini göster yada gizle + + + + Show/Hide recent indicator + Son göstergeyi Göster/Gizle + + + + Show or hide recent indicator + Son göstergeyi göster veya gizle + + + + + Fullscreen mode on/off + Tam ekran modu açık/kapalı + + + + Help, About YACReader + YACReader hakkında yardım ve bilgi + + + + Add new folder + Yeni klasör ekle + + + + Add new folder to the current library + Geçerli kitaplığa yeni klasör ekle + + + + Delete folder + Klasörü sil + + + + Delete current folder from disk + Geçerli klasörü diskten sil + + + + Select root node + Kökü seçin + + + + Expand all nodes + Tüm düğümleri büyüt + + + + Collapse all nodes + Tüm düğümleri kapat + + + + Show options dialog + Ayarları göster + + + + Show comics server options dialog + Çizgi romanların server ayarlarını göster + + + + + Change between comics views + Çizgi roman görünümleri arasında değiştir + + + + Open folder... + Dosyayı aç... + + + + Set as uncompleted + Tamamlanmamış olarak ayarla + + + + Set as completed + Tamamlanmış olarak ayarla + + + + Set custom cover + Özel kapak ayarla + + + + Delete custom cover + Özel kapağı sil + + + + western manga (left to right) + Batı mangası (soldan sağa) + + + + Open containing folder... + Klasör açılıyor... + + + + Reset comic rating + Çizgi roman reytingini sıfırla + + + + Select all comics + Tüm çizgi romanları seç + + + + Edit + Düzen + + + + Assign current order to comics + Geçerli sırayı çizgi romanlara ata + + + + Update cover + Kapağı güncelle + + + + Delete selected comics + Seçili çizgi romanları sil + + + + Delete metadata from selected comics + Seçilen çizgi romanlardan meta verileri sil + + + + Download tags from Comic Vine + Etiketleri Comic Vine sitesinden indir + + + + Focus search line + Arama satırına odaklan + + + + Focus comics view + Çizgi roman görünümüne odaklanın + + + + Edit shortcuts + Kısayolları düzenle + + + + &Quit + &Çıkış + + + + Update folder + Klasörü güncelle + + + + Update current folder + Geçerli klasörü güncelle + + + + Scan legacy XML metadata + Eski XML meta verilerini tarayın + + + + Add new reading list + Yeni okuma listesi ekle + + + + Add a new reading list to the current library + Geçerli kitaplığa yeni bir okuma listesi ekle + + + + Remove reading list + Okuma listesini kaldır + + + + Remove current reading list from the library + Geçerli okuma listesini kütüphaneden kaldır + + + + Add new label + Yeni etiket ekle + + + + Add a new label to this library + Bu kitaplığa yeni bir etiket ekle + + + + Rename selected list + Seçilen listeyi yeniden adlandır + + + + Rename any selected labels or lists + Seçilen etiketleri ya da listeleri yeniden adlandır + + + + Add to... + Şuraya ekle... + + + + Favorites + Favoriler + + + + Add selected comics to favorites list + Seçilen çizgi romanları favoriler listesine ekle + + + + LocalComicListModel + + + file name + dosya adı + + + + NoLibrariesWidget + + + You don't have any libraries yet + Henüz bir kütüphaneye sahip değilsin + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>Yeni bir kütüphane oluşturabilmeniçin kütüphane</p><p>No olvides que puedes usar YACReader como una aplicación independiente para leer los cómics en tu ordenador.</p> + + + + create your first library + İlk kütüphaneni oluştur + + + + add an existing one + Var olan bir tane ekle + + + + NoSearchResultsWidget + + + No results + Sonuç yok + + + + OptionsDialog + + + + General + Genel + + + + + Libraries + Kütüphaneler + + + + Comic Flow + Comic Flow + + + + Grid view + Izgara görünümü + + + + + Appearance + Dış görünüş + + + + + Options + Ayarlar + + + + + Language + Dil + + + + + Application language + Uygulama dili + + + + + System default + Sistem varsayılanı + + + + Tray icon settings (experimental) + Tepsi simgesi ayarları (deneysel) + + + + Close to tray + Tepsiyi kapat + + + + Start into the system tray + Sistem tepsisinde başlat + + + + Edit Comic Vine API key + Comic Vine API anahtarını düzenle + + + + Comic Vine API key + Comic Vine API anahtarı + + + + ComicInfo.xml legacy support + ComicInfo.xml eski desteği + + + + Import metadata from ComicInfo.xml when adding new comics + Yeni çizgi roman eklerken meta verileri ComicInfo.xml'den içe aktarın + + + + Consider 'recent' items added or updated since X days ago + X gün öncesinden bu yana eklenen veya güncellenen 'en son' öğeleri göz önünde bulundurun + + + + Third party reader + Üçüncü taraf okuyucu + + + + Write {comic_file_path} where the path should go in the command + Komutta yolun gitmesi gereken yere {comic_file_path} yazın + + + + + Clear + Temizle + + + + Update libraries at startup + Başlangıçta kitaplıkları güncelleyin + + + + Try to detect changes automatically + Değişiklikleri otomatik olarak algılamayı deneyin + + + + Update libraries periodically + Kitaplıkları düzenli aralıklarla güncelleyin + + + + Interval: + Aralık: + + + + 30 minutes + 30 dakika + + + + 1 hour + 1 saat + + + + 2 hours + 2 saat + + + + 4 hours + 4 saat + + + + 8 hours + 8 saat + + + + 12 hours + 12 saat + + + + daily + günlük + + + + Update libraries at certain time + Kitaplıkları belirli bir zamanda güncelle + + + + Time: + Zaman: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + UYARI! Kütüphane güncellemeleri sırasında veritabanına yazma işlemi devre dışı bırakılır! +Uygulamayı aktif olarak kullanırken güncelleme planlamayın. +Otomatik güncellemeler sırasında uygulama, güncelleme bitene kadar bazı eylemleri engelleyecektir. +Otomatik güncellemeyi durdurmak için Kitaplıklar başlığının yanındaki yükleme göstergesine dokunun. + + + + Modifications detection + Değişiklik tespiti + + + + Compare the modified date of files when updating a library (not recommended) + Kitaplığı güncellerken dosyaların değiştirilme tarihini karşılaştırın (önerilmez) + + + + Enable background image + Arka plan resmini etkinleştir + + + + Opacity level + Matlık düzeyi + + + + Blur level + Bulanıklık düzeyi + + + + Use selected comic cover as background + Seçilen çizgi roman kapanığı arka plan olarak kullan + + + + Restore defautls + Varsayılanları geri yükle + + + + Background + Arka plan + + + + Display continue reading banner + Okuma devam et bannerını göster + + + + Display current comic banner + Mevcut çizgi roman banner'ını görüntüle + + + + Continue reading + Okumaya devam et + + + + My comics path + Çizgi Romanlarım + + + + Display + Görüntülemek + + + + Show time in current page information label + Geçerli sayfa bilgisi etiketinde zamanı göster + + + + "Go to flow" size + "Comic Flow'a git" boyutu + + + + Background color + Arka plan rengi + + + + Choose + Seç + + + + Scroll behaviour + Kaydırma davranışı + + + + Disable scroll animations and smooth scrolling + Kaydırma animasyonlarını ve düzgün kaydırmayı devre dışı bırakın + + + + Do not turn page using scroll + Kaydırmayı kullanarak sayfayı çevirmeyin + + + + Use single scroll step to turn page + Sayfayı çevirmek için tek kaydırma adımını kullanın + + + + Mouse mode + Fare modu + + + + Only Back/Forward buttons can turn pages + Yalnızca Geri/İleri düğmeleri sayfaları çevirebilir + + + + Use the Left/Right buttons to turn pages. + Sayfaları çevirmek için Sol/Sağ tuşlarını kullanın. + + + + Click left or right half of the screen to turn pages. + Sayfaları çevirmek için ekranın sol veya sağ yarısına tıklayın. + + + + Quick Navigation Mode + Hızlı Gezinti Kipi + + + + Disable mouse over activation + Etkinleştirme üzerinde fareyi devre dışı bırak + + + + Brightness + Parlaklık + + + + Contrast + Kontrast + + + + Gamma + Gama + + + + Reset + Yeniden başlat + + + + Image options + Sayfa ayarları + + + + Fit options + Sığdırma seçenekleri + + + + Enlarge images to fit width/height + Genişliğe/yüksekliği sığmaları için resimleri genişlet + + + + Double Page options + Çift Sayfa seçenekleri + + + + Show covers as single page + Kapakları tek sayfa olarak göster + + + + Scaling + Ölçeklendirme + + + + Scaling method + Ölçeklendirme yöntemi + + + + Nearest (fast, low quality) + En yakın (hızlı, düşük kalite) + + + + Bilinear + Çift doğrusal + + + + Lanczos (better quality) + Lanczos (daha kaliteli) + + + + Page Flow + Sayfa akışı + + + + Image adjustment + Resim ayarları + + + + + Restart is needed + Yeniden başlatılmalı + + + + Comics directory + Çizgi roman konumu + + + + PropertiesDialog + + + General info + Genel bilgi + + + + Plot + Argumento + + + + Authors + Yazarlar + + + + Publishing + Yayın + + + + Notes + Notlar + + + + Cover page + Kapak sayfası + + + + Load previous page as cover + Önceki sayfayı kapak olarak yükle + + + + Load next page as cover + Sonraki sayfayı kapak olarak yükle + + + + Reset cover to the default image + Kapağı varsayılan görüntüye sıfırla + + + + Load custom cover image + Özel kapak resmini yükle + + + + Series: + Seriler: + + + + Title: + Başlık: + + + + + + of: + ile ilgili: + + + + Issue number: + Yayın numarası: + + + + Volume: + Cilt: + + + + Arc number: + Ark numarası: + + + + Story arc: + Hiakye: + + + + alt. number: + alternatif sayı: + + + + Alternate series: + Alternatif seri: + + + + Series Group: + Seri Grubu: + + + + Genre: + Tür: + + + + Size: + Boyut: + + + + Writer(s): + Yazarlar: + + + + Penciller(s): + Çizenler: + + + + Inker(s): + Mürekkep(ler): + + + + Colorist(s): + Renklendiren: + + + + Letterer(s): + Mesaj(lar): + + + + Cover Artist(s): + Kapak artisti: + + + + Editor(s): + Editör(ler): + + + + Imprint: + Künye: + + + + Day: + Gün: + + + + Month: + Ay: + + + + Year: + Yıl: + + + + Publisher: + Yayıncı: + + + + Format: + Formato: + + + + Color/BW: + Renk/BW: + + + + Age rating: + Yaş sınırı: + + + + Type: + Tip: + + + + Language (ISO): + Dil (ISO): + + + + Synopsis: + Özet: + + + + Characters: + Karakterler: + + + + Teams: + Takımlar: + + + + Locations: + Konumlar: + + + + Main character or team: + Ana karakter veya takım: + + + + Review: + Gözden geçirmek: + + + + Notes: + Notlar: + + + + Tags: + Etiketler: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine bağlantısı: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> görüntüle </a> + + + + Not found + Bulunamadı + + + + Comic not found. You should update your library. + Çizgi roman bulunamadı. Kütüphaneyi güncellemelisin. + + + + Edit comic information + Çizgi roman bilgisini düzenle + + + + Edit selected comics information + Seçilen çizgi roman bilgilerini düzenle + + + + Invalid cover + Geçersiz kapak + + + + The image is invalid. + Resim geçersiz. + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer, YACReaderLibrary'nin başsız (gui yok) sürümüdür. + +Bu uygulama kalıcı ayarları destekler, bunları ayarlamak için bu dosyayı düzenleyin %1 +Mevcut ayarlar hakkında bilgi edinmek için lütfen https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md adresindeki belgelere bakın. + + + + QObject + + + Trace + İz + + + + Debug + Hata ayıkla + + + + Info + Bilgi + + + + Warning + Uyarı + + + + Error + Hata + + + + Fatal + Ölümcül + + + + Select custom cover + Özel kapak seçin + + + + Images (%1) + Resimler (%1) + + + + 7z lib not found + 7z lib bulunamadı + + + + unable to load 7z lib from ./utils + ./utils içinden 7z lib yüklenemedi + + + + The file could not be read or is not valid JSON. + Dosya okunamadı veya geçerli bir JSON değil. + + + + This theme is for %1, not %2. + Bu tema %2 için değil, %1 içindir. + + + + Libraries + Kütüphaneler + + + + Folders + Klasör + + + + Reading Lists + Okuma Listeleri + + + + RenameLibraryDialog + + + New Library Name : + Yeni Kütüphane Adı : + + + + Rename + Yeniden adlandır + + + + Cancel + Vazgeç + + + + Rename current library + Kütüphaneyi adlandır + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + Bulunan bölüm sayısı: %1 + + + + + page %1 of %2 + sayfa %1 / %2 + + + + Number of %1 found : %2 + Sayı %1, bulunan : %2 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + Lütfen bazı ek bilgiler sağlayın. + + + + Series: + Seriler: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Tam eşleme aramasını kullanın. Addaki bazı sözcüklerle eşleşen ciltleri bulmak istiyorsanız devre dışı bırakın. + + + + SearchVolume + + + Please provide some additional information. + Lütfen bazı ek bilgiler sağlayın. + + + + Series: + Seriler: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + Tam eşleme aramasını kullanın. Addaki bazı sözcüklerle eşleşen ciltleri bulmak istiyorsanız devre dışı bırakın. + + + + SelectComic + + + Please, select the right comic info. + Lütfen, doğru çizgi roman bilgisini seçin. + + + + comics + çizgi roman + + + + loading cover + kapak yükleniyor + + + + loading description + açıklama yükleniyor + + + + comic description unavailable + çizgi roman açıklaması mevcut değil + + + + SelectVolume + + + Please, select the right series for your comic. + Çizgi romanınız için doğru seriyi seçin. + + + + Filter: + Filtre: + + + + volumes + sayı + + + + Nothing found, clear the filter if any. + Hiçbir şey bulunamadı, varsa filtreyi temizleyin. + + + + loading cover + kapak yükleniyor + + + + loading description + açıklama yükleniyor + + + + volume description unavailable + cilt açıklaması kullanılamıyor + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + Aynı anda çeşitli çizgi romanlar için bilgi almaya çalışıyorsunuz, bunlar aynı serinin parçası mı? + + + + yes + evet + + + + no + hayır + + + + ServerConfigDialog + + + set port + Port Ayarla + + + + Server connectivity information + Sunucu bağlantı bilgileri + + + + Scan it! + Tara! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader, iOS ve Android cihazlarda kullanılabilir.<br/>Bunu <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> veya <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a> için keşfedin. + + + + Choose an IP address + IP adresi seçin + + + + Port + Liman + + + + enable the server + erişilebilir server + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + Lütfen, çizgi romanların bilgileriyle eşleşene kadar soldaki çizgi roman listesini sıralayın. + + + + sort comics to match comic information + çizgi roman bilgilerini eşleştirmek için çizgi romanları sıralayın + + + + issues + sayı + + + + remove selected comics + seçilen çizgi romanları kaldır + + + + restore all removed comics + tüm seçilen çizgi romanları geri yükle + + + + ThemeEditorDialog + + + Theme Editor + Tema Düzenleyici + + + + + + + + + + + - + - + + + + i + Ben + + + + Expand all + Tümünü genişlet + + + + Collapse all + Tümünü daralt + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + Kullanıcı arayüzünde seçilen değeri (macenta / geçişli / 0↔10) yanıp sönmek için basılı tutun. Sürümler orijinali geri yükler. + + + + Search… + Aramak… + + + + Light + Işık + + + + Dark + Karanlık + + + + ID: + İD: + + + + Display name: + Ekran adı: + + + + Variant: + Varyant: + + + + Theme info + Tema bilgisi + + + + Parameter + Parametre + + + + Value + Değer + + + + Save and apply + Kaydet ve uygula + + + + Export to file... + Dosyaya aktar... + + + + Load from file... + Dosyadan yükle... + + + + Close + Kapat + + + + Double-click to edit color + Rengi düzenlemek için çift tıklayın + + + + + + + + + true + doğru + + + + + + + false + YANLIŞ + + + + Double-click to toggle + Geçiş yapmak için çift tıklayın + + + + Double-click to edit value + Değeri düzenlemek için çift tıklayın + + + + + + Edit: %1 + Düzenleme: %1 + + + + Save theme + Temayı kaydet + + + + + JSON files (*.json);;All files (*) + JSON dosyaları (*.json);;Tüm dosyalar (*) + + + + Save failed + Kaydetme başarısız oldu + + + + Could not open file for writing: +%1 + Dosya yazmak için açılamadı: +%1 + + + + Load theme + Temayı yükle + + + + + + Load failed + Yükleme başarısız oldu + + + + Could not open file: +%1 + Dosya açılamadı: +%1 + + + + Invalid JSON: +%1 + Geçersiz JSON: +%1 + + + + Expected a JSON object. + Bir JSON nesnesi bekleniyordu. + + + + TitleHeader + + + SEARCH + ARA + + + + UpdateLibraryDialog + + + Updating.... + Güncelleniyor... + + + + Cancel + Vazgeç + + + + Update library + Kütüphaneyi güncelle + + + + Viewer + + + + Press 'O' to open comic. + 'O'ya basarak aç. + + + + Not found + Bulunamadı + + + + Comic not found + Çizgi roman bulunamadı + + + + Error opening comic + Çizgi roman açılırken hata + + + + CRC Error + CRC Hatası + + + + Loading...please wait! + Yükleniyor... lütfen bekleyin! + + + + Page not available! + Sayfa bulunamadı! + + + + Cover! + Kapak! + + + + Last page! + Son sayfa! + + + + VolumeComicsModel + + + title + başlık + + + + VolumesModel + + + year + yıl + + + + issues + sayı + + + + publisher + yayıncı + + + + YACReader3DFlowConfigWidget + + + Presets: + Hazırlayan: + + + + Classic look + Klasik görünüm + + + + Stripe look + Şerit görünüm + + + + Overlapped Stripe look + Çakışan şerit görünüm + + + + Modern look + Modern görünüm + + + + Roulette look + Rulet görünüm + + + + Show advanced settings + Daha fazla ayar göster + + + + Custom: + Kişisel: + + + + View angle + Bakış açısı + + + + Position + Pozisyon + + + + Cover gap + Kapak boşluğu + + + + Central gap + Boş merkaz + + + + Zoom + Yakınlaş + + + + Y offset + Y dengesi + + + + Z offset + Z dengesi + + + + Cover Angle + Kapak Açısı + + + + Visibility + Görünülebilirlik + + + + Light + Işık + + + + Max angle + Maksimum açı + + + + Low Performance + Düşük Performans + + + + High Performance + Yüksek performans + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + VSync kullan + + + + Performance: + Performans: + + + + YACReader::MainWindowViewer + + + &Open + &Aç + + + + Open a comic + Çizgi romanı aç + + + + New instance + Yeni örnek + + + + Open Folder + Dosyayı Aç + + + + Open image folder + Resim dosyasınıaç + + + + Open latest comic + En son çizgi romanı aç + + + + Open the latest comic opened in the previous reading session + Önceki okuma oturumunda açılan en son çizgi romanı aç + + + + Clear + Temizle + + + + Clear open recent list + Son açılanlar listesini temizle + + + + Save + Kaydet + + + + + Save current page + Geçerli sayfayı kaydet + + + + Previous Comic + Önce ki çizgi roman + + + + + + Open previous comic + Önceki çizgi romanı aç + + + + Next Comic + Sırada ki çizgi roman + + + + + + Open next comic + Sıradaki çizgi romanı aç + + + + &Previous + &Geri + + + + + + Go to previous page + Önceki sayfaya dön + + + + &Next + &İleri + + + + + + Go to next page + Sonra ki sayfaya geç + + + + Fit Height + Yüksekliğe Sığdır + + + + Fit image to height + Uygun yüksekliğe getir + + + + Fit Width + Uygun Genişlik + + + + Fit image to width + Görüntüyü sığdır + + + + Show full size + Tam erken + + + + Fit to page + Sayfaya sığdır + + + + Continuous scroll + Sürekli kaydırma + + + + Switch to continuous scroll mode + Sürekli kaydırma moduna geç + + + + Reset zoom + Yakınlaştırmayı sıfırla + + + + Show zoom slider + Yakınlaştırma çubuğunu göster + + + + Zoom+ + Yakınlaştır + + + + Zoom- + Uzaklaştır + + + + Rotate image to the left + Sayfayı sola yatır + + + + Rotate image to the right + Sayfayı sağa yator + + + + Double page mode + Çift sayfa modu + + + + Switch to double page mode + Çift sayfa moduna geç + + + + Double page manga mode + Çift sayfa manga kipi + + + + Reverse reading order in double page mode + Çift sayfa kipinde ters okuma sırası + + + + Go To + Git + + + + Go to page ... + Sayfata git... + + + + Options + Ayarlar + + + + YACReader options + YACReader ayarları + + + + + Help + Yardım + + + + Help, About YACReader + YACReader hakkında yardım ve bilgi + + + + Magnifying glass + Büyüteç + + + + Switch Magnifying glass + Büyüteç + + + + Set bookmark + Yer imi yap + + + + Set a bookmark on the current page + Sayfayı yer imi olarak ayarla + + + + Show bookmarks + Yer imlerini göster + + + + Show the bookmarks of the current comic + Bu çizgi romanın yer imlerini göster + + + + Show keyboard shortcuts + Klavye kısayollarını göster + + + + Show Info + Bilgiyi göster + + + + Close + Kapat + + + + Show Dictionary + Sözlüğü göster + + + + Show go to flow + "Comic Flow'a git"i göster + + + + Edit shortcuts + Kısayolları düzenle + + + + &File + &Dosya + + + + + Open recent + Son dosyaları aç + + + + File + Dosya + + + + Edit + Düzen + + + + View + Görünüm + + + + Go + Git + + + + Window + Pencere + + + + + + Open Comic + Çizgi Romanı Aç + + + + + + Comic files + Çizgi Roman Dosyaları + + + + Open folder + Dosyayı aç + + + + page_%1.jpg + sayfa_%1.jpg + + + + Image files (*.jpg) + Resim dosyaları (*.jpg) + + + + + Comics + Çizgi Roman + + + + + General + Genel + + + + + Magnifiying glass + Büyüteç + + + + + Page adjustement + Sayfa ayarı + + + + + Reading + Okuma + + + + Toggle fullscreen mode + Tam ekran kipini aç/kapat + + + + Hide/show toolbar + Araç çubuğunu göster/gizle + + + + Size up magnifying glass + Büyüteci büyüt + + + + Size down magnifying glass + Büyüteci küçült + + + + Zoom in magnifying glass + Büyüteci yakınlaştır + + + + Zoom out magnifying glass + Büyüteci uzaklaştır + + + + Reset magnifying glass + Büyüteci sıfırla + + + + Toggle between fit to width and fit to height + Genişliğe sığdır ile yüksekliğe sığdır arasında geçiş yap + + + + Autoscroll down + Otomatik aşağı kaydır + + + + Autoscroll up + Otomatik yukarı kaydır + + + + Autoscroll forward, horizontal first + Otomatik ileri kaydır, önce yatay + + + + Autoscroll backward, horizontal first + Otomatik geri kaydır, önce yatay + + + + Autoscroll forward, vertical first + Otomatik ileri kaydır, önce dikey + + + + Autoscroll backward, vertical first + Otomatik geri kaydır, önce dikey + + + + Move down + Aşağı git + + + + Move up + Yukarı git + + + + Move left + Sola git + + + + Move right + Sağa git + + + + Go to the first page + İlk sayfaya git + + + + Go to the last page + En son sayfaya git + + + + Offset double page to the left + Çift sayfayı sola kaydır + + + + Offset double page to the right + Çift sayfayı sağa kaydır + + + + There is a new version available + Yeni versiyon mevcut + + + + Do you want to download the new version? + Yeni versiyonu indirmek ister misin ? + + + + Remind me in 14 days + 14 gün içinde hatırlat + + + + Not now + Şimdi değil + + + + YACReader::TrayIconController + + + &Restore + &Geri Yükle + + + + Systray + Sistem tepsisi + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary sistem tepsisinde çalışmaya devam edecektir. Programı sonlandırmak için sistem tepsisi simgesinin bağlam menüsünden <b>Çık</b>'ı seçin. + + + + YACReaderFieldEdit + + + + Click to overwrite + Üzerine yazmak için tıkla + + + + Restore to default + Varsayılana ayarla + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + Üzerine yazmak için tıkla + + + + Restore to default + Varsayılana ayarla + + + + YACReaderOptionsDialog + + + Save + Kaydet + + + + Cancel + Vazgeç + + + + Edit shortcuts + Kısayolları düzenle + + + + Shortcuts + Kısayollar + + + + YACReaderSearchLineEdit + + + type to search + aramak için yazınız + + + + YACReaderSlider + + + Reset + Yeniden başlat - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + YACReader çevirmeni - - &Resume - + + + Translation + Çeviri - - Save log - + + clear + temizle - - Log file (*.log) - + + Service not available + Servis kullanılamıyor diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_zh_CN.ts b/YACReaderLibraryServer/yacreaderlibraryserver_zh_CN.ts index 45baf7bd7..ca25decee 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_zh_CN.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_zh_CN.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + 标签名称: - - 7z not found - + + Choose a color: + 选择标签颜色: - - Format not supported - + + accept + 接受 + + + + cancel + 取消 - LogWindow + AddLibraryDialog + + + Comics folder : + 漫画文件夹: + + + + Library name : + 库名: + - - Log window - + + Add + 添加 - - &Pause - + + Cancel + 取消 - - &Save - + + Add an existing library + 添加一个现有库 + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要拥有自己的API密钥才能够连接Comic Vine. 你可以通过这个链接获得一个免费的<a href="http://www.comicvine.com/api/">API</a>密钥 - - &Copy - + + Paste here your Comic Vine API key + 在此粘贴你的Comic Vine API - - Level: - + + Accept + 接受 - - &Auto scroll - + + Cancel + 取消 - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + 配色方案 + + + + System + 系统 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 风俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 删除此用户导入的主题 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定义: + + + + Import theme... + 导入主题... + + + + Theme + 主题 + + + + Theme editor + 主题编辑器 + + + + Open Theme Editor... + 打开主题编辑器... + + + + Theme editor error + 主题编辑器错误 + + + + The current theme JSON could not be loaded. + 无法加载当前主题 JSON。 + + + + Import theme + 导入主题 + + + + JSON files (*.json);;All files (*) + JSON 文件 (*.json);;所有文件 (*) + + + + Could not import theme from: +%1 + 无法从以下位置导入主题: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + 无法从以下位置导入主题: +%1 + +%2 + + + + Import failed + 导入失败 - QObject + BookmarksDialog - - Trace - + + Lastest Page + 尾页 - - Debug - + + Close + 关闭 - - Info - + + Click on any image to go to the bookmark + 点击任意图片以跳转至相应书签位置 - - Warning - + + + Loading... + 载入中... + + + ClassicComicsView - - Error - + + Hide comic flow + 隐藏 Comic Flow + + + + ComicModel + + + yes + - - Fatal - + + no + + + + + Title + 标题 + + + + File Name + 文件名 + + + + Pages + 页数 + + + + Size + 大小 + + + + Read + 阅读 + + + + Current Page + 当前页 + + + + Publication Date + 出版日期 + + + + Rating + 评分 + + + + Series + 系列 + + + + Volume + + + + + Story Arc + 故事线 + + + + ComicVineDialog + + + skip + 忽略 + + + + back + 返回 + + + + next + 下一步 + + + + search + 搜索 + + + + close + 关闭 + + + + + comic %1 of %2 - %3 + 第 %1 本 共 %2 本 - %3 + + + + + + Looking for volume... + 搜索卷... + + + + %1 comics selected + 已选择 %1 本漫画 + + + + Error connecting to ComicVine + ComicVine 连接时出错 + + + + + Retrieving tags for : %1 + 正在检索标签: %1 + + + + Retrieving volume info... + 正在接收卷信息... + + + + Looking for comic... + 搜索漫画中... + + + + ContinuousPageWidget + + + Loading page %1 + 正在加载页面 %1 + + + + CreateLibraryDialog + + + Comics folder : + 漫画文件夹: + + + + Library Name : + 库名: + + + + Create + 创建 + + + + Cancel + 取消 + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + 创建一个新的库可能需要几分钟时间,您可以先停止该进程,稍后可以通过更新库选项来更新数据。 + + + + Create new library + 创建新的漫画库 + + + + Path not found + 未找到路径 + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + 所选路径不存在或不是有效路径. 确保您具有此文件夹的写入权限 + + + + EditShortcutsDialog + + + Restore defaults + 恢复默认 + + + + To change a shortcut, double click in the key combination and type the new keys. + 更改快捷键: 双击按键组合并输入新的映射. + + + + Shortcuts settings + 快捷键设置 + + + + Shortcut in use + 快捷键被占用 + + + + The shortcut "%1" is already assigned to other function + 快捷键 "%1" 已被映射至其他功能 + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + 该文件夹还没有漫画 + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + 此标签尚未包含漫画 + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + 此阅读列表尚未包含任何漫画 + + + + EmptySpecialListWidget + + + No favorites + 没有收藏 + + + + You are not reading anything yet, come on!! + 你还没有阅读任何东西,加油!! + + + + There are no recent comics! + 没有最近的漫画! + + + + ExportComicsInfoDialog + + + Output file : + 输出文件: + + + + Create + 创建 + + + + Cancel + 取消 + + + + Export comics info + 导出漫画信息 + + + + Destination database name + 目标数据库名称 + + + + Problem found while writing + 写入时出现问题 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 选定的输出文件路径不存在或路径无效. 确保您具有此文件夹的写入权限 + + + + ExportLibraryDialog + + + Output folder : + 输出文件夹: + + + + Create + 创建 + + + + Cancel + 取消 + + + + Create covers package + 创建封面包 + + + + Problem found while writing + 写入时出现问题 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 选定的输出文件路径不存在或路径无效. 确保您具有此文件夹的写入权限 + + + + Destination directory + 目标目录 + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + 第 %1 页 CRC 校验失败: 部分页面将无法正确显示 + + + + Unknown error opening the file + 打开文件时出现未知错误 + + + + 7z not found + 未找到 7z + + + + Format not supported + 不支持的文件格式 + + + + GoToDialog + + + Page : + 页码 : + + + + Go To + 跳转 + + + + Cancel + 取消 + + + + + Total pages : + 总页数: + + + + Go to... + 跳转至 ... + + + + GoToFlowToolBar + + + Page : + 页码 : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + 显示信息 + + + HelpAboutDialog - - Level - + + About + 关于 - - Message - + + Help + 帮助 + + + + System info + 系统信息 + + + + ImportComicsInfoDialog + + + Import comics info + 导入漫画信息 + + + + Info database location : + 数据库地址: + + + + Import + 导入 + + + + Cancel + 取消 + + + + Comics info file (*.ydb) + 漫画信息文件(*.ydb) + + + + ImportLibraryDialog + + + Library Name : + 库名: + + + + Package location : + 打包地址: + + + + Destination folder : + 目标文件夹: + + + + Unpack + 解压 + + + + Cancel + 取消 + + + + Extract a catalog + 提取目录 + + + + Compresed library covers (*.clc) + 已压缩的库封面 (*.clc) + + + + ImportWidget + + + stop + 停止 + + + + Some of the comics being added... + 正在添加漫画... + + + + Importing comics + 正在导入漫画 + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary现在正在创建一个新库。</p><p>这可能需要几分钟时间,您可以先停止该进程,稍后可以通过更新库选项来更新数据。</p> + + + + Updating the library + 正在更新库 + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>正在更新当前库。要获得更快的更新,请经常更新您的库。</p><p>您可以停止该进程,稍后继续更新操作。</p> + + + + Upgrading the library + 正在更新库 + + + + <p>The current library is being upgraded, please wait.</p> + <p>正在更新当前漫画库, 请稍候.</p> + + + + Scanning the library + 正在扫描库 + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>正在扫描当前库的旧版 XML metadata 信息。</p><p>这只需要执行一次,且只有当创建库的 YACReaderLibrary 版本低于 9.8.2 时。</p> + + + + LibraryWindow + + + YACReader Library + YACReader 库 + + + + + + comic + 漫画 + + + + + + manga + 日本漫画 + + + + + + western manga (left to right) + 欧美漫画(从左到右) + + + + + + web comic + 网络漫画 + + + + + + 4koma (top to botom) + 四格漫画(从上到下) + + + + + + + Set type + 设置类型 + + + + Library + + + + + Folder + 文件夹 + + + + Comic + 漫画 + + + + Upgrade failed + 更新失败 + + + + There were errors during library upgrade in: + 漫画库更新时出现错误: + + + + Update needed + 需要更新 + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + 此库是使用旧版本的YACReaderLibrary创建的. 它需要更新. 现在更新? + + + + Download new version + 下载新版本 + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + 此库是使用较新版本的YACReaderLibrary创建的。 立即下载新版本? + + + + Library not available + 库不可用 + + + + Library '%1' is no longer available. Do you want to remove it? + 库 '%1' 不再可用。 你想删除它吗? + + + + Old library + 旧的库 + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 库 '%1' 是通过旧版本的YACReaderLibrary创建的。 必须再次创建。 你想现在创建吗? + + + + + Copying comics... + 复制漫画中... + + + + + Moving comics... + 移动漫画中... + + + + Add new folder + 添加新的文件夹 + + + + Folder name: + 文件夹名称: + + + + No folder selected + 没有选中的文件夹 + + + + Please, select a folder first + 请先选择一个文件夹 + + + + Error in path + 路径错误 + + + + There was an error accessing the folder's path + 访问文件夹的路径时出错 + + + + Delete folder + 删除文件夹 + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + 所选文件夹及其所有内容将从磁盘中删除。 你确定吗? + + + + + Unable to delete + 无法删除 + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + 尝试删除所选文件夹时出现问题。 请检查写入权限,并确保没有其他应用程序在使用这些文件夹或文件。 + + + + Add new reading lists + 添加新的阅读列表 + + + + + List name: + 列表名称: + + + + Delete list/label + 删除 列表/标签 + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + 所选项目将被删除,您的漫画或文件夹将不会从您的磁盘中删除。 你确定吗? + + + + Rename list name + 重命名列表 + + + + Open folder... + 打开文件夹... + + + + Update folder + 更新文件夹 + + + + Rescan library for XML info + 重新扫描库的 XML 信息 + + + + Set as uncompleted + 设为未完成 + + + + Set as completed + 设为已完成 + + + + Set as read + 设为已读 + + + + + Set as unread + 设为未读 + + + + Set custom cover + 设置自定义封面 + + + + Delete custom cover + 删除自定义封面 + + + + Save covers + 保存封面 + + + + You are adding too many libraries. + 您添加的库太多了。 + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + 您添加的库太多了。 + +一般情况只需要一个顶级的库,您可以使用左侧边栏中的文件夹功能来进行分类管理。 + +YACReaderLibrary不会阻止您创建更多的库,但是您应该保持较低的库数量来提升性能。 + + + + + YACReader not found + YACReader 未找到 + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + 未找到YACReader. YACReader应安装在与YACReaderLibrary相同的文件夹中. + + + + YACReader not found. There might be a problem with your YACReader installation. + 未找到YACReader. YACReader的安装可能有问题. + + + + Error + 错误 + + + + Error opening comic with third party reader. + 使用第三方阅读器打开漫画时出错。 + + + + Library not found + 未找到库 + + + + The selected folder doesn't contain any library. + 所选文件夹不包含任何库。 + + + + Are you sure? + 你确定吗? + + + + Do you want remove + 你想要删除 + + + + library? + 库? + + + + Remove and delete metadata + 移除并删除元数据 + + + + Library info + 图书馆信息 + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + 尝试删除所选漫画时出现问题。 请检查所选文件或包含文件夹中的写入权限。 + + + + Assign comics numbers + 分配漫画编号 + + + + Assign numbers starting in: + 从以下位置开始分配编号: + + + + Invalid image + 图片无效 + + + + The selected file is not a valid image. + 所选文件不是有效图像。 + + + + Error saving cover + 保存封面时出错 + + + + There was an error saving the cover image. + 保存封面图像时出错。 + + + + Error creating the library + 创建库时出错 + + + + Error updating the library + 更新库时出错 + + + + Error opening the library + 打开库时出错 + + + + Delete comics + 删除漫画 + + + + All the selected comics will be deleted from your disk. Are you sure? + 所有选定的漫画都将从您的磁盘中删除。你确定吗? + + + + Remove comics + 移除漫画 + + + + Comics will only be deleted from the current label/list. Are you sure? + 漫画只会从当前标签/列表中删除。 你确定吗? + + + + Library name already exists + 库名已存在 + + + + There is another library with the name '%1'. + 已存在另一个名为'%1'的库。 + + + + LibraryWindowActions + + + Create a new library + 创建一个新的库 + + + + Open an existing library + 打开现有的库 + + + + + Export comics info + 导出漫画信息 + + + + + Import comics info + 导入漫画信息 + + + + Pack covers + 打包封面 + + + + Pack the covers of the selected library + 打包所选库的封面 + + + + Unpack covers + 解压封面 + + + + Unpack a catalog + 解压目录 + + + + Update library + 更新库 + + + + Update current library + 更新当前库 + + + + Rename library + 重命名库 + + + + Rename current library + 重命名当前库 + + + + Remove library + 移除库 + + + + Remove current library from your collection + 从您的集合中移除当前库 + + + + Rescan library for XML info + 重新扫描库的 XML 信息 + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + 尝试查找漫画文件内嵌的 XML 信息。只有当创建库的 YACReaderLibrary 版本低于 9.8.2 或者使用第三方软件嵌入 XML 信息时,才需要执行该操作。 + + + + Show library info + 显示图书馆信息 + + + + Show information about the current library + 显示当前库的信息 + + + + Open current comic + 打开当前漫画 + + + + Open current comic on YACReader + 用YACReader打开漫画 + + + + Save selected covers to... + 选中的封面保存到... + + + + Save covers of the selected comics as JPG files + 保存所选的封面为jpg + + + + + Set as read + 设为已读 + + + + Set comic as read + 漫画设为已读 + + + + + Set as unread + 设为未读 + + + + Set comic as unread + 漫画设为未读 + + + + + manga + 日本漫画 + + + + Set issue as manga + 将问题设置为漫画 + + + + + comic + 漫画 + + + + Set issue as normal + 设置漫画为 + + + + western manga + 欧美漫画 + + + + Set issue as western manga + 设置为欧美漫画 + + + + + web comic + 网络漫画 + + + + Set issue as web comic + 设置为网络漫画 + + + + + yonkoma + 四格漫画 + + + + Set issue as yonkoma + 设置为四格漫画 + + + + Show/Hide marks + 显示/隐藏标记 + + + + Show or hide read marks + 显示或隐藏阅读标记 + + + + Show/Hide recent indicator + 显示/隐藏最近的指示标志 + + + + Show or hide recent indicator + 显示或隐藏最近的指示标志 + + + + + Fullscreen mode on/off + 全屏模式 开/关 + + + + Help, About YACReader + 帮助, 关于 YACReader + + + + Add new folder + 添加新的文件夹 + + + + Add new folder to the current library + 在当前库下添加新的文件夹 + + + + Delete folder + 删除文件夹 + + + + Delete current folder from disk + 从磁盘上删除当前文件夹 + + + + Select root node + 选择根节点 + + + + Expand all nodes + 展开所有节点 + + + + Collapse all nodes + 折叠所有节点 + + + + Show options dialog + 显示选项对话框 + + + + Show comics server options dialog + 显示漫画服务器选项对话框 + + + + + Change between comics views + 漫画视图之间的变化 + + + + Open folder... + 打开文件夹... + + + + Set as uncompleted + 设为未完成 + + + + Set as completed + 设为已完成 + + + + Set custom cover + 设置自定义封面 + + + + Delete custom cover + 删除自定义封面 + + + + western manga (left to right) + 欧美漫画(从左到右) + + + + Open containing folder... + 打开包含文件夹... + + + + Reset comic rating + 重置漫画评分 + + + + Select all comics + 全选漫画 + + + + Edit + 编辑 + + + + Assign current order to comics + 将当前序号分配给漫画 + + + + Update cover + 更新封面 + + + + Delete selected comics + 删除所选的漫画 + + + + Delete metadata from selected comics + 从选定的漫画中删除元数据 + + + + Download tags from Comic Vine + 从 Comic Vine 下载标签 + + + + Focus search line + 聚焦于搜索行 + + + + Focus comics view + 聚焦于漫画视图 + + + + Edit shortcuts + 编辑快捷键 + + + + &Quit + 退出(&Q) + + + + Update folder + 更新文件夹 + + + + Update current folder + 更新当前文件夹 + + + + Scan legacy XML metadata + 扫描旧版 XML 元数据 + + + + Add new reading list + 添加新的阅读列表 + + + + Add a new reading list to the current library + 在当前库添加新的阅读列表 + + + + Remove reading list + 移除阅读列表 + + + + Remove current reading list from the library + 从当前库移除阅读列表 + + + + Add new label + 添加新标签 + + + + Add a new label to this library + 在当前库添加标签 + + + + Rename selected list + 重命名列表 + + + + Rename any selected labels or lists + 重命名任何选定的标签或列表 + + + + Add to... + 添加到... + + + + Favorites + 收藏夹 + + + + Add selected comics to favorites list + 将所选漫画添加到收藏夹列表 + + + + LocalComicListModel + + + file name + 文件名 + + + + NoLibrariesWidget + + + You don't have any libraries yet + 你还没有库 + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>您可以在任何文件夹中创建库,YACReaderLibrary将导入此文件夹中的所有漫画和文件夹。如果已有库,则可以打开它们。</p><p>您可以把YACReader当成独立应用来阅读电脑上的漫画。</p> + + + + create your first library + 创建你的第一个库 + + + + add an existing one + 添加一个现有库 + + + + NoSearchResultsWidget + + + No results + 没有结果 + + + + OptionsDialog + + + + General + 常规 + + + + + Libraries + + + + + Comic Flow + Comic Flow + + + + Grid view + 网格视图 + + + + + Appearance + 外貌 + + + + + Options + 选项 + + + + + Language + 语言 + + + + + Application language + 应用程序语言 + + + + + System default + 系统默认 + + + + Tray icon settings (experimental) + 托盘图标设置 (实验特性) + + + + Close to tray + 关闭至托盘 + + + + Start into the system tray + 启动至系统托盘 + + + + Edit Comic Vine API key + 编辑Comic Vine API 密匙 + + + + Comic Vine API key + Comic Vine API 密匙 + + + + ComicInfo.xml legacy support + ComicInfo.xml 旧版支持 + + + + Import metadata from ComicInfo.xml when adding new comics + 添加新漫画时从 ComicInfo.xml 导入元数据 + + + + Consider 'recent' items added or updated since X days ago + 参考自 X 天前添加或更新的“最近”项目 + + + + Third party reader + 第三方阅读器 + + + + Write {comic_file_path} where the path should go in the command + 在命令中应将路径写入 {comic_file_path} + + + + + Clear + 清空 + + + + Update libraries at startup + 启动时更新库 + + + + Try to detect changes automatically + 尝试自动检测变化 + + + + Update libraries periodically + 定期更新库 + + + + Interval: + 间隔: + + + + 30 minutes + 30分钟 + + + + 1 hour + 1小时 + + + + 2 hours + 2小时 + + + + 4 hours + 4小时 + + + + 8 hours + 8小时 + + + + 12 hours + 12小时 + + + + daily + 每天 + + + + Update libraries at certain time + 定时更新库 + + + + Time: + 时间: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + 警告! 在库更新期间,将禁用对数据库的写入! +当您可能正在积极使用该应用程序时,请勿安排更新。 +在自动更新期间,应用程序将阻止某些操作,直到更新完成。 +要停止自动更新,请点击库标题旁边的加载指示器。 + + + + Modifications detection + 修改检测 + + + + Compare the modified date of files when updating a library (not recommended) + 更新库时比较文件的修改日期(不推荐) + + + + Enable background image + 启用背景图片 + + + + Opacity level + 透明度 + + + + Blur level + 模糊 + + + + Use selected comic cover as background + 使用选定的漫画封面做背景 + + + + Restore defautls + 恢复默认值 + + + + Background + 背景 + + + + Display continue reading banner + 显示继续阅读横幅 + + + + Display current comic banner + 显示当前漫画横幅 + + + + Continue reading + 继续阅读 + + + + My comics path + 我的漫画路径 + + + + Display + 展示 + + + + Show time in current page information label + 在当前页面信息标签中显示时间 + + + + "Go to flow" size + “转到 Comic Flow”大小 + + + + Background color + 背景颜色 + + + + Choose + 选择 + + + + Scroll behaviour + 滚动效果 + + + + Disable scroll animations and smooth scrolling + 禁用滚动动画和平滑滚动 + + + + Do not turn page using scroll + 滚动时不翻页 + + + + Use single scroll step to turn page + 使用单滚动步骤翻页 + + + + Mouse mode + 鼠标模式 + + + + Only Back/Forward buttons can turn pages + 只有后退/前进按钮可以翻页 + + + + Use the Left/Right buttons to turn pages. + 使用向左/向右按钮翻页。 + + + + Click left or right half of the screen to turn pages. + 单击屏幕的左半部分或右半部分即可翻页。 + + + + Quick Navigation Mode + 快速导航模式 + + + + Disable mouse over activation + 禁用鼠标激活 + + + + Brightness + 亮度 + + + + Contrast + 对比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 图片选项 + + + + Fit options + 适应项 + + + + Enlarge images to fit width/height + 放大图片以适应宽度/高度 + + + + Double Page options + 双页选项 + + + + Show covers as single page + 显示封面为单页 + + + + Scaling + 缩放 + + + + Scaling method + 缩放方法 + + + + Nearest (fast, low quality) + 最近(快速,低质量) + + + + Bilinear + 双线性 + + + + Lanczos (better quality) + Lanczos(质量更好) + + + + Page Flow + 页面流 + + + + Image adjustment + 图像调整 + + + + + Restart is needed + 需要重启 + + + + Comics directory + 漫画目录 + + + + PropertiesDialog + + + General info + 基本信息 + + + + Plot + 情节 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Notes + 笔记 + + + + Cover page + 封面 + + + + Load previous page as cover + 加载上一页作为封面 + + + + Load next page as cover + 加载下一页作为封面 + + + + Reset cover to the default image + 将封面重置为默认图像 + + + + Load custom cover image + 加载自定义封面图片 + + + + Series: + 系列: + + + + Title: + 标题: + + + + + + of: + 的: + + + + Issue number: + 发行刊号: + + + + Volume: + 卷: + + + + Arc number: + 世界线数量: + + + + Story arc: + 故事线: + + + + alt. number: + 备选编号: + + + + Alternate series: + 备用系列: + + + + Series Group: + 系列组: + + + + Genre: + 类型: + + + + Size: + 大小: + + + + Writer(s): + 作者: + + + + Penciller(s): + 线稿师: + + + + Inker(s): + 上墨师: + + + + Colorist(s): + 上色师: + + + + Letterer(s): + 嵌字师: + + + + Cover Artist(s): + 封面设计: + + + + Editor(s): + 编辑: + + + + Imprint: + 印记: + + + + Day: + 日: + + + + Month: + 月: + + + + Year: + 年: + + + + Publisher: + 出版商: + + + + Format: + 格式: + + + + Color/BW: + 彩色/黑白: + + + + Age rating: + 年龄分级: + + + + Type: + 类型: + + + + Language (ISO): + 语言(ISO): + + + + Synopsis: + 简介: + + + + Characters: + 角色: + + + + Teams: + 团队: + + + + Locations: + 地点: + + + + Main character or team: + 主要角色或团队: + + + + Review: + 审查: + + + + Notes: + 笔记: + + + + Tags: + 标签: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 连接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + + + + Not found + 未找到 + + + + Comic not found. You should update your library. + 未找到漫画,请先更新您的库. + + + + Edit comic information + 编辑漫画信息 + + + + Edit selected comics information + 编辑选中的漫画信息 + + + + Invalid cover + 封面无效 + + + + The image is invalid. + 该图像无效。 + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的无头(无 GUI)版本。 + +此应用程序支持持久设置,要设置它们,请编辑此文件 %1 +要了解可用设置,请查看文档:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + 追踪 + + + + Debug + 除错 + + + + Info + 信息 + + + + Warning + 警告 + + + + Error + 错误 + + + + Fatal + 严重错误 + + + + Select custom cover + 选择自定义封面 + + + + Images (%1) + 图片 (%1) + + + + 7z lib not found + 未找到 7z 库文件 + + + + unable to load 7z lib from ./utils + 无法从 ./utils 载入 7z 库文件 + + + + The file could not be read or is not valid JSON. + 无法读取该文件或者该文件不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主题适用于 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 文件夹 + + + + Reading Lists + 阅读列表 + + + + RenameLibraryDialog + + + New Library Name : + 新库名: + + + + Rename + 重命名 + + + + Cancel + 取消 + + + + Rename current library + 重命名当前库 + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + 搜索结果: %1 + + + + + page %1 of %2 + 第 %1 页 共 %2 页 + + + + Number of %1 found : %2 + 第 %1 页 共: %2 条 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + 请提供附加信息. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精确匹配搜索。如果您想要查找与名称中某些单词匹配的卷,请禁用。 + + + + SearchVolume + + + Please provide some additional information. + 请提供附加信息. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精确匹配搜索。如果您想要查找与名称中某些单词匹配的卷,请禁用。 + + + + SelectComic + + + Please, select the right comic info. + 请正确选择漫画信息. + + + + comics + 漫画 + + + + loading cover + 加载封面 + + + + loading description + 加载描述 + + + + comic description unavailable + 漫画描述不可用 + + + + SelectVolume + + + Please, select the right series for your comic. + 请选择正确的漫画系列。 + + + + Filter: + 筛选: + + + + volumes + + + + + Nothing found, clear the filter if any. + 未找到任何内容,如果有,请清除筛选器。 + + + + loading cover + 加载封面 + + + + loading description + 加载描述 + + + + volume description unavailable + 卷描述不可用 + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + 您正在尝试同时获取各种漫画的信息,它们是同一系列的吗? + + + + yes + + + + + no + + + + + ServerConfigDialog + + + set port + 设置端口 + + + + Server connectivity information + 服务器连接信息 + + + + Scan it! + 扫一扫! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 适用于 iOS 和 Android 设备。<br/>搜索 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + + + + Choose an IP address + 选择IP地址 + + + + Port + 端口 + + + + enable the server + 启用服务器 + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + 请在左侧对漫画列表进行排序,直到它与漫画的信息相符。 + + + + sort comics to match comic information + 排序漫画以匹配漫画信息 + + + + issues + 发行 + + + + remove selected comics + 移除所选漫画 + + + + restore all removed comics + 恢复所有移除的漫画 + + + + ThemeEditorDialog + + + Theme Editor + 主题编辑器 + + + + + + + + + + + - + - + + + + i + + + + + Expand all + 全部展开 + + + + Collapse all + 全部折叠 + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中闪烁所选值(洋红色/切换/0↔10)。发布后恢复原样。 + + + + Search… + 搜索… + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + ID: + ID: + + + + Display name: + 显示名称: + + + + Variant: + 变体: + + + + Theme info + 主题信息 + + + + Parameter + 范围 + + + + Value + 价值 + + + + Save and apply + 保存并应用 + + + + Export to file... + 导出到文件... + + + + Load from file... + 从文件加载... + + + + Close + 关闭 + + + + Double-click to edit color + 双击编辑颜色 + + + + + + + + + true + 真的 + + + + + + + false + 错误的 + + + + Double-click to toggle + 双击切换 + + + + Double-click to edit value + 双击编辑值 + + + + + + Edit: %1 + 编辑:%1 + + + + Save theme + 保存主题 + + + + + JSON files (*.json);;All files (*) + JSON 文件 (*.json);;所有文件 (*) + + + + Save failed + 保存失败 + + + + Could not open file for writing: +%1 + 无法打开文件进行写入: +%1 + + + + Load theme + 加载主题 + + + + + + Load failed + 加载失败 + + + + Could not open file: +%1 + 无法打开文件: +%1 + + + + Invalid JSON: +%1 + 无效的 JSON: +%1 + + + + Expected a JSON object. + 需要一个 JSON 对象。 + + + + TitleHeader + + + SEARCH + 搜索 + + + + UpdateLibraryDialog + + + Updating.... + 更新中... + + + + Cancel + 取消 + + + + Update library + 更新库 + + + + Viewer + + + + Press 'O' to open comic. + 按下 'O' 以打开漫画. + + + + Not found + 未找到 + + + + Comic not found + 未找到漫画 + + + + Error opening comic + 打开漫画时发生错误 + + + + CRC Error + CRC 校验失败 + + + + Loading...please wait! + 载入中... 请稍候! + + + + Page not available! + 页面不可用! + + + + Cover! + 封面! + + + + Last page! + 尾页! + + + + VolumeComicsModel + + + title + 标题 + + + + VolumesModel + + + year + + + + + issues + 发行 + + + + publisher + 出版者 + + + + YACReader3DFlowConfigWidget + + + Presets: + 预设: + + + + Classic look + 经典 + + + + Stripe look + 条状 + + + + Overlapped Stripe look + 重叠条状 + + + + Modern look + 现代 + + + + Roulette look + 轮盘 + + + + Show advanced settings + 显示高级选项 + + + + Custom: + 自定义: + + + + View angle + 视角 + + + + Position + 位置 + + + + Cover gap + 封面间距 + + + + Central gap + 中心间距 + + + + Zoom + 缩放 + + + + Y offset + Y位移 + + + + Z offset + Z位移 + + + + Cover Angle + 封面角度 + + + + Visibility + 透明度 + + + + Light + 亮度 + + + + Max angle + 最大角度 + + + + Low Performance + 低性能 + + + + High Performance + 高性能 + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高图像质量, 性能更差) + + + + Performance: + 性能: + + + + YACReader::MainWindowViewer + + + &Open + 打开(&O) + + + + Open a comic + 打开漫画 + + + + New instance + 新建实例 + + + + Open Folder + 打开文件夹 + + + + Open image folder + 打开图片文件夹 + + + + Open latest comic + 打开最近的漫画 + + + + Open the latest comic opened in the previous reading session + 打开最近阅读漫画 + + + + Clear + 清空 + + + + Clear open recent list + 清空最近访问列表 + + + + Save + 保存 + + + + + Save current page + 保存当前页面 + + + + Previous Comic + 上一个漫画 + + + + + + Open previous comic + 打开上一个漫画 + + + + Next Comic + 下一个漫画 + + + + + + Open next comic + 打开下一个漫画 + + + + &Previous + 上一页(&P) + + + + + + Go to previous page + 转至上一页 + + + + &Next + 下一页(&N) + + + + + + Go to next page + 转至下一页 + + + + Fit Height + 适应高度 + + + + Fit image to height + 缩放图片以适应高度 + + + + Fit Width + 适合宽度 + + + + Fit image to width + 缩放图片以适应宽度 + + + + Show full size + 显示全尺寸 + + + + Fit to page + 适应页面 + + + + Continuous scroll + 连续滚动 + + + + Switch to continuous scroll mode + 切换到连续滚动模式 + + + + Reset zoom + 重置缩放 + + + + Show zoom slider + 显示缩放滑块 + + + + Zoom+ + 放大 + + + + Zoom- + 缩小 + + + + Rotate image to the left + 向左旋转图片 + + + + Rotate image to the right + 向右旋转图片 + + + + Double page mode + 双页模式 + + + + Switch to double page mode + 切换至双页模式 + + + + Double page manga mode + 双页漫画模式 + + + + Reverse reading order in double page mode + 双页模式 (逆序阅读) + + + + Go To + 跳转 + + + + Go to page ... + 跳转至页面 ... + + + + Options + 选项 + + + + YACReader options + YACReader 选项 + + + + + Help + 帮助 + + + + Help, About YACReader + 帮助, 关于 YACReader + + + + Magnifying glass + 放大镜 + + + + Switch Magnifying glass + 切换放大镜 + + + + Set bookmark + 设置书签 + + + + Set a bookmark on the current page + 在当前页面设置书签 + + + + Show bookmarks + 显示书签 + + + + Show the bookmarks of the current comic + 显示当前漫画的书签 + + + + Show keyboard shortcuts + 显示键盘快捷键 + + + + Show Info + 显示信息 + + + + Close + 关闭 + + + + Show Dictionary + 显示字典 + + + + Show go to flow + 显示“转到 Comic Flow” + + + + Edit shortcuts + 编辑快捷键 + + + + &File + 文件(&F) + + + + + Open recent + 最近打开的文件 + + + + File + 文件 + + + + Edit + 编辑 + + + + View + 查看 + + + + Go + 转到 + + + + Window + 窗口 + + + + + + Open Comic + 打开漫画 + + + + + + Comic files + 漫画文件 + + + + Open folder + 打开文件夹 + + + + page_%1.jpg + 页_%1.jpg + + + + Image files (*.jpg) + 图像文件 (*.jpg) + + + + + Comics + 漫画 + + + + + General + 常规 + + + + + Magnifiying glass + 放大镜 + + + + + Page adjustement + 页面调整 + + + + + Reading + 阅读 + + + + Toggle fullscreen mode + 切换全屏模式 + + + + Hide/show toolbar + 隐藏/显示 工具栏 + + + + Size up magnifying glass + 增大放大镜尺寸 + + + + Size down magnifying glass + 减小放大镜尺寸 + + + + Zoom in magnifying glass + 增大缩放级别 + + + + Zoom out magnifying glass + 减小缩放级别 + + + + Reset magnifying glass + 重置放大镜 + + + + Toggle between fit to width and fit to height + 切换显示为"适应宽度"或"适应高度" + + + + Autoscroll down + 向下自动滚动 + + + + Autoscroll up + 向上自动滚动 + + + + Autoscroll forward, horizontal first + 向前自动滚动,水平优先 + + + + Autoscroll backward, horizontal first + 向后自动滚动,水平优先 + + + + Autoscroll forward, vertical first + 向前自动滚动,垂直优先 + + + + Autoscroll backward, vertical first + 向后自动滚动,垂直优先 + + + + Move down + 向下移动 + + + + Move up + 向上移动 + + + + Move left + 向左移动 + + + + Move right + 向右移动 + + + + Go to the first page + 转到第一页 + + + + Go to the last page + 转到最后一页 + + + + Offset double page to the left + 双页向左偏移 + + + + Offset double page to the right + 双页向右偏移 + + + + There is a new version available + 有新版本可用 + + + + Do you want to download the new version? + 你要下载新版本吗? + + + + Remind me in 14 days + 14天后提醒我 + + + + Not now + 现在不 + + + + YACReader::TrayIconController + + + &Restore + 复位(&R) + + + + Systray + 系统托盘 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 将继续在系统托盘中运行. 想要终止程序, 请在系统托盘图标的上下文菜单中选择<b>退出</b>. + + + + YACReaderFieldEdit + + + + Click to overwrite + 点击以覆盖 + + + + Restore to default + 恢复默认 + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + 点击以覆盖 + + + + Restore to default + 恢复默认 + + + + YACReaderOptionsDialog + + + Save + 保存 + + + + Cancel + 取消 + + + + Edit shortcuts + 编辑快捷键 + + + + Shortcuts + 快捷键 + + + + YACReaderSearchLineEdit + + + type to search + 搜索类型 + + + + YACReaderSlider + + + Reset + 重置 - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + YACReader 翻译 - - &Resume - + + + Translation + 翻译 - - Save log - + + clear + 清空 - - Log file (*.log) - + + Service not available + 服务不可用 diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_zh_HK.ts b/YACReaderLibraryServer/yacreaderlibraryserver_zh_HK.ts index bf29a6a1b..955790945 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_zh_HK.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_zh_HK.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + 標籤名稱: - - 7z not found - + + Choose a color: + 選擇標籤顏色: - - Format not supported - + + accept + 接受 + + + + cancel + 取消 - LogWindow + AddLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library name : + 庫名: + - - Log window - + + Add + 添加 - - &Pause - + + Cancel + 取消 - - &Save - + + Add an existing library + 添加一個現有庫 + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 - - &Copy - + + Paste here your Comic Vine API key + 在此粘貼你的Comic Vine API - - Level: - + + Accept + 接受 - - &Auto scroll - + + Cancel + 取消 - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + 配色方案 + + + + System + 系統 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 風俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 刪除此使用者匯入的主題 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定義: + + + + Import theme... + 導入主題... + + + + Theme + 主題 + + + + Theme editor + 主題編輯器 + + + + Open Theme Editor... + 開啟主題編輯器... + + + + Theme editor error + 主題編輯器錯誤 + + + + The current theme JSON could not be loaded. + 無法載入目前主題 JSON。 + + + + Import theme + 導入主題 + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Could not import theme from: +%1 + 無法從以下位置匯入主題: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + 無法從以下位置匯入主題: +%1 + +%2 + + + + Import failed + 導入失敗 - QObject + BookmarksDialog - - Trace - + + Lastest Page + 尾頁 - - Debug - + + Close + 關閉 - - Info - + + Click on any image to go to the bookmark + 點擊任意圖片以跳轉至相應書簽位置 - - Warning - + + + Loading... + 載入中... + + + ClassicComicsView - - Error - + + Hide comic flow + 隱藏 Comic Flow + + + + ComicModel + + + yes + - - Fatal - + + no + + + + + Title + 標題 + + + + File Name + 檔案名 + + + + Pages + 頁數 + + + + Size + 大小 + + + + Read + 閱讀 + + + + Current Page + 當前頁 + + + + Publication Date + 發行日期 + + + + Rating + 評分 + + + + Series + 系列 + + + + Volume + 體積 + + + + Story Arc + 故事線 + + + + ComicVineDialog + + + skip + 忽略 + + + + back + 返回 + + + + next + 下一步 + + + + search + 搜索 + + + + close + 關閉 + + + + + comic %1 of %2 - %3 + 第 %1 本 共 %2 本 - %3 + + + + + + Looking for volume... + 搜索卷... + + + + %1 comics selected + 已選擇 %1 本漫畫 + + + + Error connecting to ComicVine + ComicVine 連接時出錯 + + + + + Retrieving tags for : %1 + 正在檢索標籤: %1 + + + + Retrieving volume info... + 正在接收卷資訊... + + + + Looking for comic... + 搜索漫畫中... + + + + ContinuousPageWidget + + + Loading page %1 + 正在載入頁面 %1 + + + + CreateLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library Name : + 庫名: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + 創建一個新的庫可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。 + + + + Create new library + 創建新的漫畫庫 + + + + Path not found + 未找到路徑 + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + 所選路徑不存在或不是有效路徑. 確保您具有此檔夾的寫入許可權 + + + + EditShortcutsDialog + + + Restore defaults + 恢復默認 + + + + To change a shortcut, double click in the key combination and type the new keys. + 更改快捷鍵: 雙擊按鍵組合並輸入新的映射. + + + + Shortcuts settings + 快捷鍵設置 + + + + Shortcut in use + 快捷鍵被佔用 + + + + The shortcut "%1" is already assigned to other function + 快捷鍵 "%1" 已被映射至其他功能 + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + 該資料夾還沒有漫畫 + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + 此標籤尚未包含漫畫 + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + 此閱讀列表尚未包含任何漫畫 + + + + EmptySpecialListWidget + + + No favorites + 沒有收藏 + + + + You are not reading anything yet, come on!! + 你還沒有閱讀任何東西,加油!! + + + + There are no recent comics! + 沒有最近的漫畫! + + + + ExportComicsInfoDialog + + + Output file : + 輸出檔: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Export comics info + 導出漫畫資訊 + + + + Destination database name + 目標資料庫名稱 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + ExportLibraryDialog + + + Output folder : + 輸出檔夾: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create covers package + 創建封面包 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + Destination directory + 目標目錄 + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + 第 %1 頁 CRC 校驗失敗: 部分頁面將無法正確顯示 + + + + Unknown error opening the file + 打開檔時出現未知錯誤 + + + + 7z not found + 未找到 7z + + + + Format not supported + 不支持的檔格式 + + + + GoToDialog + + + Page : + 頁碼 : + + + + Go To + 跳轉 + + + + Cancel + 取消 + + + + + Total pages : + 總頁數: + + + + Go to... + 跳轉至 ... + + + + GoToFlowToolBar + + + Page : + 頁碼 : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + 顯示資訊 + + + HelpAboutDialog - - Level - + + About + 關於 - - Message - + + Help + 幫助 + + + + System info + 系統資訊 + + + + ImportComicsInfoDialog + + + Import comics info + 導入漫畫資訊 + + + + Info database location : + 資料庫地址: + + + + Import + 導入 + + + + Cancel + 取消 + + + + Comics info file (*.ydb) + 漫畫資訊檔(*.ydb) + + + + ImportLibraryDialog + + + Library Name : + 庫名: + + + + Package location : + 打包地址: + + + + Destination folder : + 目標檔夾: + + + + Unpack + 解壓 + + + + Cancel + 取消 + + + + Extract a catalog + 提取目錄 + + + + Compresed library covers (*.clc) + 已壓縮的庫封面 (*.clc) + + + + ImportWidget + + + stop + 停止 + + + + Some of the comics being added... + 正在添加漫畫... + + + + Importing comics + 正在導入漫畫 + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary現在正在創建一個新庫。</p><p>這可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。</p> + + + + Updating the library + 正在更新庫 + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>正在更新當前庫。要獲得更快的更新,請經常更新您的庫。</p><p>您可以停止該進程,稍後繼續更新操作。</p> + + + + Upgrading the library + 正在更新庫 + + + + <p>The current library is being upgraded, please wait.</p> + <p>正在更新當前漫畫庫, 請稍候.</p> + + + + Scanning the library + 正在掃描庫 + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>正在掃描當前庫的舊版 XML metadata 資訊。</p><p>這只需要執行一次,且只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 時。</p> + + + + LibraryWindow + + + YACReader Library + YACReader 庫 + + + + + + comic + 漫畫 + + + + + + manga + 漫畫 + + + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + + + web comic + 網路漫畫 + + + + + + 4koma (top to botom) + 4koma(由上至下) + + + + + + + Set type + 套裝類型 + + + + Library + + + + + Folder + 檔夾 + + + + Comic + 漫畫 + + + + Upgrade failed + 更新失敗 + + + + There were errors during library upgrade in: + 漫畫庫更新時出現錯誤: + + + + Update needed + 需要更新 + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + 此庫是使用舊版本的YACReaderLibrary創建的. 它需要更新. 現在更新? + + + + Download new version + 下載新版本 + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + 此庫是使用較新版本的YACReaderLibrary創建的。 立即下載新版本? + + + + Library not available + 庫不可用 + + + + Library '%1' is no longer available. Do you want to remove it? + 庫 '%1' 不再可用。 你想刪除它嗎? + + + + Old library + 舊的庫 + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? + + + + + Copying comics... + 複製漫畫中... + + + + + Moving comics... + 移動漫畫中... + + + + Add new folder + 添加新的檔夾 + + + + Folder name: + 檔夾名稱: + + + + No folder selected + 沒有選中的檔夾 + + + + Please, select a folder first + 請先選擇一個檔夾 + + + + Error in path + 路徑錯誤 + + + + There was an error accessing the folder's path + 訪問檔夾的路徑時出錯 + + + + Delete folder + 刪除檔夾 + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + 所選檔夾及其所有內容將從磁片中刪除。 你確定嗎? + + + + + Unable to delete + 無法刪除 + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + 嘗試刪除所選檔夾時出現問題。 請檢查寫入許可權,並確保沒有其他應用程式在使用這些檔夾或檔。 + + + + Add new reading lists + 添加新的閱讀列表 + + + + + List name: + 列表名稱: + + + + Delete list/label + 刪除 列表/標籤 + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + 所選項目將被刪除,您的漫畫或檔夾將不會從您的磁片中刪除。 你確定嗎? + + + + Rename list name + 重命名列表 + + + + Open folder... + 打開檔夾... + + + + Update folder + 更新檔夾 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set as read + 設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + Save covers + 保存封面 + + + + You are adding too many libraries. + 您添加的庫太多了。 + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + 您添加的庫太多了。 + +一般情況只需要一個頂級的庫,您可以使用左側邊欄中的檔夾功能來進行分類管理。 + +YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低的庫數量來提升性能。 + + + + + YACReader not found + YACReader 未找到 + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + 未找到YACReader. YACReader應安裝在與YACReaderLibrary相同的檔夾中. + + + + YACReader not found. There might be a problem with your YACReader installation. + 未找到YACReader. YACReader的安裝可能有問題. + + + + Error + 錯誤 + + + + Error opening comic with third party reader. + 使用第三方閱讀器開啟漫畫時出錯。 + + + + Library not found + 未找到庫 + + + + The selected folder doesn't contain any library. + 所選檔夾不包含任何庫。 + + + + Are you sure? + 你確定嗎? + + + + Do you want remove + 你想要刪除 + + + + library? + 庫? + + + + Remove and delete metadata + 移除並刪除元數據 + + + + Library info + 圖書館資訊 + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + 嘗試刪除所選漫畫時出現問題。 請檢查所選檔或包含檔夾中的寫入許可權。 + + + + Assign comics numbers + 分配漫畫編號 + + + + Assign numbers starting in: + 從以下位置開始分配編號: + + + + Invalid image + 圖片無效 + + + + The selected file is not a valid image. + 所選檔案不是有效影像。 + + + + Error saving cover + 儲存封面時發生錯誤 + + + + There was an error saving the cover image. + 儲存封面圖片時發生錯誤。 + + + + Error creating the library + 創建庫時出錯 + + + + Error updating the library + 更新庫時出錯 + + + + Error opening the library + 打開庫時出錯 + + + + Delete comics + 刪除漫畫 + + + + All the selected comics will be deleted from your disk. Are you sure? + 所有選定的漫畫都將從您的磁片中刪除。你確定嗎? + + + + Remove comics + 移除漫畫 + + + + Comics will only be deleted from the current label/list. Are you sure? + 漫畫只會從當前標籤/列表中刪除。 你確定嗎? + + + + Library name already exists + 庫名已存在 + + + + There is another library with the name '%1'. + 已存在另一個名為'%1'的庫。 + + + + LibraryWindowActions + + + Create a new library + 創建一個新的庫 + + + + Open an existing library + 打開現有的庫 + + + + + Export comics info + 導出漫畫資訊 + + + + + Import comics info + 導入漫畫資訊 + + + + Pack covers + 打包封面 + + + + Pack the covers of the selected library + 打包所選庫的封面 + + + + Unpack covers + 解壓封面 + + + + Unpack a catalog + 解壓目錄 + + + + Update library + 更新庫 + + + + Update current library + 更新當前庫 + + + + Rename library + 重命名庫 + + + + Rename current library + 重命名當前庫 + + + + Remove library + 移除庫 + + + + Remove current library from your collection + 從您的集合中移除當前庫 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 + + + + Show library info + 顯示圖書館資訊 + + + + Show information about the current library + 顯示當前庫的信息 + + + + Open current comic + 打開當前漫畫 + + + + Open current comic on YACReader + 用YACReader打開漫畫 + + + + Save selected covers to... + 選中的封面保存到... + + + + Save covers of the selected comics as JPG files + 保存所選的封面為jpg + + + + + Set as read + 設為已讀 + + + + Set comic as read + 漫畫設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set comic as unread + 漫畫設為未讀 + + + + + manga + 漫畫 + + + + Set issue as manga + 將問題設定為漫畫 + + + + + comic + 漫畫 + + + + Set issue as normal + 設置發行狀態為正常發行 + + + + western manga + 西方漫畫 + + + + Set issue as western manga + 將問題設定為西方漫畫 + + + + + web comic + 網路漫畫 + + + + Set issue as web comic + 將問題設定為網路漫畫 + + + + + yonkoma + 四科馬 + + + + Set issue as yonkoma + 將問題設定為 yonkoma + + + + Show/Hide marks + 顯示/隱藏標記 + + + + Show or hide read marks + 顯示或隱藏閱讀標記 + + + + Show/Hide recent indicator + 顯示/隱藏最近的指標 + + + + Show or hide recent indicator + 顯示或隱藏最近的指示器 + + + + + Fullscreen mode on/off + 全屏模式 開/關 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Add new folder + 添加新的檔夾 + + + + Add new folder to the current library + 在當前庫下添加新的檔夾 + + + + Delete folder + 刪除檔夾 + + + + Delete current folder from disk + 從磁片上刪除當前檔夾 + + + + Select root node + 選擇根節點 + + + + Expand all nodes + 展開所有節點 + + + + Collapse all nodes + 折疊所有節點 + + + + Show options dialog + 顯示選項對話框 + + + + Show comics server options dialog + 顯示漫畫伺服器選項對話框 + + + + + Change between comics views + 漫畫視圖之間的變化 + + + + Open folder... + 打開檔夾... + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + Open containing folder... + 打開包含檔夾... + + + + Reset comic rating + 重置漫畫評分 + + + + Select all comics + 全選漫畫 + + + + Edit + 編輯 + + + + Assign current order to comics + 將當前序號分配給漫畫 + + + + Update cover + 更新封面 + + + + Delete selected comics + 刪除所選的漫畫 + + + + Delete metadata from selected comics + 從選定的漫畫中刪除元數據 + + + + Download tags from Comic Vine + 從 Comic Vine 下載標籤 + + + + Focus search line + 聚焦於搜索行 + + + + Focus comics view + 聚焦於漫畫視圖 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &Quit + 退出(&Q) + + + + Update folder + 更新檔夾 + + + + Update current folder + 更新當前檔夾 + + + + Scan legacy XML metadata + 掃描舊版 XML 元數據 + + + + Add new reading list + 添加新的閱讀列表 + + + + Add a new reading list to the current library + 在當前庫添加新的閱讀列表 + + + + Remove reading list + 移除閱讀列表 + + + + Remove current reading list from the library + 從當前庫移除閱讀列表 + + + + Add new label + 添加新標籤 + + + + Add a new label to this library + 在當前庫添加標籤 + + + + Rename selected list + 重命名列表 + + + + Rename any selected labels or lists + 重命名任何選定的標籤或列表 + + + + Add to... + 添加到... + + + + Favorites + 收藏夾 + + + + Add selected comics to favorites list + 將所選漫畫添加到收藏夾列表 + + + + LocalComicListModel + + + file name + 檔案名 + + + + NoLibrariesWidget + + + You don't have any libraries yet + 你還沒有庫 + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>您可以在任何檔夾中創建庫,YACReaderLibrary將導入此檔夾中的所有漫畫和文件夾。如果已有庫,則可以打開它們。</p><p>您可以把YACReader當成獨立應用來閱讀電腦上的漫畫。</p> + + + + create your first library + 創建你的第一個庫 + + + + add an existing one + 添加一個現有庫 + + + + NoSearchResultsWidget + + + No results + 沒有結果 + + + + OptionsDialog + + + + General + 常規 + + + + + Libraries + + + + + Comic Flow + Comic Flow + + + + Grid view + 網格視圖 + + + + + Appearance + 外貌 + + + + + Options + 選項 + + + + + Language + 語言 + + + + + Application language + 應用程式語言 + + + + + System default + 系統預設 + + + + Tray icon settings (experimental) + 託盤圖示設置 (實驗特性) + + + + Close to tray + 關閉至託盤 + + + + Start into the system tray + 啟動至系統託盤 + + + + Edit Comic Vine API key + 編輯Comic Vine API 密匙 + + + + Comic Vine API key + Comic Vine API 密匙 + + + + ComicInfo.xml legacy support + ComicInfo.xml 遺留支持 + + + + Import metadata from ComicInfo.xml when adding new comics + 新增漫畫時從 ComicInfo.xml 匯入元數據 + + + + Consider 'recent' items added or updated since X days ago + 考慮自 X 天前新增或更新的「最近」項目 + + + + Third party reader + 第三方閱讀器 + + + + Write {comic_file_path} where the path should go in the command + 在命令中應將路徑寫入 {comic_file_path} + + + + + Clear + 清空 + + + + Update libraries at startup + 啟動時更新庫 + + + + Try to detect changes automatically + 嘗試自動偵測變化 + + + + Update libraries periodically + 定期更新庫 + + + + Interval: + 間隔: + + + + 30 minutes + 30分鐘 + + + + 1 hour + 1小時 + + + + 2 hours + 2小時 + + + + 4 hours + 4小時 + + + + 8 hours + 8小時 + + + + 12 hours + 12小時 + + + + daily + 日常的 + + + + Update libraries at certain time + 定時更新庫 + + + + Time: + 時間: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + 警告!在庫更新期間,將停用對資料庫的寫入! +當您可能正在積極使用應用程式時,請勿安排更新。 +在自動更新期間,應用程式將阻止某些操作,直到更新完成。 +若要停止自動更新,請點選庫標題旁的載入指示器。 + + + + Modifications detection + 修改檢測 + + + + Compare the modified date of files when updating a library (not recommended) + 更新庫時比較文件的修改日期(不建議) + + + + Enable background image + 啟用背景圖片 + + + + Opacity level + 透明度 + + + + Blur level + 模糊 + + + + Use selected comic cover as background + 使用選定的漫畫封面做背景 + + + + Restore defautls + 恢復默認值 + + + + Background + 背景 + + + + Display continue reading banner + 顯示繼續閱讀橫幅 + + + + Display current comic banner + 顯示目前漫畫橫幅 + + + + Continue reading + 繼續閱讀 + + + + My comics path + 我的漫畫路徑 + + + + Display + 展示 + + + + Show time in current page information label + 在目前頁面資訊標籤中顯示時間 + + + + "Go to flow" size + 「前往 Comic Flow」大小 + + + + Background color + 背景顏色 + + + + Choose + 選擇 + + + + Scroll behaviour + 滾動效果 + + + + Disable scroll animations and smooth scrolling + 停用滾動動畫和平滑滾動 + + + + Do not turn page using scroll + 滾動時不翻頁 + + + + Use single scroll step to turn page + 使用單滾動步驟翻頁 + + + + Mouse mode + 滑鼠模式 + + + + Only Back/Forward buttons can turn pages + 只有後退/前進按鈕可以翻頁 + + + + Use the Left/Right buttons to turn pages. + 使用向左/向右按鈕翻頁。 + + + + Click left or right half of the screen to turn pages. + 點擊螢幕的左半部或右半部即可翻頁。 + + + + Quick Navigation Mode + 快速導航模式 + + + + Disable mouse over activation + 禁用滑鼠啟動 + + + + Brightness + 亮度 + + + + Contrast + 對比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 圖片選項 + + + + Fit options + 適應項 + + + + Enlarge images to fit width/height + 放大圖片以適應寬度/高度 + + + + Double Page options + 雙頁選項 + + + + Show covers as single page + 顯示封面為單頁 + + + + Scaling + 縮放 + + + + Scaling method + 縮放方法 + + + + Nearest (fast, low quality) + 最近(快速,低品質) + + + + Bilinear + 雙線性 + + + + Lanczos (better quality) + Lanczos(品質更好) + + + + Page Flow + 頁面流 + + + + Image adjustment + 圖像調整 + + + + + Restart is needed + 需要重啟 + + + + Comics directory + 漫畫目錄 + + + + PropertiesDialog + + + General info + 基本資訊 + + + + Plot + 情節 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Notes + 筆記 + + + + Cover page + 封面 + + + + Load previous page as cover + 載入上一頁作為封面 + + + + Load next page as cover + 載入下一頁作為封面 + + + + Reset cover to the default image + 將封面重設為預設圖片 + + + + Load custom cover image + 載入自訂封面圖片 + + + + Series: + 系列: + + + + Title: + 標題: + + + + + + of: + 的: + + + + Issue number: + 發行數量: + + + + Volume: + 卷: + + + + Arc number: + 世界線數量: + + + + Story arc: + 故事線: + + + + alt. number: + 替代。數字: + + + + Alternate series: + 替代系列: + + + + Series Group: + 系列組: + + + + Genre: + 類型: + + + + Size: + 大小: + + + + Writer(s): + 作者: + + + + Penciller(s): + 線稿: + + + + Inker(s): + 墨稿: + + + + Colorist(s): + 上色: + + + + Letterer(s): + 文本: + + + + Cover Artist(s): + 封面設計: + + + + Editor(s): + 編輯: + + + + Imprint: + 印記: + + + + Day: + 日: + + + + Month: + 月: + + + + Year: + 年: + + + + Publisher: + 出版者: + + + + Format: + 格式: + + + + Color/BW: + 彩色/黑白: + + + + Age rating: + 年齡等級: + + + + Type: + 類型: + + + + Language (ISO): + 語言(ISO): + + + + Synopsis: + 概要: + + + + Characters: + 角色: + + + + Teams: + 團隊: + + + + Locations: + 地點: + + + + Main character or team: + 主要角色或團隊: + + + + Review: + 審查: + + + + Notes: + 筆記: + + + + Tags: + 標籤: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + + + + Not found + 未找到 + + + + Comic not found. You should update your library. + 未找到漫畫,請先更新您的庫. + + + + Edit comic information + 編輯漫畫資訊 + + + + Edit selected comics information + 編輯選中的漫畫資訊 + + + + Invalid cover + 封面無效 + + + + The image is invalid. + 該圖像無效。 + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的無頭(無 GUI)版本。 + +此應用程式支援持久性設置,要設定它們,請編輯此文件 %1 +若要了解可用設置,請查看文件:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + 追蹤 + + + + Debug + 除錯 + + + + Info + 資訊 + + + + Warning + 警告 + + + + Error + 錯誤 + + + + Fatal + 嚴重錯誤 + + + + Select custom cover + 選擇自訂封面 + + + + Images (%1) + 圖片 (%1) + + + + 7z lib not found + 未找到 7z 庫檔 + + + + unable to load 7z lib from ./utils + 無法從 ./utils 載入 7z 庫檔 + + + + The file could not be read or is not valid JSON. + 無法讀取該檔案或該檔案不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主題適用於 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 檔夾 + + + + Reading Lists + 閱讀列表 + + + + RenameLibraryDialog + + + New Library Name : + 新庫名: + + + + Rename + 重命名 + + + + Cancel + 取消 + + + + Rename current library + 重命名當前庫 + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + 搜索結果: %1 + + + + + page %1 of %2 + 第 %1 頁 共 %2 頁 + + + + Number of %1 found : %2 + 第 %1 頁 共: %2 條 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SearchVolume + + + Please provide some additional information. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SelectComic + + + Please, select the right comic info. + 請正確選擇漫畫資訊. + + + + comics + 漫畫 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + comic description unavailable + 漫畫描述不可用 + + + + SelectVolume + + + Please, select the right series for your comic. + 請選擇正確的漫畫系列。 + + + + Filter: + 篩選: + + + + volumes + + + + + Nothing found, clear the filter if any. + 未找到任何內容,如果有,請清除過濾器。 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + volume description unavailable + 卷描述不可用 + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + 您正在嘗試同時獲取各種漫畫的資訊,它們是同一系列的嗎? + + + + yes + + + + + no + + + + + ServerConfigDialog + + + set port + 設置端口 + + + + Server connectivity information + 伺服器連接資訊 + + + + Scan it! + 掃一掃! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 適用於 iOS 和 Android 裝置。 <br/>發現它適用於 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> 或 <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>。 + + + + Choose an IP address + 選擇IP地址 + + + + Port + 端口 + + + + enable the server + 啟用伺服器 + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + 請在左側對漫畫列表進行排序,直到它與漫畫的資訊相符。 + + + + sort comics to match comic information + 排序漫畫以匹配漫畫資訊 + + + + issues + 發行 + + + + remove selected comics + 移除所選漫畫 + + + + restore all removed comics + 恢復所有移除的漫畫 + + + + ThemeEditorDialog + + + Theme Editor + 主題編輯器 + + + + + + + + + + + - + - + + + + i + + + + + Expand all + 全部展開 + + + + Collapse all + 全部折疊 + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中閃爍所選值(洋紅色/切換/0↔10)。發布後恢復原樣。 + + + + Search… + 搜尋… + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + ID: + ID: + + + + Display name: + 顯示名稱: + + + + Variant: + 變體: + + + + Theme info + 主題訊息 + + + + Parameter + 範圍 + + + + Value + 價值 + + + + Save and apply + 儲存並應用 + + + + Export to file... + 匯出到文件... + + + + Load from file... + 從檔案載入... + + + + Close + 關閉 + + + + Double-click to edit color + 雙擊編輯顏色 + + + + + + + + + true + 真的 + + + + + + + false + 錯誤的 + + + + Double-click to toggle + 按兩下切換 + + + + Double-click to edit value + 雙擊編輯值 + + + + + + Edit: %1 + 編輯:%1 + + + + Save theme + 儲存主題 + + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Save failed + 保存失敗 + + + + Could not open file for writing: +%1 + 無法開啟文件進行寫入: +%1 + + + + Load theme + 載入主題 + + + + + + Load failed + 載入失敗 + + + + Could not open file: +%1 + 無法開啟檔案: +%1 + + + + Invalid JSON: +%1 + 無效的 JSON: +%1 + + + + Expected a JSON object. + 需要一個 JSON 物件。 + + + + TitleHeader + + + SEARCH + 搜索 + + + + UpdateLibraryDialog + + + Updating.... + 更新中... + + + + Cancel + 取消 + + + + Update library + 更新庫 + + + + Viewer + + + + Press 'O' to open comic. + 按下 'O' 以打開漫畫. + + + + Not found + 未找到 + + + + Comic not found + 未找到漫畫 + + + + Error opening comic + 打開漫畫時發生錯誤 + + + + CRC Error + CRC 校驗失敗 + + + + Loading...please wait! + 載入中... 請稍候! + + + + Page not available! + 頁面不可用! + + + + Cover! + 封面! + + + + Last page! + 尾頁! + + + + VolumeComicsModel + + + title + 標題 + + + + VolumesModel + + + year + + + + + issues + 發行 + + + + publisher + 出版者 + + + + YACReader3DFlowConfigWidget + + + Presets: + 預設: + + + + Classic look + 經典 + + + + Stripe look + 條狀 + + + + Overlapped Stripe look + 重疊條狀 + + + + Modern look + 現代 + + + + Roulette look + 輪盤 + + + + Show advanced settings + 顯示高級選項 + + + + Custom: + 自定義: + + + + View angle + 視角 + + + + Position + 位置 + + + + Cover gap + 封面間距 + + + + Central gap + 中心間距 + + + + Zoom + 縮放 + + + + Y offset + Y位移 + + + + Z offset + Z位移 + + + + Cover Angle + 封面角度 + + + + Visibility + 透明度 + + + + Light + 亮度 + + + + Max angle + 最大角度 + + + + Low Performance + 低性能 + + + + High Performance + 高性能 + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) + + + + Performance: + 性能: + + + + YACReader::MainWindowViewer + + + &Open + 打開(&O) + + + + Open a comic + 打開漫畫 + + + + New instance + 新建實例 + + + + Open Folder + 打開檔夾 + + + + Open image folder + 打開圖片檔夾 + + + + Open latest comic + 打開最近的漫畫 + + + + Open the latest comic opened in the previous reading session + 打開最近閱讀漫畫 + + + + Clear + 清空 + + + + Clear open recent list + 清空最近訪問列表 + + + + Save + 保存 + + + + + Save current page + 保存當前頁面 + + + + Previous Comic + 上一個漫畫 + + + + + + Open previous comic + 打開上一個漫畫 + + + + Next Comic + 下一個漫畫 + + + + + + Open next comic + 打開下一個漫畫 + + + + &Previous + 上一頁(&P) + + + + + + Go to previous page + 轉至上一頁 + + + + &Next + 下一頁(&N) + + + + + + Go to next page + 轉至下一頁 + + + + Fit Height + 適應高度 + + + + Fit image to height + 縮放圖片以適應高度 + + + + Fit Width + 適合寬度 + + + + Fit image to width + 縮放圖片以適應寬度 + + + + Show full size + 顯示全尺寸 + + + + Fit to page + 適應頁面 + + + + Continuous scroll + 連續滾動 + + + + Switch to continuous scroll mode + 切換到連續滾動模式 + + + + Reset zoom + 重置縮放 + + + + Show zoom slider + 顯示縮放滑塊 + + + + Zoom+ + 放大 + + + + Zoom- + 縮小 + + + + Rotate image to the left + 向左旋轉圖片 + + + + Rotate image to the right + 向右旋轉圖片 + + + + Double page mode + 雙頁模式 + + + + Switch to double page mode + 切換至雙頁模式 + + + + Double page manga mode + 雙頁漫畫模式 + + + + Reverse reading order in double page mode + 雙頁模式 (逆序閱讀) + + + + Go To + 跳轉 + + + + Go to page ... + 跳轉至頁面 ... + + + + Options + 選項 + + + + YACReader options + YACReader 選項 + + + + + Help + 幫助 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Magnifying glass + 放大鏡 + + + + Switch Magnifying glass + 切換放大鏡 + + + + Set bookmark + 設置書簽 + + + + Set a bookmark on the current page + 在當前頁面設置書簽 + + + + Show bookmarks + 顯示書簽 + + + + Show the bookmarks of the current comic + 顯示當前漫畫的書簽 + + + + Show keyboard shortcuts + 顯示鍵盤快捷鍵 + + + + Show Info + 顯示資訊 + + + + Close + 關閉 + + + + Show Dictionary + 顯示字典 + + + + Show go to flow + 顯示「前往 Comic Flow」 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &File + 檔(&F) + + + + + Open recent + 最近打開的檔 + + + + File + + + + + Edit + 編輯 + + + + View + 查看 + + + + Go + 轉到 + + + + Window + 窗口 + + + + + + Open Comic + 打開漫畫 + + + + + + Comic files + 漫畫檔 + + + + Open folder + 打開檔夾 + + + + page_%1.jpg + 頁_%1.jpg + + + + Image files (*.jpg) + 圖像檔 (*.jpg) + + + + + Comics + 漫畫 + + + + + General + 常規 + + + + + Magnifiying glass + 放大鏡 + + + + + Page adjustement + 頁面調整 + + + + + Reading + 閱讀 + + + + Toggle fullscreen mode + 切換全屏模式 + + + + Hide/show toolbar + 隱藏/顯示 工具欄 + + + + Size up magnifying glass + 增大放大鏡尺寸 + + + + Size down magnifying glass + 減小放大鏡尺寸 + + + + Zoom in magnifying glass + 增大縮放級別 + + + + Zoom out magnifying glass + 減小縮放級別 + + + + Reset magnifying glass + 重置放大鏡 + + + + Toggle between fit to width and fit to height + 切換顯示為"適應寬度"或"適應高度" + + + + Autoscroll down + 向下自動滾動 + + + + Autoscroll up + 向上自動滾動 + + + + Autoscroll forward, horizontal first + 向前自動滾動,水準優先 + + + + Autoscroll backward, horizontal first + 向後自動滾動,水準優先 + + + + Autoscroll forward, vertical first + 向前自動滾動,垂直優先 + + + + Autoscroll backward, vertical first + 向後自動滾動,垂直優先 + + + + Move down + 向下移動 + + + + Move up + 向上移動 + + + + Move left + 向左移動 + + + + Move right + 向右移動 + + + + Go to the first page + 轉到第一頁 + + + + Go to the last page + 轉到最後一頁 + + + + Offset double page to the left + 雙頁向左偏移 + + + + Offset double page to the right + 雙頁向右偏移 + + + + There is a new version available + 有新版本可用 + + + + Do you want to download the new version? + 你要下載新版本嗎? + + + + Remind me in 14 days + 14天後提醒我 + + + + Not now + 現在不 + + + + YACReader::TrayIconController + + + &Restore + 複位(&R) + + + + Systray + 系統託盤 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + + + YACReaderFieldEdit + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderOptionsDialog + + + Save + 保存 + + + + Cancel + 取消 + + + + Edit shortcuts + 編輯快捷鍵 + + + + Shortcuts + 快捷鍵 + + + + YACReaderSearchLineEdit + + + type to search + 搜索類型 + + + + YACReaderSlider + + + Reset + 重置 - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + YACReader 翻譯 - - &Resume - + + + Translation + 翻譯 - - Save log - + + clear + 清空 - - Log file (*.log) - + + Service not available + 服務不可用 diff --git a/YACReaderLibraryServer/yacreaderlibraryserver_zh_TW.ts b/YACReaderLibraryServer/yacreaderlibraryserver_zh_TW.ts index 04214c28b..760a5f042 100644 --- a/YACReaderLibraryServer/yacreaderlibraryserver_zh_TW.ts +++ b/YACReaderLibraryServer/yacreaderlibraryserver_zh_TW.ts @@ -2,150 +2,3712 @@ - FileComic + ActionsShortcutsModel - - CRC error on page (%1): some of the pages will not be displayed correctly - + + None + + + + AddLabelDialog - - Unknown error opening the file - + + Label name: + 標籤名稱: - - 7z not found - + + Choose a color: + 選擇標籤顏色: - - Format not supported - + + accept + 接受 + + + + cancel + 取消 - LogWindow + AddLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library name : + 庫名: + - - Log window - + + Add + 添加 - - &Pause - + + Cancel + 取消 - - &Save - + + Add an existing library + 添加一個現有庫 + + + ApiKeyDialog - - C&lear - + + Before you can connect to Comic Vine, you need your own API key. Please, get one free <a href="http://www.comicvine.com/api/">here</a> + 你需要擁有自己的API密鑰才能夠連接Comic Vine. 你可以通過這個鏈接獲得一個免費的<a href="http://www.comicvine.com/api/">API</a>密鑰 - - &Copy - + + Paste here your Comic Vine API key + 在此粘貼你的Comic Vine API - - Level: - + + Accept + 接受 - - &Auto scroll - + + Cancel + 取消 - QCoreApplication + AppearanceTabWidget - - -YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + + Color scheme + 配色方案 + + + + System + 系統 + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + Custom + 風俗 + + + + Remove + 消除 + + + + Remove this user-imported theme + 刪除此使用者匯入的主題 + + + + Light: + 光: + + + + Dark: + 黑暗的: + + + + Custom: + 自定義: + + + + Import theme... + 導入主題... + + + + Theme + 主題 + + + + Theme editor + 主題編輯器 + + + + Open Theme Editor... + 開啟主題編輯器... + + + + Theme editor error + 主題編輯器錯誤 + + + + The current theme JSON could not be loaded. + 無法載入目前主題 JSON。 + + + + Import theme + 導入主題 + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Could not import theme from: +%1 + 無法從以下位置匯入主題: +%1 + + + + Could not import theme from: +%1 -This appplication supports persistent settings, to set them up edit this file %1 -To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md - +%2 + 無法從以下位置匯入主題: +%1 + +%2 + + + + Import failed + 導入失敗 - QObject + BookmarksDialog - - Trace - + + Lastest Page + 尾頁 - - Debug - + + Close + 關閉 - - Info - + + Click on any image to go to the bookmark + 點擊任意圖片以跳轉至相應書簽位置 - - Warning - + + + Loading... + 載入中... + + + ClassicComicsView - - Error - + + Hide comic flow + 隱藏 Comic Flow + + + + ComicModel + + + yes + - - Fatal - + + no + + + + + Title + 標題 + + + + File Name + 檔案名 + + + + Pages + 頁數 + + + + Size + 大小 + + + + Read + 閱讀 + + + + Current Page + 當前頁 + + + + Publication Date + 發行日期 + + + + Rating + 評分 + + + + Series + 系列 + + + + Volume + 體積 + + + + Story Arc + 故事線 + + + + ComicVineDialog + + + skip + 忽略 + + + + back + 返回 + + + + next + 下一步 + + + + search + 搜索 + + + + close + 關閉 + + + + + comic %1 of %2 - %3 + 第 %1 本 共 %2 本 - %3 + + + + + + Looking for volume... + 搜索卷... + + + + %1 comics selected + 已選擇 %1 本漫畫 + + + + Error connecting to ComicVine + ComicVine 連接時出錯 + + + + + Retrieving tags for : %1 + 正在檢索標籤: %1 + + + + Retrieving volume info... + 正在接收卷資訊... + + + + Looking for comic... + 搜索漫畫中... + + + + ContinuousPageWidget + + + Loading page %1 + 正在載入頁面 %1 + + + + CreateLibraryDialog + + + Comics folder : + 漫畫檔夾: + + + + Library Name : + 庫名: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create a library could take several minutes. You can stop the process and update the library later for completing the task. + 創建一個新的庫可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。 + + + + Create new library + 創建新的漫畫庫 + + + + Path not found + 未找到路徑 + + + + The selected path does not exist or is not a valid path. Be sure that you have write access to this folder + 所選路徑不存在或不是有效路徑. 確保您具有此檔夾的寫入許可權 + + + + EditShortcutsDialog + + + Restore defaults + 恢復默認 + + + + To change a shortcut, double click in the key combination and type the new keys. + 更改快捷鍵: 雙擊按鍵組合並輸入新的映射. + + + + Shortcuts settings + 快捷鍵設置 + + + + Shortcut in use + 快捷鍵被佔用 + + + + The shortcut "%1" is already assigned to other function + 快捷鍵 "%1" 已被映射至其他功能 + + + + EmptyFolderWidget + + + This folder doesn't contain comics yet + 該資料夾還沒有漫畫 + + + + EmptyLabelWidget + + + This label doesn't contain comics yet + 此標籤尚未包含漫畫 + + + + EmptyReadingListWidget + + + This reading list does not contain any comics yet + 此閱讀列表尚未包含任何漫畫 + + + + EmptySpecialListWidget + + + No favorites + 沒有收藏 + + + + You are not reading anything yet, come on!! + 你還沒有閱讀任何東西,加油!! + + + + There are no recent comics! + 沒有最近的漫畫! + + + + ExportComicsInfoDialog + + + Output file : + 輸出檔: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Export comics info + 導出漫畫資訊 + + + + Destination database name + 目標資料庫名稱 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + ExportLibraryDialog + + + Output folder : + 輸出檔夾: + + + + Create + 創建 + + + + Cancel + 取消 + + + + Create covers package + 創建封面包 + + + + Problem found while writing + 寫入時出現問題 + + + + The selected path for the output file does not exist or is not a valid path. Be sure that you have write access to this folder + 選定的輸出檔路徑不存在或路徑無效. 確保您具有此檔夾的寫入許可權 + + + + Destination directory + 目標目錄 + + + + FileComic + + + CRC error on page (%1): some of the pages will not be displayed correctly + 第 %1 頁 CRC 校驗失敗: 部分頁面將無法正確顯示 + + + + Unknown error opening the file + 打開檔時出現未知錯誤 + + + + 7z not found + 未找到 7z + + + + Format not supported + 不支持的檔格式 + + + + GoToDialog + + + Page : + 頁碼 : + + + + Go To + 跳轉 + + + + Cancel + 取消 + + + + + Total pages : + 總頁數: + + + + Go to... + 跳轉至 ... + + + + GoToFlowToolBar + + + Page : + 頁碼 : - QsLogging::LogWindowModel + GridComicsView - - Time - + + Show info + 顯示資訊 + + + HelpAboutDialog - - Level - + + About + 關於 - - Message - + + Help + 幫助 + + + + System info + 系統資訊 + + + + ImportComicsInfoDialog + + + Import comics info + 導入漫畫資訊 + + + + Info database location : + 資料庫地址: + + + + Import + 導入 + + + + Cancel + 取消 + + + + Comics info file (*.ydb) + 漫畫資訊檔(*.ydb) + + + + ImportLibraryDialog + + + Library Name : + 庫名: + + + + Package location : + 打包地址: + + + + Destination folder : + 目標檔夾: + + + + Unpack + 解壓 + + + + Cancel + 取消 + + + + Extract a catalog + 提取目錄 + + + + Compresed library covers (*.clc) + 已壓縮的庫封面 (*.clc) + + + + ImportWidget + + + stop + 停止 + + + + Some of the comics being added... + 正在添加漫畫... + + + + Importing comics + 正在導入漫畫 + + + + <p>YACReaderLibrary is now creating a new library.</p><p>Create a library could take several minutes. You can stop the process and update the library later for completing the task.</p> + <p>YACReaderLibrary現在正在創建一個新庫。</p><p>這可能需要幾分鐘時間,您可以先停止該進程,稍後可以通過更新庫選項來更新數據。</p> + + + + Updating the library + 正在更新庫 + + + + <p>The current library is being updated. For faster updates, please, update your libraries frequently.</p><p>You can stop the process and continue updating this library later.</p> + <p>正在更新當前庫。要獲得更快的更新,請經常更新您的庫。</p><p>您可以停止該進程,稍後繼續更新操作。</p> + + + + Upgrading the library + 正在更新庫 + + + + <p>The current library is being upgraded, please wait.</p> + <p>正在更新當前漫畫庫, 請稍候.</p> + + + + Scanning the library + 正在掃描庫 + + + + <p>Current library is being scanned for legacy XML metadata information.</p><p>This is only needed once, and only if the library was crated with YACReaderLibrary 9.8.2 or earlier.</p> + <p>正在掃描當前庫的舊版 XML metadata 資訊。</p><p>這只需要執行一次,且只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 時。</p> + + + + LibraryWindow + + + YACReader Library + YACReader 庫 + + + + + + comic + 漫畫 + + + + + + manga + 漫畫 + + + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + + + web comic + 網路漫畫 + + + + + + 4koma (top to botom) + 4koma(由上至下) + + + + + + + Set type + 套裝類型 + + + + Library + + + + + Folder + 檔夾 + + + + Comic + 漫畫 + + + + Upgrade failed + 更新失敗 + + + + There were errors during library upgrade in: + 漫畫庫更新時出現錯誤: + + + + Update needed + 需要更新 + + + + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? + 此庫是使用舊版本的YACReaderLibrary創建的. 它需要更新. 現在更新? + + + + Download new version + 下載新版本 + + + + This library was created with a newer version of YACReaderLibrary. Download the new version now? + 此庫是使用較新版本的YACReaderLibrary創建的。 立即下載新版本? + + + + Library not available + 庫不可用 + + + + Library '%1' is no longer available. Do you want to remove it? + 庫 '%1' 不再可用。 你想刪除它嗎? + + + + Old library + 舊的庫 + + + + Library '%1' has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? + 庫 '%1' 是通過舊版本的YACReaderLibrary創建的。 必須再次創建。 你想現在創建嗎? + + + + + Copying comics... + 複製漫畫中... + + + + + Moving comics... + 移動漫畫中... + + + + Add new folder + 添加新的檔夾 + + + + Folder name: + 檔夾名稱: + + + + No folder selected + 沒有選中的檔夾 + + + + Please, select a folder first + 請先選擇一個檔夾 + + + + Error in path + 路徑錯誤 + + + + There was an error accessing the folder's path + 訪問檔夾的路徑時出錯 + + + + Delete folder + 刪除檔夾 + + + + The selected folder and all its contents will be deleted from your disk. Are you sure? + 所選檔夾及其所有內容將從磁片中刪除。 你確定嗎? + + + + + Unable to delete + 無法刪除 + + + + There was an issue trying to delete the selected folders. Please, check for write permissions and be sure that any applications are using these folders or any of the contained files. + 嘗試刪除所選檔夾時出現問題。 請檢查寫入許可權,並確保沒有其他應用程式在使用這些檔夾或檔。 + + + + Add new reading lists + 添加新的閱讀列表 + + + + + List name: + 列表名稱: + + + + Delete list/label + 刪除 列表/標籤 + + + + The selected item will be deleted, your comics or folders will NOT be deleted from your disk. Are you sure? + 所選項目將被刪除,您的漫畫或檔夾將不會從您的磁片中刪除。 你確定嗎? + + + + Rename list name + 重命名列表 + + + + Open folder... + 打開檔夾... + + + + Update folder + 更新檔夾 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set as read + 設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + Save covers + 保存封面 + + + + You are adding too many libraries. + 您添加的庫太多了。 + + + + You are adding too many libraries. + +You probably only need one library in your top level comics folder, you can browse any subfolders using the folders section in the left sidebar. + +YACReaderLibrary will not stop you from creating more libraries but you should keep the number of libraries low. + 您添加的庫太多了。 + +一般情況只需要一個頂級的庫,您可以使用左側邊欄中的檔夾功能來進行分類管理。 + +YACReaderLibrary不會阻止您創建更多的庫,但是您應該保持較低的庫數量來提升性能。 + + + + + YACReader not found + YACReader 未找到 + + + + YACReader not found. YACReader should be installed in the same folder as YACReaderLibrary. + 未找到YACReader. YACReader應安裝在與YACReaderLibrary相同的檔夾中. + + + + YACReader not found. There might be a problem with your YACReader installation. + 未找到YACReader. YACReader的安裝可能有問題. + + + + Error + 錯誤 + + + + Error opening comic with third party reader. + 使用第三方閱讀器開啟漫畫時出錯。 + + + + Library not found + 未找到庫 + + + + The selected folder doesn't contain any library. + 所選檔夾不包含任何庫。 + + + + Are you sure? + 你確定嗎? + + + + Do you want remove + 你想要刪除 + + + + library? + 庫? + + + + Remove and delete metadata + 移除並刪除元數據 + + + + Library info + 圖書館資訊 + + + + There was an issue trying to delete the selected comics. Please, check for write permissions in the selected files or containing folder. + 嘗試刪除所選漫畫時出現問題。 請檢查所選檔或包含檔夾中的寫入許可權。 + + + + Assign comics numbers + 分配漫畫編號 + + + + Assign numbers starting in: + 從以下位置開始分配編號: + + + + Invalid image + 圖片無效 + + + + The selected file is not a valid image. + 所選檔案不是有效影像。 + + + + Error saving cover + 儲存封面時發生錯誤 + + + + There was an error saving the cover image. + 儲存封面圖片時發生錯誤。 + + + + Error creating the library + 創建庫時出錯 + + + + Error updating the library + 更新庫時出錯 + + + + Error opening the library + 打開庫時出錯 + + + + Delete comics + 刪除漫畫 + + + + All the selected comics will be deleted from your disk. Are you sure? + 所有選定的漫畫都將從您的磁片中刪除。你確定嗎? + + + + Remove comics + 移除漫畫 + + + + Comics will only be deleted from the current label/list. Are you sure? + 漫畫只會從當前標籤/列表中刪除。 你確定嗎? + + + + Library name already exists + 庫名已存在 + + + + There is another library with the name '%1'. + 已存在另一個名為'%1'的庫。 + + + + LibraryWindowActions + + + Create a new library + 創建一個新的庫 + + + + Open an existing library + 打開現有的庫 + + + + + Export comics info + 導出漫畫資訊 + + + + + Import comics info + 導入漫畫資訊 + + + + Pack covers + 打包封面 + + + + Pack the covers of the selected library + 打包所選庫的封面 + + + + Unpack covers + 解壓封面 + + + + Unpack a catalog + 解壓目錄 + + + + Update library + 更新庫 + + + + Update current library + 更新當前庫 + + + + Rename library + 重命名庫 + + + + Rename current library + 重命名當前庫 + + + + Remove library + 移除庫 + + + + Remove current library from your collection + 從您的集合中移除當前庫 + + + + Rescan library for XML info + 重新掃描庫的 XML 資訊 + + + + Tries to find XML info embedded in comic files. You only need to do this if the library was created with 9.8.2 or earlier versions or if you are using third party software to embed XML info in the files. + 嘗試查找漫畫檔內嵌的 XML 資訊。只有當創建庫的 YACReaderLibrary 版本低於 9.8.2 或者使用第三方軟體嵌入 XML 資訊時,才需要執行該操作。 + + + + Show library info + 顯示圖書館資訊 + + + + Show information about the current library + 顯示當前庫的信息 + + + + Open current comic + 打開當前漫畫 + + + + Open current comic on YACReader + 用YACReader打開漫畫 + + + + Save selected covers to... + 選中的封面保存到... + + + + Save covers of the selected comics as JPG files + 保存所選的封面為jpg + + + + + Set as read + 設為已讀 + + + + Set comic as read + 漫畫設為已讀 + + + + + Set as unread + 設為未讀 + + + + Set comic as unread + 漫畫設為未讀 + + + + + manga + 漫畫 + + + + Set issue as manga + 將問題設定為漫畫 + + + + + comic + 漫畫 + + + + Set issue as normal + 設置發行狀態為正常發行 + + + + western manga + 西方漫畫 + + + + Set issue as western manga + 將問題設定為西方漫畫 + + + + + web comic + 網路漫畫 + + + + Set issue as web comic + 將問題設定為網路漫畫 + + + + + yonkoma + 四科馬 + + + + Set issue as yonkoma + 將問題設定為 yonkoma + + + + Show/Hide marks + 顯示/隱藏標記 + + + + Show or hide read marks + 顯示或隱藏閱讀標記 + + + + Show/Hide recent indicator + 顯示/隱藏最近的指標 + + + + Show or hide recent indicator + 顯示或隱藏最近的指示器 + + + + + Fullscreen mode on/off + 全屏模式 開/關 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Add new folder + 添加新的檔夾 + + + + Add new folder to the current library + 在當前庫下添加新的檔夾 + + + + Delete folder + 刪除檔夾 + + + + Delete current folder from disk + 從磁片上刪除當前檔夾 + + + + Select root node + 選擇根節點 + + + + Expand all nodes + 展開所有節點 + + + + Collapse all nodes + 折疊所有節點 + + + + Show options dialog + 顯示選項對話框 + + + + Show comics server options dialog + 顯示漫畫伺服器選項對話框 + + + + + Change between comics views + 漫畫視圖之間的變化 + + + + Open folder... + 打開檔夾... + + + + Set as uncompleted + 設為未完成 + + + + Set as completed + 設為已完成 + + + + Set custom cover + 設定自訂封面 + + + + Delete custom cover + 刪除自訂封面 + + + + western manga (left to right) + 西方漫畫(從左到右) + + + + Open containing folder... + 打開包含檔夾... + + + + Reset comic rating + 重置漫畫評分 + + + + Select all comics + 全選漫畫 + + + + Edit + 編輯 + + + + Assign current order to comics + 將當前序號分配給漫畫 + + + + Update cover + 更新封面 + + + + Delete selected comics + 刪除所選的漫畫 + + + + Delete metadata from selected comics + 從選定的漫畫中刪除元數據 + + + + Download tags from Comic Vine + 從 Comic Vine 下載標籤 + + + + Focus search line + 聚焦於搜索行 + + + + Focus comics view + 聚焦於漫畫視圖 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &Quit + 退出(&Q) + + + + Update folder + 更新檔夾 + + + + Update current folder + 更新當前檔夾 + + + + Scan legacy XML metadata + 掃描舊版 XML 元數據 + + + + Add new reading list + 添加新的閱讀列表 + + + + Add a new reading list to the current library + 在當前庫添加新的閱讀列表 + + + + Remove reading list + 移除閱讀列表 + + + + Remove current reading list from the library + 從當前庫移除閱讀列表 + + + + Add new label + 添加新標籤 + + + + Add a new label to this library + 在當前庫添加標籤 + + + + Rename selected list + 重命名列表 + + + + Rename any selected labels or lists + 重命名任何選定的標籤或列表 + + + + Add to... + 添加到... + + + + Favorites + 收藏夾 + + + + Add selected comics to favorites list + 將所選漫畫添加到收藏夾列表 + + + + LocalComicListModel + + + file name + 檔案名 + + + + NoLibrariesWidget + + + You don't have any libraries yet + 你還沒有庫 + + + + <p>You can create a library in any folder, YACReaderLibrary will import all comics and folders from this folder. If you have created any library in the past you can open them.</p><p>Don't forget that you can use YACReader as a stand alone application for reading the comics on your computer.</p> + <p>您可以在任何檔夾中創建庫,YACReaderLibrary將導入此檔夾中的所有漫畫和文件夾。如果已有庫,則可以打開它們。</p><p>您可以把YACReader當成獨立應用來閱讀電腦上的漫畫。</p> + + + + create your first library + 創建你的第一個庫 + + + + add an existing one + 添加一個現有庫 + + + + NoSearchResultsWidget + + + No results + 沒有結果 + + + + OptionsDialog + + + + General + 常規 + + + + + Libraries + + + + + Comic Flow + Comic Flow + + + + Grid view + 網格視圖 + + + + + Appearance + 外貌 + + + + + Options + 選項 + + + + + Language + 語言 + + + + + Application language + 應用程式語言 + + + + + System default + 系統預設 + + + + Tray icon settings (experimental) + 託盤圖示設置 (實驗特性) + + + + Close to tray + 關閉至託盤 + + + + Start into the system tray + 啟動至系統託盤 + + + + Edit Comic Vine API key + 編輯Comic Vine API 密匙 + + + + Comic Vine API key + Comic Vine API 密匙 + + + + ComicInfo.xml legacy support + ComicInfo.xml 遺留支持 + + + + Import metadata from ComicInfo.xml when adding new comics + 新增漫畫時從 ComicInfo.xml 匯入元數據 + + + + Consider 'recent' items added or updated since X days ago + 考慮自 X 天前新增或更新的「最近」項目 + + + + Third party reader + 第三方閱讀器 + + + + Write {comic_file_path} where the path should go in the command + 在命令中應將路徑寫入 {comic_file_path} + + + + + Clear + 清空 + + + + Update libraries at startup + 啟動時更新庫 + + + + Try to detect changes automatically + 嘗試自動偵測變化 + + + + Update libraries periodically + 定期更新庫 + + + + Interval: + 間隔: + + + + 30 minutes + 30分鐘 + + + + 1 hour + 1小時 + + + + 2 hours + 2小時 + + + + 4 hours + 4小時 + + + + 8 hours + 8小時 + + + + 12 hours + 12小時 + + + + daily + 日常的 + + + + Update libraries at certain time + 定時更新庫 + + + + Time: + 時間: + + + + WARNING! During library updates writes to the database are disabled! +Don't schedule updates while you may be using the app actively. +During automatic updates the app will block some of the actions until the update is finished. +To stop an automatic update tap on the loading indicator next to the Libraries title. + 警告!在庫更新期間,將停用對資料庫的寫入! +當您可能正在積極使用應用程式時,請勿安排更新。 +在自動更新期間,應用程式將阻止某些操作,直到更新完成。 +若要停止自動更新,請點選庫標題旁的載入指示器。 + + + + Modifications detection + 修改檢測 + + + + Compare the modified date of files when updating a library (not recommended) + 更新庫時比較文件的修改日期(不建議) + + + + Enable background image + 啟用背景圖片 + + + + Opacity level + 透明度 + + + + Blur level + 模糊 + + + + Use selected comic cover as background + 使用選定的漫畫封面做背景 + + + + Restore defautls + 恢復默認值 + + + + Background + 背景 + + + + Display continue reading banner + 顯示繼續閱讀橫幅 + + + + Display current comic banner + 顯示目前漫畫橫幅 + + + + Continue reading + 繼續閱讀 + + + + My comics path + 我的漫畫路徑 + + + + Display + 展示 + + + + Show time in current page information label + 在目前頁面資訊標籤中顯示時間 + + + + "Go to flow" size + 「前往 Comic Flow」大小 + + + + Background color + 背景顏色 + + + + Choose + 選擇 + + + + Scroll behaviour + 滾動效果 + + + + Disable scroll animations and smooth scrolling + 停用滾動動畫和平滑滾動 + + + + Do not turn page using scroll + 滾動時不翻頁 + + + + Use single scroll step to turn page + 使用單滾動步驟翻頁 + + + + Mouse mode + 滑鼠模式 + + + + Only Back/Forward buttons can turn pages + 只有後退/前進按鈕可以翻頁 + + + + Use the Left/Right buttons to turn pages. + 使用向左/向右按鈕翻頁。 + + + + Click left or right half of the screen to turn pages. + 點擊螢幕的左半部或右半部即可翻頁。 + + + + Quick Navigation Mode + 快速導航模式 + + + + Disable mouse over activation + 禁用滑鼠啟動 + + + + Brightness + 亮度 + + + + Contrast + 對比度 + + + + Gamma + Gamma值 + + + + Reset + 重置 + + + + Image options + 圖片選項 + + + + Fit options + 適應項 + + + + Enlarge images to fit width/height + 放大圖片以適應寬度/高度 + + + + Double Page options + 雙頁選項 + + + + Show covers as single page + 顯示封面為單頁 + + + + Scaling + 縮放 + + + + Scaling method + 縮放方法 + + + + Nearest (fast, low quality) + 最近(快速,低品質) + + + + Bilinear + 雙線性 + + + + Lanczos (better quality) + Lanczos(品質更好) + + + + Page Flow + 頁面流 + + + + Image adjustment + 圖像調整 + + + + + Restart is needed + 需要重啟 + + + + Comics directory + 漫畫目錄 + + + + PropertiesDialog + + + General info + 基本資訊 + + + + Plot + 情節 + + + + Authors + 作者 + + + + Publishing + 出版 + + + + Notes + 筆記 + + + + Cover page + 封面 + + + + Load previous page as cover + 載入上一頁作為封面 + + + + Load next page as cover + 載入下一頁作為封面 + + + + Reset cover to the default image + 將封面重設為預設圖片 + + + + Load custom cover image + 載入自訂封面圖片 + + + + Series: + 系列: + + + + Title: + 標題: + + + + + + of: + 的: + + + + Issue number: + 發行數量: + + + + Volume: + 卷: + + + + Arc number: + 世界線數量: + + + + Story arc: + 故事線: + + + + alt. number: + 替代。數字: + + + + Alternate series: + 替代系列: + + + + Series Group: + 系列組: + + + + Genre: + 類型: + + + + Size: + 大小: + + + + Writer(s): + 作者: + + + + Penciller(s): + 線稿: + + + + Inker(s): + 墨稿: + + + + Colorist(s): + 上色: + + + + Letterer(s): + 文本: + + + + Cover Artist(s): + 封面設計: + + + + Editor(s): + 編輯: + + + + Imprint: + 印記: + + + + Day: + 日: + + + + Month: + 月: + + + + Year: + 年: + + + + Publisher: + 出版者: + + + + Format: + 格式: + + + + Color/BW: + 彩色/黑白: + + + + Age rating: + 年齡等級: + + + + Type: + 類型: + + + + Language (ISO): + 語言(ISO): + + + + Synopsis: + 概要: + + + + Characters: + 角色: + + + + Teams: + 團隊: + + + + Locations: + 地點: + + + + Main character or team: + 主要角色或團隊: + + + + Review: + 審查: + + + + Notes: + 筆記: + + + + Tags: + 標籤: + + + + Comic Vine link: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> view </a> + Comic Vine 連接: <a style='color: #FFCB00; text-decoration:none; font-weight:bold;' href="http://www.comicvine.com/comic/4000-%1/"> 查看 </a> + + + + Not found + 未找到 + + + + Comic not found. You should update your library. + 未找到漫畫,請先更新您的庫. + + + + Edit comic information + 編輯漫畫資訊 + + + + Edit selected comics information + 編輯選中的漫畫資訊 + + + + Invalid cover + 封面無效 + + + + The image is invalid. + 該圖像無效。 + + + + QCoreApplication + + + +YACReaderLibraryServer is the headless (no gui) version of YACReaderLibrary. + +This appplication supports persistent settings, to set them up edit this file %1 +To learn about the available settings please check the documentation at https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + +YACReaderLibraryServer 是 YACReaderLibrary 的無頭(無 GUI)版本。 + +此應用程式支援持久性設置,要設定它們,請編輯此文件 %1 +若要了解可用設置,請查看文件:https://raw.githubusercontent.com/YACReader/yacreader/develop/YACReaderLibraryServer/SETTINGS_README.md + + + + QObject + + + Trace + 追蹤 + + + + Debug + 除錯 + + + + Info + 資訊 + + + + Warning + 警告 + + + + Error + 錯誤 + + + + Fatal + 嚴重錯誤 + + + + Select custom cover + 選擇自訂封面 + + + + Images (%1) + 圖片 (%1) + + + + 7z lib not found + 未找到 7z 庫檔 + + + + unable to load 7z lib from ./utils + 無法從 ./utils 載入 7z 庫檔 + + + + The file could not be read or is not valid JSON. + 無法讀取該檔案或該檔案不是有效的 JSON。 + + + + This theme is for %1, not %2. + 此主題適用於 %1,而不是 %2。 + + + + Libraries + + + + + Folders + 檔夾 + + + + Reading Lists + 閱讀列表 + + + + RenameLibraryDialog + + + New Library Name : + 新庫名: + + + + Rename + 重命名 + + + + Cancel + 取消 + + + + Rename current library + 重命名當前庫 + + + + ScraperResultsPaginator + + + Number of volumes found : %1 + 搜索結果: %1 + + + + + page %1 of %2 + 第 %1 頁 共 %2 頁 + + + + Number of %1 found : %2 + 第 %1 頁 共: %2 條 + + + + SearchSingleComic + + + Please provide some additional information for this comic. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SearchVolume + + + Please provide some additional information. + 請提供附加資訊. + + + + Series: + 系列: + + + + Use exact match search. Disable if you want to find volumes that match some of the words in the name. + 使用精確匹配搜尋。如果您想要尋找與名稱中某些單字相符的捲,請停用。 + + + + SelectComic + + + Please, select the right comic info. + 請正確選擇漫畫資訊. + + + + comics + 漫畫 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + comic description unavailable + 漫畫描述不可用 + + + + SelectVolume + + + Please, select the right series for your comic. + 請選擇正確的漫畫系列。 + + + + Filter: + 篩選: + + + + volumes + + + + + Nothing found, clear the filter if any. + 未找到任何內容,如果有,請清除過濾器。 + + + + loading cover + 加載封面 + + + + loading description + 加載描述 + + + + volume description unavailable + 卷描述不可用 + + + + SeriesQuestion + + + You are trying to get information for various comics at once, are they part of the same series? + 您正在嘗試同時獲取各種漫畫的資訊,它們是同一系列的嗎? + + + + yes + + + + + no + + + + + ServerConfigDialog + + + set port + 設置端口 + + + + Server connectivity information + 伺服器連接資訊 + + + + Scan it! + 掃一掃! + + + + YACReader is available for iOS and Android devices.<br/>Discover it for <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> or <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>. + YACReader 適用於 iOS 和 Android 裝置。 <br/>發現它適用於 <a href='https://ios.yacreader.com' style='color:rgb(193, 148, 65)'>iOS</a> 或 <a href='https://android.yacreader.com' style='color:rgb(193, 148, 65)'>Android</a>。 + + + + Choose an IP address + 選擇IP地址 + + + + Port + 端口 + + + + enable the server + 啟用伺服器 + + + + SortVolumeComics + + + Please, sort the list of comics on the left until it matches the comics' information. + 請在左側對漫畫列表進行排序,直到它與漫畫的資訊相符。 + + + + sort comics to match comic information + 排序漫畫以匹配漫畫資訊 + + + + issues + 發行 + + + + remove selected comics + 移除所選漫畫 + + + + restore all removed comics + 恢復所有移除的漫畫 + + + + ThemeEditorDialog + + + Theme Editor + 主題編輯器 + + + + + + + + + + + - + - + + + + i + + + + + Expand all + 全部展開 + + + + Collapse all + 全部折疊 + + + + Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original. + 按住可在 UI 中閃爍所選值(洋紅色/切換/0↔10)。發布後恢復原樣。 + + + + Search… + 搜尋… + + + + Light + 亮度 + + + + Dark + 黑暗的 + + + + ID: + ID: + + + + Display name: + 顯示名稱: + + + + Variant: + 變體: + + + + Theme info + 主題訊息 + + + + Parameter + 範圍 + + + + Value + 價值 + + + + Save and apply + 儲存並應用 + + + + Export to file... + 匯出到文件... + + + + Load from file... + 從檔案載入... + + + + Close + 關閉 + + + + Double-click to edit color + 雙擊編輯顏色 + + + + + + + + + true + 真的 + + + + + + + false + 錯誤的 + + + + Double-click to toggle + 按兩下切換 + + + + Double-click to edit value + 雙擊編輯值 + + + + + + Edit: %1 + 編輯:%1 + + + + Save theme + 儲存主題 + + + + + JSON files (*.json);;All files (*) + JSON 檔案 (*.json);;所有檔案 (*) + + + + Save failed + 保存失敗 + + + + Could not open file for writing: +%1 + 無法開啟文件進行寫入: +%1 + + + + Load theme + 載入主題 + + + + + + Load failed + 載入失敗 + + + + Could not open file: +%1 + 無法開啟檔案: +%1 + + + + Invalid JSON: +%1 + 無效的 JSON: +%1 + + + + Expected a JSON object. + 需要一個 JSON 物件。 + + + + TitleHeader + + + SEARCH + 搜索 + + + + UpdateLibraryDialog + + + Updating.... + 更新中... + + + + Cancel + 取消 + + + + Update library + 更新庫 + + + + Viewer + + + + Press 'O' to open comic. + 按下 'O' 以打開漫畫. + + + + Not found + 未找到 + + + + Comic not found + 未找到漫畫 + + + + Error opening comic + 打開漫畫時發生錯誤 + + + + CRC Error + CRC 校驗失敗 + + + + Loading...please wait! + 載入中... 請稍候! + + + + Page not available! + 頁面不可用! + + + + Cover! + 封面! + + + + Last page! + 尾頁! + + + + VolumeComicsModel + + + title + 標題 + + + + VolumesModel + + + year + + + + + issues + 發行 + + + + publisher + 出版者 + + + + YACReader3DFlowConfigWidget + + + Presets: + 預設: + + + + Classic look + 經典 + + + + Stripe look + 條狀 + + + + Overlapped Stripe look + 重疊條狀 + + + + Modern look + 現代 + + + + Roulette look + 輪盤 + + + + Show advanced settings + 顯示高級選項 + + + + Custom: + 自定義: + + + + View angle + 視角 + + + + Position + 位置 + + + + Cover gap + 封面間距 + + + + Central gap + 中心間距 + + + + Zoom + 縮放 + + + + Y offset + Y位移 + + + + Z offset + Z位移 + + + + Cover Angle + 封面角度 + + + + Visibility + 透明度 + + + + Light + 亮度 + + + + Max angle + 最大角度 + + + + Low Performance + 低性能 + + + + High Performance + 高性能 + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + 使用VSync (在全屏模式下提高圖像品質, 性能更差) + + + + Performance: + 性能: + + + + YACReader::MainWindowViewer + + + &Open + 打開(&O) + + + + Open a comic + 打開漫畫 + + + + New instance + 新建實例 + + + + Open Folder + 打開檔夾 + + + + Open image folder + 打開圖片檔夾 + + + + Open latest comic + 打開最近的漫畫 + + + + Open the latest comic opened in the previous reading session + 打開最近閱讀漫畫 + + + + Clear + 清空 + + + + Clear open recent list + 清空最近訪問列表 + + + + Save + 保存 + + + + + Save current page + 保存當前頁面 + + + + Previous Comic + 上一個漫畫 + + + + + + Open previous comic + 打開上一個漫畫 + + + + Next Comic + 下一個漫畫 + + + + + + Open next comic + 打開下一個漫畫 + + + + &Previous + 上一頁(&P) + + + + + + Go to previous page + 轉至上一頁 + + + + &Next + 下一頁(&N) + + + + + + Go to next page + 轉至下一頁 + + + + Fit Height + 適應高度 + + + + Fit image to height + 縮放圖片以適應高度 + + + + Fit Width + 適合寬度 + + + + Fit image to width + 縮放圖片以適應寬度 + + + + Show full size + 顯示全尺寸 + + + + Fit to page + 適應頁面 + + + + Continuous scroll + 連續滾動 + + + + Switch to continuous scroll mode + 切換到連續滾動模式 + + + + Reset zoom + 重置縮放 + + + + Show zoom slider + 顯示縮放滑塊 + + + + Zoom+ + 放大 + + + + Zoom- + 縮小 + + + + Rotate image to the left + 向左旋轉圖片 + + + + Rotate image to the right + 向右旋轉圖片 + + + + Double page mode + 雙頁模式 + + + + Switch to double page mode + 切換至雙頁模式 + + + + Double page manga mode + 雙頁漫畫模式 + + + + Reverse reading order in double page mode + 雙頁模式 (逆序閱讀) + + + + Go To + 跳轉 + + + + Go to page ... + 跳轉至頁面 ... + + + + Options + 選項 + + + + YACReader options + YACReader 選項 + + + + + Help + 幫助 + + + + Help, About YACReader + 幫助, 關於 YACReader + + + + Magnifying glass + 放大鏡 + + + + Switch Magnifying glass + 切換放大鏡 + + + + Set bookmark + 設置書簽 + + + + Set a bookmark on the current page + 在當前頁面設置書簽 + + + + Show bookmarks + 顯示書簽 + + + + Show the bookmarks of the current comic + 顯示當前漫畫的書簽 + + + + Show keyboard shortcuts + 顯示鍵盤快捷鍵 + + + + Show Info + 顯示資訊 + + + + Close + 關閉 + + + + Show Dictionary + 顯示字典 + + + + Show go to flow + 顯示「前往 Comic Flow」 + + + + Edit shortcuts + 編輯快捷鍵 + + + + &File + 檔(&F) + + + + + Open recent + 最近打開的檔 + + + + File + + + + + Edit + 編輯 + + + + View + 查看 + + + + Go + 轉到 + + + + Window + 窗口 + + + + + + Open Comic + 打開漫畫 + + + + + + Comic files + 漫畫檔 + + + + Open folder + 打開檔夾 + + + + page_%1.jpg + 頁_%1.jpg + + + + Image files (*.jpg) + 圖像檔 (*.jpg) + + + + + Comics + 漫畫 + + + + + General + 常規 + + + + + Magnifiying glass + 放大鏡 + + + + + Page adjustement + 頁面調整 + + + + + Reading + 閱讀 + + + + Toggle fullscreen mode + 切換全屏模式 + + + + Hide/show toolbar + 隱藏/顯示 工具欄 + + + + Size up magnifying glass + 增大放大鏡尺寸 + + + + Size down magnifying glass + 減小放大鏡尺寸 + + + + Zoom in magnifying glass + 增大縮放級別 + + + + Zoom out magnifying glass + 減小縮放級別 + + + + Reset magnifying glass + 重置放大鏡 + + + + Toggle between fit to width and fit to height + 切換顯示為"適應寬度"或"適應高度" + + + + Autoscroll down + 向下自動滾動 + + + + Autoscroll up + 向上自動滾動 + + + + Autoscroll forward, horizontal first + 向前自動滾動,水準優先 + + + + Autoscroll backward, horizontal first + 向後自動滾動,水準優先 + + + + Autoscroll forward, vertical first + 向前自動滾動,垂直優先 + + + + Autoscroll backward, vertical first + 向後自動滾動,垂直優先 + + + + Move down + 向下移動 + + + + Move up + 向上移動 + + + + Move left + 向左移動 + + + + Move right + 向右移動 + + + + Go to the first page + 轉到第一頁 + + + + Go to the last page + 轉到最後一頁 + + + + Offset double page to the left + 雙頁向左偏移 + + + + Offset double page to the right + 雙頁向右偏移 + + + + There is a new version available + 有新版本可用 + + + + Do you want to download the new version? + 你要下載新版本嗎? + + + + Remind me in 14 days + 14天後提醒我 + + + + Not now + 現在不 + + + + YACReader::TrayIconController + + + &Restore + 複位(&R) + + + + Systray + 系統託盤 + + + + YACReaderLibrary will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray icon. + YACReaderLibrary 將繼續在系統託盤中運行. 想要終止程式, 請在系統託盤圖示的上下文菜單中選擇<b>退出</b>. + + + + YACReaderFieldEdit + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderFieldPlainTextEdit + + + + + + Click to overwrite + 點擊以覆蓋 + + + + Restore to default + 恢復默認 + + + + YACReaderOptionsDialog + + + Save + 保存 + + + + Cancel + 取消 + + + + Edit shortcuts + 編輯快捷鍵 + + + + Shortcuts + 快捷鍵 + + + + YACReaderSearchLineEdit + + + type to search + 搜索類型 + + + + YACReaderSlider + + + Reset + 重置 - QsLogging::Window + YACReaderTranslator - - &Pause - + + YACReader translator + YACReader 翻譯 - - &Resume - + + + Translation + 翻譯 - - Save log - + + clear + 清空 - - Log file (*.log) - + + Service not available + 服務不可用 diff --git a/build_scripts/ubuntu_22.04/README.md b/build_scripts/ubuntu_22.04/README.md deleted file mode 100644 index b65a6d7a4..000000000 --- a/build_scripts/ubuntu_22.04/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Ubuntu 22.04 build script -You can use `build.sh` to build YACReader from scratch in `Ubuntu 22.04` with `7zip` (including `RAR5` support) and `poppler` (pdf). This build uses Qt5. - -The script will create a folder next to it where all the downloads and building will happen, it will also install all the required dependencies. The installs 7z.so in /usr/lib/7zip/. Once the scrip finishes succesfully `YACReader`, `YACReaderLibrary` and `YACReaderLibraryServer` should be installed in your system. - -WARNIG: This doesn't work with the latest release (9.14), there is a bug and some of the code is still looking for the old p7zip library, you need to build from develop, to do so run: `build.sh develop`. \ No newline at end of file diff --git a/build_scripts/ubuntu_22.04/build.sh b/build_scripts/ubuntu_22.04/build.sh deleted file mode 100644 index 3153fb504..000000000 --- a/build_scripts/ubuntu_22.04/build.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -# Exit immediately if a command exits with a non-zero status -set -e - -# Define variables -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -BUILD_DIR="$SCRIPT_DIR/yacreader_build" -YACREADER_DIR="$BUILD_DIR/yacreader" -COMPRESSED_ARCHIVE_DIR="$YACREADER_DIR/compressed_archive" -YACREADER_REPO="https://github.com/YACReader/yacreader.git" -SEVENZIP_URL="https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -SEVENZIP_ARCHIVE="$COMPRESSED_ARCHIVE_DIR/7z2301-src.7z" -SEVENZIP_DIR="$COMPRESSED_ARCHIVE_DIR/lib7zip" - -# Function to download the latest release source tarball -download_latest_release() { - echo "Fetching the latest release information..." - LATEST_RELEASE_URL=$(curl -s https://api.github.com/repos/YACReader/yacreader/releases/latest | grep "browser_download_url.*src.tar.xz" | cut -d '"' -f 4 | head -n 1) - if [ -z "$LATEST_RELEASE_URL" ]; then - echo "Failed to fetch the latest release information." - exit 1 - fi - echo "Downloading the latest release source tarball..." - wget "$LATEST_RELEASE_URL" -O "$BUILD_DIR/latest_release_src.tar.xz" - echo "Extracting the latest release source tarball..." - mkdir -p "$YACREADER_DIR" - tar -xf "$BUILD_DIR/latest_release_src.tar.xz" -C "$YACREADER_DIR" --strip-components=1 -} - -# Step 1: Create a folder for the build process -if [ -d "$BUILD_DIR" ]; then - echo "Removing existing build directory..." - rm -rf "$BUILD_DIR" -fi -echo "Creating build directory..." -mkdir -p "$BUILD_DIR" -mkdir -p "$COMPRESSED_ARCHIVE_DIR" - -# Step 2: Install required packages -echo "Updating package list and installing required packages..." -sudo apt-get update -sudo apt-get install -y qtchooser qtbase5-dev-tools qt5-qmake \ - qtbase5-dev qtmultimedia5-dev libpoppler-qt5-dev qttools5-dev-tools \ - libqt5opengl5-dev qtdeclarative5-dev libqt5svg5-dev qtquickcontrols2-5-dev \ - qt5-image-formats-plugins qml-module-qtquick-controls2 qml-module-qtquick-layouts \ - qml-module-qtgraphicaleffects qml-module-qtquick2 qml-module-qtquick-controls \ - libqt5multimedia5-plugins qt5-image-formats-plugins qml-module-qtquick-controls2 qml-module-qtquick-layouts \ - qml-module-qtgraphicaleffects qml-module-qtquick2 qml-module-qtquick-controls \ - git build-essential - -# Step 3: Download YACReader source code -if [ "$1" == "develop" ]; then - if [ -d "$YACREADER_DIR" ]; then - echo "Removing existing YACReader directory..." - rm -rf "$YACREADER_DIR" - fi - echo "Cloning YACReader repository..." - git clone "$YACREADER_REPO" "$YACREADER_DIR" -else - download_latest_release -fi - -# Step 4: Download and extract 7zip source code -echo "Downloading 7zip source code..." -wget "$SEVENZIP_URL" -O "$SEVENZIP_ARCHIVE" -echo "Extracting 7zip source code..." -7z x "$SEVENZIP_ARCHIVE" -o"$SEVENZIP_DIR" - -# Step 5: Build and install 7z.so with RAR support -echo "Building and installing 7z.so with RAR support..." -cd "$SEVENZIP_DIR/CPP/7zip/Bundles/Format7zF" -make -f makefile.gcc -sudo mkdir -p /usr/lib/7zip -sudo cp ./_o/7z.so /usr/lib/7zip - -# Step 6: Build YACReader -echo "Building YACReader..." -cd "$YACREADER_DIR" -export DEFINES_VAR=DEFINES+\=\"BUILD_NUMBER=\\\\\\\"CUSTOM_BUILD\\\\\\\"\" -qmake CONFIG+="7zip" $DEFINES_VAR -make - -# Step 7: Install YACReader -echo "Installing YACReader..." -sudo make install - -echo "YACReader build and installation complete." \ No newline at end of file diff --git a/build_scripts/ubuntu_24.04/build.sh b/build_scripts/ubuntu_24.04/build.sh index 979b53305..eb7b78943 100644 --- a/build_scripts/ubuntu_24.04/build.sh +++ b/build_scripts/ubuntu_24.04/build.sh @@ -40,7 +40,7 @@ mkdir -p "$COMPRESSED_ARCHIVE_DIR" # Step 2: Install required packages echo "Updating package list and installing required packages..." sudo apt-get update -sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev qt6-l10n-tools libqt6opengl6-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev qml6-module-qt5compat-graphicaleffects qt6-5compat-dev libpoppler-qt6-dev qt6-image-formats-plugins qml6-module-qtquick-controls qml6-module-qtquick-layouts qml6-module-qtqml-workerscript qml6-module-qtquick-templates 7zip-full 7zip-rar git build-essential +sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev qt6-l10n-tools libqt6opengl6-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev qt6-5compat-dev libpoppler-qt6-dev qt6-image-formats-plugins qml6-module-qtquick-controls qml6-module-qtquick-layouts qml6-module-qtqml-workerscript qml6-module-qtquick-templates 7zip-full 7zip-rar git build-essential # Step 3: Download YACReader source code if [ "$1" == "develop" ]; then diff --git a/ci/win/build_installer.iss b/ci/win/build_installer.iss deleted file mode 100644 index 2ba8e6bdb..000000000 --- a/ci/win/build_installer.iss +++ /dev/null @@ -1,224 +0,0 @@ -[Setup] -DefaultGroupName=YACReader -LanguageDetectionMethod=locale -AppId={{019AC70F-0312-76B8-BD8F-BE9DCBF49E25} -AppName=YACReader -AppVerName=YACReader v{#VERSION}.{#BUILD_NUMBER} -AppVersion={#VERSION}.{#BUILD_NUMBER} -VersionInfoVersion={#VERSION} -DefaultDirName={pf}\YACReader -OutputBaseFilename=YACReader-v{#VERSION}.{#BUILD_NUMBER}-win{#PLATFORM}-{#COMPRESSED_ARCHIVE_BACKEND} -LicenseFile=COPYING.txt -AlwaysUsePersonalGroup=true -OutputDir=..\Output -ChangesAssociations=true -SetupIconFile=setup.ico -UninstallDisplayIcon=uninstall.ico -ArchitecturesInstallIn64BitMode=x64 -ArchitecturesAllowed=x64 - -[Registry] -Root: HKCR; SubKey: .cbz; ValueType: string; ValueData: Comic Book (zip); Flags: uninsdeletekey; Tasks: File_association -Root: HKCR; SubKey: Comic Book (zip); ValueType: string; ValueData: Comic Book file; Flags: uninsdeletekey; Tasks: File_association -Root: HKCR; SubKey: Comic Book (zip)\Shell\Open\Command; ValueType: string; ValueData: """{app}\YACReader.exe"" ""%1"""; Flags: uninsdeletevalue; Tasks: File_association -Root: HKCR; Subkey: Comic Book (zip)\DefaultIcon; ValueType: string; ValueData: {app}\YACReader.exe,0; Flags: uninsdeletevalue; Tasks: File_association -Root: HKCR; SubKey: .cbr; ValueType: string; ValueData: Comic Book (rar); Flags: uninsdeletekey; Tasks: File_association -Root: HKCR; SubKey: Comic Book (rar); ValueType: string; ValueData: Comic Book file; Flags: uninsdeletekey; Tasks: File_association -Root: HKCR; SubKey: Comic Book (rar)\Shell\Open\Command; ValueType: string; ValueData: """{app}\YACReader.exe"" ""%1"""; Flags: uninsdeletevalue; Tasks: File_association -Root: HKCR; Subkey: Comic Book (rar)\DefaultIcon; ValueType: string; ValueData: {app}\YACReader.exe,0; Flags: uninsdeletevalue; Tasks: File_association -Root: HKCR; Subkey: .clc; ValueType: string; ValueData: Compressed Library Covers (clc); Flags: uninsdeletekey -Root: HKCR; SubKey: Compressed Library Covers (clc); ValueType: string; ValueData: Compressed Library Covers; Flags: uninsdeletekey -Root: HKCR; Subkey: Compressed Library Covers (clc)\DefaultIcon; ValueType: string; ValueData: {app}\YACReaderLibrary.exe,1; Flags: uninsdeletevalue -Root: HKCR; Subkey: .ydb; ValueType: string; ValueData: Compressed Library Covers (clc); Flags: uninsdeletekey -Root: HKCR; SubKey: YACReader Data Base (ydb); ValueType: string; ValueData: Compressed Library Covers; Flags: uninsdeletekey -Root: HKCR; Subkey: YACReader Data Base (ydb)\DefaultIcon; ValueType: string; ValueData: {app}\YACReaderLibrary.exe,1; Flags: uninsdeletevalue - -[Files] -;Qt Frameworks -Source: Qt5Core.dll; DestDir: {app} -Source: Qt5Gui.dll; DestDir: {app} -Source: Qt5Multimedia.dll; DestDir: {app} -Source: Qt5Network.dll; DestDir: {app} -Source: Qt5Qml.dll; DestDir: {app} -Source: Qt5Quick.dll; DestDir: {app} -Source: Qt5Sql.dll; DestDir: {app} -Source: Qt5Svg.dll; DestDir: {app} -Source: Qt5Widgets.dll; DestDir: {app} -Source: Qt5QuickWidgets.dll; DestDir: {app} -Source: Qt5QmlModels.dll; DestDir: {app} -Source: Qt5QmlWorkerScript.dll; DestDir: {app} -Source: Qt5QuickControls2.dll; DestDir: {app} -Source: Qt5QuickTemplates2.dll; DestDir: {app} -Source: Qt5RemoteObjects.dll; DestDir: {app} - -;Qt Angle -Source: D3Dcompiler_47.dll; DestDir: {app} -Source: libEGL.dll; DestDir: {app} -Source: libGLESV2.dll; DestDir: {app} -Source: opengl32sw.dll; DestDir: {app} - -;Qt QML -Source: QtQml\*; DestDir: {app}\QtQml\; Flags: recursesubdirs -Source: QtQuick\*; DestDir: {app}\QtQuick\; Flags: recursesubdirs -Source: QtQuick.2\*; DestDir: {app}\QtQuick.2\; Flags: recursesubdirs -Source: QtGraphicalEffects\*; DestDir: {app}\QtGraphicalEffects\; Flags: recursesubdirs - -;Qt PlugIns -Source:audio\*; DestDir: {app}\audio\ -Source:bearer\*; DestDir: {app}\bearer\ -Source:iconengines\*; DestDir: {app}\iconengines\ -Source:imageformats\*; DestDir: {app}\imageformats\ -Source:mediaservice\*; DestDir: {app}\mediaservice\ -Source:platforms\*; DestDir: {app}\platforms\ -Source:playlistformats\*; DestDir: {app}\playlistformats\ -Source:qmltooling\*; DestDir: {app}\qmltooling\ -Source:scenegraph\*; DestDir: {app}\scenegraph\ -Source:sqldrivers\qsqlite.dll; DestDir: {app}\sqldrivers\ -Source:translations\*; DestDir: {app}\translations\ -Source:styles\*; DestDir: {app}\styles\ - -;Libs -Source: pdfium.dll; DestDir: {app} -Source: openssl\*; DestDir: {app} - -;vcredist -Source: "vc_redist.{#PLATFORM}.exe"; DestDir: {tmp}; Flags: deleteafterinstall - -;Utils -;Source: utils\7zip.exe; DestDir: {app}\utils\ -Source: utils\7z.dll; DestDir: {app}\utils\ - -;Bin -Source: YACReader.exe; DestDir: {app}; Permissions: everyone-full -Source: YACReaderLibrary.exe; DestDir: {app}; Permissions: everyone-full; Tasks: -Source: YACReaderLibraryServer.exe; DestDir: {app}; Permissions: everyone-full; Tasks: - -;License -Source: README.md; DestDir: {app}; Flags: isreadme -Source: COPYING.txt; DestDir: {app} - -;Languages -Source: languages\*; DestDir: {app}\languages\; Flags: recursesubdirs -;Server -Source: server\*; DestDir: {app}\server\; Flags: recursesubdirs - -[Dirs] -Name: {app}; Permissions: everyone-full - -[CustomMessages] -App=YACReader -AppLibrary=YACReaderLibrary -LaunchYACReaderLibrary=Start YACreaderLibrary after finishing installation -LaunchYACReader=Start YACreader after finishing installation - -[Run] -Filename: {tmp}\vc_redist.{#PLATFORM}.exe; \ -Parameters: "/install /quiet /norestart"; \ -StatusMsg: "Installing VC++ Redistributables..." - -Filename: {app}\{cm:AppLibrary}.exe; Description: {cm:LaunchYACReaderLibrary,{cm:AppLibrary}}; Flags: nowait postinstall skipifsilent -Filename: {app}\{cm:App}.exe; Description: {cm:LaunchYACReader,{cm:App}}; Flags: nowait postinstall skipifsilent - -[Icons] -Name: {group}\YACReader; Filename: {app}\YACReader.exe; WorkingDir: {app}; IconIndex: 0 -Name: {group}\YACReader Library; Filename: {app}\YACReaderLibrary.exe; WorkingDir: {app}; IconIndex: 0 -;Name: {group}\YACReader Library Package; Filename: {app}\YACReaderLibrary.exe; WorkingDir: {app}; IconIndex: 0 -[Tasks] -Name: File_association; Description: Associate .cbz and .cbr files with YACReader -;Name: StartYACReaderAfterInstall; Description: Run YACReader after install -;Name: StartYACReaderLibraryAfterInstall; Description: Run YACReaderLibrary after install - -[ThirdPartySettings] -CompileLogMethod=append - -[Code] -var donationPage: TOutputMsgWizardPage; -var URLLabel: TNewStaticText; - -function GetUninstallString(): String; -var - sUnInstPath: String; - sUnInstallString: String; -begin - // First try the new AppId-based key - sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); - sUnInstallString := ''; - if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then - RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); - - // If not found, try the old AppName-based key (for versions without AppId) - if sUnInstallString = '' then begin - sUnInstPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\YACReader_is1'; - if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then - RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); - end; - - Result := sUnInstallString; -end; - -function IsUpgrade(): Boolean; -begin - Result := (GetUninstallString() <> ''); -end; - -function UnInstallOldVersion(): Integer; -var - sUnInstallString: String; - iResultCode: Integer; -begin - Result := 0; - sUnInstallString := GetUninstallString(); - if sUnInstallString <> '' then begin - sUnInstallString := RemoveQuotes(sUnInstallString); - if Exec(sUnInstallString, '/VERYSILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then - Result := 3 - else - Result := 2; - end else - Result := 1; -end; - -procedure CurStepChanged(CurStep: TSetupStep); -begin - if (CurStep=ssInstall) then - begin - if (IsUpgrade()) then - begin - UnInstallOldVersion(); - end; - end; -end; - -procedure URLLabelOnClick(Sender: TObject); -var ErrorCode: Integer; -begin -ShellExec('open', 'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=5TAMNQCDDMVP8&item_name=YACReader¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); -end; - -procedure InitializeWizard(); - -begin - - URLLabel := TNewStaticText.Create(WizardForm); - URLLabel.Caption:='Make a DONATION/Haz una DONACIÓN'; - URLLabel.Cursor:=crHand; - URLLabel.OnClick:=@URLLabelOnClick; - URLLabel.Parent:=WizardForm; - // Alter Font - URLLabel.Font.Style:=URLLabel.Font.Style + [fsUnderline]; - URLLabel.Font.Color:=clBlue; - URLLabel.Top:=250; - - URLLabel.Left:=35; - -donationPage := CreateOutputMsgPage(wpWelcome, - 'Iformation', 'Please read the following information before continuing.', - 'YACReader is FREE software. If you like it, please, consider to make a DONATION'#13#13 + - 'YACReader es software libre y GRATUITO. Si te gusta, por favor, considera realizar una DONACIÓN'#13#13) - -end; - -procedure CurPageChanged(CurPageID: Integer); -begin -if CurPageID=donationPage.ID then URLLabel.Visible:=true else URLLabel.Visible:=false; -end; diff --git a/ci/win/build_installer_qt6.iss b/ci/win/build_installer_qt6.iss index e44da5316..c5f229fd5 100644 --- a/ci/win/build_installer_qt6.iss +++ b/ci/win/build_installer_qt6.iss @@ -42,7 +42,6 @@ Source: Qt6Gui.dll; DestDir: {app} Source: Qt6Multimedia.dll; DestDir: {app} Source: Qt6Network.dll; DestDir: {app} Source: Qt6OpenGL.dll; DestDir: {app} -Source: Qt6OpenGLWidgets.dll; DestDir: {app} Source: Qt6Qml.dll; DestDir: {app} Source: Qt6QmlModels.dll; DestDir: {app} Source: Qt6QmlMeta.dll; DestDir: {app} @@ -61,9 +60,8 @@ Source: Qt6QuickTemplates2.dll; DestDir: {app} Source: Qt6QuickWidgets.dll; DestDir: {app} Source: Qt6Sql.dll; DestDir: {app} Source: Qt6Svg.dll; DestDir: {app} -Source: Qt6ShaderTools.dll; DestDir: {app} +Source: Qt6TextToSpeech.dll; DestDir: {app} -;Qt Angle Source: opengl32sw.dll; DestDir: {app}; Flags: skipifsourcedoesntexist Source: D3Dcompiler_47.dll; DestDir: {app}; Flags: skipifsourcedoesntexist @@ -77,6 +75,7 @@ Source:qml\*; DestDir: {app}\qml\; Flags: recursesubdirs Source:qmltooling\*; DestDir: {app}\qmltooling\ Source:sqldrivers\qsqlite.dll; DestDir: {app}\sqldrivers\ Source:styles\*; DestDir: {app}\styles\ +Source:texttospeech\*; DestDir: {app}\texttospeech\ Source:tls\*; DestDir: {app}\tls\ Source:translations\*; DestDir: {app}\translations\ @@ -102,7 +101,7 @@ Source: README.md; DestDir: {app}; Flags: isreadme Source: COPYING.txt; DestDir: {app} ;Languages -Source: languages\*; DestDir: {app}\languages\; Flags: recursesubdirs +Source: languages\*; DestDir: {app}\languages\; Flags: recursesubdirs; Excludes: "*_source.qm" ;Server Source: server\*; DestDir: {app}\server\; Flags: recursesubdirs @@ -119,10 +118,14 @@ LaunchYACReader=Start YACreader after finishing installation Filename: {tmp}\vc_redist.{#PLATFORM}.exe; \ Parameters: "/install /quiet /norestart"; \ StatusMsg: "Installing VC++ Redistributables..." +Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""YACReaderLibrary"" dir=in action=allow program=""{app}\YACReaderLibrary.exe"" enable=yes profile=private,domain"; Flags: runhidden waituntilterminated Filename: {app}\{cm:AppLibrary}.exe; Description: {cm:LaunchYACReaderLibrary,{cm:AppLibrary}}; Flags: nowait postinstall skipifsilent Filename: {app}\{cm:App}.exe; Description: {cm:LaunchYACReader,{cm:App}}; Flags: nowait postinstall skipifsilent +[UninstallRun] +Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall delete rule name=""YACReaderLibrary"""; Flags: runhidden waituntilterminated + [Icons] Name: {group}\YACReader; Filename: {app}\YACReader.exe; WorkingDir: {app}; IconIndex: 0 Name: {group}\YACReader Library; Filename: {app}\YACReaderLibrary.exe; WorkingDir: {app}; IconIndex: 0 diff --git a/ci/win/create_installer.cmd b/ci/win/create_installer.cmd index 1fc39dc04..2c710359a 100644 --- a/ci/win/create_installer.cmd +++ b/ci/win/create_installer.cmd @@ -5,13 +5,8 @@ SET src_path=..\..\.. set ARCH=%1 set COMPRESSION=%2 set BUILD_NUMBER=%3 -set QT_VERSION=%4 -IF "%ARCH%"=="x64" ( - SET exe_path=%src_path%\release64 -) ELSE ( - SET exe_path=%src_path%\release -) +SET exe_path=%src_path%\build\bin rmdir /S /Q installer_contents @@ -46,28 +41,22 @@ mkdir openssl copy %src_path%\dependencies\openssl\win\%ARCH%\* .\openssl\ xcopy %src_path%\release\server .\server /i /e -xcopy %src_path%\release\languages .\languages /i /e + +rem Collect cmake-generated .qm translation files from the build tree +rem (release\languages is not tracked in git; cmake generates .qm in build subdirs) +mkdir languages +for /r %src_path%\build %%f in (*.qm) do ( + echo %%~nf | findstr /I /R "_source$" >nul + if errorlevel 1 copy "%%f" .\languages\ >nul +) copy %src_path%\vc_redist.%ARCH%.exe . -type %src_path%\common\yacreader_global.h | findstr /R /C:"#define VERSION " > tmp -set /p VERSION= < tmp -set VERSION=%VERSION:#define VERSION "=% -set VERSION=%VERSION:"=% +set /p VERSION=<%src_path%\VERSION echo %VERSION% -del tmp - -if "%ARCH%"=="x86" ( - type build_installer.iss | findstr /v ArchitecturesInstallIn64BitMode | findstr /v ArchitecturesAllowed > copy_build_installer.iss - type copy_build_installer.iss > build_installer.iss -) echo "iscc start" -if "%QT_VERSION%"=="qt6" ( - iscc /DVERSION=%VERSION% /DPLATFORM=%ARCH% /DCOMPRESSED_ARCHIVE_BACKEND=%COMPRESSION% /DBUILD_NUMBER=%BUILD_NUMBER% build_installer_qt6.iss || exit /b -) else ( - iscc /DVERSION=%VERSION% /DPLATFORM=%ARCH% /DCOMPRESSED_ARCHIVE_BACKEND=%COMPRESSION% /DBUILD_NUMBER=%BUILD_NUMBER% build_installer.iss || exit /b -) +iscc /DVERSION=%VERSION% /DPLATFORM=%ARCH% /DCOMPRESSED_ARCHIVE_BACKEND=%COMPRESSION% /DBUILD_NUMBER=%BUILD_NUMBER% build_installer_qt6.iss || exit /b echo "iscc done!" cd .. diff --git a/cleanOSX.sh b/cleanOSX.sh index a1757f063..dd35cf3ec 100755 --- a/cleanOSX.sh +++ b/cleanOSX.sh @@ -1,17 +1,6 @@ #!/bin/bash -rm -R *.app -rm -R YACReader-* -rm -R *.dmg -cd YACReader -make distclean -rm -R YACReader.app -cd .. -cd YACReaderLibrary -make distclean -rm -R YACReaderLibrary.app -cd .. -cd YACReaderLibraryServer -make distclean -rm -R YACReaderLibraryServer.app -cd .. +rm -rf build +rm -rf *.app +rm -rf YACReader-* +rm -rf *.dmg diff --git a/cmake/BackendHelpers.cmake b/cmake/BackendHelpers.cmake new file mode 100644 index 000000000..38e8b4d03 --- /dev/null +++ b/cmake/BackendHelpers.cmake @@ -0,0 +1,48 @@ +include_guard(GLOBAL) + +function(yacreader_get_windows_arch_subdir out_var) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64" OR CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64") + set(_arch "arm64") + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(_arch "x86") + else() + set(_arch "x64") + endif() + + set(${out_var} "${_arch}" PARENT_SCOPE) +endfunction() + +function(yacreader_add_imported_library target_name) + set(options) + set(oneValueArgs TYPE LOCATION IMPORTED_IMPLIB INCLUDE_DIR) + set(multiValueArgs LINK_LIBRARIES COMPILE_DEFINITIONS) + cmake_parse_arguments(YR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT YR_TYPE) + set(YR_TYPE UNKNOWN) + endif() + + if(NOT TARGET "${target_name}") + add_library("${target_name}" ${YR_TYPE} IMPORTED GLOBAL) + endif() + + if(YR_LOCATION) + set_property(TARGET "${target_name}" PROPERTY IMPORTED_LOCATION "${YR_LOCATION}") + endif() + + if(YR_IMPORTED_IMPLIB) + set_property(TARGET "${target_name}" PROPERTY IMPORTED_IMPLIB "${YR_IMPORTED_IMPLIB}") + endif() + + if(YR_INCLUDE_DIR) + set_property(TARGET "${target_name}" PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${YR_INCLUDE_DIR}") + endif() + + if(YR_LINK_LIBRARIES) + set_property(TARGET "${target_name}" PROPERTY INTERFACE_LINK_LIBRARIES "${YR_LINK_LIBRARIES}") + endif() + + if(YR_COMPILE_DEFINITIONS) + set_property(TARGET "${target_name}" PROPERTY INTERFACE_COMPILE_DEFINITIONS "${YR_COMPILE_DEFINITIONS}") + endif() +endfunction() diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake new file mode 100644 index 000000000..429cf9954 --- /dev/null +++ b/cmake/CompilerOptions.cmake @@ -0,0 +1,31 @@ +# Compiler policy for YACReader-owned targets. +# Keep this target internal so third-party code does not inherit our rules. +add_library(yacreader_build_options INTERFACE) + +target_compile_definitions(yacreader_build_options INTERFACE + QT_DISABLE_DEPRECATED_UP_TO=0x060400 +) + +if(MSVC) + target_compile_definitions(yacreader_build_options INTERFACE + # Prevent windows.h from defining min/max macros that conflict with + # std::min, std::max, std::numeric_limits::max(), etc. + NOMINMAX + ) + + target_compile_options(yacreader_build_options INTERFACE + # /Zc:__cplusplus: report correct __cplusplus value + # /permissive-: strict standard conformance + $<$:/Zc:__cplusplus> + $<$:/permissive-> + ) +endif() + +function(yacreader_apply_build_options) + foreach(target_name IN LISTS ARGN) + if(NOT TARGET "${target_name}") + message(FATAL_ERROR "yacreader_apply_build_options(): unknown target '${target_name}'") + endif() + target_link_libraries("${target_name}" PRIVATE yacreader_build_options) + endforeach() +endfunction() diff --git a/cmake/FindPopplerQt6.cmake b/cmake/FindPopplerQt6.cmake new file mode 100644 index 000000000..1b79501f5 --- /dev/null +++ b/cmake/FindPopplerQt6.cmake @@ -0,0 +1,43 @@ +include(BackendHelpers) +include(FindPackageHandleStandardArgs) + +set(PopplerQt6_PROVIDER "") +set(PopplerQt6_TARGET "") +set(PopplerQt6_INCLUDE_DIRS "") +set(PopplerQt6_LIBRARIES "") + +if(NOT TARGET Poppler::Qt6) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(POPPLERQT6 QUIET IMPORTED_TARGET poppler-qt6) + if(TARGET PkgConfig::POPPLERQT6) + yacreader_add_imported_library(Poppler::Qt6 + TYPE INTERFACE + LINK_LIBRARIES "PkgConfig::POPPLERQT6") + set(PopplerQt6_PROVIDER "pkg-config") + set(PopplerQt6_INCLUDE_DIRS "${POPPLERQT6_INCLUDE_DIRS}") + endif() + endif() +endif() + +if(NOT TARGET Poppler::Qt6) + find_path(POPPLERQT6_INCLUDE_DIR NAMES poppler-qt6.h PATH_SUFFIXES poppler/qt6) + find_library(POPPLERQT6_LIBRARY NAMES poppler-qt6) + if(POPPLERQT6_INCLUDE_DIR AND POPPLERQT6_LIBRARY) + yacreader_add_imported_library(Poppler::Qt6 + TYPE UNKNOWN + LOCATION "${POPPLERQT6_LIBRARY}" + INCLUDE_DIR "${POPPLERQT6_INCLUDE_DIR}") + set(PopplerQt6_PROVIDER "CMake search") + set(PopplerQt6_INCLUDE_DIRS "${POPPLERQT6_INCLUDE_DIR}") + endif() +endif() + +if(TARGET Poppler::Qt6) + set(PopplerQt6_TARGET Poppler::Qt6) + set(PopplerQt6_LIBRARIES Poppler::Qt6) +endif() + +find_package_handle_standard_args(PopplerQt6 REQUIRED_VARS PopplerQt6_TARGET) + +mark_as_advanced(POPPLERQT6_INCLUDE_DIR POPPLERQT6_LIBRARY) diff --git a/cmake/Findpdfium.cmake b/cmake/Findpdfium.cmake new file mode 100644 index 000000000..526991066 --- /dev/null +++ b/cmake/Findpdfium.cmake @@ -0,0 +1,74 @@ +include(BackendHelpers) +include(FindPackageHandleStandardArgs) + +set(pdfium_PROVIDER "") +set(pdfium_TARGET "") +set(pdfium_INCLUDE_DIRS "") +set(pdfium_LIBRARIES "") + +get_filename_component(_pdfium_bundled_root "${CMAKE_CURRENT_LIST_DIR}/../dependencies/pdfium" ABSOLUTE) + +if(NOT TARGET pdfium::pdfium AND WIN32) + yacreader_get_windows_arch_subdir(_pdfium_arch) + set(_pdfium_include_dir "${_pdfium_bundled_root}/win/public") + set(_pdfium_implib "${_pdfium_bundled_root}/win/${_pdfium_arch}/pdfium.lib") + set(_pdfium_dll "${_pdfium_bundled_root}/win/${_pdfium_arch}/pdfium.dll") + if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_implib}" AND EXISTS "${_pdfium_dll}") + yacreader_add_imported_library(pdfium::pdfium + TYPE SHARED + LOCATION "${_pdfium_dll}" + IMPORTED_IMPLIB "${_pdfium_implib}" + INCLUDE_DIR "${_pdfium_include_dir}") + set(pdfium_PROVIDER "bundled dependencies (${_pdfium_arch}, Windows)") + set(pdfium_INCLUDE_DIRS "${_pdfium_include_dir}") + endif() +endif() + +if(NOT TARGET pdfium::pdfium AND APPLE) + set(_pdfium_include_dir "${_pdfium_bundled_root}/macx/include") + set(_pdfium_library "${_pdfium_bundled_root}/macx/bin/libpdfium.a") + if(EXISTS "${_pdfium_include_dir}/fpdfview.h" AND EXISTS "${_pdfium_library}") + yacreader_add_imported_library(pdfium::pdfium + TYPE STATIC + LOCATION "${_pdfium_library}" + INCLUDE_DIR "${_pdfium_include_dir}") + set(pdfium_PROVIDER "bundled dependencies (macOS)") + set(pdfium_INCLUDE_DIRS "${_pdfium_include_dir}") + endif() +endif() + +if(NOT TARGET pdfium::pdfium) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(PDFIUM QUIET IMPORTED_TARGET libpdfium) + if(TARGET PkgConfig::PDFIUM) + yacreader_add_imported_library(pdfium::pdfium + TYPE INTERFACE + LINK_LIBRARIES "PkgConfig::PDFIUM") + set(pdfium_PROVIDER "pkg-config") + set(pdfium_INCLUDE_DIRS "${PDFIUM_INCLUDE_DIRS}") + endif() + endif() +endif() + +if(NOT TARGET pdfium::pdfium) + find_path(PDFIUM_INCLUDE_DIR NAMES fpdfview.h PATH_SUFFIXES pdfium) + find_library(PDFIUM_LIBRARY NAMES pdfium libpdfium) + if(PDFIUM_INCLUDE_DIR AND PDFIUM_LIBRARY) + yacreader_add_imported_library(pdfium::pdfium + TYPE UNKNOWN + LOCATION "${PDFIUM_LIBRARY}" + INCLUDE_DIR "${PDFIUM_INCLUDE_DIR}") + set(pdfium_PROVIDER "CMake search") + set(pdfium_INCLUDE_DIRS "${PDFIUM_INCLUDE_DIR}") + endif() +endif() + +if(TARGET pdfium::pdfium) + set(pdfium_TARGET pdfium::pdfium) + set(pdfium_LIBRARIES pdfium::pdfium) +endif() + +find_package_handle_standard_args(pdfium REQUIRED_VARS pdfium_TARGET) + +mark_as_advanced(PDFIUM_INCLUDE_DIR PDFIUM_LIBRARY) diff --git a/cmake/Findunarr.cmake b/cmake/Findunarr.cmake new file mode 100644 index 000000000..aa0cb1702 --- /dev/null +++ b/cmake/Findunarr.cmake @@ -0,0 +1,76 @@ +include(BackendHelpers) +include(FindPackageHandleStandardArgs) + +set(unarr_PROVIDER "") +set(unarr_TARGET "") +set(unarr_INCLUDE_DIRS "") +set(unarr_LIBRARIES "") + +get_filename_component(_unarr_bundled_root "${CMAKE_CURRENT_LIST_DIR}/../dependencies/unarr" ABSOLUTE) + +if(NOT TARGET unarr::unarr AND APPLE) + set(_unarr_include_dir "${_unarr_bundled_root}/macx") + set(_unarr_library "${_unarr_bundled_root}/macx/libunarr.a") + if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_library}") + yacreader_add_imported_library(unarr::unarr + TYPE STATIC + LOCATION "${_unarr_library}" + INCLUDE_DIR "${_unarr_include_dir}" + LINK_LIBRARIES "z;bz2") + set(unarr_PROVIDER "bundled dependencies (macOS)") + set(unarr_INCLUDE_DIRS "${_unarr_include_dir}") + endif() +endif() + +if(NOT TARGET unarr::unarr AND WIN32) + yacreader_get_windows_arch_subdir(_unarr_arch) + set(_unarr_include_dir "${_unarr_bundled_root}/win") + set(_unarr_implib "${_unarr_bundled_root}/win/${_unarr_arch}/unarr.lib") + set(_unarr_dll "${_unarr_bundled_root}/win/${_unarr_arch}/unarr.dll") + if(EXISTS "${_unarr_include_dir}/unarr.h" AND EXISTS "${_unarr_implib}" AND EXISTS "${_unarr_dll}") + yacreader_add_imported_library(unarr::unarr + TYPE SHARED + LOCATION "${_unarr_dll}" + IMPORTED_IMPLIB "${_unarr_implib}" + INCLUDE_DIR "${_unarr_include_dir}" + COMPILE_DEFINITIONS "UNARR_IS_SHARED_LIBRARY") + set(unarr_PROVIDER "bundled dependencies (${_unarr_arch}, Windows)") + set(unarr_INCLUDE_DIRS "${_unarr_include_dir}") + endif() +endif() + +if(NOT TARGET unarr::unarr) + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(UNARR QUIET IMPORTED_TARGET libunarr) + if(TARGET PkgConfig::UNARR) + yacreader_add_imported_library(unarr::unarr + TYPE INTERFACE + LINK_LIBRARIES "PkgConfig::UNARR") + set(unarr_PROVIDER "pkg-config") + set(unarr_INCLUDE_DIRS "${UNARR_INCLUDE_DIRS}") + endif() + endif() +endif() + +if(NOT TARGET unarr::unarr) + find_path(UNARR_INCLUDE_DIR NAMES unarr.h) + find_library(UNARR_LIBRARY NAMES unarr libunarr) + if(UNARR_INCLUDE_DIR AND UNARR_LIBRARY) + yacreader_add_imported_library(unarr::unarr + TYPE UNKNOWN + LOCATION "${UNARR_LIBRARY}" + INCLUDE_DIR "${UNARR_INCLUDE_DIR}") + set(unarr_PROVIDER "CMake search") + set(unarr_INCLUDE_DIRS "${UNARR_INCLUDE_DIR}") + endif() +endif() + +if(TARGET unarr::unarr) + set(unarr_TARGET unarr::unarr) + set(unarr_LIBRARIES unarr::unarr) +endif() + +find_package_handle_standard_args(unarr REQUIRED_VARS unarr_TARGET) + +mark_as_advanced(UNARR_INCLUDE_DIR UNARR_LIBRARY) diff --git a/cmake/PdfBackend.cmake b/cmake/PdfBackend.cmake new file mode 100644 index 000000000..e27775945 --- /dev/null +++ b/cmake/PdfBackend.cmake @@ -0,0 +1,69 @@ +# PDF backend detection for YACReader +# Creates an INTERFACE target 'pdf_backend_iface' that propagates +# compile definitions and link libraries based on PDF_BACKEND. + +add_library(pdf_backend_iface INTERFACE) + +if(PDF_BACKEND STREQUAL "no_pdf") + message(STATUS "PDF backend: disabled") + target_compile_definitions(pdf_backend_iface INTERFACE NO_PDF) + +elseif(PDF_BACKEND STREQUAL "pdfium") + message(STATUS "PDF backend: pdfium") + target_compile_definitions(pdf_backend_iface INTERFACE USE_PDFIUM) + + find_package(pdfium QUIET CONFIG) + if(TARGET pdfium::pdfium) + message(STATUS " Found pdfium via CMake config") + else() + find_package(pdfium QUIET MODULE) + if(NOT TARGET pdfium::pdfium) + message(FATAL_ERROR "Could not find libpdfium. Install it or use a different PDF_BACKEND.") + endif() + if(pdfium_PROVIDER) + message(STATUS " Found pdfium via ${pdfium_PROVIDER}") + endif() + endif() + + target_link_libraries(pdf_backend_iface INTERFACE pdfium::pdfium) + +elseif(PDF_BACKEND STREQUAL "poppler") + message(STATUS "PDF backend: poppler") + target_compile_definitions(pdf_backend_iface INTERFACE USE_POPPLER) + + if(APPLE) + message(FATAL_ERROR "Poppler backend is not supported on macOS") + endif() + + # Try cmake config mode first (poppler built with cmake, or vcpkg with cmake integration) + # On Windows: vcpkg install poppler[qt6]:x64-windows, then pass the vcpkg toolchain file + find_package(Poppler QUIET CONFIG) + if(TARGET Poppler::Qt6) + message(STATUS " Found poppler-qt6 via CMake config") + else() + find_package(PopplerQt6 QUIET MODULE) + if(TARGET Poppler::Qt6) + if(PopplerQt6_PROVIDER) + message(STATUS " Found poppler-qt6 via ${PopplerQt6_PROVIDER}") + endif() + elseif(MSVC) + message(FATAL_ERROR "Could not find poppler-qt6. " + "Install via vcpkg: vcpkg install poppler[qt6]:x64-windows " + "then configure cmake with the vcpkg toolchain file.") + else() + message(FATAL_ERROR "Could not find poppler-qt6. Install libpoppler-qt6-dev or use a different PDF_BACKEND.") + endif() + endif() + + target_link_libraries(pdf_backend_iface INTERFACE Poppler::Qt6) + +elseif(PDF_BACKEND STREQUAL "pdfkit") + message(STATUS "PDF backend: pdfkit (macOS)") + if(NOT APPLE) + message(FATAL_ERROR "pdfkit backend is macOS only") + endif() + target_compile_definitions(pdf_backend_iface INTERFACE USE_PDFKIT) + +else() + message(FATAL_ERROR "Unknown PDF_BACKEND: '${PDF_BACKEND}'. Use: pdfium, poppler, pdfkit, or no_pdf") +endif() diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt new file mode 100644 index 000000000..ba76f7cf3 --- /dev/null +++ b/common/CMakeLists.txt @@ -0,0 +1,230 @@ +# Common libraries for YACReader +# Fine-grained STATIC targets per concern + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/version.h + @ONLY +) + +# --- yr_global (no GUI, used by all 3 apps) --- +add_library(yr_global STATIC + ${CMAKE_CURRENT_BINARY_DIR}/version.h + version.h.in + yacreader_global.h + yacreader_global.cpp +) +target_include_directories(yr_global PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) +yacreader_apply_build_options(yr_global) +target_link_libraries(yr_global PUBLIC Qt6::Core) +if(UNIX AND NOT APPLE) + target_compile_definitions(yr_global PRIVATE + "LIBDIR=\"${CMAKE_INSTALL_FULL_LIBDIR}\"") +endif() + +# --- naturalsort --- +add_library(naturalsort STATIC + qnaturalsorting.h + qnaturalsorting.cpp +) +target_include_directories(naturalsort PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(naturalsort) +target_link_libraries(naturalsort PUBLIC Qt6::Core) + +# --- concurrent_queue --- +add_library(concurrent_queue STATIC + concurrent_queue.h + concurrent_queue.cpp +) +target_include_directories(concurrent_queue PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(concurrent_queue) +target_link_libraries(concurrent_queue PUBLIC Qt6::Core) + +# --- worker (header-only thread helpers) --- +add_library(worker INTERFACE) +target_include_directories(worker INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +target_sources(worker INTERFACE + ${CMAKE_CURRENT_SOURCE_DIR}/worker_thread.h + ${CMAKE_CURRENT_SOURCE_DIR}/release_acquire_atomic.h +) + +# --- common_all (shared non-GUI code used by all 3 apps) --- +add_library(common_all STATIC + comic_db.h + comic_db.cpp + folder.h + folder.cpp + library_item.h + library_item.cpp + bookmarks.h + bookmarks.cpp + http_worker.h + http_worker.cpp + cover_utils.h + cover_utils.cpp + global_info_provider.h + global_info_provider.cpp +) +target_include_directories(common_all PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(common_all) +target_link_libraries(common_all PUBLIC + Qt6::Core + Qt6::Gui + Qt6::Sql + Qt6::Network + yr_global + naturalsort + pdf_backend_iface +) + +# --- comic_backend (comic file handling + PDF) --- +add_library(comic_backend STATIC + comic.h + comic.cpp + pdf_comic.h +) +yacreader_apply_build_options(comic_backend) + +# PDF source depends on backend +if(PDF_BACKEND STREQUAL "pdfkit") + target_sources(comic_backend PRIVATE pdf_comic.mm) +elseif(NOT PDF_BACKEND STREQUAL "no_pdf") + target_sources(comic_backend PRIVATE pdf_comic.cpp) +endif() + +target_include_directories(comic_backend PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(comic_backend PUBLIC + Qt6::Core + Qt6::Gui + common_all + pdf_backend_iface + cbx_backend + QsLog +) + +# GUI-only targets: not needed for server-standalone builds (Qt 6.4+) which +# lack Qt6::Widgets, Qt6::ShaderTools, Qt6::GuiPrivate, etc. +if(NOT BUILD_SERVER_STANDALONE) + +# --- common_gui (GUI-only code: widgets, version check, themes infrastructure) --- +# NOTE: theme_manager.h/cpp is NOT included here because it depends on app-specific +# theme.h (YACReader vs YACReaderLibrary have different Theme structs). +# Each app includes theme_manager directly alongside its own theme.h/theme_factory. +add_library(common_gui STATIC + custom_widgets.h + custom_widgets.cpp + check_new_version.h + check_new_version.cpp + yacreader_global_gui.h + yacreader_global_gui.cpp + exit_check.h + exit_check.cpp + scroll_management.h + scroll_management.cpp + # themes infrastructure (does NOT depend on app-specific theme.h) + themes/icon_utils.h + themes/icon_utils.cpp + themes/appearance_configuration.h + themes/appearance_configuration.cpp + themes/theme_variant.h + themes/themable.h + themes/yacreader_icon.h + themes/shared/help_about_dialog_theme.h + themes/shared/whats_new_dialog_theme.h + themes/theme_editor_dialog.h + themes/theme_editor_dialog.cpp + themes/theme_json_utils.h + themes/theme_json_utils.cpp + themes/theme_meta.h + themes/theme_repository.h + themes/theme_repository.cpp + themes/appearance_tab_widget.h + themes/appearance_tab_widget.cpp +) +target_include_directories(common_gui PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/themes + ${CMAKE_CURRENT_SOURCE_DIR}/themes/shared +) +yacreader_apply_build_options(common_gui) + +target_link_libraries(common_gui PUBLIC + Qt6::Core + Qt6::Core5Compat + Qt6::Widgets + Qt6::Network + Qt6::Svg + common_all + yr_global + QsLog +) + +# --- RHI flow (3D coverflow) --- +# Compiled twice with different defines, like the old GL flow pattern. +# Shaders are compiled from GLSL 450 source at build time via qt_add_shaders(). + +set(RHI_FLOW_SOURCES + rhi/flow_types.h + rhi/flow_types.cpp + rhi/yacreader_flow_rhi.h + rhi/yacreader_flow_rhi.cpp + rhi/yacreader_comic_flow_rhi.h + rhi/yacreader_comic_flow_rhi.cpp + rhi/yacreader_page_flow_rhi.h + rhi/yacreader_page_flow_rhi.cpp +) + +add_library(rhi_flow_reader STATIC ${RHI_FLOW_SOURCES}) +target_include_directories(rhi_flow_reader PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/rhi +) +yacreader_apply_build_options(rhi_flow_reader) +target_compile_definitions(rhi_flow_reader PRIVATE YACREADER) +target_link_libraries(rhi_flow_reader PUBLIC + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Widgets + yr_global +) +qt_add_shaders(rhi_flow_reader "flow_shaders_reader" + BASE rhi/shaders + PREFIX "/shaders" + GLSL "100es,120,150" + HLSL 50 + MSL 12 + FILES + rhi/shaders/flow.vert + rhi/shaders/flow.frag +) + +add_library(rhi_flow_library STATIC ${RHI_FLOW_SOURCES}) +target_include_directories(rhi_flow_library PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/rhi +) +yacreader_apply_build_options(rhi_flow_library) +target_compile_definitions(rhi_flow_library PRIVATE YACREADER_LIBRARY) +target_link_libraries(rhi_flow_library PUBLIC + Qt6::Core + Qt6::Gui + Qt6::GuiPrivate + Qt6::Widgets + yr_global +) +qt_add_shaders(rhi_flow_library "flow_shaders_library" + BASE rhi/shaders + PREFIX "/shaders" + GLSL "100es,120,150" + HLSL 50 + MSL 12 + FILES + rhi/shaders/flow.vert + rhi/shaders/flow.frag +) + +endif() # NOT BUILD_SERVER_STANDALONE diff --git a/common/app_language_utils.h b/common/app_language_utils.h new file mode 100644 index 000000000..e74968263 --- /dev/null +++ b/common/app_language_utils.h @@ -0,0 +1,132 @@ +#ifndef APP_LANGUAGE_UTILS_H +#define APP_LANGUAGE_UTILS_H + +#include "yacreader_global_gui.h" + +#include +#include +#include +#include +#include +#include + +#include + +namespace YACReader::UiLanguage { + +struct LanguageOption { + QString code; + QString displayName; +}; + +inline QStringList translationDirectories() +{ + QStringList directories; +#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) + directories << QString(DATADIR) + "/yacreader/languages"; +#endif + directories << QCoreApplication::applicationDirPath() + "/languages"; + directories.removeDuplicates(); + return directories; +} + +inline bool loadFromLocale(QTranslator &translator, const QString &prefix, const QLocale &locale) +{ + const auto dirs = translationDirectories(); + for (const auto &dir : dirs) { + if (translator.load(locale, prefix, "_", dir)) + return true; + } + + return false; +} + +inline bool loadTranslator(QTranslator &translator, const QString &prefix, const QString &languageOverride = QString()) +{ + auto selectedLanguage = languageOverride.trimmed(); + if (!selectedLanguage.isEmpty()) { + selectedLanguage.replace('-', '_'); + + if (loadFromLocale(translator, prefix, QLocale(selectedLanguage))) + return true; + + auto baseLanguage = selectedLanguage.section('_', 0, 0); + if (baseLanguage != selectedLanguage && loadFromLocale(translator, prefix, QLocale(baseLanguage))) + return true; + } + + return loadFromLocale(translator, prefix, QLocale()); +} + +inline QTranslator &appTranslator() +{ + static QTranslator translator; + return translator; +} + +inline bool applyLanguage(const QString &prefix, const QString &languageOverride = QString()) +{ + auto &translator = appTranslator(); + QCoreApplication::removeTranslator(&translator); + const auto loaded = loadTranslator(translator, prefix, languageOverride); + QCoreApplication::installTranslator(&translator); + return loaded; +} + +inline QString languageDisplayName(const QString &languageCode) +{ + QLocale locale(languageCode); + + QString languageName = locale.nativeLanguageName(); + if (languageName.isEmpty()) + languageName = QLocale::languageToString(locale.language()); + + if (languageName.isEmpty()) + languageName = languageCode; + + QString territoryName; + if (locale.territory() != QLocale::AnyTerritory) + territoryName = locale.nativeTerritoryName(); + + if (!territoryName.isEmpty()) + return QString("%1 (%2)").arg(languageName, territoryName); + + return languageName; +} + +inline QList availableLanguages(const QString &prefix) +{ + QSet languageCodes; + const auto pattern = QRegularExpression( + "^" + QRegularExpression::escape(prefix) + "_(.+)\\.qm$"); + + const auto dirs = translationDirectories(); + for (const auto &dirPath : dirs) { + QDir dir(dirPath); + if (!dir.exists()) + continue; + + const auto files = dir.entryList( + QStringList { prefix + "_*.qm" }, QDir::Files, QDir::Name); + for (const auto &file : files) { + auto match = pattern.match(file); + if (match.hasMatch()) + languageCodes.insert(match.captured(1)); + } + } + + QList options; + for (const auto &languageCode : languageCodes) { + options.append({ languageCode, languageDisplayName(languageCode) }); + } + + std::sort(options.begin(), options.end(), [](const LanguageOption &lhs, const LanguageOption &rhs) { + return lhs.displayName.localeAwareCompare(rhs.displayName) < 0; + }); + + return options; +} + +} // namespace YACReader::UiLanguage + +#endif // APP_LANGUAGE_UTILS_H diff --git a/common/bookmarks.cpp b/common/bookmarks.cpp index 872c4cc28..e357411ba 100644 --- a/common/bookmarks.cpp +++ b/common/bookmarks.cpp @@ -1,12 +1,14 @@ #include "bookmarks.h" -#include -#include + +#include "yacreader_global.h" + #include +#include +#include #include - #include -#include "yacreader_global.h" +#include Bookmarks::Bookmarks() : lastPageIndex(0) @@ -93,7 +95,7 @@ void Bookmarks::clear() bool Bookmarks::load(const QList &bookmarkIndexes, int lastPage) { lastPageIndex = lastPage; - foreach (int b, bookmarkIndexes) + for (const int b : std::as_const(bookmarkIndexes)) if (b != -1) { latestBookmarks.push_back(b); bookmarks.insert(b, QImage()); diff --git a/common/bookmarks.h b/common/bookmarks.h index 6c4226596..3f36e40d3 100644 --- a/common/bookmarks.h +++ b/common/bookmarks.h @@ -1,12 +1,11 @@ #ifndef BOOKMARKS_H #define BOOKMARKS_H -#include -#include +#include #include -#include #include -#include +#include +#include class BookmarksList { public: diff --git a/common/check_new_version.cpp b/common/check_new_version.cpp index bb7738636..00e3c0fcf 100644 --- a/common/check_new_version.cpp +++ b/common/check_new_version.cpp @@ -2,21 +2,17 @@ #include "yacreader_global.h" -#include -#include -#include - -#include #include -#include -#include +#include #include -#include - -#define PREVIOUS_VERSION_TESTING "6.0.0" +#include +#include +#include +#include +#include HttpVersionChecker::HttpVersionChecker() - : HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/common/yacreader_global.h", DEFAULT_USER_AGENT) + : HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/VERSION", DEFAULT_USER_AGENT) { connect(this, &HttpVersionChecker::dataReady, this, QOverload::of(&HttpVersionChecker::checkNewVersion)); } @@ -28,39 +24,22 @@ void HttpVersionChecker::checkNewVersion(const QByteArray &data) bool HttpVersionChecker::checkNewVersion(QString sourceContent) { - QRegExp rx("#define VERSION \"([0-9]+).([0-9]+).([0-9]+)\""); - bool newVersion = false; - bool sameVersion = true; - // bool currentVersionIsNewer = false; -#ifdef QT_DEBUG - QString version(PREVIOUS_VERSION_TESTING); -#else - QString version(VERSION); -#endif - QStringList sl = version.split("."); - if (rx.indexIn(sourceContent) != -1) { - int length = qMin(sl.size(), (rx.cap(4) != "") ? 4 : 3); - for (int i = 0; i < length; i++) { - if (rx.cap(i + 1).toInt() < sl.at(i).toInt()) { - return false; - } - if (rx.cap(i + 1).toInt() > sl.at(i).toInt()) { - newVersion = true; - break; - } else - sameVersion = sameVersion && rx.cap(i + 1).toInt() == sl.at(i).toInt(); - } - if (!newVersion && sameVersion) { - if ((sl.size() == 3) && (rx.cap(4) != "")) - newVersion = true; - } + const auto currentVersion = QVersionNumber::fromString(QString::fromLatin1(VERSION)); + const auto trimmedSourceContent = sourceContent.trimmed(); + qsizetype suffixIndex = 0; + const auto latestVersion = QVersionNumber::fromString(trimmedSourceContent, &suffixIndex); + + if (trimmedSourceContent.isEmpty() || + suffixIndex != trimmedSourceContent.size() || + latestVersion.segments().size() != 3) { + return false; } - if (newVersion == true) { + if (!currentVersion.isNull() && !latestVersion.isNull() && QVersionNumber::compare(latestVersion, currentVersion) > 0) { emit newVersionDetected(); return true; - } else { - return false; } + + return false; } diff --git a/common/check_new_version.h b/common/check_new_version.h index 260ab426f..37cae0563 100644 --- a/common/check_new_version.h +++ b/common/check_new_version.h @@ -2,7 +2,6 @@ #define __CHECKUPDATE_H #include "http_worker.h" -#include "yacreader_global.h" #include #include diff --git a/common/comic.cpp b/common/comic.cpp index 6763db2a2..6d9bbfeff 100644 --- a/common/comic.cpp +++ b/common/comic.cpp @@ -1,19 +1,21 @@ #include "comic.h" +#include "QsLog.h" +#include "bookmarks.h" //TODO desacoplar la dependencia con bookmarks +#include "comic_db.h" +#include "compressed_archive.h" +#include "qnaturalsorting.h" + +#include +#include +#include +#include #include #include #include -#include -#include -#include -#include -#include "bookmarks.h" //TODO desacoplar la dependencia con bookmarks -#include "qnaturalsorting.h" -#include "compressed_archive.h" -#include "comic_db.h" - -#include "QsLog.h" +#include +#include enum YACReaderPageSortingMode { YACReaderNumericalSorting, @@ -303,7 +305,7 @@ QList Comic::findValidComicFiles(const QList &list) QLOG_DEBUG() << "-findValidComicFiles-"; QList validComicFiles; QString currentPath; - foreach (QUrl url, list) { + for (const QUrl &url : std::as_const(list)) { currentPath = url.toLocalFile(); if (Comic::fileIsComic(currentPath)) { validComicFiles << currentPath; @@ -329,7 +331,7 @@ QList Comic::findValidComicFilesInFolder(const QString &path) QFileInfoList folderContent = folder.entryInfoList(); QString currentPath; - foreach (QFileInfo info, folderContent) { + for (const QFileInfo &info : std::as_const(folderContent)) { currentPath = info.absoluteFilePath(); if (info.isDir()) { validComicFiles << findValidComicFilesInFolder(currentPath); // find comics recursively @@ -414,10 +416,10 @@ QList FileComic::filter(const QList &src) QList filtered; bool fileAccepted = false; - foreach (QString fileName, src) { + for (const QString &fileName : std::as_const(src)) { fileAccepted = false; if (!fileName.contains("__MACOSX")) { - foreach (QString extension, extensions) { + for (const QString &extension : std::as_const(extensions)) { if (fileName.endsWith(extension, Qt::CaseInsensitive)) { fileAccepted = true; break; @@ -472,7 +474,7 @@ bool FileComic::isCancelled() QList> FileComic::getSections(int §ionIndex) { QVector sortedIndexes; - foreach (QString name, _fileNames) { + for (const QString &name : std::as_const(_fileNames)) { sortedIndexes.append(_order.indexOf(name)); } QList> sections; @@ -482,7 +484,7 @@ QList> FileComic::getSections(int §ionIndex) QVector section; int idx = 0; unsigned int realIdx; - foreach (quint32 i, sortedIndexes) { + for (const quint32 i : std::as_const(sortedIndexes)) { if (_firstPage == idx) { sectionIndex = sectionCount; @@ -498,7 +500,7 @@ QList> FileComic::getSections(int §ionIndex) if (section.indexOf(realIdx) != 0) { QVector section1; QVector section2; - foreach (quint32 si, section) { + for (const quint32 si : std::as_const(section)) { if (si < realIdx) { section1.append(si); } else { @@ -531,7 +533,7 @@ QList> FileComic::getSections(int §ionIndex) if (section.indexOf(realIdx) != 0) { QVector section1; QVector section2; - foreach (quint32 si, section) { + for (const quint32 si : std::as_const(section)) { if (si < realIdx) { section1.append(si); } else { @@ -625,7 +627,7 @@ void FileComic::process() } // archive.getAllData(QVector(),this); /* - foreach(QString name,_fileNames) + for (const auto &name : _fileNames) { index = _order.indexOf(name); sortedIndex = _fileNames.indexOf(name); @@ -809,12 +811,7 @@ void PDFComic::process() } #else -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) pdfComic = Poppler::Document::load(_path); -#else - auto _pdfComic = Poppler::Document::load(_path); - pdfComic = std::unique_ptr(_pdfComic); -#endif if (!pdfComic) { moveToThread(QCoreApplication::instance()->thread()); @@ -1021,7 +1018,7 @@ void get_double_pages(const QList &pageNames, QList &singlePag QString mostCommonPrefix = get_most_common_prefix(pageNames); - foreach (const QString &pageName, pageNames) { + for (const QString &pageName : std::as_const(pageNames)) { if (is_double_page(pageName.split('/').last(), mostCommonPrefix, maxExpectedDoublePagesNumberLenght)) { doublePageNames.append(pageName); } else { diff --git a/common/comic.h b/common/comic.h index 2241eb78c..6543ee11a 100644 --- a/common/comic.h +++ b/common/comic.h @@ -1,13 +1,12 @@ #ifndef __COMIC_H #define __COMIC_H -#include -#include -#include +#include "bookmarks.h" +#include "extract_delegate.h" + #include +#include #include - -#include "extract_delegate.h" -#include "bookmarks.h" +#include #ifndef NO_PDF #include "pdf_comic.h" #endif // NO_PDF diff --git a/common/comic_db.cpp b/common/comic_db.cpp index 9fa6edb3b..04a494712 100644 --- a/common/comic_db.cpp +++ b/common/comic_db.cpp @@ -2,8 +2,8 @@ #include "yacreader_global.h" -#include #include +#include //----------------------------------------------------------------------------- // COMIC------------------------------------------------------------------------ diff --git a/common/comic_db.h b/common/comic_db.h index 9f3b70d6d..c72a01ce3 100644 --- a/common/comic_db.h +++ b/common/comic_db.h @@ -2,11 +2,12 @@ #define __COMICDB_H #include "library_item.h" -#include -#include -#include + #include +#include #include +#include +#include class ComicInfo : public QObject { diff --git a/common/concurrent_queue.h b/common/concurrent_queue.h index 380f6d5d5..9d0d9f651 100644 --- a/common/concurrent_queue.h +++ b/common/concurrent_queue.h @@ -1,11 +1,12 @@ #ifndef CONCURRENT_QUEUE_H #define CONCURRENT_QUEUE_H -#include -#include -#include -#include #include + +#include +#include +#include +#include #include namespace YACReader { diff --git a/common/custom_widgets.cpp b/common/custom_widgets.cpp index be7653933..e69de29bb 100644 --- a/common/custom_widgets.cpp +++ b/common/custom_widgets.cpp @@ -1 +0,0 @@ -#include "custom_widgets.h" diff --git a/common/gl/yacreader_flow_gl.cpp b/common/gl/yacreader_flow_gl.cpp deleted file mode 100644 index 8c4998a1a..000000000 --- a/common/gl/yacreader_flow_gl.cpp +++ /dev/null @@ -1,1607 +0,0 @@ -#include "yacreader_flow_gl.h" - -#include -#include -#include - -/*** Animation Settings ***/ - -/*** Position Configuration ***/ - -int YACReaderFlowGL::updateInterval = 16; - -struct Preset defaultYACReaderFlowConfig = { - 0.08f, // Animation_step sets the speed of the animation - 1.5f, // Animation_speedup sets the acceleration of the animation - 0.1f, // Animation_step_max sets the maximum speed of the animation - 3.f, // Animation_Fade_out_dis sets the distance of view - - 1.5f, // pre_rotation sets the rotation increasion - 3.f, // View_rotate_light_strenght sets the light strenght on rotation - 0.01f, // View_rotate_add sets the speed of the rotation - 0.02f, // View_rotate_sub sets the speed of reversing the rotation - 20.f, // View_angle sets the maximum view angle - - 0.f, // CF_X the X Position of the Coverflow - 0.f, // CF_Y the Y Position of the Coverflow - -8.f, // CF_Z the Z Position of the Coverflow - - 15.f, // CF_RX the X Rotation of the Coverflow - 0.f, // CF_RY the Y Rotation of the Coverflow - 0.f, // CF_RZ the Z Rotation of the Coverflow - - -50.f, // Rotation sets the rotation of each cover - 0.18f, // X_Distance sets the distance between the covers - 1.f, // Center_Distance sets the distance between the centered and the non centered covers - 0.1f, // Z_Distance sets the pushback amount - 0.0f, // Y_Distance sets the elevation amount - - 30.f // zoom level - -}; - -struct Preset presetYACReaderFlowClassicConfig = { - 0.08f, // Animation_step sets the speed of the animation - 1.5f, // Animation_speedup sets the acceleration of the animation - 0.1f, // Animation_step_max sets the maximum speed of the animation - 2.f, // Animation_Fade_out_dis sets the distance of view - - 1.5f, // pre_rotation sets the rotation increasion - 3.f, // View_rotate_light_strenght sets the light strenght on rotation - 0.08f, // View_rotate_add sets the speed of the rotation - 0.08f, // View_rotate_sub sets the speed of reversing the rotation - 30.f, // View_angle sets the maximum view angle - - 0.f, // CF_X the X Position of the Coverflow - -0.2f, // CF_Y the Y Position of the Coverflow - -7.f, // CF_Z the Z Position of the Coverflow - - 0.f, // CF_RX the X Rotation of the Coverflow - 0.f, // CF_RY the Y Rotation of the Coverflow - 0.f, // CF_RZ the Z Rotation of the Coverflow - - -40.f, // Rotation sets the rotation of each cover - 0.18f, // X_Distance sets the distance between the covers - 1.f, // Center_Distance sets the distance between the centered and the non centered covers - 0.1f, // Z_Distance sets the pushback amount - 0.0f, // Y_Distance sets the elevation amount - - 22.f // zoom level - -}; - -struct Preset presetYACReaderFlowStripeConfig = { - 0.08f, // Animation_step sets the speed of the animation - 1.5f, // Animation_speedup sets the acceleration of the animation - 0.1f, // Animation_step_max sets the maximum speed of the animation - 6.f, // Animation_Fade_out_dis sets the distance of view - - 1.5f, // pre_rotation sets the rotation increasion - 4.f, // View_rotate_light_strenght sets the light strenght on rotation - 0.08f, // View_rotate_add sets the speed of the rotation - 0.08f, // View_rotate_sub sets the speed of reversing the rotation - 30.f, // View_angle sets the maximum view angle - - 0.f, // CF_X the X Position of the Coverflow - -0.2f, // CF_Y the Y Position of the Coverflow - -7.f, // CF_Z the Z Position of the Coverflow - - 0.f, // CF_RX the X Rotation of the Coverflow - 0.f, // CF_RY the Y Rotation of the Coverflow - 0.f, // CF_RZ the Z Rotation of the Coverflow - - 0.f, // Rotation sets the rotation of each cover - 1.1f, // X_Distance sets the distance between the covers - 0.2f, // Center_Distance sets the distance between the centered and the non centered covers - 0.01f, // Z_Distance sets the pushback amount - 0.0f, // Y_Distance sets the elevation amount - - 22.f // zoom level - -}; - -struct Preset presetYACReaderFlowOverlappedStripeConfig = { - 0.08f, // Animation_step sets the speed of the animation - 1.5f, // Animation_speedup sets the acceleration of the animation - 0.1f, // Animation_step_max sets the maximum speed of the animation - 2.f, // Animation_Fade_out_dis sets the distance of view - - 1.5f, // pre_rotation sets the rotation increasion - 3.f, // View_rotate_light_strenght sets the light strenght on rotation - 0.08f, // View_rotate_add sets the speed of the rotation - 0.08f, // View_rotate_sub sets the speed of reversing the rotation - 30.f, // View_angle sets the maximum view angle - - 0.f, // CF_X the X Position of the Coverflow - -0.2f, // CF_Y the Y Position of the Coverflow - -7.f, // CF_Z the Z Position of the Coverflow - - 0.f, // CF_RX the X Rotation of the Coverflow - 0.f, // CF_RY the Y Rotation of the Coverflow - 0.f, // CF_RZ the Z Rotation of the Coverflow - - 0.f, // Rotation sets the rotation of each cover - 0.18f, // X_Distance sets the distance between the covers - 1.f, // Center_Distance sets the distance between the centered and the non centered covers - 0.1f, // Z_Distance sets the pushback amount - 0.0f, // Y_Distance sets the elevation amount - - 22.f // zoom level - -}; - -struct Preset pressetYACReaderFlowUpConfig = { - 0.08f, // Animation_step sets the speed of the animation - 1.5f, // Animation_speedup sets the acceleration of the animation - 0.1f, // Animation_step_max sets the maximum speed of the animation - 2.5f, // Animation_Fade_out_dis sets the distance of view - - 1.5f, // pre_rotation sets the rotation increasion - 3.f, // View_rotate_light_strenght sets the light strenght on rotation - 0.08f, // View_rotate_add sets the speed of the rotation - 0.08f, // View_rotate_sub sets the speed of reversing the rotation - 5.f, // View_angle sets the maximum view angle - - 0.f, // CF_X the X Position of the Coverflow - -0.2f, // CF_Y the Y Position of the Coverflow - -7.f, // CF_Z the Z Position of the Coverflow - - 0.f, // CF_RX the X Rotation of the Coverflow - 0.f, // CF_RY the Y Rotation of the Coverflow - 0.f, // CF_RZ the Z Rotation of the Coverflow - - -50.f, // Rotation sets the rotation of each cover - 0.18f, // X_Distance sets the distance between the covers - 1.f, // Center_Distance sets the distance between the centered and the non centered covers - 0.1f, // Z_Distance sets the pushback amount - -0.1f, // Y_Distance sets the elevation amount - - 22.f // zoom level - -}; - -struct Preset pressetYACReaderFlowDownConfig = { - 0.08f, // Animation_step sets the speed of the animation - 1.5f, // Animation_speedup sets the acceleration of the animation - 0.1f, // Animation_step_max sets the maximum speed of the animation - 2.5f, // Animation_Fade_out_dis sets the distance of view - - 1.5f, // pre_rotation sets the rotation increasion - 3.f, // View_rotate_light_strenght sets the light strenght on rotation - 0.08f, // View_rotate_add sets the speed of the rotation - 0.08f, // View_rotate_sub sets the speed of reversing the rotation - 5.f, // View_angle sets the maximum view angle - - 0.f, // CF_X the X Position of the Coverflow - -0.2f, // CF_Y the Y Position of the Coverflow - -7.f, // CF_Z the Z Position of the Coverflow - - 0.f, // CF_RX the X Rotation of the Coverflow - 0.f, // CF_RY the Y Rotation of the Coverflow - 0.f, // CF_RZ the Z Rotation of the Coverflow - - -50.f, // Rotation sets the rotation of each cover - 0.18f, // X_Distance sets the distance between the covers - 1.f, // Center_Distance sets the distance between the centered and the non centered covers - 0.1f, // Z_Distance sets the pushback amount - 0.1f, // Y_Distance sets the elevation amount - - 22.f // zoom level -}; -/*Constructor*/ -YACReaderFlowGL::YACReaderFlowGL(QWidget *parent, struct Preset p) - : QOpenGLWidget(/*QOpenGLWidget migration QGLFormat(QGL::SampleBuffers),*/ parent), numObjects(0), lazyPopulateObjects(-1), hasBeenInitialized(false), bUseVSync(false), flowRightToLeft(false) -{ - updateCount = 0; - config = p; - - currentSelected = 0; - - centerPos.x = 0.f; - centerPos.y = 0.f; - centerPos.z = 1.f; - centerPos.rot = 0.f; - - /*** Style ***/ - shadingTop = 0.8f; - shadingBottom = 0.02f; - reflectionUp = 0.f; - reflectionBottom = 0.6f; - - /*** System variables ***/ - numObjects = 0; - // CFImage Dummy; - viewRotate = 0.f; - viewRotateActive = 0; - stepBackup = config.animationStep / config.animationSpeedUp; - - /*QTimer * timer = new QTimer(); - connect(timer, SIGNAL(timeout()), this, SLOT(updateImageData())); - timer->start(70); - */ - - /*loader = new WidgetLoader(0,this); - loader->flow = this; - QThread * loaderThread = new QThread(parent); - - loader->moveToThread(loaderThread); - - loaderThread->start();*/ - - QSurfaceFormat f = format(); - - f.setSamples(4); - f.setVersion(2, 1); - f.setSwapInterval(0); - setFormat(f); - - timerId = startTimer(updateInterval); -} - -void YACReaderFlowGL::timerEvent(QTimerEvent *event) -{ - if (timerId == event->timerId()) - update(); - - // if(!worker->isRunning()) - // worker->start(); -} - -void YACReaderFlowGL::startAnimationTimer() -{ - if (timerId == -1) - timerId = startTimer(updateInterval); -} - -void YACReaderFlowGL::stopAnimationTimer() -{ - if (timerId != -1) { - killTimer(timerId); - timerId = -1; - } -} - -YACReaderFlowGL::~YACReaderFlowGL() -{ -} - -QSize YACReaderFlowGL::minimumSizeHint() const -{ - return QSize(320, 200); -} - -/*QSize YACReaderFlowGL::sizeHint() const -{ - return QSize(320, 200); -}*/ - -void YACReaderFlowGL::initializeGL() -{ - glShadeModel(GL_SMOOTH); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - defaultTexture = new QOpenGLTexture(QImage(":/images/defaultCover.png")); - defaultTexture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::LinearMipMapLinear); -#ifdef YACREADER_LIBRARY - markTexture = new QOpenGLTexture(QImage(":/images/readRibbon.png")); - markTexture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::LinearMipMapLinear); - - readingTexture = new QOpenGLTexture(QImage(":/images/readingRibbon.png")); - readingTexture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::LinearMipMapLinear); -#endif - if (lazyPopulateObjects != -1) - populate(lazyPopulateObjects); - - hasBeenInitialized = true; -} - -void YACReaderFlowGL::paintGL() -{ - QPainter painter; - painter.begin(this); - - painter.beginNativePainting(); - - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glEnable(GL_COLOR_MATERIAL); - glEnable(GL_BLEND); - glEnable(GL_MULTISAMPLE); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glClearColor(0, 0, 0, 1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if (numObjects > 0) { - updatePositions(); - udpatePerspective(width(), height()); - draw(); - } - - glDisable(GL_MULTISAMPLE); - glDisable(GL_BLEND); - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - - painter.endNativePainting(); - - QFont font = painter.font(); - font.setFamily("Arial"); - font.setPointSize(fontSize); - painter.setFont(font); - - painter.setPen(QColor(76, 76, 76)); - painter.drawText(10, fontSize + 10, QString("%1/%2").arg(currentSelected + 1).arg(numObjects)); - - painter.end(); -} - -void YACReaderFlowGL::resizeGL(int width, int height) -{ - fontSize = (width + height) * 0.010; - if (fontSize < 10) - fontSize = 10; - - // int side = qMin(width, height); - udpatePerspective(width, height); - - if (numObjects > 0) - updatePositions(); -} - -void YACReaderFlowGL::udpatePerspective(int width, int height) -{ - float pixelRatio = devicePixelRatioF(); - glViewport(0, 0, width * pixelRatio, height * pixelRatio); - - glMatrixMode(GL_PROJECTION); - QMatrix4x4 perspectiveMatrix; - perspectiveMatrix.setToIdentity(); - perspectiveMatrix.perspective(20.0, GLdouble(width) / (float)height, 1.0, 200.0); - glLoadMatrixf(perspectiveMatrix.constData()); - glMatrixMode(GL_MODELVIEW); -} - -//----------------------------------------------------------------------------- -/*Private*/ -void YACReaderFlowGL::calcPos(YACReader3DImage &image, int pos) -{ - if (flowRightToLeft) { - pos = pos * -1; - } - - if (pos == 0) { - image.current = centerPos; - } else { - if (pos > 0) { - image.current.x = (config.centerDistance) + (config.xDistance * pos); - image.current.y = config.yDistance * pos * -1; - image.current.z = config.zDistance * pos * -1; - image.current.rot = config.rotation; - } else { - image.current.x = (config.centerDistance) * -1 + (config.xDistance * pos); - image.current.y = config.yDistance * pos; - image.current.z = config.zDistance * pos; - image.current.rot = config.rotation * -1; - } - } -} -void YACReaderFlowGL::calcVector(YACReader3DVector &vector, int pos) -{ - calcPos(dummy, pos); - - vector.x = dummy.current.x; - vector.y = dummy.current.y; - vector.z = dummy.current.z; - vector.rot = dummy.current.rot; -} - -bool YACReaderFlowGL::animate(YACReader3DVector ¤tVector, YACReader3DVector &toVector) -{ - float rotDiff = toVector.rot - currentVector.rot; - float xDiff = toVector.x - currentVector.x; - float yDiff = toVector.y - currentVector.y; - float zDiff = toVector.z - currentVector.z; - - if (fabs(rotDiff) < 0.01 && fabs(xDiff) < 0.001 && fabs(yDiff) < 0.001 && fabs(zDiff) < 0.001) - return true; - - // calculate and apply positions - currentVector.x = currentVector.x + (xDiff)*config.animationStep; - currentVector.y = currentVector.y + (yDiff)*config.animationStep; - currentVector.z = currentVector.z + (zDiff)*config.animationStep; - - if (fabs(rotDiff) > 0.01) { - currentVector.rot = currentVector.rot + (rotDiff) * (config.animationStep * config.preRotation); - } else { - viewRotateActive = 0; - } - - return false; -} -void YACReaderFlowGL::drawCover(const YACReader3DImage &image) -{ - float w = image.width; - float h = image.height; - - // fadeout - float opacity = 1 - 1 / (config.animationFadeOutDist + config.viewRotateLightStrenght * fabs(viewRotate)) * fabs(0 - image.current.x); - - glLoadIdentity(); - glTranslatef(config.cfX, config.cfY, config.cfZ); - glRotatef(config.cfRX, 1, 0, 0); - glRotatef(viewRotate * config.viewAngle + config.cfRY, 0, 1, 0); - glRotatef(config.cfRZ, 0, 0, 1); - - glTranslatef(image.current.x, image.current.y, image.current.z); - - glPushMatrix(); - glRotatef(image.current.rot, 0, 1, 0); - - glEnable(GL_TEXTURE_2D); - image.texture->bind(); - - // calculate shading - float LShading = ((config.rotation != 0) ? ((image.current.rot < 0) ? 1 - 1 / config.rotation * image.current.rot : 1) : 1); - float RShading = ((config.rotation != 0) ? ((image.current.rot > 0) ? 1 - 1 / (config.rotation * -1) * image.current.rot : 1) : 1); - float LUP = shadingTop + (1 - shadingTop) * LShading; - float LDOWN = shadingBottom + (1 - shadingBottom) * LShading; - float RUP = shadingTop + (1 - shadingTop) * RShading; - float RDOWN = shadingBottom + (1 - shadingBottom) * RShading; - ; - - // DrawCover - glBegin(GL_QUADS); - - // esquina inferior izquierda - glColor4f(LDOWN * opacity, LDOWN * opacity, LDOWN * opacity, 1); - glTexCoord2f(0.0f, 1.0f); - glVertex3f(w / 2.f * -1.f, -0.5f, 0.f); - - // esquina inferior derecha - glColor4f(RDOWN * opacity, RDOWN * opacity, RDOWN * opacity, 1); - glTexCoord2f(1.0f, 1.0f); - glVertex3f(w / 2.f, -0.5f, 0.f); - - // esquina superior derecha - glColor4f(RUP * opacity, RUP * opacity, RUP * opacity, 1); - glTexCoord2f(1.0f, 0.0f); - glVertex3f(w / 2.f, -0.5f + h, 0.f); - - // esquina superior izquierda - glColor4f(LUP * opacity, LUP * opacity, LUP * opacity, 1); - glTexCoord2f(0.0f, 0.0f); - glVertex3f(w / 2.f * -1.f, -0.5f + h, 0.f); - - glEnd(); - - // Draw reflection - glBegin(GL_QUADS); - - // esquina inferior izquierda - glColor4f(LUP * opacity * reflectionUp / 2, LUP * opacity * reflectionUp / 2, LUP * opacity * reflectionUp / 2, 1); - glTexCoord2f(0.0f, 0.0f); - glVertex3f(w / 2.f * -1.f, -0.5f - h, 0.f); - - // esquina inferior derecha - glColor4f(RUP * opacity * reflectionUp / 2, RUP * opacity * reflectionUp / 2, RUP * opacity * reflectionUp / 2, 1); - glTexCoord2f(1.0f, 0.0f); - glVertex3f(w / 2.f, -0.5f - h, 0.f); - - // esquina superior derecha - glColor4f(RDOWN * opacity / 3, RDOWN * opacity / 3, RDOWN * opacity / 3, 1); - glTexCoord2f(1.0f, 1.0f); - glVertex3f(w / 2.f, -0.5f, 0.f); - - // esquina superior izquierda - glColor4f(LDOWN * opacity / 3, LDOWN * opacity / 3, LDOWN * opacity / 3, 1); - glTexCoord2f(0.0f, 1.0f); - glVertex3f(w / 2.f * -1.f, -0.5f, 0.f); - - glEnd(); - glDisable(GL_TEXTURE_2D); - - if (showMarks && loaded[image.index] && marks[image.index] != Unread) { - glEnable(GL_TEXTURE_2D); - if (marks[image.index] == Read) - markTexture->bind(); - else - readingTexture->bind(); - glBegin(GL_QUADS); - - // esquina inferior izquierda - glColor4f(RUP * opacity, RUP * opacity, RUP * opacity, 1); - glTexCoord2f(0.0f, 1.0f); - glVertex3f(w / 2.f - 0.2, -0.688f + h, 0.001f); - - // esquina inferior derecha - glColor4f(RUP * opacity, RUP * opacity, RUP * opacity, 1); - glTexCoord2f(1.0f, 1.0f); - glVertex3f(w / 2.f - 0.05, -0.688f + h, 0.001f); - - // esquina superior derecha - glColor4f(RUP * opacity, RUP * opacity, RUP * opacity, 1); - glTexCoord2f(1.0f, 0.0f); - glVertex3f(w / 2.f - 0.05, -0.488f + h, 0.001f); - - // esquina superior izquierda - glColor4f(RUP * opacity, RUP * opacity, RUP * opacity, 1); - glTexCoord2f(0.0f, 0.0f); - glVertex3f(w / 2.f - 0.2, -0.488f + h, 0.001f); - - glEnd(); - glDisable(GL_TEXTURE_2D); - } - - glPopMatrix(); -} - -/*Public*/ -void YACReaderFlowGL::cleanupAnimation() -{ - config.animationStep = stepBackup; - viewRotateActive = 0; -} - -void YACReaderFlowGL::draw() -{ - int CS = currentSelected; - int count; - - // Draw right Covers - for (count = numObjects - 1; count > -1; count--) { - if (count > CS) { - drawCover(images[count]); - } - } - - // Draw left Covers - for (count = 0; count < numObjects - 1; count++) { - if (count < CS) { - drawCover(images[count]); - } - } - - // Draw Center Cover - drawCover(images[CS]); -} - -void YACReaderFlowGL::showPrevious() -{ - startAnimationTimer(); - - if (currentSelected > 0) { - - currentSelected--; - emit centerIndexChanged(currentSelected); - config.animationStep *= config.animationSpeedUp; - - if (config.animationStep > config.animationStepMax) { - config.animationStep = config.animationStepMax; - } - - if (viewRotateActive && viewRotate > -1) { - viewRotate -= config.viewRotateAdd; - } - - viewRotateActive = 1; - } -} - -void YACReaderFlowGL::showNext() -{ - startAnimationTimer(); - - if (currentSelected < numObjects - 1) { - - currentSelected++; - emit centerIndexChanged(currentSelected); - config.animationStep *= config.animationSpeedUp; - - if (config.animationStep > config.animationStepMax) { - config.animationStep = config.animationStepMax; - } - - if (viewRotateActive && viewRotate < 1) { - viewRotate += config.viewRotateAdd; - } - - viewRotateActive = 1; - } -} - -void YACReaderFlowGL::setCurrentIndex(int pos) -{ - if (!(pos >= 0 && pos < images.length() && images.length() > 0)) - return; - if (pos >= images.length() && images.length() > 0) - pos = images.length() - 1; - - startAnimationTimer(); - - currentSelected = pos; - - config.animationStep *= config.animationSpeedUp; - - if (config.animationStep > config.animationStepMax) { - config.animationStep = config.animationStepMax; - } - - if (viewRotateActive && viewRotate < 1) { - viewRotate += config.viewRotateAdd; - } - - viewRotateActive = 1; -} - -void YACReaderFlowGL::updatePositions() -{ - int count; - - bool stopAnimation = true; - for (count = numObjects - 1; count > -1; count--) { - calcVector(images[count].animEnd, count - currentSelected); - if (!animate(images[count].current, images[count].animEnd)) - stopAnimation = false; - } - - // slowly reset view angle - if (!viewRotateActive) { - viewRotate += (0 - viewRotate) * config.viewRotateSub; - } - - if (fabs(images[currentSelected].current.x - images[currentSelected].animEnd.x) < 1) // viewRotate < 0.2) - { - cleanupAnimation(); - if (updateCount >= 0) // TODO parametrizar - { - - updateCount = 0; - updateImageData(); - } else - updateCount++; - } else - updateCount++; - - if (stopAnimation) - stopAnimationTimer(); -} - -void YACReaderFlowGL::insert(char *name, QOpenGLTexture *texture, float x, float y, int item) -{ - startAnimationTimer(); - - Q_UNUSED(name) - // set a new entry - if (item == -1) { - images.push_back(YACReader3DImage()); - - item = numObjects; - numObjects++; - - calcVector(images[item].current, item); - images[item].current.z = images[item].current.z - 1; - } - - images[item].texture = texture; - images[item].width = x; - images[item].height = y; - images[item].index = item; - // strcpy(cfImages[item].name,name); -} - -void YACReaderFlowGL::remove(int item) -{ - if (item < 0 || item >= images.size()) - return; - - startAnimationTimer(); - - loaded.remove(item); - marks.remove(item); - - // reposition current selection - if (item <= currentSelected && currentSelected != 0) { - currentSelected--; - } - - QOpenGLTexture *texture = images[item].texture; - - int count = item; - while (count <= numObjects - 1) { - images[count].index--; - count++; - } - images.removeAt(item); - - if (texture != defaultTexture) - delete (texture); - - numObjects--; -} - -void YACReaderFlowGL::add(int item) -{ - float x = 1; - float y = 1 * (700.f / 480.0f); - QString s = "cover"; - - images.insert(item, YACReader3DImage()); - loaded.insert(item, false); - marks.insert(item, Unread); - numObjects++; - - for (int i = item + 1; i < numObjects; i++) { - images[i].index++; - } - - insert(s.toLocal8Bit().data(), defaultTexture, x, y, item); -} - -/*Info*/ -YACReader3DImage YACReaderFlowGL::getCurrentSelected() -{ - return images[currentSelected]; -} - -void YACReaderFlowGL::replace(char *name, QOpenGLTexture *texture, float x, float y, int item) -{ - startAnimationTimer(); - - Q_UNUSED(name) - if (images[item].index == item) { - images[item].texture = texture; - images[item].width = x; - images[item].height = y; - loaded[item] = true; - } else - loaded[item] = false; -} - -void YACReaderFlowGL::populate(int n) -{ - emit centerIndexChanged(0); - - float x = 1; - float y = 1 * (700.f / 480.0f); - int i; - - for (i = 0; i < n; i++) { - QString s = "cover"; - insert(s.toLocal8Bit().data(), defaultTexture, x, y); - } - - loaded = QVector(n, false); -} - -void YACReaderFlowGL::reset() -{ - makeCurrent(); - - startAnimationTimer(); - - currentSelected = 0; - loaded.clear(); - - for (int i = 0; i < numObjects; i++) { - if (images[i].texture != defaultTexture) - delete (images[i].texture); - } - - numObjects = 0; - images.clear(); - - if (!hasBeenInitialized) - lazyPopulateObjects = -1; - - doneCurrent(); -} - -void YACReaderFlowGL::reload() -{ - startAnimationTimer(); - - int n = numObjects; - reset(); - populate(n); -} - -// slots -void YACReaderFlowGL::setCF_RX(int value) -{ - startAnimationTimer(); - - config.cfRX = value; -} -void YACReaderFlowGL::setCF_RY(int value) -{ - startAnimationTimer(); - - config.cfRY = value; -} -void YACReaderFlowGL::setCF_RZ(int value) -{ - startAnimationTimer(); - - config.cfRZ = value; -} - -void YACReaderFlowGL::setZoom(int zoom) -{ - startAnimationTimer(); - - int width = this->width(); - int height = this->height(); - glViewport(0, 0, width, height); - - glMatrixMode(GL_PROJECTION); - QMatrix4x4 zoomMatrix; - zoomMatrix.setToIdentity(); - zoomMatrix.perspective(zoom, (float)width / (float)height, 1.0, 200.0); - glLoadMatrixf(zoomMatrix.constData()); - glMatrixMode(GL_MODELVIEW); -} - -void YACReaderFlowGL::setRotation(int angle) -{ - startAnimationTimer(); - - config.rotation = -angle; -} -// sets the distance between the covers -void YACReaderFlowGL::setX_Distance(int distance) -{ - startAnimationTimer(); - - config.xDistance = distance / 100.0; -} -// sets the distance between the centered and the non centered covers -void YACReaderFlowGL::setCenter_Distance(int distance) -{ - startAnimationTimer(); - - config.centerDistance = distance / 100.0; -} -// sets the pushback amount -void YACReaderFlowGL::setZ_Distance(int distance) -{ - startAnimationTimer(); - - config.zDistance = distance / 100.0; -} - -void YACReaderFlowGL::setCF_Y(int value) -{ - startAnimationTimer(); - - config.cfY = value / 100.0; -} - -void YACReaderFlowGL::setCF_Z(int value) -{ - startAnimationTimer(); - - config.cfZ = value; -} - -void YACReaderFlowGL::setY_Distance(int value) -{ - startAnimationTimer(); - - config.yDistance = value / 100.0; -} - -void YACReaderFlowGL::setFadeOutDist(int value) -{ - startAnimationTimer(); - - config.animationFadeOutDist = value; -} - -void YACReaderFlowGL::setLightStrenght(int value) -{ - startAnimationTimer(); - - config.viewRotateLightStrenght = value; -} - -void YACReaderFlowGL::setMaxAngle(int value) -{ - startAnimationTimer(); - - config.viewAngle = value; -} - -void YACReaderFlowGL::setPreset(const Preset &p) -{ - startAnimationTimer(); - - config = p; -} - -void YACReaderFlowGL::setPerformance(Performance performance) -{ - if (this->performance != performance) { - startAnimationTimer(); - - this->performance = performance; - reload(); - } -} - -void YACReaderFlowGL::useVSync(bool b) -{ - if (bUseVSync != b) { - bUseVSync = b; - if (b) { - QSurfaceFormat f = format(); - f.setVersion(2, 1); - f.setSwapInterval(1); - setFormat(f); - } else { - QSurfaceFormat f = format(); - f.setVersion(2, 1); - f.setSwapInterval(0); - setFormat(f); - } - reset(); - } -} -void YACReaderFlowGL::setShowMarks(bool value) -{ - startAnimationTimer(); - - showMarks = value; -} -void YACReaderFlowGL::setMarks(QVector marks) -{ - startAnimationTimer(); - - this->marks = marks; -} -void YACReaderFlowGL::setMarkImage(QImage &image) -{ - Q_UNUSED(image); - // qué pasa la primera vez?? - // deleteTexture(markTexture); - // markTexture = bindTexture(image,GL_TEXTURE_2D,GL_RGBA,QGLContext::LinearFilteringBindOption | QGLContext::MipmapBindOption); -} -void YACReaderFlowGL::markSlide(int index, YACReader::YACReaderComicReadStatus status) -{ - startAnimationTimer(); - - marks[index] = status; -} -void YACReaderFlowGL::unmarkSlide(int index) -{ - startAnimationTimer(); - - marks[index] = YACReader::Unread; -} -void YACReaderFlowGL::setSlideSize(QSize size) -{ - Q_UNUSED(size); - // TODO calcular el tamaño del widget -} -void YACReaderFlowGL::clear() -{ - reset(); -} - -void YACReaderFlowGL::setCenterIndex(unsigned int index) -{ - setCurrentIndex(index); -} -void YACReaderFlowGL::showSlide(int index) -{ - setCurrentIndex(index); -} -int YACReaderFlowGL::centerIndex() -{ - return currentSelected; -} -void YACReaderFlowGL::updateMarks() -{ - // do nothing -} -/*void YACReaderFlowGL::setFlowType(FlowType flowType) -{ - //TODO esperar a que se reimplemente flowtype -}*/ -void YACReaderFlowGL::render() -{ - // do nothing -} - -void YACReaderFlowGL::setFlowRightToLeft(bool b) -{ - flowRightToLeft = b; -} - -// EVENTOS - -void YACReaderFlowGL::wheelEvent(QWheelEvent *event) -{ - Movement m = getMovement(event); - switch (m) { - case None: - return; - case Forward: - showNext(); - break; - case Backward: - showPrevious(); - break; - default: - break; - } -} - -void YACReaderFlowGL::keyPressEvent(QKeyEvent *event) -{ - if ((event->key() == Qt::Key_Left && !flowRightToLeft) || (event->key() == Qt::Key_Right && flowRightToLeft)) { - if (event->modifiers() == Qt::ControlModifier) - setCurrentIndex((currentSelected - 10 < 0) ? 0 : currentSelected - 10); - else - showPrevious(); - event->accept(); - return; - } - - if ((event->key() == Qt::Key_Right && !flowRightToLeft) || (event->key() == Qt::Key_Left && flowRightToLeft)) { - if (event->modifiers() == Qt::ControlModifier) - setCurrentIndex((currentSelected + 10 >= numObjects) ? numObjects - 1 : currentSelected + 10); - else - showNext(); - event->accept(); - return; - } - - if (event->key() == Qt::Key_Up) { - // emit selected(centerIndex()); - return; - } - - event->ignore(); -} - -void YACReaderFlowGL::mousePressEvent(QMouseEvent *event) -{ - if (event->button() == Qt::LeftButton) { - QVector3D intersection = getPlaneIntersection(event->x(), event->y(), images[currentSelected]); - if ((intersection.x() > 0.5 && !flowRightToLeft) || (intersection.x() < -0.5 && flowRightToLeft)) { - showNext(); - } else if ((intersection.x() < -0.5 && !flowRightToLeft) || (intersection.x() > 0.5 && flowRightToLeft)) { - showPrevious(); - } - } else { - QOpenGLWidget::mousePressEvent(event); - } - doneCurrent(); -} - -void YACReaderFlowGL::mouseDoubleClickEvent(QMouseEvent *event) -{ - QVector3D intersection = getPlaneIntersection(event->x(), event->y(), images[currentSelected]); - - if (intersection.x() < 0.5 && intersection.x() > -0.5) { - emit selected(centerIndex()); - event->accept(); - } -} - -QVector3D YACReaderFlowGL::getPlaneIntersection(int x, int y, YACReader3DImage plane) -{ - // get viewport and matrices - // TODO: these should be cached!!! - GLint viewport[4]; - QMatrix4x4 m_modelview; - QMatrix4x4 m_projection; - makeCurrent(); - glGetIntegerv(GL_VIEWPORT, viewport); - glGetFloatv(GL_MODELVIEW_MATRIX, m_modelview.data()); - glGetFloatv(GL_PROJECTION_MATRIX, m_projection.data()); - doneCurrent(); - - // create the picking ray - QVector3D ray_origin(x * devicePixelRatioF(), y * devicePixelRatioF(), 0); - QVector3D ray_end(x * devicePixelRatioF(), y * devicePixelRatioF(), 1.0); - - // TODO: These should be cached in the class - - ray_origin = ray_origin.unproject(m_modelview, m_projection, QRect(viewport[0], viewport[1], viewport[2], viewport[3])); - ray_end = ray_end.unproject(m_modelview, m_projection, QRect(viewport[0], viewport[1], viewport[2], viewport[3])); - - QVector3D ray_vector = ray_end - ray_origin; - - // calculate the plane vectors - QVector3D plane_origin((plane.width / 2) * -1, -0.5, 0); - QVector3D plane_vektor_1 = QVector3D(plane.width / 2, -0.5, 0) - plane_origin; - QVector3D plane_vektor_2 = QVector3D((plane.width / 2) * -1, -0.5 * plane.height, 0) - plane_origin; - - // get the intersection using Cramer's rule. We only x for the line, not the plane - double intersection_LES_determinant = ((plane_vektor_1.x() * plane_vektor_2.y() * (-1) * ray_vector.z()) + (plane_vektor_2.x() * (-1) * ray_vector.y() * plane_vektor_1.z()) + ((-1) * ray_vector.x() * plane_vektor_1.y() * plane_vektor_2.z()) - ((-1) * ray_vector.x() * plane_vektor_2.y() * plane_vektor_1.z()) - (plane_vektor_1.x() * (-1) * ray_vector.y() * plane_vektor_2.z()) - (plane_vektor_2.x() * plane_vektor_1.y() * (-1) * ray_vector.z())); - - QVector3D det = ray_origin - plane_origin; - - double intersection_ray_determinant = ((plane_vektor_1.x() * plane_vektor_2.y() * det.z()) + (plane_vektor_2.x() * det.y() * plane_vektor_1.z()) + (det.x() * plane_vektor_1.y() * plane_vektor_2.z()) - (det.x() * plane_vektor_2.y() * plane_vektor_1.z()) - (plane_vektor_1.x() * det.y() * plane_vektor_2.z()) - (plane_vektor_2.x() * plane_vektor_1.y() * det.z())); - - // return the intersection point - return ray_origin + ray_vector * (intersection_ray_determinant / intersection_LES_determinant); -} - -YACReaderComicFlowGL::YACReaderComicFlowGL(QWidget *parent, struct Preset p) - : YACReaderFlowGL(parent, p) -{ - worker = new ImageLoaderGL(this); - worker->flow = this; -} - -void YACReaderComicFlowGL::setImagePaths(QStringList paths) -{ - worker->reset(); - reset(); - numObjects = 0; - if (lazyPopulateObjects != -1 || hasBeenInitialized) - YACReaderFlowGL::populate(paths.size()); - lazyPopulateObjects = paths.size(); - this->paths = paths; - // numObjects = paths.size(); -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void YACReaderComicFlowGL::updateImageData() -{ - // can't do anything, wait for the next possibility - if (worker->busy()) - return; - - // set image of last one - int idx = worker->index(); - if (idx >= 0 && !worker->result().isNull()) { - if (!loaded[idx]) { - float x = 1; - QImage img = worker->result(); - QOpenGLTexture *texture = new QOpenGLTexture(img); - - if (performance == high || performance == ultraHigh) { - texture->setAutoMipMapGenerationEnabled(true); - texture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::LinearMipMapLinear); - } else { - texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); - } - - float y = 1 * (float(img.height()) / img.width()); - QString s = "cover"; - replace(s.toLocal8Bit().data(), texture, x, y, idx); - } - } - - // try to load only few images on the left and right side - // i.e. all visible ones plus some extra - int count = 8; - switch (performance) { - case low: - count = 8; - break; - case medium: - count = 10; - break; - case high: - count = 12; - break; - case ultraHigh: - count = 16; - break; - } - int *indexes = new int[2 * count + 1]; - int center = currentSelected; - indexes[0] = center; - for (int j = 0; j < count; j++) { - indexes[j * 2 + 1] = center + j + 1; - indexes[j * 2 + 2] = center - j - 1; - } - for (int c = 0; c < 2 * count + 1; c++) { - int i = indexes[c]; - if ((i >= 0) && (i < numObjects)) - if (!loaded[i]) // slide(i).isNull()) - { - // loader->loadTexture(i); - // loaded[i]=true; - // schedule thumbnail generation - if (paths.size() > 0) { - QString fname = paths.at(i); - // loaded[i]=true; - - worker->generate(i, fname); - } - delete[] indexes; - return; - } - } - - delete[] indexes; -} - -void YACReaderComicFlowGL::remove(int item) -{ - worker->lock(); - worker->reset(); - YACReaderFlowGL::remove(item); - if (item >= 0 && item < paths.size()) { - paths.removeAt(item); - } - worker->unlock(); -} - -void YACReaderComicFlowGL::add(const QString &path, int index) -{ - worker->lock(); - worker->reset(); - - paths.insert(index, path); - - YACReaderFlowGL::add(index); - - worker->unlock(); -} - -void YACReaderComicFlowGL::resortCovers(QList newOrder) -{ - worker->lock(); - worker->reset(); // is this necesary? - startAnimationTimer(); - QList pathsNew; - QVector loadedNew; - QVector marksNew; - QVector imagesNew; - - int index = 0; - foreach (int i, newOrder) { - if (i < 0 || i >= images.size()) { - continue; - } - - pathsNew << paths.at(i); - loadedNew << loaded.at(i); - marksNew << marks.at(i); - imagesNew << images.at(i); - imagesNew.last().index = index++; - } - - paths = pathsNew; - loaded = loadedNew; - marks = marksNew; - images = imagesNew; - - worker->unlock(); -} - -YACReaderPageFlowGL::YACReaderPageFlowGL(QWidget *parent, struct Preset p) - : YACReaderFlowGL(parent, p) -{ - worker = new ImageLoaderByteArrayGL(this); - worker->flow = this; -} - -YACReaderPageFlowGL::~YACReaderPageFlowGL() -{ - this->killTimer(timerId); - rawImages.clear(); - - makeCurrent(); - - for (auto &image : images) { - if (image.texture != defaultTexture) { - if (image.texture->isCreated()) { - image.texture->destroy(); - } - delete image.texture; - } - } - - if (defaultTexture != nullptr) { - if (defaultTexture->isCreated()) { - defaultTexture->destroy(); - } - delete defaultTexture; - } - - doneCurrent(); -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void YACReaderPageFlowGL::updateImageData() -{ - // can't do anything, wait for the next possibility - if (worker->busy()) - return; - - // set image of last one - int idx = worker->index(); - if (idx >= 0 && !worker->result().isNull()) { - if (!loaded[idx]) { - float x = 1; - QImage img = worker->result(); - QOpenGLTexture *texture = new QOpenGLTexture(img); - - if (performance == high || performance == ultraHigh) { - texture->setAutoMipMapGenerationEnabled(true); - texture->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::LinearMipMapLinear); - } else { - texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); - } - - float y = 1 * (float(img.height()) / img.width()); - QString s = "cover"; - replace(s.toLocal8Bit().data(), texture, x, y, idx); - loaded[idx] = true; - } - } - - // try to load only few images on the left and right side - // i.e. all visible ones plus some extra - int count = 8; - switch (performance) { - case low: - count = 8; - break; - case medium: - count = 10; - break; - case high: - count = 12; - break; - case ultraHigh: - count = 14; - break; - } - int *indexes = new int[2 * count + 1]; - int center = currentSelected; - indexes[0] = center; - for (int j = 0; j < count; j++) { - indexes[j * 2 + 1] = center + j + 1; - indexes[j * 2 + 2] = center - j - 1; - } - for (int c = 0; c < 2 * count + 1; c++) { - int i = indexes[c]; - if ((i >= 0) && (i < numObjects)) - if (rawImages.size() > 0) - - if (!loaded[i] && imagesReady[i]) // slide(i).isNull()) - { - worker->generate(i, rawImages.at(i)); - - delete[] indexes; - return; - } - } - - delete[] indexes; -} - -void YACReaderPageFlowGL::populate(int n) -{ - worker->reset(); - if (lazyPopulateObjects != -1 || hasBeenInitialized) - YACReaderFlowGL::populate(n); - lazyPopulateObjects = n; - imagesReady = QVector(n, false); - rawImages = QVector(n); - imagesSetted = QVector(n, false); // puede sobrar -} - -//----------------------------------------------------------------------------- -// ImageLoader -//----------------------------------------------------------------------------- -QImage ImageLoaderGL::loadImage(const QString &fileName) -{ - QImage image; - - if (!image.load(fileName)) { - return QImage(); - } - - switch (flow->performance) { - case low: - image = image.scaledToWidth(200, Qt::SmoothTransformation); - break; - case medium: - image = image.scaledToWidth(256, Qt::SmoothTransformation); - break; - case high: - image = image.scaledToWidth(320, Qt::SmoothTransformation); - break; - case ultraHigh: - break; // no scaling in ultraHigh - } - - return image; -} - -ImageLoaderGL::ImageLoaderGL(YACReaderFlowGL *flow) - : QThread(), flow(flow), restart(false), working(false), idx(-1) -{ -} - -ImageLoaderGL::~ImageLoaderGL() -{ - mutex.lock(); - condition.wakeOne(); - mutex.unlock(); - wait(); -} - -bool ImageLoaderGL::busy() const -{ - return isRunning() ? working : false; -} - -void ImageLoaderGL::generate(int index, const QString &fileName) -{ - mutex.lock(); - this->idx = index; - this->fileName = fileName; - this->size = size; - this->img = QImage(); - mutex.unlock(); - - if (!isRunning()) - start(); - else { - // already running, wake up whenever ready - restart = true; - condition.wakeOne(); - } -} - -void ImageLoaderGL::lock() -{ - mutex.lock(); -} - -void ImageLoaderGL::unlock() -{ - mutex.unlock(); -} - -void ImageLoaderGL::run() -{ - for (;;) { - // copy necessary data - mutex.lock(); - this->working = true; - QString fileName = this->fileName; - mutex.unlock(); - - QImage image = loadImage(fileName); - - // let everyone knows it is ready - mutex.lock(); - this->working = false; - this->img = image; - mutex.unlock(); - - // put to sleep - mutex.lock(); - if (!this->restart) - condition.wait(&mutex); - restart = false; - mutex.unlock(); - } -} - -QImage ImageLoaderGL::result() -{ - return img; -} - -//----------------------------------------------------------------------------- -// ImageLoader -//----------------------------------------------------------------------------- -QImage ImageLoaderByteArrayGL::loadImage(const QByteArray &raw) -{ - QImage image; - - if (!image.loadFromData(raw)) { - return QImage(); - } - - switch (flow->performance) { - case low: - image = image.scaledToWidth(128, Qt::SmoothTransformation); - break; - case medium: - image = image.scaledToWidth(196, Qt::SmoothTransformation); - break; - case high: - image = image.scaledToWidth(256, Qt::SmoothTransformation); - break; - case ultraHigh: - image = image.scaledToWidth(320, Qt::SmoothTransformation); - break; - } - - return image; -} - -ImageLoaderByteArrayGL::ImageLoaderByteArrayGL(YACReaderFlowGL *flow) - : QThread(), flow(flow), restart(false), working(false), idx(-1) -{ -} - -ImageLoaderByteArrayGL::~ImageLoaderByteArrayGL() -{ - mutex.lock(); - condition.wakeOne(); - mutex.unlock(); - wait(); -} - -bool ImageLoaderByteArrayGL::busy() const -{ - return isRunning() ? working : false; -} - -void ImageLoaderByteArrayGL::generate(int index, const QByteArray &raw) -{ - mutex.lock(); - this->idx = index; - this->rawData = raw; - this->size = size; - this->img = QImage(); - mutex.unlock(); - - if (!isRunning()) - start(); - else { - // already running, wake up whenever ready - restart = true; - condition.wakeOne(); - } -} - -void ImageLoaderByteArrayGL::run() -{ - for (;;) { - // copy necessary data - mutex.lock(); - this->working = true; - QByteArray raw = this->rawData; - mutex.unlock(); - - QImage image = loadImage(raw); - - // let everyone knows it is ready - mutex.lock(); - this->working = false; - this->img = image; - mutex.unlock(); - - // put to sleep - mutex.lock(); - if (!this->restart) - condition.wait(&mutex); - restart = false; - mutex.unlock(); - } -} - -QImage ImageLoaderByteArrayGL::result() -{ - return img; -} diff --git a/common/gl/yacreader_flow_gl.h b/common/gl/yacreader_flow_gl.h deleted file mode 100644 index b40ea4128..000000000 --- a/common/gl/yacreader_flow_gl.h +++ /dev/null @@ -1,397 +0,0 @@ -// OpenGL Coverflow API by J.Roth -#ifndef __YACREADER_FLOW_GL_H -#define __YACREADER_FLOW_GL_H - -#include - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) -#include -#include -#else -#include -#include -#endif - -#include -#include - -#include "pictureflow.h" //TODO mover los tipos de flow de sitio -#include "scroll_management.h" - -class ImageLoaderGL; -class ImageLoaderByteArrayGL; - -enum Performance { - low = 0, - medium, - high, - ultraHigh -}; - -// Cover Vector -struct YACReader3DVector { - float x; - float y; - float z; - float rot; -}; - -// the image/texture info struct -struct YACReader3DImage { - QOpenGLTexture *texture; - // char name[256]; - - float width; - float height; - - int index; - - YACReader3DVector current; - YACReader3DVector animEnd; -}; - -struct Preset { - /*** Animation Settings ***/ - // sets the speed of the animation - float animationStep; - // sets the acceleration of the animation - float animationSpeedUp; - // sets the maximum speed of the animation - float animationStepMax; - // sets the distance of view - float animationFadeOutDist; - // sets the rotation increasion - float preRotation; - // sets the light strenght on rotation - float viewRotateLightStrenght; - // sets the speed of the rotation - float viewRotateAdd; - // sets the speed of reversing the rotation - float viewRotateSub; - // sets the maximum view angle - float viewAngle; - - /*** Position Configuration ***/ - // the X Position of the Coverflow - float cfX; - // the Y Position of the Coverflow - float cfY; - // the Z Position of the Coverflow - float cfZ; - // the X Rotation of the Coverflow - float cfRX; - // the Y Rotation of the Coverflow - float cfRY; - // the Z Rotation of the Coverflow - float cfRZ; - // sets the rotation of each cover - float rotation; - // sets the distance between the covers - float xDistance; - // sets the distance between the centered and the non centered covers - float centerDistance; - // sets the pushback amount - float zDistance; - // sets the elevation amount - float yDistance; - - float zoom; -}; - -extern struct Preset defaultYACReaderFlowConfig; -extern struct Preset presetYACReaderFlowClassicConfig; -extern struct Preset presetYACReaderFlowStripeConfig; -extern struct Preset presetYACReaderFlowOverlappedStripeConfig; -extern struct Preset pressetYACReaderFlowUpConfig; -extern struct Preset pressetYACReaderFlowDownConfig; - -class YACReaderFlowGL : public QOpenGLWidget, public ScrollManagement -{ - Q_OBJECT -protected: - int timerId; - /*** System variables ***/ - YACReader3DImage dummy; - int viewRotateActive; - float stepBackup; - - /*functions*/ - void calcPos(YACReader3DImage &image, int pos); - void calcVector(YACReader3DVector &vector, int pos); - // returns true if the animation is finished for Current - bool animate(YACReader3DVector ¤tVector, YACReader3DVector &toVector); - void drawCover(const YACReader3DImage &image); - - void udpatePerspective(int width, int height); - - int updateCount; - int fontSize; - - QOpenGLTexture *defaultTexture = nullptr; - QOpenGLTexture *markTexture = nullptr; - QOpenGLTexture *readingTexture = nullptr; - void initializeGL(); - void paintGL(); - void timerEvent(QTimerEvent *); - - // number of Covers - int numObjects; - int lazyPopulateObjects; - bool showMarks; - QVector loaded; - QVector marks; - - QVector images; - - bool hasBeenInitialized; - - Performance performance; - bool bUseVSync; - - /*** Animation Settings ***/ - Preset config; - - // sets/returns the curent selected cover - int currentSelected; - - // defines the position of the centered cover - YACReader3DVector centerPos; - - /*** Style ***/ - // sets the amount of shading of the covers in the back (0-1) - float shadingTop; - float shadingBottom; - - // sets the reflection strenght (0-1) - float reflectionUp; - float reflectionBottom; - - /*** System info ***/ - float viewRotate; - - // sets the updateInterval in ms - static int updateInterval; - - // sets flow direction right-to-left (manga mode) - bool flowRightToLeft; - - void startAnimationTimer(); - void stopAnimationTimer(); - -public: - /*Constructor*/ - YACReaderFlowGL(QWidget *parent = 0, struct Preset p = pressetYACReaderFlowDownConfig); - virtual ~YACReaderFlowGL(); - - // size; - QSize minimumSizeHint() const; - // QSize sizeHint() const; - - /*functions*/ - - // if called it moves the coverflow to the left - void showPrevious(); - // if called it moves the coverflow to the right - void showNext(); - // go to - void setCurrentIndex(int pos); - // must be called whenever the coverflow animation is stopped - void cleanupAnimation(); - // Draws the coverflow - void draw(); - // updates the coverflow - void updatePositions(); - // inserts a new item to the coverflow - // if item is set to a value > -1 it updates a already set value - // otherwise a new entry is set - void insert(char *name, QOpenGLTexture *texture, float x, float y, int item = -1); - // removes a item - virtual void remove(int item); - // inserts a default texture into `item` and set is as pending to load - void add(int item); - // replaces the texture of the item 'item' with Tex - void replace(char *name, QOpenGLTexture *texture, float x, float y, int item); - // create n covers with the default nu - void populate(int n); - /*Info*/ - // retuns the YACReader3DImage Struct of the current selected item - // to read title or textures - YACReader3DImage getCurrentSelected(); - -public slots: - void setCF_RX(int value); - // the Y Rotation of the Coverflow - void setCF_RY(int value); - // the Z Rotation of the Coverflow - void setCF_RZ(int value); - - // perspective - void setZoom(int zoom); - - void setRotation(int angle); - // sets the distance between the covers - void setX_Distance(int distance); - // sets the distance between the centered and the non centered covers - void setCenter_Distance(int distance); - // sets the pushback amount - void setZ_Distance(int distance); - - void setCF_Y(int value); - void setCF_Z(int value); - - void setY_Distance(int value); - - void setFadeOutDist(int value); - - void setLightStrenght(int value); - - void setMaxAngle(int value); - - void setPreset(const Preset &p); - - void setPerformance(Performance performance); - - void useVSync(bool b); - - void setFlowRightToLeft(bool b); - - virtual void updateImageData() = 0; - - void reset(); - void reload(); - - // interface with yacreaderlibrary, compatibility - void setShowMarks(bool value); - void setMarks(QVector marks); - void setMarkImage(QImage &image); - void markSlide(int index, YACReader::YACReaderComicReadStatus status); - void unmarkSlide(int index); - void setSlideSize(QSize size); - void clear(); - void setCenterIndex(unsigned int index); - void showSlide(int index); - int centerIndex(); - void updateMarks(); - // void setFlowType(PictureFlow::FlowType flowType); - void render(); - - // void paintEvent(QPaintEvent *event); - QVector3D getPlaneIntersection(int x, int y, YACReader3DImage plane); - void mouseDoubleClickEvent(QMouseEvent *event); - void mousePressEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent *event); - void keyPressEvent(QKeyEvent *event); - void resizeGL(int width, int height); - friend class ImageLoaderGL; - friend class ImageLoaderByteArrayGL; - -signals: - void centerIndexChanged(int); - void selected(unsigned int); -}; - -class YACReaderComicFlowGL : public YACReaderFlowGL -{ -public: - YACReaderComicFlowGL(QWidget *parent = 0, struct Preset p = defaultYACReaderFlowConfig); - void setImagePaths(QStringList paths); - void updateImageData(); - void remove(int item); - void add(const QString &path, int index); - void resortCovers(QList newOrder); - friend class ImageLoaderGL; - -private: - ImageLoaderGL *worker; - -protected: - QList paths; -}; - -class YACReaderPageFlowGL : public YACReaderFlowGL -{ -public: - YACReaderPageFlowGL(QWidget *parent = 0, struct Preset p = defaultYACReaderFlowConfig); - ~YACReaderPageFlowGL(); - void updateImageData(); - void populate(int n); - QVector imagesReady; - QVector rawImages; - QVector imagesSetted; - friend class ImageLoaderByteArrayGL; - -private: - ImageLoaderByteArrayGL *worker; -}; - -class ImageLoaderGL : public QThread -{ -public: - ImageLoaderGL(YACReaderFlowGL *flow); - ~ImageLoaderGL(); - // returns FALSE if worker is still busy and can't take the task - bool busy() const; - void generate(int index, const QString &fileName); - void reset() - { - idx = -1; - fileName = ""; - } - int index() const { return idx; } - void lock(); - void unlock(); - QImage result(); - YACReaderFlowGL *flow; - GLuint resultTexture; - QImage loadImage(const QString &fileName); - -protected: - void run(); - -private: - QMutex mutex; - QWaitCondition condition; - - bool restart; - bool working; - int idx; - QString fileName; - QSize size; - QImage img; -}; - -class ImageLoaderByteArrayGL : public QThread -{ -public: - ImageLoaderByteArrayGL(YACReaderFlowGL *flow); - ~ImageLoaderByteArrayGL(); - // returns FALSE if worker is still busy and can't take the task - bool busy() const; - void generate(int index, const QByteArray &raw); - void reset() - { - idx = -1; - rawData.clear(); - } - int index() const { return idx; } - QImage result(); - YACReaderFlowGL *flow; - GLuint resultTexture; - QImage loadImage(const QByteArray &rawData); - -protected: - void run(); - -private: - QMutex mutex; - QWaitCondition condition; - - bool restart; - bool working; - int idx; - QByteArray rawData; - QSize size; - QImage img; -}; - -#endif diff --git a/common/global_info_provider.cpp b/common/global_info_provider.cpp index 8ef36cc53..b3ca5a93d 100644 --- a/common/global_info_provider.cpp +++ b/common/global_info_provider.cpp @@ -1,8 +1,10 @@ #include "global_info_provider.h" -#include +#include "yacreader_global.h" + #include #include +#include #ifdef YACREADER_LIBRARY #include @@ -24,6 +26,7 @@ QString YACReader::getGlobalInfo() text.append("\nAPP INFORMATION\n"); QString supportedImageFormats = QImageReader::supportedImageFormats().join(", "); text.append(QString("Image formats supported: %1\n").arg(supportedImageFormats)); + text.append(QString("User image plugin folder: %1\n").arg(YACReader::getImageFormatsPluginsPath())); // append if sqlite driver is available #ifdef YACREADER_LIBRARY text.append(QString("SQLite driver available: %1\n").arg(QSqlDatabase::isDriverAvailable("QSQLITE") ? "yes" : "no")); diff --git a/common/http_worker.cpp b/common/http_worker.cpp index 3ab184bec..a0737be80 100644 --- a/common/http_worker.cpp +++ b/common/http_worker.cpp @@ -1,14 +1,13 @@ #include "http_worker.h" -#include -#include -#include - -#include #include -#include -#include +#include #include +#include +#include +#include +#include +#include #define PREVIOUS_VERSION "6.0.0" diff --git a/common/opengl_checker.cpp b/common/opengl_checker.cpp deleted file mode 100644 index 5779657d1..000000000 --- a/common/opengl_checker.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "opengl_checker.h" - -#include "QsLog.h" - -OpenGLChecker::OpenGLChecker() - : compatibleOpenGLVersion(true) -{ - QOpenGLContext *openGLContext = new QOpenGLContext(); - openGLContext->create(); - - if (!openGLContext->isValid()) { - compatibleOpenGLVersion = false; - description = "unable to create QOpenGLContext"; - } - - QSurfaceFormat format = openGLContext->format(); - - int majorVersion = format.majorVersion(); - int minorVersion = format.minorVersion(); - QString type; - - switch (format.renderableType()) { - case QSurfaceFormat::OpenGL: - type = "desktop"; - break; - - case QSurfaceFormat::OpenGLES: - type = "OpenGL ES"; - break; - - case QSurfaceFormat::OpenVG: - type = "OpenVG"; - break; - - default: - case QSurfaceFormat::DefaultRenderableType: - type = "unknown"; - break; - } - - delete openGLContext; - - description = QString("%1.%2 %3").arg(majorVersion).arg(minorVersion).arg(type); - - if (format.renderableType() != QSurfaceFormat::OpenGL) // Desktop OpenGL - compatibleOpenGLVersion = false; - -#ifdef Q_OS_WIN // TODO check Qt version, and set this values depending on the use of QOpenGLWidget or QGLWidget - static const int majorTargetVersion = 1; - static const int minorTargetVersion = 4; -#else - static const int majorTargetVersion = 2; - static const int minorTargetVersion = 0; -#endif - - if (majorVersion < majorTargetVersion) - compatibleOpenGLVersion = false; - if (majorVersion == majorTargetVersion && minorVersion < minorTargetVersion) - compatibleOpenGLVersion = false; -} - -QString OpenGLChecker::textVersionDescription() -{ - return description; -} - -bool OpenGLChecker::hasCompatibleOpenGLVersion() -{ - return compatibleOpenGLVersion; -} diff --git a/common/opengl_checker.h b/common/opengl_checker.h deleted file mode 100644 index 0258ce795..000000000 --- a/common/opengl_checker.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef OPENGL_CHECKER_H -#define OPENGL_CHECKER_H - -#include - -class OpenGLChecker -{ -public: - OpenGLChecker(); - bool hasCompatibleOpenGLVersion(); - QString textVersionDescription(); - -private: - QString description; - bool compatibleOpenGLVersion; -}; - -#endif // OPENGL_CHECKER_H diff --git a/common/pdf_comic.cpp b/common/pdf_comic.cpp index 9cdcd41c9..6c309b1c3 100644 --- a/common/pdf_comic.cpp +++ b/common/pdf_comic.cpp @@ -1,6 +1,7 @@ -#include "comic.h" #include "pdf_comic.h" +#include "comic.h" + #if defined USE_PDFIUM && !defined NO_PDF int pdfRead(void *param, diff --git a/common/pdf_comic.h b/common/pdf_comic.h index 1eadd705f..950602701 100644 --- a/common/pdf_comic.h +++ b/common/pdf_comic.h @@ -1,10 +1,10 @@ #if !defined PDF_COMIC_H && !defined NO_PDF #define PDF_COMIC_H -#include -#include #include +#include #include +#include #include #if defined Q_OS_MACOS && defined USE_PDFKIT @@ -46,10 +46,6 @@ class PdfiumComic QFile pdfFile; }; #else -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include -#else -#include "poppler-qt5.h" -#endif // QT_VERSION #endif // Q_OS_MACOS #endif // PDF_COMIC_H diff --git a/common/pdf_comic.mm b/common/pdf_comic.mm index 9f671cb34..b878707e2 100644 --- a/common/pdf_comic.mm +++ b/common/pdf_comic.mm @@ -1,16 +1,14 @@ #include "pdf_comic.h" -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #undef __OBJC_BOOL_IS_BOOL -#endif - -#import -#import -#import #include "QsLog.h" #include "QsLogDest.h" +#import +#import +#import + MacOSXPDFComic::MacOSXPDFComic() { } diff --git a/common/pictureflow.cpp b/common/pictureflow.cpp deleted file mode 100644 index 323db42ff..000000000 --- a/common/pictureflow.cpp +++ /dev/null @@ -1,1410 +0,0 @@ -/* - PictureFlow - animated image show widget - http://pictureflow.googlecode.com - - Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) - Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#include "pictureflow.h" - -#include - -// detect Qt version -#if QT_VERSION >= 0x040000 -#define PICTUREFLOW_QT4 -#elif QT_VERSION >= 0x030000 -#define PICTUREFLOW_QT3 -#elif QT_VERSION >= 235 -#define PICTUREFLOW_QT2 -#else -#error PictureFlow widgets need Qt 2, Qt 3 or Qt 4 -#endif - -#ifdef PICTUREFLOW_QT4 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#ifdef PICTUREFLOW_QT3 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define qMax(x, y) ((x) > (y)) ? (x) : (y) -#define qMin(x, y) ((x) < (y)) ? (x) : (y) - -#define QVector QValueVector - -#define toImage convertToImage -#define contains find -#define modifiers state -#define ControlModifier ControlButton -#endif - -#ifdef PICTUREFLOW_QT2 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define qMax(x, y) ((x) > (y)) ? (x) : (y) -#define qMin(x, y) ((x) < (y)) ? (x) : (y) - -#define QVector QArray - -#define toImage convertToImage -#define contains find -#define modifiers state -#define ControlModifier ControlButton -#define flush flushX -#endif - -// for fixed-point arithmetic, we need minimum 32-bit long -// long long (64-bit) might be useful for multiplication and division -typedef long PFreal; -#define PFREAL_SHIFT 10 -#define PFREAL_ONE (1 << PFREAL_SHIFT) - -#define IANGLE_MAX 1024 -#define IANGLE_MASK 1023 - -inline PFreal fmul(PFreal a, PFreal b) -{ - return ((long long)(a)) * ((long long)(b)) >> PFREAL_SHIFT; -} - -inline PFreal fdiv(PFreal num, PFreal den) -{ - long long p = (long long)(num) << (PFREAL_SHIFT * 2); - long long q = p / (long long)den; - long long r = q >> PFREAL_SHIFT; - - return r; -} - -inline PFreal fsin(int iangle) -{ - // warning: regenerate the table if IANGLE_MAX and PFREAL_SHIFT are changed! - static const PFreal tab[] = { - 3, 103, 202, 300, 394, 485, 571, 652, - 726, 793, 853, 904, 947, 980, 1004, 1019, - 1023, 1018, 1003, 978, 944, 901, 849, 789, - 721, 647, 566, 479, 388, 294, 196, 97, - -4, -104, -203, -301, -395, -486, -572, -653, - -727, -794, -854, -905, -948, -981, -1005, -1020, - -1024, -1019, -1004, -979, -945, -902, -850, -790, - -722, -648, -567, -480, -389, -295, -197, -98, - 3 - }; - - while (iangle < 0) - iangle += IANGLE_MAX; - iangle &= IANGLE_MASK; - - int i = (iangle >> 4); - PFreal p = tab[i]; - PFreal q = tab[(i + 1)]; - PFreal g = (q - p); - return p + g * (iangle - i * 16) / 16; -} - -inline PFreal fcos(int iangle) -{ - return fsin(iangle + (IANGLE_MAX >> 2)); -} - -/* ---------------------------------------------------------- - -PictureFlowState stores the state of all slides, i.e. all the necessary -information to be able to render them. - -PictureFlowAnimator is responsible to move the slides during the -transition between slides, to achieve the effect similar to Cover Flow, -by changing the state. - -PictureFlowSoftwareRenderer (or PictureFlowOpenGLRenderer) is -the actual 3-d renderer. It should render all slides given the state -(an instance of PictureFlowState). - -Instances of all the above three classes are stored in -PictureFlowPrivate. - -------------------------------------------------------- */ - -struct SlideInfo { - int slideIndex; - int angle; - PFreal cx; - PFreal cy; - int blend; -}; - -class PictureFlowState -{ -public: - PictureFlowState(int angle = 50, float spacingRatio = 0); - ~PictureFlowState(); - - void reposition(); - void reset(); - - QRgb backgroundColor; - int slideWidth; - int slideHeight; - PictureFlow::ReflectionEffect reflectionEffect; - QVector slideImages; - - QVector marks; - bool showMarks; - QImage mark; - - int angle; - int rawAngle; - int spacing; - float spacingRatio; - PFreal offsetX; - PFreal offsetY; - - SlideInfo centerSlide; - QVector leftSlides; - QVector rightSlides; - int centerIndex; - - bool flowRightToLeft; -}; - -class PictureFlowAnimator -{ -public: - PictureFlowAnimator(); - PictureFlowState *state; - - void start(int slide); - void stop(int slide); - void update(); - - int target; - int step; - int frame; - QTimer animateTimer; - bool animating; -}; - -class PictureFlowAbstractRenderer -{ -public: - PictureFlowAbstractRenderer() - : state(0), dirty(false), widget(0) { } - virtual ~PictureFlowAbstractRenderer() { } - - PictureFlowState *state; - bool dirty; - QWidget *widget; - - virtual void init() = 0; - virtual void paint() = 0; -}; - -class PictureFlowSoftwareRenderer : public PictureFlowAbstractRenderer -{ -public: - PictureFlowSoftwareRenderer(); - ~PictureFlowSoftwareRenderer(); - - virtual void init(); - virtual void paint(); - void render(); - -private: - QSize size; - QRgb bgcolor; - int effect; - QImage buffer; - QVector rays; - QImage *blankSurface; -#ifdef PICTUREFLOW_QT4 - QCache surfaceCache; - QHash imageHash; -#endif -#ifdef PICTUREFLOW_QT3 - QCache surfaceCache; - QMap imageHash; -#endif -#ifdef PICTUREFLOW_QT2 - QCache surfaceCache; - QIntDict imageHash; -#endif - - void renderSlides(); - QRect renderSlide(const SlideInfo &slide, int col1 = -1, int col2 = -1); - QImage *surface(int slideIndex); -}; - -// ------------- PictureFlowState --------------------------------------- - -PictureFlowState::PictureFlowState(int a, float sr) - : backgroundColor(0), slideWidth(150), slideHeight(200), reflectionEffect(PictureFlow::BlurredReflection), rawAngle(a), spacingRatio(sr), centerIndex(0), flowRightToLeft(false) -{ -} - -PictureFlowState::~PictureFlowState() -{ - for (int i = 0; i < (int)slideImages.count(); i++) - delete slideImages[i]; -} - -// readjust the settings, call this when slide dimension is changed -void PictureFlowState::reposition() -{ - // angle = 70 * IANGLE_MAX / 360; // approx. 70 degrees tilted - angle = rawAngle * IANGLE_MAX / 360; - offsetX = slideWidth / 2 * (PFREAL_ONE - fcos(angle)); - offsetY = slideWidth / 2 * fsin(angle); - offsetX += slideWidth * PFREAL_ONE; - offsetY += slideWidth * PFREAL_ONE / 3; - if (rawAngle < 45) - offsetX += offsetX / 4; - if (angle > 0) - spacing = slideWidth * 0.35; - else - spacing = slideWidth * spacingRatio + slideWidth * (spacingRatio ? 0.10 : 0.2); -} - -// adjust slides so that they are in "steady state" position -void PictureFlowState::reset() -{ - centerSlide.angle = 0; - centerSlide.cx = 0; - centerSlide.cy = 0; - centerSlide.slideIndex = centerIndex; - centerSlide.blend = 256; - - if (angle == 0 && spacingRatio) - leftSlides.resize(4); - else - leftSlides.resize(6); - for (int i = 0; i < (int)leftSlides.count(); i++) { - SlideInfo &si = leftSlides[i]; - si.angle = angle; - si.cx = -(offsetX + spacing * (i)*PFREAL_ONE); - si.cy = offsetY; - if (!flowRightToLeft) - si.slideIndex = centerIndex - 1 - i; - else - si.slideIndex = centerIndex + 1 + i; - si.blend = 200; - if (i == (int)leftSlides.count() - 2) - si.blend = 128; - if (i == (int)leftSlides.count() - 1) - si.blend = 0; - } - if (angle == 0 && spacingRatio) - rightSlides.resize(4); - else - rightSlides.resize(6); - for (int i = 0; i < (int)rightSlides.count(); i++) { - SlideInfo &si = rightSlides[i]; - si.angle = -angle; - si.cx = offsetX + spacing * (i)*PFREAL_ONE; - si.cy = offsetY; - if (!flowRightToLeft) - si.slideIndex = centerIndex + 1 + i; - else - si.slideIndex = centerIndex - 1 - i; - si.blend = 200; - if (i == (int)rightSlides.count() - 2) - si.blend = 128; - if (i == (int)rightSlides.count() - 1) - si.blend = 0; - } -} - -// ------------- PictureFlowAnimator --------------------------------------- - -PictureFlowAnimator::PictureFlowAnimator() - : state(0), target(0), step(0), frame(0), animating(false) -{ -} - -void PictureFlowAnimator::start(int slide) -{ - target = slide; - if (!animateTimer.isActive() && state) { - step = (target < state->centerSlide.slideIndex) ? -1 : 1; - animateTimer.setSingleShot(true); - animateTimer.start(30); // TODO comprobar rendimiento, originalmente era 30 - animating = true; - } -} - -void PictureFlowAnimator::stop(int slide) -{ - step = 0; - target = slide; - frame = slide << 16; - animateTimer.stop(); - animating = false; -} - -void PictureFlowAnimator::update() -{ - /*if(!animateTimer.isActive()) - return;*/ - if (step == 0) - return; - if (!state) - return; - - int speed = 16384 / 4; // TODO comprobar rendimiento, originalmente era /4 - -#if 1 - // deaccelerate when approaching the target - const int max = 2 * 65536; // TODO cambiado de 2 * a 4 * comprobar rendimiento - - int fi = frame; - fi -= (target << 16); - if (fi < 0) - fi = -fi; - fi = qMin(fi, max); - - int ia = IANGLE_MAX * (fi - max / 2) / (max * 2); - speed = 512 + 16384 * (PFREAL_ONE + fsin(ia)) / PFREAL_ONE; -#endif - - frame += speed * step; - - int index = frame >> 16; - int pos = frame & 0xffff; - int neg = 65536 - pos; - int tick = (step < 0) ? neg : pos; - PFreal ftick = (tick * PFREAL_ONE) >> 16; - - if (step < 0) - index++; - - if (state->centerIndex != index) { - state->centerIndex = index; - frame = index << 16; - state->centerSlide.slideIndex = state->centerIndex; - for (int i = 0; i < (int)state->leftSlides.count(); i++) { - if (!state->flowRightToLeft) - state->leftSlides[i].slideIndex = state->centerIndex - 1 - i; - else - state->leftSlides[i].slideIndex = state->centerIndex + 1 + i; - } - for (int i = 0; i < (int)state->rightSlides.count(); i++) { - if (!state->flowRightToLeft) - state->rightSlides[i].slideIndex = state->centerIndex + 1 + i; - else - state->rightSlides[i].slideIndex = state->centerIndex - 1 - i; - } - } - - if (!state->flowRightToLeft) { - state->centerSlide.angle = (step * tick * state->angle) >> 16; - state->centerSlide.cx = -step * fmul(state->offsetX, ftick); - } else { - state->centerSlide.angle = (-step * tick * state->angle) >> 16; - state->centerSlide.cx = step * fmul(state->offsetX, ftick); - } - state->centerSlide.cy = fmul(state->offsetY, ftick); - - if (state->centerIndex == target) { - stop(target); - state->reset(); - return; - } - - for (int i = 0; i < (int)state->leftSlides.count(); i++) { - SlideInfo &si = state->leftSlides[i]; - si.angle = state->angle; - if (!state->flowRightToLeft) - si.cx = -(state->offsetX + state->spacing * (i)*PFREAL_ONE + step * state->spacing * ftick); - else - si.cx = -(state->offsetX + state->spacing * (i)*PFREAL_ONE - step * state->spacing * ftick); - si.cy = state->offsetY; - } - - for (int i = 0; i < (int)state->rightSlides.count(); i++) { - SlideInfo &si = state->rightSlides[i]; - si.angle = -state->angle; - if (!state->flowRightToLeft) - si.cx = state->offsetX + state->spacing * (i)*PFREAL_ONE - step * state->spacing * ftick; - else - si.cx = state->offsetX + state->spacing * (i)*PFREAL_ONE + step * state->spacing * ftick; - si.cy = state->offsetY; - } - - if (step > 0 && !state->flowRightToLeft) { - PFreal ftick = (neg * PFREAL_ONE) >> 16; - state->rightSlides[0].angle = -(neg * state->angle) >> 16; - state->rightSlides[0].cx = fmul(state->offsetX, ftick); - state->rightSlides[0].cy = fmul(state->offsetY, ftick); - } else if (!state->flowRightToLeft) { - PFreal ftick = (pos * PFREAL_ONE) >> 16; - state->leftSlides[0].angle = (pos * state->angle) >> 16; - state->leftSlides[0].cx = -fmul(state->offsetX, ftick); - state->leftSlides[0].cy = fmul(state->offsetY, ftick); - } else if (step < 0) { - PFreal ftick = (pos * PFREAL_ONE) >> 16; - state->rightSlides[0].angle = -(pos * state->angle) >> 16; - state->rightSlides[0].cx = fmul(state->offsetX, ftick); - state->rightSlides[0].cy = fmul(state->offsetY, ftick); - } else { - PFreal ftick = (neg * PFREAL_ONE) >> 16; - state->leftSlides[0].angle = (neg * state->angle) >> 16; - state->leftSlides[0].cx = -fmul(state->offsetX, ftick); - state->leftSlides[0].cy = fmul(state->offsetY, ftick); - } - - // must change direction ? - if (target < index) - if (step > 0) - step = -1; - if (target > index) - if (step < 0) - step = 1; - - // the first and last slide must fade in/fade out - int nleft = state->leftSlides.count(); - int nright = state->rightSlides.count(); - int fade = pos / 256; - - for (int index = 0; index < nleft; index++) { - int blend = 200; - if (index == nleft - 1) - blend = (step > 0) ? 0 : 128 - fade / 2; - if (index == nleft - 2) - blend = (step > 0) ? 128 - fade / 2 : 200 - (0.5625 * fade / 2); - if (index == nleft - 3) - blend = (step > 0) ? 200 - (0.5625 * fade / 2) : 200; - if (index == 0) - blend = (step > 0) ? 200 : 200 + 56 - (0.4375 * fade / 2); - state->leftSlides[index].blend = blend; - } - for (int index = 0; index < nright; index++) { - int blend = (index < nright - 2) ? 200 : 128; - if (index == nright - 1) - blend = (step > 0) ? fade / 2 : 0; - if (index == nright - 2) - blend = (step > 0) ? 128 + (0.5625 * fade / 2) : (0.5625 * fade / 2); - if (index == nright - 3) - blend = (step > 0) ? 200 : 128 + (0.5625 * fade / 2); - if (index == 0) - blend = (step > 0) ? 200 + (0.4375 * fade / 2) : 200; - state->rightSlides[index].blend = blend; - } - - state->centerSlide.blend = (step > 0) ? 256 - (0.4375 * fade / 2) : 200 + (0.4375 * fade / 2); -} - -// ------------- PictureFlowSoftwareRenderer --------------------------------------- - -PictureFlowSoftwareRenderer::PictureFlowSoftwareRenderer() - : PictureFlowAbstractRenderer(), size(0, 0), bgcolor(0), effect(-1), blankSurface(0) -{ -#ifdef PICTUREFLOW_QT3 - surfaceCache.setAutoDelete(true); -#endif -} - -PictureFlowSoftwareRenderer::~PictureFlowSoftwareRenderer() -{ - surfaceCache.clear(); - buffer = QImage(); - delete blankSurface; -} - -void PictureFlowSoftwareRenderer::paint() -{ - if (!widget) - return; - - if (widget->size() != size) - init(); - - if (state->backgroundColor != bgcolor) { - bgcolor = state->backgroundColor; - surfaceCache.clear(); - } - - if ((int)(state->reflectionEffect) != effect) { - effect = (int)state->reflectionEffect; - surfaceCache.clear(); - } - - if (dirty) - render(); - - QPainter painter(widget); - painter.drawImage(QPoint(0, 0), buffer); -} - -void PictureFlowSoftwareRenderer::init() -{ - if (!widget) - return; - - surfaceCache.clear(); - blankSurface = 0; - - size = widget->size(); - int ww = size.width(); - int wh = size.height(); - int w = (ww + 1) / 2; - int h = (wh + 1) / 2; - if (h < 10) // TODO a partir de qué h es seguro?? - return; - -#ifdef PICTUREFLOW_QT4 - buffer = QImage(ww, wh, QImage::Format_RGB32); -#endif -#if defined(PICTUREFLOW_QT3) || defined(PICTUREFLOW_QT2) - buffer.create(ww, wh, 32); -#endif - buffer.fill(bgcolor); - - rays.resize(w * 2); - for (int i = 0; i < w; i++) { - PFreal gg = ((PFREAL_ONE >> 1) + i * PFREAL_ONE) / (2 * h); - rays[w - i - 1] = -gg; - rays[w + i] = gg; - } - - dirty = true; -} - -// TODO: optimize this with lookup tables -static QRgb blendColor(QRgb c1, QRgb c2, int blend) -{ - int r = qRed(c1) * blend / 256 + qRed(c2) * (256 - blend) / 256; - int g = qGreen(c1) * blend / 256 + qGreen(c2) * (256 - blend) / 256; - int b = qBlue(c1) * blend / 256 + qBlue(c2) * (256 - blend) / 256; - return qRgb(r, g, b); -} - -static QImage *prepareSurface(const QImage *slideImage, int w, int h, QRgb bgcolor, - PictureFlow::ReflectionEffect reflectionEffect) -{ - - int iw, ih; - iw = slideImage->width(); - ih = slideImage->height(); - int psw, psh; - if (iw > ih) { - psw = w; - psh = w * (1.0 * ih / iw); - } else { - int h1 = h; - psw = h1 * (1.0 * iw / ih); - psh = h1; - - while (psw > w) { - h1 -= 2; - psw = h1 * (1.0 * iw / ih); - psh = h1; - } - } - w = psw; - -#ifdef PICTUREFLOW_QT4 - Qt::TransformationMode mode = Qt::SmoothTransformation; - QImage img = slideImage->scaled(psw, psh, Qt::IgnoreAspectRatio, mode); -#endif -#if defined(PICTUREFLOW_QT3) || defined(PICTUREFLOW_QT2) - QImage img = slideImage->smoothScale(w, h); -#endif - - // slightly larger, to accomodate for the reflection - int hs = h * 2; - int hofs = h / 3; - - // offscreen buffer: black is sweet -#ifdef PICTUREFLOW_QT4 - QImage *result = new QImage(hs, w, QImage::Format_RGB32); -#endif -#if defined(PICTUREFLOW_QT3) || defined(PICTUREFLOW_QT2) - QImage *result = new QImage; - result->create(hs, w, 32); -#endif - result->fill(bgcolor); - - // transpose the image, this is to speed-up the rendering - // because we process one column at a time - // (and much better and faster to work row-wise, i.e in one scanline) - int lhof = (h - psh); - // int lwof = (w-psw)/2; - for (int x = 0; x < psw; x++) - for (int y = 0; y < psh; y++) - - result->setPixel(hofs + y + lhof, x, img.pixel(x, y)); - - if (reflectionEffect != PictureFlow::NoReflection) { - // create the reflection - int ht = hs - (h + hofs); - int hte = ht; - for (int x = 0; x < psw; x++) - for (int y = 0; y < ht; y++) { - QRgb color; - if (y < psh) - color = img.pixel(x, psh - y - 1); - else - color = bgcolor; - result->setPixel(h + hofs + y, x, blendColor(color, bgcolor, 80 * (hte - y) / hte)); - } - } - - return result; -} - -QImage *PictureFlowSoftwareRenderer::surface(int slideIndex) -{ - if (!state) - return 0; - if (slideIndex < 0) - return 0; - if (slideIndex >= (int)state->slideImages.count()) - return 0; - -#ifdef PICTUREFLOW_QT4 - int key = slideIndex; -#endif -#if defined(PICTUREFLOW_QT3) || defined(PICTUREFLOW_QT2) - QString key = QString::number(slideIndex); -#endif - - QImage *img = state->slideImages.at(slideIndex); - - bool empty = img ? img->isNull() : true; - if (empty) { - surfaceCache.remove(key); - imageHash.remove(slideIndex); - if (!blankSurface) { - int sw = state->slideWidth; - int sh = state->slideHeight; - -#ifdef PICTUREFLOW_QT4 - QImage img = QImage(sw, sh, QImage::Format_RGB32); - - QPainter painter(&img); - QPoint p1(sw * 4 / 10, 0); - QPoint p2(sw * 6 / 10, sh); - QLinearGradient linearGrad(p1, p2); - linearGrad.setColorAt(0, Qt::black); - linearGrad.setColorAt(1, Qt::white); - painter.setBrush(linearGrad); - painter.fillRect(0, 0, sw, sh, QBrush(linearGrad)); - - painter.end(); -#endif -#if defined(PICTUREFLOW_QT3) || defined(PICTUREFLOW_QT2) - QPixmap pixmap(sw, sh, 32); - QPainter painter(&pixmap); - painter.fillRect(pixmap.rect(), QColor(192, 192, 192)); - painter.fillRect(5, 5, sw - 10, sh - 10, QColor(64, 64, 64)); - painter.end(); - QImage img = pixmap.convertToImage(); -#endif - - blankSurface = prepareSurface(&img, sw, sh, bgcolor, state->reflectionEffect); - } - return blankSurface; - } - -#ifdef PICTUREFLOW_QT4 - bool exist = imageHash.contains(slideIndex); - if (exist) - if (img == imageHash.find(slideIndex).value()) -#endif -#ifdef PICTUREFLOW_QT3 - bool exist = imageHash.find(slideIndex) != imageHash.end(); - if (exist) - if (img == imageHash.find(slideIndex).data()) -#endif -#ifdef PICTUREFLOW_QT2 - if (img == imageHash[slideIndex]) -#endif - if (surfaceCache.contains(key)) - return surfaceCache[key]; - - QImage *sr = prepareSurface(img, state->slideWidth, state->slideHeight, bgcolor, state->reflectionEffect); - // check if this slide must be marked - // if(marks[slideIndex]) - if (state->showMarks) { - if (state->marks[slideIndex]) { - QPainter painter(sr); - painter.setPen(QColor(255, 0, 0).rgb()); - int sh = sr->height(); - int jInit = sh * 4 / 5; - int iInit = state->slideHeight + state->slideHeight / 3; - /*for(int j = jInit; j < sh; j ++) - { - for(int i = iInit-(j-jInit); i < iInit; i ++) - { - - painter.drawPoint(i,j); - } - }*/ - painter.drawImage(QRect(iInit - (sh - jInit), jInit, sh - jInit, sh - jInit), state->mark); - } - } - surfaceCache.insert(key, sr); - imageHash.insert(slideIndex, img); - - return sr; -} - -// Renders a slide to offscreen buffer. Returns a rect of the rendered area. -// col1 and col2 limit the column for rendering. -QRect PictureFlowSoftwareRenderer::renderSlide(const SlideInfo &slide, int col1, int col2) -{ - int blend = slide.blend; - if (!blend) - return QRect(); - - QImage *src = surface(slide.slideIndex); - if (!src) - return QRect(); - - QRect rect(0, 0, 0, 0); - - int sw = src->height(); - int sh = src->width(); - int h = buffer.height(); - int w = buffer.width(); - - if (col1 > col2) { - int c = col2; - col2 = col1; - col1 = c; - } - - col1 = (col1 >= 0) ? col1 : 0; - col2 = (col2 >= 0) ? col2 : w - 1; - col1 = qMin(col1, w - 1); - col2 = qMin(col2, w - 1); - - int zoom = 100; - int distance = h * 100 / zoom; - PFreal sdx = fcos(slide.angle); - PFreal sdy = fsin(slide.angle); - PFreal xs = slide.cx - state->slideWidth * sdx / 2; - PFreal ys = slide.cy - state->slideWidth * sdy / 2; - PFreal dist = distance * PFREAL_ONE; - - int xi = qMax((PFreal)0, ((w * PFREAL_ONE / 2) + fdiv(xs * h, dist + ys)) >> PFREAL_SHIFT); - if (xi >= w) - return rect; - - bool flag = false; - rect.setLeft(xi); - for (int x = qMax(xi, col1); x <= col2; x++) { - PFreal hity = 0; - PFreal fk = rays[x]; - if (sdy) { - fk = fk - fdiv(sdx, sdy); - hity = -fdiv((rays[x] * distance - slide.cx + slide.cy * sdx / sdy), fk); - } - - dist = distance * PFREAL_ONE + hity; - if (dist < 0) - continue; - - PFreal hitx = fmul(dist, rays[x]); - PFreal hitdist = fdiv(hitx - slide.cx, sdx); - - int column = sw / 2 + (hitdist >> PFREAL_SHIFT); - if (column >= sw) - break; - if (column < 0) - continue; - - rect.setRight(x); - if (!flag) - rect.setLeft(x); - flag = true; - - int y1 = h / 2; - int y2 = y1 + 1; - QRgb *pixel1 = (QRgb *)(buffer.scanLine(y1)) + x; - QRgb *pixel2 = (QRgb *)(buffer.scanLine(y2)) + x; - QRgb pixelstep = pixel2 - pixel1; - - int center = (sh / 2); - int dy = dist / h; - int p1 = center * PFREAL_ONE - dy / 2; - int p2 = center * PFREAL_ONE + dy / 2; - - const QRgb *ptr = (const QRgb *)(src->scanLine(column)); - if (blend == 256) - while ((y1 >= 0) && (y2 < h) && (p1 >= 0)) { - *pixel1 = ptr[p1 >> PFREAL_SHIFT]; - *pixel2 = ptr[p2 >> PFREAL_SHIFT]; - p1 -= dy; - p2 += dy; - y1--; - y2++; - pixel1 -= pixelstep; - pixel2 += pixelstep; - } - else - while ((y1 >= 0) && (y2 < h) && (p1 >= 0)) { - QRgb c1 = ptr[p1 >> PFREAL_SHIFT]; - QRgb c2 = ptr[p2 >> PFREAL_SHIFT]; - *pixel1 = blendColor(c1, bgcolor, blend); - *pixel2 = blendColor(c2, bgcolor, blend); - p1 -= dy; - p2 += dy; - y1--; - y2++; - pixel1 -= pixelstep; - pixel2 += pixelstep; - } - } - - rect.setTop(0); - rect.setBottom(h - 1); - return rect; -} - -void PictureFlowSoftwareRenderer::renderSlides() -{ - int nleft = state->leftSlides.count(); - int nright = state->rightSlides.count(); - - QRect r = renderSlide(state->centerSlide); - int c1 = r.left(); - int c2 = r.right(); - - for (int index = 0; index < nleft; index++) { - QRect rs = renderSlide(state->leftSlides[index], 0, c1 - 1); - if (!rs.isEmpty()) - c1 = rs.left(); - } - for (int index = 0; index < nright; index++) { - QRect rs = renderSlide(state->rightSlides[index], c2 + 1, buffer.width()); - if (!rs.isEmpty()) - c2 = rs.right(); - } -} - -// Render the slides. Updates only the offscreen buffer. -void PictureFlowSoftwareRenderer::render() -{ - buffer.fill(state->backgroundColor); - renderSlides(); - if (state->slideImages.size() > 0) { - int size = buffer.width() * 0.015; - int start = buffer.width() * 0.010; - - QPainter painter(&buffer); - painter.setPen(QColor(255, 255, 255).rgb() - state->backgroundColor); - painter.setFont(QFont("Arial", start + size * 0.5)); - painter.drawText(start, start + size, QString().setNum(state->centerIndex + 1) + "/" + QString().setNum(state->slideImages.size())); - } - dirty = false; -} - -// ----------------------------------------- - -class PictureFlowPrivate -{ -public: - PictureFlowState *state; - PictureFlowAnimator *animator; - PictureFlowAbstractRenderer *renderer; - QTimer triggerTimer; -}; - -PictureFlow::PictureFlow(QWidget *parent, FlowType flowType) - : QWidget(parent) -{ - d = new PictureFlowPrivate; - - switch (flowType) { - case CoverFlowLike: - d->state = new PictureFlowState(50, 0); - break; - case Strip: - d->state = new PictureFlowState(0, 1); - break; - case StripOverlapped: - d->state = new PictureFlowState(0, 0); - break; - default: - break; - } - - framesSkip = 0; - - d->state->reset(); - d->state->reposition(); - - d->renderer = new PictureFlowSoftwareRenderer; - d->renderer->state = d->state; - d->renderer->widget = this; - d->renderer->init(); - - d->animator = new PictureFlowAnimator; - d->animator->state = d->state; - QObject::connect(&d->animator->animateTimer, &QTimer::timeout, this, &PictureFlow::updateAnimation); - - QObject::connect(&d->triggerTimer, &QTimer::timeout, this, QOverload<>::of(&PictureFlow::render)); - -#ifdef PICTUREFLOW_QT4 - setAttribute(Qt::WA_StaticContents, true); - setAttribute(Qt::WA_OpaquePaintEvent, true); - setAttribute(Qt::WA_NoSystemBackground, true); -#endif -#ifdef PICTUREFLOW_QT3 - setWFlags(getWFlags() | Qt::WStaticContents); - setWFlags(getWFlags() | Qt::WNoAutoErase); -#endif -#ifdef PICTUREFLOW_QT2 - setWFlags(getWFlags() | Qt::WPaintClever); - setWFlags(getWFlags() | Qt::WRepaintNoErase); - setWFlags(getWFlags() | Qt::WResizeNoErase); -#endif -} - -PictureFlow::~PictureFlow() -{ - delete d->renderer; - delete d->animator; - delete d->state; - delete d; -} - -int PictureFlow::slideCount() const -{ - return d->state->slideImages.count(); -} - -QColor PictureFlow::backgroundColor() const -{ - return QColor(d->state->backgroundColor); -} - -void PictureFlow::setBackgroundColor(const QColor &c) -{ - d->state->backgroundColor = c.rgb(); - triggerRender(); -} - -QSize PictureFlow::slideSize() const -{ - return QSize(d->state->slideWidth, d->state->slideHeight); -} - -void PictureFlow::setSlideSize(QSize size) -{ - d->state->slideWidth = size.width(); - d->state->slideHeight = size.height(); - d->state->reposition(); - triggerRender(); -} - -PictureFlow::ReflectionEffect PictureFlow::reflectionEffect() const -{ - return d->state->reflectionEffect; -} - -void PictureFlow::setReflectionEffect(ReflectionEffect effect) -{ - d->state->reflectionEffect = effect; - triggerRender(); -} - -void PictureFlow::setFlowRightToLeft(bool b) -{ - d->state->flowRightToLeft = b; - d->state->reset(); - triggerRender(); -} - -QImage PictureFlow::slide(int index) const -{ - QImage *i = 0; - if ((index >= 0) && (index < slideCount())) - i = d->state->slideImages[index]; - return i ? QImage(*i) : QImage(); -} - -void PictureFlow::addSlide(const QImage &image) -{ - int c = d->state->slideImages.count(); - d->state->slideImages.resize(c + 1); - d->state->slideImages[c] = new QImage(image); - d->state->marks.resize(c + 1); - d->state->marks[c] = YACReader::Unread; - triggerRender(); -} - -void PictureFlow::addSlide(const QPixmap &pixmap) -{ - addSlide(pixmap.toImage()); -} - -void PictureFlow::insertSlide(int index) -{ - d->state->slideImages.insert(index, new QImage()); - d->state->marks.insert(index, YACReader::Unread); - triggerRender(); -} - -void PictureFlow::removeSlide(int index) -{ - int c = d->state->slideImages.count(); - if (index >= 0 && index < c) { - d->state->slideImages.remove(index); - d->state->marks.remove(index); - setCenterIndex(index); - } -} - -void PictureFlow::setSlide(int index, const QImage &image) -{ - if ((index >= 0) && (index < slideCount())) { - QImage *i = image.isNull() ? 0 : new QImage(image); - delete d->state->slideImages[index]; - d->state->slideImages[index] = i; - triggerRender(); - } -} - -void PictureFlow::setSlide(int index, const QPixmap &pixmap) -{ - setSlide(index, pixmap.toImage()); -} - -int PictureFlow::centerIndex() const -{ - return d->state->centerIndex; -} - -void PictureFlow::setCenterIndex(int index) -{ - index = qMin(index, slideCount() - 1); - index = qMax(index, 0); - d->state->centerIndex = index; - d->state->reset(); - d->animator->stop(index); - triggerRender(); -} - -void PictureFlow::clear() -{ - int c = d->state->slideImages.count(); - for (int i = 0; i < c; i++) - delete d->state->slideImages[i]; - d->state->slideImages.resize(0); - - d->state->marks.resize(0); - - d->state->reset(); - triggerRender(); -} - -void PictureFlow::render() -{ - d->renderer->dirty = true; - update(); -} - -void PictureFlow::triggerRender() -{ -#ifdef PICTUREFLOW_QT4 - d->triggerTimer.setSingleShot(true); - d->triggerTimer.start(0); -#endif -#if defined(PICTUREFLOW_QT3) || defined(PICTUREFLOW_QT2) - d->triggerTimer.start(0, true); -#endif -} - -void PictureFlow::showPrevious() -{ - int step = d->animator->step; - int center = d->state->centerIndex; - - if (step > 0) { - d->animator->start(center); - emit centerIndexChanged(center); - } - - if (step == 0) - if (center > 0) { - d->animator->start(center - 1); - emit centerIndexChanged(center - 1); - } - - if (step < 0) { - d->animator->target = qMax(0, center - 2); - emit centerIndexChanged(qMax(0, center - 2)); - } -} - -void PictureFlow::showNext() -{ - int step = d->animator->step; - int center = d->state->centerIndex; - - if (step < 0) { - d->animator->start(center); - emit centerIndexChanged(center); - } - - if (step == 0) - if (center < slideCount() - 1) { - d->animator->start(center + 1); - emit centerIndexChanged(center + 1); - } - - if (step > 0) { - d->animator->target = qMin(center + 2, slideCount() - 1); - emit centerIndexChanged(qMin(center + 2, slideCount() - 1)); - } -} - -void PictureFlow::showSlide(unsigned int index) -{ - index = qMax(index, 0); - index = qMin(slideCount() - 1, index); - if ((int)index == d->state->centerSlide.slideIndex) { - return; - } - - int distance = centerIndex() - index; - - if (abs(distance) > 10) { - if (distance < 0) - setCenterIndex(centerIndex() + (-distance) - 10); - else - setCenterIndex(centerIndex() - distance + 10); - } - - d->state->centerIndex = index; - d->animator->start(index); -} - -void PictureFlow::keyPressEvent(QKeyEvent *event) -{ - if ((event->key() == Qt::Key_Left && !(d->state->flowRightToLeft)) || (event->key() == Qt::Key_Right && d->state->flowRightToLeft)) { - /*if(event->modifiers() == Qt::ControlModifier) - showSlide(centerIndex()-10); - else*/ - showPrevious(); - event->accept(); - return; - } - - if ((event->key() == Qt::Key_Right && !(d->state->flowRightToLeft)) || (event->key() == Qt::Key_Left && d->state->flowRightToLeft)) { - /*if(event->modifiers() == Qt::ControlModifier) - showSlide(centerIndex()+10); - else*/ - showNext(); - event->accept(); - return; - } - - if (event->key() == Qt::Key_Up) { - // TODO emit selected signal - return; - } - - event->ignore(); -} - -void PictureFlow::mousePressEvent(QMouseEvent *event) -{ - mousePressEvent(event, 0); -} - -void PictureFlow::mousePressEvent(QMouseEvent *event, int slideWidth) -{ - if ((event->x() > (width() + slideWidth) / 2 && !(d->state->flowRightToLeft)) || (event->x() < (width() - slideWidth) / 2 && d->state->flowRightToLeft)) - showNext(); - else if ((event->x() < (width() - slideWidth) / 2 && !(d->state->flowRightToLeft)) || (event->x() > (width() + slideWidth) / 2 && d->state->flowRightToLeft)) - showPrevious(); - - // else (centered slide space) -} - -void PictureFlow::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - d->renderer->paint(); -} - -void PictureFlow::resizeEvent(QResizeEvent *event) -{ - int heightWidget = event->size().height(); - int height, width; - height = heightWidget * 0.55; - width = height * 0.65; - setSlideSize(QSize(width, height)); - - render(); - d->animator->start(centerIndex()); - QWidget::resizeEvent(event); -} -#include -void PictureFlow::updateAnimation() // bucle principal -{ - QElapsedTimer timer; - timer.start(); - bool frameSkiped = false; - - int old_center = d->state->centerIndex; - d->animator->update(); - if (framesSkip == 0) - render(); // triggerRender(); - else { - framesSkip--; - frameSkiped = true; - } - - if (d->state->centerIndex != old_center) - emit centerIndexChangedSilent(d->state->centerIndex); - if (d->animator->animating == true) { - int difference = 10 - timer.elapsed(); - if (difference >= 0 && !frameSkiped) - QTimer::singleShot(difference, this, &PictureFlow::updateAnimation); - else { - QTimer::singleShot(0, this, &PictureFlow::updateAnimation); - if (!frameSkiped) - framesSkip = -((difference - 10) / 10); - } - } -} - -void PictureFlow::setFlowType(FlowType flowType) -{ - switch (flowType) { - case CoverFlowLike: - d->state->rawAngle = 50; - d->state->spacingRatio = 0, - d->state->reposition(); - break; - case Strip: - d->state->rawAngle = 0; - d->state->spacingRatio = 1; - d->state->reposition(); - break; - case StripOverlapped: - d->state->rawAngle = 0; - d->state->spacingRatio = 0; - d->state->reposition(); - break; - default: - break; - } - d->state->reset(); - d->renderer->init(); -} - -void PictureFlow::setMarkImage(const QImage &m) -{ - d->state->mark = m; -} - -void PictureFlow::markSlide(int index, YACReader::YACReaderComicReadStatus readStatus) -{ - if (index < d->state->marks.size()) - d->state->marks[index] = readStatus; -} - -void PictureFlow::updateMarks() -{ - d->renderer->init(); - repaint(); -} - -void PictureFlow::unmarkSlide(int index) -{ - if (index < d->state->marks.size()) - d->state->marks[index] = YACReader::Unread; -} - -void PictureFlow::setMarks(const QVector &m) -{ - d->state->marks = m; - updateMarks(); -} - -void PictureFlow::setShowMarks(bool enable) -{ - d->state->showMarks = enable; - updateMarks(); -} - -QVector PictureFlow::getMarks() -{ - return d->state->marks; -} - -void PictureFlow::resortCovers(QList newOrder) -{ - QVector slideImagesNew; - - QVector marksNew; - - QVector slidesInfo; - slidesInfo << d->state->leftSlides << d->state->centerSlide << d->state->rightSlides; - QVector slidesInfoNew; - - int order = 0; - foreach (int index, newOrder) { - slideImagesNew << d->state->slideImages.at(index); - marksNew << d->state->marks.at(index); - slidesInfoNew << slidesInfo.at(index); - slidesInfoNew.last().slideIndex = order++; - } - - d->state->slideImages = slideImagesNew; - d->state->marks = marksNew; - d->state->leftSlides = slidesInfoNew.mid(0, d->state->leftSlides.length()); - d->state->centerSlide = slidesInfoNew.at(d->state->centerIndex); - d->state->leftSlides = slidesInfoNew.mid(d->state->centerIndex + 1, d->state->leftSlides.length()); - - setCenterIndex(d->state->centerIndex); -} diff --git a/common/pictureflow.h b/common/pictureflow.h deleted file mode 100644 index e1d9c68d6..000000000 --- a/common/pictureflow.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - PictureFlow - animated image show widget - http://pictureflow.googlecode.com - - Copyright (C) 2008 Ariya Hidayat (ariya@kde.org) - Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#ifndef PICTUREFLOW_H -#define PICTUREFLOW_H - -#include -#include "yacreader_global_gui.h" //FlowType - -class PictureFlowPrivate; - -using namespace YACReader; - -/*! - Class PictureFlow implements an image show widget with animation effect - like Apple's CoverFlow (in iTunes and iPod). Images are arranged in form - of slides, one main slide is shown at the center with few slides on - the left and right sides of the center slide. When the next or previous - slide is brought to the front, the whole slides flow to the right or - the right with smooth animation effect; until the new slide is finally - placed at the center. - - */ -class PictureFlow : public QWidget -{ - Q_OBJECT - - Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) - Q_PROPERTY(QSize slideSize READ slideSize WRITE setSlideSize) - Q_PROPERTY(int slideCount READ slideCount) - Q_PROPERTY(int centerIndex READ centerIndex WRITE setCenterIndex) - -public: - enum ReflectionEffect { - NoReflection, - PlainReflection, - BlurredReflection - }; - - /*! - Creates a new PictureFlow widget. - */ - PictureFlow(QWidget *parent = 0, FlowType flowType = CoverFlowLike); - - /*! - Destroys the widget. - */ - ~PictureFlow(); - - /*! - Returns the background color. - */ - QColor backgroundColor() const; - - /*! - Sets the background color. By default it is black. - */ - void setBackgroundColor(const QColor &c); - - /*! - Returns the dimension of each slide (in pixels). - */ - QSize slideSize() const; - - /*! - Sets the dimension of each slide (in pixels). - */ - void setSlideSize(QSize size); - - /*! - Returns the total number of slides. - */ - int slideCount() const; - - /*! - Returns QImage of specified slide. - */ - QImage slide(int index) const; - - /*! - Returns the index of slide currently shown in the middle of the viewport. - */ - int centerIndex() const; - - /*! - Returns the effect applied to the reflection. - */ - ReflectionEffect reflectionEffect() const; - - /*! - Sets the effect applied to the reflection. The default is PlainReflection. - */ - void setReflectionEffect(ReflectionEffect effect); - - /*! - Sets the flow direction right-to-left (manga mode) - */ - void setFlowRightToLeft(bool b); - -public slots: - - /*! - Adds a new slide. - */ - void addSlide(const QImage &image); - - /*! - Adds a new slide. - */ - void addSlide(const QPixmap &pixmap); - - /*! - Insert and empty slide at index. - */ - void insertSlide(int index); - - /*! - Removes an existing slide. - */ - void removeSlide(int index); - - /*! - Sets an image for specified slide. If the slide already exists, - it will be replaced. - */ - void setSlide(int index, const QImage &image); - - /*! - Sets a pixmap for specified slide. If the slide already exists, - it will be replaced. - */ - void setSlide(int index, const QPixmap &pixmap); - - /*! - Sets slide to be shown in the middle of the viewport. No animation - effect will be produced, unlike using showSlide. - */ - void setCenterIndex(int index); - - /*! - Clears all slides. - */ - void clear(); - - /*! - Shows previous slide using animation effect. - */ - void showPrevious(); - - /*! - Shows next slide using animation effect. - */ - void showNext(); - - /*! - Go to specified slide using animation effect. - */ - void showSlide(unsigned int index); - - /*! - Rerender the widget. Normally this function will be automatically invoked - whenever necessary, e.g. during the transition animation. - */ - void render(); - - /*! - Schedules a rendering update. Unlike render(), this function does not cause - immediate rendering. - */ - void triggerRender(); - - void setFlowType(YACReader::FlowType flowType); - - void setMarkImage(const QImage &mark); - - void markSlide(int index, YACReader::YACReaderComicReadStatus readStatus = Read); - - void updateMarks(); - - void unmarkSlide(int index); - - void setMarks(const QVector &marks); - - void setShowMarks(bool enable); - - QVector getMarks(); - - void resortCovers(QList newOrder); - -signals: - void centerIndexChanged(int index); - void centerIndexChangedSilent(int index); - -public: - void paintEvent(QPaintEvent *event); - void keyPressEvent(QKeyEvent *event); - void mousePressEvent(QMouseEvent *event); - void mousePressEvent(QMouseEvent *event, int slideWidth); - void resizeEvent(QResizeEvent *event); - -private slots: - void updateAnimation(); - -private: - PictureFlowPrivate *d; - QImage mark; - int framesSkip; -}; - -#endif // PICTUREFLOW_H diff --git a/common/qnaturalsorting.h b/common/qnaturalsorting.h index 3dfc393bb..ac3f217c7 100644 --- a/common/qnaturalsorting.h +++ b/common/qnaturalsorting.h @@ -3,10 +3,11 @@ #ifndef __QNATURALSORTING_H #define __QNATURALSORTING_H -#include -#include #include "library_item.h" +#include +#include + int naturalCompare(const QString &s1, const QString &s2, Qt::CaseSensitivity caseSensitivity); bool naturalSortLessThanCS(const QString &left, const QString &right); bool naturalSortLessThanCI(const QString &left, const QString &right); diff --git a/common/rhi/README.md b/common/rhi/README.md new file mode 100644 index 000000000..f3ca057c5 --- /dev/null +++ b/common/rhi/README.md @@ -0,0 +1,272 @@ +# YACReader Flow RHI Implementation + +This directory contains the QRhiWidget-based implementation of the YACReader 3D cover flow, providing cross-platform 3D rendering support for Qt 6.7+. + +## Overview + +The RHI (Rendering Hardware Interface) implementation is a modern replacement for the OpenGL-based flow (`yacreader_flow_gl`) that: + +- ✅ Supports **multiple graphics APIs**: Vulkan, Metal, Direct3D 11/12, OpenGL +- ✅ Provides **native performance** on modern platforms (Metal on macOS, D3D on Windows) +- ✅ Maintains **100% API compatibility** with the OpenGL version +- ✅ Works seamlessly with **Qt 6.7+** while Qt5 continues using OpenGL +- ✅ Enables **future-proof** rendering infrastructure + +## Architecture + +### Class Hierarchy + +``` +QRhiWidget (Qt base class) + └── YACReaderFlow3D (Base implementation) + ├── YACReaderComicFlow3D (File path-based loading for library) + └── YACReaderPageFlow3D (Byte array-based loading for viewer) +``` + +### Files + +- **yacreader_flow_rhi.h** - Header with class definitions +- **yacreader_flow_rhi.cpp** - Implementation +- **shaders/** - GLSL 450 shader source files (compiled to .qsb at build time by `qt_add_shaders`) +- **README.md** - This file + +## Key Features + +### Graphics Pipeline + +The implementation uses: +- **Instanced rendering** for efficient batch drawing +- **Dual-pass rendering** (reflections + covers) +- **MSAA** (4x by default) for anti-aliasing +- **Depth testing** and back-face culling +- **Alpha blending** for transparency + +### Resource Management + +QRhi resources managed: +- `QRhiBuffer` for vertices, instance data, and uniforms +- `QRhiTexture` for cover images, marks, and default texture +- `QRhiSampler` for texture filtering +- `QRhiGraphicsPipeline` for render state +- `QRhiShaderResourceBindings` for uniform/texture bindings + +### Shader System + +Shaders are written in **GLSL 4.50** and compiled to `.qsb` format at build time +via `qt_add_shaders()` in CMake, supporting: +- OpenGL ES 2.0, 3.0 +- OpenGL 2.1, 3.0+ +- HLSL (Direct3D 11/12) +- Metal Shading Language (macOS/iOS) + +## Integration + +### Qt5 vs Qt6 Selection + +The build system automatically selects the appropriate implementation: + +**Qt 5.x**: Uses `YACReaderFlowGL` (OpenGL-based) +**Qt 6.0-6.6**: Uses `YACReaderFlowGL` (OpenGL-based) +**Qt 6.7+**: Uses `YACReaderFlow3D` (RHI-based) if `YACREADER_USE_RHI` is defined + +### Type Aliases + +Applications use type aliases for seamless switching: + +```cpp +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) && defined(YACREADER_USE_RHI) +using YACReaderPageFlowImpl = YACReaderPageFlow3D; +using YACReaderComicFlowImpl = YACReaderComicFlow3D; +#else +using YACReaderPageFlowImpl = YACReaderPageFlowGL; +using YACReaderComicFlowImpl = YACReaderComicFlowGL; +#endif +``` + +### Example Usage (YACReader Viewer) + +```cpp +// goto_flow_gl.cpp +flow = new YACReaderPageFlowImpl(this); +flow->setShowMarks(false); +flow->populate(numPages); +connect(flow, &YACReaderPageFlowImpl::selected, this, &GoToFlowGL::goToPage); +``` + +### Example Usage (YACReaderLibrary) + +```cpp +// comic_flow_widget.cpp +flow = new YACReaderComicFlowImpl(parent); +flow->setImagePaths(pathsList); +connect(flow, &YACReaderComicFlowImpl::centerIndexChanged, + this, &ComicFlowWidget::centerIndexChanged); +``` + +## API Compatibility + +All public methods from `YACReaderFlowGL` are preserved: + +### Navigation +- `showPrevious()`, `showNext()` +- `setCurrentIndex(int)`, `setCenterIndex(unsigned int)` +- `showSlide(int)`, `centerIndex()` + +### Configuration +- `setPreset(const Preset &)` +- `setPerformance(Performance)` +- `setFlowRightToLeft(bool)` +- `setZoom(int)`, `setRotation(int)` +- `setCF_RX/RY/RZ(int)`, `setCF_Y/Z(int)` +- `setX_Distance(int)`, `setCenter_Distance(int)`, etc. + +### Appearance +- `setBackgroundColor(const QColor &)` +- `setTextColor(const QColor &)` +- `setShadingColor(const QColor &)` +- `setShowMarks(bool)`, `setMarks(QVector<...>)` + +### Content Management +- `populate(int)`, `clear()`, `reset()`, `reload()` +- `insert()`, `remove(int)`, `add(int)`, `replace()` +- Subclass-specific: `setImagePaths()`, `resortCovers()`, etc. + +## Building + +### Prerequisites + +1. **Qt 6.7 or later** (with ShaderTools module) +2. **CMake 3.25+** +3. **C++20 compiler** + +### Build YACReader + +Shaders are compiled automatically at build time via `qt_add_shaders()`: + +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build --parallel +``` + +No manual shader compilation step is needed. + +## Graphics API Selection + +QRhiWidget auto-selects the best API per platform: + +- **macOS/iOS**: Metal (native) +- **Windows**: Direct3D 11 (default) or Direct3D 12 +- **Linux**: Vulkan or OpenGL +- **Android**: OpenGL ES 3.0 or Vulkan + +You can force a specific API via environment variables (for testing): + +```bash +# Force OpenGL +export QSG_RHI_BACKEND=opengl + +# Force Vulkan +export QSG_RHI_BACKEND=vulkan + +# Force Direct3D 11 (Windows) +set QSG_RHI_BACKEND=d3d11 +``` + +## Performance + +Performance tiers match the OpenGL version: + +- **Low**: 8 covers loaded, 128px textures (page flow) / 200px (comic flow) +- **Medium**: 10 covers, 196px / 256px textures +- **High**: 12 covers, 256px / 320px textures +- **Ultra High**: 14-16 covers, full resolution textures + +Texture loading happens asynchronously via worker threads (`ImageLoader3D`, `ImageLoaderByteArray3D`). + +## Debugging + +### Enable Validation Layers + +For debugging graphics issues, enable validation: + +```cpp +flow->setDebugLayerEnabled(true); // Call before widget is shown +``` + +This activates: +- **Vulkan**: VK_LAYER_KHRONOS_validation +- **Direct3D**: D3D11 debug layer +- **Metal**: Metal API validation + +### Check Active Graphics API + +```cpp +QRhi *rhi = flow->rhi(); +qDebug() << "Backend:" << rhi->backend(); +qDebug() << "Driver:" << rhi->driverInfo(); +``` + +### Common Issues + +**Problem**: Shaders fail to load +**Solution**: Ensure Qt ShaderTools module is installed and `qt_add_shaders()` ran during build + +**Problem**: Black screen on Qt 6.7 +**Solution**: Check if `YACREADER_USE_RHI` is defined in build + +**Problem**: Crashes on resize/reparent +**Solution**: `releaseResources()` properly cleans up all QRhi objects + +## Migration from OpenGL + +The RHI version is a **drop-in replacement** requiring no application code changes beyond the build system. + +### What's Different (Internal) + +| OpenGL API | QRhi Equivalent | +|------------|-----------------| +| `glDrawArraysInstanced()` | `cb->drawIndexed(instanceCount)` | +| `glUniform*()` | Update `QRhiBuffer` with uniform data | +| `glBindTexture()` | `QRhiShaderResourceBindings` | +| `glBlendFunc()` | `QRhiGraphicsPipeline::setTargetBlends()` | +| `glEnable(GL_DEPTH_TEST)` | `pipeline->setDepthTest(true)` | + +### What's the Same + +- All public API methods and signatures +- Animation system and timing +- Preset configurations +- Event handling (mouse, keyboard, wheel) +- Worker thread texture loading +- Performance tiers + +## Known Limitations + +1. **Qt Version**: Requires Qt 6.7+ (released April 2024) +2. **QRhi Stability**: QRhi APIs may change in minor Qt releases +3. **Mixed Renderers**: Only one graphics API per window +4. **Shader Compilation**: Shaders are recompiled automatically when source files change + +## Future Improvements + +Potential enhancements: +- [ ] GPU-side frustum culling +- [ ] Compute shader for texture generation +- [ ] HDR/wide color gamut support +- [ ] Ray-traced reflections (via RHI compute) +- [ ] Dynamic LOD based on distance + +## References + +- [QRhiWidget Class Documentation](https://doc.qt.io/qt-6/qrhiwidget.html) +- [QRhi Overview](https://doc.qt.io/qt-6/qrhi.html) +- [Qt RHI Examples](https://doc.qt.io/qt-6/qtwidgets-rhi-cuberhiwidget-example.html) +- [Qt Shader Tools (qsb)](https://doc.qt.io/qt-6/qtshadertools-index.html) + +## License + +Same as YACReader project license. + +## Author + +Generated as part of the YACReader OpenGL modernization initiative. diff --git a/common/rhi/flow_types.cpp b/common/rhi/flow_types.cpp new file mode 100644 index 000000000..9d9bd2008 --- /dev/null +++ b/common/rhi/flow_types.cpp @@ -0,0 +1,182 @@ +#include "flow_types.h" + +/*** Preset Configurations ***/ + +struct Preset defaultYACReaderFlowConfig = { + 0.08f, // Animation_step sets the speed of the animation + 1.5f, // Animation_speedup sets the acceleration of the animation + 0.1f, // Animation_step_max sets the maximum speed of the animation + 3.f, // Animation_Fade_out_dis sets the distance of view + + 1.5f, // pre_rotation sets the rotation increasion + 3.f, // View_rotate_light_strenght sets the light strenght on rotation + 0.01f, // View_rotate_add sets the speed of the rotation + 0.02f, // View_rotate_sub sets the speed of reversing the rotation + 20.f, // View_angle sets the maximum view angle + + 0.f, // CF_X the X Position of the Coverflow + 0.f, // CF_Y the Y Position of the Coverflow + -8.f, // CF_Z the Z Position of the Coverflow + + 15.f, // CF_RX the X Rotation of the Coverflow + 0.f, // CF_RY the Y Rotation of the Coverflow + 0.f, // CF_RZ the Z Rotation of the Coverflow + + -50.f, // Rotation sets the rotation of each cover + 0.18f, // X_Distance sets the distance between the covers + 1.f, // Center_Distance sets the distance between the centered and the non centered covers + 0.1f, // Z_Distance sets the pushback amount + 0.0f, // Y_Distance sets the elevation amount + + 30.f // zoom level + +}; + +struct Preset presetYACReaderFlowClassicConfig = { + 0.08f, // Animation_step sets the speed of the animation + 1.5f, // Animation_speedup sets the acceleration of the animation + 0.1f, // Animation_step_max sets the maximum speed of the animation + 2.f, // Animation_Fade_out_dis sets the distance of view + + 1.5f, // pre_rotation sets the rotation increasion + 3.f, // View_rotate_light_strenght sets the light strenght on rotation + 0.08f, // View_rotate_add sets the speed of the rotation + 0.08f, // View_rotate_sub sets the speed of reversing the rotation + 30.f, // View_angle sets the maximum view angle + + 0.f, // CF_X the X Position of the Coverflow + -0.2f, // CF_Y the Y Position of the Coverflow + -7.f, // CF_Z the Z Position of the Coverflow + + 0.f, // CF_RX the X Rotation of the Coverflow + 0.f, // CF_RY the Y Rotation of the Coverflow + 0.f, // CF_RZ the Z Rotation of the Coverflow + + -40.f, // Rotation sets the rotation of each cover + 0.18f, // X_Distance sets the distance between the covers + 1.f, // Center_Distance sets the distance between the centered and the non centered covers + 0.1f, // Z_Distance sets the pushback amount + 0.0f, // Y_Distance sets the elevation amount + + 22.f // zoom level + +}; + +struct Preset presetYACReaderFlowStripeConfig = { + 0.08f, // Animation_step sets the speed of the animation + 1.5f, // Animation_speedup sets the acceleration of the animation + 0.1f, // Animation_step_max sets the maximum speed of the animation + 6.f, // Animation_Fade_out_dis sets the distance of view + + 1.5f, // pre_rotation sets the rotation increasion + 4.f, // View_rotate_light_strenght sets the light strenght on rotation + 0.08f, // View_rotate_add sets the speed of the rotation + 0.08f, // View_rotate_sub sets the speed of reversing the rotation + 30.f, // View_angle sets the maximum view angle + + 0.f, // CF_X the X Position of the Coverflow + -0.2f, // CF_Y the Y Position of the Coverflow + -7.f, // CF_Z the Z Position of the Coverflow + + 0.f, // CF_RX the X Rotation of the Coverflow + 0.f, // CF_RY the Y Rotation of the Coverflow + 0.f, // CF_RZ the Z Rotation of the Coverflow + + 0.f, // Rotation sets the rotation of each cover + 1.1f, // X_Distance sets the distance between the covers + 0.2f, // Center_Distance sets the distance between the centered and the non centered covers + 0.01f, // Z_Distance sets the pushback amount + 0.0f, // Y_Distance sets the elevation amount + + 22.f // zoom level + +}; + +struct Preset presetYACReaderFlowOverlappedStripeConfig = { + 0.08f, // Animation_step sets the speed of the animation + 1.5f, // Animation_speedup sets the acceleration of the animation + 0.1f, // Animation_step_max sets the maximum speed of the animation + 2.f, // Animation_Fade_out_dis sets the distance of view + + 1.5f, // pre_rotation sets the rotation increasion + 3.f, // View_rotate_light_strenght sets the light strenght on rotation + 0.08f, // View_rotate_add sets the speed of the rotation + 0.08f, // View_rotate_sub sets the speed of reversing the rotation + 30.f, // View_angle sets the maximum view angle + + 0.f, // CF_X the X Position of the Coverflow + -0.2f, // CF_Y the Y Position of the Coverflow + -7.f, // CF_Z the Z Position of the Coverflow + + 0.f, // CF_RX the X Rotation of the Coverflow + 0.f, // CF_RY the Y Rotation of the Coverflow + 0.f, // CF_RZ the Z Rotation of the Coverflow + + 0.f, // Rotation sets the rotation of each cover + 0.18f, // X_Distance sets the distance between the covers + 1.f, // Center_Distance sets the distance between the centered and the non centered covers + 0.1f, // Z_Distance sets the pushback amount + 0.0f, // Y_Distance sets the elevation amount + + 22.f // zoom level + +}; + +struct Preset pressetYACReaderFlowUpConfig = { + 0.08f, // Animation_step sets the speed of the animation + 1.5f, // Animation_speedup sets the acceleration of the animation + 0.1f, // Animation_step_max sets the maximum speed of the animation + 2.5f, // Animation_Fade_out_dis sets the distance of view + + 1.5f, // pre_rotation sets the rotation increasion + 3.f, // View_rotate_light_strenght sets the light strenght on rotation + 0.08f, // View_rotate_add sets the speed of the rotation + 0.08f, // View_rotate_sub sets the speed of reversing the rotation + 5.f, // View_angle sets the maximum view angle + + 0.f, // CF_X the X Position of the Coverflow + -0.2f, // CF_Y the Y Position of the Coverflow + -7.f, // CF_Z the Z Position of the Coverflow + + 0.f, // CF_RX the X Rotation of the Coverflow + 0.f, // CF_RY the Y Rotation of the Coverflow + 0.f, // CF_RZ the Z Rotation of the Coverflow + + -50.f, // Rotation sets the rotation of each cover + 0.18f, // X_Distance sets the distance between the covers + 1.f, // Center_Distance sets the distance between the centered and the non centered covers + 0.1f, // Z_Distance sets the pushback amount + -0.1f, // Y_Distance sets the elevation amount + + 22.f // zoom level + +}; + +struct Preset pressetYACReaderFlowDownConfig = { + 0.08f, // Animation_step sets the speed of the animation + 1.5f, // Animation_speedup sets the acceleration of the animation + 0.1f, // Animation_step_max sets the maximum speed of the animation + 2.5f, // Animation_Fade_out_dis sets the distance of view + + 1.5f, // pre_rotation sets the rotation increasion + 3.f, // View_rotate_light_strenght sets the light strenght on rotation + 0.08f, // View_rotate_add sets the speed of the rotation + 0.08f, // View_rotate_sub sets the speed of reversing the rotation + 5.f, // View_angle sets the maximum view angle + + 0.f, // CF_X the X Position of the Coverflow + -0.2f, // CF_Y the Y Position of the Coverflow + -7.f, // CF_Z the Z Position of the Coverflow + + 0.f, // CF_RX the X Rotation of the Coverflow + 0.f, // CF_RY the Y Rotation of the Coverflow + 0.f, // CF_RZ the Z Rotation of the Coverflow + + -50.f, // Rotation sets the rotation of each cover + 0.18f, // X_Distance sets the distance between the covers + 1.f, // Center_Distance sets the distance between the centered and the non centered covers + 0.1f, // Z_Distance sets the pushback amount + 0.1f, // Y_Distance sets the elevation amount + + 22.f // zoom level +}; diff --git a/common/rhi/flow_types.h b/common/rhi/flow_types.h new file mode 100644 index 000000000..79fe08dce --- /dev/null +++ b/common/rhi/flow_types.h @@ -0,0 +1,75 @@ +// Shared types for YACReader Flow implementations (GL and RHI) +#ifndef __YACREADER_FLOW_TYPES_H +#define __YACREADER_FLOW_TYPES_H + +enum Performance { + low = 0, + medium, + high, + ultraHigh +}; + +// Cover Vector +struct YACReader3DVector { + float x; + float y; + float z; + float rot; +}; + +struct Preset { + /*** Animation Settings ***/ + // sets the speed of the animation + float animationStep; + // sets the acceleration of the animation + float animationSpeedUp; + // sets the maximum speed of the animation + float animationStepMax; + // sets the distance of view + float animationFadeOutDist; + // sets the rotation increasion + float preRotation; + // sets the light strenght on rotation + float viewRotateLightStrenght; + // sets the speed of the rotation + float viewRotateAdd; + // sets the speed of reversing the rotation + float viewRotateSub; + // sets the maximum view angle + float viewAngle; + + /*** Position Configuration ***/ + // the X Position of the Coverflow + float cfX; + // the Y Position of the Coverflow + float cfY; + // the Z Position of the Coverflow + float cfZ; + // the X Rotation of the Coverflow + float cfRX; + // the Y Rotation of the Coverflow + float cfRY; + // the Z Rotation of the Coverflow + float cfRZ; + // sets the rotation of each cover + float rotation; + // sets the distance between the covers + float xDistance; + // sets the distance between the centered and the non centered covers + float centerDistance; + // sets the pushback amount + float zDistance; + // sets the elevation amount + float yDistance; + + float zoom; +}; + +extern struct Preset defaultYACReaderFlowConfig; +extern struct Preset presetYACReaderFlowClassicConfig; +extern struct Preset presetYACReaderFlowStripeConfig; +extern struct Preset presetYACReaderFlowOverlappedStripeConfig; +extern struct Preset pressetYACReaderFlowUpConfig; +extern struct Preset pressetYACReaderFlowDownConfig; + +#endif // __YACREADER_FLOW_TYPES_H diff --git a/common/rhi/shaders/flow.frag b/common/rhi/shaders/flow.frag new file mode 100644 index 000000000..3a901b983 --- /dev/null +++ b/common/rhi/shaders/flow.frag @@ -0,0 +1,66 @@ +#version 450 + +// Inputs from vertex shader +layout(location = 0) in vec2 vTexCoord; +layout(location = 1) in flat vec4 vInstanceShading; +layout(location = 2) in flat float vInstanceOpacity; +layout(location = 3) in flat float vIsReflection; +layout(location = 4) in vec2 vLocalPos; + +// Output +layout(location = 0) out vec4 fragColor; + +// Uniform buffer +layout(std140, binding = 0) uniform UniformBuffer +{ + mat4 viewProjectionMatrix; + vec3 backgroundColor; + float _pad0; + float reflectionUp; + float reflectionDown; + int isReflection; + float _pad1; +}; + +// Texture and sampler +layout(binding = 1) uniform sampler2D coverTexture; + +void main() +{ + vec4 texColor = texture(coverTexture, vTexCoord); + + // Compute per-pixel shading using per-instance corner shading values + float leftUp = vInstanceShading.x; + float leftDown = vInstanceShading.y; + float rightUp = vInstanceShading.z; + float rightDown = vInstanceShading.w; + + // Use interpolated local vertex position to match original vertex-based shading. + // position.y in vertex ranges [-0.5..0.5], so map to [0..1] with +0.5 + float y = clamp(vLocalPos.y + 0.5, 0.0, 1.0); + float x = clamp(vLocalPos.x + 0.5, 0.0, 1.0); + float leftShading = mix(leftDown, leftUp, y); + float rightShading = mix(rightDown, rightUp, y); + float shading = mix(leftShading, rightShading, x); + + // Combine with per-instance opacity (opacity only darkens RGB, alpha preserved) + float shadingAmount = shading * vInstanceOpacity; + + // For reflections, apply a gradient fade using reflection uniforms (darker further away) + if (vIsReflection > 0.5) { + float gradientFade = mix(reflectionUp, reflectionDown, vTexCoord.y); + shadingAmount *= gradientFade; + } + + // Subtle dithering to break up bands (very low amplitude, within 8-bit quantization) + float rnd = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898,78.233))) * 43758.5453); + // scale to roughly +/- 0.5/255 range (adjust strength if needed) + float dither = (rnd - 0.5) / 255.0; + + float shadedAmountDithered = clamp(shadingAmount + dither, 0.0, 1.0); + + fragColor = vec4( + mix(backgroundColor, texColor.rgb, shadedAmountDithered), + texColor.a + ); +} diff --git a/common/rhi/shaders/flow.vert b/common/rhi/shaders/flow.vert new file mode 100644 index 000000000..af9a6866b --- /dev/null +++ b/common/rhi/shaders/flow.vert @@ -0,0 +1,53 @@ +#version 450 + +// Per-vertex attributes +layout(location = 0) in vec3 position; +layout(location = 1) in vec2 texCoord; + +// Per-instance attributes (mat4 split into 4 vec4s for better D3D11 compatibility) +layout(location = 2) in vec4 instanceModel_row0; +layout(location = 3) in vec4 instanceModel_row1; +layout(location = 4) in vec4 instanceModel_row2; +layout(location = 5) in vec4 instanceModel_row3; +layout(location = 6) in vec4 instanceShading1; +layout(location = 7) in float instanceOpacity; +layout(location = 8) in float instanceFlip; + +// Outputs to fragment shader +layout(location = 0) out vec2 vTexCoord; +layout(location = 1) out flat vec4 vInstanceShading; +layout(location = 2) out flat float vInstanceOpacity; +layout(location = 3) out flat float vIsReflection; +layout(location = 4) out vec2 vLocalPos; + +// Uniform buffer +layout(std140, binding = 0) uniform UniformBuffer +{ + mat4 viewProjectionMatrix; + vec3 backgroundColor; + float _pad0; + float reflectionUp; + float reflectionDown; + int isReflection; + float _pad1; +}; + +void main() +{ + // Reconstruct instance model matrix from 4 vec4 rows + mat4 instanceModel = mat4(instanceModel_row0, instanceModel_row1, instanceModel_row2, instanceModel_row3); + + gl_Position = viewProjectionMatrix * instanceModel * vec4(position, 1.0); + vTexCoord = texCoord; + vLocalPos = position.xy; + + // Flip texture vertically per-instance when requested (reflection) + if (instanceFlip != 0.0) { + vTexCoord.y = 1.0 - vTexCoord.y; + } + + // Pass per-instance values to fragment shader as flat (no interpolation) + vInstanceShading = instanceShading1; + vInstanceOpacity = instanceOpacity; + vIsReflection = instanceFlip; +} diff --git a/common/rhi/yacreader_comic_flow_rhi.cpp b/common/rhi/yacreader_comic_flow_rhi.cpp new file mode 100644 index 000000000..bba348df3 --- /dev/null +++ b/common/rhi/yacreader_comic_flow_rhi.cpp @@ -0,0 +1,247 @@ +#include "yacreader_comic_flow_rhi.h" + +#include + +#include + +// YACReaderComicFlow3D implementation +YACReaderComicFlow3D::YACReaderComicFlow3D(QWidget *parent, struct Preset p) + : YACReaderFlow3D(parent, p) +{ + worker = new ImageLoader3D(this); + worker->flow = this; +} + +void YACReaderComicFlow3D::setImagePaths(QStringList paths) +{ + worker->reset(); + reset(); + numObjects = 0; + + if (hasBeenInitialized) { + YACReaderFlow3D::populate(paths.size()); + } else { + lazyPopulateObjects = paths.size(); + } + + this->paths = paths; +} + +void YACReaderComicFlow3D::updateImageData() +{ + if (worker->busy()) + return; + + int idx = worker->index(); + if (idx >= 0 && !worker->result().isNull()) { + if (!loaded[idx]) { + float x = 1; + QImage img = worker->result(); + + // Create QRhiTexture from the loaded image + if (m_rhi) { + QRhiTexture *texture = m_rhi->newTexture(QRhiTexture::RGBA8, img.size(), 1, QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips); + + if (texture->create()) { + PendingTextureUpload upload; + upload.index = idx; + upload.image = img; + upload.x = x; + upload.y = 1 * (float(img.height()) / img.width()); + pendingTextureUploads.append(upload); + + replace(texture, upload.x, upload.y, idx); + } + } + } + } + + int count = 8; + switch (performance) { + case low: + count = 8; + break; + case medium: + count = 10; + break; + case high: + count = 12; + break; + case ultraHigh: + count = 16; + break; + } + + int *indexes = new int[2 * count + 1]; + int center = currentSelected; + indexes[0] = center; + for (int j = 0; j < count; j++) { + indexes[j * 2 + 1] = center + j + 1; + indexes[j * 2 + 2] = center - j - 1; + } + + for (int c = 0; c < 2 * count + 1; c++) { + int i = indexes[c]; + if ((i >= 0) && (i < numObjects)) + if (!loaded[i]) { + if (paths.size() > 0) { + QString fname = paths.at(i); + worker->generate(i, fname); + } + delete[] indexes; + return; + } + } + + delete[] indexes; +} + +void YACReaderComicFlow3D::remove(int item) +{ + worker->lock(); + worker->reset(); + YACReaderFlow3D::remove(item); + if (item >= 0 && item < paths.size()) { + paths.removeAt(item); + } + worker->unlock(); +} + +void YACReaderComicFlow3D::add(const QString &path, int index) +{ + worker->lock(); + worker->reset(); + paths.insert(index, path); + YACReaderFlow3D::add(index); + worker->unlock(); +} + +void YACReaderComicFlow3D::resortCovers(QList newOrder) +{ + worker->lock(); + worker->reset(); + startAnimationTimer(); + + QList pathsNew; + QVector loadedNew; + QVector marksNew; + QVector imagesNew; + + int index = 0; + for (const int i : std::as_const(newOrder)) { + if (i < 0 || i >= images.size()) { + continue; + } + + pathsNew << paths.at(i); + loadedNew << loaded.at(i); + marksNew << marks.at(i); + imagesNew << images.at(i); + imagesNew.last().index = index++; + } + + paths = pathsNew; + loaded = loadedNew; + marks = marksNew; + images = imagesNew; + + worker->unlock(); +} + +// ImageLoader3D implementation +QImage ImageLoader3D::loadImage(const QString &fileName) +{ + QImage image; + + if (!image.load(fileName)) { + return QImage(); + } + + switch (flow->performance) { + case low: + image = image.scaledToWidth(200, Qt::SmoothTransformation); + break; + case medium: + image = image.scaledToWidth(256, Qt::SmoothTransformation); + break; + case high: + image = image.scaledToWidth(320, Qt::SmoothTransformation); + break; + case ultraHigh: + break; + } + + return image.convertToFormat(QImage::Format_RGBA8888); +} + +ImageLoader3D::ImageLoader3D(YACReaderFlow3D *flow) + : QThread(), flow(flow), restart(false), working(false), idx(-1) +{ +} + +ImageLoader3D::~ImageLoader3D() +{ + mutex.lock(); + condition.wakeOne(); + mutex.unlock(); + wait(); +} + +bool ImageLoader3D::busy() const +{ + return isRunning() ? working : false; +} + +void ImageLoader3D::generate(int index, const QString &fileName) +{ + mutex.lock(); + this->idx = index; + this->fileName = fileName; + this->img = QImage(); + mutex.unlock(); + + if (!isRunning()) + start(); + else { + restart = true; + condition.wakeOne(); + } +} + +void ImageLoader3D::lock() +{ + mutex.lock(); +} + +void ImageLoader3D::unlock() +{ + mutex.unlock(); +} + +void ImageLoader3D::run() +{ + for (;;) { + mutex.lock(); + this->working = true; + QString fileName = this->fileName; + mutex.unlock(); + + QImage image = loadImage(fileName); + + mutex.lock(); + this->working = false; + this->img = image; + mutex.unlock(); + + mutex.lock(); + if (!this->restart) + condition.wait(&mutex); + restart = false; + mutex.unlock(); + } +} + +QImage ImageLoader3D::result() +{ + return img; +} diff --git a/common/rhi/yacreader_comic_flow_rhi.h b/common/rhi/yacreader_comic_flow_rhi.h new file mode 100644 index 000000000..61d65300e --- /dev/null +++ b/common/rhi/yacreader_comic_flow_rhi.h @@ -0,0 +1,62 @@ +#ifndef __YACREADER_COMIC_FLOW_RHI_H +#define __YACREADER_COMIC_FLOW_RHI_H + +#include "yacreader_flow_rhi.h" + +#include +#include + +class ImageLoader3D; + +class YACReaderComicFlow3D : public YACReaderFlow3D +{ +public: + YACReaderComicFlow3D(QWidget *parent = nullptr, struct Preset p = defaultYACReaderFlowConfig); + void setImagePaths(QStringList paths); + void updateImageData() override; + void remove(int item) override; + void add(const QString &path, int index); + void resortCovers(QList newOrder); + friend class ImageLoader3D; + +private: + ImageLoader3D *worker; + +protected: + QList paths; +}; + +class ImageLoader3D : public QThread +{ +public: + ImageLoader3D(YACReaderFlow3D *flow); + ~ImageLoader3D(); + bool busy() const; + void generate(int index, const QString &fileName); + void reset() + { + idx = -1; + fileName = ""; + } + int index() const { return idx; } + void lock(); + void unlock(); + QImage result(); + YACReaderFlow3D *flow; + QImage loadImage(const QString &fileName); + +protected: + void run() override; + +private: + QMutex mutex; + QWaitCondition condition; + + bool restart; + bool working; + int idx; + QString fileName; + QImage img; +}; + +#endif // __YACREADER_COMIC_FLOW_RHI_H diff --git a/common/rhi/yacreader_flow_rhi.cpp b/common/rhi/yacreader_flow_rhi.cpp new file mode 100644 index 000000000..7db946660 --- /dev/null +++ b/common/rhi/yacreader_flow_rhi.cpp @@ -0,0 +1,1530 @@ +#include "yacreader_flow_rhi.h" + +#include +#include +#if defined(YACREADER_RHI_PERF) +#include +#endif +#include + +int YACReaderFlow3D::updateInterval = 16; + +static QShader getShader(const QString &name) +{ + QFile f(name); + return f.open(QIODevice::ReadOnly) ? QShader::fromSerialized(f.readAll()) : QShader(); +} + +/*Constructor*/ +YACReaderFlow3D::YACReaderFlow3D(QWidget *parent, struct Preset p) + : QRhiWidget(parent), + numObjects(0), + lazyPopulateObjects(-1), + showMarks(true), + hasBeenInitialized(false), + backgroundColor(Qt::black), + textColor(Qt::white), + flowRightToLeft(false) +{ + updateCount = 0; + config = p; + currentSelected = 0; + + centerPos.x = 0.f; + centerPos.y = 0.f; + centerPos.z = 1.f; + centerPos.rot = 0.f; + + shadingTop = 0.8f; + shadingBottom = 0.02f; + reflectionUp = 0.0f; + reflectionBottom = 0.33f; + + setBackgroundColor(Qt::black); + + numObjects = 0; + viewRotate = 0.f; + viewRotateActive = 0; + stepBackup = config.animationStep / config.animationSpeedUp; + + // Request 4x MSAA for the QRhiWidget's render target + setSampleCount(4); + + timerId = -1; + + // Create and configure the index label + indexLabel = new QLabel(this); + indexLabel->setAttribute(Qt::WA_TransparentForMouseEvents); + indexLabel->setAutoFillBackground(false); + updateIndexLabelStyle(); + +#if defined(YACREADER_RHI_PERF) + // Create performance label (shows averaged render time) + perfLabel = new QLabel(this); + perfLabel->setAttribute(Qt::WA_TransparentForMouseEvents); + perfLabel->setAutoFillBackground(false); + perfLabel->setText(QString()); + perfLabel->hide(); + // Style will be applied by updateIndexLabelStyle() +#endif +} + +YACReaderFlow3D::~YACReaderFlow3D() +{ + if (timerId != -1) { + killTimer(timerId); + timerId = -1; + } + + // Clean up image textures (not owned by Scene) + for (int i = 0; i < numObjects; i++) { + if (images[i].texture && images[i].texture != scene.defaultTexture.get()) { + delete images[i].texture; + } + } + images.clear(); + numObjects = 0; + + // Release all RHI resources + scene.reset(); +} + +void YACReaderFlow3D::timerEvent(QTimerEvent *event) +{ + if (timerId == event->timerId()) + update(); +} + +void YACReaderFlow3D::startAnimationTimer() +{ + if (timerId == -1) + timerId = startTimer(updateInterval); +} + +void YACReaderFlow3D::stopAnimationTimer() +{ + if (timerId != -1) { + killTimer(timerId); + timerId = -1; + } +} + +void YACReaderFlow3D::initialize(QRhiCommandBuffer *cb) +{ + auto newRhi = rhi(); + if (m_rhi != newRhi) { + scene.reset(); + m_rhi = newRhi; + } + + if (m_rhi == nullptr) + return; + + // Helper to get or create resource update batch + auto getResourceBatch = [this]() { + if (scene.resourceUpdates == nullptr) + scene.resourceUpdates = m_rhi->nextResourceUpdateBatch(); + return scene.resourceUpdates; + }; + + // Initialize default texture from image + if (!scene.defaultTexture) { + QImage defaultImage = QImage(":/images/defaultCover.png").convertToFormat(QImage::Format_RGBA8888); + + scene.defaultTexture.reset(m_rhi->newTexture(QRhiTexture::RGBA8, defaultImage.size(), 1, QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips)); + scene.defaultTexture->create(); + getResourceBatch()->uploadTexture(scene.defaultTexture.get(), defaultImage); + getResourceBatch()->generateMips(scene.defaultTexture.get()); + qDebug() << "YACReaderFlow3D: Created defaultTexture" << defaultImage.size(); + } + + if (ribbonTexturesDirty || (!readRibbonImage.isNull() && !scene.markTexture) || (!readingRibbonImage.isNull() && !scene.readingTexture)) + syncRibbonTextures(getResourceBatch()); + + // Create vertex buffer (quad geometry) + if (!scene.vertexBuffer) { + // Use a triangle list (two triangles = 6 vertices) because some RHI backends + // don't support TriangleFan. Each vertex: x,y,z,u,v (5 floats). + scene.vertexBuffer.reset(m_rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, 6 * 5 * sizeof(float))); + scene.vertexBuffer->create(); + + // Two triangles forming a quad (triangle list): + // Tri 1: bottom-left, bottom-right, top-right + // Tri 2: bottom-left, top-right, top-left + float vertices[] = { + // Position (x, y, z), TexCoord (u, v) + -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-left + 0.5f, -0.5f, 0.0f, 1.0f, 1.0f, // Bottom-right + 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right + + -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-left + 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right + -0.5f, 0.5f, 0.0f, 0.0f, 0.0f // Top-left + }; + + getResourceBatch()->uploadStaticBuffer(scene.vertexBuffer.get(), vertices); + } + + // Initialize alignment for uniform buffers + if (scene.alignedUniformSize == 0) { + scene.alignedUniformSize = m_rhi->ubufAligned(sizeof(UniformData)); + } + + // Create sampler with trilinear filtering + if (!scene.sampler) { + scene.sampler.reset(m_rhi->newSampler( + QRhiSampler::Linear, // mag filter + QRhiSampler::Linear, // min filter + QRhiSampler::Linear, // mipmap filter (trilinear) + QRhiSampler::ClampToEdge, + QRhiSampler::ClampToEdge)); + scene.sampler->create(); + } + + // Create instance buffer for per-draw instance data + if (!scene.instanceBuffer) { + // Allocate buffer for per-instance data (model matrix + shading + opacity + flipFlag) + // mat4 (16 floats) + vec4 (4 floats) + float (opacity) + float (flipFlag) = 22 floats + scene.instanceBuffer.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::VertexBuffer, 22 * sizeof(float))); + scene.instanceBuffer->create(); + } + + // Determine how many items we'll have (either already populated or pending lazy population) + const int itemCount = (lazyPopulateObjects != -1) ? lazyPopulateObjects : numObjects; + + // Create uniform buffer sized for the actual content + // Each item needs up to 3 draw slots: cover + reflection + mark + // If no items yet, we'll create the buffer later in ensureUniformBufferCapacity() + if (!scene.uniformBuffer && itemCount > 0) { + const int requiredSlots = itemCount * 3; + const int totalSize = requiredSlots * scene.alignedUniformSize; + scene.uniformBuffer.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, totalSize)); + if (scene.uniformBuffer->create()) { + scene.uniformBufferCapacity = requiredSlots; + } else { + qWarning() << "YACReaderFlow3D: Failed to create uniform buffer for" << itemCount << "items"; + scene.uniformBuffer.reset(); + scene.uniformBufferCapacity = 0; + } + } + + // Create shader bindings for pipeline (requires uniform buffer) + if (!scene.shaderBindings && scene.uniformBuffer) { + scene.shaderBindings.reset(m_rhi->newShaderResourceBindings()); + scene.shaderBindings->setBindings({ QRhiShaderResourceBinding::uniformBufferWithDynamicOffset(0, QRhiShaderResourceBinding::VertexStage | QRhiShaderResourceBinding::FragmentStage, scene.uniformBuffer.get(), sizeof(UniformData)), + QRhiShaderResourceBinding::sampledTexture(1, QRhiShaderResourceBinding::FragmentStage, scene.defaultTexture.get(), scene.sampler.get()) }); + scene.shaderBindings->create(); + } + + // Create pipeline if we have all prerequisites + ensurePipeline(); + + // Submit any pending resource updates + if (scene.resourceUpdates) { + cb->resourceUpdate(scene.resourceUpdates); + scene.resourceUpdates = nullptr; + } + + // Call populate only once per data loaded. + if (!hasBeenInitialized && lazyPopulateObjects != -1) { + populate(lazyPopulateObjects); + lazyPopulateObjects = -1; + } + + hasBeenInitialized = true; +} + +void YACReaderFlow3D::ensureUniformBufferCapacity(int requiredSlots) +{ + if (!m_rhi || scene.alignedUniformSize == 0) + return; + + // Check if we need to resize + if (scene.uniformBufferCapacity >= requiredSlots && scene.uniformBuffer) + return; + + // Reset uniform buffer + scene.uniformBuffer.reset(); + + // Create new larger buffer + // Each draw needs its own uniform slot (cover + reflection + optional mark = 3 per object) + const int totalSize = requiredSlots * scene.alignedUniformSize; + scene.uniformBuffer.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, totalSize)); + if (scene.uniformBuffer->create()) { + scene.uniformBufferCapacity = requiredSlots; + + // Invalidate shader bindings cache since the uniform buffer changed + qDeleteAll(scene.shaderBindingsCache); + scene.shaderBindingsCache.clear(); + + // Recreate default shader bindings for pipeline (using dynamic offset) + scene.shaderBindings.reset(m_rhi->newShaderResourceBindings()); + scene.shaderBindings->setBindings({ QRhiShaderResourceBinding::uniformBufferWithDynamicOffset(0, QRhiShaderResourceBinding::VertexStage | QRhiShaderResourceBinding::FragmentStage, scene.uniformBuffer.get(), sizeof(UniformData)), + QRhiShaderResourceBinding::sampledTexture(1, QRhiShaderResourceBinding::FragmentStage, scene.defaultTexture.get(), scene.sampler.get()) }); + scene.shaderBindings->create(); + + // If pipeline doesn't exist yet (content added after initial empty initialization), + // we need to create it now. This is handled by ensurePipeline(). + } else { + qWarning() << "YACReaderFlow3D: Failed to create uniform buffer of size" << totalSize; + scene.uniformBufferCapacity = 0; + } +} + +void YACReaderFlow3D::ensurePipeline() +{ + if (scene.pipeline || !m_rhi || !scene.uniformBuffer || !scene.shaderBindings) + return; + + // Load shaders + QShader vertShader = getShader(QLatin1String(":/shaders/flow.vert.qsb")); + QShader fragShader = getShader(QLatin1String(":/shaders/flow.frag.qsb")); + + if (!vertShader.isValid() || !fragShader.isValid()) { + qWarning() << "YACReaderFlow3D: Failed to load shaders!"; + return; + } + + // Create pipeline + scene.pipeline.reset(m_rhi->newGraphicsPipeline()); + + // Setup alpha blending + QRhiGraphicsPipeline::TargetBlend blend; + blend.enable = true; + blend.srcColor = QRhiGraphicsPipeline::SrcAlpha; + blend.dstColor = QRhiGraphicsPipeline::OneMinusSrcAlpha; + blend.srcAlpha = QRhiGraphicsPipeline::One; + blend.dstAlpha = QRhiGraphicsPipeline::OneMinusSrcAlpha; + scene.pipeline->setTargetBlends({ blend }); + + // Enable depth test + scene.pipeline->setDepthTest(true); + scene.pipeline->setDepthWrite(true); + scene.pipeline->setDepthOp(QRhiGraphicsPipeline::Less); + + scene.pipeline->setCullMode(QRhiGraphicsPipeline::Back); + + // Determine the MSAA sample count to use + int requestedSamples = sampleCount(); + if (requestedSamples > 1 && m_rhi) { + QVector supported = m_rhi->supportedSampleCounts(); + auto it = std::upper_bound(supported.begin(), supported.end(), requestedSamples); + int samplesToUse = (it != supported.begin()) ? *std::prev(it) : 1; + if (samplesToUse > 1) + scene.pipeline->setSampleCount(samplesToUse); + } + + // Set shaders + scene.pipeline->setShaderStages({ { QRhiShaderStage::Vertex, vertShader }, + { QRhiShaderStage::Fragment, fragShader } }); + + // Setup vertex input layout + QRhiVertexInputLayout inputLayout; + inputLayout.setBindings({ + { 5 * sizeof(float) }, // Per-vertex data (position + texCoord) + { 22 * sizeof(float), QRhiVertexInputBinding::PerInstance } // Per-instance data + }); + inputLayout.setAttributes({ + // Per-vertex attributes + { 0, 0, QRhiVertexInputAttribute::Float3, 0 }, // position + { 0, 1, QRhiVertexInputAttribute::Float2, 3 * sizeof(float) }, // texCoord + + // Per-instance attributes (model matrix as 4 vec4s) + { 1, 2, QRhiVertexInputAttribute::Float4, 0 * sizeof(float) }, // row 0 + { 1, 3, QRhiVertexInputAttribute::Float4, 4 * sizeof(float) }, // row 1 + { 1, 4, QRhiVertexInputAttribute::Float4, 8 * sizeof(float) }, // row 2 + { 1, 5, QRhiVertexInputAttribute::Float4, 12 * sizeof(float) }, // row 3 + { 1, 6, QRhiVertexInputAttribute::Float4, 16 * sizeof(float) }, // shading vec4 + { 1, 7, QRhiVertexInputAttribute::Float, 20 * sizeof(float) }, // opacity + { 1, 8, QRhiVertexInputAttribute::Float, 21 * sizeof(float) }, // flipFlag (1.0 = reflection) + // rotation removed + }); + scene.pipeline->setVertexInputLayout(inputLayout); + + // Set shader resource bindings and render pass descriptor + scene.pipeline->setShaderResourceBindings(scene.shaderBindings.get()); + scene.pipeline->setRenderPassDescriptor(renderTarget()->renderPassDescriptor()); + + if (!scene.pipeline->create()) { + qWarning() << "YACReaderFlow3D: Failed to create graphics pipeline!"; + scene.pipeline.reset(); + } +} + +void YACReaderFlow3D::render(QRhiCommandBuffer *cb) +{ + if (!m_rhi) + return; + + QRhiResourceUpdateBatch *batch = scene.resourceUpdates; + scene.resourceUpdates = nullptr; + + auto ensureBatch = [this, &batch]() { + if (!batch) + batch = m_rhi->nextResourceUpdateBatch(); + return batch; + }; + auto deferBatch = [this, &batch]() { + if (batch) + scene.resourceUpdates = batch; + }; + +#ifdef YACREADER_LIBRARY + if (ribbonTexturesDirty || (!readRibbonImage.isNull() && !scene.markTexture) || (!readingRibbonImage.isNull() && !scene.readingTexture)) + syncRibbonTextures(ensureBatch()); +#endif + + // Even without draw calls, pending uploads still have to reach the GPU. + // Otherwise recreated ribbon textures would exist but never receive pixels. + if (numObjects == 0) { + if (batch) + cb->resourceUpdate(batch); + return; + } + + const QSize outputSize = renderTarget()->pixelSize(); + const QColor clearColor = backgroundColor; + + // Update positions and animations + updatePositions(); + + // Update index label if values changed + updateIndexLabel(); + + // Prepare view-projection matrix + // Use fixed 20.0 degrees FOV - zoom is controlled via cfZ (camera distance) + QMatrix4x4 projectionMatrix; + projectionMatrix.perspective(20.0, float(outputSize.width()) / float(outputSize.height()), 1.0, 200.0); + + QMatrix4x4 viewMatrix; + viewMatrix.translate(config.cfX, config.cfY, config.cfZ); + viewMatrix.rotate(config.cfRX, 1, 0, 0); + viewMatrix.rotate(viewRotate * config.viewAngle + config.cfRY, 0, 1, 0); + viewMatrix.rotate(config.cfRZ, 0, 0, 1); + + QMatrix4x4 viewProjectionMatrix = projectionMatrix * viewMatrix; + + // Build draw order (back to front for proper alpha blending) + QVector drawOrder; + for (int count = numObjects - 1; count > -1; count--) { + if (count > currentSelected) { + drawOrder.append(count); + } + } + for (int count = 0; count < numObjects - 1; count++) { + if (count < currentSelected) { + drawOrder.append(count); + } + } + drawOrder.append(currentSelected); + + // Structure to hold draw info + struct DrawInfo { + int imageIndex; + bool isReflection; + bool isMark; + QRhiTexture *texture; + float instanceData[22]; + UniformData uniformData; + }; + + auto isVisibleInNDC = [&](const YACReader3DImageRHI &image, bool isReflection, bool isMark) { + QMatrix4x4 modelMatrix; + modelMatrix.translate(image.current.x, image.current.y, image.current.z); + modelMatrix.rotate(image.current.rot, 0, 1, 0); + + if (isMark) { + float markWidth = 0.15f; + float markHeight = 0.2f; + float markCenterX = image.width / 2.0f - 0.125f; + float markCenterY = -0.588f + image.height; + modelMatrix.translate(markCenterX, markCenterY, 0.001f); + modelMatrix.scale(markWidth, markHeight, 1.0f); + } else { + if (isReflection) { + modelMatrix.translate(0.0f, -0.5f - image.height / 2.0f, 0.0f); + } else { + modelMatrix.translate(0.0f, -0.5f + image.height / 2.0f, 0.0f); + } + modelMatrix.scale(image.width, image.height, 1.0f); + } + + QVector4D center = modelMatrix * QVector4D(0, 0, 0, 1); + QVector4D clip = viewProjectionMatrix * center; + if (clip.w() == 0.0f) + return true; // be conservative + + // Project a world-space edge to estimate a projected radius in NDC. + // Use the modelMatrix's X axis (includes rotation+scale) as direction, + // normalize it and multiply by cached boundingRadius (world units). + QVector4D rightV = modelMatrix * QVector4D(1, 0, 0, 0); // direction (w=0) + QVector3D right3(rightV.x(), rightV.y(), rightV.z()); + float len = right3.length(); + if (len == 0.0f) + return true; // conservative + right3 /= len; + + float worldRadius = image.boundingRadius; + if (isMark) { + float markWidth = 0.15f; + float markHeight = 0.2f; + worldRadius = 0.5f * std::sqrt(markWidth * markWidth + markHeight * markHeight); + } + + QVector4D edgeWorld = center + QVector4D(right3 * worldRadius, 0.0f); + QVector4D edgeClip = viewProjectionMatrix * edgeWorld; + if (edgeClip.w() == 0.0f) + return true; + + QVector2D nc(clip.x() / clip.w(), clip.y() / clip.w()); + QVector2D ne(edgeClip.x() / edgeClip.w(), edgeClip.y() / edgeClip.w()); + float projectedRadius = (ne - nc).length(); + + const float margin = isMark ? 0.6f : 1.2f; + if (nc.x() + projectedRadius < -1.0f - margin || nc.x() - projectedRadius > 1.0f + margin || + nc.y() + projectedRadius < -1.0f - margin || nc.y() - projectedRadius > 1.0f + margin) + return false; + return true; + }; + + // Collect all draws we need to make + QVector draws; + + // Start timing for this render call (measures CPU time spent in this function) +#if defined(YACREADER_RHI_PERF) + QElapsedTimer perfTimer; + perfTimer.start(); +#endif + + // Phase 1: Add all reflections + for (int idx : drawOrder) { + if (idx < 0 || idx >= images.size() || !images[idx].texture) + continue; + + if (!isVisibleInNDC(images[idx], true, false)) + continue; + + DrawInfo reflDraw; + reflDraw.imageIndex = idx; + reflDraw.isReflection = true; + reflDraw.isMark = false; + reflDraw.texture = images[idx].texture; + + prepareDrawData(images[idx], true, false, viewProjectionMatrix, reflDraw.instanceData, reflDraw.uniformData); + draws.append(reflDraw); + } + + // Phase 2: Add all covers (and marks) + for (int idx : drawOrder) { + if (idx < 0 || idx >= images.size() || !images[idx].texture) + continue; + + if (!isVisibleInNDC(images[idx], false, false)) { + continue; + } + + DrawInfo coverDraw; + coverDraw.imageIndex = idx; + coverDraw.isReflection = false; + coverDraw.isMark = false; + coverDraw.texture = images[idx].texture; + prepareDrawData(images[idx], false, false, viewProjectionMatrix, coverDraw.instanceData, coverDraw.uniformData); + draws.append(coverDraw); + + if (idx < 0 || idx >= marks.size()) + continue; + + if (idx >= loaded.size()) + continue; + + // Add mark draw immediately after its cover + if (showMarks && loaded[idx] && marks[idx] != YACReader::Unread) { + QRhiTexture *markTex = (marks[idx] == YACReader::Read) ? scene.markTexture.get() : scene.readingTexture.get(); + if (markTex) { + if (!isVisibleInNDC(images[idx], false, true)) + continue; + DrawInfo markDraw; + markDraw.imageIndex = idx; + markDraw.isReflection = false; + markDraw.isMark = true; + markDraw.texture = markTex; + prepareDrawData(images[idx], false, true, viewProjectionMatrix, markDraw.instanceData, markDraw.uniformData); + draws.append(markDraw); + } + } + } + + // Ensure uniform buffer is large enough + ensureUniformBufferCapacity(draws.size()); + + if (!scene.uniformBuffer) { + deferBatch(); + qWarning() << "YACReaderFlow3D: No uniform buffer available for rendering"; + return; + } + + // Ensure pipeline exists (may not exist if content was added after empty initialization) + ensurePipeline(); + + if (!scene.pipeline) { + deferBatch(); + qWarning() << "YACReaderFlow3D: No pipeline available for rendering"; + return; + } + + // Ensure instance buffer is large enough for all draws + auto requiredInstanceSize = static_cast(draws.size() * 22 * sizeof(float)); + if (!scene.instanceBuffer || scene.instanceBuffer->size() < requiredInstanceSize) { + scene.instanceBuffer.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::VertexBuffer, requiredInstanceSize)); + if (!scene.instanceBuffer->create()) { + deferBatch(); + qWarning() << "YACReaderFlow3D: Failed to create instance buffer of size" << requiredInstanceSize; + return; + } + } + + // === PHASE 1: PREPARE (BEFORE PASS) === + // Update ALL uniform and instance data for ALL draws in one batch + batch = ensureBatch(); + + // Process pending texture uploads + if (!pendingTextureUploads.isEmpty()) { + for (const auto &upload : std::as_const(pendingTextureUploads)) { + if (upload.index >= 0 && upload.index < images.size() && images[upload.index].texture) { + batch->uploadTexture(images[upload.index].texture, upload.image); + batch->generateMips(images[upload.index].texture); + } + } + pendingTextureUploads.clear(); + } + + // Update uniform buffer with all draw data + for (int i = 0; i < draws.size(); ++i) { + int offset = i * scene.alignedUniformSize; + batch->updateDynamicBuffer(scene.uniformBuffer.get(), offset, sizeof(UniformData), &draws[i].uniformData); + } + + // Update instance buffer with all instance data + for (int i = 0; i < draws.size(); ++i) { + int offset = i * 22 * sizeof(float); + batch->updateDynamicBuffer(scene.instanceBuffer.get(), offset, 22 * sizeof(float), draws[i].instanceData); + } + + // === PHASE 2: RENDER (DURING PASS) === + cb->beginPass(renderTarget(), clearColor, { 1.0f, 0 }, batch); + batch = nullptr; + + cb->setGraphicsPipeline(scene.pipeline.get()); + cb->setViewport(QRhiViewport(0, 0, outputSize.width(), outputSize.height())); + + // Execute all draws + for (int i = 0; i < draws.size(); ++i) { + const DrawInfo &draw = draws[i]; + executeDrawWithOffset(cb, draw.texture, draw.instanceData, i); + } + + cb->endPass(); + + // Measure elapsed CPU time for render and update perf label periodically +#if defined(YACREADER_RHI_PERF) + qint64 ns = perfTimer.nsecsElapsed(); + double ms = double(ns) / 1e6; + + perfAccumMs += ms; + perfAccumCount += 1; + perfFrameCounter += 1; + + if (perfFrameCounter >= perfUpdateEvery) { + // compute average + if (perfAccumCount > 0) + lastRenderMs = perfAccumMs / perfAccumCount; + + // reset accumulators + perfAccumMs = 0.0; + perfAccumCount = 0; + perfFrameCounter = 0; + + if (perfLabel) { + perfLabel->setText(QString("R: %1 ms").arg(lastRenderMs, 0, 'f', 2)); + perfLabel->adjustSize(); + perfLabel->show(); + } + } +#endif +} + +void YACReaderFlow3D::prepareDrawData(const YACReader3DImageRHI &image, bool isReflection, bool isMark, + const QMatrix4x4 &viewProjectionMatrix, + float *outInstanceData, UniformData &outUniformData) +{ + float w = image.width; + float h = image.height; + + // Calculate opacity + float opacity = 1 - 1 / (config.animationFadeOutDist + config.viewRotateLightStrenght * fabs(viewRotate)) * fabs(0 - image.current.x); + + // Calculate shading + float LShading = ((config.rotation != 0) ? ((image.current.rot < 0) ? 1 - 1 / config.rotation * image.current.rot : 1) : 1); + float RShading = ((config.rotation != 0) ? ((image.current.rot > 0) ? 1 - 1 / (config.rotation * -1) * image.current.rot : 1) : 1); + float LUP = shadingTop + (1 - shadingTop) * LShading; + float LDOWN = shadingBottom + (1 - shadingBottom) * LShading; + float RUP = shadingTop + (1 - shadingTop) * RShading; + float RDOWN = shadingBottom + (1 - shadingBottom) * RShading; + + QMatrix4x4 modelMatrix; + modelMatrix.translate(image.current.x, image.current.y, image.current.z); + modelMatrix.rotate(image.current.rot, 0, 1, 0); + + if (isMark) { + // Mark-specific transform + float markWidth = 0.15f; + float markHeight = 0.2f; + float markCenterX = w / 2.0f - 0.125f; + float markCenterY = -0.588f + h; + modelMatrix.translate(markCenterX, markCenterY, 0.001f); + modelMatrix.scale(markWidth, markHeight, 1.0f); + + float shadingValue = RUP * opacity; + outInstanceData[16] = shadingValue; + outInstanceData[17] = shadingValue; + outInstanceData[18] = shadingValue; + outInstanceData[19] = shadingValue; + outInstanceData[20] = 1.0f; + outInstanceData[21] = isReflection ? 1.0f : 0.0f; + } else { + // Cover/reflection transform + if (isReflection) { + modelMatrix.translate(0.0f, -0.5f - h / 2.0f, 0.0f); + // Swap vertical shading for reflection + float temp = LUP; + LUP = LDOWN; + LDOWN = temp; + temp = RUP; + RUP = RDOWN; + RDOWN = temp; + } else { + modelMatrix.translate(0.0f, -0.5f + h / 2.0f, 0.0f); + } + modelMatrix.scale(w, h, 1.0f); + + outInstanceData[16] = LUP; + outInstanceData[17] = LDOWN; + outInstanceData[18] = RUP; + outInstanceData[19] = RDOWN; + outInstanceData[20] = opacity; + outInstanceData[21] = isReflection ? 1.0f : 0.0f; + } + + // Pack model matrix into instance data + const float *matData = modelMatrix.constData(); + for (int i = 0; i < 16; i++) { + outInstanceData[i] = matData[i]; + } + + // Prepare uniform data (copy float data into POD arrays) + const float *vp = viewProjectionMatrix.constData(); + for (int m = 0; m < 16; ++m) + outUniformData.viewProjectionMatrix[m] = vp[m]; + + outUniformData.backgroundColor[0] = backgroundColor.redF(); + outUniformData.backgroundColor[1] = backgroundColor.greenF(); + outUniformData.backgroundColor[2] = backgroundColor.blueF(); + outUniformData._pad0 = 0.0f; + + outUniformData.reflectionUp = reflectionUp; + outUniformData.reflectionDown = reflectionBottom; + outUniformData.isReflection = isReflection ? 1.0f : 0.0f; + outUniformData._pad1 = 0.0f; +} + +void YACReaderFlow3D::executeDrawWithOffset(QRhiCommandBuffer *cb, QRhiTexture *texture, + const float *instanceData, int uniformSlot) +{ + if (!texture || !scene.instanceBuffer || !scene.vertexBuffer) + return; + + Q_UNUSED(instanceData) + + // Get or create shader resource bindings for this texture with dynamic offset support + QRhiShaderResourceBindings *srb = scene.shaderBindingsCache.value(texture, nullptr); + if (!srb) { + srb = m_rhi->newShaderResourceBindings(); + srb->setBindings({ QRhiShaderResourceBinding::uniformBufferWithDynamicOffset(0, QRhiShaderResourceBinding::VertexStage | QRhiShaderResourceBinding::FragmentStage, scene.uniformBuffer.get(), sizeof(UniformData)), + QRhiShaderResourceBinding::sampledTexture(1, QRhiShaderResourceBinding::FragmentStage, texture, scene.sampler.get()) }); + srb->create(); + scene.shaderBindingsCache.insert(texture, srb); + } + + // Set shader resources with dynamic offset for uniform buffer + QRhiCommandBuffer::DynamicOffset dynOfs[] = { + { 0, quint32(uniformSlot * scene.alignedUniformSize) } + }; + cb->setShaderResources(srb, 1, dynOfs); + + // Bind vertex buffers with offset into instance buffer + const QRhiCommandBuffer::VertexInput vbufBindings[] = { + { scene.vertexBuffer.get(), 0 }, + { scene.instanceBuffer.get(), quint32(uniformSlot * 22 * sizeof(float)) } + }; + cb->setVertexInput(0, 2, vbufBindings); + + // Draw two triangles (6 vertices) forming a quad + cb->draw(6); +} + +void YACReaderFlow3D::removeCachedShaderBindings(QRhiTexture *texture) +{ + if (!texture) + return; + + auto it = scene.shaderBindingsCache.find(texture); + if (it != scene.shaderBindingsCache.end()) { + delete it.value(); + scene.shaderBindingsCache.erase(it); + } +} + +void YACReaderFlow3D::syncRibbonTextures(QRhiResourceUpdateBatch *batch) +{ +#ifndef YACREADER_LIBRARY + Q_UNUSED(batch); + ribbonTexturesDirty = false; +#else + if (!m_rhi || !batch) + return; + + bool allTexturesReady = true; + + auto syncTexture = [this, batch, &allTexturesReady](std::unique_ptr &texture, const QImage &image, const char *name) { + if (image.isNull()) { + if (texture) { + removeCachedShaderBindings(texture.get()); + texture.reset(); + } + return; + } + + if (texture && !ribbonTexturesDirty) + return; + + if (texture) { + removeCachedShaderBindings(texture.get()); + texture.reset(); + } + + std::unique_ptr newTexture(m_rhi->newTexture(QRhiTexture::RGBA8, image.size(), 1, QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips)); + if (!newTexture->create()) { + qWarning() << "YACReaderFlow3D: Failed to create" << name << "ribbon texture"; + allTexturesReady = false; + return; + } + + batch->uploadTexture(newTexture.get(), image); + batch->generateMips(newTexture.get()); + texture = std::move(newTexture); + }; + + syncTexture(scene.markTexture, readRibbonImage, "read"); + syncTexture(scene.readingTexture, readingRibbonImage, "reading"); + + ribbonTexturesDirty = !allTexturesReady; +#endif +} + +void YACReaderFlow3D::releaseResources() +{ + scene.reset(); + m_rhi = nullptr; +} + +void YACReaderFlow3D::showEvent(QShowEvent *event) +{ + QRhiWidget::showEvent(event); + startAnimationTimer(); +} + +void YACReaderFlow3D::resizeEvent(QResizeEvent *event) +{ + QRhiWidget::resizeEvent(event); + updateIndexLabelStyle(); +} + +void YACReaderFlow3D::cleanupAnimation() +{ + config.animationStep = stepBackup; + viewRotateActive = 0; +} + +void YACReaderFlow3D::draw() +{ + update(); +} + +void YACReaderFlow3D::calcPos(YACReader3DImageRHI &image, int pos) +{ + if (flowRightToLeft) { + pos = pos * -1; + } + + if (pos == 0) { + image.current = centerPos; + } else { + if (pos > 0) { + image.current.x = (config.centerDistance) + (config.xDistance * pos); + image.current.y = config.yDistance * pos * -1; + image.current.z = config.zDistance * pos * -1; + image.current.rot = config.rotation; + } else { + image.current.x = (config.centerDistance) * -1 + (config.xDistance * pos); + image.current.y = config.yDistance * pos; + image.current.z = config.zDistance * pos; + image.current.rot = config.rotation * -1; + } + } +} + +void YACReaderFlow3D::calcVector(YACReader3DVector &vector, int pos) +{ + calcPos(dummy, pos); + vector.x = dummy.current.x; + vector.y = dummy.current.y; + vector.z = dummy.current.z; + vector.rot = dummy.current.rot; +} + +bool YACReaderFlow3D::animate(YACReader3DVector ¤tVector, YACReader3DVector &toVector) +{ + float rotDiff = toVector.rot - currentVector.rot; + float xDiff = toVector.x - currentVector.x; + float yDiff = toVector.y - currentVector.y; + float zDiff = toVector.z - currentVector.z; + + if (fabs(rotDiff) < 0.01 && fabs(xDiff) < 0.001 && fabs(yDiff) < 0.001 && fabs(zDiff) < 0.001) + return true; + + currentVector.x = currentVector.x + (xDiff)*config.animationStep; + currentVector.y = currentVector.y + (yDiff)*config.animationStep; + currentVector.z = currentVector.z + (zDiff)*config.animationStep; + + if (fabs(rotDiff) > 0.01) { + currentVector.rot = currentVector.rot + (rotDiff) * (config.animationStep * config.preRotation); + } else { + viewRotateActive = 0; + } + + return false; +} + +void YACReaderFlow3D::showPrevious() +{ + startAnimationTimer(); + + if (currentSelected > 0) { + currentSelected--; + emit centerIndexChanged(currentSelected); + config.animationStep *= config.animationSpeedUp; + + if (config.animationStep > config.animationStepMax) { + config.animationStep = config.animationStepMax; + } + + if (viewRotateActive && viewRotate > -1) { + viewRotate -= config.viewRotateAdd; + } + + viewRotateActive = 1; + } +} + +void YACReaderFlow3D::showNext() +{ + startAnimationTimer(); + + if (currentSelected < numObjects - 1) { + currentSelected++; + emit centerIndexChanged(currentSelected); + config.animationStep *= config.animationSpeedUp; + + if (config.animationStep > config.animationStepMax) { + config.animationStep = config.animationStepMax; + } + + if (viewRotateActive && viewRotate < 1) { + viewRotate += config.viewRotateAdd; + } + + viewRotateActive = 1; + } +} + +void YACReaderFlow3D::setCurrentIndex(int pos) +{ + if (!(pos >= 0 && pos < images.length() && images.length() > 0)) + return; + if (pos >= images.length() && images.length() > 0) + pos = images.length() - 1; + + startAnimationTimer(); + + currentSelected = pos; + config.animationStep *= config.animationSpeedUp; + + if (config.animationStep > config.animationStepMax) { + config.animationStep = config.animationStepMax; + } + + if (viewRotateActive && viewRotate < 1) { + viewRotate += config.viewRotateAdd; + } + + viewRotateActive = 1; +} + +void YACReaderFlow3D::updatePositions() +{ + int count; + bool stopAnimation = true; + + for (count = numObjects - 1; count > -1; count--) { + calcVector(images[count].animEnd, count - currentSelected); + if (!animate(images[count].current, images[count].animEnd)) + stopAnimation = false; + } + + if (!viewRotateActive) { + viewRotate += (0 - viewRotate) * config.viewRotateSub; + } + + if (fabs(images[currentSelected].current.x - images[currentSelected].animEnd.x) < 1) { + cleanupAnimation(); + if (updateCount >= 0) { + updateCount = 0; + updateImageData(); + } else + updateCount++; + } else + updateCount++; + + if (stopAnimation) + stopAnimationTimer(); +} + +void YACReaderFlow3D::insert(QRhiTexture *texture, float x, float y, int item) +{ + startAnimationTimer(); + + if (item == -1) { + images.push_back(YACReader3DImageRHI()); + item = numObjects; + numObjects++; + calcVector(images[item].current, item); + images[item].current.z = images[item].current.z - 1; + } + + images[item].texture = texture; + images[item].width = x; + images[item].height = y; + images[item].index = item; +} + +void YACReaderFlow3D::remove(int item) +{ + if (item < 0 || item >= images.size()) + return; + + startAnimationTimer(); + + loaded.remove(item); + marks.remove(item); + + if (item <= currentSelected && currentSelected != 0) { + currentSelected--; + } + + QRhiTexture *texture = images[item].texture; + + int count = item; + while (count <= numObjects - 1) { + images[count].index--; + count++; + } + images.removeAt(item); + + if (texture != scene.defaultTexture.get()) { + // Remove shader bindings for this texture before deleting it + auto it = scene.shaderBindingsCache.find(texture); + if (it != scene.shaderBindingsCache.end()) { + delete it.value(); + scene.shaderBindingsCache.erase(it); + } + delete texture; + } + + numObjects--; +} + +void YACReaderFlow3D::add(int item) +{ + float x = 1; + float y = 1 * (700.f / 480.0f); + + images.insert(item, YACReader3DImageRHI()); + loaded.insert(item, false); + marks.insert(item, YACReader::Unread); + numObjects++; + + for (int i = item + 1; i < numObjects; i++) { + images[i].index++; + } + + insert(scene.defaultTexture.get(), x, y, item); +} + +YACReader3DImageRHI YACReaderFlow3D::getCurrentSelected() +{ + return images[currentSelected]; +} + +void YACReaderFlow3D::replace(QRhiTexture *texture, float x, float y, int item) +{ + startAnimationTimer(); + + if (images[item].index == item) { + images[item].texture = texture; + images[item].width = x; + images[item].height = y; + loaded[item] = true; + } else + loaded[item] = false; +} + +void YACReaderFlow3D::populate(int n) +{ + if (hasBeenInitialized) { + clear(); + } + emit centerIndexChanged(0); + + float x = 1; + float y = 1 * (700.f / 480.0f); + int i; + + for (i = 0; i < n; i++) { + insert(scene.defaultTexture.get(), x, y); + } + + loaded = QVector(n, false); +} + +void YACReaderFlow3D::reset() +{ + startAnimationTimer(); + + currentSelected = 0; + loaded.clear(); + marks.clear(); + + // Clean up image textures and remove their entries from shader bindings cache + for (int i = 0; i < numObjects; i++) { + if (images[i].texture != scene.defaultTexture.get()) { + // Remove shader bindings for this texture before deleting it + auto it = scene.shaderBindingsCache.find(images[i].texture); + if (it != scene.shaderBindingsCache.end()) { + delete it.value(); + scene.shaderBindingsCache.erase(it); + } + delete images[i].texture; + } + } + + numObjects = 0; + images.clear(); + + if (!hasBeenInitialized) + lazyPopulateObjects = -1; +} + +void YACReaderFlow3D::reload() +{ + startAnimationTimer(); + int n = numObjects; + reset(); + populate(n); +} + +// Slot implementations +void YACReaderFlow3D::setCF_RX(int value) +{ + startAnimationTimer(); + config.cfRX = value; +} + +void YACReaderFlow3D::setCF_RY(int value) +{ + startAnimationTimer(); + config.cfRY = value; +} + +void YACReaderFlow3D::setCF_RZ(int value) +{ + startAnimationTimer(); + config.cfRZ = value; +} + +void YACReaderFlow3D::setRotation(int angle) +{ + startAnimationTimer(); + config.rotation = -angle; +} + +void YACReaderFlow3D::setX_Distance(int distance) +{ + startAnimationTimer(); + config.xDistance = distance / 100.0; +} + +void YACReaderFlow3D::setCenter_Distance(int distance) +{ + startAnimationTimer(); + config.centerDistance = distance / 100.0; +} + +void YACReaderFlow3D::setZ_Distance(int distance) +{ + startAnimationTimer(); + config.zDistance = distance / 100.0; +} + +void YACReaderFlow3D::setCF_Y(int value) +{ + startAnimationTimer(); + config.cfY = value / 100.0; +} + +void YACReaderFlow3D::setCF_Z(int value) +{ + startAnimationTimer(); + config.cfZ = value; +} + +void YACReaderFlow3D::setY_Distance(int value) +{ + startAnimationTimer(); + config.yDistance = value / 100.0; +} + +void YACReaderFlow3D::setFadeOutDist(int value) +{ + startAnimationTimer(); + config.animationFadeOutDist = value; +} + +void YACReaderFlow3D::setLightStrenght(int value) +{ + startAnimationTimer(); + config.viewRotateLightStrenght = value; +} + +void YACReaderFlow3D::setMaxAngle(int value) +{ + startAnimationTimer(); + config.viewAngle = value; +} + +void YACReaderFlow3D::setPreset(const Preset &p) +{ + startAnimationTimer(); + config = p; +} + +void YACReaderFlow3D::setZoom(int zoom) +{ + startAnimationTimer(); + config.zoom = zoom; +} + +void YACReaderFlow3D::setPerformance(Performance performance) +{ + if (this->performance != performance) { + startAnimationTimer(); + this->performance = performance; + reload(); + } +} + +void YACReaderFlow3D::useVSync(bool b) +{ + // No-op for RHI - VSync is handled by the platform + Q_UNUSED(b); +} + +void YACReaderFlow3D::setShowMarks(bool value) +{ + startAnimationTimer(); + showMarks = value; +} + +void YACReaderFlow3D::setMarks(QVector marks) +{ + startAnimationTimer(); + this->marks = marks; +} + +void YACReaderFlow3D::setMarkImage(QImage &image) +{ + Q_UNUSED(image); +} + +void YACReaderFlow3D::markSlide(int index, YACReader::YACReaderComicReadStatus status) +{ + startAnimationTimer(); + marks[index] = status; +} + +void YACReaderFlow3D::unmarkSlide(int index) +{ + startAnimationTimer(); + marks[index] = YACReader::Unread; +} + +void YACReaderFlow3D::setSlideSize(QSize size) +{ + Q_UNUSED(size); +} + +void YACReaderFlow3D::clear() +{ + reset(); +} + +void YACReaderFlow3D::setCenterIndex(unsigned int index) +{ + setCurrentIndex(index); +} + +void YACReaderFlow3D::showSlide(int index) +{ + setCurrentIndex(index); +} + +int YACReaderFlow3D::centerIndex() +{ + return currentSelected; +} + +void YACReaderFlow3D::updateMarks() { } + +void YACReaderFlow3D::render() +{ + update(); +} + +void YACReaderFlow3D::resizeGL(int width, int height) +{ + Q_UNUSED(width); + Q_UNUSED(height); + // No-op for RHI - handled automatically +} + +void YACReaderFlow3D::setFlowRightToLeft(bool b) +{ + flowRightToLeft = b; +} + +void YACReaderFlow3D::setBackgroundColor(const QColor &color) +{ + backgroundColor = color; + update(); +} + +void YACReaderFlow3D::setTextColor(const QColor &color) +{ + textColor = color; + + auto styleSheet = QString("QLabel { color: %1; }").arg(textColor.name()); + indexLabel->setStyleSheet(styleSheet); + + update(); +} + +void YACReaderFlow3D::setRibbonImages(const QImage &readImage, const QImage &readingImage) +{ + readRibbonImage = readImage.convertToFormat(QImage::Format_RGBA8888); + readingRibbonImage = readingImage.convertToFormat(QImage::Format_RGBA8888); +#ifdef YACREADER_LIBRARY + ribbonTexturesDirty = true; +#else + ribbonTexturesDirty = false; +#endif + + update(); +} + +// Event handlers +void YACReaderFlow3D::wheelEvent(QWheelEvent *event) +{ + Movement m = getMovement(event); + switch (m) { + case None: + return; + case Forward: + showNext(); + break; + case Backward: + showPrevious(); + break; + default: + break; + } +} + +void YACReaderFlow3D::keyPressEvent(QKeyEvent *event) +{ + if ((event->key() == Qt::Key_Left && !flowRightToLeft) || (event->key() == Qt::Key_Right && flowRightToLeft)) { + if (event->modifiers() == Qt::ControlModifier) + setCurrentIndex((currentSelected - 10 < 0) ? 0 : currentSelected - 10); + else + showPrevious(); + event->accept(); + return; + } + + if ((event->key() == Qt::Key_Right && !flowRightToLeft) || (event->key() == Qt::Key_Left && flowRightToLeft)) { + if (event->modifiers() == Qt::ControlModifier) + setCurrentIndex((currentSelected + 10 >= numObjects) ? numObjects - 1 : currentSelected + 10); + else + showNext(); + event->accept(); + return; + } + + if (event->key() == Qt::Key_Up) { + return; + } + + event->ignore(); +} + +void YACReaderFlow3D::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton && currentSelected >= 0 && currentSelected < images.size()) { + auto position = event->position(); + QVector3D intersection = getPlaneIntersection(position.x(), position.y(), images[currentSelected]); + if ((intersection.x() > 0.5 && !flowRightToLeft) || (intersection.x() < -0.5 && flowRightToLeft)) { + showNext(); + } else if ((intersection.x() < -0.5 && !flowRightToLeft) || (intersection.x() > 0.5 && flowRightToLeft)) { + showPrevious(); + } + } else { + QRhiWidget::mousePressEvent(event); + } +} + +void YACReaderFlow3D::mouseDoubleClickEvent(QMouseEvent *event) +{ + if (currentSelected >= 0 && currentSelected < images.size()) { + auto position = event->position(); + QVector3D intersection = getPlaneIntersection(position.x(), position.y(), images[currentSelected]); + + if (intersection.x() < 0.5 && intersection.x() > -0.5) { + emit selected(centerIndex()); + event->accept(); + } + } +} + +QVector3D YACReaderFlow3D::getPlaneIntersection(int x, int y, YACReader3DImageRHI plane) +{ + // Simplified for now - proper ray-plane intersection calculation needed + // This requires access to the viewport and matrices + const QSize outputSize = renderTarget()->pixelSize(); + + QMatrix4x4 m_projection; + m_projection.perspective(config.zoom, float(outputSize.width()) / float(outputSize.height()), 1.0, 200.0); + + QMatrix4x4 m_modelview; + m_modelview.translate(config.cfX, config.cfY, config.cfZ); + m_modelview.rotate(config.cfRX, 1, 0, 0); + m_modelview.rotate(viewRotate * config.viewAngle + config.cfRY, 0, 1, 0); + m_modelview.rotate(config.cfRZ, 0, 0, 1); + m_modelview.translate(plane.current.x, plane.current.y, plane.current.z); + m_modelview.rotate(plane.current.rot, 0, 1, 0); + m_modelview.scale(plane.width, plane.height, 1.0f); + + QVector3D ray_origin(x * devicePixelRatioF(), y * devicePixelRatioF(), 0); + QVector3D ray_end(x * devicePixelRatioF(), y * devicePixelRatioF(), 1.0); + + ray_origin = ray_origin.unproject(m_modelview, m_projection, QRect(0, 0, outputSize.width(), outputSize.height())); + ray_end = ray_end.unproject(m_modelview, m_projection, QRect(0, 0, outputSize.width(), outputSize.height())); + + QVector3D ray_vector = ray_end - ray_origin; + + QVector3D plane_origin(-0.5f, -0.5f, 0); + QVector3D plane_vektor_1 = QVector3D(0.5f, -0.5f, 0) - plane_origin; + QVector3D plane_vektor_2 = QVector3D(-0.5f, 0.5f, 0) - plane_origin; + + double intersection_LES_determinant = ((plane_vektor_1.x() * plane_vektor_2.y() * (-1) * ray_vector.z()) + + (plane_vektor_2.x() * (-1) * ray_vector.y() * plane_vektor_1.z()) + + ((-1) * ray_vector.x() * plane_vektor_1.y() * plane_vektor_2.z()) - + ((-1) * ray_vector.x() * plane_vektor_2.y() * plane_vektor_1.z()) - + (plane_vektor_1.x() * (-1) * ray_vector.y() * plane_vektor_2.z()) - + (plane_vektor_2.x() * plane_vektor_1.y() * (-1) * ray_vector.z())); + + QVector3D det = ray_origin - plane_origin; + + double intersection_ray_determinant = ((plane_vektor_1.x() * plane_vektor_2.y() * det.z()) + + (plane_vektor_2.x() * det.y() * plane_vektor_1.z()) + + (det.x() * plane_vektor_1.y() * plane_vektor_2.z()) - + (det.x() * plane_vektor_2.y() * plane_vektor_1.z()) - + (plane_vektor_1.x() * det.y() * plane_vektor_2.z()) - + (plane_vektor_2.x() * plane_vektor_1.y() * det.z())); + + return ray_origin + ray_vector * (intersection_ray_determinant / intersection_LES_determinant); +} + +void YACReaderFlow3D::updateIndexLabel() +{ + int currentDisplay = currentSelected + 1; + int totalDisplay = numObjects; + + if (indexLabelState.current != currentDisplay || indexLabelState.total != totalDisplay) { + indexLabelState.current = currentDisplay; + indexLabelState.total = totalDisplay; + indexLabel->setText(QString("%1/%2").arg(currentDisplay).arg(totalDisplay)); + indexLabel->adjustSize(); + } +} + +void YACReaderFlow3D::updateIndexLabelStyle() +{ + int w = width(); + int h = height(); + + int newFontSize = static_cast((w + h) * 0.010); + if (newFontSize < 10) + newFontSize = 10; + + QFont font("Arial", newFontSize); + indexLabel->setFont(font); + + auto styleSheet = QString("QLabel { color: %1; }").arg(textColor.name()); + indexLabel->setStyleSheet(styleSheet); + + indexLabel->move(10, 10); + indexLabel->adjustSize(); + + // Position and style performance label below index label +#if defined(YACREADER_RHI_PERF) + if (perfLabel) { + perfLabel->setFont(font); + perfLabel->setStyleSheet(styleSheet); + perfLabel->move(10, 10 + indexLabel->height() + 4); + perfLabel->adjustSize(); + } +#endif +} + +QSize YACReaderFlow3D::minimumSizeHint() const +{ + return QSize(320, 200); +} diff --git a/common/rhi/yacreader_flow_rhi.h b/common/rhi/yacreader_flow_rhi.h new file mode 100644 index 000000000..a1062bbb3 --- /dev/null +++ b/common/rhi/yacreader_flow_rhi.h @@ -0,0 +1,312 @@ +// Qt RHI-based Coverflow for YACReader +// Compatible with Qt 6.7+ using QRhiWidget +#ifndef __YACREADER_FLOW_RHI_H +#define __YACREADER_FLOW_RHI_H + +#include + +#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + +#include "flow_types.h" +#include "scroll_management.h" +#include "yacreader_global.h" + +#include + +#include + +// the image/texture info struct +struct YACReader3DImageRHI { + QRhiTexture *texture; + + float width; + float height; + + // Precomputed bounding sphere radius (world-space) for fast culling + float boundingRadius; + + int index; + + YACReader3DVector current; + YACReader3DVector animEnd; +}; + +class QLabel; +class ImageLoader3D; +class ImageLoaderByteArray3D; +class YACReaderComicFlow3D; +class YACReaderPageFlow3D; + +class YACReaderFlow3D : public QRhiWidget, public ScrollManagement +{ + Q_OBJECT + +protected: + int timerId; + + YACReader3DImageRHI dummy; + int viewRotateActive; + float stepBackup; + + void calcPos(YACReader3DImageRHI &image, int pos); + void calcVector(YACReader3DVector &vector, int pos); + bool animate(YACReader3DVector ¤tVector, YACReader3DVector &toVector); + void prepareInstanceData(const YACReader3DImageRHI &image, bool isReflection, QVector &data); + + int updateCount; + int fontSize; + + // Cached state for the index label to avoid unnecessary updates + struct IndexLabelState { + int current = -1; + int total = -1; + }; + + // Uniform buffer data structure (must match shader layout) + struct UniformData { + float viewProjectionMatrix[16]; // column-major 4x4 + float backgroundColor[3]; + float _pad0; // pad to vec4 + float reflectionUp; + float reflectionDown; + float isReflection; + float _pad1; + }; + + // Pending texture uploads (for async image loading) + struct PendingTextureUpload { + int index; + QImage image; + float x; + float y; + }; + + // Scene struct encapsulating all RHI resources + struct Scene { + // Textures + std::unique_ptr defaultTexture; + std::unique_ptr markTexture; + std::unique_ptr readingTexture; + + // Buffers + std::unique_ptr vertexBuffer; + std::unique_ptr instanceBuffer; + std::unique_ptr uniformBuffer; + + // Pipeline and bindings + std::unique_ptr sampler; + std::unique_ptr pipeline; + std::unique_ptr shaderBindings; + + // Cache of shader resource bindings per texture (raw pointers, owned by this struct) + QMap shaderBindingsCache; + + // Uniform buffer sizing + int alignedUniformSize = 0; + int uniformBufferCapacity = 0; + + // Pending resource updates (accumulated between frames) + QRhiResourceUpdateBatch *resourceUpdates = nullptr; + + // Reset all resources (cleans up cache manually) + void reset() + { + qDeleteAll(shaderBindingsCache); + shaderBindingsCache.clear(); + defaultTexture.reset(); + markTexture.reset(); + readingTexture.reset(); + vertexBuffer.reset(); + instanceBuffer.reset(); + uniformBuffer.reset(); + sampler.reset(); + pipeline.reset(); + shaderBindings.reset(); + alignedUniformSize = 0; + uniformBufferCapacity = 0; + resourceUpdates = nullptr; + } + }; + + Scene scene; + QVector pendingTextureUploads; + + // Index label (shows "current/total" in top-left corner) + QLabel *indexLabel = nullptr; + IndexLabelState indexLabelState; + +#if defined(YACREADER_RHI_PERF) + // Performance label (shows averaged render time) + QLabel *perfLabel = nullptr; + + // Performance measurement state + double perfAccumMs = 0.0; // accumulated ms over samples + int perfAccumCount = 0; // number of samples accumulated + int perfFrameCounter = 0; // frames since last label update + int perfUpdateEvery = 30; // update label every N frames (reduce overhead) + double lastRenderMs = 0.0; // last averaged render time in ms +#endif + + void timerEvent(QTimerEvent *) override; + + int numObjects; + int lazyPopulateObjects; + bool showMarks; + QVector loaded; + QVector marks; + + QVector images; + + bool hasBeenInitialized; + + Performance performance; + + /*** Animation Settings ***/ + Preset config; + + int currentSelected; + + YACReader3DVector centerPos; + + /*** Style ***/ + float shadingTop; + float shadingBottom; + + float reflectionUp; + float reflectionBottom; + + /*** Theme Colors ***/ + QColor backgroundColor; + QColor textColor; + + QImage readRibbonImage; + QImage readingRibbonImage; + bool ribbonTexturesDirty = false; + + /*** System info ***/ + float viewRotate; + + static int updateInterval; + + bool flowRightToLeft; + + void startAnimationTimer(); + void stopAnimationTimer(); + + // QRhiWidget overrides + void initialize(QRhiCommandBuffer *cb) override; + void render(QRhiCommandBuffer *cb) override; + void releaseResources() override; + void showEvent(QShowEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + + // Index label helpers + void updateIndexLabel(); + void updateIndexLabelStyle(); + + // Helper methods + QRhiTexture *createTextureFromImage(QRhiCommandBuffer *cb, const QImage &image); + void removeCachedShaderBindings(QRhiTexture *texture); + void syncRibbonTextures(QRhiResourceUpdateBatch *batch); + void updateUniformBuffer(QRhiCommandBuffer *cb, const UniformData &data); + void prepareMarkInstanceData(const YACReader3DImageRHI &image, QVector &data); + void ensureUniformBufferCapacity(int requiredSlots); + void ensurePipeline(); + void prepareDrawData(const YACReader3DImageRHI &image, bool isReflection, bool isMark, + const QMatrix4x4 &viewProjectionMatrix, float *outInstanceData, + UniformData &outUniformData); + QMatrix4x4 buildModelMatrix(const YACReader3DImageRHI &image, bool isReflection, bool isMark); + QMatrix4x4 buildModelMatrixNoScale(const YACReader3DImageRHI &image, bool isReflection, bool isMark); + void executeDrawWithOffset(QRhiCommandBuffer *cb, QRhiTexture *texture, + const float *instanceData, int uniformSlot); + +protected: + QRhi *m_rhi = nullptr; + +public: + YACReaderFlow3D(QWidget *parent = nullptr, struct Preset p = pressetYACReaderFlowDownConfig); + virtual ~YACReaderFlow3D(); + + QSize minimumSizeHint() const override; + + void showPrevious(); + void showNext(); + void setCurrentIndex(int pos); + void cleanupAnimation(); + void draw(); + void updatePositions(); + void insert(QRhiTexture *texture, float x, float y, int item = -1); + virtual void remove(int item); + void add(int item); + void replace(QRhiTexture *texture, float x, float y, int item); + void populate(int n); + YACReader3DImageRHI getCurrentSelected(); + +public slots: + void setCF_RX(int value); + void setCF_RY(int value); + void setCF_RZ(int value); + void setZoom(int zoom); + void setRotation(int angle); + void setX_Distance(int distance); + void setCenter_Distance(int distance); + void setZ_Distance(int distance); + void setCF_Y(int value); + void setCF_Z(int value); + void setY_Distance(int value); + void setFadeOutDist(int value); + void setLightStrenght(int value); + void setMaxAngle(int value); + void setPreset(const Preset &p); + void setPerformance(Performance performance); + void useVSync(bool b); // Compatibility method (no-op for RHI) + void setFlowRightToLeft(bool b); + + // Theme color setters + void setBackgroundColor(const QColor &color); + void setTextColor(const QColor &color); + + // Ribbon image setters (for themed SVG rasterized images) + void setRibbonImages(const QImage &readImage, const QImage &readingImage); + + virtual void updateImageData() = 0; + + void reset(); + void reload(); + + void setShowMarks(bool value); + void setMarks(QVector marks); + void setMarkImage(QImage &image); + void markSlide(int index, YACReader::YACReaderComicReadStatus status); + void unmarkSlide(int index); + void setSlideSize(QSize size); + void clear(); + void setCenterIndex(unsigned int index); + void showSlide(int index); + int centerIndex(); + void updateMarks(); + void render(); // Compatibility method (triggers update()) + void resizeGL(int width, int height); // Compatibility method (no-op for RHI) + + QVector3D getPlaneIntersection(int x, int y, YACReader3DImageRHI plane); + void mouseDoubleClickEvent(QMouseEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + + friend class ImageLoader3D; + friend class ImageLoaderByteArray3D; + +signals: + void centerIndexChanged(int); + void selected(unsigned int); +}; + +/* Derived flow & loader classes moved to dedicated files: + - common/rhi/yacreader_comic_flow_rhi.h/.cpp + - common/rhi/yacreader_page_flow_rhi.h/.cpp +*/ + +#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + +#endif // __YACREADER_FLOW_RHI_H diff --git a/common/rhi/yacreader_page_flow_rhi.cpp b/common/rhi/yacreader_page_flow_rhi.cpp new file mode 100644 index 000000000..f4af58d91 --- /dev/null +++ b/common/rhi/yacreader_page_flow_rhi.cpp @@ -0,0 +1,203 @@ +#include "yacreader_page_flow_rhi.h" + +#include + +// YACReaderPageFlow3D implementation +YACReaderPageFlow3D::YACReaderPageFlow3D(QWidget *parent, struct Preset p) + : YACReaderFlow3D(parent, p) +{ + worker = new ImageLoaderByteArray3D(this); + worker->flow = this; +} + +YACReaderPageFlow3D::~YACReaderPageFlow3D() +{ + if (timerId != -1) { + this->killTimer(timerId); + timerId = -1; + } + rawImages.clear(); + + // Clean up textures and clear images to prevent double-delete in base destructor + for (auto &image : images) { + if (image.texture != scene.defaultTexture.get()) { + delete image.texture; + } + } + images.clear(); + numObjects = 0; +} + +void YACReaderPageFlow3D::updateImageData() +{ + if (worker->busy()) + return; + + int idx = worker->index(); + if (idx >= 0 && !worker->result().isNull()) { + if (!loaded[idx]) { + float x = 1; + QImage img = worker->result(); + + // Create QRhiTexture from the loaded image and queue the pixel upload + if (m_rhi) { + QRhiTexture *texture = m_rhi->newTexture(QRhiTexture::RGBA8, img.size(), 1, QRhiTexture::MipMapped | QRhiTexture::UsedWithGenerateMips); + + if (texture->create()) { + // Queue the image upload so it happens together with other resource updates + PendingTextureUpload upload; + upload.index = idx; + upload.image = img; + upload.x = x; + upload.y = 1 * (float(img.height()) / img.width()); + pendingTextureUploads.append(upload); + + replace(texture, upload.x, upload.y, idx); + } + } + } + } + + int count = 8; + switch (performance) { + case low: + count = 8; + break; + case medium: + count = 10; + break; + case high: + count = 12; + break; + case ultraHigh: + count = 14; + break; + } + + int *indexes = new int[2 * count + 1]; + int center = currentSelected; + indexes[0] = center; + for (int j = 0; j < count; j++) { + indexes[j * 2 + 1] = center + j + 1; + indexes[j * 2 + 2] = center - j - 1; + } + + for (int c = 0; c < 2 * count + 1; c++) { + int i = indexes[c]; + if ((i >= 0) && (i < numObjects)) + if (rawImages.size() > 0) + if (!loaded[i] && imagesReady[i]) { + worker->generate(i, rawImages.at(i)); + delete[] indexes; + return; + } + } + + delete[] indexes; +} + +void YACReaderPageFlow3D::populate(int n) +{ + worker->reset(); + reset(); + numObjects = 0; + + if (hasBeenInitialized) { + YACReaderFlow3D::populate(n); + } else { + lazyPopulateObjects = n; + } + + imagesReady = QVector(n, false); + rawImages = QVector(n); + imagesSetted = QVector(n, false); +} + +// ImageLoaderByteArray3D implementation +QImage ImageLoaderByteArray3D::loadImage(const QByteArray &raw) +{ + QImage image; + + if (!image.loadFromData(raw)) { + return QImage(); + } + + switch (flow->performance) { + case low: + image = image.scaledToWidth(128, Qt::SmoothTransformation); + break; + case medium: + image = image.scaledToWidth(196, Qt::SmoothTransformation); + break; + case high: + image = image.scaledToWidth(256, Qt::SmoothTransformation); + break; + case ultraHigh: + image = image.scaledToWidth(320, Qt::SmoothTransformation); + break; + } + + return image.convertToFormat(QImage::Format_RGBA8888); +} + +ImageLoaderByteArray3D::ImageLoaderByteArray3D(YACReaderFlow3D *flow) + : QThread(), flow(flow), restart(false), working(false), idx(-1) +{ +} + +ImageLoaderByteArray3D::~ImageLoaderByteArray3D() +{ + mutex.lock(); + condition.wakeOne(); + mutex.unlock(); + wait(); +} + +bool ImageLoaderByteArray3D::busy() const +{ + return isRunning() ? working : false; +} + +void ImageLoaderByteArray3D::generate(int index, const QByteArray &raw) +{ + mutex.lock(); + this->idx = index; + this->rawData = raw; + this->img = QImage(); + mutex.unlock(); + + if (!isRunning()) + start(); + else { + restart = true; + condition.wakeOne(); + } +} + +void ImageLoaderByteArray3D::run() +{ + for (;;) { + mutex.lock(); + this->working = true; + QByteArray raw = this->rawData; + mutex.unlock(); + + QImage image = loadImage(raw); + + mutex.lock(); + this->working = false; + this->img = image; + mutex.unlock(); + + mutex.lock(); + if (!this->restart) + condition.wait(&mutex); + restart = false; + mutex.unlock(); + } +} + +QImage ImageLoaderByteArray3D::result() +{ + return img; +} diff --git a/common/rhi/yacreader_page_flow_rhi.h b/common/rhi/yacreader_page_flow_rhi.h new file mode 100644 index 000000000..6ec70f9ae --- /dev/null +++ b/common/rhi/yacreader_page_flow_rhi.h @@ -0,0 +1,58 @@ +#ifndef __YACREADER_PAGE_FLOW_RHI_H +#define __YACREADER_PAGE_FLOW_RHI_H + +#include "yacreader_flow_rhi.h" + +#include +#include + +class ImageLoaderByteArray3D; + +class YACReaderPageFlow3D : public YACReaderFlow3D +{ +public: + YACReaderPageFlow3D(QWidget *parent = nullptr, struct Preset p = defaultYACReaderFlowConfig); + ~YACReaderPageFlow3D(); + void updateImageData() override; + void populate(int n); + QVector imagesReady; + QVector rawImages; + QVector imagesSetted; + friend class ImageLoaderByteArray3D; + +private: + ImageLoaderByteArray3D *worker; +}; + +class ImageLoaderByteArray3D : public QThread +{ +public: + ImageLoaderByteArray3D(YACReaderFlow3D *flow); + ~ImageLoaderByteArray3D(); + bool busy() const; + void generate(int index, const QByteArray &raw); + void reset() + { + idx = -1; + rawData.clear(); + } + int index() const { return idx; } + QImage result(); + YACReaderFlow3D *flow; + QImage loadImage(const QByteArray &rawData); + +protected: + void run() override; + +private: + QMutex mutex; + QWaitCondition condition; + + bool restart; + bool working; + int idx; + QByteArray rawData; + QImage img; +}; + +#endif // __YACREADER_PAGE_FLOW_RHI_H diff --git a/common/scroll_management.cpp b/common/scroll_management.cpp index 6bdef5cd6..f8e2683ef 100644 --- a/common/scroll_management.cpp +++ b/common/scroll_management.cpp @@ -1,5 +1,5 @@ #include "scroll_management.h" -#include + #include ScrollManagement::ScrollManagement() diff --git a/common/themes/appearance_configuration.cpp b/common/themes/appearance_configuration.cpp new file mode 100644 index 000000000..dade4c262 --- /dev/null +++ b/common/themes/appearance_configuration.cpp @@ -0,0 +1,96 @@ +#include "appearance_configuration.h" + +#include + +static constexpr auto kGroup = "Appearance"; +static constexpr auto kMode = "ThemeMode"; +static constexpr auto kLightId = "LightThemeId"; +static constexpr auto kDarkId = "DarkThemeId"; +static constexpr auto kFixedId = "FixedThemeId"; + +static QString themeModeToString(ThemeMode mode) +{ + switch (mode) { + case ThemeMode::FollowSystem: + return "FollowSystem"; + case ThemeMode::Light: + return "Light"; + case ThemeMode::Dark: + return "Dark"; + case ThemeMode::ForcedTheme: + return "ForcedTheme"; + } + return "FollowSystem"; +} + +static ThemeMode themeModeFromString(const QString &s) +{ + if (s == "Light") + return ThemeMode::Light; + if (s == "Dark") + return ThemeMode::Dark; + if (s == "ForcedTheme") + return ThemeMode::ForcedTheme; + return ThemeMode::FollowSystem; +} + +AppearanceConfiguration::AppearanceConfiguration(const QString &settingsFilePath, QObject *parent) + : QObject(parent), path(settingsFilePath) +{ + load(); +} + +void AppearanceConfiguration::load() +{ + QSettings s(path, QSettings::IniFormat); + s.beginGroup(kGroup); + sel.mode = themeModeFromString(s.value(kMode, "FollowSystem").toString()); + sel.lightThemeId = s.value(kLightId, sel.lightThemeId).toString(); + sel.darkThemeId = s.value(kDarkId, sel.darkThemeId).toString(); + sel.fixedThemeId = s.value(kFixedId, sel.fixedThemeId).toString(); + s.endGroup(); +} + +void AppearanceConfiguration::write(const QString &key, const QString &value) +{ + QSettings s(path, QSettings::IniFormat); + s.beginGroup(kGroup); + s.setValue(key, value); + s.endGroup(); +} + +void AppearanceConfiguration::setMode(ThemeMode mode) +{ + if (sel.mode == mode) + return; + sel.mode = mode; + write(kMode, themeModeToString(mode)); + emit selectionChanged(); +} + +void AppearanceConfiguration::setLightThemeId(const QString &id) +{ + if (sel.lightThemeId == id) + return; + sel.lightThemeId = id; + write(kLightId, id); + emit selectionChanged(); +} + +void AppearanceConfiguration::setDarkThemeId(const QString &id) +{ + if (sel.darkThemeId == id) + return; + sel.darkThemeId = id; + write(kDarkId, id); + emit selectionChanged(); +} + +void AppearanceConfiguration::setFixedThemeId(const QString &id) +{ + if (sel.fixedThemeId == id) + return; + sel.fixedThemeId = id; + write(kFixedId, id); + emit selectionChanged(); +} diff --git a/common/themes/appearance_configuration.h b/common/themes/appearance_configuration.h new file mode 100644 index 000000000..bcc4d501f --- /dev/null +++ b/common/themes/appearance_configuration.h @@ -0,0 +1,48 @@ +#ifndef APPEARANCE_CONFIGURATION_H +#define APPEARANCE_CONFIGURATION_H + +#include +#include + +enum class ThemeMode { + FollowSystem, + Light, + Dark, + ForcedTheme, +}; + +struct ThemeSelection { + ThemeMode mode = ThemeMode::FollowSystem; + QString lightThemeId = "builtin/light"; + QString darkThemeId = "builtin/dark"; + QString fixedThemeId = "builtin/classic"; +}; + +// Persists theme selection settings to a QSettings INI file under the +// [Appearance] group. All access is on-demand (no persistent QSettings handle) +// so the caller does not need to manage a QSettings lifetime. +class AppearanceConfiguration : public QObject +{ + Q_OBJECT +public: + explicit AppearanceConfiguration(const QString &settingsFilePath, QObject *parent = nullptr); + + ThemeSelection selection() const { return sel; } + + void setMode(ThemeMode mode); + void setLightThemeId(const QString &id); + void setDarkThemeId(const QString &id); + void setFixedThemeId(const QString &id); + +signals: + void selectionChanged(); + +private: + QString path; + ThemeSelection sel; + + void load(); + void write(const QString &key, const QString &value); +}; + +#endif // APPEARANCE_CONFIGURATION_H diff --git a/common/themes/appearance_tab_widget.cpp b/common/themes/appearance_tab_widget.cpp new file mode 100644 index 000000000..387ac0944 --- /dev/null +++ b/common/themes/appearance_tab_widget.cpp @@ -0,0 +1,332 @@ +#include "appearance_tab_widget.h" + +#include "appearance_configuration.h" +#include "theme_editor_dialog.h" +#include "theme_repository.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Select the item in combo whose UserRole data matches id (no-op if not found). +static void selectInCombo(QComboBox *combo, const QString &id) +{ + for (int i = 0; i < combo->count(); ++i) { + if (combo->itemData(i).toString() == id) { + combo->setCurrentIndex(i); + return; + } + } +} + +AppearanceTabWidget::AppearanceTabWidget( + AppearanceConfiguration *config, + ThemeRepository *repository, + std::function currentThemeJson, + std::function applyTheme, + QWidget *parent) + : QWidget(parent), config(config), repository(repository), currentThemeJson(std::move(currentThemeJson)), applyTheme(std::move(applyTheme)) +{ + // --- Color scheme selector --- + auto *modeBox = new QGroupBox(tr("Color scheme"), this); + auto *modeLayout = new QHBoxLayout(); + + auto *sysBtn = new QToolButton(); + auto *lightBtn = new QToolButton(); + auto *darkBtn = new QToolButton(); + auto *customBtn = new QToolButton(); + + sysBtn->setText(tr("System")); + lightBtn->setText(tr("Light")); + darkBtn->setText(tr("Dark")); + customBtn->setText(tr("Custom")); + + sysBtn->setIcon(QIcon(":/images/appearance_config/theme-mode-system.svg")); + lightBtn->setIcon(QIcon(":/images/appearance_config/theme-mode-light.svg")); + darkBtn->setIcon(QIcon(":/images/appearance_config/theme-mode-dark.svg")); + customBtn->setIcon(QIcon(":/images/appearance_config/theme-mode-custom.svg")); + + for (auto *btn : { sysBtn, lightBtn, darkBtn, customBtn }) { + btn->setCheckable(true); + btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + btn->setIconSize(QSize(93, 58)); + btn->setMinimumSize(115, 90); + } + + auto *modeGroup = new QButtonGroup(this); + modeGroup->addButton(sysBtn, static_cast(ThemeMode::FollowSystem)); + modeGroup->addButton(lightBtn, static_cast(ThemeMode::Light)); + modeGroup->addButton(darkBtn, static_cast(ThemeMode::Dark)); + modeGroup->addButton(customBtn, static_cast(ThemeMode::ForcedTheme)); + modeGroup->setExclusive(true); + + if (this->config) { + const auto mode = this->config->selection().mode; + if (auto *btn = modeGroup->button(static_cast(mode))) + btn->setChecked(true); + } + + connect(modeGroup, &QButtonGroup::idClicked, this, [this](int id) { + if (this->config) { + this->config->setMode(static_cast(id)); + updateModeRows(); + } + }); + + modeLayout->addStretch(); + modeLayout->addWidget(sysBtn); + modeLayout->addWidget(lightBtn); + modeLayout->addWidget(darkBtn); + modeLayout->addWidget(customBtn); + modeLayout->addStretch(); + modeBox->setLayout(modeLayout); + + // --- Theme selection --- + // Each row: [label fixed] [combo expanding] [Remove btn] + // Rows are shown/hidden based on mode — only relevant ones are visible. + auto makeRow = [](const QString &label, QComboBox *&combo, QPushButton *&deleteBtn) { + auto *row = new QWidget(); + auto *hl = new QHBoxLayout(row); + hl->setContentsMargins(0, 0, 0, 0); + + auto *lbl = new QLabel(label); + lbl->setFixedWidth(52); + + combo = new QComboBox(); + combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + + deleteBtn = new QPushButton(tr("Remove")); + deleteBtn->setEnabled(false); + deleteBtn->setToolTip(tr("Remove this user-imported theme")); + + hl->addWidget(lbl); + hl->addWidget(combo); + hl->addWidget(deleteBtn); + return row; + }; + + lightRow = makeRow(tr("Light:"), lightCombo, lightDeleteBtn); + darkRow = makeRow(tr("Dark:"), darkCombo, darkDeleteBtn); + customRow = makeRow(tr("Custom:"), customCombo, customDeleteBtn); + + auto *importBtn = new QPushButton(tr("Import theme...")); + + auto *themeSelBox = new QGroupBox(tr("Theme"), this); + auto *themeSelLayout = new QVBoxLayout(); + themeSelLayout->addWidget(lightRow); + themeSelLayout->addWidget(darkRow); + themeSelLayout->addWidget(customRow); + themeSelLayout->addWidget(importBtn, 0, Qt::AlignRight); + themeSelBox->setLayout(themeSelLayout); + + // Populate combos and set initial row visibility + if (this->config && this->repository) { + const auto &sel = this->config->selection(); + populateCombo(lightCombo, ThemeVariant::Light, sel.lightThemeId); + populateCombo(darkCombo, ThemeVariant::Dark, sel.darkThemeId); + populateCombo(customCombo, std::nullopt, sel.fixedThemeId); + updateDeleteButton(lightCombo, lightDeleteBtn); + updateDeleteButton(darkCombo, darkDeleteBtn); + updateDeleteButton(customCombo, customDeleteBtn); + updateModeRows(); + } + + // Combo selection → update config (live theme preview via selectionChanged chain) + connect(lightCombo, &QComboBox::currentIndexChanged, this, [this](int) { + if (!this->config) + return; + this->config->setLightThemeId(lightCombo->currentData().toString()); + updateDeleteButton(lightCombo, lightDeleteBtn); + }); + connect(darkCombo, &QComboBox::currentIndexChanged, this, [this](int) { + if (!this->config) + return; + this->config->setDarkThemeId(darkCombo->currentData().toString()); + updateDeleteButton(darkCombo, darkDeleteBtn); + }); + connect(customCombo, &QComboBox::currentIndexChanged, this, [this](int) { + if (!this->config) + return; + this->config->setFixedThemeId(customCombo->currentData().toString()); + updateDeleteButton(customCombo, customDeleteBtn); + }); + + // Delete buttons + connect(lightDeleteBtn, &QPushButton::clicked, this, + [this]() { deleteTheme(lightCombo, lightDeleteBtn); }); + connect(darkDeleteBtn, &QPushButton::clicked, this, + [this]() { deleteTheme(darkCombo, darkDeleteBtn); }); + connect(customDeleteBtn, &QPushButton::clicked, this, + [this]() { deleteTheme(customCombo, customDeleteBtn); }); + + // Import + connect(importBtn, &QPushButton::clicked, this, &AppearanceTabWidget::importTheme); + + // --- Theme editor --- + auto *themeEditorBox = new QGroupBox(tr("Theme editor"), this); + auto *themeEditorLayout = new QVBoxLayout(); + auto *openBtn = new QPushButton(tr("Open Theme Editor...")); + themeEditorLayout->addWidget(openBtn); + themeEditorBox->setLayout(themeEditorLayout); + + connect(openBtn, &QPushButton::clicked, this, [this]() { + if (!themeEditor) { + QJsonObject json = this->currentThemeJson(); + if (json.isEmpty()) { + QMessageBox::critical(this, + tr("Theme editor error"), + tr("The current theme JSON could not be loaded.")); + return; + } + themeEditor = new ThemeEditorDialog(json, this); + themeEditor->setAttribute(Qt::WA_DeleteOnClose); + connect(themeEditor, &ThemeEditorDialog::themeJsonChanged, this, + [this](const QJsonObject &json) { this->applyTheme(json); }); + connect(themeEditor, &ThemeEditorDialog::saveToLibraryRequested, this, + [this](const QJsonObject &json) { + if (!this->repository) + return; + const QString id = this->repository->saveUserTheme(json); + this->repopulateCombos(); + const bool isLight = (json["meta"].toObject()["variant"].toString() == "light"); + if (isLight) + selectInCombo(this->lightCombo, id); + else + selectInCombo(this->darkCombo, id); + if (this->config && this->config->selection().mode == ThemeMode::ForcedTheme) + selectInCombo(this->customCombo, id); + if (this->themeEditor) + this->themeEditor->updateSavedId(id); + }); + } + themeEditor->show(); + themeEditor->raise(); + themeEditor->activateWindow(); + }); + + auto *layout = new QVBoxLayout(this); + layout->addWidget(modeBox); + layout->addWidget(themeSelBox); + layout->addWidget(themeEditorBox); + layout->addStretch(); +} + +void AppearanceTabWidget::populateCombo(QComboBox *combo, + std::optional variantFilter, + const QString &selectedId) +{ + QSignalBlocker blocker(combo); + combo->clear(); + if (!repository) + return; + + for (const auto &entry : repository->availableThemes()) { + if (variantFilter && entry.variant != *variantFilter) + continue; + combo->addItem(entry.displayName, entry.id); + } + + // Restore selection; fall back to first item if the saved ID is no longer present + for (int i = 0; i < combo->count(); ++i) { + if (combo->itemData(i).toString() == selectedId) { + combo->setCurrentIndex(i); + return; + } + } + if (combo->count() > 0) + combo->setCurrentIndex(0); +} + +void AppearanceTabWidget::repopulateCombos() +{ + if (!config) + return; + const auto &sel = config->selection(); + populateCombo(lightCombo, ThemeVariant::Light, sel.lightThemeId); + populateCombo(darkCombo, ThemeVariant::Dark, sel.darkThemeId); + populateCombo(customCombo, std::nullopt, sel.fixedThemeId); + updateDeleteButton(lightCombo, lightDeleteBtn); + updateDeleteButton(darkCombo, darkDeleteBtn); + updateDeleteButton(customCombo, customDeleteBtn); +} + +void AppearanceTabWidget::updateDeleteButton(QComboBox *combo, QPushButton *btn) +{ + const QString id = combo->currentData().toString(); + btn->setEnabled(!id.isEmpty() && id.startsWith(QLatin1String("user/"))); +} + +void AppearanceTabWidget::updateModeRows() +{ + if (!config) + return; + const auto mode = config->selection().mode; + lightRow->setVisible(mode == ThemeMode::FollowSystem || mode == ThemeMode::Light); + darkRow->setVisible(mode == ThemeMode::FollowSystem || mode == ThemeMode::Dark); + customRow->setVisible(mode == ThemeMode::ForcedTheme); +} + +void AppearanceTabWidget::importTheme() +{ + const QString path = QFileDialog::getOpenFileName( + this, tr("Import theme"), QString(), tr("JSON files (*.json);;All files (*)")); + if (path.isEmpty() || !repository) + return; + + QString errorMessage; + const QString id = repository->importThemeFromFile(path, &errorMessage); + if (id.isEmpty()) { + const QString detail = errorMessage.isEmpty() + ? tr("Could not import theme from:\n%1").arg(path) + : tr("Could not import theme from:\n%1\n\n%2").arg(path, errorMessage); + QMessageBox::warning(this, tr("Import failed"), detail); + return; + } + + // Detect variant of the imported theme to auto-select it in the right combo + const QJsonObject json = repository->loadThemeJson(id); + const bool isLight = (json["meta"].toObject()["variant"].toString() == "light"); + + repopulateCombos(); + + // Select in the appropriate combo → triggers currentIndexChanged → config update + if (isLight) + selectInCombo(lightCombo, id); + else + selectInCombo(darkCombo, id); + + // If in Custom mode, also select in customCombo + if (config && config->selection().mode == ThemeMode::ForcedTheme) + selectInCombo(customCombo, id); +} + +void AppearanceTabWidget::deleteTheme(QComboBox *combo, QPushButton *deleteBtn) +{ + if (!repository) + return; + const QString id = combo->currentData().toString(); + if (!id.startsWith(QLatin1String("user/"))) + return; + + repository->deleteUserTheme(id); + repopulateCombos(); + + // repopulateCombos() blocked signals; manually push the new selection into config + // so the theme resolves correctly (important when the deleted theme was active). + const QString newId = combo->currentData().toString(); + if (combo == lightCombo && config) + config->setLightThemeId(newId); + else if (combo == darkCombo && config) + config->setDarkThemeId(newId); + else if (combo == customCombo && config) + config->setFixedThemeId(newId); + + updateDeleteButton(combo, deleteBtn); +} diff --git a/common/themes/appearance_tab_widget.h b/common/themes/appearance_tab_widget.h new file mode 100644 index 000000000..720827ce2 --- /dev/null +++ b/common/themes/appearance_tab_widget.h @@ -0,0 +1,59 @@ +#ifndef APPEARANCE_TAB_WIDGET_H +#define APPEARANCE_TAB_WIDGET_H + +#include "theme_variant.h" + +#include +#include +#include + +#include +#include + +class AppearanceConfiguration; +class QComboBox; +class QPushButton; +class ThemeEditorDialog; +class ThemeRepository; + +class AppearanceTabWidget : public QWidget +{ + Q_OBJECT +public: + explicit AppearanceTabWidget( + AppearanceConfiguration *config, + ThemeRepository *repository, + std::function currentThemeJson, + std::function applyTheme, + QWidget *parent = nullptr); + +private: + AppearanceConfiguration *config; + ThemeRepository *repository; + std::function currentThemeJson; + std::function applyTheme; + QPointer themeEditor; + + // One row per picker; shown/hidden based on active mode + QWidget *lightRow = nullptr; + QWidget *darkRow = nullptr; + QWidget *customRow = nullptr; + + QComboBox *lightCombo = nullptr; + QComboBox *darkCombo = nullptr; + QComboBox *customCombo = nullptr; + + QPushButton *lightDeleteBtn = nullptr; + QPushButton *darkDeleteBtn = nullptr; + QPushButton *customDeleteBtn = nullptr; + + // Populate a combo with themes, filtered strictly by variant (or all if nullopt). + void populateCombo(QComboBox *combo, std::optional variantFilter, const QString &selectedId); + void repopulateCombos(); + void updateDeleteButton(QComboBox *combo, QPushButton *btn); + void updateModeRows(); + void importTheme(); + void deleteTheme(QComboBox *combo, QPushButton *deleteBtn); +}; + +#endif // APPEARANCE_TAB_WIDGET_H diff --git a/common/themes/icon_utils.cpp b/common/themes/icon_utils.cpp new file mode 100644 index 000000000..a0f01c103 --- /dev/null +++ b/common/themes/icon_utils.cpp @@ -0,0 +1,116 @@ +#include "icon_utils.h" + +#include "yacreader_global.h" + +#include +#include + +QPixmap renderSvgToPixmap(const QString &svgPath, int logicalSize, qreal devicePixelRatio) +{ + return renderSvgToPixmap(svgPath, logicalSize, logicalSize, devicePixelRatio); +} + +QPixmap renderSvgToPixmap(const QString &svgPath, int logicalWidth, int logicalHeight, qreal devicePixelRatio) +{ + const int pixelWidth = qRound(logicalWidth * devicePixelRatio); + const int pixelHeight = qRound(logicalHeight * devicePixelRatio); + QPixmap pixmap(pixelWidth, pixelHeight); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + QSvgRenderer renderer(svgPath); + renderer.render(&painter); + painter.end(); + pixmap.setDevicePixelRatio(devicePixelRatio); + return pixmap; +} + +QString readSvg(const QString &resourcePath) +{ + QFile in(resourcePath); + if (!in.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "Failed to open SVG resource:" << resourcePath; + return { }; + } + + QString svg = QString::fromUtf8(in.readAll()); + in.close(); + + return svg; +} + +QString writeSvg(const QString &svg, const QString &resourcePath, const QString &themeName, const RecolorOptions &options) +{ + const QString basePath = YACReader::getSettingsPath() + "/themes/" + themeName; + + QDir().mkpath(basePath); + + QString outFileName = options.fileName.isEmpty() ? QFileInfo(resourcePath).completeBaseName() : options.fileName; + if (!options.suffix.isEmpty()) { + outFileName += options.suffix; + } + outFileName += "." + QFileInfo(resourcePath).suffix(); + const QString outPath = basePath + "/" + outFileName; + + QFile out(outPath); + if (!out.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { + qWarning() << "Failed to write SVG:" << outPath; + return { }; + } + + out.write(svg.toUtf8()); + out.close(); + + return outPath; +} + +QString recolorSvgXML(QString &svg, + const QString &placeHolder, + const QColor &color) +{ + // TODO: svg colors can work without ;, we need to update all the svg files to inlude ; + // Include the trailing ';' so e.g. "#ff0;" never accidentally matches + // inside a previously-substituted value like "#ff0000;". + return svg.replace(placeHolder, color.name(QColor::HexRgb), Qt::CaseInsensitive); +} + +QString recoloredSvgToThemeFile(const QString &resourcePath, + const QColor &color, // #f0f (magenta) + const QString &themeName, + const RecolorOptions &options) +{ + auto svg = readSvg(resourcePath); + + recolorSvgXML(svg, "#f0f", color); + + return writeSvg(svg, resourcePath, themeName, options); +} + +QString recoloredSvgToThemeFile(const QString &resourcePath, + const QColor &color1, // #f0f (magenta) + const QColor &color2, // #0ff (cyan) + const QString &themeName, + const RecolorOptions &options) +{ + auto svg = readSvg(resourcePath); + + recolorSvgXML(svg, "#f0f", color1); + recolorSvgXML(svg, "#0ff", color2); + + return writeSvg(svg, resourcePath, themeName, options); +} + +QString recoloredSvgToThemeFile(const QString &resourcePath, + const QColor &color1, // #f0f (magenta) + const QColor &color2, // #0ff (cyan) + const QColor &color3, // #ff0 (yellow) + const QString &themeName, + const RecolorOptions &options) +{ + auto svg = readSvg(resourcePath); + + recolorSvgXML(svg, "#f0f", color1); + recolorSvgXML(svg, "#0ff", color2); + recolorSvgXML(svg, "#ff0", color3); + + return writeSvg(svg, resourcePath, themeName, options); +} diff --git a/common/themes/icon_utils.h b/common/themes/icon_utils.h new file mode 100644 index 000000000..952cf19ef --- /dev/null +++ b/common/themes/icon_utils.h @@ -0,0 +1,38 @@ +#ifndef ICON_UTILS_H +#define ICON_UTILS_H + +#include +#include +#include + +// Render an SVG file to a QPixmap at a specific logical size with HiDPI support. +// Uses QSvgRenderer to rasterize directly at the target resolution (no upscaling). +QPixmap renderSvgToPixmap(const QString &svgPath, int logicalSize, qreal devicePixelRatio); +QPixmap renderSvgToPixmap(const QString &svgPath, int logicalWidth, int logicalHeight, qreal devicePixelRatio); + +struct RecolorOptions { + QString suffix; + QString fileName; +}; + +QString readSvg(const QString &resourcePath); +QString writeSvg(const QString &svg, const QString &resourcePath, const QString &themeName, const RecolorOptions &options = { }); + +QString recolorSvgXML(QString &svg, const QString &placeHolder, const QColor &color); +QString recoloredSvgToThemeFile(const QString &resourcePath, + const QColor &color, // #f0f (magenta) + const QString &themeName, + const RecolorOptions &options = { }); +QString recoloredSvgToThemeFile(const QString &resourcePath, + const QColor &color1, // #f0f (magenta) + const QColor &color2, // #0ff (cyan) + const QString &themeName, + const RecolorOptions &options = { }); +QString recoloredSvgToThemeFile(const QString &resourcePath, + const QColor &color1, // #f0f (magenta) + const QColor &color2, // #0ff (cyan) + const QColor &color3, // #ff0 (yellow) + const QString &themeName, + const RecolorOptions &options = { }); + +#endif // ICON_UTILS_H diff --git a/common/themes/shared/help_about_dialog_theme.h b/common/themes/shared/help_about_dialog_theme.h new file mode 100644 index 000000000..52f98d35b --- /dev/null +++ b/common/themes/shared/help_about_dialog_theme.h @@ -0,0 +1,11 @@ +#ifndef HELP_ABOUT_DIALOG_THEME_H +#define HELP_ABOUT_DIALOG_THEME_H + +#include + +struct HelpAboutDialogTheme { + QColor headingColor; + QColor linkColor; +}; + +#endif // HELP_ABOUT_DIALOG_THEME_H diff --git a/common/themes/shared/whats_new_dialog_theme.h b/common/themes/shared/whats_new_dialog_theme.h new file mode 100644 index 000000000..cd8829572 --- /dev/null +++ b/common/themes/shared/whats_new_dialog_theme.h @@ -0,0 +1,17 @@ +#ifndef WHATS_NEW_DIALOG_THEME_H +#define WHATS_NEW_DIALOG_THEME_H + +#include +#include + +struct WhatsNewDialogTheme { + QColor backgroundColor; + QColor headerTextColor; + QColor versionTextColor; + QColor contentTextColor; + QColor linkColor; + QPixmap closeButtonIcon; + QPixmap headerDecoration; +}; + +#endif // WHATS_NEW_DIALOG_THEME_H diff --git a/common/themes/themable.h b/common/themes/themable.h new file mode 100644 index 000000000..43694f779 --- /dev/null +++ b/common/themes/themable.h @@ -0,0 +1,28 @@ +#ifndef THEMABLE_H +#define THEMABLE_H + +#include "theme_manager.h" + +class Themable +{ +protected: + void initTheme(QObject *owner) + { + QObject::connect(&ThemeManager::instance(), + &ThemeManager::themeChanged, + owner, + [this]() { + theme = ThemeManager::instance().getCurrentTheme(); + applyTheme(theme); + }); + + theme = ThemeManager::instance().getCurrentTheme(); + applyTheme(theme); + } + + virtual void applyTheme(const Theme &theme) = 0; + + Theme theme; +}; + +#endif // THEMABLE_H diff --git a/common/themes/theme_editor_dialog.cpp b/common/themes/theme_editor_dialog.cpp new file mode 100644 index 000000000..fbaac06d6 --- /dev/null +++ b/common/themes/theme_editor_dialog.cpp @@ -0,0 +1,505 @@ +#include "theme_editor_dialog.h" + +#include "theme_json_utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// Role used to store the JSON path (QStringList) on each leaf item. +static const int PathRole = Qt::UserRole; +// Role used to distinguish color items from others. +static const int IsColorRole = Qt::UserRole + 1; +// Role used to distinguish boolean items. +static const int IsBoolRole = Qt::UserRole + 2; +// Role used to distinguish numeric items. +static const int IsNumberRole = Qt::UserRole + 3; + +// Converts a camelCase JSON key to a human-readable display string. +// "metadataScraperDialog" → "Metadata scraper dialog" +// "navigationTreeQSS" → "Navigation tree qss" +// Consecutive uppercase letters (acronyms) are kept together as one word. +static QString displayKey(const QString &key) +{ + QString result; + for (int i = 0; i < key.size(); ++i) { + const bool isUpper = key[i].isUpper(); + const bool prevIsLower = (i > 0) && key[i - 1].isLower(); + const bool nextIsLower = (i + 1 < key.size()) && key[i + 1].isLower(); + if (i > 0 && isUpper && (prevIsLower || nextIsLower)) + result += ' '; + result += result.isEmpty() ? key[i].toUpper() : key[i].toLower(); + } + return result; +} + +ThemeEditorDialog::ThemeEditorDialog(const QJsonObject ¶ms, QWidget *parent) + : QDialog(parent), params(normalizeThemeJson(params)) +{ + setWindowTitle(tr("Theme Editor")); + resize(520, 700); + + // --- top toolbar --- + auto *expandBtn = new QPushButton(tr("+"), this); + auto *collapseBtn = new QPushButton(tr("-"), this); + auto *identifyBtn = new QPushButton(tr("i"), this); + expandBtn->setFixedWidth(28); + collapseBtn->setFixedWidth(28); + identifyBtn->setFixedWidth(28); + expandBtn->setToolTip(tr("Expand all")); + collapseBtn->setToolTip(tr("Collapse all")); + identifyBtn->setToolTip(tr("Hold to flash the selected value in the UI (magenta / toggled / 0↔10). Releases restore the original.")); + // NoFocus so clicking the button doesn't steal the tree's current item + identifyBtn->setFocusPolicy(Qt::NoFocus); + + searchEdit = new QLineEdit(this); + searchEdit->setPlaceholderText(tr("Search…")); + searchEdit->setClearButtonEnabled(true); + + auto *toolbar = new QHBoxLayout(); + toolbar->addWidget(expandBtn); + toolbar->addWidget(collapseBtn); + toolbar->addWidget(identifyBtn); + toolbar->addStretch(); + toolbar->addWidget(searchEdit); + + connect(identifyBtn, &QPushButton::pressed, this, &ThemeEditorDialog::identifyPressed); + connect(identifyBtn, &QPushButton::released, this, &ThemeEditorDialog::identifyReleased); + + // --- meta section --- + idLabel = new QLabel(this); + idLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); + nameEdit = new QLineEdit(this); + variantCombo = new QComboBox(this); + variantCombo->addItem(tr("Light"), "light"); + variantCombo->addItem(tr("Dark"), "dark"); + + auto *metaForm = new QFormLayout(); + metaForm->addRow(tr("ID:"), idLabel); + metaForm->addRow(tr("Display name:"), nameEdit); + metaForm->addRow(tr("Variant:"), variantCombo); + + auto *metaBox = new QGroupBox(tr("Theme info"), this); + metaBox->setLayout(metaForm); + + syncMetaFromParams(); + + connect(nameEdit, &QLineEdit::textEdited, this, [this](const QString &text) { + auto meta = this->params["meta"].toObject(); + meta["displayName"] = text; + this->params["meta"] = meta; + }); + connect(nameEdit, &QLineEdit::editingFinished, this, [this]() { + emit themeJsonChanged(this->params); + }); + connect(variantCombo, &QComboBox::currentIndexChanged, this, [this](int index) { + auto meta = this->params["meta"].toObject(); + meta["variant"] = variantCombo->itemData(index).toString(); + this->params["meta"] = meta; + emit themeJsonChanged(this->params); + }); + + // --- tree --- + tree = new QTreeWidget(this); + tree->setColumnCount(2); + tree->setHeaderLabels({ tr("Parameter"), tr("Value") }); + tree->header()->setSectionResizeMode(0, QHeaderView::Stretch); + tree->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents); + tree->setRootIsDecorated(true); + tree->setUniformRowHeights(true); + tree->setAlternatingRowColors(true); + + populate(nullptr, params, { }); + tree->expandAll(); + + connect(expandBtn, &QPushButton::clicked, tree, &QTreeWidget::expandAll); + connect(collapseBtn, &QPushButton::clicked, tree, &QTreeWidget::collapseAll); + connect(searchEdit, &QLineEdit::textChanged, this, &ThemeEditorDialog::filterTree); + + connect(tree, &QTreeWidget::itemDoubleClicked, this, [this](QTreeWidgetItem *item, int) { + if (item->data(0, IsColorRole).toBool()) + editColorItem(item); + else if (item->data(0, IsBoolRole).toBool()) + toggleBoolItem(item); + else if (item->data(0, IsNumberRole).toBool()) + editNumberItem(item); + }); + + // --- bottom buttons --- + auto *saveLibBtn = new QPushButton(tr("Save and apply"), this); + auto *exportBtn = new QPushButton(tr("Export to file..."), this); + auto *loadBtn = new QPushButton(tr("Load from file..."), this); + auto *closeBtn = new QPushButton(tr("Close"), this); + connect(saveLibBtn, &QPushButton::clicked, this, [this]() { + emit saveToLibraryRequested(this->params); + }); + connect(exportBtn, &QPushButton::clicked, this, &ThemeEditorDialog::saveToFile); + connect(loadBtn, &QPushButton::clicked, this, &ThemeEditorDialog::loadFromFile); + connect(closeBtn, &QPushButton::clicked, this, &QDialog::close); + auto *buttons = new QHBoxLayout(); + buttons->addWidget(saveLibBtn); + buttons->addWidget(exportBtn); + buttons->addWidget(loadBtn); + buttons->addStretch(); + buttons->addWidget(closeBtn); + + auto *layout = new QVBoxLayout(this); + layout->addLayout(toolbar); + layout->addWidget(metaBox); + layout->addWidget(tree); + layout->addLayout(buttons); + + setLayout(layout); +} + +void ThemeEditorDialog::populate(QTreeWidgetItem *parent, const QJsonObject &obj, const QStringList &path) +{ + for (auto it = obj.constBegin(); it != obj.constEnd(); ++it) { + const QString key = it.key(); + + // "meta" is handled by the dedicated UI above the tree + if (path.isEmpty() && key == "meta") + continue; + const QJsonValue val = it.value(); + const QStringList childPath = path + QStringList(key); + + if (val.isObject()) { + // Group row + QTreeWidgetItem *group = parent ? new QTreeWidgetItem(parent) + : new QTreeWidgetItem(tree); + QFont bold = group->font(0); + bold.setBold(true); + group->setFont(0, bold); + group->setText(0, displayKey(key)); + group->setFlags(group->flags() & ~Qt::ItemIsSelectable); + populate(group, val.toObject(), childPath); + } else { + // Leaf row + QTreeWidgetItem *item = parent ? new QTreeWidgetItem(parent) + : new QTreeWidgetItem(tree); + item->setText(0, displayKey(key)); + item->setData(0, PathRole, childPath); + + const QString strVal = val.toString(); + if (val.isString() && isThemeHexColorString(strVal)) { + const QColor color(strVal); + item->setIcon(1, colorIcon(color)); + item->setText(1, strVal); + item->setData(0, IsColorRole, true); + item->setToolTip(1, tr("Double-click to edit color")); + } else if (val.isBool()) { + item->setText(1, val.toBool() ? tr("true") : tr("false")); + item->setData(0, IsColorRole, false); + item->setData(0, IsBoolRole, true); + item->setToolTip(1, tr("Double-click to toggle")); + } else if (val.isDouble()) { + item->setText(1, QString::number(val.toDouble())); + item->setData(0, IsNumberRole, true); + item->setToolTip(1, tr("Double-click to edit value")); + } else { + item->setText(1, strVal); + item->setData(0, IsColorRole, false); + } + } + } +} + +void ThemeEditorDialog::editColorItem(QTreeWidgetItem *item) +{ + const QColor current(item->text(1)); + QColorDialog dialog(current, this); + dialog.setOption(QColorDialog::ShowAlphaChannel, true); + dialog.setWindowTitle(tr("Edit: %1").arg(item->text(0))); + + // Live update as user drags the picker + connect(&dialog, &QColorDialog::currentColorChanged, this, [this, item](const QColor &color) { + applyColorToItem(item, color); + emit themeJsonChanged(params); + }); + + if (dialog.exec() == QDialog::Accepted) { + applyColorToItem(item, dialog.selectedColor()); + } else { + // Revert to original if cancelled + applyColorToItem(item, current); + } + emit themeJsonChanged(params); +} + +void ThemeEditorDialog::applyColorToItem(QTreeWidgetItem *item, const QColor &color) +{ + const QString hexStr = color.alpha() < 255 + ? color.name(QColor::HexArgb) + : color.name(QColor::HexRgb); + const QString normalizedHexStr = hexStr.toUpper(); + item->setText(1, normalizedHexStr); + item->setIcon(1, colorIcon(color)); + + const QStringList path = item->data(0, PathRole).toStringList(); + setJsonPath(params, path, normalizedHexStr); +} + +void ThemeEditorDialog::toggleBoolItem(QTreeWidgetItem *item) +{ + const bool newValue = item->text(1) != tr("true"); + item->setText(1, newValue ? tr("true") : tr("false")); + const QStringList path = item->data(0, PathRole).toStringList(); + setJsonPath(params, path, newValue); + emit themeJsonChanged(params); +} + +void ThemeEditorDialog::editNumberItem(QTreeWidgetItem *item) +{ + const double current = item->text(1).toDouble(); + // Use integer dialog when the stored value has no fractional part + const bool isInt = (current == std::floor(current)); + bool ok = false; + double newValue; + if (isInt) { + const int result = QInputDialog::getInt( + this, tr("Edit: %1").arg(item->text(0)), item->text(0), + static_cast(current), INT_MIN, INT_MAX, 1, &ok); + newValue = result; + } else { + newValue = QInputDialog::getDouble( + this, tr("Edit: %1").arg(item->text(0)), item->text(0), + current, -1e9, 1e9, 4, &ok); + } + if (!ok) + return; + item->setText(1, isInt ? QString::number(static_cast(newValue)) : QString::number(newValue)); + const QStringList path = item->data(0, PathRole).toStringList(); + setJsonPath(params, path, newValue); + emit themeJsonChanged(params); +} + +// Returns true if the item or any of its descendants should be visible. +static bool applyFilter(QTreeWidgetItem *item, const QString &query) +{ + if (query.isEmpty()) { + item->setHidden(false); + for (int i = 0; i < item->childCount(); ++i) + applyFilter(item->child(i), query); + return true; + } + + const bool selfMatch = item->text(0).contains(query, Qt::CaseInsensitive); + + if (item->childCount() == 0) { + // Leaf: match on key name or value text + const bool match = selfMatch || item->text(1).contains(query, Qt::CaseInsensitive); + item->setHidden(!match); + return match; + } + + // Group: if the group name itself matches, show all children + bool anyChildVisible = false; + for (int i = 0; i < item->childCount(); ++i) { + if (selfMatch) { + item->child(i)->setHidden(false); + anyChildVisible = true; + } else { + if (applyFilter(item->child(i), query)) + anyChildVisible = true; + } + } + item->setHidden(!anyChildVisible); + return anyChildVisible; +} + +void ThemeEditorDialog::filterTree(const QString &query) +{ + for (int i = 0; i < tree->topLevelItemCount(); ++i) + applyFilter(tree->topLevelItem(i), query); + + // Keep visible results expanded so they're reachable + if (!query.isEmpty()) + tree->expandAll(); +} + +QIcon ThemeEditorDialog::colorIcon(const QColor &color) +{ + const int size = qApp->style()->pixelMetric(QStyle::PM_SmallIconSize); + QPixmap pix(size, size); + pix.fill(color); + return QIcon(pix); +} + +void ThemeEditorDialog::setJsonPath(QJsonObject &root, const QStringList &path, const QJsonValue &value) +{ + if (path.isEmpty()) + return; + if (path.size() == 1) { + root[path[0]] = value; + return; + } + QJsonObject sub = root[path[0]].toObject(); + setJsonPath(sub, path.mid(1), value); + root[path[0]] = sub; +} + +void ThemeEditorDialog::syncMetaToParams() +{ + auto meta = params["meta"].toObject(); + meta["displayName"] = nameEdit->text(); + meta["variant"] = variantCombo->currentData().toString(); + params["meta"] = meta; +} + +void ThemeEditorDialog::syncMetaFromParams() +{ + const auto meta = params["meta"].toObject(); + idLabel->setText(meta["id"].toString()); + nameEdit->setText(meta["displayName"].toString()); + const QString variant = meta["variant"].toString("dark"); + variantCombo->setCurrentIndex(variant == "light" ? 0 : 1); +} + +void ThemeEditorDialog::updateSavedId(const QString &id) +{ + auto meta = params["meta"].toObject(); + meta["id"] = id; + params["meta"] = meta; + idLabel->setText(id); +} + +void ThemeEditorDialog::saveToFile() +{ + // Assign a user-scoped UUID if the current id is builtin or empty + auto meta = params["meta"].toObject(); + const QString currentId = meta["id"].toString(); + if (currentId.isEmpty() || currentId.startsWith("builtin/")) { + const QString newId = "user/" + QUuid::createUuid().toString(QUuid::WithoutBraces); + meta["id"] = newId; + params["meta"] = meta; + idLabel->setText(newId); + } + + const QString path = QFileDialog::getSaveFileName( + this, tr("Save theme"), QString(), tr("JSON files (*.json);;All files (*)")); + if (path.isEmpty()) + return; + + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::warning(this, tr("Save failed"), tr("Could not open file for writing:\n%1").arg(path)); + return; + } + file.write(serializeNormalizedThemeJson(params)); +} + +void ThemeEditorDialog::loadFromFile() +{ + const QString path = QFileDialog::getOpenFileName( + this, tr("Load theme"), QString(), tr("JSON files (*.json);;All files (*)")); + if (path.isEmpty()) + return; + + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::warning(this, tr("Load failed"), tr("Could not open file:\n%1").arg(path)); + return; + } + + QJsonParseError err; + const QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &err); + if (doc.isNull()) { + QMessageBox::warning(this, tr("Load failed"), tr("Invalid JSON:\n%1").arg(err.errorString())); + return; + } + if (!doc.isObject()) { + QMessageBox::warning(this, tr("Load failed"), tr("Expected a JSON object.")); + return; + } + + params = normalizeThemeJson(doc.object()); + syncMetaFromParams(); + tree->clear(); + populate(nullptr, params, { }); + tree->expandAll(); + emit themeJsonChanged(params); +} + +void ThemeEditorDialog::identifyPressed() +{ + QTreeWidgetItem *item = tree->currentItem(); + if (!item) + return; + + const QStringList path = item->data(0, PathRole).toStringList(); + if (path.isEmpty()) + return; // group row, not a leaf + + if (item->data(0, IsColorRole).toBool()) { + identifySnapshot = QJsonValue(item->text(1)); + identifyItem = item; + identifyPath = path; + applyColorToItem(item, QColor(0xFA00FA)); + } else if (item->data(0, IsBoolRole).toBool()) { + const bool current = (item->text(1) == tr("true")); + identifySnapshot = QJsonValue(current); + identifyItem = item; + identifyPath = path; + const bool flipped = !current; + item->setText(1, flipped ? tr("true") : tr("false")); + setJsonPath(params, path, flipped); + } else if (item->data(0, IsNumberRole).toBool()) { + const double current = item->text(1).toDouble(); + identifySnapshot = QJsonValue(current); + identifyItem = item; + identifyPath = path; + const bool isInt = (current == std::floor(current)); + const double highlight = (current > 0.0) ? 0.0 : 10.0; + item->setText(1, isInt ? QString::number(static_cast(highlight)) : QString::number(highlight)); + setJsonPath(params, path, highlight); + } else { + return; // non-editable leaf (plain string), nothing to flash + } + emit themeJsonChanged(params); +} + +void ThemeEditorDialog::identifyReleased() +{ + if (!identifyItem) + return; + + QTreeWidgetItem *item = identifyItem; + const QStringList path = identifyPath; + identifyItem = nullptr; + identifyPath.clear(); + + if (item->data(0, IsColorRole).toBool()) { + applyColorToItem(item, QColor(identifySnapshot.toString())); + } else if (item->data(0, IsBoolRole).toBool()) { + const bool restored = identifySnapshot.toBool(); + item->setText(1, restored ? tr("true") : tr("false")); + setJsonPath(params, path, restored); + } else if (item->data(0, IsNumberRole).toBool()) { + const double restored = identifySnapshot.toDouble(); + const bool isInt = (restored == std::floor(restored)); + item->setText(1, isInt ? QString::number(static_cast(restored)) : QString::number(restored)); + setJsonPath(params, path, restored); + } + identifySnapshot = QJsonValue(); + emit themeJsonChanged(params); +} diff --git a/common/themes/theme_editor_dialog.h b/common/themes/theme_editor_dialog.h new file mode 100644 index 000000000..e889d95ac --- /dev/null +++ b/common/themes/theme_editor_dialog.h @@ -0,0 +1,66 @@ +#ifndef THEME_EDITOR_DIALOG_H +#define THEME_EDITOR_DIALOG_H + +#include +#include + +class QComboBox; +class QLabel; +class QLineEdit; +class QTreeWidget; +class QTreeWidgetItem; + +// Generic theme parameter editor. +// Works entirely on QJsonObject — has no knowledge of app-specific ThemeParams. +// Connect to themeJsonChanged to receive live updates as the user edits colors. +class ThemeEditorDialog : public QDialog +{ + Q_OBJECT +public: + explicit ThemeEditorDialog(const QJsonObject ¶ms, QWidget *parent = nullptr); + + QJsonObject currentParams() const { return params; } + + void updateSavedId(const QString &id); + +signals: + void themeJsonChanged(const QJsonObject ¶ms); + void saveToLibraryRequested(const QJsonObject &json); + +private: + void populate(QTreeWidgetItem *parent, const QJsonObject &obj, const QStringList &path); + void editColorItem(QTreeWidgetItem *item); + void applyColorToItem(QTreeWidgetItem *item, const QColor &color); + void toggleBoolItem(QTreeWidgetItem *item); + void editNumberItem(QTreeWidgetItem *item); + void filterTree(const QString &query); + void saveToFile(); + void loadFromFile(); + + // Identify feature: hold the (i) button to temporarily flash the UI element + // that uses the current item's value. The original value is restored on release. + void identifyPressed(); + void identifyReleased(); + + static QIcon colorIcon(const QColor &color); + static void setJsonPath(QJsonObject &root, const QStringList &path, const QJsonValue &value); + + QTreeWidget *tree; + QLineEdit *searchEdit; + QJsonObject params; + + // Meta UI + QLabel *idLabel; + QLineEdit *nameEdit; + QComboBox *variantCombo; + + void syncMetaToParams(); + void syncMetaFromParams(); + + // Identify state (null item = inactive) + QTreeWidgetItem *identifyItem = nullptr; + QStringList identifyPath; + QJsonValue identifySnapshot; // original value saved on press, restored on release +}; + +#endif // THEME_EDITOR_DIALOG_H diff --git a/common/themes/theme_json_utils.cpp b/common/themes/theme_json_utils.cpp new file mode 100644 index 000000000..0225af643 --- /dev/null +++ b/common/themes/theme_json_utils.cpp @@ -0,0 +1,50 @@ +#include "theme_json_utils.h" + +#include +#include +#include + +namespace { + +QJsonValue normalizeThemeJsonValue(const QJsonValue &value) +{ + if (value.isObject()) + return normalizeThemeJson(value.toObject()); + + if (value.isArray()) { + QJsonArray normalizedArray = value.toArray(); + for (int i = 0; i < normalizedArray.size(); ++i) + normalizedArray[i] = normalizeThemeJsonValue(normalizedArray.at(i)); + return normalizedArray; + } + + if (value.isString()) { + const QString stringValue = value.toString(); + if (isThemeHexColorString(stringValue)) + return stringValue.toUpper(); + } + + return value; +} + +} + +bool isThemeHexColorString(const QString &value) +{ + static const QRegularExpression colorRegex( + "^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"); + return colorRegex.match(value).hasMatch(); +} + +QJsonObject normalizeThemeJson(const QJsonObject &json) +{ + QJsonObject normalized; + for (auto it = json.constBegin(); it != json.constEnd(); ++it) + normalized.insert(it.key(), normalizeThemeJsonValue(it.value())); + return normalized; +} + +QByteArray serializeNormalizedThemeJson(const QJsonObject &json, QJsonDocument::JsonFormat format) +{ + return QJsonDocument(normalizeThemeJson(json)).toJson(format); +} diff --git a/common/themes/theme_json_utils.h b/common/themes/theme_json_utils.h new file mode 100644 index 000000000..106f4638d --- /dev/null +++ b/common/themes/theme_json_utils.h @@ -0,0 +1,14 @@ +#ifndef THEME_JSON_UTILS_H +#define THEME_JSON_UTILS_H + +#include +#include +#include +#include + +bool isThemeHexColorString(const QString &value); +QJsonObject normalizeThemeJson(const QJsonObject &json); +QByteArray serializeNormalizedThemeJson(const QJsonObject &json, + QJsonDocument::JsonFormat format = QJsonDocument::Indented); + +#endif // THEME_JSON_UTILS_H diff --git a/common/themes/theme_manager.cpp b/common/themes/theme_manager.cpp new file mode 100644 index 000000000..bf0031644 --- /dev/null +++ b/common/themes/theme_manager.cpp @@ -0,0 +1,123 @@ +#include "theme_manager.h" + +#include "appearance_configuration.h" +#include "theme.h" +#include "theme_factory.h" +#include "theme_repository.h" + +#include +#include + +ThemeManager::ThemeManager() +{ +} + +ThemeManager &ThemeManager::instance() +{ + static ThemeManager instance; + return instance; +} + +void ThemeManager::initialize(AppearanceConfiguration *config, ThemeRepository *repository) +{ + this->config = config; + this->repository = repository; + + auto *styleHints = qGuiApp->styleHints(); + + // Re-resolve when OS color scheme changes (relevant for FollowSystem mode) + connect(styleHints, &QStyleHints::colorSchemeChanged, this, &ThemeManager::resolveTheme, Qt::QueuedConnection); + + // Re-resolve when the user changes any theme setting + connect(config, &AppearanceConfiguration::selectionChanged, this, &ThemeManager::resolveTheme); + + resolveTheme(); +} + +void ThemeManager::setTheme(const Theme &theme) +{ + currentTheme = theme; + emit themeChanged(); +} + +Theme ThemeManager::themeFromId(const QString &id, ThemeVariant fallbackVariant) +{ + // Try the repository first (handles both builtin and user themes via JSON) + if (repository && repository->contains(id)) { + QJsonObject json = repository->loadThemeJson(id); + if (!json.isEmpty()) + return makeTheme(json); + } + + // Fallback to the builtin that matches the current dark/light intent. + const QString fallbackId = (fallbackVariant == ThemeVariant::Dark) + ? QStringLiteral("builtin/dark") + : QStringLiteral("builtin/light"); + if (repository && repository->contains(fallbackId)) { + QJsonObject json = repository->loadThemeJson(fallbackId); + if (!json.isEmpty()) + return makeTheme(json); + } + + return { }; +} + +void ThemeManager::resolveTheme() +{ + if (!config) + return; + + const auto &sel = config->selection(); + + QString id; + ThemeVariant fallbackVariant; + switch (sel.mode) { + case ThemeMode::FollowSystem: { + const bool isDark = (qGuiApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark); + id = isDark ? sel.darkThemeId : sel.lightThemeId; + fallbackVariant = isDark ? ThemeVariant::Dark : ThemeVariant::Light; + break; + } + case ThemeMode::Light: + id = sel.lightThemeId; + fallbackVariant = ThemeVariant::Light; + break; + case ThemeMode::Dark: + id = sel.darkThemeId; + fallbackVariant = ThemeVariant::Dark; + break; + case ThemeMode::ForcedTheme: + id = sel.fixedThemeId; + fallbackVariant = (qGuiApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark) + ? ThemeVariant::Dark + : ThemeVariant::Light; + break; + } + + const Theme theme = themeFromId(id, fallbackVariant); + + // Sync Qt's application-level color scheme so native widgets (menus, scrollbars, + // standard dialogs) use the correct palette before themeChanged() is emitted. +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + Qt::ColorScheme scheme; + switch (sel.mode) { + case ThemeMode::FollowSystem: + scheme = Qt::ColorScheme::Unknown; // delegate to OS + break; + case ThemeMode::Light: + scheme = Qt::ColorScheme::Light; + break; + case ThemeMode::Dark: + scheme = Qt::ColorScheme::Dark; + break; + case ThemeMode::ForcedTheme: + scheme = (theme.meta.variant == ThemeVariant::Dark) + ? Qt::ColorScheme::Dark + : Qt::ColorScheme::Light; + break; + } + qGuiApp->styleHints()->setColorScheme(scheme); +#endif + + setTheme(theme); +} diff --git a/common/themes/theme_manager.h b/common/themes/theme_manager.h new file mode 100644 index 000000000..7ffbeea76 --- /dev/null +++ b/common/themes/theme_manager.h @@ -0,0 +1,46 @@ +#ifndef THEME_MANAGER_H +#define THEME_MANAGER_H + +#include "appearance_configuration.h" +#include "theme.h" + +#include + +class ThemeRepository; + +class ThemeManager : public QObject +{ + Q_OBJECT +public: + static ThemeManager &instance(); + + ThemeManager(const ThemeManager &) = delete; + ThemeManager &operator=(const ThemeManager &) = delete; + ThemeManager(ThemeManager &&) = delete; + ThemeManager &operator=(ThemeManager &&) = delete; + + void initialize(AppearanceConfiguration *config, ThemeRepository *repository); + + void setTheme(const Theme &theme); + const Theme &getCurrentTheme() const { return currentTheme; } + + AppearanceConfiguration *getAppearanceConfiguration() const { return config; } + ThemeRepository *getRepository() const { return repository; } + +signals: + void themeChanged(); + +private: + explicit ThemeManager(); + + AppearanceConfiguration *config = nullptr; + ThemeRepository *repository = nullptr; + Theme currentTheme; + + Theme themeFromId(const QString &id, ThemeVariant fallbackVariant); + +private slots: + void resolveTheme(); +}; + +#endif // THEME_MANAGER_H diff --git a/common/themes/theme_meta.h b/common/themes/theme_meta.h new file mode 100644 index 000000000..f4f803b3b --- /dev/null +++ b/common/themes/theme_meta.h @@ -0,0 +1,16 @@ +#ifndef THEME_META_H +#define THEME_META_H + +#include "theme_variant.h" + +#include + +struct ThemeMeta { + QString id; + QString displayName; + ThemeVariant variant; + QString targetApp; + QString version; +}; + +#endif // THEME_META_H diff --git a/common/themes/theme_repository.cpp b/common/themes/theme_repository.cpp new file mode 100644 index 000000000..989219f1c --- /dev/null +++ b/common/themes/theme_repository.cpp @@ -0,0 +1,277 @@ +#include "theme_repository.h" + +#include "theme_json_utils.h" + +#include +#include +#include +#include +#include + +#include + +namespace { +QString builtinNameFromFileName(QString fileName) +{ + if (fileName.endsWith(".json")) + fileName.chop(5); + + if (fileName.startsWith("builtin_")) + fileName.remove(0, 8); + + return fileName; +} + +int builtinSortRank(const QString &name) +{ + if (name == QStringLiteral("classic")) + return 0; + if (name == QStringLiteral("light")) + return 1; + if (name == QStringLiteral("dark")) + return 2; + return 3; +} +} + +ThemeRepository::ThemeRepository(const QString &qrcPrefix, const QString &userThemesDir, const QString &targetApp) + : qrcPrefix(qrcPrefix), userThemesDir(userThemesDir), targetApp(targetApp) +{ + scanBuiltins(); + scanUserThemes(); +} + +QList ThemeRepository::availableThemes() const +{ + QList result; + result.reserve(builtins.size() + userThemes.size()); + + for (const auto &b : builtins) + result.append({ b.meta.id, b.meta.displayName, b.meta.variant, true }); + + for (const auto &u : userThemes) + result.append({ u.meta.id, u.meta.displayName, u.meta.variant, false }); + + return result; +} + +bool ThemeRepository::contains(const QString &themeId) const +{ + for (const auto &b : builtins) + if (b.id == themeId) + return true; + + for (const auto &u : userThemes) + if (u.id == themeId) + return true; + + return false; +} + +QJsonObject ThemeRepository::loadThemeJson(const QString &themeId) const +{ + for (const auto &b : builtins) { + if (b.id != themeId) + continue; + + QJsonObject json = readJsonFile(b.resourcePath); + if (json.isEmpty()) + return { }; + + auto meta = json["meta"].toObject(); + meta["id"] = b.id; + json["meta"] = meta; + return json; + } + + for (const auto &u : userThemes) + if (u.id == themeId) + return readJsonFile(u.filePath); + + return { }; +} + +QString ThemeRepository::saveUserTheme(QJsonObject themeJson) +{ + QDir().mkpath(userThemesDir); + + auto metaObj = themeJson["meta"].toObject(); + QString id = metaObj["id"].toString(); + + if (id.isEmpty() || id.startsWith("builtin/")) { + const QString uuid = QUuid::createUuid().toString(QUuid::WithoutBraces); + id = "user/" + uuid; + metaObj["id"] = id; + } + + // Always stamp targetApp so saved themes are always identifiable + if (metaObj["targetApp"].toString().isEmpty()) + metaObj["targetApp"] = targetApp; + + themeJson["meta"] = metaObj; + + // Extract uuid from "user/" + const QString uuid = id.mid(5); // skip "user/" + const QString filePath = filePathForUserTheme(uuid); + + QFile file(filePath); + if (file.open(QIODevice::WriteOnly)) { + file.write(serializeNormalizedThemeJson(themeJson)); + file.close(); + } + + // Update cache + refresh(); + + return id; +} + +bool ThemeRepository::deleteUserTheme(const QString &themeId) +{ + if (themeId.startsWith("builtin/")) + return false; + + for (const auto &u : userThemes) { + if (u.id == themeId) { + const bool removed = QFile::remove(u.filePath); + if (removed) + refresh(); + return removed; + } + } + + return false; +} + +QString ThemeRepository::importThemeFromFile(const QString &filePath, QString *errorMessage) +{ + QJsonObject json = readJsonFile(filePath); + if (json.isEmpty()) { + if (errorMessage) + *errorMessage = QObject::tr("The file could not be read or is not valid JSON."); + return { }; + } + + // Check that the theme targets the correct application + const auto metaIn = json["meta"].toObject(); + const QString themeTargetApp = metaIn["targetApp"].toString(); + if (!themeTargetApp.isEmpty() && themeTargetApp != targetApp) { + if (errorMessage) + *errorMessage = QObject::tr("This theme is for %1, not %2.").arg(themeTargetApp, targetApp); + return { }; + } + + // Force a new user id regardless of what the file contains + auto metaObj = json["meta"].toObject(); + const QString uuid = QUuid::createUuid().toString(QUuid::WithoutBraces); + const QString id = "user/" + uuid; + metaObj["id"] = id; + json["meta"] = metaObj; + + return saveUserTheme(json); +} + +void ThemeRepository::refresh() +{ + scanUserThemes(); +} + +// --- Private helpers --- + +void ThemeRepository::scanBuiltins() +{ + builtins.clear(); + + QDir dir(qrcPrefix); + QStringList builtinFiles = dir.entryList({ QStringLiteral("builtin_*.json") }, QDir::Files, QDir::Name); + std::sort(builtinFiles.begin(), builtinFiles.end(), [](const QString &lhs, const QString &rhs) { + const QString lhsName = builtinNameFromFileName(lhs); + const QString rhsName = builtinNameFromFileName(rhs); + const int lhsRank = builtinSortRank(lhsName); + const int rhsRank = builtinSortRank(rhsName); + if (lhsRank != rhsRank) + return lhsRank < rhsRank; + return lhsName < rhsName; + }); + + for (const auto &fileName : builtinFiles) { + const QString name = builtinNameFromFileName(fileName); + if (name.isEmpty()) + continue; + + const QString resourcePath = dir.absoluteFilePath(fileName); + const QJsonObject json = readJsonFile(resourcePath); + if (json.isEmpty()) + continue; + + BuiltinEntry entry; + entry.id = "builtin/" + name; + entry.resourcePath = resourcePath; + entry.meta = extractMeta(json); + // Ensure the id matches the canonical form + entry.meta.id = entry.id; + builtins.append(entry); + } +} + +void ThemeRepository::scanUserThemes() +{ + userThemes.clear(); + + QDir dir(userThemesDir); + if (!dir.exists()) + return; + + const auto entries = dir.entryList({ "*.json" }, QDir::Files); + for (const auto &fileName : entries) { + const QString filePath = dir.absoluteFilePath(fileName); + const QJsonObject json = readJsonFile(filePath); + if (json.isEmpty()) + continue; + + ThemeMeta meta = extractMeta(json); + if (meta.id.isEmpty()) { + // Derive id from filename (strip .json extension) + const QString baseName = fileName.chopped(5); // remove ".json" + meta.id = "user/" + baseName; + } + + UserEntry entry; + entry.id = meta.id; + entry.filePath = filePath; + entry.meta = meta; + userThemes.append(entry); + } +} + +ThemeMeta ThemeRepository::extractMeta(const QJsonObject &json) +{ + const auto meta = json["meta"].toObject(); + return ThemeMeta { + meta["id"].toString(), + meta["displayName"].toString(), + (meta["variant"].toString() == "light") ? ThemeVariant::Light : ThemeVariant::Dark, + meta["targetApp"].toString(), + meta["version"].toString() + }; +} + +QJsonObject ThemeRepository::readJsonFile(const QString &path) +{ + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) + return { }; + + const QByteArray data = file.readAll(); + QJsonParseError error; + const QJsonDocument doc = QJsonDocument::fromJson(data, &error); + if (error.error != QJsonParseError::NoError) + return { }; + + return doc.object(); +} + +QString ThemeRepository::filePathForUserTheme(const QString &uuid) const +{ + return userThemesDir + "/" + uuid + ".json"; +} diff --git a/common/themes/theme_repository.h b/common/themes/theme_repository.h new file mode 100644 index 000000000..e1eeaebd3 --- /dev/null +++ b/common/themes/theme_repository.h @@ -0,0 +1,58 @@ +#ifndef THEME_REPOSITORY_H +#define THEME_REPOSITORY_H + +#include "theme_meta.h" + +#include +#include +#include + +struct ThemeListEntry { + QString id; + QString displayName; + ThemeVariant variant; + bool isBuiltin; +}; + +class ThemeRepository +{ +public: + explicit ThemeRepository(const QString &qrcPrefix, const QString &userThemesDir, const QString &targetApp); + + QList availableThemes() const; + bool contains(const QString &themeId) const; + QJsonObject loadThemeJson(const QString &themeId) const; + + QString saveUserTheme(QJsonObject themeJson); + bool deleteUserTheme(const QString &themeId); + QString importThemeFromFile(const QString &filePath, QString *errorMessage = nullptr); + + void refresh(); + +private: + QString qrcPrefix; + QString userThemesDir; + QString targetApp; + + struct BuiltinEntry { + QString id; + QString resourcePath; + ThemeMeta meta; + }; + QList builtins; + + struct UserEntry { + QString id; + QString filePath; + ThemeMeta meta; + }; + QList userThemes; + + void scanBuiltins(); + void scanUserThemes(); + static ThemeMeta extractMeta(const QJsonObject &json); + static QJsonObject readJsonFile(const QString &path); + QString filePathForUserTheme(const QString &uuid) const; +}; + +#endif // THEME_REPOSITORY_H diff --git a/common/themes/theme_variant.h b/common/themes/theme_variant.h new file mode 100644 index 000000000..adff03274 --- /dev/null +++ b/common/themes/theme_variant.h @@ -0,0 +1,9 @@ +#ifndef THEME_VARIANT_H +#define THEME_VARIANT_H + +enum class ThemeVariant { + Light, + Dark, +}; + +#endif // THEME_VARIANT_H diff --git a/common/themes/yacreader_icon.h b/common/themes/yacreader_icon.h new file mode 100644 index 000000000..152d46a00 --- /dev/null +++ b/common/themes/yacreader_icon.h @@ -0,0 +1,12 @@ +#ifndef YACREADER_ICON_H +#define YACREADER_ICON_H + +#include +#include + +struct YACReaderIcon { + QIcon icon; + QSize size; +}; + +#endif // YACREADER_ICON_H diff --git a/common/version.h.in b/common/version.h.in new file mode 100644 index 000000000..07b9f88d0 --- /dev/null +++ b/common/version.h.in @@ -0,0 +1,6 @@ +#ifndef YACREADER_VERSION_H +#define YACREADER_VERSION_H + +#define VERSION "@PROJECT_VERSION@" + +#endif diff --git a/common/worker_thread.h b/common/worker_thread.h index dc1db19af..8b846d973 100644 --- a/common/worker_thread.h +++ b/common/worker_thread.h @@ -4,11 +4,11 @@ #include "release_acquire_atomic.h" #include -#include +#include #include #include -#include #include +#include //! Usage: //! 1. call performTask(); diff --git a/common/yacreader_global.cpp b/common/yacreader_global.cpp index f4da42d98..5d89304ba 100644 --- a/common/yacreader_global.cpp +++ b/common/yacreader_global.cpp @@ -1,9 +1,9 @@ #include "yacreader_global.h" -#include -#include -#include #include +#include +#include +#include using namespace YACReader; @@ -12,6 +12,40 @@ QString YACReader::getSettingsPath() return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); } +QString YACReader::getCommonSettingsPath() +{ + const auto organizationName = QCoreApplication::organizationName().trimmed(); + const auto basePath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + + if (organizationName.isEmpty()) + return basePath; + + return QDir(basePath).filePath(organizationName); +} + +QString YACReader::getCommonSettingsFilePath() +{ + return QDir(getCommonSettingsPath()).filePath("YACReaderCommon.ini"); +} + +QString YACReader::getPluginsPath() +{ + return QDir(getCommonSettingsPath()).filePath("plugins"); +} + +QString YACReader::getImageFormatsPluginsPath() +{ + return QDir(getPluginsPath()).filePath("imageformats"); +} + +void YACReader::initializeSharedPluginPaths() +{ + QDir().mkpath(getImageFormatsPluginsPath()); + + const QString pluginsPath = QDir(getPluginsPath()).absolutePath(); + QCoreApplication::addLibraryPath(pluginsPath); +} + QString YACReader::colorToName(LabelColors colors) { switch (colors) { diff --git a/common/yacreader_global.h b/common/yacreader_global.h index 7c2bf1ac5..810878628 100644 --- a/common/yacreader_global.h +++ b/common/yacreader_global.h @@ -1,15 +1,18 @@ #ifndef __YACREADER_GLOBAL_H #define __YACREADER_GLOBAL_H -#include -#include -#include #include +#include #include +#include +#include class QLibrary; -#define VERSION "9.16.4" +// Compatibility for already released apps that still parse this file for update checks. +// TODO: remove after old releases have migrated away from scraping this header. +// #define VERSION "10.0.0" +#include "version.h" // Used to check if the database needs to be updated, the version is stored in the database. // This value is only incremented when the database structure changes. @@ -103,6 +106,11 @@ QDataStream &operator<<(QDataStream &stream, const OpenComicSource &source); QDataStream &operator>>(QDataStream &stream, OpenComicSource &source); QString getSettingsPath(); +QString getCommonSettingsPath(); +QString getCommonSettingsFilePath(); +QString getPluginsPath(); +QString getImageFormatsPluginsPath(); +void initializeSharedPluginPaths(); QString colorToName(LabelColors colors); QString labelColorToRGBString(LabelColors color); QLibrary *load7zLibrary(); diff --git a/common/yacreader_global_gui.cpp b/common/yacreader_global_gui.cpp index 7ad76dfae..f86dc449d 100644 --- a/common/yacreader_global_gui.cpp +++ b/common/yacreader_global_gui.cpp @@ -1,9 +1,9 @@ #include "yacreader_global_gui.h" -#include #include -#include #include +#include +#include using namespace YACReader; @@ -32,7 +32,7 @@ QIcon YACReader::noHighlightedIcon(const QString &path) return icon; } -void YACReader::colorize(QImage &img, QColor &col) +void YACReader::colorize(QImage &img, const QColor &col) { QRgb *data = (QRgb *)img.bits(); QRgb *end = data + img.width() * img.height(); @@ -53,30 +53,9 @@ QList YACReader::mimeDataToComicsIds(const QMimeData *data) return comicIds; } -// TODO some SVG assets are missing in macos (WIP) -// we need two sets of icons, one for the toolbar and one for the context menu because of this bug (QTBUG-96553): https://bugreports.qt.io/browse/QTBUG-96553 - -QString YACReader::addExtensionToIconPath(const QString &path) -{ -#ifdef YACREADER_LIBRARY -#ifdef Q_OS_MACOS // TODO_Y_MAC_UI - return path + ".png"; -#else - return path + ".svg"; -#endif -#else - return path + ".svg"; -#endif -} - -QString YACReader::addExtensionToIconPathInToolbar(const QString &path) -{ - return path + "_18x18.svg"; -} - -QAction *YACReader::actionWithCustomIcon(const QIcon &icon, QAction *action) +QAction *YACReader::wrappedToolbarAction(QAction *action) { - auto a = new QAction(icon, action->text()); + auto a = new QAction(action->text()); a->setEnabled(action->isEnabled()); a->setCheckable(action->isCheckable()); @@ -94,6 +73,9 @@ QAction *YACReader::actionWithCustomIcon(const QIcon &icon, QAction *action) QObject::connect(a, &QAction::toggled, action, &QAction::setChecked); QObject::connect(action, &QAction::toggled, a, &QAction::setChecked); + // asign a to action somehow so we can retrieve it later + action->setProperty("wrappedToolbarAction", QVariant::fromValue(a)); + return a; } diff --git a/common/yacreader_global_gui.h b/common/yacreader_global_gui.h index a4e667e4a..e8e1c4199 100644 --- a/common/yacreader_global_gui.h +++ b/common/yacreader_global_gui.h @@ -3,10 +3,11 @@ #include "yacreader_global.h" -#include #include +#include #define PATH "PATH" +#define UI_LANGUAGE "UI_LANGUAGE" #define MAG_GLASS_SIZE "MAG_GLASS_SIZE" #define MAG_GLASS_ZOOM "MAG_GLASS_ZOOM" #define ZOOM_LEVEL "ZOOM_LEVEL" @@ -23,8 +24,9 @@ #define START_TO_TRAY "START_TO_TRAY" #define DOUBLE_PAGE "DOUBLE_PAGE" #define DOUBLE_MANGA_PAGE "DOUBLE_MANGA_PAGE" +#define CONTINUOUS_SCROLL "CONTINUOUS_SCROLL" #define COVER_IS_SP "COVER_IS_SP" -#define BACKGROUND_COLOR "BACKGROUND_COLOR" +#define BACKGROUND_COLOR "BACKGROUND_COLOR_10" #define SHOW_TOOLBARS "SHOW_TOOLBARS" #define BRIGHTNESS "BRIGHTNESS" #define CONTRAST "CONTRAST" @@ -38,6 +40,7 @@ #define USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE "USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE" #define DISABLE_SCROLL_ANIMATION "DISABLE_SCROLL_ANIMATION" #define MOUSE_MODE "MOUSE_MODE" +#define SCALING_METHOD "SCALING_METHOD" #define FLOW_TYPE_GL "FLOW_TYPE_GL" #define Y_POSITION "Y_POSITION" @@ -108,11 +111,9 @@ enum LibraryUITheme { void addSperator(QWidget *w); QAction *createSeparator(); QIcon noHighlightedIcon(const QString &path); -void colorize(QImage &img, QColor &col); +void colorize(QImage &img, const QColor &col); QList mimeDataToComicsIds(const QMimeData *data); -QString addExtensionToIconPath(const QString &path); -QString addExtensionToIconPathInToolbar(const QString &path); -QAction *actionWithCustomIcon(const QIcon &icon, QAction *action); +QAction *wrappedToolbarAction(QAction *action); QPixmap hdpiPixmap(const QString &file, QSize size); QString imageFileLoader(QWidget *parent); QString imagePathFromMimeData(const QMimeData *mimeData); diff --git a/compileOSX.sh b/compileOSX.sh index bd92627fc..519624dfb 100755 --- a/compileOSX.sh +++ b/compileOSX.sh @@ -1,7 +1,7 @@ #! /bin/bash set -e -VERSION=${1:-"9.9.1"} +VERSION=${1:-$(tr -d '\r\n' < VERSION)} BUILD_NUMBER=${2:-"0"} @@ -21,37 +21,31 @@ if [ "$ARCH" == "x86_64" ]; then ARCHS="x86_64" ARCH_NAME="Intel" else - ARCHS="x86_64 arm64" + ARCHS="x86_64;arm64" ARCH_NAME="U" fi echo "Building for $ARCH_NAME" -hash qmake 2>/dev/null || { echo >&2 "Qmake command not available. Please add the bin subfolder of your Qt installation to the PATH environment variable."; exit 1; } +hash cmake 2>/dev/null || { echo >&2 "cmake command not available. Please add cmake to your PATH."; exit 1; } -echo "Compiling YACReader" -cd YACReader -qmake DEFINES+="BUILD_NUMBER=\\\\\\\"${BUILD_NUMBER}\\\\\\\"" QMAKE_APPLE_DEVICE_ARCHS="$ARCHS" -make -cd .. +echo "Configuring and building with CMake" +cmake -B build \ + -G Ninja \ + -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=pdfkit \ + -DBUILD_NUMBER="${BUILD_NUMBER}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_OSX_ARCHITECTURES="${ARCHS}" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=11 -echo "Compiling YACReaderLibrary" -cd YACReaderLibrary -qmake DEFINES+="BUILD_NUMBER=\\\\\\\"${BUILD_NUMBER}\\\\\\\"" QMAKE_APPLE_DEVICE_ARCHS="$ARCHS" -make -cd .. - -echo "Compiling YACReaderLibraryServer" -cd YACReaderLibraryServer -qmake DEFINES+="BUILD_NUMBER=\\\\\\\"${BUILD_NUMBER}\\\\\\\"" QMAKE_APPLE_DEVICE_ARCHS="$ARCHS" -make -cd .. +cmake --build build --parallel echo "Configuring release apps" -cp -R YACReader/YACReader.app YACReader.app -cp -R YACReaderLibrary/YACReaderLibrary.app YACReaderLibrary.app -cp -R YACReaderLibraryServer/YACReaderLibraryServer.app YACReaderLibraryServer.app +cp -R build/bin/YACReader.app YACReader.app +cp -R build/bin/YACReaderLibrary.app YACReaderLibrary.app +cp -R build/bin/YACReaderLibraryServer.app YACReaderLibraryServer.app hash macdeployqt 2>/dev/null || { echo >&2 "macdeployqt command not available. Please add the bin subfolder of your Qt installation to the PATH environment variable."; exit 1; } @@ -71,14 +65,22 @@ cp -R dependencies/7zip/macx/${ARCH}/* YACReaderLibraryServer.app/Contents/MacOS cp -R release/server YACReaderLibrary.app/Contents/MacOS/ cp -R release/server YACReaderLibraryServer.app/Contents/MacOS/ -cp -R release/languages YACReader.app/Contents/MacOS/ -cp -R release/languages YACReaderLibrary.app/Contents/MacOS/ -cp -R release/languages YACReaderLibraryServer.app/Contents/MacOS/ + +# Collect cmake-generated .qm translation files from the build tree +# (release/languages is not tracked in git; cmake generates .qm in build subdirs) +mkdir -p YACReader.app/Contents/MacOS/languages +mkdir -p YACReaderLibrary.app/Contents/MacOS/languages +mkdir -p YACReaderLibraryServer.app/Contents/MacOS/languages +find build -name "*.qm" ! -name "*_source.qm" -exec cp {} YACReader.app/Contents/MacOS/languages/ \; +find build -name "*.qm" ! -name "*_source.qm" -exec cp {} YACReaderLibrary.app/Contents/MacOS/languages/ \; +find build -name "*.qm" ! -name "*_source.qm" -exec cp {} YACReaderLibraryServer.app/Contents/MacOS/languages/ \; /usr/libexec/PlistBuddy -c "Add :CFBundleVersion string ${BUILD_NUMBER}" YACReader.app/Contents/Info.plist /usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string ${VERSION}" YACReader.app/Contents/Info.plist /usr/libexec/PlistBuddy -c "Add :CFBundleVersion string ${BUILD_NUMBER}" YACReaderLibrary.app/Contents/Info.plist /usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string ${VERSION}" YACReaderLibrary.app/Contents/Info.plist +/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${BUILD_NUMBER}" YACReaderLibraryServer.app/Contents/Info.plist +/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${VERSION}" YACReaderLibraryServer.app/Contents/Info.plist if [ "$SKIP_CODESIGN" = false ]; then ./signapps.sh diff --git a/compressed_archive/7z_includes.h b/compressed_archive/7z_includes.h index 34668e43f..59be0178d 100644 --- a/compressed_archive/7z_includes.h +++ b/compressed_archive/7z_includes.h @@ -1,6 +1,9 @@ #ifndef _7Z_INCLUDES_H #define _7Z_INCLUDES_H +// clang-format off +// Umbrella header for 7zip. Include order is load-bearing: +// MyInitGuid.h must precede all interface headers that use DEFINE_GUID. extern "C" { #include "lib7zip/C/Alloc.h" #include "lib7zip/C/7zTypes.h" @@ -30,4 +33,6 @@ extern "C" { #include "lib7zip/CPP/7zip/Common/StreamObjects.h" #include "lib7zip/CPP/7zip/Common/StreamUtils.h" +// clang-format on + #endif // _7Z_INCLUDES_H diff --git a/compressed_archive/CMakeLists.txt b/compressed_archive/CMakeLists.txt new file mode 100644 index 000000000..6fd5adcf9 --- /dev/null +++ b/compressed_archive/CMakeLists.txt @@ -0,0 +1,129 @@ +# Comic archive decompression backend (cbx_backend) +# Switched on DECOMPRESSION_BACKEND: unarr | 7zip | libarchive + +add_library(cbx_backend STATIC) +yacreader_apply_build_options(cbx_backend) + +if(DECOMPRESSION_BACKEND STREQUAL "unarr") + message(STATUS "Decompression backend: unarr") + + target_sources(cbx_backend PRIVATE + unarr/compressed_archive.cpp + unarr/compressed_archive.h + unarr/extract_delegate.h + ) + target_include_directories(cbx_backend PUBLIC unarr) + target_compile_definitions(cbx_backend PUBLIC use_unarr) + + find_package(unarr QUIET CONFIG) + if(TARGET unarr::unarr) + message(STATUS " Found unarr via CMake config") + else() + find_package(unarr QUIET MODULE) + endif() + + if(NOT TARGET unarr::unarr) + message(FATAL_ERROR + "Could not find unarr. Install libunarr or use a different DECOMPRESSION_BACKEND.") + endif() + + if(unarr_PROVIDER) + message(STATUS " Found unarr via ${unarr_PROVIDER}") + endif() + + target_link_libraries(cbx_backend PRIVATE unarr::unarr) + +elseif(DECOMPRESSION_BACKEND STREQUAL "7zip") + message(STATUS "Decompression backend: 7zip (in-tree)") + + # Auto-download 7zip source if not present + if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib7zip/CPP") + include(FetchContent) + FetchContent_Declare( + lib7zip + URL "https://github.com/YACReader/yacreader-7z-deps/raw/main/7z2301-src.7z" + SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib7zip" + DOWNLOAD_EXTRACT_TIMESTAMP ON + ) + message(STATUS " Downloading 7zip source from yacreader-7z-deps...") + FetchContent_MakeAvailable(lib7zip) + endif() + + target_sources(cbx_backend PRIVATE + compressed_archive.cpp + compressed_archive.h + extract_delegate.h + 7z_includes.h + open_callbacks.h + extract_callbacks.h + lib7zip/CPP/Windows/FileIO.cpp + lib7zip/CPP/Windows/PropVariant.cpp + lib7zip/CPP/Windows/PropVariantConv.cpp + lib7zip/CPP/Common/IntToString.cpp + lib7zip/CPP/Common/MyString.cpp + lib7zip/CPP/Common/MyVector.cpp + lib7zip/CPP/Common/Wildcard.cpp + lib7zip/CPP/7zip/Common/FileStreams.cpp + lib7zip/C/Alloc.c + lib7zip/CPP/7zip/Common/StreamObjects.cpp + ) + + if(UNIX) + target_sources(cbx_backend PRIVATE + lib7zip/CPP/Common/NewHandler.cpp + lib7zip/CPP/Windows/DLL.cpp + lib7zip/CPP/Windows/FileDir.cpp + lib7zip/CPP/Windows/FileFind.cpp + lib7zip/CPP/Windows/FileName.cpp + lib7zip/CPP/Windows/TimeUtils.cpp + lib7zip/CPP/Common/UTFConvert.cpp + lib7zip/CPP/Common/MyWindows.cpp + lib7zip/CPP/Common/StringConvert.cpp + ) + endif() + + target_include_directories(cbx_backend + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE lib7zip/CPP + ) + + if(APPLE) + target_compile_definitions(cbx_backend PRIVATE + _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _REENTRANT + ENV_UNIX _7ZIP_LARGE_PAGES ENV_MACOSX _TCHAR_DEFINED + UNICODE _UNICODE UNIX_USE_WIN_FILE) + target_link_libraries(cbx_backend PRIVATE + "-framework IOKit" "-framework CoreFoundation") + elseif(UNIX) + target_compile_definitions(cbx_backend PRIVATE + _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE _REENTRANT + ENV_UNIX _7ZIP_LARGE_PAGES UNICODE _UNICODE UNIX_USE_WIN_FILE) + endif() + +elseif(DECOMPRESSION_BACKEND STREQUAL "libarchive") + message(STATUS "Decompression backend: libarchive") + + if(WIN32 OR APPLE) + message(FATAL_ERROR "libarchive backend is not supported on Windows or macOS") + endif() + + target_sources(cbx_backend PRIVATE + libarchive/compressed_archive.cpp + libarchive/compressed_archive.h + libarchive/extract_delegate.h + ) + target_include_directories(cbx_backend PUBLIC libarchive) + target_compile_definitions(cbx_backend PUBLIC use_libarchive) + + find_package(LibArchive REQUIRED) + message(STATUS " Found libarchive ${LibArchive_VERSION}") + target_link_libraries(cbx_backend PRIVATE LibArchive::LibArchive) + +else() + message(FATAL_ERROR + "Unknown DECOMPRESSION_BACKEND: '${DECOMPRESSION_BACKEND}'. " + "Use: unarr, 7zip, or libarchive") +endif() + +# Qt, yr_global, and QsLog are needed by all backends +target_link_libraries(cbx_backend PRIVATE Qt6::Core yr_global QsLog) diff --git a/compressed_archive/StdAfx.h b/compressed_archive/StdAfx.h index b23436e93..76d067d29 100644 --- a/compressed_archive/StdAfx.h +++ b/compressed_archive/StdAfx.h @@ -3,7 +3,7 @@ #ifndef __STDAFX_H #define __STDAFX_H -#include #include +#include #endif diff --git a/compressed_archive/compressed_archive.cpp b/compressed_archive/compressed_archive.cpp index 2962eba74..dd878007b 100644 --- a/compressed_archive/compressed_archive.cpp +++ b/compressed_archive/compressed_archive.cpp @@ -1,21 +1,18 @@ -#include - #include "compressed_archive.h" + +#include "QsLog.h" +#include "extract_callbacks.h" #include "extract_delegate.h" +#include "open_callbacks.h" #include "yacreader_global.h" -#include -#include -#include #include +#include +#include +#include +#include -#include "open_callbacks.h" -#include "extract_callbacks.h" - -#include "7z_includes.h" -#include "lib7zip/CPP/Common/MyInitGuid.h" - -#include "QsLog.h" +#include #define _MY_WINAPI WINAPI @@ -240,7 +237,7 @@ QVector CompressedArchive::translateIndexes(const QVector &ind { QVector translatedIndexes; - foreach (quint32 i, indexes) { + for (const quint32 i : std::as_const(indexes)) { if (i < (quint32)offsets.length()) translatedIndexes.append(offsets.at(i)); } diff --git a/compressed_archive/compressed_archive.h b/compressed_archive/compressed_archive.h index b691527e3..90634f813 100644 --- a/compressed_archive/compressed_archive.h +++ b/compressed_archive/compressed_archive.h @@ -6,9 +6,9 @@ class ExtractDelegate; class QLibrary; -#include #include #include +#include struct SevenZipInterface; diff --git a/compressed_archive/extract_callbacks.h b/compressed_archive/extract_callbacks.h index 7acb50c9d..54e251cb9 100644 --- a/compressed_archive/extract_callbacks.h +++ b/compressed_archive/extract_callbacks.h @@ -3,6 +3,7 @@ #include "7z_includes.h" #include "extract_delegate.h" + #include using namespace NWindows; diff --git a/compressed_archive/libarchive/README.md b/compressed_archive/libarchive/README.md index 71c8d11aa..759d8639f 100644 --- a/compressed_archive/libarchive/README.md +++ b/compressed_archive/libarchive/README.md @@ -7,9 +7,9 @@ This backend is currently only supported on the Linux platform. ## Using -Enabling this backend is achieved by adding the `libarchive` qmake configuration value: +Enable this backend by setting the `DECOMPRESSION_BACKEND` CMake option: - qmake CONFIG+=libarchive + cmake -B build -DDECOMPRESSION_BACKEND=libarchive Upon success, the application can be built as normal. diff --git a/compressed_archive/libarchive/compressed_archive.h b/compressed_archive/libarchive/compressed_archive.h index d7accc4fd..2df1fb9f5 100644 --- a/compressed_archive/libarchive/compressed_archive.h +++ b/compressed_archive/libarchive/compressed_archive.h @@ -3,8 +3,8 @@ #include "extract_delegate.h" -#include #include +#include extern "C" { #include diff --git a/compressed_archive/libarchive/libarchive-wrapper.pri b/compressed_archive/libarchive/libarchive-wrapper.pri deleted file mode 100644 index c9bcd8254..000000000 --- a/compressed_archive/libarchive/libarchive-wrapper.pri +++ /dev/null @@ -1,31 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += $$PWD/extract_delegate.h \ - $$PWD/compressed_archive.h - -SOURCES += $$PWD/compressed_archive.cpp - -if(mingw|unix):!macx:!contains(QT_CONFIG, no-pkg-config):packagesExist(libarchive) { - message(Using system provided libarchive installation found by pkg-config.) - !system(pkg-config --atleast-version=3.6.0 libarchive) { - LIBARCHIVE_WARNING = "libarchive < 3.6.0 found. Older versions of libarchive DO NOT SUPPORT RARv4 files. This is probably not what you want" - warning($$LIBARCHIVE_WARNING) - message($$LIBARCHIVE_WARNING) - } - - CONFIG += link_pkgconfig - PKGCONFIG += libarchive - DEFINES += use_libarchive - } -else:unix:!macx:exists(/usr/include/archive.h) { - message(Using system provided libarchive installation.) - LIBS += -larchive - DEFINES += use_libarchive -} -else:if(win32|macx) { - error(Unsupported: the libarchive decompression backend is not currently supported on this system.) -} -else { - error(Missing dependency: libarchive decompression backend. Please install libarchive on your system) -} diff --git a/compressed_archive/libp7zip.patch b/compressed_archive/libp7zip.patch deleted file mode 100644 index 872b8d76c..000000000 --- a/compressed_archive/libp7zip.patch +++ /dev/null @@ -1,305 +0,0 @@ -previous patch ---- libp7zip/CPP/include_windows/windows.h -+++ libp7zip/CPP/include_windows/windows.h -@@ -36,7 +36,7 @@ - #define WINAPI - - #undef BOOL --typedef int BOOL; -+typedef signed char BOOL; - - - #define CREATE_NEW 1 - -fix linux build ---- libp7zip/CPP/myWindows/StdAfx.h -+++ libp7zip/CPP/myWindows/StdAfx.h -@@ -206,8 +206,6 @@ - - #if defined( __x86_64__ ) - --#define _WIN64 1 -- - #endif - - #endif - -CVE-2016-9296 ---- libp7zip/CPP/7zip/Archive/7z/7zIn.cpp -+++ libp7zip/CPP/7zip/Archive/7z/7zIn.cpp -@@ -1097,7 +1097,8 @@ - if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i]) - ThrowIncorrect(); - } -- HeadersSize += folders.PackPositions[folders.NumPackStreams]; -+ if (folders.PackPositions) -+ HeadersSize += folders.PackPositions[folders.NumPackStreams]; - return S_OK; - } - -CVE-2017-17969 ---- libp7zip/CPP/7zip/Compress/ShrinkDecoder.cpp -+++ libp7zip/CPP/7zip/Compress/ShrinkDecoder.cpp -@@ -121,8 +121,13 @@ - { - _stack[i++] = _suffixes[cur]; - cur = _parents[cur]; -+ if (cur >= kNumItems || i >= kNumItems) -+ break; - } -- -+ -+ if (cur >= kNumItems || i >= kNumItems) -+ break; -+ - _stack[i++] = (Byte)cur; - lastChar2 = (Byte)cur; - - - - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar1Decoder.cpp -+++ libp7zip/CPP/7zip/Compress/Rar1Decoder.cpp -@@ -29,7 +29,7 @@ public: - }; - */ - --CDecoder::CDecoder(): m_IsSolid(false) { } -+CDecoder::CDecoder(): m_IsSolid(false), _errorMode(false) { } - - void CDecoder::InitStructures() - { -@@ -406,9 +406,14 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * - InitData(); - if (!m_IsSolid) - { -+ _errorMode = false; - InitStructures(); - InitHuff(); - } -+ -+ if (_errorMode) -+ return S_FALSE; -+ - if (m_UnpackSize > 0) - { - GetFlagsBuf(); -@@ -477,9 +482,9 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream - const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress) - { - try { return CodeReal(inStream, outStream, inSize, outSize, progress); } -- catch(const CInBufferException &e) { return e.ErrorCode; } -- catch(const CLzOutWindowException &e) { return e.ErrorCode; } -- catch(...) { return S_FALSE; } -+ catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } -+ catch(const CLzOutWindowException &e) { _errorMode = true; return e.ErrorCode; } -+ catch(...) { _errorMode = true; return S_FALSE; } - } - - STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar1Decoder.h -+++ libp7zip/CPP/7zip/Compress/Rar1Decoder.h -@@ -39,6 +39,7 @@ public: - - Int64 m_UnpackSize; - bool m_IsSolid; -+ bool _errorMode; - - UInt32 ReadBits(int numBits); - HRESULT CopyBlock(UInt32 distance, UInt32 len); - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar2Decoder.cpp -+++ blibp7zip/CPP/7zip/Compress/Rar2Decoder.cpp -@@ -80,7 +80,8 @@ static const UInt32 kHistorySize = 1 << 20; - static const UInt32 kWindowReservSize = (1 << 22) + 256; - - CDecoder::CDecoder(): -- m_IsSolid(false) -+ m_IsSolid(false), -+ m_TablesOK(false) - { - } - -@@ -100,6 +101,8 @@ UInt32 CDecoder::ReadBits(unsigned numBits) { return m_InBitStream.ReadBits(numB - - bool CDecoder::ReadTables(void) - { -+ m_TablesOK = false; -+ - Byte levelLevels[kLevelTableSize]; - Byte newLevels[kMaxTableSize]; - m_AudioMode = (ReadBits(1) == 1); -@@ -170,6 +173,8 @@ bool CDecoder::ReadTables(void) - } - - memcpy(m_LastLevels, newLevels, kMaxTableSize); -+ m_TablesOK = true; -+ - return true; - } - -@@ -344,6 +349,9 @@ HRESULT CDecoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream * - return S_FALSE; - } - -+ if (!m_TablesOK) -+ return S_FALSE; -+ - UInt64 startPos = m_OutWindowStream.GetProcessedSize(); - while (pos < unPackSize) - { - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar2Decoder.h -+++ libp7zip/CPP/7zip/Compress/Rar2Decoder.h -@@ -139,6 +139,7 @@ class CDecoder : - - UInt64 m_PackSize; - bool m_IsSolid; -+ bool m_TablesOK; - - void InitStructures(); - UInt32 ReadBits(unsigned numBits); - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar3Decoder.cpp -+++ libp7zip/CPP/7zip/Compress/Rar3Decoder.cpp -@@ -92,7 +92,8 @@ CDecoder::CDecoder(): - _writtenFileSize(0), - _vmData(0), - _vmCode(0), -- m_IsSolid(false) -+ m_IsSolid(false), -+ _errorMode(false) - { - Ppmd7_Construct(&_ppmd); - } -@@ -545,6 +546,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) - return InitPPM(); - } - -+ TablesRead = false; -+ TablesOK = false; -+ - _lzMode = true; - PrevAlignBits = 0; - PrevAlignCount = 0; -@@ -606,6 +610,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) - } - } - } -+ if (InputEofError()) -+ return S_FALSE; -+ - TablesRead = true; - - // original code has check here: -@@ -623,6 +630,9 @@ HRESULT CDecoder::ReadTables(bool &keepDecompressing) - RIF(m_LenDecoder.Build(&newLevels[kMainTableSize + kDistTableSize + kAlignTableSize])); - - memcpy(m_LastLevels, newLevels, kTablesSizesSum); -+ -+ TablesOK = true; -+ - return S_OK; - } - -@@ -824,7 +834,12 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) - PpmEscChar = 2; - PpmError = true; - InitFilters(); -+ _errorMode = false; - } -+ -+ if (_errorMode) -+ return S_FALSE; -+ - if (!m_IsSolid || !TablesRead) - { - bool keepDecompressing; -@@ -838,6 +853,8 @@ HRESULT CDecoder::CodeReal(ICompressProgressInfo *progress) - bool keepDecompressing; - if (_lzMode) - { -+ if (!TablesOK) -+ return S_FALSE; - RINOK(DecodeLZ(keepDecompressing)) - } - else - - -@@ -901,8 +918,8 @@ STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream - _unpackSize = outSize ? *outSize : (UInt64)(Int64)-1; - return CodeReal(progress); - } -- catch(const CInBufferException &e) { return e.ErrorCode; } -- catch(...) { return S_FALSE; } -+ catch(const CInBufferException &e) { _errorMode = true; return e.ErrorCode; } -+ catch(...) { _errorMode = true; return S_FALSE; } - // CNewException is possible here. But probably CNewException is caused - // by error in data stream. - } - -CVE-2018-5996 ---- libp7zip/CPP/7zip/Compress/Rar3Decoder.h -+++ libp7zip/CPP/7zip/Compress/Rar3Decoder.h -@@ -192,6 +192,7 @@ class CDecoder: - UInt32 _lastFilter; - - bool m_IsSolid; -+ bool _errorMode; - - bool _lzMode; - bool _unsupportedFilter; -@@ -200,6 +201,7 @@ class CDecoder: - UInt32 PrevAlignCount; - - bool TablesRead; -+ bool TablesOK; - - CPpmd7 _ppmd; - int PpmEscChar; - -CVE-2021-3465 ---- libp7zip/CPP/7zip/Common/StreamObjects.cpp -+++ libp7zip/CPP/7zip/Common/StreamObjects.cpp -@@ -157,6 +157,8 @@ STDMETHODIMP CDynBufSeqOutStream::Write( - - STDMETHODIMP CBufPtrSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) - { -+ if(_buffer == nullptr || _size == _pos) -+ return E_FAIL; - size_t rem = _size - _pos; - if (rem > size) - rem = (size_t)size; - -GCC10 warning fix ---- libp7zip/CPP/Windows/ErrorMsg.cpp 2015-01-18 11:20:28.000000000 -0700 -+++ libp7zip/CPP/Windows/ErrorMsg.cpp 2019-09-24 13:01:18.887289152 -0600 -@@ -14,14 +14,14 @@ UString MyFormatMessage(DWORD errorCode) - AString msg; - - switch(errorCode) { -- case ERROR_NO_MORE_FILES : txt = "No more files"; break ; -- case E_NOTIMPL : txt = "E_NOTIMPL"; break ; -- case E_NOINTERFACE : txt = "E_NOINTERFACE"; break ; -- case E_ABORT : txt = "E_ABORT"; break ; -- case E_FAIL : txt = "E_FAIL"; break ; -- case STG_E_INVALIDFUNCTION : txt = "STG_E_INVALIDFUNCTION"; break ; -- case E_OUTOFMEMORY : txt = "E_OUTOFMEMORY"; break ; -- case E_INVALIDARG : txt = "E_INVALIDARG"; break ; -+ case unsigned (ERROR_NO_MORE_FILES) : txt = "No more files"; break ; -+ case unsigned (E_NOTIMPL) : txt = "E_NOTIMPL"; break ; -+ case unsigned (E_NOINTERFACE) : txt = "E_NOINTERFACE"; break ; -+ case unsigned (E_ABORT) : txt = "E_ABORT"; break ; -+ case unsigned (E_FAIL) : txt = "E_FAIL"; break ; -+ case unsigned (STG_E_INVALIDFUNCTION) : txt = "STG_E_INVALIDFUNCTION"; break ; -+ case unsigned (E_OUTOFMEMORY) : txt = "E_OUTOFMEMORY"; break ; -+ case unsigned (E_INVALIDARG) : txt = "E_INVALIDARG"; break ; - case ERROR_DIRECTORY : txt = "Error Directory"; break ; - default: - txt = strerror(errorCode); diff --git a/compressed_archive/open_callbacks.h b/compressed_archive/open_callbacks.h index 0e46c1de7..1c607b3a1 100644 --- a/compressed_archive/open_callbacks.h +++ b/compressed_archive/open_callbacks.h @@ -2,6 +2,7 @@ #define OPEN_CALLBACKS_H #include "7z_includes.h" + #include ////////////////////////////////////////////////////////////// // Archive Open callback class diff --git a/compressed_archive/unarr/compressed_archive.cpp b/compressed_archive/unarr/compressed_archive.cpp index 4dfdce909..1e074e6d9 100644 --- a/compressed_archive/unarr/compressed_archive.cpp +++ b/compressed_archive/unarr/compressed_archive.cpp @@ -1,9 +1,10 @@ #include "compressed_archive.h" -#include +#include "extract_delegate.h" + #include +#include -#include "extract_delegate.h" #include CompressedArchive::CompressedArchive(const QString &filePath, QObject *parent) diff --git a/compressed_archive/unarr/compressed_archive.h b/compressed_archive/unarr/compressed_archive.h index a16e07e46..07bd1c40f 100644 --- a/compressed_archive/unarr/compressed_archive.h +++ b/compressed_archive/unarr/compressed_archive.h @@ -1,8 +1,9 @@ #ifndef COMPRESSED_ARCHIVE_H #define COMPRESSED_ARCHIVE_H -#include #include "extract_delegate.h" + +#include extern "C" { #include } diff --git a/compressed_archive/unarr/unarr-wrapper.pri b/compressed_archive/unarr/unarr-wrapper.pri deleted file mode 100644 index 011526741..000000000 --- a/compressed_archive/unarr/unarr-wrapper.pri +++ /dev/null @@ -1,52 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += $$PWD/extract_delegate.h \ - $$PWD/compressed_archive.h - -SOURCES += $$PWD/compressed_archive.cpp - -if(mingw|unix):!macx:!contains(QT_CONFIG, no-pkg-config):packagesExist(libunarr) { - message(Using system provided unarr installation found by pkg-config.) - CONFIG += link_pkgconfig - PKGCONFIG += libunarr - DEFINES += use_unarr - } -else:unix:!macx:exists(/usr/include/unarr.h) { - message(Using system provided unarr installation.) - LIBS += -lunarr - DEFINES += use_unarr -} - -else:macx:exists(../../dependencies/unarr/macx/libunarr.a) { - message(Found prebuilt unarr library in dependencies directory.) - INCLUDEPATH += $$PWD/../../dependencies/unarr/macx - LIBS += -L$$PWD/../../dependencies/unarr/macx -lunarr -lz -lbz2 - DEFINES += use_unarr - } - -else:win32:exists(../../dependencies/unarr/win/unarr.h) { - message(Found prebuilt unarr library in dependencies directory.) - INCLUDEPATH += $$PWD/../../dependencies/unarr/win - contains(QMAKE_TARGET.arch, x86_64): { - LIBS += -L$$PWD/../../dependencies/unarr/win/x64 -lunarr - } else { - LIBS += -L$$PWD/../../dependencies/unarr/win/x86 -lunarr - } - DEFINES += use_unarr UNARR_IS_SHARED_LIBRARY - } - -else:exists ($$PWD/unarr-master) { - message(Found unarr source-code) - message(Unarr will be build as a part of YACReader) - - # qmake based unarr build system - # this should only be used for testing or as a last resort - include(unarr.pro) - DEFINES += use_unarr - } - -else { - error(Missing dependency: unarr decrompression backend. Please install libunarr on your system\ - or provide a copy of the unarr source code in compressed_archive/unarr/unarr-master) - } diff --git a/compressed_archive/unarr/unarr.pro b/compressed_archive/unarr/unarr.pro deleted file mode 100644 index d23c3c199..000000000 --- a/compressed_archive/unarr/unarr.pro +++ /dev/null @@ -1,46 +0,0 @@ -INCLUDEPATH += $$PWD/unarr-master/ -DEPENDPATH += $$PWD/unarr-master/ - -unix:QMAKE_CFLAGS_RELEASE -= "-O2" -unix:QMAKE_CFLAGS_RELEASE += "-O3" -unix:QMAKE_CFLAGS_RELEASE += "-DNDEBUG" -unix:QMAKE_CFLAGS += "-D_FILE_OFFSET_BITS=64" - -win32:QMAKE_CFLAGS_RELEASE += "/DNDEBUG" - -HEADERS+=$$PWD/unarr-master/common/allocator.h\ - $$PWD/unarr-master/common/unarr-imp.h\ - $$PWD/unarr-master/lzmasdk/7zTypes.h\ - $$PWD/unarr-master/lzmasdk/CpuArch.h\ - $$PWD/unarr-master/lzmasdk/Ppmd7.h\ - $$PWD/unarr-master/lzmasdk/Ppmd.h\ - $$PWD/unarr-master/lzmasdk/LzmaDec.h\ - $$PWD/unarr-master/lzmasdk/Ppmd8.h\ - $$PWD/unarr-master/tar/tar.h\ - $$PWD/unarr-master/_7z/_7z.h\ - $$PWD/unarr-master/unarr.h - -SOURCES+=$$PWD/unarr-master/common/conv.c\ - $$PWD/unarr-master/common/custalloc.c\ - $$PWD/unarr-master/common/unarr.c\ - $$PWD/unarr-master/common/crc32.c\ - $$PWD/unarr-master/common/stream.c\ - $$PWD/unarr-master/lzmasdk/CpuArch.c\ - $$PWD/unarr-master/lzmasdk/Ppmd7.c\ - $$PWD/unarr-master/lzmasdk/Ppmd8.c\ - $$PWD/unarr-master/lzmasdk/LzmaDec.c\ - $$PWD/unarr-master/lzmasdk/Ppmd7Dec.c\ - $$PWD/unarr-master/lzmasdk/Ppmd8Dec.c\ - $$PWD/unarr-master/zip/inflate.c\ - $$PWD/unarr-master/zip/parse-zip.c\ - $$PWD/unarr-master/zip/uncompress-zip.c\ - $$PWD/unarr-master/zip/zip.c\ - $$PWD/unarr-master/rar/filter-rar.c\ - $$PWD/unarr-master/rar/parse-rar.c\ - $$PWD/unarr-master/rar/rarvm.c\ - $$PWD/unarr-master/rar/huffman-rar.c\ - $$PWD/unarr-master/rar/rar.c\ - $$PWD/unarr-master/rar/uncompress-rar.c\ - $$PWD/unarr-master/tar/parse-tar.c\ - $$PWD/unarr-master/tar/tar.c\ - $$PWD/unarr-master/_7z/_7z.c \ No newline at end of file diff --git a/compressed_archive/wrapper.pri b/compressed_archive/wrapper.pri deleted file mode 100644 index a8d777402..000000000 --- a/compressed_archive/wrapper.pri +++ /dev/null @@ -1,62 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -exists (../compressed_archive/lib7zip) { - message(Using 7zip) -} else { - error(You\'ll need 7zip source code to compile YACReader. \ - Please check the compressed_archive folder for further instructions.) -} - -INCLUDEPATH += \ - $$PWD/lib7zip/CPP \ - -SOURCES += \ - $$PWD/compressed_archive.cpp \ - $$PWD/lib7zip/CPP/Windows/FileIO.cpp \ - $$PWD/lib7zip/CPP/Windows/PropVariant.cpp \ - $$PWD/lib7zip/CPP/Windows/PropVariantConv.cpp \ - $$PWD/lib7zip/CPP/Common/IntToString.cpp \ - $$PWD/lib7zip/CPP/Common/MyString.cpp \ - $$PWD/lib7zip/CPP/Common/MyVector.cpp \ - $$PWD/lib7zip/CPP/Common/Wildcard.cpp \ - $$PWD/lib7zip/CPP/7zip/Common/FileStreams.cpp \ - $$PWD/lib7zip/C/Alloc.c \ - $$PWD/lib7zip/CPP/7zip/Common/StreamObjects.cpp - -unix{ -SOURCES += \ - $$PWD/lib7zip/CPP/Common/NewHandler.cpp \ - $$PWD/lib7zip/CPP/Windows/DLL.cpp \ - $$PWD/lib7zip/CPP/Windows/FileDir.cpp \ - $$PWD/lib7zip/CPP/Windows/FileFind.cpp \ - $$PWD/lib7zip/CPP/Windows/FileName.cpp \ - $$PWD/lib7zip/CPP/Windows/TimeUtils.cpp \ - $$PWD/lib7zip/CPP/Common/UTFConvert.cpp \ - $$PWD/lib7zip/CPP/Common/MyWindows.cpp \ - $$PWD/lib7zip/CPP/Common/StringConvert.cpp \ -} - -HEADERS += \ - $$PWD/lib7zip/CPP/Common/Common.h \ - $$PWD/compressed_archive.h \ - $$PWD/extract_delegate.h \ - $$PWD/7z_includes.h \ - $$PWD/open_callbacks.h \ - $$PWD/extract_callbacks.h \ - -macx{ -LIBS += -framework IOKit -framework CoreFoundation - -DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE \ - NDEBUG _REENTRANT ENV_UNIX \ - _7ZIP_LARGE_PAGES ENV_MACOSX _TCHAR_DEFINED \ - UNICODE _UNICODE UNIX_USE_WIN_FILE -} - -unix:!macx{ -DEFINES += _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE \ - NDEBUG _REENTRANT ENV_UNIX \ - _7ZIP_LARGE_PAGES \ - UNICODE _UNICODE UNIX_USE_WIN_FILE -} diff --git a/config.pri b/config.pri deleted file mode 100644 index 8d1b6be45..000000000 --- a/config.pri +++ /dev/null @@ -1,112 +0,0 @@ -# functions to automatically initialize some of YACReader's build options to -# default values if they're not set on build time -# for a more detailed description, see INSTALL.TXT - -CONFIG += c++17 - -win32 { - #enable c++17 explicitly in msvc - QMAKE_CXXFLAGS += /std:c++17 /Zc:__cplusplus /permissive- -} - -DEFINES += NOMINMAX - -if(unix|mingw):QMAKE_CXXFLAGS_RELEASE += -DNDEBUG -win32:msvc:QMAKE_CXXFLAGS_RELEASE += /DNDEBUG - -# check Qt version -defineTest(minQtVersion) { - maj = $$1 - min = $$2 - patch = $$3 - isEqual(QT_MAJOR_VERSION, $$maj) { - isEqual(QT_MINOR_VERSION, $$min) { - isEqual(QT_PATCH_VERSION, $$patch) { - return(true) - } - greaterThan(QT_PATCH_VERSION, $$patch) { - return(true) - } - } - greaterThan(QT_MINOR_VERSION, $$min) { - return(true) - } - } - greaterThan(QT_MAJOR_VERSION, $$maj) { - return(true) - } - return(false) -} - -!minQtVersion(5, 15, 0) { - error(YACReader requires Qt 5.15 or newer but $$[QT_VERSION] was detected) -} - -# reduce log pollution -CONFIG += silent - -# Disable coverflow for arm targets -isEmpty(QMAKE_TARGET.arch) { - QMAKE_TARGET.arch = $$QMAKE_HOST.arch -} -contains(QMAKE_TARGET.arch, arm.*)|contains(QMAKE_TARGET.arch, aarch.*) { - !macx:!win32 { # Apple silicon supports opengl (for now lets flag windows as experimental) - CONFIG += no_opengl - message("Building for ARM architecture. Disabling OpenGL coverflow. If you know that your ARM arquitecture supports opengl, please edit config.pri to enable it.") - } -} - -# build without opengl widget support -CONFIG(no_opengl) { - DEFINES += NO_OPENGL -} - -# default value for comic archive decompression backend -unix:!macx:!CONFIG(unarr):!CONFIG(7zip):!CONFIG(libarchive) { - CONFIG += unarr -} - -win32:!CONFIG(unarr):!CONFIG(7zip):!CONFIG(libarchive) { - CONFIG += 7zip -} - -macx:!CONFIG(unarr):!CONFIG(7zip):!CONFIG(libarchive) { - CONFIG += 7zip -} - -# default values for pdf render backend -win32:!CONFIG(poppler):!CONFIG(pdfium):!CONFIG(no_pdf) { - CONFIG += pdfium -} - -unix:!macx:!CONFIG(poppler):!CONFIG(pdfium):!CONFIG(no_pdf) { - CONFIG += poppler -} - -macx:!CONFIG(pdfkit):!CONFIG(pdfium):!CONFIG(no_pdf) { - CONFIG += pdfkit -} - -!CONFIG(poppler) { - DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00 -} else { - DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050900 -} - -unix:!macx { -# set install prefix if it's empty -isEmpty(PREFIX) { - PREFIX = /usr -} -isEmpty(BINDIR) { - BINDIR = $$PREFIX/bin -} -isEmpty(LIBDIR) { - LIBDIR = $$PREFIX/lib -} -isEmpty(DATADIR) { - DATADIR = $$PREFIX/share -} -} - -DEFINES += QT_DEPRECATED_WARNINGS diff --git a/custom_widgets/CMakeLists.txt b/custom_widgets/CMakeLists.txt new file mode 100644 index 000000000..4e35aa059 --- /dev/null +++ b/custom_widgets/CMakeLists.txt @@ -0,0 +1,114 @@ +# Custom widgets for YACReader +# Shared widgets + app-specific variants + +# Files shared between both YACReader and YACReaderLibrary +set(WIDGETS_COMMON_SOURCES + help_about_dialog.h + help_about_dialog.cpp + yacreader_field_edit.h + yacreader_field_edit.cpp + yacreader_field_plain_text_edit.h + yacreader_field_plain_text_edit.cpp + yacreader_options_dialog.h + yacreader_options_dialog.cpp + yacreader_spin_slider_widget.h + yacreader_spin_slider_widget.cpp + yacreader_tool_bar_stretch.h + yacreader_tool_bar_stretch.cpp + yacreader_busy_widget.h + yacreader_busy_widget.cpp + rounded_corners_dialog.h + rounded_corners_dialog.cpp + whats_new_dialog.h + whats_new_dialog.cpp + whats_new_controller.h + whats_new_controller.cpp + yacreader_3d_flow_config_widget.h + yacreader_3d_flow_config_widget.cpp +) + +# macOS toolbar (shared by both apps) +if(APPLE) + list(APPEND WIDGETS_COMMON_SOURCES + yacreader_macosx_toolbar.h + yacreader_macosx_toolbar.mm + ) +endif() + +# --- custom_widgets_reader (YACReader-specific) --- +add_library(custom_widgets_reader STATIC ${WIDGETS_COMMON_SOURCES}) +target_include_directories(custom_widgets_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(custom_widgets_reader) +# App-specific theme.h needed because themable.h → theme_manager.h → theme.h +target_include_directories(custom_widgets_reader PRIVATE + ${PROJECT_SOURCE_DIR}/YACReader/themes +) +target_compile_definitions(custom_widgets_reader PRIVATE YACREADER) +if(BUILD_NUMBER) + target_compile_definitions(custom_widgets_reader PRIVATE "BUILD_NUMBER=\"${BUILD_NUMBER}\"") +endif() +target_link_libraries(custom_widgets_reader PUBLIC + Qt6::Core + Qt6::Widgets + Qt6::Network + common_gui + rhi_flow_reader + QsLog +) +if(APPLE) + target_link_libraries(custom_widgets_reader PRIVATE + "-framework Foundation" + "-framework AppKit" + ) +endif() + +# --- custom_widgets_library (YACReaderLibrary-specific) --- +set(LIBRARY_EXTRA_WIDGETS + yacreader_search_line_edit.h + yacreader_search_line_edit.cpp + yacreader_titled_toolbar.h + yacreader_titled_toolbar.cpp + yacreader_table_view.h + yacreader_table_view.cpp + yacreader_sidebar.h + yacreader_sidebar.cpp + yacreader_library_list_widget.h + yacreader_library_list_widget.cpp + yacreader_library_item_widget.h + yacreader_library_item_widget.cpp + yacreader_treeview.h + yacreader_treeview.cpp + yacreader_cover_label.h + yacreader_cover_label.cpp +) + +add_library(custom_widgets_library STATIC + ${WIDGETS_COMMON_SOURCES} + ${LIBRARY_EXTRA_WIDGETS} +) +target_include_directories(custom_widgets_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(custom_widgets_library) +# App-specific theme.h + YACReaderLibrary headers needed by macosx_toolbar +target_include_directories(custom_widgets_library PRIVATE + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes + ${PROJECT_SOURCE_DIR}/YACReaderLibrary + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/db +) +target_compile_definitions(custom_widgets_library PRIVATE YACREADER_LIBRARY) +if(BUILD_NUMBER) + target_compile_definitions(custom_widgets_library PRIVATE "BUILD_NUMBER=\"${BUILD_NUMBER}\"") +endif() +target_link_libraries(custom_widgets_library PUBLIC + Qt6::Core + Qt6::Widgets + Qt6::Network + common_gui + rhi_flow_library + QsLog +) +if(APPLE) + target_link_libraries(custom_widgets_library PRIVATE + "-framework Foundation" + "-framework AppKit" + ) +endif() diff --git a/custom_widgets/custom_widgets_yacreader.pri b/custom_widgets/custom_widgets_yacreader.pri deleted file mode 100644 index 51c9999d2..000000000 --- a/custom_widgets/custom_widgets_yacreader.pri +++ /dev/null @@ -1,48 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += \ - $$PWD/help_about_dialog.h \ - $$PWD/yacreader_field_edit.h \ - $$PWD/yacreader_field_plain_text_edit.h \ - $$PWD/yacreader_flow.h \ - $$PWD/yacreader_flow_config_widget.h \ - $$PWD/yacreader_options_dialog.h \ - $$PWD/yacreader_spin_slider_widget.h \ - $$PWD/yacreader_tool_bar_stretch.h \ - $$PWD/yacreader_busy_widget.h \ - $$PWD/rounded_corners_dialog.h \ - $$PWD/whats_new_dialog.h \ - $$PWD/whats_new_controller.h - -!CONFIG(no_opengl) { - HEADERS += $$PWD/yacreader_gl_flow_config_widget.h -} - -macx{ -HEADERS += $$PWD/yacreader_macosx_toolbar.h -} - - - -SOURCES += \ - $$PWD/help_about_dialog.cpp \ - $$PWD/yacreader_field_edit.cpp \ - $$PWD/yacreader_field_plain_text_edit.cpp \ - $$PWD/yacreader_flow.cpp \ - $$PWD/yacreader_flow_config_widget.cpp \ - $$PWD/yacreader_options_dialog.cpp \ - $$PWD/yacreader_spin_slider_widget.cpp \ - $$PWD/yacreader_tool_bar_stretch.cpp \ - $$PWD/yacreader_busy_widget.cpp \ - $$PWD/rounded_corners_dialog.cpp \ - $$PWD/whats_new_dialog.cpp \ - $$PWD/whats_new_controller.cpp - -!CONFIG(no_opengl) { - SOURCES += $$PWD/yacreader_gl_flow_config_widget.cpp -} -macx{ -OBJECTIVE_SOURCES += $$PWD/yacreader_macosx_toolbar.mm -} - diff --git a/custom_widgets/custom_widgets_yacreaderlibrary.pri b/custom_widgets/custom_widgets_yacreaderlibrary.pri deleted file mode 100644 index 1b218b77c..000000000 --- a/custom_widgets/custom_widgets_yacreaderlibrary.pri +++ /dev/null @@ -1,62 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += \ - $$PWD/help_about_dialog.h \ - $$PWD/rounded_corners_dialog.h \ - $$PWD/whats_new_dialog.h \ - $$PWD/whats_new_controller.h \ - $$PWD/yacreader_field_edit.h \ - $$PWD/yacreader_field_plain_text_edit.h \ - $$PWD/yacreader_flow.h \ - $$PWD/yacreader_flow_config_widget.h \ - $$PWD/yacreader_options_dialog.h \ - $$PWD/yacreader_search_line_edit.h \ - $$PWD/yacreader_spin_slider_widget.h \ - $$PWD/yacreader_tool_bar_stretch.h \ - $$PWD/yacreader_titled_toolbar.h \ - $$PWD/yacreader_deleting_progress.h \ - $$PWD/yacreader_table_view.h \ - $$PWD/yacreader_sidebar.h \ - $$PWD/yacreader_library_list_widget.h \ - $$PWD/yacreader_library_item_widget.h \ - $$PWD/yacreader_treeview.h \ - $$PWD/yacreader_busy_widget.h \ - $$PWD/yacreader_cover_label.h -!CONFIG(no_opengl){ - HEADERS += $$PWD/yacreader_gl_flow_config_widget.h -} - -macx{ -HEADERS += $$PWD/yacreader_macosx_toolbar.h -} - -SOURCES += \ - $$PWD/help_about_dialog.cpp \ - $$PWD/rounded_corners_dialog.cpp \ - $$PWD/whats_new_dialog.cpp \ - $$PWD/whats_new_controller.cpp \ - $$PWD/yacreader_field_edit.cpp \ - $$PWD/yacreader_field_plain_text_edit.cpp \ - $$PWD/yacreader_flow.cpp \ - $$PWD/yacreader_flow_config_widget.cpp \ - $$PWD/yacreader_options_dialog.cpp \ - $$PWD/yacreader_search_line_edit.cpp \ - $$PWD/yacreader_spin_slider_widget.cpp \ - $$PWD/yacreader_tool_bar_stretch.cpp \ - $$PWD/yacreader_titled_toolbar.cpp \ - $$PWD/yacreader_deleting_progress.cpp \ - $$PWD/yacreader_table_view.cpp \ - $$PWD/yacreader_sidebar.cpp \ - $$PWD/yacreader_library_list_widget.cpp \ - $$PWD/yacreader_library_item_widget.cpp \ - $$PWD/yacreader_treeview.cpp \ - $$PWD/yacreader_busy_widget.cpp \ - $$PWD/yacreader_cover_label.cpp -!CONFIG(no_opengl){ - SOURCES += $$PWD/yacreader_gl_flow_config_widget.cpp -} - -macx{ -OBJECTIVE_SOURCES += $$PWD/yacreader_macosx_toolbar.mm -} diff --git a/custom_widgets/help_about_dialog.cpp b/custom_widgets/help_about_dialog.cpp index 2ba8bf6aa..7c5817356 100644 --- a/custom_widgets/help_about_dialog.cpp +++ b/custom_widgets/help_about_dialog.cpp @@ -1,22 +1,16 @@ #include "help_about_dialog.h" -#include "opengl_checker.h" #include "global_info_provider.h" +#include "yacreader_global.h" -#include -#include -#include -#include #include #include -#include #include - -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -#include -#endif - -#include "yacreader_global.h" +#include +#include +#include +#include +#include HelpAboutDialog::HelpAboutDialog(QWidget *parent) : QDialog(parent) @@ -51,6 +45,8 @@ HelpAboutDialog::HelpAboutDialog(QWidget *parent) resize(500, heightDesktopResolution * 0.83); loadSystemInfo(); + + initTheme(this); } HelpAboutDialog::HelpAboutDialog(const QString &pathAbout, const QString &pathHelp, QWidget *parent) @@ -68,14 +64,14 @@ void HelpAboutDialog::loadAboutInformation(const QString &path) buildNumber = BUILD_NUMBER; #endif - aboutText->setHtml(fileToString(path).arg(VERSION, buildNumber)); - aboutText->moveCursor(QTextCursor::Start); + aboutHtmlContent = fileToString(path).arg(VERSION, buildNumber); + applyHtmlTheme(); } void HelpAboutDialog::loadHelp(const QString &path) { - helpText->setHtml(fileToString(path)); - helpText->moveCursor(QTextCursor::Start); + helpHtmlContent = fileToString(path); + applyHtmlTheme(); } QString HelpAboutDialog::fileToString(const QString &path) @@ -84,11 +80,7 @@ QString HelpAboutDialog::fileToString(const QString &path) f.open(QIODevice::ReadOnly); QTextStream txtS(&f); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) txtS.setEncoding(QStringConverter::Utf8); -#else - txtS.setCodec(QTextCodec::codecForName("UTF-8")); -#endif QString content = txtS.readAll(); f.close(); @@ -100,10 +92,39 @@ void HelpAboutDialog::loadSystemInfo() { auto text = YACReader::getGlobalInfo(); - auto openGLChecker = OpenGLChecker(); text.append("\nGRAPHIC INFORMATION\n"); text.append(QString("Screen pixel ratio: %1\n").arg(devicePixelRatioF())); - text.append(QString("OpenGL version: %1\n").arg(openGLChecker.textVersionDescription())); systemInfoText->setText(text); } + +void HelpAboutDialog::applyTheme(const Theme &theme) +{ + Q_UNUSED(theme) + applyHtmlTheme(); +} + +void HelpAboutDialog::applyHtmlTheme() +{ + auto helpTheme = theme.helpAboutDialog; + + // Original colors in the HTML CSS + const QString originalHeadingColor = "#302f2d"; + const QString originalLinkColor = "#C19441"; + + if (!aboutHtmlContent.isEmpty()) { + QString themedAbout = aboutHtmlContent; + themedAbout.replace(originalHeadingColor, helpTheme.headingColor.name(), Qt::CaseInsensitive); + themedAbout.replace(originalLinkColor, helpTheme.linkColor.name(), Qt::CaseInsensitive); + aboutText->setHtml(themedAbout); + aboutText->moveCursor(QTextCursor::Start); + } + + if (!helpHtmlContent.isEmpty()) { + QString themedHelp = helpHtmlContent; + themedHelp.replace(originalHeadingColor, helpTheme.headingColor.name(), Qt::CaseInsensitive); + themedHelp.replace(originalLinkColor, helpTheme.linkColor.name(), Qt::CaseInsensitive); + helpText->setHtml(themedHelp); + helpText->moveCursor(QTextCursor::Start); + } +} diff --git a/custom_widgets/help_about_dialog.h b/custom_widgets/help_about_dialog.h index d7b8289f6..c9310108b 100644 --- a/custom_widgets/help_about_dialog.h +++ b/custom_widgets/help_about_dialog.h @@ -1,14 +1,19 @@ #ifndef HELP_ABOUT_DIALOG_H #define HELP_ABOUT_DIALOG_H +#include "themable.h" + #include class QTabWidget; class QTextBrowser; -class HelpAboutDialog : public QDialog +class HelpAboutDialog : public QDialog, protected Themable { Q_OBJECT +protected: + void applyTheme(const Theme &theme) override; + public: HelpAboutDialog(QWidget *parent = 0); HelpAboutDialog(const QString &pathAbout, const QString &pathHelp, QWidget *parent = 0); @@ -23,6 +28,10 @@ public slots: QTextBrowser *systemInfoText; QString fileToString(const QString &path); void loadSystemInfo(); + void applyHtmlTheme(); + + QString aboutHtmlContent; + QString helpHtmlContent; }; #endif // HELP_ABOUT_DIALOG_H diff --git a/custom_widgets/rounded_corners_dialog.cpp b/custom_widgets/rounded_corners_dialog.cpp index 5210b6f79..f4e32e5e6 100644 --- a/custom_widgets/rounded_corners_dialog.cpp +++ b/custom_widgets/rounded_corners_dialog.cpp @@ -1,6 +1,6 @@ #include "rounded_corners_dialog.h" -#include +#include YACReader::RoundedCornersDialog::RoundedCornersDialog(QWidget *parent) : QDialog(parent) @@ -9,6 +9,12 @@ YACReader::RoundedCornersDialog::RoundedCornersDialog(QWidget *parent) setAttribute(Qt::WA_TranslucentBackground); } +void YACReader::RoundedCornersDialog::setBackgroundColor(const QColor &color) +{ + m_backgroundColor = color; + update(); +} + void YACReader::RoundedCornersDialog::paintEvent(QPaintEvent *) { qreal radius = 14.0; // desired radius in absolute pixels @@ -26,7 +32,7 @@ void YACReader::RoundedCornersDialog::paintEvent(QPaintEvent *) // Set the brush from palette role. // p.setBrush(palette().brush(backgroundRole())); - p.setBrush(QBrush(QColor(255, 255, 255))); // TODO: the rest of the colors are hardcoded + p.setBrush(QBrush(m_backgroundColor)); // Got radius? Otherwise draw a quicker rect. if (radius > 0.0) p.drawRoundedRect(rect, radius, radius, Qt::AbsoluteSize); diff --git a/custom_widgets/rounded_corners_dialog.h b/custom_widgets/rounded_corners_dialog.h index 04679fb82..3e5c3ce10 100644 --- a/custom_widgets/rounded_corners_dialog.h +++ b/custom_widgets/rounded_corners_dialog.h @@ -1,6 +1,7 @@ #ifndef ROUNDEDCORNERSDIALOG_H #define ROUNDEDCORNERSDIALOG_H +#include #include namespace YACReader { @@ -12,6 +13,10 @@ class RoundedCornersDialog : public QDialog protected: void paintEvent(QPaintEvent *) override; + void setBackgroundColor(const QColor &color); + +private: + QColor m_backgroundColor { 255, 255, 255 }; }; } diff --git a/custom_widgets/whats_new_controller.cpp b/custom_widgets/whats_new_controller.cpp index df550ab77..c5c696a05 100644 --- a/custom_widgets/whats_new_controller.cpp +++ b/custom_widgets/whats_new_controller.cpp @@ -3,15 +3,11 @@ #include "whats_new_dialog.h" #include "yacreader_global.h" -#include - YACReader::WhatsNewController::WhatsNewController() { } void YACReader::WhatsNewController::showWhatsNewIfNeeded(QWidget *fromParent) { - QSettings commonSettings(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + - "/YACReader/YACReaderCommon.ini", - QSettings::IniFormat); + QSettings commonSettings(YACReader::getCommonSettingsFilePath(), QSettings::IniFormat); if (commonSettings.value("LAST_VERSION_INSTALLED").toString() != VERSION) { showWhatsNew(fromParent); diff --git a/custom_widgets/whats_new_dialog.cpp b/custom_widgets/whats_new_dialog.cpp index 4f0e1dccc..7fd3be6b1 100644 --- a/custom_widgets/whats_new_dialog.cpp +++ b/custom_widgets/whats_new_dialog.cpp @@ -1,7 +1,14 @@ #include "whats_new_dialog.h" + #include "yacreader_global.h" -#include +#include +#include +#include +#include +#include +#include +#include YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) : RoundedCornersDialog(parent) @@ -22,114 +29,102 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) content->setStyleSheet("background-color:transparent;" "border:none;"); - auto headerImageLabel = new QLabel(); - QPixmap headerImage(":/images/whats_new/whatsnew_header.svg"); - headerImageLabel->setPixmap(headerImage); - headerImageLabel->setFixedSize(headerImage.size()); + headerImageLabel = new QLabel(); - auto headerLabel = new QLabel(); + headerLabel = new QLabel(); headerLabel->setText("What's New in\nYACReader"); QFont headerLabelFont("Arial", 34, QFont::ExtraBold); headerLabel->setFont(headerLabelFont); headerLabel->setAlignment(Qt::AlignCenter); - headerLabel->setStyleSheet("padding: 18px 0 0 0;" - "background-color:transparent;" - "color:#0A0A0A;"); - auto versionLabel = new QLabel(); + versionLabel = new QLabel(); versionLabel->setText(VERSION); QFont versionLabelFont("Arial", 12, QFont::Normal); versionLabel->setFont(versionLabelFont); versionLabel->setAlignment(Qt::AlignCenter); - versionLabel->setStyleSheet("padding:0 0 0 0;" - "background-color:transparent;" - "color:#858585;"); - - auto text = new QLabel(); - text->setText("This version brings exciting new features, improved functionality, enhanced customization options, bug fixes, and performance improvements across all apps:
" - "
" - "YACReader
" - " • Don't use scroll animations on macOS by default, where hdpi scroll is most likely to be used
" - " • New toolbar on macOS
" - " • New mouse modes to turn pages - you can setup the app to use the left/right buttons to turn pages directly or click on the left/right part of the screen to turn pages
" - " • Fix current page/time label content when the content is too long. (new in 9.16.3)
" - "
" - "YACReaderLibrary
" - " • Improve flexibility of the open comic in third party app setting so more complex commands can be used, e.g. `open -a \"/Applications/My Reader.app\" \"{comic_file_path}\"`
" - " • Fix setting the comic rating in the table view
" - " • Log libraries validation when the app starts
" - " • New toolbar on macOS
" - " • New setting in Comic Vine scraper to force exact volume matches
" - " • Better default search query in the Comic Vine scraper
" - " • Improved navigation in Comic Vine scraper, including keeping the current query around to make edits and refined searches easier
" - " • Add support for custom covers for any folder using the context menu
" - " • The edit cover buttons now support looping through pages, going forward from the last returns to the first, and going backward from the first jumps to the last
" - " • Add support for custom covers for comics using the edit metadata dialog, you can use a pick file button or drag&drop an image into the cover view in the dialog
" - " • Covers can be set in bulk for various comics at once
" - " • New button to reset to the default cover of a comic
" - " • Support for storing the new image filters from iOS and Android apps
" - " • Fixed cover loading in Comic Vine scraper (new in 9.16.1)
" - " • Added a customizable User Agent string to use it with Comic Vine. It can be set in YACReaderLibrary.ini in the [ComicVine] section using the COMIC_VINE_USER_AGENT key (new in 9.16.2)
" - " • Prevent crash when opening the folders context menu if a folder is not selected. (new in 9.16.2)
" - " • Fix crash when using the `Set type` menu on libraries. (new in 9.16.2)
" - " • Fix table view last section stretch. Before it was only working randomly. (new in 9.16.3)
" - " • Fix empty table view caused by wront state being saved. You'll need to reconfigure the table view headers to your liking after this udpate. (new in 9.16.3)
" - "
" - "YACReaderLibraryServer
" - " • Log libraries validation when the app starts
" - "
" - "All apps
" - " • PDF support has been updated in all Windows apps
" - "
" - "I hope you enjoy the new update. Please, if you like YACReader consider to become a patron in Patreon " - "or donate some money using Pay-Pal and help keeping the project alive. " - "Remember that there is an iOS version available in the Apple App Store, " - "and there is a brand new app for Android that you can get on the Google Play Store."); + + textLabel = new QLabel(); + htmlTemplate = "YACReader 10 is finally here!! This is all the exciting new features and improvements:
" + "
" + "YACReader
" + " • Add support for continuous scroll mode
" + " • Fix the translator
" + " • Add Lanczos interpolation for image scaling. You can control the method used via the settings under Image adjustments
" + "
" + "All GUI Apps
" + " • Migrate Flow implementation from OpenGL to QRhi. This is a full new implementation with better performance and compatibility with operating systems and hardware
" + " • Add light/dark themes support that follow the system configuration
" + " • Add a theme editor and support for custom themes
" + " • Add an application language setting with a system default option in YACReader and YACReaderLibrary
" + "
" + "All apps
" + " • Add support for user-installed Qt image format plugins via the shared plugins/imageformats folder in the YACReader settings directory
" + "
" + "I hope you enjoy the new update. Please, if you like YACReader consider to become a patron in Patreon " + "or donate some money using Pay-Pal and help keeping the project alive. " + "Remember that there is an iOS version available in the Apple App Store, " + "and there is a brand new app for Android that you can get on the Google Play Store."; QFont textLabelFont("Arial", 15, QFont::Light); - text->setFont(textLabelFont); - text->setStyleSheet("padding:51px;" - "background-color:transparent;" - "color:#0A0A0A;"); - text->setWordWrap(true); - text->setOpenExternalLinks(true); + textLabel->setFont(textLabelFont); + textLabel->setWordWrap(true); + textLabel->setOpenExternalLinks(true); contentLayout->addItem(new QSpacerItem(0, 50), 0, 0); contentLayout->addWidget(headerImageLabel, 1, 0, Qt::AlignTop | Qt::AlignHCenter); contentLayout->addWidget(headerLabel, 1, 0, Qt::AlignTop | Qt::AlignHCenter); contentLayout->addWidget(versionLabel, 2, 0, Qt::AlignTop | Qt::AlignHCenter); - contentLayout->addWidget(text, 3, 0, Qt::AlignTop); + contentLayout->addWidget(textLabel, 3, 0, Qt::AlignTop); contentLayout->setRowStretch(3, 1); content->setLayout(contentLayout); mainLayout->addWidget(scrollArea); - // containerLayout->addWidget(content); scrollArea->setWidget(content); scrollArea->setWidgetResizable(true); this->setLayout(mainLayout); - auto closeButton = new QPushButton(this); + closeButton = new QPushButton(this); closeButton->setFlat(true); closeButton->setStyleSheet("background-color:transparent;"); - auto closeIcon = QPixmap(":/images/custom_dialog/custom_close_button.svg"); - if (!closeIcon.isNull()) { - closeButton->setIcon(QPixmap(":/images/custom_dialog/custom_close_button.svg")); - closeButton->setIconSize(QSize(44, 44)); - closeButton->setFixedSize(44, 44); - closeButton->move(656, 20); - } else { - closeButton->setText(tr("Close")); - auto font = closeButton->font(); - font.setPointSize(16); - closeButton->setFont(font); - closeButton->move(616, 20); - } + closeButton->setIconSize(QSize(44, 44)); + closeButton->setFixedSize(44, 44); + closeButton->move(656, 20); scrollArea->setFixedSize(720, 640); setFixedSize(720, 640); setModal(true); connect(closeButton, &QPushButton::clicked, this, &QDialog::close); + + initTheme(this); +} + +void YACReader::WhatsNewDialog::applyTheme(const Theme &theme) +{ + auto whatsNewTheme = theme.whatsNewDialog; + + setBackgroundColor(whatsNewTheme.backgroundColor); + + headerImageLabel->setPixmap(whatsNewTheme.headerDecoration); + headerImageLabel->setFixedSize(whatsNewTheme.headerDecoration.size()); + + headerLabel->setStyleSheet(QString("padding: 18px 0 0 0;" + "background-color:transparent;" + "color:%1;") + .arg(whatsNewTheme.headerTextColor.name())); + + versionLabel->setStyleSheet(QString("padding:0 0 0 0;" + "background-color:transparent;" + "color:%1;") + .arg(whatsNewTheme.versionTextColor.name())); + + textLabel->setStyleSheet(QString("padding:51px;" + "background-color:transparent;" + "color:%1;") + .arg(whatsNewTheme.contentTextColor.name())); + textLabel->setText(htmlTemplate.arg(whatsNewTheme.linkColor.name())); + + closeButton->setIcon(whatsNewTheme.closeButtonIcon); } diff --git a/custom_widgets/whats_new_dialog.h b/custom_widgets/whats_new_dialog.h index 8ec3722b8..a580b668b 100644 --- a/custom_widgets/whats_new_dialog.h +++ b/custom_widgets/whats_new_dialog.h @@ -2,15 +2,29 @@ #define WHATSNEWDIALOG_H #include "rounded_corners_dialog.h" -#include +#include "themable.h" + +class QLabel; +class QPushButton; namespace YACReader { -class WhatsNewDialog : public RoundedCornersDialog +class WhatsNewDialog : public RoundedCornersDialog, protected Themable { Q_OBJECT public: explicit WhatsNewDialog(QWidget *parent = nullptr); + +protected: + void applyTheme(const Theme &theme) override; + +private: + QLabel *headerImageLabel; + QLabel *headerLabel; + QLabel *versionLabel; + QLabel *textLabel; + QPushButton *closeButton; + QString htmlTemplate; }; } diff --git a/custom_widgets/yacreader_gl_flow_config_widget.cpp b/custom_widgets/yacreader_3d_flow_config_widget.cpp similarity index 96% rename from custom_widgets/yacreader_gl_flow_config_widget.cpp rename to custom_widgets/yacreader_3d_flow_config_widget.cpp index 813f01c59..a1bb4fe1a 100644 --- a/custom_widgets/yacreader_gl_flow_config_widget.cpp +++ b/custom_widgets/yacreader_3d_flow_config_widget.cpp @@ -1,15 +1,16 @@ -#include "yacreader_gl_flow_config_widget.h" +#include "yacreader_3d_flow_config_widget.h" #include "yacreader_spin_slider_widget.h" -#include "yacreader_flow_gl.h" //TODO -#include +#include #include -#include #include #include +#include +#include +#include -YACReaderGLFlowConfigWidget::YACReaderGLFlowConfigWidget(QWidget *parent /* = 0 */) +YACReader3DFlowConfigWidget::YACReader3DFlowConfigWidget(QWidget *parent /* = 0 */) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); @@ -75,7 +76,7 @@ YACReaderGLFlowConfigWidget::YACReaderGLFlowConfigWidget(QWidget *parent /* = 0 showAdvancedOptions = new QPushButton(tr("Show advanced settings")); showAdvancedOptions->setCheckable(true); - connect(showAdvancedOptions, &QAbstractButton::toggled, this, &YACReaderGLFlowConfigWidget::avancedOptionToogled); + connect(showAdvancedOptions, &QAbstractButton::toggled, this, &YACReader3DFlowConfigWidget::avancedOptionToogled); vbox->addWidget(showAdvancedOptions, 0, Qt::AlignRight); @@ -213,7 +214,7 @@ YACReaderGLFlowConfigWidget::YACReaderGLFlowConfigWidget(QWidget *parent /* = 0 setLayout(layout); } -void YACReaderGLFlowConfigWidget::avancedOptionToogled(bool show) +void YACReader3DFlowConfigWidget::avancedOptionToogled(bool show) { if (show) optionsGroupBox->show(); @@ -221,7 +222,7 @@ void YACReaderGLFlowConfigWidget::avancedOptionToogled(bool show) optionsGroupBox->hide(); } -void YACReaderGLFlowConfigWidget::setValues(Preset preset) +void YACReader3DFlowConfigWidget::setValues(Preset preset) { xRotation->setValue(preset.cfRX); yPosition->setValue(preset.cfY * 100); diff --git a/custom_widgets/yacreader_gl_flow_config_widget.h b/custom_widgets/yacreader_3d_flow_config_widget.h similarity index 79% rename from custom_widgets/yacreader_gl_flow_config_widget.h rename to custom_widgets/yacreader_3d_flow_config_widget.h index b29a1abca..692913f0a 100644 --- a/custom_widgets/yacreader_gl_flow_config_widget.h +++ b/custom_widgets/yacreader_3d_flow_config_widget.h @@ -1,7 +1,8 @@ -#ifndef YACREADER_GL_FLOW_CONFIG_WIDGET_H -#define YACREADER_GL_FLOW_CONFIG_WIDGET_H +#ifndef YACREADER_3D_FLOW_CONFIG_WIDGET_H +#define YACREADER_3D_FLOW_CONFIG_WIDGET_H + +#include "flow_types.h" //TODO -#include "yacreader_flow_gl.h" //TODO #include class QRadioButton; @@ -11,11 +12,11 @@ class QCheckBox; class QPushButton; class QGroupBox; -class YACReaderGLFlowConfigWidget : public QWidget +class YACReader3DFlowConfigWidget : public QWidget { Q_OBJECT public: - YACReaderGLFlowConfigWidget(QWidget *parent = 0); + YACReader3DFlowConfigWidget(QWidget *parent = 0); // GL......................... QRadioButton *radioClassic; @@ -47,4 +48,4 @@ public slots: void avancedOptionToogled(bool show); }; -#endif // YACREADER_GL_FLOW_CONFIG_WIDGET_H \ No newline at end of file +#endif // YACREADER_3D_FLOW_CONFIG_WIDGET_H diff --git a/custom_widgets/yacreader_busy_widget.cpp b/custom_widgets/yacreader_busy_widget.cpp index 10550e34e..67198bf83 100644 --- a/custom_widgets/yacreader_busy_widget.cpp +++ b/custom_widgets/yacreader_busy_widget.cpp @@ -1,18 +1,23 @@ #include "yacreader_busy_widget.h" #include +#include #include #include -#include YACReaderBusyWidget::YACReaderBusyWidget(QWidget *parent) : QWidget(parent) { setFixedSize(70, 70); - BusyIndicator *busy = new BusyIndicator(this); - busy->setIndicatorStyle(BusyIndicator::StyleArc); - busy->setColor(Qt::white); - busy->move(20, 20); + busyIndicator = new BusyIndicator(this); + busyIndicator->setIndicatorStyle(BusyIndicator::StyleArc); + busyIndicator->setColor(Qt::white); + busyIndicator->move(20, 20); +} + +void YACReaderBusyWidget::setColor(QColor color) +{ + busyIndicator->setColor(color); } BusyIndicator::BusyIndicator(QWidget *parent, int size) @@ -48,6 +53,7 @@ void BusyIndicator::setIndicatorStyle(IndicatorStyle style) void BusyIndicator::setColor(QColor color) { fillColor = color; + update(); } BusyIndicator::IndicatorStyle BusyIndicator::indicatorStyle() const diff --git a/custom_widgets/yacreader_busy_widget.h b/custom_widgets/yacreader_busy_widget.h index 5963c4d29..c7a37c6e9 100644 --- a/custom_widgets/yacreader_busy_widget.h +++ b/custom_widgets/yacreader_busy_widget.h @@ -4,11 +4,17 @@ #include #include +class BusyIndicator; + class YACReaderBusyWidget : public QWidget { Q_OBJECT public: explicit YACReaderBusyWidget(QWidget *parent = 0); + void setColor(QColor color); + +private: + BusyIndicator *busyIndicator; }; class BusyIndicator : public QWidget diff --git a/custom_widgets/yacreader_cover_label.cpp b/custom_widgets/yacreader_cover_label.cpp index 63a2db7a7..791b5831e 100644 --- a/custom_widgets/yacreader_cover_label.cpp +++ b/custom_widgets/yacreader_cover_label.cpp @@ -1,4 +1,5 @@ #include "yacreader_cover_label.h" + #include "yacreader_global_gui.h" YACReader::CoverLabel::CoverLabel(QWidget *parent) diff --git a/custom_widgets/yacreader_cover_label.h b/custom_widgets/yacreader_cover_label.h index 8d570c9f4..6328087a2 100644 --- a/custom_widgets/yacreader_cover_label.h +++ b/custom_widgets/yacreader_cover_label.h @@ -1,9 +1,9 @@ #ifndef DROP_LABEL_H #define DROP_LABEL_H -#include #include #include +#include #include namespace YACReader { diff --git a/custom_widgets/yacreader_dark_menu.cpp b/custom_widgets/yacreader_dark_menu.cpp index 15c7f7029..ce7e1fe6f 100644 --- a/custom_widgets/yacreader_dark_menu.cpp +++ b/custom_widgets/yacreader_dark_menu.cpp @@ -1,8 +1,8 @@ #include "yacreader_dark_menu.h" +#include #include #include -#include YACReaderDarkMenu::YACReaderDarkMenu(QWidget *parent) : QMenu(parent) diff --git a/custom_widgets/yacreader_deleting_progress.cpp b/custom_widgets/yacreader_deleting_progress.cpp deleted file mode 100644 index fc54476b9..000000000 --- a/custom_widgets/yacreader_deleting_progress.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "yacreader_deleting_progress.h" - -#include -#include -#include -#include -#include -#include - -YACReaderDeletingProgress::YACReaderDeletingProgress(QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *contentLayout = new QVBoxLayout(this); - - QLabel *iconLabel = new QLabel(); - QPixmap icon(":/images/deleting_progress/icon.png"); - iconLabel->setPixmap(icon); - iconLabel->setStyleSheet("QLabel {padding:0px; margin:0px;}"); - - textMessage = new QLabel(tr("Please wait, deleting in progress...")); - - textMessage->setStyleSheet("QLabel {color:#ABABAB; padding:0 0 0 0px; margin:0px; font-size:18px; font-weight:bold;}"); - - QProgressBar *progressBar = new QProgressBar(); - - progressBar->setTextVisible(false); - progressBar->setFixedHeight(6); - progressBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - progressBar->setRange(0, 10); - progressBar->setValue(5); - progressBar->setStyleSheet( - "QProgressBar { border: none; border-radius: 3px; background: #ABABAB; margin:0; margin-left:16; margin-right:16px;}" - "QProgressBar::chunk {background-color: #FFC745; border: none; border-radius: 3px;}"); - - QPushButton *button = new QPushButton(tr("cancel")); - - button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - - contentLayout->addSpacing(16); - contentLayout->addWidget(iconLabel, 0, Qt::AlignHCenter); - contentLayout->addSpacing(11); - contentLayout->addWidget(textMessage, 0, Qt::AlignHCenter); - contentLayout->addSpacing(13); - contentLayout->addWidget(progressBar); - contentLayout->addSpacing(13); - contentLayout->addWidget(button, 0, Qt::AlignHCenter); - contentLayout->addSpacing(18); - - contentLayout->setContentsMargins(0, 0, 0, 0); - - setLayout(contentLayout); - - setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - - resize(sizeHint()); -} - -void YACReaderDeletingProgress::paintEvent(QPaintEvent *event) -{ - int borderTop, borderRight, borderBottom, borderLeft; - - QPixmap pL(":/images/deleting_progress/imgTopLeft.png"); - QPixmap pM(":/images/deleting_progress/imgTopMiddle.png"); - QPixmap pR(":/images/deleting_progress/imgTopRight.png"); - - QPixmap pLM(":/images/deleting_progress/imgLeftMiddle.png"); - - QPixmap pRM(":/images/deleting_progress/imgRightMiddle.png"); - - QPixmap pBL(":/images/deleting_progress/imgBottomLeft.png"); - QPixmap pBM(":/images/deleting_progress/imgBottomMiddle.png"); - QPixmap pBR(":/images/deleting_progress/imgBottomRight.png"); - - borderTop = pL.height(); - borderRight = pRM.width(); - borderBottom = pBM.height(); - borderLeft = pLM.width(); - - int width = this->width() - borderRight - borderLeft; - int height = this->height() - borderTop - borderBottom; - - QPainter painter(this); - - // corners - painter.drawPixmap(0, 0, pL); - painter.drawPixmap(this->width() - borderRight, 0, pR); - painter.drawPixmap(0, this->height() - pBL.height(), pBL); - painter.drawPixmap(this->width() - pBR.width(), this->height() - borderBottom, pBR); - - // middle - painter.drawPixmap(borderRight, 0, width, borderTop, pM); - painter.drawPixmap(0, borderTop, borderLeft, height, pLM); - painter.drawPixmap(width + borderLeft, borderTop, borderRight, height, pRM); - painter.drawPixmap(pBR.width(), height + borderTop, this->width() - pBR.width() - pBL.width(), pBR.height(), pBM); - - // center - painter.fillRect(borderLeft, borderTop, width, height, QColor("#FAFAFA")); - - QWidget::paintEvent(event); -} - -QSize YACReaderDeletingProgress::sizeHint() const -{ - return QSize(textMessage->sizeHint().width() + 120, 185); -} diff --git a/custom_widgets/yacreader_deleting_progress.h b/custom_widgets/yacreader_deleting_progress.h deleted file mode 100644 index b1e7cc025..000000000 --- a/custom_widgets/yacreader_deleting_progress.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef YACREADER_DELETING_PROGRESS_H -#define YACREADER_DELETING_PROGRESS_H - -#include - -class QLabel; - -class YACReaderDeletingProgress : public QWidget -{ - Q_OBJECT -public: - explicit YACReaderDeletingProgress(QWidget *parent = 0); - QSize sizeHint() const; -signals: - -public slots: - -protected: - void paintEvent(QPaintEvent *); - -private: - QLabel *textMessage; -}; - -#endif // YACREADER_DELETING_PROGRESS_H diff --git a/custom_widgets/yacreader_flow.cpp b/custom_widgets/yacreader_flow.cpp deleted file mode 100644 index f930136eb..000000000 --- a/custom_widgets/yacreader_flow.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "yacreader_flow.h" - -#include - -YACReaderFlow::YACReaderFlow(QWidget *parent, FlowType flowType) - : PictureFlow(parent, flowType) { } - -void YACReaderFlow::mousePressEvent(QMouseEvent *event) -{ - PictureFlow::mousePressEvent(event, slideSize().width()); -} - -void YACReaderFlow::mouseDoubleClickEvent(QMouseEvent *event) -{ - if ((event->x() > (width() - slideSize().width()) / 2) && (event->x() < (width() + slideSize().width()) / 2)) - emit selected(centerIndex()); -} diff --git a/custom_widgets/yacreader_flow.h b/custom_widgets/yacreader_flow.h deleted file mode 100644 index d08ae3a88..000000000 --- a/custom_widgets/yacreader_flow.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef YACREADER_FLOW_H -#define YACREADER_FLOW_H - -#include "pictureflow.h" - -class QMouseEvent; - -class YACReaderFlow : public PictureFlow -{ - Q_OBJECT -public: - YACReaderFlow(QWidget *parent, FlowType flowType = CoverFlowLike); - - void mousePressEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - -signals: - void selected(unsigned int centerIndex); -}; - -#endif // YACREADER_FLOW_H \ No newline at end of file diff --git a/custom_widgets/yacreader_flow_config_widget.cpp b/custom_widgets/yacreader_flow_config_widget.cpp deleted file mode 100644 index cdf47cc58..000000000 --- a/custom_widgets/yacreader_flow_config_widget.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "yacreader_flow_config_widget.h" - -#include -#include -#include -#include - -YACReaderFlowConfigWidget::YACReaderFlowConfigWidget(QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *layout = new QVBoxLayout(this); - - QGroupBox *groupBox = new QGroupBox(tr("How to show covers:")); - - radio1 = new QRadioButton(tr("CoverFlow look")); - radio2 = new QRadioButton(tr("Stripe look")); - radio3 = new QRadioButton(tr("Overlapped Stripe look")); - - QVBoxLayout *vbox = new QVBoxLayout; - QHBoxLayout *opt1 = new QHBoxLayout; - opt1->addWidget(radio1); - QLabel *lOpt1 = new QLabel(); - lOpt1->setPixmap(QPixmap(":/images/flow1.png")); - opt1->addStretch(); - opt1->addWidget(lOpt1); - vbox->addLayout(opt1); - - QHBoxLayout *opt2 = new QHBoxLayout; - opt2->addWidget(radio2); - QLabel *lOpt2 = new QLabel(); - lOpt2->setPixmap(QPixmap(":/images/flow2.png")); - opt2->addStretch(); - opt2->addWidget(lOpt2); - vbox->addLayout(opt2); - - QHBoxLayout *opt3 = new QHBoxLayout; - opt3->addWidget(radio3); - QLabel *lOpt3 = new QLabel(); - lOpt3->setPixmap(QPixmap(":/images/flow3.png")); - opt3->addStretch(); - opt3->addWidget(lOpt3); - vbox->addLayout(opt3); - - // vbox->addStretch(1); - groupBox->setLayout(vbox); - - layout->addWidget(groupBox); - - layout->setContentsMargins(0, 0, 0, 0); - - setLayout(layout); -} \ No newline at end of file diff --git a/custom_widgets/yacreader_flow_config_widget.h b/custom_widgets/yacreader_flow_config_widget.h deleted file mode 100644 index 2d23d4620..000000000 --- a/custom_widgets/yacreader_flow_config_widget.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef YACREADER_FLOW_CONFIG_WIDGET_H -#define YACREADER_FLOW_CONFIG_WIDGET_H - -#include - -class QRadioButton; - -class YACReaderFlowConfigWidget : public QWidget -{ - Q_OBJECT -public: - QRadioButton *radio1; - QRadioButton *radio2; - QRadioButton *radio3; - - YACReaderFlowConfigWidget(QWidget *parent = 0); -}; - -#endif // YACREADER_FLOW_CONFIG_WIDGET_H \ No newline at end of file diff --git a/custom_widgets/yacreader_library_item_widget.cpp b/custom_widgets/yacreader_library_item_widget.cpp index f7cbec8e5..1446a28a8 100644 --- a/custom_widgets/yacreader_library_item_widget.cpp +++ b/custom_widgets/yacreader_library_item_widget.cpp @@ -1,12 +1,11 @@ #include "yacreader_library_item_widget.h" #include "yacreader_global.h" -#include "yacreader_global_gui.h" #include #include -#include #include +#include using namespace YACReader; @@ -19,20 +18,15 @@ YACReaderLibraryItemWidget::YACReaderLibraryItemWidget(QString n /*ame*/, QStrin // installEventFilter(this); - QPixmap iconPixmap = hdpiPixmap(addExtensionToIconPath(":/images/sidebar/libraryIcon"), QSize(16, 16)); icon = new QLabel(this); - icon->setPixmap(iconPixmap); nameLabel = new QLabel(name, this); options = new QToolButton(this); - QPixmap iconOptionsPixmap = hdpiPixmap(":/images/sidebar/libraryOptions.svg", QSize(8, 8)); - iconOptionsPixmap.setDevicePixelRatio(devicePixelRatioF()); - QLabel *helperLabel = new QLabel(options); - helperLabel->move(4, 3); - helperLabel->setFixedSize(14, 14); - helperLabel->setPixmap(iconOptionsPixmap); + optionsIconLabel = new QLabel(options); + optionsIconLabel->move(4, 3); + optionsIconLabel->setFixedSize(14, 14); options->setHidden(true); options->setIconSize(QSize(18, 18)); @@ -57,10 +51,6 @@ YACReaderLibraryItemWidget::YACReaderLibraryItemWidget(QString n /*ame*/, QStrin mainLayout->addWidget(down);*/ setLayout(mainLayout); -#ifndef Y_MAC_UI - QString styleSheet = "background-color:transparent; color:#DDDFDF;"; - setStyleSheet(styleSheet); -#endif QString iconStyleSheet = "QLabel {padding:0 0 0 24px; margin:0px}"; icon->setStyleSheet(iconStyleSheet); @@ -70,6 +60,35 @@ YACReaderLibraryItemWidget::YACReaderLibraryItemWidget(QString n /*ame*/, QStrin setMinimumHeight(20); setAttribute(Qt::WA_StyledBackground, true); + + initTheme(this); +} + +void YACReaderLibraryItemWidget::applyTheme(const Theme &theme) +{ + const auto &icons = theme.sidebarIcons; + const auto &li = theme.libraryItem; + + // Update icon based on current selection state + QIcon iconToUse = isSelected ? li.libraryIconSelected : icons.libraryIcon; + icon->setPixmap(iconToUse.pixmap(16, 16)); + + // Update options icon (uses libraryItem theme since it's only shown when selected) + QPixmap optionsPixmap = li.libraryOptionsIcon.pixmap(8, 8); + optionsPixmap.setDevicePixelRatio(devicePixelRatioF()); + optionsIconLabel->setPixmap(optionsPixmap); + + // Update widget styling based on selection state + if (isSelected) { + QString styleSheet = QString("color: %1; background-color: %2; font-weight:bold;") + .arg(li.selectedTextColor.name()) + .arg(li.selectedBackgroundColor.name()); + setStyleSheet(styleSheet); + } else { + QString styleSheet = QString("background-color:transparent; color: %1;") + .arg(li.textColor.name()); + setStyleSheet(styleSheet); + } } void YACReaderLibraryItemWidget::showUpDownButtons(bool show) @@ -117,17 +136,11 @@ bool YACReaderLibraryItemWidget::eventFilter(QObject *object, QEvent *event){ void YACReaderLibraryItemWidget::deselect() { - -#ifdef Y_MAC_UI - QString styleSheet = "background-color:transparent;"; - setStyleSheet(styleSheet); -#else - QString styleSheet = "background-color:transparent; color:#DDDFDF;"; + QString styleSheet = QString("background-color:transparent; color: %1;") + .arg(theme.libraryItem.textColor.name()); setStyleSheet(styleSheet); -#endif - QPixmap iconPixmap = hdpiPixmap(addExtensionToIconPath(":/images/sidebar/libraryIcon"), QSize(16, 16)); - icon->setPixmap(iconPixmap); + icon->setPixmap(theme.sidebarIcons.libraryIcon.pixmap(16, 16)); /*up->setHidden(true); down->setHidden(true);*/ @@ -138,18 +151,15 @@ void YACReaderLibraryItemWidget::deselect() void YACReaderLibraryItemWidget::select() { -#ifdef Y_MAC_UI - // QString styleSheet ="color: white; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6BAFE4, stop: 1 #3984D2); border-top: 2px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #5EA3DF, stop: 1 #73B8EA); border-left:none;border-right:none;border-bottom:1px solid #3577C2;"; - QString styleSheet = "color: white; background-color:#91c4f4; border-bottom:1px solid #91c4f4;"; -#else - QString styleSheet = "color: white; background-color:#2E2E2E; font-weight:bold;"; -#endif + const auto &li = theme.libraryItem; + QString styleSheet = QString("color: %1; background-color: %2; font-weight:bold;") + .arg(li.selectedTextColor.name()) + .arg(li.selectedBackgroundColor.name()); setStyleSheet(styleSheet); options->setHidden(false); - QPixmap iconPixmap = hdpiPixmap(":/images/sidebar/libraryIconSelected.svg", QSize(16, 16)); - icon->setPixmap(iconPixmap); + icon->setPixmap(theme.libraryItem.libraryIconSelected.pixmap(16, 16)); isSelected = true; } diff --git a/custom_widgets/yacreader_library_item_widget.h b/custom_widgets/yacreader_library_item_widget.h index d2af6d107..117f09bc6 100644 --- a/custom_widgets/yacreader_library_item_widget.h +++ b/custom_widgets/yacreader_library_item_widget.h @@ -1,6 +1,9 @@ #ifndef YACREADER_LIBRARY_ITEM_WIDGET_H #define YACREADER_LIBRARY_ITEM_WIDGET_H +#include "themable.h" + +#include #include class QLabel; @@ -8,7 +11,7 @@ class QToolButton; class QMouseEvent; class QEvent; -class YACReaderLibraryItemWidget : public QWidget +class YACReaderLibraryItemWidget : public QWidget, protected Themable { Q_OBJECT @@ -32,12 +35,16 @@ public slots: private: QLabel *icon; QLabel *nameLabel; + QLabel *optionsIconLabel; QToolButton *options; QToolButton *up; QToolButton *down; bool isSelected; + +protected: + void applyTheme(const Theme &theme) override; }; #endif // YACREADER_LIBRARY_ITEM_WIDGET_H diff --git a/custom_widgets/yacreader_library_list_widget.cpp b/custom_widgets/yacreader_library_list_widget.cpp index 5084024d1..a267a6f53 100644 --- a/custom_widgets/yacreader_library_list_widget.cpp +++ b/custom_widgets/yacreader_library_list_widget.cpp @@ -1,10 +1,11 @@ #include "yacreader_library_list_widget.h" +#include "qnaturalsorting.h" #include "yacreader_library_item_widget.h" -#include -#include + #include -#include "qnaturalsorting.h" +#include +#include YACReaderLibraryListWidget::YACReaderLibraryListWidget(QWidget *parent) : QWidget(parent), currentLibraryIndex(-1) @@ -75,9 +76,12 @@ void YACReaderLibraryListWidget::removeItem(int index) void YACReaderLibraryListWidget::mousePressEvent(QMouseEvent *event) { if (librariesList.count() > 0) { - int h = librariesList.at(0)->height(); - int item = event->pos().y() / h; - if (item != currentLibraryIndex) { + QWidget *child = childAt(event->pos()); + while (child && child->parentWidget() != this) { + child = child->parentWidget(); + } + int item = librariesList.indexOf(qobject_cast(child)); + if (item != -1 && item != currentLibraryIndex) { setCurrentIndex(item); } } diff --git a/custom_widgets/yacreader_macosx_toolbar.h b/custom_widgets/yacreader_macosx_toolbar.h index 18cdccb51..d383865b6 100644 --- a/custom_widgets/yacreader_macosx_toolbar.h +++ b/custom_widgets/yacreader_macosx_toolbar.h @@ -1,96 +1,11 @@ #ifndef YACREADER_MACOSX_TOOLBAR_H #define YACREADER_MACOSX_TOOLBAR_H -#include -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -#include -#include -#include - -#include "yacreader_global.h" - -// Wrapper for NSTextField -class YACReaderMacOSXSearchLineEdit : public QObject -{ - Q_OBJECT -public: - YACReaderMacOSXSearchLineEdit(); - void setFocus(Qt::FocusReason reason); - void *getNSTextField(); - -public slots: - QString text(); - void clear(); - void clearText(); // no signal emited - void setDisabled(bool disabled); - void setEnabled(bool enabled); - -private: - void *nstextfield; - -signals: - // convenience signal for YACReaderLibrary search edit - void filterChanged(QString); -}; - -class MacToolBarItemWrapper : public QObject -{ - Q_OBJECT -public: - MacToolBarItemWrapper(QAction *action, QMacToolBarItem *toolbaritem); - -public slots: - void actionToggled(bool toogled); - -private: - QAction *action; - QMacToolBarItem *toolbaritem; - - void updateIcon(bool checked); -}; - -class YACReaderMacOSXToolbar : public QMacToolBar -{ - Q_OBJECT -public: - explicit YACReaderMacOSXToolbar(QObject *parent = 0); - void addAction(QAction *action); - void addDropDownItem(const QList &actions, const QAction *defaultAction = 0); - void addSpace(int size); // size in points - void addSeparator(); - void addStretch(); - void addWidget(QWidget *widget); - void show(); - void hide(); - QMap actions; - - // hacks everywhere - // convenience method for YACReaderLibrary search edit - YACReaderMacOSXSearchLineEdit *addSearchEdit(); - // convenience method for showing the fit to width slider in MacOSX - QAction *addFitToWidthSlider(QAction *attachToAction); - - // convenience method for switching the icon of the view selector - void updateViewSelectorIcon(const QIcon &icon); - - void attachToWindow(QMainWindow *window); - -signals: - -public slots: - -protected: - NSToolbar *nativeToolBar; - void *delegate; - bool yosemite; - QMacToolBarItem *viewSelector; -}; -#else - #ifdef YACREADER_LIBRARY #include "yacreader_main_toolbar.h" #include "yacreader_search_line_edit.h" + #include class YACReaderMacOSXSearchLineEdit : public YACReaderSearchLineEdit @@ -149,6 +64,4 @@ public slots: #endif -#endif - #endif // YACREADER_MACOSX_TOOLBAR_H diff --git a/custom_widgets/yacreader_macosx_toolbar.mm b/custom_widgets/yacreader_macosx_toolbar.mm index e2d074505..483177ac5 100644 --- a/custom_widgets/yacreader_macosx_toolbar.mm +++ b/custom_widgets/yacreader_macosx_toolbar.mm @@ -1,406 +1,12 @@ #include "yacreader_macosx_toolbar.h" + #include "QtWidgets/qmainwindow.h" -#include #include -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -#include -#include -#include -#include -#include - #import -#import #import - -#import "shortcuts_manager.h" - -//---------------------------- -// A custom items separator for NSToolbar -@interface CustomSeparator : NSView - -@end - -@implementation CustomSeparator - -- (void)drawRect:(NSRect)rect -{ - [[NSColor colorWithDeviceRed:0.5 green:0.5 blue:0.5 alpha:1] setFill]; - NSRectFill(rect); - [super drawRect:rect]; -} - -@end - -//---------------------------- -// Toolbar delegate, needed for allow disabled/enabled items -@interface MyToolbarDelegate : NSObject { -@public - YACReaderMacOSXToolbar *mytoolbar; -} - -- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdent willBeInsertedIntoToolbar:(BOOL)willBeInserted; -- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar; -- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar; -//- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar; -- (IBAction)itemClicked:(id)sender; -- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem; -@end - -@implementation MyToolbarDelegate - -- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar -{ - Q_UNUSED(toolbar); - - NSMutableArray *array = [[NSMutableArray alloc] init]; - - QList items = mytoolbar->items(); - foreach (const QMacToolBarItem *item, items) { - [array addObject:item->nativeToolBarItem().itemIdentifier]; - } - return array; -} - -- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar -{ - Q_UNUSED(toolbar); - - NSMutableArray *array = [[NSMutableArray alloc] init]; - - QList items = mytoolbar->items(); - foreach (const QMacToolBarItem *item, items) { - [array addObject:item->nativeToolBarItem().itemIdentifier]; - } - return array; -} - -/* -- (NSArray *)toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar -{ - Q_UNUSED(toolbar); - - NSMutableArray *array = [[NSMutableArray alloc] init]; - - QList items = mytoolbar->items(); - foreach (const QMacToolBarItem * item, items) { - [array addObject : item->nativeToolBarItem().itemIdentifier]; - } - return array; - //NSMutableArray *array = toolbarPrivate->getItemIdentifiers(toolbarPrivate->items, true); - //[array addObjectsFromArray:toolbarPrivate->getItemIdentifiers(toolbarPrivate->allowedItems, true)]; - //return array; -}*/ - -- (IBAction)itemClicked:(id)sender -{ - if ([sender respondsToSelector:@selector(itemIdentifier)]) { - NSToolbarItem *item = reinterpret_cast(sender); - - QString identifier = QString::fromNSString([item itemIdentifier]); - QMacToolBarItem *toolButton = reinterpret_cast(identifier.toULongLong()); - Q_EMIT toolButton->activated(); - } -} - -- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)willBeInserted -{ - Q_UNUSED(toolbar); - Q_UNUSED(willBeInserted); - QList items = mytoolbar->items(); - - foreach (const QMacToolBarItem *item, items) { - NSToolbarItem *toolbarItem = item->nativeToolBarItem(); - if ([toolbarItem.itemIdentifier isEqual:itemIdentifier]) { - - [toolbarItem setTarget:self]; - [toolbarItem setAction:@selector(itemClicked:)]; - - return toolbarItem; - } - } - return nil; -} - -- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem -{ - QString identifier = QString::fromNSString(theItem.itemIdentifier); - - if (mytoolbar->actions.contains(identifier)) { - return mytoolbar->actions.value(identifier)->isEnabled(); - } else - return NO; -} -@end - -//---------------------------- -// detect changes in native text field -// TODO implement validation and auto completion -@interface MyTextFieldDelegate : NSObject { -@public - YACReaderMacOSXSearchLineEdit *mylineedit; -} -@end - -@implementation MyTextFieldDelegate - -- (void)controlTextDidChange:(NSNotification *)notification -{ - NSTextField *textField = [notification object]; - NSLog(@"%@", [textField stringValue]); - Q_EMIT mylineedit->filterChanged(QString::fromNSString([textField stringValue])); -} - -@end -//---------------------------- - -YACReaderMacOSXToolbar::YACReaderMacOSXToolbar(QObject *parent) - : viewSelector(0) -{ - // setup native toolbar - nativeToolBar = nativeToolbar(); - [nativeToolBar setDisplayMode:NSToolbarDisplayModeIconOnly]; - [nativeToolBar setAllowsUserCustomization:NO]; - - delegate = [[MyToolbarDelegate alloc] init]; - ((MyToolbarDelegate *)delegate)->mytoolbar = this; - [nativeToolBar setDelegate:(MyToolbarDelegate *)delegate]; - -#ifdef YACREADER_LIBRARY - NSWindow *nswindow = (NSWindow *)qApp->platformNativeInterface()->nativeResourceForWindow("nswindow", ((QMainWindow *)parent)->windowHandle()); - if ([nswindow respondsToSelector:@selector(setTitleVisibility:)]) { - yosemite = true; - // TODO yosemite new constants are not found in compilation time - [nswindow setTitleVisibility:NSWindowTitleHidden]; - // TODO NSFullSizeContentViewWindowMask produces an offset in the windows' content - // nswindow.styleMask |= 1 << 15; // NSFullSizeContentViewWindowMask; - [nativeToolBar setSizeMode:NSToolbarSizeModeSmall]; // TODO figure out how to load specific images in Yosemite - } else { - [nativeToolBar setSizeMode:NSToolbarSizeModeSmall]; - yosemite = false; - } -#else - yosemite = false; - [nativeToolBar setAutosavesConfiguration:YES]; // TODO this doesn't work - [nativeToolBar setSizeMode:NSToolbarSizeModeSmall]; -#endif -} - -void YACReaderMacOSXToolbar::addAction(QAction *action) -{ - QMacToolBarItem *toolBarItem = addItem(action->icon(), action->text()); - if (action->data().toString() == TOGGLE_COMICS_VIEW_ACTION_YL) - viewSelector = toolBarItem; - connect(toolBarItem, &QMacToolBarItem::activated, action, [=] { emit action->triggered(); }); - - NSToolbarItem *nativeItem = toolBarItem->nativeToolBarItem(); - actions.insert(QString::fromNSString(nativeItem.itemIdentifier), action); - - MacToolBarItemWrapper *wrapper = new MacToolBarItemWrapper(action, toolBarItem); - // wrapper->actionToogled(true); -} - -void YACReaderMacOSXToolbar::addDropDownItem(const QList &actions, const QAction *defaultAction) -{ - // TODO -} - -void YACReaderMacOSXToolbar::addSpace(int size) -{ - QMacToolBarItem *toolBarItem = addItem(QIcon(), ""); - NSToolbarItem *nativeItem = toolBarItem->nativeToolBarItem(); - - static const NSRect frameRect = { { 0.0, 0.0 }, { CGFloat(size), 16.0 } }; - NSView *view = [[NSView alloc] initWithFrame:frameRect]; - - [nativeItem setView:view]; -} - -// reimplemented for convenience -void YACReaderMacOSXToolbar::addSeparator() -{ - // QMacToolBar::addSeparator(); - - QMacToolBarItem *toolBarItem = addItem(QIcon(), ""); - NSToolbarItem *nativeItem = toolBarItem->nativeToolBarItem(); - - static const NSRect frameRect = { { 0.0, 0.0 }, { 1, 16.0 } }; - CustomSeparator *view = [[CustomSeparator alloc] initWithFrame:frameRect]; - - [nativeItem setView:view]; -} - -void YACReaderMacOSXToolbar::addStretch() -{ - QMacToolBarItem *toolBarItem = addItem(QIcon(), ""); - toolBarItem->setStandardItem(QMacToolBarItem::FlexibleSpace); -} - -void YACReaderMacOSXToolbar::addWidget(QWidget *widget) -{ - // TODO fix it - /* QMacNativeWidget *nativeWidget = new QMacNativeWidget(); - QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(widget); - nativeWidget->setLayout(layout); - - - NSView *nativeWidgetView = reinterpret_cast(nativeWidget->winId()); - QMacToolBarItem *toolBarItem = addItem(QIcon(),""); - NSToolbarItem * nativeItem = toolBarItem->nativeToolBarItem(); - [nativeItem setView:nativeWidgetView];*/ -} - -void YACReaderMacOSXToolbar::show() -{ - [nativeToolBar setVisible:YES]; -} - -void YACReaderMacOSXToolbar::hide() -{ - [nativeToolBar setVisible:NO]; -} - -YACReaderMacOSXSearchLineEdit *YACReaderMacOSXToolbar::addSearchEdit() -{ - QMacToolBarItem *toolBarItem = addItem(QIcon(), ""); - NSToolbarItem *nativeItem = toolBarItem->nativeToolBarItem(); - - YACReaderMacOSXSearchLineEdit *searchEdit = new YACReaderMacOSXSearchLineEdit(); - - if (yosemite) - [nativeItem setView:(NSTextField *)searchEdit->getNSTextField()]; - else { - static const NSRect searchEditFrameRect = { { 0.0, 0.0 }, { 165, 26.0 } }; - NSView *view = [[NSView alloc] initWithFrame:searchEditFrameRect]; - [view addSubview:((NSTextField *)searchEdit->getNSTextField())]; - [nativeItem setView:view]; - } - - return searchEdit; -} - -// deprecated -QAction *YACReaderMacOSXToolbar::addFitToWidthSlider(QAction *attachToAction) -{ - QMacToolBarItem *toolBarItem = addItem(QIcon(":/images/viewer_toolbar/toWidthSlider.png"), "fit to width slider"); - - NSToolbarItem *nativeItem = toolBarItem->nativeToolBarItem(); - actions.insert(QString::fromNSString(nativeItem.itemIdentifier), attachToAction); - - QAction *action = new QAction("", attachToAction->parent()); - - connect(toolBarItem, &QMacToolBarItem::activated, action, [=] { emit action->triggered(); }); - - return action; -} - -void YACReaderMacOSXToolbar::updateViewSelectorIcon(const QIcon &icon) -{ - if (viewSelector) - viewSelector->setIcon(icon); -} - -void YACReaderMacOSXToolbar::attachToWindow(QMainWindow *window) -{ - QMacToolBar::attachToWindow(window->windowHandle()); -} - -YACReaderMacOSXSearchLineEdit::YACReaderMacOSXSearchLineEdit() - : QObject() -{ - NSRect searchEditFrameRect = { { 0.0, -3.0 }, { 165, 32.0 } }; - // NSTextField * searchEdit = [[NSTextField alloc] initWithFrame:searchEditFrameRect]; - - NSTextField *searchEdit = [[NSSearchField alloc] initWithFrame:searchEditFrameRect]; - //[searchEdit setBezelStyle:NSTextFieldRoundedBezel]; - - [[searchEdit cell] setPlaceholderString:@"type to search"]; - - MyTextFieldDelegate *delegate = [[MyTextFieldDelegate alloc] init]; - delegate->mylineedit = this; - [searchEdit setDelegate:delegate]; - - nstextfield = searchEdit; -} - -void YACReaderMacOSXSearchLineEdit::setFocus(Qt::FocusReason reason) -{ - Q_UNUSED(reason) - - [((NSTextField *)nstextfield) becomeFirstResponder]; -} - -void *YACReaderMacOSXSearchLineEdit::getNSTextField() -{ - return nstextfield; -} - -QString YACReaderMacOSXSearchLineEdit::text() -{ - return QString::fromNSString([((NSTextField *)nstextfield) stringValue]); -} - -void YACReaderMacOSXSearchLineEdit::clear() -{ - [((NSTextField *)nstextfield) setStringValue:@""]; - emit filterChanged(""); -} - -void YACReaderMacOSXSearchLineEdit::clearText() -{ - // TODO be sure that this will not generate any event.... - [((NSTextField *)nstextfield) setStringValue:@""]; -} - -void YACReaderMacOSXSearchLineEdit::setDisabled(bool disabled) -{ - [((NSTextField *)nstextfield) setEnabled:!disabled]; -} - -void YACReaderMacOSXSearchLineEdit::setEnabled(bool enabled) -{ - [((NSTextField *)nstextfield) setEnabled:enabled]; -} - -MacToolBarItemWrapper::MacToolBarItemWrapper(QAction *action, QMacToolBarItem *toolbaritem) - : action(action), toolbaritem(toolbaritem) -{ - if (action->isCheckable()) { - connect(action, &QAction::toggled, this, &MacToolBarItemWrapper::actionToggled); - connect(toolbaritem, &QMacToolBarItem::activated, action, &QAction::toggle); - updateIcon(action->isChecked()); - } -} - -void MacToolBarItemWrapper::actionToggled(bool toogled) -{ - updateIcon(toogled); -} - -void MacToolBarItemWrapper::updateIcon(bool enabled) -{ - if (enabled) { - QIcon icon = action->icon(); - QPixmap tempPixmap = icon.pixmap(QSize(24, 24)); - QPainter painter; - painter.begin(&tempPixmap); - painter.fillRect(QRect(3, 21, 18, 1), QColor("#3F3F3F")); - painter.fillRect(QRect(3, 22, 18, 1), QColor("#6E6E6E")); - painter.fillRect(QRect(3, 23, 18, 1), QColor("#EEEEEE")); - painter.end(); - - toolbaritem->setIcon(QIcon(tempPixmap)); - } else - toolbaritem->setIcon(action->icon()); -} -#else - -#import #import -#import NSImage *QIconToNSImage(const QIcon &icon, const QSize &size, const QColor &color = QColor()) { @@ -462,9 +68,17 @@ void bindActionToNSToolbarItem(QAction *action, NSToolbarItem *toolbarItem, cons toolbarItem.toolTip = tooltip.isEmpty() ? @"" : [NSString stringWithUTF8String:tooltip.toUtf8().constData()]; QIcon icon = action->icon(); + if (icon.isNull()) { + return; + } __auto_type image = QIconToNSImage(icon, { 24, 24 }, iconColor); + if (image.size.width == 0 || image.size.height == 0) { + [image release]; + return; + } + if (action->isChecked()) { NSSize size = image.size; NSImage *decoratedImage = [[NSImage alloc] initWithSize:size]; @@ -584,7 +198,7 @@ - (NSArray *)toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar NSMutableArray *array = [[NSMutableArray alloc] init]; QList items = mytoolbar->items(); - foreach (const QMacToolBarItem * item, items) { + for (const auto *item : items) { [array addObject : item->nativeToolBarItem().itemIdentifier]; } return array; @@ -950,5 +564,3 @@ - (BOOL)validateToolbarItem:(NSToolbarItem *)item } #endif - -#endif diff --git a/custom_widgets/yacreader_options_dialog.cpp b/custom_widgets/yacreader_options_dialog.cpp index 8f6de9a80..99c214cdd 100644 --- a/custom_widgets/yacreader_options_dialog.cpp +++ b/custom_widgets/yacreader_options_dialog.cpp @@ -1,30 +1,21 @@ #include "yacreader_options_dialog.h" -#include "yacreader_flow_config_widget.h" -#ifndef NO_OPENGL -#include "yacreader_gl_flow_config_widget.h" -#else -#include "pictureflow.h" -#endif +#include "yacreader_3d_flow_config_widget.h" +#include "yacreader_global_gui.h" #include "yacreader_spin_slider_widget.h" -#include "yacreader_global.h" -#include #include +#include +#include #include -#include #include -#include +#include #include YACReaderOptionsDialog::YACReaderOptionsDialog(QWidget *parent) : QDialog(parent) { - - sw = new YACReaderFlowConfigWidget(this); -#ifndef NO_OPENGL - gl = new YACReaderGLFlowConfigWidget(this); -#endif + gl = new YACReader3DFlowConfigWidget(this); accept = new QPushButton(tr("Save")); cancel = new QPushButton(tr("Cancel")); @@ -42,18 +33,7 @@ YACReaderOptionsDialog::YACReaderOptionsDialog(QWidget *parent) connect(accept, &QAbstractButton::clicked, this, &YACReaderOptionsDialog::saveOptions); connect(cancel, &QAbstractButton::clicked, this, QOverload<>::of(&YACReaderOptionsDialog::restoreOptions)); connect(cancel, &QAbstractButton::clicked, this, &QWidget::close); -#ifndef NO_OPENGL - useGL = new QCheckBox(tr("Use hardware acceleration (restart needed)")); - connect(useGL, &QCheckBox::stateChanged, this, &YACReaderOptionsDialog::saveUseGL); -#endif -#ifdef FORCE_ANGLE - useGL->setHidden(true); -#endif - // sw CONNECTIONS - connect(sw->radio1, &QAbstractButton::toggled, this, &YACReaderOptionsDialog::setClassicConfigSW); - connect(sw->radio2, &QAbstractButton::toggled, this, &YACReaderOptionsDialog::setStripeConfigSW); - connect(sw->radio3, &QAbstractButton::toggled, this, &YACReaderOptionsDialog::setOverlappedStripeConfigSW); -#ifndef NO_OPENGL + // gl CONNECTIONS connect(gl->radioClassic, &QAbstractButton::toggled, this, &YACReaderOptionsDialog::setClassicConfig); connect(gl->radioStripe, &QAbstractButton::toggled, this, &YACReaderOptionsDialog::setStripeConfig); @@ -103,11 +83,9 @@ YACReaderOptionsDialog::YACReaderOptionsDialog(QWidget *parent) connect(gl->performanceSlider, &QAbstractSlider::valueChanged, this, &YACReaderOptionsDialog::savePerformance); connect(gl->performanceSlider, &QAbstractSlider::valueChanged, this, &YACReaderOptionsDialog::optionsChanged); - connect(gl->vSyncCheck, &QCheckBox::stateChanged, this, &YACReaderOptionsDialog::saveUseVSync); -#endif + connect(gl->vSyncCheck, &QCheckBox::checkStateChanged, this, &YACReaderOptionsDialog::saveUseVSync); } -#ifndef NO_OPENGL void YACReaderOptionsDialog::savePerformance(int value) { settings->setValue(PERFORMANCE, value); @@ -132,7 +110,6 @@ void YACReaderOptionsDialog::saveFlowParameters() settings->setValue(LIGHT_STRENGTH, gl->lightStrength->getValue()); settings->setValue(MAX_ANGLE, gl->maxAngle->getValue()); } -#endif void YACReaderOptionsDialog::saveOptions() { @@ -140,96 +117,68 @@ void YACReaderOptionsDialog::saveOptions() close(); } -#ifndef NO_OPENGL -void YACReaderOptionsDialog::saveUseGL(int b) -{ - - if (Qt::Checked == b) { - sw->setVisible(false); - gl->setVisible(true); - } else { - gl->setVisible(false); - sw->setVisible(true); - } - resize(0, 0); - - settings->setValue(USE_OPEN_GL, b); -} -#endif - -#ifndef NO_OPENGL void YACReaderOptionsDialog::saveXRotation(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(X_ROTATION, value); } void YACReaderOptionsDialog::saveYPosition(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(Y_POSITION, value); } void YACReaderOptionsDialog::saveCoverDistance(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(COVER_DISTANCE, value); } void YACReaderOptionsDialog::saveCentralDistance(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(CENTRAL_DISTANCE, value); } void YACReaderOptionsDialog::saveZoomLevel(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(ZOOM_LEVEL, value); } void YACReaderOptionsDialog::saveYCoverOffset(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(Y_COVER_OFFSET, value); } void YACReaderOptionsDialog::saveZCoverOffset(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(Z_COVER_OFFSET, value); } void YACReaderOptionsDialog::saveCoverRotation(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(COVER_ROTATION, value); } void YACReaderOptionsDialog::saveFadeOutDist(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(FADE_OUT_DIST, value); } void YACReaderOptionsDialog::saveLightStrength(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(LIGHT_STRENGTH, value); } void YACReaderOptionsDialog::saveMaxAngle(int value) { - settings->setValue(FLOW_TYPE_GL, Custom); + settings->setValue(FLOW_TYPE_GL, YACReader::Custom); settings->setValue(MAX_ANGLE, value); } -#endif + void YACReaderOptionsDialog::restoreOptions(QSettings *settings) { this->settings = settings; // FLOW CONFIG -#ifndef NO_OPENGL - if (settings->contains(USE_OPEN_GL) && settings->value(USE_OPEN_GL).toInt() == Qt::Checked) { - sw->setVisible(false); - gl->setVisible(true); - useGL->setChecked(true); - } else { - gl->setVisible(false); - sw->setVisible(true); - useGL->setChecked(false); - } if (!settings->contains(FLOW_TYPE_GL)) { setClassicConfig(); @@ -245,67 +194,66 @@ void YACReaderOptionsDialog::restoreOptions(QSettings *settings) gl->performanceSlider->setValue(settings->value(PERFORMANCE).toInt()); - FlowType flowType; + YACReader::FlowType flowType; switch (settings->value(FLOW_TYPE_GL).toInt()) { case 0: - flowType = CoverFlowLike; + flowType = YACReader::CoverFlowLike; break; case 1: - flowType = Strip; + flowType = YACReader::Strip; break; case 2: - flowType = StripOverlapped; + flowType = YACReader::StripOverlapped; break; case 3: - flowType = Modern; + flowType = YACReader::Modern; break; case 4: - flowType = Roulette; + flowType = YACReader::Roulette; break; case 5: - flowType = Custom; + flowType = YACReader::Custom; break; default: - flowType = CoverFlowLike; + flowType = YACReader::CoverFlowLike; } - if (flowType == Custom) { + if (flowType == YACReader::Custom) { loadConfig(); return; } - if (flowType == CoverFlowLike) { + if (flowType == YACReader::CoverFlowLike) { setClassicConfig(); gl->radioClassic->setChecked(true); return; } - if (flowType == Strip) { + if (flowType == YACReader::Strip) { setStripeConfig(); gl->radioStripe->setChecked(true); return; } - if (flowType == StripOverlapped) { + if (flowType == YACReader::StripOverlapped) { setOverlappedStripeConfig(); gl->radioOver->setChecked(true); return; } - if (flowType == Modern) { + if (flowType == YACReader::Modern) { setModernConfig(); gl->radionModern->setChecked(true); return; } - if (flowType == Roulette) { + if (flowType == YACReader::Roulette) { setRouletteConfig(); gl->radioDown->setChecked(true); return; } // END FLOW CONFIG -#endif } void YACReaderOptionsDialog::restoreOptions() @@ -313,7 +261,6 @@ void YACReaderOptionsDialog::restoreOptions() restoreOptions(settings); } -#ifndef NO_OPENGL void YACReaderOptionsDialog::loadConfig() { gl->xRotation->setValue(settings->value(X_ROTATION).toInt()); @@ -328,30 +275,14 @@ void YACReaderOptionsDialog::loadConfig() gl->lightStrength->setValue(settings->value(LIGHT_STRENGTH).toInt()); gl->maxAngle->setValue(settings->value(MAX_ANGLE).toInt()); } -#endif -void YACReaderOptionsDialog::setClassicConfigSW() -{ - settings->setValue(FLOW_TYPE_SW, CoverFlowLike); -} - -void YACReaderOptionsDialog::setStripeConfigSW() -{ - settings->setValue(FLOW_TYPE_SW, Strip); -} - -void YACReaderOptionsDialog::setOverlappedStripeConfigSW() -{ - settings->setValue(FLOW_TYPE_SW, StripOverlapped); -} -#ifndef NO_OPENGL void YACReaderOptionsDialog::setClassicConfig() { gl->setValues(presetYACReaderFlowClassicConfig); saveFlowParameters(); - settings->setValue(FLOW_TYPE_GL, CoverFlowLike); + settings->setValue(FLOW_TYPE_GL, YACReader::CoverFlowLike); } void YACReaderOptionsDialog::setStripeConfig() @@ -360,7 +291,7 @@ void YACReaderOptionsDialog::setStripeConfig() saveFlowParameters(); - settings->setValue(FLOW_TYPE_GL, Strip); + settings->setValue(FLOW_TYPE_GL, YACReader::Strip); } void YACReaderOptionsDialog::setOverlappedStripeConfig() @@ -369,7 +300,7 @@ void YACReaderOptionsDialog::setOverlappedStripeConfig() saveFlowParameters(); - settings->setValue(FLOW_TYPE_GL, StripOverlapped); + settings->setValue(FLOW_TYPE_GL, YACReader::StripOverlapped); } void YACReaderOptionsDialog::setModernConfig() @@ -378,7 +309,7 @@ void YACReaderOptionsDialog::setModernConfig() saveFlowParameters(); - settings->setValue(FLOW_TYPE_GL, Modern); + settings->setValue(FLOW_TYPE_GL, YACReader::Modern); } void YACReaderOptionsDialog::setRouletteConfig() @@ -387,6 +318,5 @@ void YACReaderOptionsDialog::setRouletteConfig() saveFlowParameters(); - settings->setValue(FLOW_TYPE_GL, Roulette); + settings->setValue(FLOW_TYPE_GL, YACReader::Roulette); } -#endif diff --git a/custom_widgets/yacreader_options_dialog.h b/custom_widgets/yacreader_options_dialog.h index 4669e0d6a..44a0b9a90 100644 --- a/custom_widgets/yacreader_options_dialog.h +++ b/custom_widgets/yacreader_options_dialog.h @@ -3,10 +3,7 @@ #include -class YACReaderFlowConfigWidget; -#ifndef NO_OPENGL -class YACReaderGLFlowConfigWidget; -#endif +class YACReader3DFlowConfigWidget; class QCheckBox; class QPushButton; class QSettings; @@ -16,11 +13,7 @@ class YACReaderOptionsDialog : public QDialog { Q_OBJECT protected: - YACReaderFlowConfigWidget *sw; -#ifndef NO_OPENGL - YACReaderGLFlowConfigWidget *gl; - QCheckBox *useGL; -#endif + YACReader3DFlowConfigWidget *gl; QPushButton *accept; QPushButton *cancel; @@ -37,10 +30,8 @@ public slots: virtual void restoreOptions(); virtual void saveOptions(); protected slots: -#ifndef NO_OPENGL virtual void savePerformance(int value); virtual void saveUseVSync(int b); - virtual void saveUseGL(int b); virtual void saveXRotation(int value); virtual void saveYPosition(int value); virtual void saveCoverDistance(int value); @@ -59,10 +50,6 @@ protected slots: virtual void setModernConfig(); virtual void setRouletteConfig(); virtual void saveFlowParameters(); -#endif - virtual void setClassicConfigSW(); - virtual void setStripeConfigSW(); - virtual void setOverlappedStripeConfigSW(); signals: void optionsChanged(); diff --git a/custom_widgets/yacreader_search_line_edit.cpp b/custom_widgets/yacreader_search_line_edit.cpp index e1e105b8f..8090f2e01 100644 --- a/custom_widgets/yacreader_search_line_edit.cpp +++ b/custom_widgets/yacreader_search_line_edit.cpp @@ -1,81 +1,50 @@ #include "yacreader_search_line_edit.h" -#include "yacreader_global.h" -#include "yacreader_global_gui.h" - -#include -#include #include - -#include "QsLog.h" +#include +#include YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) - : QLineEdit(parent) + : QLineEdit(parent), paddingLeft(0), paddingRight(0) { clearButton = new QToolButton(this); searchLabel = new QLabel(this); -#ifdef Y_MAC_UI - QPixmap clearIcon; - QPixmap searchIcon; - - clearIcon.setDevicePixelRatio(devicePixelRatioF()); - searchIcon.setDevicePixelRatio(devicePixelRatioF()); - - if (devicePixelRatioF() > 1) { - if (!clearIcon.load(":/images/clearSearch@2x.png")) { - clearIcon.load(":/images/clearSearch.png"); - } - if (!searchIcon.load(":/images/iconSearch@2x.png")) { - searchIcon.load(":/images/iconSearch.png"); - } - } else { - clearIcon.load(":/images/clearSearch.png"); - searchIcon.load(":/images/iconSearch.png"); - } -#else - QPixmap clearIcon = YACReader::hdpiPixmap(":/images/clearSearch.svg", QSize(15, 15)); - QPixmap searchIcon = YACReader::hdpiPixmap(":/images/iconSearch.svg", QSize(15, 15)); -#endif - - searchLabel->setStyleSheet("QLabel { border: none; padding: 0px; }"); - searchLabel->setPixmap(searchIcon); - - clearButton->setIcon(QIcon(clearIcon)); - -#ifdef Y_MAC_UI - clearButton->setIconSize(QSize(14, 14)); -#else clearButton->setIconSize(QSize(12, 12)); -#endif clearButton->setCursor(Qt::ArrowCursor); - clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton->hide(); connect(clearButton, &QAbstractButton::clicked, this, &QLineEdit::clear); connect(this, &QLineEdit::textChanged, this, &YACReaderSearchLineEdit::updateCloseButton); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); -#ifdef Y_MAC_UI - setStyleSheet(QString("QLineEdit {border-top:1px solid #9F9F9F; border-bottom:1px solid #ACACAC; border-right:1px solid #ACACAC; border-left:1px solid #ACACAC; border-radius: 4px; background-color:#EEEEEE; padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-bottom: 1px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6).arg(clearButton->sizeHint().width() + frameWidth + 2)); -#else - setStyleSheet(QString("QLineEdit {color: #ABABAB; border:none; border-radius: 4px; background-color:#404040; padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-right: 9px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6 + 5).arg(clearButton->sizeHint().width() + frameWidth + 2)); -#endif + paddingLeft = 15 + frameWidth + 6 + 5; + paddingRight = 12 + frameWidth + 10; + QSize msz = minimumSizeHint(); setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); -#ifdef Y_MAC_UI - setMaximumWidth(212); - setFixedHeight(26); -#else setMaximumWidth(255); setFixedHeight(26); -#endif - setAttribute(Qt::WA_MacShowFocusRect, false); setPlaceholderText(tr("type to search")); connect(this, &QLineEdit::textChanged, this, &YACReaderSearchLineEdit::processText); + + initTheme(this); +} + +void YACReaderSearchLineEdit::applyTheme(const Theme &theme) +{ + const auto &searchTheme = theme.searchLineEdit; + + setStyleSheet(searchTheme.lineEditQSS.arg(paddingLeft).arg(paddingRight)); + searchLabel->setStyleSheet(searchTheme.searchLabelQSS); + clearButton->setStyleSheet(searchTheme.clearButtonQSS); + + searchLabel->setPixmap(searchTheme.searchIcon); + clearButton->setIcon(QIcon(searchTheme.clearIcon)); } void YACReaderSearchLineEdit::clearText() @@ -92,15 +61,6 @@ const QString YACReaderSearchLineEdit::text() void YACReaderSearchLineEdit::resizeEvent(QResizeEvent *) { -#ifdef Y_MAC_UI - QSize sz = clearButton->sizeHint(); - int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - clearButton->move(rect().right() - frameWidth - sz.width(), - (rect().bottom() + 1 - sz.height()) / 2); - - QSize szl = searchLabel->sizeHint(); - searchLabel->move(6, (rect().bottom() + 1 - szl.height()) / 2); -#else QSize sz = clearButton->sizeHint(); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); int marginRight = style()->pixelMetric(QStyle::PM_LayoutRightMargin); @@ -109,7 +69,6 @@ void YACReaderSearchLineEdit::resizeEvent(QResizeEvent *) QSize szl = searchLabel->sizeHint(); searchLabel->move(8, (rect().bottom() + 2 - szl.height()) / 2); -#endif } void YACReaderSearchLineEdit::updateCloseButton(const QString &text) diff --git a/custom_widgets/yacreader_search_line_edit.h b/custom_widgets/yacreader_search_line_edit.h index fdedef1d0..bca2b9a42 100644 --- a/custom_widgets/yacreader_search_line_edit.h +++ b/custom_widgets/yacreader_search_line_edit.h @@ -1,15 +1,15 @@ #ifndef YACREADER_SEARCH_LINE_EDIT_H #define YACREADER_SEARCH_LINE_EDIT_H -#include -#include +#include "themable.h" -#include "yacreader_global.h" +#include +#include class QToolButton; class QLabel; -class YACReaderSearchLineEdit : public QLineEdit +class YACReaderSearchLineEdit : public QLineEdit, protected Themable { Q_OBJECT @@ -20,6 +20,7 @@ class YACReaderSearchLineEdit : public QLineEdit protected: void resizeEvent(QResizeEvent *); + void applyTheme(const Theme &theme) override; signals: void filterChanged(QString); @@ -31,6 +32,9 @@ private slots: private: QToolButton *clearButton; QLabel *searchLabel; + + int paddingLeft; + int paddingRight; }; #endif // YACREADER_SEARCH_LINE_EDIT_H diff --git a/custom_widgets/yacreader_sidebar.cpp b/custom_widgets/yacreader_sidebar.cpp index 13f72dc56..a4cd113d9 100644 --- a/custom_widgets/yacreader_sidebar.cpp +++ b/custom_widgets/yacreader_sidebar.cpp @@ -1,16 +1,14 @@ #include "yacreader_sidebar.h" -#include -#include - #include "yacreader_folders_view.h" -#include "yacreader_reading_lists_view.h" +#include "yacreader_global.h" +#include "yacreader_global_gui.h" #include "yacreader_library_list_widget.h" -#include "yacreader_search_line_edit.h" +#include "yacreader_reading_lists_view.h" #include "yacreader_titled_toolbar.h" -#include "yacreader_global.h" -#include "yacreader_global_gui.h" +#include +#include YACReaderSideBar::YACReaderSideBar(QWidget *parent) : QWidget(parent) @@ -25,28 +23,14 @@ YACReaderSideBar::YACReaderSideBar(QWidget *parent) readingListsView = new YACReaderReadingListsView; selectedLibrary = new YACReaderLibraryListWidget; -#ifdef Y_MAC_UI - librariesTitle = new YACReaderTitledToolBar(tr("Libraries")); - foldersTitle = new YACReaderTitledToolBar(tr("Folders")); - readingListsTitle = new YACReaderTitledToolBar(tr("Reading Lists")); -#else - librariesTitle = new YACReaderTitledToolBar(tr("LIBRARIES")); - foldersTitle = new YACReaderTitledToolBar(tr("FOLDERS")); - readingListsTitle = new YACReaderTitledToolBar(tr("READING LISTS")); -#endif + // Titles will be set from theme in applyTheme + librariesTitle = new YACReaderTitledToolBar(""); + foldersTitle = new YACReaderTitledToolBar(""); + readingListsTitle = new YACReaderTitledToolBar(""); splitter = new QSplitter(this); splitter->setOrientation(Qt::Vertical); -#ifndef Y_MAC_UI - splitter->setStyleSheet("QSplitter::handle { " - " image: none; background-color = black; " - " }" - "QSplitter::handle:vertical { height: 39px;}"); -#else - splitter->setStyleSheet("QSplitter::handle:vertical { height: 26px; background-color: transparent;}"); -#endif - selectedLibrary->setContextMenuPolicy(Qt::ActionsContextMenu); selectedLibrary->setAttribute(Qt::WA_MacShowFocusRect, false); selectedLibrary->setFocusPolicy(Qt::NoFocus); @@ -57,24 +41,18 @@ YACReaderSideBar::YACReaderSideBar(QWidget *parent) l->setContentsMargins(0, 0, 0, 0); // LIBRARIES------------------------------------------------------- -#ifndef Y_MAC_UI l->addSpacing(5); -#endif l->addWidget(librariesTitle); -#ifndef Y_MAC_UI l->addSpacing(4); - l->addWidget(new YACReaderSideBarSeparator(this)); + auto sep1 = new YACReaderSideBarSeparator(this); + separators.append(sep1); + l->addWidget(sep1); l->addSpacing(3); -#endif l->addWidget(selectedLibrary); -#ifndef Y_MAC_UI l->addSpacing(11); -#else - l->addSpacing(6); -#endif // END LIBRARIES--------------------------------------------------- @@ -84,23 +62,18 @@ YACReaderSideBar::YACReaderSideBar(QWidget *parent) foldersLayout->setContentsMargins(0, 0, 0, 0); foldersLayout->setSpacing(0); -#ifndef Y_MAC_UI - // foldersLayout->addSpacing(6); - - // foldersLayout->addSpacing(5); - foldersLayout->addWidget(new YACReaderSideBarSeparator(this)); + auto sep2 = new YACReaderSideBarSeparator(this); + separators.append(sep2); + foldersLayout->addWidget(sep2); foldersLayout->addSpacing(4); -#else - // foldersLayout->addSpacing(6); -#endif foldersLayout->addWidget(foldersTitle); -#ifndef Y_MAC_UI foldersLayout->addSpacing(4); - foldersLayout->addWidget(new YACReaderSideBarSeparator(this)); + auto sep3 = new YACReaderSideBarSeparator(this); + separators.append(sep3); + foldersLayout->addWidget(sep3); foldersLayout->addSpacing(4); -#endif foldersLayout->addWidget(foldersView); foldersLayout->addSpacing(6); @@ -116,28 +89,21 @@ YACReaderSideBar::YACReaderSideBar(QWidget *parent) readingListsHeaderLayout->setContentsMargins(0, 0, 0, 0); readingListsHeaderLayout->setSpacing(0); -#ifndef Y_MAC_UI - // readingListsHeaderLayout->addSpacing(6); - - // readingListsHeaderLayout->addSpacing(5); - readingListsHeaderLayout->addWidget(new YACReaderSideBarSeparator(this)); + auto sep4 = new YACReaderSideBarSeparator(this); + separators.append(sep4); + readingListsHeaderLayout->addWidget(sep4); readingListsHeaderLayout->addSpacing(4); -#else - // readingListsHeaderLayout->addSpacing(6); -#endif readingListsHeaderLayout->addWidget(readingListsTitle); -#ifndef Y_MAC_UI readingListsHeaderLayout->addSpacing(4); - readingListsHeaderLayout->addWidget(new YACReaderSideBarSeparator(this)); + auto sep5 = new YACReaderSideBarSeparator(this); + separators.append(sep5); + readingListsHeaderLayout->addWidget(sep5); readingListsHeaderLayout->addSpacing(4); -#endif - // readingListsLayout->addWidget(readingListsView); readingListsHeaderLayout->addStretch(); QSplitterHandle *handle = splitter->handle(1); - // handle->setCursor(QCursor(Qt::ArrowCursor)); handle->setLayout(readingListsHeaderLayout); // END READING LISTS------------------------------------------------ @@ -148,30 +114,16 @@ YACReaderSideBar::YACReaderSideBar(QWidget *parent) if (settings->contains(SIDEBAR_SPLITTER_STATUS)) splitter->restoreState(settings->value(SIDEBAR_SPLITTER_STATUS).toByteArray()); + + initTheme(this); } void YACReaderSideBar::paintEvent(QPaintEvent *event) { Q_UNUSED(event) -#ifdef Y_MAC_UI QPainter painter(this); - - painter.fillRect(0, 0, width(), height(), QColor("#F1F1F1")); -#else - QPainter painter(this); - - painter.fillRect(0, 0, width(), height(), QColor("#454545")); - // QWidget::paintEvent(event); -#endif - - // QPixmap shadow(":/images/side_bar/shadow.png"); - // painter.drawPixmap(width()-shadow.width(),0,shadow.width(),height(),shadow); - - // painter.setRenderHint(QPainter::Antialiasing); - // painter.drawLine(rect().topLeft(), rect().bottomRight()); - - // QWidget::paintEvent(event); + painter.fillRect(0, 0, width(), height(), theme.sidebar.backgroundColor); } void YACReaderSideBar::closeEvent(QCloseEvent *event) @@ -186,17 +138,40 @@ QSize YACReaderSideBar::sizeHint() const return QSize(275, 200); } +void YACReaderSideBar::applyTheme(const Theme &theme) +{ + splitter->setStyleSheet(theme.sidebar.splitterQSS); + + // Titles are per-instance, toolbars handle their own colors via Themable + auto applyCase = [&](const QString &s) { return theme.sidebar.uppercaseLabels ? s.toUpper() : s; }; + librariesTitle->setTitle(applyCase(QObject::tr("Libraries"))); + foldersTitle->setTitle(applyCase(QObject::tr("Folders"))); + readingListsTitle->setTitle(applyCase(QObject::tr("Reading Lists"))); + + for (auto separator : separators) { + separator->setColor(theme.sidebar.sectionSeparatorColor); + } + + update(); // Trigger repaint for background color +} + YACReaderSideBarSeparator::YACReaderSideBarSeparator(QWidget *parent) - : QWidget(parent) + : QWidget(parent), separatorColor(QColor("#575757")) { setFixedHeight(1); } +void YACReaderSideBarSeparator::setColor(const QColor &color) +{ + separatorColor = color; + update(); +} + void YACReaderSideBarSeparator::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); - painter.fillRect(5, 0, width() - 10, height(), QColor("#575757")); + painter.fillRect(5, 0, width() - 10, height(), separatorColor); } diff --git a/custom_widgets/yacreader_sidebar.h b/custom_widgets/yacreader_sidebar.h index e04405b64..82e6933e2 100644 --- a/custom_widgets/yacreader_sidebar.h +++ b/custom_widgets/yacreader_sidebar.h @@ -1,7 +1,15 @@ #ifndef YACREADER_SIDEBAR_H #define YACREADER_SIDEBAR_H -#include +#include "themable.h" + +#include +#include +#include +#include +#include +#include +#include class YACReaderFoldersView; class YACReaderLibraryListWidget; @@ -14,12 +22,16 @@ class YACReaderSideBarSeparator : public QWidget { public: explicit YACReaderSideBarSeparator(QWidget *parent = 0); + void setColor(const QColor &color); protected: void paintEvent(QPaintEvent *event); + +private: + QColor separatorColor; }; -class YACReaderSideBar : public QWidget +class YACReaderSideBar : public QWidget, protected Themable { Q_OBJECT public: @@ -40,8 +52,11 @@ public slots: protected: void paintEvent(QPaintEvent *); void closeEvent(QCloseEvent *event); + void applyTheme(const Theme &theme) override; + QSettings *settings; QSplitter *splitter; + QList separators; }; #endif // YACREADER_SIDEBAR_H diff --git a/custom_widgets/yacreader_social_dialog.cpp b/custom_widgets/yacreader_social_dialog.cpp index a42abaa7d..8c0edf054 100644 --- a/custom_widgets/yacreader_social_dialog.cpp +++ b/custom_widgets/yacreader_social_dialog.cpp @@ -1,16 +1,16 @@ #include "yacreader_social_dialog.h" -#include +#include "comic_db.h" + +#include #include -#include -#include #include #include -#include #include -#include - -#include "comic_db.h" +#include +#include +#include +#include YACReaderSocialDialog::YACReaderSocialDialog(QWidget *parent) : QWidget(parent) diff --git a/custom_widgets/yacreader_spin_slider_widget.cpp b/custom_widgets/yacreader_spin_slider_widget.cpp index 708dfd01f..092fc0e59 100644 --- a/custom_widgets/yacreader_spin_slider_widget.cpp +++ b/custom_widgets/yacreader_spin_slider_widget.cpp @@ -2,8 +2,8 @@ #include #include -#include #include +#include YACReaderSpinSliderWidget::YACReaderSpinSliderWidget(QWidget *parent, bool strechableSlider) : QWidget(parent), tracking(true) diff --git a/custom_widgets/yacreader_table_view.cpp b/custom_widgets/yacreader_table_view.cpp index 7e291e89d..9d3b1bffd 100644 --- a/custom_widgets/yacreader_table_view.cpp +++ b/custom_widgets/yacreader_table_view.cpp @@ -1,67 +1,35 @@ #include "yacreader_table_view.h" -#include "yacreader_global.h" +#include "QsLog.h" +#include "comic_item.h" +#include "comic_model.h" #include "yacreader_global_gui.h" -#include -#include -#include -#include -#include -#include #include #include -#include - -#include "QsLog.h" - -#include "comic_item.h" -#include "comic_model.h" +#include +#include +#include +#include +#include YACReaderTableView::YACReaderTableView(QWidget *parent) - : QTableView(parent), showDelete(false), editing(false), myeditor(0) + : QTableView(parent), editing(false), myeditor(0) { setAlternatingRowColors(true); verticalHeader()->setAlternatingRowColors(true); - setStyleSheet("QTableView {alternate-background-color: #F2F2F2;background-color: #FAFAFA; outline: 0px;}" // border: 1px solid #999999; border-right:none; border-bottom:none;}" - "QTableCornerButton::section {background-color:#F5F5F5; border:none; border-bottom:1px solid #B8BDC4; border-right:1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #D1D1D1, stop: 1 #B8BDC4);}" - "QTableView::item {outline: 0px; border-bottom: 1px solid #DFDFDF;border-top: 1px solid #FEFEFE; padding-bottom:1px; color:#252626;}" - "QTableView {border-top:1px solid #B8B8B8;border-bottom:none;border-left:1px solid #B8B8B8;border-right:none;}" -#ifdef Y_MAC_UI - "QTableView {border-top:1px solid #B8B8B8;border-bottom:none;border-left:none;border-right:none;}" - "QTableView::item:selected {outline: 0px; border-bottom: 1px solid #3875D7;border-top: 1px solid #3875D7; padding-bottom:1px; background-color: #3875D7; color: #FFFFFF; }" - -#else - "QTableView::item:selected {outline: 0px; border-bottom: 1px solid #D4D4D4;border-top: 1px solid #D4D4D4; padding-bottom:1px; background-color: #D4D4D4; }" -#endif - "QHeaderView::section:horizontal {background-color:#F5F5F5; border-bottom:1px solid #B8BDC4; border-right:1px solid qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #D1D1D1, stop: 1 #B8BDC4); border-left:none; border-top:none; padding:4px; color:#313232;}" - "QHeaderView::section:vertical {border-bottom: 1px solid #DFDFDF;border-top: 1px solid #FEFEFE;}" - //"QTableView::item:hover {border-bottom: 1px solid #A3A3A3;border-top: 1px solid #A3A3A3; padding-bottom:1px; background-color: #A3A3A3; color: #FFFFFF; }" - ""); - // comicView->setItemDelegate(new YACReaderComicViewDelegate()); + setContextMenuPolicy(Qt::ActionsContextMenu); setShowGrid(false); -#if QT_VERSION >= 0x050000 verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); -#else - verticalHeader()->setResizeMode(QHeaderView::Fixed); -#endif // comicView->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); horizontalHeader()->setStretchLastSection(true); -#if QT_VERSION >= 0x050000 horizontalHeader()->setSectionsClickable(false); -#else - horizontalHeader()->setClickable(false); -#endif // comicView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); verticalHeader()->setDefaultSectionSize(24); -#if QT_VERSION >= 0x050000 verticalHeader()->setSectionsClickable(false); // TODO comportamiento anómalo -#else - verticalHeader()->setClickable(false); // TODO comportamiento anómalo -#endif setCornerButtonEnabled(false); @@ -72,16 +40,19 @@ YACReaderTableView::YACReaderTableView(QWidget *parent) setEditTriggers(QAbstractItemView::NoEditTriggers); setMouseTracking(true); - /*deletingProgress = new YACReaderDeletingProgress(this); - - showDeletingProgressAnimation = new QPropertyAnimation(deletingProgress,"pos"); - showDeletingProgressAnimation->setDuration(150);*/ // drag: if the default drag is enabled there is no way for setting a custom image // TODO report bug/suggestion // setDragEnabled(true); // setDragDropMode(QAbstractItemView::DragDrop); setAcceptDrops(true); + + initTheme(this); +} + +void YACReaderTableView::applyTheme(const Theme &theme) +{ + setStyleSheet(theme.comicsViewTable.tableViewQSS); } void YACReaderTableView::mouseMoveEvent(QMouseEvent *event) @@ -204,36 +175,8 @@ void YACReaderTableView::commitData(QWidget *editor) emit comicRated(((StarEditor *)editor)->starRating().starCount(), currentIndexEditing); } -void YACReaderTableView::showDeleteProgress() -{ - /*showDelete = true; - - showDeletingProgressAnimation->setStartValue(deletingProgress->pos()); - showDeletingProgressAnimation->setEndValue(QPoint((width()-deletingProgress->width())/2 ,1)); - showDeletingProgressAnimation->start();*/ -} - -void YACReaderTableView::hideDeleteProgress() -{ - /*showDelete = false; - - if(showDeletingProgressAnimation->state()==QPropertyAnimation::Running) - showDeletingProgressAnimation->stop(); - - showDeletingProgressAnimation->setStartValue(deletingProgress->pos()); - showDeletingProgressAnimation->setEndValue(QPoint((width()-deletingProgress->width())/2 ,-deletingProgress->height())); - showDeletingProgressAnimation->start();*/ -} - void YACReaderTableView::resizeEvent(QResizeEvent *event) { - /*event->size(); - - if(showDelete) - deletingProgress->move((event->size().width()-deletingProgress->width())/2 ,1); - else - deletingProgress->move((event->size().width()-deletingProgress->width())/2 ,-deletingProgress->height());*/ - QTableView::resizeEvent(event); } @@ -247,15 +190,23 @@ void YACReaderRatingDelegate::paint(QPainter *painter, const QStyleOptionViewIte StarRating starRating(rating); + // Get colors from parent table view + QColor ratingColor(0xE9BE0F); + QColor ratingSelectedColor(Qt::white); + if (auto tableView = qobject_cast(parent())) { + ratingColor = tableView->starRatingColor(); + ratingSelectedColor = tableView->starRatingSelectedColor(); + } + QStyledItemDelegate::paint(painter, option, index); if (!(option.state & QStyle::State_Editing)) { if (option.state & QStyle::State_Selected) starRating.paintSelected(painter, option.rect, option.palette, - StarRating::ReadOnly); + StarRating::ReadOnly, ratingSelectedColor); else starRating.paint(painter, option.rect, option.palette, - StarRating::ReadOnly); + StarRating::ReadOnly, ratingColor); } } @@ -344,6 +295,12 @@ QSize StarRating::sizeHint() const void StarRating::paint(QPainter *painter, const QRect &rect, const QPalette &palette, EditMode mode) const +{ + paint(painter, rect, palette, mode, QColor("#e9be0f")); +} + +void StarRating::paint(QPainter *painter, const QRect &rect, + const QPalette &palette, EditMode mode, QColor color) const { Q_UNUSED(palette) painter->save(); @@ -351,12 +308,8 @@ void StarRating::paint(QPainter *painter, const QRect &rect, painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(Qt::NoPen); - // if (mode == Editable) { - // painter->setBrush(palette.highlight()); - // } else { - QBrush brush(QColor("#e9be0f")); + QBrush brush(color); painter->setBrush(brush); - //} int yOffset = (rect.height() - PaintingScaleFactor) / 2; painter->translate(rect.x(), rect.y() + yOffset); @@ -366,7 +319,7 @@ void StarRating::paint(QPainter *painter, const QRect &rect, if (i < myStarCount) { painter->drawPolygon(starPolygon, Qt::WindingFill); } else if (mode == Editable) { - painter->drawEllipse(QPointF(0.5, 0.5), 0.08, 0.08); //(diamondPolygon, Qt::WindingFill); + painter->drawEllipse(QPointF(0.5, 0.5), 0.08, 0.08); } painter->translate(1.0, 0.0); } @@ -454,7 +407,7 @@ void StarEditor::leaveEvent(QEvent *event) void StarEditor::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { - int star = starAtPosition(event->x()); + int star = starAtPosition(event->position().x()); if (star != myStarRating.starCount() && star != -1) { myStarRating.setStarCount(star); diff --git a/custom_widgets/yacreader_table_view.h b/custom_widgets/yacreader_table_view.h index 183797c7c..88d20b313 100644 --- a/custom_widgets/yacreader_table_view.h +++ b/custom_widgets/yacreader_table_view.h @@ -1,24 +1,27 @@ #ifndef YACREADER_TABLE_VIEW_H #define YACREADER_TABLE_VIEW_H -#include +#include "themable.h" + #include +#include -class YACReaderDeletingProgress; class QResizeEvent; -class QPropertyAnimation; -class YACReaderTableView : public QTableView +class YACReaderTableView : public QTableView, protected Themable { Q_OBJECT public: explicit YACReaderTableView(QWidget *parent = 0); + QColor starRatingColor() const { return theme.comicsViewTable.starRatingColor; } + QColor starRatingSelectedColor() const { return theme.comicsViewTable.starRatingSelectedColor; } + +protected: + void applyTheme(const Theme &theme) override; signals: void comicRated(int, QModelIndex); public slots: - void showDeleteProgress(); - void hideDeleteProgress(); void closeRatingEditor(); protected slots: @@ -26,10 +29,6 @@ protected slots: virtual void commitData(QWidget *editor); private: - YACReaderDeletingProgress *deletingProgress; - bool showDelete; - QPropertyAnimation *showDeletingProgressAnimation; - void resizeEvent(QResizeEvent *event); void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); @@ -84,6 +83,8 @@ class StarRating void paint(QPainter *painter, const QRect &rect, const QPalette &palette, EditMode mode) const; + void paint(QPainter *painter, const QRect &rect, + const QPalette &palette, EditMode mode, QColor color) const; void paintSelected(QPainter *painter, const QRect &rect, const QPalette &palette, EditMode mode, QColor color) const; void paintSelected(QPainter *painter, const QRect &rect, diff --git a/custom_widgets/yacreader_titled_toolbar.cpp b/custom_widgets/yacreader_titled_toolbar.cpp index 51a955d5f..ab8e04366 100644 --- a/custom_widgets/yacreader_titled_toolbar.cpp +++ b/custom_widgets/yacreader_titled_toolbar.cpp @@ -1,6 +1,5 @@ #include "yacreader_titled_toolbar.h" -#include "yacreader_global.h" #include "yacreader_busy_widget.h" #include @@ -43,9 +42,7 @@ void DropShadowLabel::paintEvent(QPaintEvent *event) QPainter painter(this); painter.setFont(font()); -#ifndef Y_MAC_UI drawTextEffect(&painter, QPoint(contentsMargins().left(), 1)); -#endif drawText(&painter, QPoint(contentsMargins().left(), 0)); } @@ -73,23 +70,10 @@ YACReaderTitledToolBar::YACReaderTitledToolBar(const QString &title, QWidget *pa busyIndicator = new BusyIndicator(this, 12); connect(busyIndicator, &BusyIndicator::clicked, this, &YACReaderTitledToolBar::cancelOperationRequested); busyIndicator->setIndicatorStyle(BusyIndicator::StyleArc); -#ifdef Y_MAC_UI - busyIndicator->setColor(QColor("#808080")); -#else - busyIndicator->setColor(Qt::white); -#endif busyIndicator->setHidden(true); nameLabel->setText(title); -#ifdef Y_MAC_UI QString nameLabelStyleSheet = "QLabel {padding:0 0 0 10px; margin:0px; font-size:11px; font-weight:bold;}"; - nameLabel->setColor(QColor("#808080")); - // nameLabel->setDropShadowColor(QColor("#F9FAFB")); -#else - QString nameLabelStyleSheet = "QLabel {padding:0 0 0 10px; margin:0px; font-size:11px; font-weight:bold;}"; - nameLabel->setColor(QColor("#BDBFBF")); - nameLabel->setDropShadowColor(QColor("#000000")); -#endif nameLabel->setStyleSheet(nameLabelStyleSheet); mainLayout->addWidget(nameLabel); @@ -101,32 +85,21 @@ YACReaderTitledToolBar::YACReaderTitledToolBar(const QString &title, QWidget *pa setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); setMinimumHeight(25); + + initTheme(this); } void YACReaderTitledToolBar::addAction(QAction *action) { QHBoxLayout *mainLayout = dynamic_cast(layout()); -// fix for QToolButton and retina support in OSX -#ifdef Q_OS_MACOS // TODO_Y_MAC_UI - QPushButton *pb = new QPushButton(this); - pb->setCursor(QCursor(Qt::ArrowCursor)); - pb->setIcon(action->icon()); - pb->addAction(action); - - connect(pb, &QPushButton::clicked, action, &QAction::triggered); - - mainLayout->addWidget(pb); -#else QToolButton *tb = new QToolButton(this); tb->setCursor(QCursor(Qt::ArrowCursor)); tb->setDefaultAction(action); tb->setIconSize(QSize(16, 16)); tb->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - // tb->setStyleSheet("QToolButton:hover {background-color:#C5C5C5;}"); mainLayout->addWidget(tb); -#endif } void YACReaderTitledToolBar::addSpacing(int spacing) @@ -142,11 +115,8 @@ void YACReaderTitledToolBar::addSepartor() QWidget *w = new QWidget(this); w->setFixedSize(1, 14); -#ifdef Y_MAC_UI - w->setStyleSheet("QWidget {background-color:#AFAFAF;}"); -#else - w->setStyleSheet("QWidget {background-color:#6F6F6F;}"); -#endif + w->setStyleSheet(QString("QWidget {background-color:%1;}").arg(theme.sidebar.separatorColor.name())); + separators.append(w); mainLayout->addSpacing(10); mainLayout->addWidget(w); @@ -162,3 +132,24 @@ void YACReaderTitledToolBar::hideBusyIndicator() { busyIndicator->setHidden(true); } + +void YACReaderTitledToolBar::setTitle(const QString &title) +{ + nameLabel->setText(title); +} + +void YACReaderTitledToolBar::applyTheme(const Theme &theme) +{ + auto sidebarTheme = theme.sidebar; + + nameLabel->setColor(sidebarTheme.titleTextColor); + nameLabel->setDropShadowColor(sidebarTheme.titleDropShadowColor); + nameLabel->update(); + + busyIndicator->setColor(sidebarTheme.busyIndicatorColor); + + QString qss = QString("QWidget {background-color:%1;}").arg(sidebarTheme.separatorColor.name()); + for (auto separator : separators) { + separator->setStyleSheet(qss); + } +} diff --git a/custom_widgets/yacreader_titled_toolbar.h b/custom_widgets/yacreader_titled_toolbar.h index de1386aaa..2ab45f5fe 100644 --- a/custom_widgets/yacreader_titled_toolbar.h +++ b/custom_widgets/yacreader_titled_toolbar.h @@ -1,11 +1,13 @@ #ifndef YACREADER_TITLED_TOOLBAR_H #define YACREADER_TITLED_TOOLBAR_H -#include +#include "themable.h" + #include #include #include #include +#include class QIcon; class BusyIndicator; @@ -27,7 +29,7 @@ class DropShadowLabel : public QLabel void drawTextEffect(QPainter *painter, QPoint offset); }; -class YACReaderTitledToolBar : public QWidget +class YACReaderTitledToolBar : public QWidget, protected Themable { Q_OBJECT public: @@ -42,10 +44,15 @@ public slots: void addSepartor(); void showBusyIndicator(); void hideBusyIndicator(); + void setTitle(const QString &title); + +protected: + void applyTheme(const Theme &theme) override; private: DropShadowLabel *nameLabel; BusyIndicator *busyIndicator; + QList separators; }; #endif // YACREADER_TITLED_TOOLBAR_H diff --git a/custom_widgets/yacreader_tool_bar_stretch.h b/custom_widgets/yacreader_tool_bar_stretch.h index a200575a8..8ddd47723 100644 --- a/custom_widgets/yacreader_tool_bar_stretch.h +++ b/custom_widgets/yacreader_tool_bar_stretch.h @@ -1,8 +1,8 @@ #ifndef YACREADER_TOOL_BAR_STRETCH_H #define YACREADER_TOOL_BAR_STRETCH_H -#include #include +#include class YACReaderToolBarStretch : public QWidget { diff --git a/custom_widgets/yacreader_treeview.cpp b/custom_widgets/yacreader_treeview.cpp index 2a9799f29..63c3e33da 100644 --- a/custom_widgets/yacreader_treeview.cpp +++ b/custom_widgets/yacreader_treeview.cpp @@ -1,6 +1,6 @@ #include "yacreader_treeview.h" -#include "yacreader_global.h" +#include YACReaderTreeView::YACReaderTreeView(QWidget *parent) : QTreeView(parent), clicking(false) @@ -9,10 +9,6 @@ YACReaderTreeView::YACReaderTreeView(QWidget *parent) setDragDropMode(QAbstractItemView::DropOnly); setItemsExpandable(true); - // setDragEnabled(true); - /*viewport()->setAcceptDrops(true); - setDropIndicatorShown(true);*/ - setContextMenuPolicy(Qt::CustomContextMenu); header()->hide(); @@ -20,38 +16,12 @@ YACReaderTreeView::YACReaderTreeView(QWidget *parent) setSelectionBehavior(QAbstractItemView::SelectRows); setAttribute(Qt::WA_MacShowFocusRect, false); -#ifdef Y_MAC_UI - - setStyleSheet("QTreeView {background-color:transparent; border: none;}" - "QTreeView::item:selected {background-color:#91c4f4; border-top: 1px solid #91c4f4; border-left:none;border-right:none;border-bottom:1px solid #91c4f4;}" - "QTreeView::branch:selected {background-color:#91c4f4; border-top: 1px solid #91c4f4; border-left:none;border-right:none;border-bottom:1px solid #91c4f4;}" - "QTreeView::branch:open:selected:has-children {image: url(':/images/sidebar/expanded_branch_osx.png');}" - "QTreeView::branch:closed:selected:has-children {image: url(':/images/sidebar/collapsed_branch_osx.png');}" - - ); - -#else - setStyleSheet("QTreeView {background-color:transparent; border: none; color:#DDDFDF; outline:0; show-decoration-selected: 0;}" - "QTreeView::item:selected {background-color: #2E2E2E; color:white; font:bold;}" - "QTreeView::item:hover {background-color:#2E2E2E; color:white; font:bold;}" - "QTreeView::branch:selected {background-color:#2E2E2E;}" - - "QScrollBar:vertical { border: none; background: #404040; width: 7px; margin: 0 3px 0 0; }" - "QScrollBar::handle:vertical { background: #DDDDDD; width: 7px; min-height: 20px; }" - "QScrollBar::add-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: bottom; subcontrol-origin: margin; margin: 0 3px 0 0;}" - - "QScrollBar::sub-line:vertical { border: none; background: #404040; height: 10px; subcontrol-position: top; subcontrol-origin: margin; margin: 0 3px 0 0;}" - "QScrollBar::up-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-up.png') center top no-repeat;}" - "QScrollBar::down-arrow:vertical {border:none;width: 9px;height: 6px;background: url(':/images/folders_view/line-down.png') center top no-repeat;}" - - "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none; }" - - "QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings {border-image: none;image: url(':/images/sidebar/branch-closed.svg');}" - "QTreeView::branch:has-children:selected:!has-siblings:closed,QTreeView::branch:closed:selected:has-children:has-siblings {border-image: none;image: url(':/images/sidebar/collapsed_branch_selected.png');}" + initTheme(this); +} - "QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings {border-image: none;image: url(':/images/sidebar/branch-open.svg');}" - "QTreeView::branch:open:has-children:selected:!has-siblings,QTreeView::branch:open:has-children:selected:has-siblings {border-image: none;image: url(':/images/sidebar/expanded_branch_selected.png');}"); -#endif +void YACReaderTreeView::applyTheme(const Theme &theme) +{ + setStyleSheet(theme.navigationTree.navigationTreeQSS); } void YACReaderTreeView::mousePressEvent(QMouseEvent *event) @@ -96,9 +66,10 @@ void YACReaderTreeView::dragMoveEvent(QDragMoveEvent *event) QTreeView::dragMoveEvent(event); // fix for drop auto expand - QModelIndex underMouse = indexAt(event->pos()); + auto point = event->position().toPoint(); + QModelIndex underMouse = indexAt(point); if (underMouse.isValid()) { - expandPos = event->pos(); + expandPos = point; connect(&expandTimer, &QTimer::timeout, this, &YACReaderTreeView::expandCurrent); expandTimer.setSingleShot(true); expandTimer.start(500); diff --git a/custom_widgets/yacreader_treeview.h b/custom_widgets/yacreader_treeview.h index 380af038e..eb869cbd9 100644 --- a/custom_widgets/yacreader_treeview.h +++ b/custom_widgets/yacreader_treeview.h @@ -1,13 +1,24 @@ #ifndef YACREADER_TREEVIEW_H #define YACREADER_TREEVIEW_H -#include +#include "themable.h" -class YACReaderTreeView : public QTreeView +#include +#include +#include +#include +#include +#include +#include +#include + +class YACReaderTreeView : public QTreeView, protected Themable { Q_OBJECT public: explicit YACReaderTreeView(QWidget *parent = 0); + +private: void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; signals: @@ -24,6 +35,7 @@ protected slots: void dropEvent(QDropEvent *event) override; void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; + void applyTheme(const Theme &theme) override; // fix for drop auto expand QTimer expandTimer; diff --git a/dependencies/pdf_backend.pri b/dependencies/pdf_backend.pri deleted file mode 100644 index e008dc955..000000000 --- a/dependencies/pdf_backend.pri +++ /dev/null @@ -1,89 +0,0 @@ -CONFIG(no_pdf) { - DEFINES += "NO_PDF" -} - -CONFIG(pdfium) { - message(Using pdfium.) - DEFINES += "USE_PDFIUM" - SOURCES += ../common/pdf_comic.cpp - msvc { - INCLUDEPATH += $$PWD/pdfium/win/public - contains(QMAKE_TARGET.arch, x86_64): { - LIBS += -L$$PWD/pdfium/win/x64 -lpdfium - } else:contains(QMAKE_TARGET.arch, arm64): { - LIBS += -L$$PWD/pdfium/win/arm64 -lpdfium - } else { - LIBS += -L$$PWD/pdfium/win/x86 -lpdfium - } - } - unix|mingw { - macx { - LIBS += -L$$PWD/pdfium/macx/bin -lpdfium - INCLUDEPATH += $$PWD/pdfium/macx/include - } - else:!contains(QT_CONFIG, no-pkg-config):packagesExist(libpdfium) { - message(Using system provided installation of libpdfium found by pkg-config.) - CONFIG += link_pkgconfig - PKGCONFIG += libpdfium - } else:exists(/usr/include/pdfium) { - message(Using libpdfium found at /usr/lib/pdfium) - INCLUDEPATH += /usr/include/pdfium - LIBS += -lpdfium - } else { - error(Could not find libpdfium.) - } - } -} - -CONFIG(pdfkit) { - !macx { - error (Pdfkit is macOS only) - } else { - DEFINES += "USE_PDFKIT" - OBJECTIVE_SOURCES += ../common/pdf_comic.mm - } -} - -CONFIG(poppler) { - msvc { - contains(QMAKE_TARGET.arch, x86_64): { - error ("We currently don't ship precompiled poppler libraries for 64 bit builds on Windows") - } - INCLUDEPATH += $$PWD/poppler/include/qt5 - LIBS += -L$$PWD/poppler/lib -lpoppler-qt5 - # Add extra paths for dll dependencies so the executables don't crash when launching - # from QtCreator - LIBS += -L$$PWD/poppler/bin - LIBS += -L$$PWD/poppler/dependencies/bin - } - if(unix|mingw):!macx { - greaterThan (QT_MAJOR_VERSION, 5) { - !contains(QT_CONFIG, no-pkg-config):packagesExist(poppler-qt6) { - message("Using system provided installation of poppler-qt6 found by pkg-config.") - CONFIG += link_pkgconfig - PKGCONFIG += poppler-qt6 - } else:!macx:exists(/usr/include/poppler/qt6) { - message("Using system provided installation of poppler-qt6.") - INCLUDEPATH += /usr/include/poppler/qt6 - LIBS += -lpoppler-qt6 - } else { - error("Could not find poppler-qt6") - } - } else { - !contains(QT_CONFIG, no-pkg-config):packagesExist(poppler-qt5) { - message("Using system provided installation of poppler-qt5 found by pkg-config.") - CONFIG += link_pkgconfig - PKGCONFIG += poppler-qt5 - } else:!macx:exists(/usr/include/poppler/qt5) { - message("Using system provided installation of poppler-qt5.") - INCLUDEPATH += /usr/include/poppler/qt5 - LIBS += -lpoppler-qt5 - } else { - error("Could not find poppler-qt5") - } - } - } - unix:macx { - error (Poppler backend is currently not supported on macOS) - } -} diff --git a/docker/Dockerfile b/docker/Dockerfile index 12c5ed4b5..bf87ed6b4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,14 +14,14 @@ RUN \ apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ + cmake \ + ninja-build \ desktop-file-utils \ gcc \ g++ \ git \ qt6-tools-dev \ qt6-base-dev-tools \ - qmake6 \ - qmake6-bin \ qt6-base-dev \ qt6-multimedia-dev \ qt6-tools-dev-tools \ @@ -60,24 +60,23 @@ RUN git clone https://github.com/YACReader/yacreader.git /src/git && \ cd /src/git && \ git checkout $YACR_VERSION -# get 7zip source -RUN cd /src/git/compressed_archive && \ - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O /src/git/compressed_archive/7z2301-src.7z && \ - 7z x /src/git/compressed_archive/7z2301-src.7z -o/src/git/compressed_archive/lib7zip - -# build yacreaderlibraryserver -RUN cd /src/git/YACReaderLibraryServer && \ - qmake6 PREFIX=/app CONFIG+="7zip server_standalone" YACReaderLibraryServer.pro && \ - qmake6 -v && \ - make && \ - make install +# build yacreaderlibraryserver (7zip source is auto-downloaded by CMake FetchContent) +RUN cd /src/git && \ + cmake -B build -G Ninja \ + -DCMAKE_INSTALL_PREFIX=/app \ + -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=poppler \ + -DBUILD_SERVER_STANDALONE=ON \ + -DCMAKE_BUILD_TYPE=Release && \ + cmake --build build --parallel && \ + cmake --install build # install 7z.so with RAR support RUN echo "Building and installing 7z.so with RAR support..." && \ cd "/src/git/compressed_archive/lib7zip/CPP/7zip/Bundles/Format7zF" && \ make -f makefile.gcc && \ mkdir -p /app/lib/7zip && \ - cp ./_o/7z.so /app/lib/7zip + cp ./_o/7z.so /app/lib/7zip # Stage 2: Runtime stage FROM ghcr.io/linuxserver/baseimage-ubuntu:noble @@ -95,7 +94,7 @@ RUN apt-get update && \ apt-get install -y --no-install-recommends \ libqt6core5compat6 \ libpoppler-qt6-3t64 \ - qt6-image-formats-plugins \ + qt6-image-formats-plugins \ libqt6network6t64 \ libqt6sql6-sqlite && \ apt-get clean && \ diff --git a/docker/Dockerfile.aarch64 b/docker/Dockerfile.aarch64 index faf2c4303..5bb39b361 100644 --- a/docker/Dockerfile.aarch64 +++ b/docker/Dockerfile.aarch64 @@ -14,40 +14,42 @@ RUN \ apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ + cmake \ + ninja-build \ desktop-file-utils \ + gcc \ g++ \ git \ - libglu1-mesa-dev \ - libpoppler-qt5-dev \ - libpoppler-qt5-1 \ - libqt5core5a \ - libqt5gui5 \ - libqt5multimedia5 \ - libqt5network5 \ - libqt5opengl5-dev \ - libqt5qml5 \ - libqt5quickcontrols2-5 \ - libqt5script5 \ - libqt5sql5-sqlite \ - libqt5sql5 \ - libqt5svg5-dev \ + qt6-tools-dev \ + qt6-base-dev-tools \ + qt6-base-dev \ + qt6-multimedia-dev \ + qt6-tools-dev-tools \ + libgl-dev \ + qt6-l10n-tools \ + qt6-declarative-dev \ + libqt6svg6-dev \ + libqt6core5compat6-dev \ + libqt6gui6t64 \ + libqt6multimedia6 \ + libqt6network6t64 \ + libqt6qml6 \ + libqt6quickcontrols2-6 \ + qt6-image-formats-plugins \ + libqt6sql6 \ + libqt6sql6-sqlite \ + libpoppler-qt6-dev \ libsqlite3-dev \ + libbz2-dev \ + libglu1-mesa-dev \ + liblzma-dev \ make \ - 7zip \ - 7zip-rar \ - qtchooser \ - qtbase5-dev-tools \ - qt5-qmake \ - qtbase5-dev \ - qtmultimedia5-dev \ - qt5-image-formats-plugins \ - qtdeclarative5-dev \ - qtquickcontrols2-5-dev \ - qtscript5-dev \ - qttools5-dev-tools \ sqlite3 \ unzip \ - wget && \ + wget \ + 7zip \ + 7zip-rar \ + zlib1g-dev && \ ldconfig # clone YACReader repo @@ -55,16 +57,16 @@ RUN git clone https://github.com/YACReader/yacreader.git /src/git && \ cd /src/git && \ git checkout $YACR_VERSION -# get 7zip source -RUN cd /src/git/compressed_archive && \ - wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O /src/git/compressed_archive/7z2301-src.7z && \ - 7z x /src/git/compressed_archive/7z2301-src.7z -o/src/git/compressed_archive/lib7zip - -# build yacreaderlibraryserver -RUN cd /src/git/YACReaderLibraryServer && \ - qmake PREFIX=/app CONFIG+="7zip server_standalone" YACReaderLibraryServer.pro && \ - make && \ - make install +# build yacreaderlibraryserver (7zip source is auto-downloaded by CMake FetchContent) +RUN cd /src/git && \ + cmake -B build -G Ninja \ + -DCMAKE_INSTALL_PREFIX=/app \ + -DDECOMPRESSION_BACKEND=7zip \ + -DPDF_BACKEND=poppler \ + -DBUILD_SERVER_STANDALONE=ON \ + -DCMAKE_BUILD_TYPE=Release && \ + cmake --build build --parallel && \ + cmake --install build # install 7z.so with RAR support RUN echo "Building and installing 7z.so with RAR support..." && \ @@ -72,7 +74,7 @@ RUN echo "Building and installing 7z.so with RAR support..." && \ make -f makefile.gcc && \ mkdir -p /app/lib/7zip && \ cp ./_o/7z.so /app/lib/7zip - + FROM ghcr.io/linuxserver/baseimage-ubuntu:arm64v8-noble # env variables @@ -82,19 +84,15 @@ LABEL maintainer="luisangelsm" # Copy the built application from the builder stage COPY --from=builder /app /app - + # runtime packages RUN apt-get update && \ apt-get install -y --no-install-recommends \ - libqt5core5a \ - libqt5network5 \ - libqt5script5 \ - libqt5sql5-sqlite \ - libqt5sql5 \ - libqt5svg5 \ - libsqlite3-0 \ - libpoppler-qt5-1 \ - qt5-image-formats-plugins && \ + libqt6core5compat6 \ + libpoppler-qt6-3t64 \ + qt6-image-formats-plugins \ + libqt6network6t64 \ + libqt6sql6-sqlite && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/image_processing/CMakeLists.txt b/image_processing/CMakeLists.txt new file mode 100644 index 000000000..86079aa44 --- /dev/null +++ b/image_processing/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(image_processing STATIC + resize_image.h + resize_image.cpp + lancir.h +) + +target_include_directories(image_processing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(image_processing) + +target_link_libraries(image_processing PRIVATE Qt6::Gui) diff --git a/image_processing/lancir.h b/image_processing/lancir.h new file mode 100644 index 000000000..be2d8314b --- /dev/null +++ b/image_processing/lancir.h @@ -0,0 +1,2383 @@ +/** + * @file lancir.h + * + * @version 3.1 + * + * @brief Self-contained header-only "LANCIR" image resizing algorithm. + * + * This is a self-contained inclusion file for the "LANCIR" image resizer, + * a part of the AVIR library. Features scalar, AVX, SSE2, NEON, and WASM + * SIMD128 optimizations as well as batched resizing technique which provides + * a better CPU cache performance. + * + * AVIR Copyright (c) 2015-2025 Aleksey Vaneev + * + * @mainpage + * + * @section intro_sec Introduction + * + * Description is available at https://github.com/avaneev/avir + * + * @section license License + * + * LICENSE: + * + * Copyright (c) 2015-2025 Aleksey Vaneev + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef AVIR_CLANCIR_INCLUDED +#define AVIR_CLANCIR_INCLUDED + +#include +#include + +#if __cplusplus >= 201103L + +#include + +#else // __cplusplus >= 201103L + +#include + +#endif // __cplusplus >= 201103L + +/** + * @def LANCIR_ALIGN + * @brief Address alignment (granularity) used by resizing functions, + * in bytes. + */ + +/** + * @def LANCIR_NULLPTR + * @brief Macro is defined, if `nullptr` workaround is in use, for pre-C++11 + * compilers. Undefined at the end of file. + */ + +#if defined(__AVX__) + +#include + +#define LANCIR_AVX +#define LANCIR_SSE2 // Some functions use SSE2; AVX has a higher priority. +#define LANCIR_ALIGN 32 + +#elif defined(__aarch64__) || defined(__arm64__) || \ + defined(_M_ARM64) || defined(_M_ARM64EC) + +#if defined(_MSC_VER) +#include + +#if _MSC_VER < 1925 +#define LANCIR_ARM32 // Do not use some newer NEON intrinsics. +#endif // _MSC_VER < 1925 +#else // defined( _MSC_VER ) +#include +#endif // defined( _MSC_VER ) + +#define LANCIR_NEON +#define LANCIR_ALIGN 16 + +#elif defined(__ARM_NEON) || defined(__ARM_NEON__) || defined(_M_ARM) + +#include + +#define LANCIR_ARM32 +#define LANCIR_NEON +#define LANCIR_ALIGN 16 + +#elif defined(__SSE2__) || defined(_M_AMD64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2) + +#if defined(_MSC_VER) +#include +#else // defined( _MSC_VER ) +#include +#endif // defined( _MSC_VER ) + +#define LANCIR_SSE2 +#define LANCIR_ALIGN 16 + +#elif defined(__wasm_simd128__) + +#include + +#define LANCIR_WASM +#define LANCIR_ALIGN 16 + +#else // WASM + +#define LANCIR_ALIGN 4 + +#endif // WASM + +#if defined(LANCIR_SSE2) + +#define lancvec_t __m128 +#define lancvec_const_splat(v) _mm_set1_ps(v) +#define lancvec_load(m) _mm_load_ps(m) +#define lancvec_loadu(m) _mm_loadu_ps(m) +#define lancvec_store(m, v) _mm_store_ps(m, v) +#define lancvec_storeu(m, v) _mm_storeu_ps(m, v) +#define lancvec_add(v1, v2) _mm_add_ps(v1, v2) +#define lancvec_mul(v1, v2) _mm_mul_ps(v1, v2) +#define lancvec_min(v1, v2) _mm_min_ps(v1, v2) +#define lancvec_max(v1, v2) _mm_max_ps(v1, v2) +#define lancvec_madd(va, v1, v2) _mm_add_ps(va, _mm_mul_ps(v1, v2)) +#define lancvec_addhl(vl, vh) _mm_add_ps(vl, _mm_movehl_ps(vh, vh)) +#define lancvec_store32_addhl(m, v) \ + _mm_store_ss(m, _mm_add_ss(v, _mm_shuffle_ps(v, v, 1))) + +#define lancvec_store64_addhl(m, v) \ + _mm_storel_pi((__m64 *)(m), lancvec_addhl(v, v)) + +#elif defined(LANCIR_NEON) + +#define lancvec_t float32x4_t +#define lancvec_const_splat(v) vdupq_n_f32(v) +#define lancvec_load(m) vld1q_f32(m) +#define lancvec_store(m, v) vst1q_f32(m, v) +#define lancvec_add(v1, v2) vaddq_f32(v1, v2) +#define lancvec_mul(v1, v2) vmulq_f32(v1, v2) +#define lancvec_min(v1, v2) vminq_f32(v1, v2) +#define lancvec_max(v1, v2) vmaxq_f32(v1, v2) +#define lancvec_madd(va, v1, v2) vmlaq_f32(va, v1, v2) + +#if defined(LANCIR_ARM32) +#define lancvec_store32_hadd(m, v) \ + { \ + const float32x2_t v2 = vadd_f32(vget_high_f32(v), \ + vget_low_f32(v)); \ + *(m) = vget_lane_f32(v2, 0) + \ + vget_lane_f32(v2, 1); \ + } \ + (void)0 +#else // defined( LANCIR_ARM32 ) +#define lancvec_store32_hadd(m, v) *(m) = vaddvq_f32(v) +#endif // defined( LANCIR_ARM32 ) + +#define lancvec_store64_addhl(m, v) \ + vst1_f32(m, vadd_f32(vget_high_f32(v), vget_low_f32(v))); + +#elif defined(LANCIR_WASM) + +#define lancvec_t v128_t +#define lancvec_const_splat(v) wasm_f32x4_const_splat(v) +#define lancvec_load32_splat(m) wasm_v128_load32_splat(m) +#define lancvec_load(m) wasm_v128_load(m) +#define lancvec_store(m, v) wasm_v128_store(m, v) +#define lancvec_add(v1, v2) wasm_f32x4_add(v1, v2) +#define lancvec_mul(v1, v2) wasm_f32x4_mul(v1, v2) +#define lancvec_min(v1, v2) wasm_f32x4_min(v1, v2) +#define lancvec_max(v1, v2) wasm_f32x4_max(v1, v2) +#define lancvec_madd(va, v1, v2) wasm_f32x4_add(va, \ + wasm_f32x4_mul(v1, v2)) + +#define lancvec_addhl(vl, vh) wasm_f32x4_add(vl, \ + wasm_i32x4_shuffle(vh, vh, 6, 7, 2, 3)) + +#define lancvec_store32_addhl(m, v) \ + *(m) = (wasm_f32x4_extract_lane(v, 0) + \ + wasm_f32x4_extract_lane(v, 1)) + +#define lancvec_store64_addhl(m, v) \ + wasm_v128_store64_lane(m, lancvec_addhl(v, v), 0) + +#endif // defined( LANCIR_WASM ) + +#if LANCIR_ALIGN > 4 + +#if !defined(lancvec_load32_splat) +#define lancvec_load32_splat(m) lancvec_const_splat(*(m)) +#endif // !defined( lancvec_load32_splat ) + +#if !defined(lancvec_loadu) +#define lancvec_loadu(m) lancvec_load(m) +#endif // !defined( lancvec_loadu ) + +#if !defined(lancvec_storeu) +#define lancvec_storeu(m, v) lancvec_store(m, v) +#endif // !defined( lancvec_storeu ) + +#if !defined(lancvec_store32_hadd) +#define lancvec_store32_hadd(m, v) \ + { \ + const lancvec_t v2 = lancvec_addhl(v, v); \ + lancvec_store32_addhl(m, v2); \ + } \ + (void)0 +#endif // !defined( lancvec_store32_hadd ) + +#endif // LANCIR_ALIGN > 4 + +namespace avir { + +using std ::ceil; +using std ::cos; +using std ::fabs; +using std ::floor; +using std ::memcpy; +using std ::memset; +using std ::sin; +using std ::size_t; + +#if __cplusplus >= 201103L + +using std ::intptr_t; +using std ::uintptr_t; + +#else // __cplusplus >= 201103L + +// Workaround for pre-C++11 compilers. `nullptr` is a keyword, and not a +// macro, but check if such workaround is already in place. + +#if !defined(nullptr) +#define nullptr NULL +#define LANCIR_NULLPTR +#endif // !defined( nullptr ) + +#endif // __cplusplus >= 201103L + +/** + * @brief LANCIR resizing parameters class. + * + * An object of this class, which can be allocated on stack, can be used to + * pass non-default parameters to the resizing algorithm. See the constructor + * for the default values. + */ + +class CLancIRParams +{ +public: + int SrcSSize; ///< Physical size of the source scanline, in elements (not + ///< bytes). If this value is below 1, `SrcWidth * ElCount` will be + ///< used. + int NewSSize; ///< Physical size of the destination scanline, in elements + ///< (not bytes). If this value is below 1, `NewWidth * ElCount` will + ///< be used. + double kx; ///< Resizing step - horizontal (one output pixel corresponds + ///< to `k` input pixels). A downsizing factor if greater than 1.0; + ///< upsizing factor if below or equal to 1.0. Multiply by -1 if you + ///< would like to bypass `ox` and `oy` adjustment which is done by + ///< default to produce a centered image. If this step value equals 0, + ///< the step value will be chosen automatically. + double ky; ///< Resizing step - vertical. Same as `kx`. + double ox; ///< Start X pixel offset within the source image, can be + ///< negative. A positive offset moves the image to the left. + double oy; ///< Start Y pixel offset within the source image, can be + ///< negative. A positive offset moves the image to the top. + double la; ///< Lanczos window function's `a` parameter, greater or equal + ///< to 2.0. + + /** + * @brief Default constructor, with optional arguments that correspond to + * class variables. + * + * @param aSrcSSize Physical size of the source scanline. + * @param aNewSSize Physical size of the destination scanline. + * @param akx Resizing step - horizontal. + * @param aky Resizing step - vertical. + * @param aox Start X pixel offset. + * @param aoy Start Y pixel offset. + */ + + CLancIRParams(const int aSrcSSize = 0, const int aNewSSize = 0, + const double akx = 0.0, const double aky = 0.0, + const double aox = 0.0, const double aoy = 0.0) + : SrcSSize(aSrcSSize), NewSSize(aNewSSize), kx(akx), ky(aky), ox(aox), oy(aoy), la(3.0) + { + } +}; + +/** + * @brief LANCIR image resizer class. + * + * The object of this class can be used to resize 1-4 channel images to any + * required size. Resizing is performed by utilizing Lanczos filters, with + * 8-bit precision. This class offers a kind of "optimal" Lanczos resampling + * implementation. + * + * Object of this class can be allocated on stack. + * + * Note that object of this class does not free temporary buffers and + * variables after the resizeImage() function call (until object's + * destruction): these buffers are reused (or reallocated) on subsequent + * calls, thus making batch resizing of images faster. This means resizing is + * not thread-safe: a separate CLancIR object should be created for each + * thread. + */ + +class CLancIR +{ +private: + CLancIR(const CLancIR &) + { + // Unsupported. + } + + CLancIR &operator=(const CLancIR &) + { + // Unsupported. + return (*this); + } + +public: + CLancIR() + : FltBuf0(nullptr), FltBuf0Len(0), spv0(nullptr), spv0len(0), spv(nullptr) + { + } + + ~CLancIR() + { + delete[] FltBuf0; + delete[] spv0; + } + + /** + * @brief Function resizes an image. + * + * Performs input-to-output type conversion, if necessary. + * + * @param[in] SrcBuf Source image buffer. + * @param SrcWidth Source image width, in pixels. + * @param SrcHeight Source image height, in pixels. + * @param[out] NewBuf Buffer to accept the resized image. Cannot be equal + * to `SrcBuf`. + * @param NewWidth New image width, in pixels. + * @param NewHeight New image height, in pixels. + * @param ElCount The number of elements (channels) used to store each + * source and destination pixel (1-4). + * @param aParams Custom resizing parameters. Can be `nullptr`, for + * default values. + * @tparam Tin Input buffer's element type. Can be `uint8_t` (`0..255` + * value range), `uint16_t` (`0..65535` value range), `float` (`0..1` + * value range), `double` (`0..1` value range). `uint32_t` type is treated + * as `uint16_t`. Signed integer types and larger integer types are not + * supported. + * @tparam Tout Output buffer's element type, treated like `Tin`. If `Tin` + * and `Tout` types do not match, an output value scaling will be applied. + * Floating-point output will not be clamped/clipped/saturated; integer + * output is always rounded and clamped. + * @return The number of available output scanlines. Equals to + * `NewHeight`, or 0 on function parameters error. + */ + + template + int resizeImage(const Tin *const SrcBuf, const int SrcWidth, + const int SrcHeight, Tout *const NewBuf, const int NewWidth, + const int NewHeight, const int ElCount, + const CLancIRParams *const aParams = nullptr) + { + if ((SrcWidth < 0) | (SrcHeight < 0) | + (NewWidth <= 0) | (NewHeight <= 0) | + (SrcBuf == nullptr) | (NewBuf == nullptr) | + ((const void *)SrcBuf == (const void *)NewBuf)) { + return (0); + } + + static const CLancIRParams DefParams; + const CLancIRParams &Params = (aParams != nullptr ? *aParams : DefParams); + + if (Params.la < 2.0) { + return (0); + } + + const int OutSLen = NewWidth * ElCount; + const size_t NewScanlineSize = (size_t)(Params.NewSSize < 1 ? OutSLen : Params.NewSSize); + + if ((SrcWidth == 0) | (SrcHeight == 0)) { + Tout *op = NewBuf; + int i; + + for (i = 0; i < NewHeight; i++) { + memset(op, 0, (size_t)OutSLen * sizeof(Tout)); + op += NewScanlineSize; + } + + return (NewHeight); + } + + const size_t SrcScanlineSize = (size_t)(Params.SrcSSize < 1 ? SrcWidth * ElCount : Params.SrcSSize); + + double ox = Params.ox; + double oy = Params.oy; + double kx; + double ky; + + if (Params.kx >= 0.0) { + kx = (Params.kx == 0.0 ? (double)SrcWidth / NewWidth : Params.kx); + + ox += (kx - 1.0) * 0.5; + } else { + kx = -Params.kx; + } + + if (Params.ky >= 0.0) { + ky = (Params.ky == 0.0 ? (double)SrcHeight / NewHeight : Params.ky); + + oy += (ky - 1.0) * 0.5; + } else { + ky = -Params.ky; + } + + if (rfv.update(Params.la, ky, ElCount)) { + rsv.reset(); + rsh.reset(); + } + + CResizeFilters *rfh; // Pointer to resizing filters for horizontal + // resizing, may equal to `rfv` if the same stepping is in use. + + if (kx == ky) { + rfh = &rfv; + } else { + rfh = &rfh0; + + if (rfh0.update(Params.la, kx, ElCount)) { + rsh.reset(); + } + } + + rsv.update(SrcHeight, NewHeight, oy, rfv, spv); + rsh.update(SrcWidth, NewWidth, ox, *rfh); + + // Calculate vertical progressive resizing's batch size. Progressive + // batching is used to try to keep addressing within the cache + // capacity. This technique definitely works well for single-threaded + // resizing on most CPUs, but may not provide an additional benefit + // for multi-threaded resizing, or in a system-wide high-load + // situations. + + const size_t FltWidthE = (size_t)((rsh.padl + SrcWidth + + rsh.padr) * + ElCount); + + const double CacheSize = 5500000.0; // Tuned for various CPUs. + const double OpSize = (double)SrcScanlineSize * SrcHeight * + sizeof(Tin) + + (double)FltWidthE * NewHeight * sizeof(float); + + int BatchSize = (int)(NewHeight * CacheSize / (OpSize + 1.0)); + + if (BatchSize < 8) { + BatchSize = 8; + } + + if (BatchSize > NewHeight) { + BatchSize = NewHeight; + } + + // Allocate/resize intermediate buffers. + + const int svs = (rsv.padl + SrcHeight + rsv.padr) * ElCount; + float *const pspv0 = spv0; + reallocBuf(spv0, spv, spv0len, (svs > OutSLen ? svs : OutSLen)); + reallocBuf(FltBuf0, FltBuf, FltBuf0Len, + FltWidthE * (size_t)BatchSize); + + if (spv0 != pspv0) { + rsv.updateSPO(rfv, spv); + } + + // Prepare output-related constants. + + static const bool IsInFloat = ((Tin)0.25f != 0); + static const bool IsOutFloat = ((Tout)0.25f != 0); + static const bool IsUnityMul = (IsInFloat && IsOutFloat) || + (IsInFloat == IsOutFloat && sizeof(Tin) == sizeof(Tout)); + + const float Clamp = (sizeof(Tout) == 1 ? 255.0f : 65535.0f); + const float OutMul = (IsOutFloat ? 1.0f : Clamp) / + (IsInFloat ? 1.0f : (sizeof(Tin) == 1 ? 255.0f : 65535.0f)); + + // Perform batched resizing. + + const CResizePos *rpv = rsv.pos; + Tout *opn = NewBuf; + int bl = NewHeight; + + while (bl > 0) { + const int bc = (bl > BatchSize ? BatchSize : bl); + + int kl = rfv.KernelLen; + const Tin *ip = SrcBuf; + float *op = FltBuf + rsh.padl * ElCount; + + const int so = (int)rpv[0].so; + float *const sp = spv + so * ElCount; + + int cc = (int)rpv[bc - 1].so - so + kl; // Pixel copy count. + int rl = 0; // Leftmost pixel's replication count. + int rr = 0; // Rightmost pixel's replication count. + + const int socc = so + cc; + const int spe = rsv.padl + SrcHeight; + + // Calculate scanline copying and padding parameters, depending on + // the batch's size and its vertical offset. + + if (so < rsv.padl) { + if (socc <= rsv.padl) { + rl = cc; + cc = 0; + } else { + if (socc > spe) { + rr = socc - spe; + cc -= rr; + } + + rl = rsv.padl - so; + cc -= rl; + } + } else { + if (so >= spe) { + rr = cc; + cc = 0; + ip += (size_t)SrcHeight * SrcScanlineSize; + } else { + if (socc > spe) { + rr = socc - spe; + cc -= rr; + } + + ip += (size_t)(so - rsv.padl) * SrcScanlineSize; + } + } + + // Batched vertical resizing. + + int i; + + if (ElCount == 1) { + for (i = 0; i < SrcWidth; i++) { + copyScanline1v(ip, SrcScanlineSize, sp, cc, rl, rr); + resize1(nullptr, op, FltWidthE, rpv, kl, bc); + ip += 1; + op += 1; + } + } else if (ElCount == 2) { + for (i = 0; i < SrcWidth; i++) { + copyScanline2v(ip, SrcScanlineSize, sp, cc, rl, rr); + resize2(nullptr, op, FltWidthE, rpv, kl, bc); + ip += 2; + op += 2; + } + } else if (ElCount == 3) { + for (i = 0; i < SrcWidth; i++) { + copyScanline3v(ip, SrcScanlineSize, sp, cc, rl, rr); + resize3(nullptr, op, FltWidthE, rpv, kl, bc); + ip += 3; + op += 3; + } + } else // ElCount == 4 + { + for (i = 0; i < SrcWidth; i++) { + copyScanline4v(ip, SrcScanlineSize, sp, cc, rl, rr); + resize4(nullptr, op, FltWidthE, rpv, kl, bc); + ip += 4; + op += 4; + } + } + + // Perform horizontal resizing batch, and produce final output. + + float *ipf = FltBuf; + kl = rfh->KernelLen; + + if (ElCount == 1) { + for (i = 0; i < bc; i++) { + padScanline1h(ipf, rsh, SrcWidth); + resize1(ipf, spv, 1, rsh.pos, kl, NewWidth); + outputScanline(spv, opn, + OutSLen, Clamp, OutMul); + + ipf += FltWidthE; + opn += NewScanlineSize; + } + } else if (ElCount == 2) { + for (i = 0; i < bc; i++) { + padScanline2h(ipf, rsh, SrcWidth); + resize2(ipf, spv, 2, rsh.pos, kl, NewWidth); + outputScanline(spv, opn, + OutSLen, Clamp, OutMul); + + ipf += FltWidthE; + opn += NewScanlineSize; + } + } else if (ElCount == 3) { + for (i = 0; i < bc; i++) { + padScanline3h(ipf, rsh, SrcWidth); + resize3(ipf, spv, 3, rsh.pos, kl, NewWidth); + outputScanline(spv, opn, + OutSLen, Clamp, OutMul); + + ipf += FltWidthE; + opn += NewScanlineSize; + } + } else // ElCount == 4 + { + for (i = 0; i < bc; i++) { + padScanline4h(ipf, rsh, SrcWidth); + resize4(ipf, spv, 4, rsh.pos, kl, NewWidth); + outputScanline(spv, opn, + OutSLen, Clamp, OutMul); + + ipf += FltWidthE; + opn += NewScanlineSize; + } + } + + rpv += bc; + bl -= bc; + } + + return (NewHeight); + } + + /** + * @brief Legacy image resizing function. + * + * Not recommended for new projects. See the prior resizeImage() function + * and CLancIRParams class for details. + * + * @param[in] SrcBuf Source image buffer. + * @param SrcWidth Source image width, in pixels. + * @param SrcHeight Source image height, in pixels. + * @param SrcSSize Physical size of the source scanline, in elements (not + * bytes). + * @param[out] NewBuf Buffer to accept the resized image. Cannot be equal + * to SrcBuf. + * @param NewWidth New image width, in pixels. + * @param NewHeight New image height, in pixels. + * @param NewSSize Physical size of the destination scanline, in elements + * (not bytes). + * @param ElCount The number of elements (channels) used to store each + * source and destination pixel (1-4). + * @param kx0 Resizing step - horizontal. + * @param ky0 Resizing step - vertical. Same as `kx0`. + * @param ox Start X pixel offset within the source image. + * @param oy Start Y pixel offset within the source image. + * @tparam Tin Input buffer's element type. + * @tparam Tout Output buffer's element type. + * @return The number of available output scanlines. Equals to + * `NewHeight`, or 0 on function parameters error. + */ + + template + int resizeImage(const Tin *const SrcBuf, const int SrcWidth, + const int SrcHeight, const int SrcSSize, Tout *const NewBuf, + const int NewWidth, const int NewHeight, const int NewSSize, + const int ElCount, const double kx0 = 0.0, const double ky0 = 0.0, + double ox = 0.0, double oy = 0.0) + { + const CLancIRParams Params(SrcSSize, NewSSize, kx0, ky0, ox, oy); + + return (resizeImage(SrcBuf, SrcWidth, SrcHeight, NewBuf, NewWidth, + NewHeight, ElCount, &Params)); + } + +protected: + float *FltBuf0; ///< Intermediate resizing buffer. + size_t FltBuf0Len; ///< Length of `FltBuf0`. + float *FltBuf; ///< Address-aligned `FltBuf0`. + float *spv0; ///< Scanline buffer for vertical resizing, also used at the + ///< output stage. + int spv0len; ///< Length of `spv0`. + float *spv; ///< Address-aligned `spv0`. + + /** + * @brief Typed buffer reallocation function, with address alignment. + * + * Function reallocates a typed buffer if its current length is + * smaller than the required length, applies `LANCIR_ALIGN` address + * alignment to the buffer pointer. + * + * @param buf0 Reference to the pointer of the previously allocated + * buffer. + * @param buf Reference to address-aligned `buf0` pointer. + * @param len The current length of the `buf0`. + * @param newlen A new required length. + * @tparam Tb Buffer element type. + * @tparam Tl Length variable type. + */ + + template + static void reallocBuf(Tb *&buf0, Tb *&buf, Tl &len, Tl newlen) + { + newlen += LANCIR_ALIGN; + + if (newlen > len) { + if (buf0 != nullptr) { + delete[] buf0; + buf0 = nullptr; + len = 0; + } + + buf0 = new Tb[newlen]; + len = newlen; + buf = (Tb *)(((uintptr_t)buf0 + LANCIR_ALIGN - 1) & + ~(uintptr_t)(LANCIR_ALIGN - 1)); + } + } + + /** + * @brief Typed buffer reallocation function. + * + * Function reallocates a typed buffer if its current length is smaller + * than the required length. + * + * @param buf Reference to the pointer of the previously allocated buffer; + * address alignment will not be applied. + * @param len The current length of the `buf0`. + * @param newlen A new required length. + * @tparam Tb Buffer element type. + * @tparam Tl Length variable type. + */ + + template + static void reallocBuf(Tb *&buf, Tl &len, const Tl newlen) + { + if (newlen > len) { + if (buf != nullptr) { + delete[] buf; + buf = nullptr; + len = 0; + } + + buf = new Tb[newlen]; + len = newlen; + } + } + + class CResizeScanline; + + /** + * @brief Class for fractional delay filter bank storage and calculation. + */ + + class CResizeFilters + { + friend class CResizeScanline; + + public: + int KernelLen; ///< Resampling filter kernel's length, taps. Available + ///< after the update() function call. Always an even value, + ///< should not be lesser than 4. + + CResizeFilters() + : Filters(nullptr), FiltersLen(0), la(0.0) + { + memset(Bufs0, 0, sizeof(Bufs0)); + memset(Bufs0Len, 0, sizeof(Bufs0Len)); + } + + ~CResizeFilters() + { + int i; + + for (i = 0; i < BufCount; i++) { + delete[] Bufs0[i]; + } + + delete[] Filters; + } + + /** + * @brief Function updates the filter bank. + * + * @param la0 Lanczos `a` parameter value (greater or equal to 2.0), + * can be fractional. + * @param k0 Resizing step. + * @param ElCount0 Image's element count, may be used for SIMD filter + * tap replication. + * @return `true`, if an update occured and scanline resizing + * positions should be updated unconditionally. + */ + + bool update(const double la0, const double k0, const int ElCount0) + { + if (la0 == la && k0 == k && ElCount0 == ElCount) { + return (false); + } + + const double NormFreq = (k0 <= 1.0 ? 1.0 : 1.0 / k0); + Freq = 3.1415926535897932 * NormFreq; + FreqA = Freq / la0; + + Len2 = la0 / NormFreq; + fl2 = (int)ceil(Len2); + KernelLen = fl2 + fl2; + +#if LANCIR_ALIGN > 4 + + ElRepl = ElCount0; + KernelLenA = KernelLen * ElRepl; + + const int elalign = + (int)(LANCIR_ALIGN / sizeof(float)) - 1; + + KernelLenA = (KernelLenA + elalign) & ~elalign; + +#else // LANCIR_ALIGN > 4 + + ElRepl = 1; + KernelLenA = KernelLen; + +#endif // LANCIR_ALIGN > 4 + + FracCount = 1000; // Enough for Lanczos implicit 8-bit precision. + + la = 0.0; + reallocBuf(Filters, FiltersLen, FracCount + 1); + + memset(Filters, 0, (size_t)FiltersLen * sizeof(Filters[0])); + + setBuf(0); + + la = la0; + k = k0; + ElCount = ElCount0; + + return (true); + } + + /** + * @brief Filter acquisition function. + * + * Function returns filter at the specified fractional offset. This + * function can only be called after a prior update() function call. + * + * @param x Fractional offset, [0; 1]. + * @return Pointer to a previously-calculated or a new filter. + */ + + const float *getFilter(const double x) + { + const int Frac = (int)(x * FracCount + 0.5); + float *flt = Filters[Frac]; + + if (flt != nullptr) { + return (flt); + } + + flt = Bufs[CurBuf] + CurBufFill * KernelLenA; + Filters[Frac] = flt; + CurBufFill++; + + if (CurBufFill == BufLen) { + setBuf(CurBuf + 1); + } + + makeFilterNorm(flt, 1.0 - (double)Frac / FracCount); + + if (ElRepl > 1) { + replicateFilter(flt, KernelLen, ElRepl); + } + + return (flt); + } + + protected: + double Freq; ///< Circular frequency of the filter. + double FreqA; ///< Circular frequency of the window function. + double Len2; ///< Half resampling filter's length, unrounded. + int fl2; ///< Half resampling filter's length, integer. + int FracCount; ///< The number of fractional positions for which + ///< filters can be created. + int KernelLenA; ///< SIMD-aligned and replicated filter kernel's + ///< length. + int ElRepl; ///< The number of repetitions of each filter tap. + static const int BufCount = 4; ///< The maximal number of buffers + ///< (filter batches) that can be in use. + static const int BufLen = 256; ///< The number of fractional filters + ///< a single buffer (filter batch) may contain. Both the `BufLen` + ///< and `BufCount` should correspond to the `FracCount` used. + float *Bufs0[BufCount]; ///< Buffers that hold all filters, + ///< original. + int Bufs0Len[BufCount]; ///< Allocated lengthes in `Bufs0`, in + ///< `float` elements. + float *Bufs[BufCount]; ///< Address-aligned `Bufs0`. + int CurBuf; ///< Filter buffer currently being filled. + int CurBufFill; ///< The number of fractional positions filled in the + ///< current filter buffer. + float **Filters; ///< Fractional delay filters for all positions. + ///< A particular pointer equals `nullptr`, if a filter for such + ///< position has not been created yet. + int FiltersLen; ///< Allocated length of Filters, in elements. + double la; ///< Current `la`. + double k; ///< Current `k`. + int ElCount; ///< Current `ElCount`. + + /** + * @brief Current buffer (filter batch) repositioning function. + * + * Function changes the buffer currently being filled, checks its size + * and reallocates it, if necessary, then resets its fill counter. + * + * @param bi A new current buffer index. + */ + + void setBuf(const int bi) + { + reallocBuf(Bufs0[bi], Bufs[bi], Bufs0Len[bi], + BufLen * KernelLenA); + + CurBuf = bi; + CurBufFill = 0; + } + + /** + * @brief Sine-wave signal generator class. + * + * Class implements sine-wave signal generator without biasing, with + * constructor-based initialization only. This generator uses an + * oscillator instead of the `sin()` function. + */ + + class CSineGen + { + public: + /** + * @brief Constructor initializes *this* sine-wave signal + * generator. + * + * @param si Sine function increment, in radians. + * @param ph Starting phase, in radians. Add `0.5*pi` for a + * cosine function. + */ + + CSineGen(const double si, const double ph) + : svalue1(sin(ph)), svalue2(sin(ph - si)), sincr(2.0 * cos(si)) + { + } + + /** + * @brief Generates the next sine-wave sample, without biasing. + */ + + double generate() + { + const double res = svalue1; + + svalue1 = sincr * res - svalue2; + svalue2 = res; + + return (res); + } + + private: + double svalue1; ///< Current sine value. + double svalue2; ///< Previous sine value. + double sincr; ///< Sine value increment. + }; + + /** + * @brief Filter calculation function. + * + * Function creates a filter for the specified fractional delay. The + * update() function should be called prior to calling this function. + * The created filter is normalized (DC gain=1). + * + * @param[out] op Output filter buffer. + * @param FracDelay Fractional delay, 0 to 1, inclusive. + */ + + void makeFilterNorm(float *op, const double FracDelay) const + { + CSineGen f(Freq, Freq * (FracDelay - fl2)); + CSineGen fw(FreqA, FreqA * (FracDelay - fl2)); + + float *op0 = op; + double s = 0.0; + double ut; + + int t = -fl2; + + if (t + FracDelay < -Len2) { + f.generate(); + fw.generate(); + *op = 0; + op++; + t++; + } + + int IsZeroX = (fabs(FracDelay - 1.0) < 2.3e-13); + int mt = 0 - IsZeroX; + IsZeroX |= (fabs(FracDelay) < 2.3e-13); + + while (t < mt) { + ut = t + FracDelay; + *op = (float)(f.generate() * fw.generate() / (ut * ut)); + s += *op; + op++; + t++; + } + + if (IsZeroX) // t+FracDelay==0 + { + *op = (float)(Freq * FreqA); + s += *op; + f.generate(); + fw.generate(); + } else { + ut = FracDelay; // t==0 + *op = (float)(f.generate() * fw.generate() / (ut * ut)); + s += *op; + } + + mt = fl2 - 2; + + while (t < mt) { + op++; + t++; + ut = t + FracDelay; + *op = (float)(f.generate() * fw.generate() / (ut * ut)); + s += *op; + } + + op++; + ut = t + 1 + FracDelay; + + if (ut > Len2) { + *op = 0; + } else { + *op = (float)(f.generate() * fw.generate() / (ut * ut)); + s += *op; + } + + s = 1.0 / s; + t = (int)(op - op0 + 1); + + while (t != 0) { + *op0 = (float)(*op0 * s); + op0++; + t--; + } + } + + /** + * @brief Filter tap replication function, for SIMD operations. + * + * Function replicates taps of the specified filter so that it can + * be used with SIMD loading instructions. This function works + * "in-place". + * + * @param[in,out] p Filter buffer pointer, should be sized to contain + * `kl * erp` elements. + * @param kl Filter kernel's length, in taps. + * @param erp The number of repetitions to apply. + */ + + static void replicateFilter(float *const p, const int kl, + const int erp) + { + const float *ip = p + kl - 1; + float *op = p + (kl - 1) * erp; + int c = kl; + + if (erp == 2) { + while (c != 0) { + const float v = *ip; + op[0] = v; + op[1] = v; + ip--; + op -= 2; + c--; + } + } else if (erp == 3) { + while (c != 0) { + const float v = *ip; + op[0] = v; + op[1] = v; + op[2] = v; + ip--; + op -= 3; + c--; + } + } else // erp == 4 + { + while (c != 0) { + const float v = *ip; + op[0] = v; + op[1] = v; + op[2] = v; + op[3] = v; + ip--; + op -= 4; + c--; + } + } + } + }; + + /** + * @brief Structure defines source scanline positions and filters for each + * destination pixel. + */ + + struct CResizePos { + const float *flt; ///< Fractional delay filter. + intptr_t spo; ///< Source scanline's pixel offset, in bytes, or + ///< a direct pointer to scanline buffer. + intptr_t so; ///< Offset within the source scanline, in pixels. + }; + + /** + * @brief Scanline resizing positions class. + * + * Class contains resizing positions, and prepares source scanline + * positions for resize filtering. The public variables become available + * after the update() function call. + */ + + class CResizeScanline + { + public: + int padl; ///< Left-padding (in pixels) required for source scanline. + int padr; ///< Right-padding (in pixels) required for source scanline. + CResizePos *pos; ///< Source scanline positions (offsets) and filters + ///< for each destination pixel position. + + CResizeScanline() + : pos(nullptr), poslen(0), SrcLen(0) + { + } + + ~CResizeScanline() + { + delete[] pos; + } + + /** + * @brief Object's reset function. + * + * Function "resets" *this* object so that the next update() call + * fully updates the position buffer. Reset is necessary if the + * corresponding CResizeFilters object was updated. + */ + + void reset() + { + SrcLen = 0; + } + + /** + * @brief Scanline positions update function. + * + * Function updates resizing positions, updates `padl`, `padr`, and + * `pos` buffer. + * + * @param SrcLen0 Source image scanline length, used to create a + * scanline buffer without length pre-calculation. + * @param DstLen0 Destination image scanline length. + * @param o0 Initial source image offset. + * @param rf Resizing filters object. + * @param sp A pointer to scanline buffer, to use for absolute + * scanline positioning, can be `nullptr`. + */ + + void update(const int SrcLen0, const int DstLen0, const double o0, + CResizeFilters &rf, float *const sp = nullptr) + { + if (SrcLen0 == SrcLen && DstLen0 == DstLen && o0 == o) { + return; + } + + const int fl2m1 = rf.fl2 - 1; + padl = fl2m1 - (int)floor(o0); + + if (padl < 0) { + padl = 0; + } + + // Make sure `padr` and `pos` are in sync: calculate ending `pos` + // offset in advance. + + const double k = rf.k; + + const int DstLen_m1 = DstLen0 - 1; + const double oe = o0 + k * DstLen_m1; + const int ie = (int)floor(oe); + + padr = ie + rf.fl2 + 1 - SrcLen0; + + if (padr < 0) { + padr = 0; + } + + SrcLen = 0; + reallocBuf(pos, poslen, DstLen0); + + const intptr_t ElCountF = rf.ElCount * (intptr_t)sizeof(float); + const int so = padl - fl2m1; + CResizePos *rp = pos; + intptr_t rpso; + int i; + + for (i = 0; i < DstLen_m1; i++) { + const double ox = o0 + k * i; + const int ix = (int)floor(ox); + + rp->flt = rf.getFilter(ox - ix); + rpso = so + ix; + rp->spo = (intptr_t)sp + rpso * ElCountF; + rp->so = rpso; + rp++; + } + + rp->flt = rf.getFilter(oe - ie); + rpso = so + ie; + rp->spo = (intptr_t)sp + rpso * ElCountF; + rp->so = rpso; + + SrcLen = SrcLen0; + DstLen = DstLen0; + o = o0; + } + + /** + * @brief Scanline pixel offsets update function. + * + * Function updates `pos` buffer's `spo` (scanline pixel offset) + * values. + * + * @param rf Resizing filters object. + * @param sp A pointer to scanline buffer, to use for absolute + * scanline positioning, can be `nullptr`. + */ + + void updateSPO(CResizeFilters &rf, float *const sp) + { + const intptr_t ElCountF = rf.ElCount * (intptr_t)sizeof(float); + CResizePos *const rp = pos; + int i; + + for (i = 0; i < DstLen; i++) { + rp[i].spo = (intptr_t)sp + rp[i].so * ElCountF; + } + } + + protected: + int poslen; ///< Allocated `pos` buffer's length. + int SrcLen; ///< Current `SrcLen`. + int DstLen; ///< Current `DstLen`. + double o; ///< Current `o`. + }; + + CResizeFilters rfv; ///< Resizing filters for vertical resizing. + CResizeFilters rfh0; ///< Resizing filters for horizontal resizing (may + ///< not be in use). + CResizeScanline rsv; ///< Vertical resize scanline. + CResizeScanline rsh; ///< Horizontal resize scanline. + + /** + * @{ + * @brief Scanline copying function, for vertical resizing. + * + * Function copies scanline (fully or partially) from the source buffer, + * in its native format, to the internal scanline buffer, in preparation + * for vertical resizing. Variants for 1-4-channel images. + * + * @param ip Source scanline buffer pointer. + * @param ipinc `ip` increment per pixel. + * @param op Output scanline pointer. + * @param cc Source pixel copy count. + * @param repl Leftmost pixel's replication count. + * @param repr Rightmost pixel's replication count. + * @tparam T Source buffer's element type. + */ + + template + static void copyScanline1v(const T *ip, const size_t ipinc, float *op, + int cc, int repl, int repr) + { + float v0; + + if (repl > 0) { + v0 = (float)ip[0]; + + do { + op[0] = v0; + op += 1; + + } while (--repl != 0); + } + + while (cc != 0) { + op[0] = (float)ip[0]; + ip += ipinc; + op += 1; + cc--; + } + + if (repr > 0) { + const T *const ipe = ip - ipinc; + v0 = (float)ipe[0]; + + do { + op[0] = v0; + op += 1; + + } while (--repr != 0); + } + } + + template + static void copyScanline2v(const T *ip, const size_t ipinc, float *op, + int cc, int repl, int repr) + { + float v0, v1; + + if (repl > 0) { + v0 = (float)ip[0]; + v1 = (float)ip[1]; + + do { + op[0] = v0; + op[1] = v1; + op += 2; + + } while (--repl != 0); + } + + while (cc != 0) { + op[0] = (float)ip[0]; + op[1] = (float)ip[1]; + ip += ipinc; + op += 2; + cc--; + } + + if (repr > 0) { + const T *const ipe = ip - ipinc; + v0 = (float)ipe[0]; + v1 = (float)ipe[1]; + + do { + op[0] = v0; + op[1] = v1; + op += 2; + + } while (--repr != 0); + } + } + + template + static void copyScanline3v(const T *ip, const size_t ipinc, float *op, + int cc, int repl, int repr) + { + float v0, v1, v2; + + if (repl > 0) { + v0 = (float)ip[0]; + v1 = (float)ip[1]; + v2 = (float)ip[2]; + + do { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op += 3; + + } while (--repl != 0); + } + + while (cc != 0) { + op[0] = (float)ip[0]; + op[1] = (float)ip[1]; + op[2] = (float)ip[2]; + ip += ipinc; + op += 3; + cc--; + } + + if (repr > 0) { + const T *const ipe = ip - ipinc; + v0 = (float)ipe[0]; + v1 = (float)ipe[1]; + v2 = (float)ipe[2]; + + do { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op += 3; + + } while (--repr != 0); + } + } + + template + static void copyScanline4v(const T *ip, const size_t ipinc, float *op, + int cc, int repl, int repr) + { + float v0, v1, v2, v3; + + if (repl > 0) { + v0 = (float)ip[0]; + v1 = (float)ip[1]; + v2 = (float)ip[2]; + v3 = (float)ip[3]; + + do { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op[3] = v3; + op += 4; + + } while (--repl != 0); + } + + while (cc != 0) { + op[0] = (float)ip[0]; + op[1] = (float)ip[1]; + op[2] = (float)ip[2]; + op[3] = (float)ip[3]; + ip += ipinc; + op += 4; + cc--; + } + + if (repr > 0) { + const T *const ipe = ip - ipinc; + v0 = (float)ipe[0]; + v1 = (float)ipe[1]; + v2 = (float)ipe[2]; + v3 = (float)ipe[3]; + + do { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op[3] = v3; + op += 4; + + } while (--repr != 0); + } + } + + /** @} */ + + /** + * @{ + * @brief Scanline padding function, for horizontal resizing. + * + * Function pads the specified scanline buffer to the left and right by + * replicating its first and last available pixels, in preparation for + * horizontal resizing. Variants for 1-4-channel images. + * + * @param[in,out] op Scanline buffer to pad. + * @param rs Scanline resizing positions object. + * @param l Source scanline's length, in pixels. + */ + + static void padScanline1h(float *op, CResizeScanline &rs, const int l) + { + const float *ip = op + rs.padl; + + float v0 = ip[0]; + int i; + + for (i = 0; i < rs.padl; i++) { + op[i] = v0; + } + + ip += l; + op += rs.padl + l; + + v0 = ip[-1]; + + for (i = 0; i < rs.padr; i++) { + op[i] = v0; + } + } + + static void padScanline2h(float *op, CResizeScanline &rs, const int l) + { + const float *ip = op + rs.padl * 2; + + float v0 = ip[0]; + float v1 = ip[1]; + int i; + + for (i = 0; i < rs.padl; i++) { + op[0] = v0; + op[1] = v1; + op += 2; + } + + const int lc = l * 2; + ip += lc; + op += lc; + + v0 = ip[-2]; + v1 = ip[-1]; + + for (i = 0; i < rs.padr; i++) { + op[0] = v0; + op[1] = v1; + op += 2; + } + } + + static void padScanline3h(float *op, CResizeScanline &rs, const int l) + { + const float *ip = op + rs.padl * 3; + + float v0 = ip[0]; + float v1 = ip[1]; + float v2 = ip[2]; + int i; + + for (i = 0; i < rs.padl; i++) { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op += 3; + } + + const int lc = l * 3; + ip += lc; + op += lc; + + v0 = ip[-3]; + v1 = ip[-2]; + v2 = ip[-1]; + + for (i = 0; i < rs.padr; i++) { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op += 3; + } + } + + static void padScanline4h(float *op, CResizeScanline &rs, const int l) + { + const float *ip = op + rs.padl * 4; + + float v0 = ip[0]; + float v1 = ip[1]; + float v2 = ip[2]; + float v3 = ip[3]; + int i; + + for (i = 0; i < rs.padl; i++) { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op[3] = v3; + op += 4; + } + + const int lc = l * 4; + ip += lc; + op += lc; + + v0 = ip[-4]; + v1 = ip[-3]; + v2 = ip[-2]; + v3 = ip[-1]; + + for (i = 0; i < rs.padr; i++) { + op[0] = v0; + op[1] = v1; + op[2] = v2; + op[3] = v3; + op += 4; + } + } + + /** @} */ + + /** + * @brief Rounds a value, and applies clamping. + * + * @param v Value to round and clamp. + * @param Clamp High clamp level; low level is 0. + * @return Rounded and clamped value. + */ + + static inline int roundclamp(const float v, const float Clamp) + { + return ((int)((v > Clamp ? Clamp : (v < 0.0f ? 0.0f : v)) + + 0.5f)); + } + + /** + * @brief Scanline output function. + * + * Function performs output of the scanline pixels to the destination + * image buffer, with type conversion, scaling, clamping, if necessary. + * + * @param[in] ip Input (resized) scanline. Pointer must be aligned to + * LANCIR_ALIGN bytes. + * @param[out] op Output image buffer. Must be different to `ip`. + * @param l Output scanline's length, in elements (not pixel count). + * @param Clamp Clamp high level, used if `IsOutFloat` is `false`. + * @param OutMul Output multiplier, for value range conversion, applied + * before clamping. + * @tparam IsOutFloat `true`, if floating-point output, and no clamping is + * necessary. + * @tparam IsUnityMul `true`, if multiplication is optional. However, even + * if this parameter was specified as `true`, `OutMul` must be 1. + * @tparam T Output buffer's element type. Acquired implicitly. + */ + + template + static void outputScanline(const float *ip, T *op, int l, + const float Clamp, const float OutMul) + { + if (IsOutFloat) { + if (IsUnityMul) { + if (sizeof(op[0]) == sizeof(ip[0])) { + memcpy(op, ip, (size_t)l * sizeof(op[0])); + } else { + int l4 = l >> 2; + l &= 3; + + while (l4 != 0) { + op[0] = (T)ip[0]; + op[1] = (T)ip[1]; + op[2] = (T)ip[2]; + op[3] = (T)ip[3]; + ip += 4; + op += 4; + l4--; + } + + while (l != 0) { + *op = (T)*ip; + ip++; + op++; + l--; + } + } + } else { + int l4 = l >> 2; + l &= 3; + bool DoScalar = true; + + if (sizeof(op[0]) == sizeof(ip[0])) { +#if LANCIR_ALIGN > 4 + + DoScalar = false; + const lancvec_t om = lancvec_load32_splat(&OutMul); + + while (l4 != 0) { + lancvec_storeu((float *)op, + lancvec_mul(lancvec_load(ip), om)); + + ip += 4; + op += 4; + l4--; + } + +#endif // LANCIR_ALIGN > 4 + } + + if (DoScalar) { + while (l4 != 0) { + op[0] = (T)(ip[0] * OutMul); + op[1] = (T)(ip[1] * OutMul); + op[2] = (T)(ip[2] * OutMul); + op[3] = (T)(ip[3] * OutMul); + ip += 4; + op += 4; + l4--; + } + } + + while (l != 0) { + *op = (T)(*ip * OutMul); + ip++; + op++; + l--; + } + } + } else { + int l4 = l >> 2; + l &= 3; + +#if LANCIR_ALIGN > 4 + + const lancvec_t minv = lancvec_const_splat(0.0f); + const lancvec_t maxv = lancvec_load32_splat(&Clamp); + const lancvec_t om = lancvec_load32_splat(&OutMul); + +#if defined(LANCIR_SSE2) + unsigned int prevrm = _MM_GET_ROUNDING_MODE(); + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); +#else // defined( LANCIR_SSE2 ) + const lancvec_t v05 = lancvec_const_splat(0.5f); +#endif // defined( LANCIR_SSE2 ) + + if (sizeof(op[0]) == 4) { + while (l4 != 0) { + const lancvec_t v = lancvec_load(ip); + const lancvec_t cv = lancvec_max(lancvec_min( + (IsUnityMul ? v : lancvec_mul(v, om)), + maxv), + minv); + +#if defined(LANCIR_SSE2) + + _mm_storeu_si128((__m128i *)op, _mm_cvtps_epi32(cv)); + +#elif defined(LANCIR_NEON) + + vst1q_u32((unsigned int *)op, vcvtq_u32_f32(vaddq_f32(cv, v05))); + +#elif defined(LANCIR_WASM) + + wasm_v128_store(op, wasm_i32x4_trunc_sat_f32x4(wasm_f32x4_add(cv, v05))); + +#endif // defined( LANCIR_WASM ) + + ip += 4; + op += 4; + l4--; + } + } else if (sizeof(op[0]) == 2) { + while (l4 != 0) { + const lancvec_t v = lancvec_load(ip); + const lancvec_t cv = lancvec_max(lancvec_min( + (IsUnityMul ? v : lancvec_mul(v, om)), + maxv), + minv); + +#if defined(LANCIR_SSE2) + + const __m128i v32 = _mm_cvtps_epi32(cv); + const __m128i v16s = _mm_shufflehi_epi16( + _mm_shufflelo_epi16(v32, 0 | 2 << 2), 0 | 2 << 2); + + const __m128i v16 = _mm_shuffle_epi32(v16s, 0 | 2 << 2); + + __m128i tmp; + _mm_store_si128(&tmp, v16); + memcpy(op, &tmp, 8); + +#elif defined(LANCIR_NEON) + + const uint32x4_t v32 = vcvtq_u32_f32( + vaddq_f32(cv, v05)); + + const uint16x4_t v16 = vmovn_u32(v32); + + vst1_u16((unsigned short *)op, v16); + +#elif defined(LANCIR_WASM) + + const v128_t v32 = wasm_i32x4_trunc_sat_f32x4( + wasm_f32x4_add(cv, v05)); + + wasm_v128_store64_lane(op, + wasm_u16x8_narrow_i32x4(v32, v32), 0); + +#endif // defined( LANCIR_WASM ) + + ip += 4; + op += 4; + l4--; + } + } else { + while (l4 != 0) { + const lancvec_t v = lancvec_load(ip); + const lancvec_t cv = lancvec_max(lancvec_min( + (IsUnityMul ? v : lancvec_mul(v, om)), + maxv), + minv); + +#if defined(LANCIR_SSE2) + + const __m128i v32 = _mm_cvtps_epi32(cv); + const __m128i v16s = _mm_shufflehi_epi16( + _mm_shufflelo_epi16(v32, 0 | 2 << 2), 0 | 2 << 2); + + const __m128i v16 = _mm_shuffle_epi32(v16s, 0 | 2 << 2); + const __m128i v8 = _mm_packus_epi16(v16, v16); + + *(int *)op = _mm_cvtsi128_si32(v8); + +#elif defined(LANCIR_NEON) + + const uint32x4_t v32 = vcvtq_u32_f32( + vaddq_f32(cv, v05)); + + const uint16x4_t v16 = vmovn_u32(v32); + const uint8x8_t v8 = vmovn_u16(vcombine_u16(v16, v16)); + + *(unsigned int *)op = vget_lane_u32((uint32x2_t)v8, 0); + +#elif defined(LANCIR_WASM) + + const v128_t v32 = wasm_i32x4_trunc_sat_f32x4( + wasm_f32x4_add(cv, v05)); + + const v128_t v16 = wasm_u16x8_narrow_i32x4(v32, v32); + + wasm_v128_store32_lane(op, + wasm_u8x16_narrow_i16x8(v16, v16), 0); + +#endif // defined( LANCIR_WASM ) + + ip += 4; + op += 4; + l4--; + } + } + +#if defined(LANCIR_SSE2) + _MM_SET_ROUNDING_MODE(prevrm); +#endif // defined( LANCIR_SSE2 ) + +#else // LANCIR_ALIGN > 4 + + if (IsUnityMul) { + while (l4 != 0) { + op[0] = (T)roundclamp(ip[0], Clamp); + op[1] = (T)roundclamp(ip[1], Clamp); + op[2] = (T)roundclamp(ip[2], Clamp); + op[3] = (T)roundclamp(ip[3], Clamp); + ip += 4; + op += 4; + l4--; + } + } else { + while (l4 != 0) { + op[0] = (T)roundclamp(ip[0] * OutMul, Clamp); + op[1] = (T)roundclamp(ip[1] * OutMul, Clamp); + op[2] = (T)roundclamp(ip[2] * OutMul, Clamp); + op[3] = (T)roundclamp(ip[3] * OutMul, Clamp); + ip += 4; + op += 4; + l4--; + } + } + +#endif // LANCIR_ALIGN > 4 + + if (IsUnityMul) { + while (l != 0) { + *op = (T)roundclamp(*ip, Clamp); + ip++; + op++; + l--; + } + } else { + while (l != 0) { + *op = (T)roundclamp(*ip * OutMul, Clamp); + ip++; + op++; + l--; + } + } + } + } + + /** + * @def LANCIR_LF_PRE + * @brief Scanline resize function prologue. + */ + +#define LANCIR_LF_PRE \ + const CResizePos *const rpe = rp + DstLen; \ + while (rp != rpe) { \ + const float *flt = rp->flt; \ + const float *ip; \ + if (UseSP) { \ + ip = (const float *)((intptr_t)sp + rp->spo); \ + } else { \ + ip = (const float *)rp->spo; \ + } + + /** + * @def LANCIR_LF_POST + * @brief Scanline resize function epilogue. + */ + +#define LANCIR_LF_POST \ + op += opinc; \ + rp++; \ + } + + /** + * @{ + * @brief Function performs scanline resizing. Variants for 1-4-channel + * images. + * + * @param[in] sp Source scanline buffer. + * @param[out] op Destination buffer. + * @param opinc `op` increment. + * @param rp Source scanline offsets and resizing filters. + * @param kl Filter kernel's length, in taps (always an even value). + * @param DstLen Destination length, in pixels. + * @tparam UseSP `true`, if `sp` pointer should be added to `spo`. + */ + + template + static void resize1(const float *const sp, float *op, const size_t opinc, + const CResizePos *rp, const int kl, const int DstLen) + { + const int ci = kl >> 2; + + if ((kl & 3) == 0) { + LANCIR_LF_PRE + + int c = ci; + +#if LANCIR_ALIGN > 4 + + lancvec_t sum = lancvec_mul( + lancvec_load(flt), lancvec_loadu(ip)); + + while (--c != 0) { + flt += 4; + ip += 4; + sum = lancvec_madd(sum, lancvec_load(flt), + lancvec_loadu(ip)); + } + + lancvec_store32_hadd(op, sum); + +#else // LANCIR_ALIGN > 4 + + float sum0 = flt[0] * ip[0]; + float sum1 = flt[1] * ip[1]; + float sum2 = flt[2] * ip[2]; + float sum3 = flt[3] * ip[3]; + + while (--c != 0) { + flt += 4; + ip += 4; + sum0 += flt[0] * ip[0]; + sum1 += flt[1] * ip[1]; + sum2 += flt[2] * ip[2]; + sum3 += flt[3] * ip[3]; + } + + op[0] = (sum0 + sum1) + (sum2 + sum3); + +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_POST + } else { + LANCIR_LF_PRE + + int c = ci; + +#if LANCIR_ALIGN > 4 + + lancvec_t sum = lancvec_mul(lancvec_load(flt), + lancvec_loadu(ip)); + + while (--c != 0) { + flt += 4; + ip += 4; + sum = lancvec_madd(sum, lancvec_load(flt), + lancvec_loadu(ip)); + } + +#if defined(LANCIR_NEON) + + float32x2_t sum2 = vadd_f32(vget_high_f32(sum), + vget_low_f32(sum)); + + sum2 = vmla_f32(sum2, vld1_f32(flt + 4), + vld1_f32(ip + 4)); + +#if defined(LANCIR_ARM32) + op[0] = vget_lane_f32(sum2, 0) + + vget_lane_f32(sum2, 1); +#else // defined( LANCIR_ARM32 ) + op[0] = vaddv_f32(sum2); +#endif // defined( LANCIR_ARM32 ) + +#else // defined( LANCIR_NEON ) + + const lancvec_t sum2 = lancvec_mul(lancvec_loadu(flt + 2), + lancvec_loadu(ip + 2)); + + sum = lancvec_addhl(sum, sum); + sum = lancvec_addhl(sum, sum2); + + lancvec_store32_addhl(op, sum); + +#endif // defined( LANCIR_NEON ) + +#else // LANCIR_ALIGN > 4 + + float sum0 = flt[0] * ip[0]; + float sum1 = flt[1] * ip[1]; + float sum2 = flt[2] * ip[2]; + float sum3 = flt[3] * ip[3]; + + while (--c != 0) { + flt += 4; + ip += 4; + sum0 += flt[0] * ip[0]; + sum1 += flt[1] * ip[1]; + sum2 += flt[2] * ip[2]; + sum3 += flt[3] * ip[3]; + } + + op[0] = (sum0 + sum1) + (sum2 + sum3) + + flt[4] * ip[4] + flt[5] * ip[5]; + +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_POST + } + } + + template + static void resize2(const float *const sp, float *op, const size_t opinc, + const CResizePos *rp, const int kl, const int DstLen) + { +#if LANCIR_ALIGN > 4 + const int ci = kl >> 2; + const int cir = kl & 3; +#else // LANCIR_ALIGN > 4 + const int ci = kl >> 1; +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_PRE + + int c = ci; + +#if defined(LANCIR_AVX) + + __m256 sum = _mm256_mul_ps(_mm256_load_ps(flt), + _mm256_loadu_ps(ip)); + + while (--c != 0) { + flt += 8; + ip += 8; + sum = _mm256_add_ps(sum, _mm256_mul_ps(_mm256_load_ps(flt), _mm256_loadu_ps(ip))); + } + + __m128 res = _mm_add_ps(_mm256_extractf128_ps(sum, 0), + _mm256_extractf128_ps(sum, 1)); + + if (cir == 2) { + res = _mm_add_ps(res, _mm_mul_ps(_mm_load_ps(flt + 8), _mm_loadu_ps(ip + 8))); + } + + _mm_storel_pi((__m64 *)op, + _mm_add_ps(res, _mm_movehl_ps(res, res))); + +#elif LANCIR_ALIGN > 4 + + lancvec_t sumA = lancvec_mul( + lancvec_load(flt), lancvec_loadu(ip)); + + lancvec_t sumB = lancvec_mul( + lancvec_load(flt + 4), lancvec_loadu(ip + 4)); + + while (--c != 0) { + flt += 8; + ip += 8; + sumA = lancvec_madd(sumA, lancvec_load(flt), + lancvec_loadu(ip)); + + sumB = lancvec_madd(sumB, lancvec_load(flt + 4), + lancvec_loadu(ip + 4)); + } + + sumA = lancvec_add(sumA, sumB); + + if (cir == 2) { + sumA = lancvec_madd(sumA, lancvec_load(flt + 8), + lancvec_loadu(ip + 8)); + } + + lancvec_store64_addhl(op, sumA); + +#else // LANCIR_ALIGN > 4 + + const float xx = flt[0]; + const float xx2 = flt[1]; + float sum0 = xx * ip[0]; + float sum1 = xx * ip[1]; + float sum2 = xx2 * ip[2]; + float sum3 = xx2 * ip[3]; + + while (--c != 0) { + flt += 2; + ip += 4; + const float xx = flt[0]; + const float xx2 = flt[1]; + sum0 += xx * ip[0]; + sum1 += xx * ip[1]; + sum2 += xx2 * ip[2]; + sum3 += xx2 * ip[3]; + } + + op[0] = sum0 + sum2; + op[1] = sum1 + sum3; + +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_POST + } + + template + static void resize3(const float *const sp, float *op, const size_t opinc, + const CResizePos *rp, const int kl, const int DstLen) + { +#if LANCIR_ALIGN > 4 + + const int ci = kl >> 2; + const int cir = kl & 3; + + LANCIR_LF_PRE + + float res[12]; + int c = ci; + +#if defined(LANCIR_AVX) + + __m128 sumA = _mm_mul_ps(_mm_load_ps(flt), _mm_loadu_ps(ip)); + __m256 sumB = _mm256_mul_ps(_mm256_loadu_ps(flt + 4), + _mm256_loadu_ps(ip + 4)); + + while (--c != 0) { + flt += 12; + ip += 12; + sumA = _mm_add_ps(sumA, _mm_mul_ps(_mm_load_ps(flt), _mm_loadu_ps(ip))); + + sumB = _mm256_add_ps(sumB, _mm256_mul_ps(_mm256_loadu_ps(flt + 4), _mm256_loadu_ps(ip + 4))); + } + + if (cir == 2) { + sumA = _mm_add_ps(sumA, _mm_mul_ps(_mm_load_ps(flt + 12), _mm_loadu_ps(ip + 12))); + } + + _mm_storeu_ps(res, sumA); + + float o0 = res[0] + res[3]; + float o1 = res[1]; + float o2 = res[2]; + + _mm256_storeu_ps(res + 4, sumB); + + o1 += res[4]; + o2 += res[5]; + +#else // defined( LANCIR_AVX ) + + lancvec_t sumA = lancvec_mul(lancvec_load(flt), + lancvec_loadu(ip)); + + lancvec_t sumB = lancvec_mul(lancvec_load(flt + 4), + lancvec_loadu(ip + 4)); + + lancvec_t sumC = lancvec_mul(lancvec_load(flt + 8), + lancvec_loadu(ip + 8)); + + while (--c != 0) { + flt += 12; + ip += 12; + sumA = lancvec_madd(sumA, lancvec_load(flt), + lancvec_loadu(ip)); + + sumB = lancvec_madd(sumB, lancvec_load(flt + 4), + lancvec_loadu(ip + 4)); + + sumC = lancvec_madd(sumC, lancvec_load(flt + 8), + lancvec_loadu(ip + 8)); + } + + if (cir == 2) { + sumA = lancvec_madd(sumA, lancvec_load(flt + 12), + lancvec_loadu(ip + 12)); + } + + lancvec_storeu(res, sumA); + lancvec_storeu(res + 4, sumB); + + float o0 = res[0] + res[3]; + float o1 = res[1] + res[4]; + float o2 = res[2] + res[5]; + + lancvec_storeu(res + 8, sumC); + +#endif // defined( LANCIR_AVX ) + + o0 += res[6] + res[9]; + o1 += res[7] + res[10]; + o2 += res[8] + res[11]; + + if (cir == 2) { + o1 += flt[16] * ip[16]; + o2 += flt[17] * ip[17]; + } + + op[0] = o0; + op[1] = o1; + op[2] = o2; + +#else // LANCIR_ALIGN > 4 + + const int ci = kl >> 1; + + LANCIR_LF_PRE + + int c = ci; + + const float xx = flt[0]; + float sum0 = xx * ip[0]; + float sum1 = xx * ip[1]; + float sum2 = xx * ip[2]; + const float xx2 = flt[1]; + float sum3 = xx2 * ip[3]; + float sum4 = xx2 * ip[4]; + float sum5 = xx2 * ip[5]; + + while (--c != 0) { + flt += 2; + ip += 6; + const float xx = flt[0]; + sum0 += xx * ip[0]; + sum1 += xx * ip[1]; + sum2 += xx * ip[2]; + const float xx2 = flt[1]; + sum3 += xx2 * ip[3]; + sum4 += xx2 * ip[4]; + sum5 += xx2 * ip[5]; + } + + op[0] = sum0 + sum3; + op[1] = sum1 + sum4; + op[2] = sum2 + sum5; + +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_POST + } + + template + static void resize4(const float *const sp, float *op, const size_t opinc, + const CResizePos *rp, const int kl, const int DstLen) + { +#if LANCIR_ALIGN > 4 + const int ci = kl >> 1; +#else // LANCIR_ALIGN > 4 + const int ci = kl; +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_PRE + + int c = ci; + +#if defined(LANCIR_AVX) + + __m256 sum = _mm256_mul_ps(_mm256_load_ps(flt), + _mm256_loadu_ps(ip)); + + while (--c != 0) { + flt += 8; + ip += 8; + sum = _mm256_add_ps(sum, _mm256_mul_ps(_mm256_load_ps(flt), _mm256_loadu_ps(ip))); + } + + _mm_store_ps(op, _mm_add_ps(_mm256_extractf128_ps(sum, 0), _mm256_extractf128_ps(sum, 1))); + +#elif LANCIR_ALIGN > 4 + + lancvec_t sumA = lancvec_mul(lancvec_load(flt), + lancvec_load(ip)); + + lancvec_t sumB = lancvec_mul(lancvec_load(flt + 4), + lancvec_load(ip + 4)); + + while (--c != 0) { + flt += 8; + ip += 8; + sumA = lancvec_madd(sumA, lancvec_load(flt), + lancvec_load(ip)); + + sumB = lancvec_madd(sumB, lancvec_load(flt + 4), + lancvec_load(ip + 4)); + } + + lancvec_store(op, lancvec_add(sumA, sumB)); + +#else // LANCIR_ALIGN > 4 + + const float xx = flt[0]; + float sum0 = xx * ip[0]; + float sum1 = xx * ip[1]; + float sum2 = xx * ip[2]; + float sum3 = xx * ip[3]; + + while (--c != 0) { + flt++; + ip += 4; + const float xx = flt[0]; + sum0 += xx * ip[0]; + sum1 += xx * ip[1]; + sum2 += xx * ip[2]; + sum3 += xx * ip[3]; + } + + op[0] = sum0; + op[1] = sum1; + op[2] = sum2; + op[3] = sum3; + +#endif // LANCIR_ALIGN > 4 + + LANCIR_LF_POST + } + + /** @} */ + +#undef LANCIR_LF_PRE +#undef LANCIR_LF_POST +}; + +#undef lancvec_t +#undef lancvec_const_splat +#undef lancvec_load32_splat +#undef lancvec_load +#undef lancvec_loadu +#undef lancvec_store +#undef lancvec_storeu +#undef lancvec_add +#undef lancvec_mul +#undef lancvec_min +#undef lancvec_max +#undef lancvec_madd +#undef lancvec_addhl +#undef lancvec_store32_addhl +#undef lancvec_store32_hadd +#undef lancvec_store64_addhl + +#if defined(LANCIR_NULLPTR) +#undef nullptr +#undef LANCIR_NULLPTR +#endif // defined( LANCIR_NULLPTR ) + +} // namespace avir + +#endif // AVIR_CLANCIR_INCLUDED diff --git a/image_processing/resize_image.cpp b/image_processing/resize_image.cpp new file mode 100644 index 000000000..7a6a94e9c --- /dev/null +++ b/image_processing/resize_image.cpp @@ -0,0 +1,60 @@ +#include "resize_image.h" + +#include "lancir.h" + +static QImage scaleImageLancir(const QImage &image, int width, int height) +{ + QImage src = (image.format() == QImage::Format_ARGB32) + ? image + : image.convertToFormat(QImage::Format_ARGB32); + + QImage dst(width, height, QImage::Format_ARGB32); + + // SrcSSize / NewSSize are in elements; for uint8_t that equals bytes, + // so bytesPerLine() covers any Qt row-alignment padding correctly. + avir::CLancIRParams params(src.bytesPerLine(), dst.bytesPerLine()); + params.la = 4.0; // Lanczos4 + + avir::CLancIR lancir; + lancir.resizeImage( + src.constBits(), src.width(), src.height(), + dst.bits(), width, height, 4, ¶ms); + + return dst; +} + +// ---- QPixmap API ------------------------------------------------------------ + +QPixmap scalePixmap(const QPixmap &pixmap, int width, int height, ScaleMethod method) +{ + if ((pixmap.width() == width && pixmap.height() == height) || pixmap.isNull()) + return pixmap; + + switch (method) { + case ScaleMethod::Nearest: + return pixmap.scaled(width, height, Qt::IgnoreAspectRatio, Qt::FastTransformation); + case ScaleMethod::Bilinear: + return pixmap.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + case ScaleMethod::Lanczos: + return QPixmap::fromImage(scaleImageLancir(pixmap.toImage(), width, height)); + } + return pixmap; +} + +// ---- QImage API (avoids QPixmap round-trip in ContinuousPageWidget) --------- + +QImage scaleImage(const QImage &image, int width, int height, ScaleMethod method) +{ + if ((image.width() == width && image.height() == height) || image.isNull()) + return image; + + switch (method) { + case ScaleMethod::Nearest: + return image.scaled(width, height, Qt::IgnoreAspectRatio, Qt::FastTransformation); + case ScaleMethod::Bilinear: + return image.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + case ScaleMethod::Lanczos: + return scaleImageLancir(image, width, height); + } + return image; +} diff --git a/image_processing/resize_image.h b/image_processing/resize_image.h new file mode 100644 index 000000000..ae3390fe1 --- /dev/null +++ b/image_processing/resize_image.h @@ -0,0 +1,19 @@ +#ifndef RESIZE_IMAGE_H +#define RESIZE_IMAGE_H + +#include +#include + +enum class ScaleMethod { + Nearest = 0, + Bilinear = 1, + Lanczos = 2 +}; + +// Base scaling API — callers are responsible for supplying the correct target dimensions. + +QPixmap scalePixmap(const QPixmap &pixmap, int width, int height, ScaleMethod method = ScaleMethod::Lanczos); + +QImage scaleImage(const QImage &image, int width, int height, ScaleMethod method = ScaleMethod::Lanczos); + +#endif // RESIZE_IMAGE_H diff --git a/images/YACReader.png b/images/YACReader.png index 32e007a35..ddb21839a 100644 Binary files a/images/YACReader.png and b/images/YACReader.png differ diff --git a/images/YACReaderLibrary.png b/images/YACReaderLibrary.png index f52e5dea7..855bb865c 100644 Binary files a/images/YACReaderLibrary.png and b/images/YACReaderLibrary.png differ diff --git a/images/accept_shortcut.png b/images/accept_shortcut.png deleted file mode 100644 index dc0017b95..000000000 Binary files a/images/accept_shortcut.png and /dev/null differ diff --git a/images/appearance_config/theme-mode-custom.svg b/images/appearance_config/theme-mode-custom.svg new file mode 100644 index 000000000..227cd5da3 --- /dev/null +++ b/images/appearance_config/theme-mode-custom.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/appearance_config/theme-mode-dark.svg b/images/appearance_config/theme-mode-dark.svg new file mode 100644 index 000000000..a30277b96 --- /dev/null +++ b/images/appearance_config/theme-mode-dark.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/appearance_config/theme-mode-light.svg b/images/appearance_config/theme-mode-light.svg new file mode 100644 index 000000000..401b54c82 --- /dev/null +++ b/images/appearance_config/theme-mode-light.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/appearance_config/theme-mode-system.svg b/images/appearance_config/theme-mode-system.svg new file mode 100644 index 000000000..62fc45696 --- /dev/null +++ b/images/appearance_config/theme-mode-system.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/centerFlow.svg b/images/centerFlow.svg new file mode 100644 index 000000000..ccfb1c172 --- /dev/null +++ b/images/centerFlow.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/clearSearch.png b/images/clearSearch.png deleted file mode 100644 index f895c564f..000000000 Binary files a/images/clearSearch.png and /dev/null differ diff --git a/images/clearSearch@2x.png b/images/clearSearch@2x.png deleted file mode 100644 index 738fc2e77..000000000 Binary files a/images/clearSearch@2x.png and /dev/null differ diff --git a/images/clearSearchNew.svg b/images/clearSearchNew.svg index 9f29aec38..a5d0bb46d 100644 --- a/images/clearSearchNew.svg +++ b/images/clearSearchNew.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/clear_shortcut.png b/images/clear_shortcut.png deleted file mode 100644 index 1ffbf449b..000000000 Binary files a/images/clear_shortcut.png and /dev/null differ diff --git a/images/comic_vine/checkBoxTick.svg b/images/comic_vine/checkBoxTick.svg index d6590f1b9..043c5e9d5 100644 --- a/images/comic_vine/checkBoxTick.svg +++ b/images/comic_vine/checkBoxTick.svg @@ -4,7 +4,7 @@ + + + diff --git a/images/comic_vine/nextPage.png b/images/comic_vine/nextPage.png deleted file mode 100644 index 46aaa8c62..000000000 Binary files a/images/comic_vine/nextPage.png and /dev/null differ diff --git a/images/comic_vine/nextPage.svg b/images/comic_vine/nextPage.svg new file mode 100644 index 000000000..d95d99bd5 --- /dev/null +++ b/images/comic_vine/nextPage.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/comic_vine/previousPage.png b/images/comic_vine/previousPage.png deleted file mode 100644 index 01365a899..000000000 Binary files a/images/comic_vine/previousPage.png and /dev/null differ diff --git a/images/comic_vine/previousPage.svg b/images/comic_vine/previousPage.svg new file mode 100644 index 000000000..47a2b2c90 --- /dev/null +++ b/images/comic_vine/previousPage.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/comic_vine/radioChecked.png b/images/comic_vine/radioChecked.png deleted file mode 100644 index a6134f924..000000000 Binary files a/images/comic_vine/radioChecked.png and /dev/null differ diff --git a/images/comic_vine/radioChecked.svg b/images/comic_vine/radioChecked.svg new file mode 100644 index 000000000..c5abedee8 --- /dev/null +++ b/images/comic_vine/radioChecked.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/images/comic_vine/radioUnchecked.png b/images/comic_vine/radioUnchecked.png deleted file mode 100644 index 13c0a7bdf..000000000 Binary files a/images/comic_vine/radioUnchecked.png and /dev/null differ diff --git a/images/comic_vine/radioUnchecked.svg b/images/comic_vine/radioUnchecked.svg new file mode 100644 index 000000000..98f1bf29f --- /dev/null +++ b/images/comic_vine/radioUnchecked.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/comic_vine/rowDown.png b/images/comic_vine/rowDown.png deleted file mode 100644 index c89a816d8..000000000 Binary files a/images/comic_vine/rowDown.png and /dev/null differ diff --git a/images/comic_vine/rowDown.svg b/images/comic_vine/rowDown.svg new file mode 100644 index 000000000..157f275a7 --- /dev/null +++ b/images/comic_vine/rowDown.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/comic_vine/rowUp.png b/images/comic_vine/rowUp.png deleted file mode 100644 index 00c4b5486..000000000 Binary files a/images/comic_vine/rowUp.png and /dev/null differ diff --git a/images/comic_vine/rowUp.svg b/images/comic_vine/rowUp.svg new file mode 100644 index 000000000..f57f7fded --- /dev/null +++ b/images/comic_vine/rowUp.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/comic_vine/upArrow.png b/images/comic_vine/upArrow.png deleted file mode 100644 index a0c1303de..000000000 Binary files a/images/comic_vine/upArrow.png and /dev/null differ diff --git a/images/comic_vine/upArrow.svg b/images/comic_vine/upArrow.svg new file mode 100644 index 000000000..e4dea8413 --- /dev/null +++ b/images/comic_vine/upArrow.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/asignNumber.svg b/images/comics_view_toolbar/asignNumber.svg index 3342ffaec..0b658fe6b 100644 --- a/images/comics_view_toolbar/asignNumber.svg +++ b/images/comics_view_toolbar/asignNumber.svg @@ -1 +1,15 @@ - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/big_size_grid_zoom.svg b/images/comics_view_toolbar/big_size_grid_zoom.svg index 52cef716f..0717f0535 100644 --- a/images/comics_view_toolbar/big_size_grid_zoom.svg +++ b/images/comics_view_toolbar/big_size_grid_zoom.svg @@ -1 +1,15 @@ - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/editComic.svg b/images/comics_view_toolbar/editComic.svg index 8da5f200a..6eafb7fe4 100644 --- a/images/comics_view_toolbar/editComic.svg +++ b/images/comics_view_toolbar/editComic.svg @@ -1 +1,14 @@ - + + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/getInfo.svg b/images/comics_view_toolbar/getInfo.svg index 5ebd74e7d..a9884473c 100644 --- a/images/comics_view_toolbar/getInfo.svg +++ b/images/comics_view_toolbar/getInfo.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/hideComicFlow.svg b/images/comics_view_toolbar/hideComicFlow.svg index 01652ba40..e4fbb55ce 100644 --- a/images/comics_view_toolbar/hideComicFlow.svg +++ b/images/comics_view_toolbar/hideComicFlow.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/openInYACReader.svg b/images/comics_view_toolbar/openInYACReader.svg index 91c4d420c..ae8e4c5c9 100644 --- a/images/comics_view_toolbar/openInYACReader.svg +++ b/images/comics_view_toolbar/openInYACReader.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/selectAll.svg b/images/comics_view_toolbar/selectAll.svg index d61862a95..148b6b48b 100644 --- a/images/comics_view_toolbar/selectAll.svg +++ b/images/comics_view_toolbar/selectAll.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/setManga.svg b/images/comics_view_toolbar/setManga.svg index f9be7e9a7..72c3e3683 100644 --- a/images/comics_view_toolbar/setManga.svg +++ b/images/comics_view_toolbar/setManga.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/setNormal.svg b/images/comics_view_toolbar/setNormal.svg index 7e8c385c0..4c12dd774 100644 --- a/images/comics_view_toolbar/setNormal.svg +++ b/images/comics_view_toolbar/setNormal.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/setReadButton.svg b/images/comics_view_toolbar/setReadButton.svg index 89f400578..e44d0cdea 100644 --- a/images/comics_view_toolbar/setReadButton.svg +++ b/images/comics_view_toolbar/setReadButton.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/setUnread.svg b/images/comics_view_toolbar/setUnread.svg index fbc97ea08..bba657781 100644 --- a/images/comics_view_toolbar/setUnread.svg +++ b/images/comics_view_toolbar/setUnread.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/showMarks.svg b/images/comics_view_toolbar/showMarks.svg index 63205d921..470e92bee 100644 --- a/images/comics_view_toolbar/showMarks.svg +++ b/images/comics_view_toolbar/showMarks.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/showRecentIndicator.svg b/images/comics_view_toolbar/showRecentIndicator.svg index 5f12b064a..0d82d6c99 100644 --- a/images/comics_view_toolbar/showRecentIndicator.svg +++ b/images/comics_view_toolbar/showRecentIndicator.svg @@ -1,11 +1,12 @@ - + + - + \ No newline at end of file diff --git a/images/comics_view_toolbar/show_comic_info.svg b/images/comics_view_toolbar/show_comic_info.svg index 3e0da8bc0..22b596bd6 100644 --- a/images/comics_view_toolbar/show_comic_info.svg +++ b/images/comics_view_toolbar/show_comic_info.svg @@ -1 +1,15 @@ - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/small_size_grid_zoom.svg b/images/comics_view_toolbar/small_size_grid_zoom.svg index 44d20c85f..eb4d48a7f 100644 --- a/images/comics_view_toolbar/small_size_grid_zoom.svg +++ b/images/comics_view_toolbar/small_size_grid_zoom.svg @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/comics_view_toolbar/trash.svg b/images/comics_view_toolbar/trash.svg index 4767dab72..f28dcd02b 100644 --- a/images/comics_view_toolbar/trash.svg +++ b/images/comics_view_toolbar/trash.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/custom_dialog/custom_close_button.svg b/images/custom_dialog/custom_close_button.svg index 1a6ad742c..7bb61f316 100644 --- a/images/custom_dialog/custom_close_button.svg +++ b/images/custom_dialog/custom_close_button.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/deleting_progress/icon.png b/images/deleting_progress/icon.png deleted file mode 100644 index 707741906..000000000 Binary files a/images/deleting_progress/icon.png and /dev/null differ diff --git a/images/deleting_progress/imgBottomLeft.png b/images/deleting_progress/imgBottomLeft.png deleted file mode 100644 index 9c2f77ecc..000000000 Binary files a/images/deleting_progress/imgBottomLeft.png and /dev/null differ diff --git a/images/deleting_progress/imgBottomMiddle.png b/images/deleting_progress/imgBottomMiddle.png deleted file mode 100644 index da7fbc491..000000000 Binary files a/images/deleting_progress/imgBottomMiddle.png and /dev/null differ diff --git a/images/deleting_progress/imgBottomRight.png b/images/deleting_progress/imgBottomRight.png deleted file mode 100644 index c33e6aee0..000000000 Binary files a/images/deleting_progress/imgBottomRight.png and /dev/null differ diff --git a/images/deleting_progress/imgLeftMiddle.png b/images/deleting_progress/imgLeftMiddle.png deleted file mode 100644 index 84cb92412..000000000 Binary files a/images/deleting_progress/imgLeftMiddle.png and /dev/null differ diff --git a/images/deleting_progress/imgRightMiddle.png b/images/deleting_progress/imgRightMiddle.png deleted file mode 100644 index f29c1b1e9..000000000 Binary files a/images/deleting_progress/imgRightMiddle.png and /dev/null differ diff --git a/images/deleting_progress/imgTopLeft.png b/images/deleting_progress/imgTopLeft.png deleted file mode 100644 index ea44e3547..000000000 Binary files a/images/deleting_progress/imgTopLeft.png and /dev/null differ diff --git a/images/deleting_progress/imgTopMiddle.png b/images/deleting_progress/imgTopMiddle.png deleted file mode 100644 index a4ad99048..000000000 Binary files a/images/deleting_progress/imgTopMiddle.png and /dev/null differ diff --git a/images/deleting_progress/imgTopRight.png b/images/deleting_progress/imgTopRight.png deleted file mode 100644 index c528653e3..000000000 Binary files a/images/deleting_progress/imgTopRight.png and /dev/null differ diff --git a/images/down.png b/images/down.png deleted file mode 100644 index 44d91d424..000000000 Binary files a/images/down.png and /dev/null differ diff --git a/images/dropDownArrow.png b/images/dropDownArrow.png deleted file mode 100644 index db5ea8d86..000000000 Binary files a/images/dropDownArrow.png and /dev/null differ diff --git a/images/edit.png b/images/edit.png deleted file mode 100644 index 7ac38c8c3..000000000 Binary files a/images/edit.png and /dev/null differ diff --git a/images/empty_container/empty_current_readings.svg b/images/empty_container/empty_current_readings.svg new file mode 100644 index 000000000..ceaabeb52 --- /dev/null +++ b/images/empty_container/empty_current_readings.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/empty_container/empty_favorites.svg b/images/empty_container/empty_favorites.svg new file mode 100644 index 000000000..8ca30b6e0 --- /dev/null +++ b/images/empty_container/empty_favorites.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/empty_container/empty_folder.svg b/images/empty_container/empty_folder.svg new file mode 100644 index 000000000..39a5b9dd2 --- /dev/null +++ b/images/empty_container/empty_folder.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/empty_container/empty_label.svg b/images/empty_container/empty_label.svg new file mode 100644 index 000000000..3d5d6d00a --- /dev/null +++ b/images/empty_container/empty_label.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/images/empty_container/empty_reading_list.svg b/images/empty_container/empty_reading_list.svg new file mode 100644 index 000000000..9419898c4 --- /dev/null +++ b/images/empty_container/empty_reading_list.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/images/empty_current_readings.png b/images/empty_current_readings.png deleted file mode 100644 index 776fb0c3e..000000000 Binary files a/images/empty_current_readings.png and /dev/null differ diff --git a/images/empty_favorites.png b/images/empty_favorites.png deleted file mode 100644 index c0fce602e..000000000 Binary files a/images/empty_favorites.png and /dev/null differ diff --git a/images/empty_folder.png b/images/empty_folder.png deleted file mode 100644 index fa3b13cde..000000000 Binary files a/images/empty_folder.png and /dev/null differ diff --git a/images/empty_folder_osx.png b/images/empty_folder_osx.png deleted file mode 100644 index f33e65e04..000000000 Binary files a/images/empty_folder_osx.png and /dev/null differ diff --git a/images/empty_label.png b/images/empty_label.png deleted file mode 100644 index 4c0857233..000000000 Binary files a/images/empty_label.png and /dev/null differ diff --git a/images/empty_reading_list.png b/images/empty_reading_list.png deleted file mode 100644 index 36669888d..000000000 Binary files a/images/empty_reading_list.png and /dev/null differ diff --git a/images/empty_reading_list_osx.png b/images/empty_reading_list_osx.png deleted file mode 100644 index 59667e1f3..000000000 Binary files a/images/empty_reading_list_osx.png and /dev/null differ diff --git a/images/empty_search.png b/images/empty_search.png deleted file mode 100644 index f012d8ec3..000000000 Binary files a/images/empty_search.png and /dev/null differ diff --git a/images/empty_search_osx.png b/images/empty_search_osx.png deleted file mode 100644 index d9b8cee57..000000000 Binary files a/images/empty_search_osx.png and /dev/null differ diff --git a/images/exportComicsInfo.png b/images/exportComicsInfo.png deleted file mode 100644 index 5299eb719..000000000 Binary files a/images/exportComicsInfo.png and /dev/null differ diff --git a/images/exportLibrary.png b/images/exportLibrary.png deleted file mode 100644 index 67d237573..000000000 Binary files a/images/exportLibrary.png and /dev/null differ diff --git a/images/f.png b/images/f.png deleted file mode 100644 index 232a785d7..000000000 Binary files a/images/f.png and /dev/null differ diff --git a/images/f_overlayed.png b/images/f_overlayed.png deleted file mode 100644 index eb53bca42..000000000 Binary files a/images/f_overlayed.png and /dev/null differ diff --git a/images/f_overlayed_retina.png b/images/f_overlayed_retina.png deleted file mode 100644 index d613de829..000000000 Binary files a/images/f_overlayed_retina.png and /dev/null differ diff --git a/images/f_retina.png b/images/f_retina.png deleted file mode 100644 index b8eeddcf6..000000000 Binary files a/images/f_retina.png and /dev/null differ diff --git a/images/find_folder.png b/images/find_folder.png deleted file mode 100644 index f645dfe4f..000000000 Binary files a/images/find_folder.png and /dev/null differ diff --git a/images/find_folder.svg b/images/find_folder.svg new file mode 100644 index 000000000..797143736 --- /dev/null +++ b/images/find_folder.svg @@ -0,0 +1 @@ + diff --git a/images/folder_finished_macosx.png b/images/folder_finished_macosx.png deleted file mode 100644 index e1dc09ec8..000000000 Binary files a/images/folder_finished_macosx.png and /dev/null differ diff --git a/images/fromTo.png b/images/fromTo.png deleted file mode 100644 index 87ec680d0..000000000 Binary files a/images/fromTo.png and /dev/null differ diff --git a/images/glowLine.png b/images/glowLine.png deleted file mode 100644 index 13ee7b3b8..000000000 Binary files a/images/glowLine.png and /dev/null differ diff --git a/images/glowLine.svg b/images/glowLine.svg new file mode 100644 index 000000000..f32a3ade5 --- /dev/null +++ b/images/glowLine.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/goto.png b/images/goto.png deleted file mode 100644 index d99a3d013..000000000 Binary files a/images/goto.png and /dev/null differ diff --git a/images/goto.svg b/images/goto.svg new file mode 100644 index 000000000..89ccb8106 --- /dev/null +++ b/images/goto.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/gotoFlow.svg b/images/gotoFlow.svg new file mode 100644 index 000000000..8c0a7158b --- /dev/null +++ b/images/gotoFlow.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/hiddenCovers.png b/images/hiddenCovers.png deleted file mode 100644 index 8689db16a..000000000 Binary files a/images/hiddenCovers.png and /dev/null differ diff --git a/images/icon.png b/images/icon.png index 16e9a9efa..0b3c6fb45 100644 Binary files a/images/icon.png and b/images/icon.png differ diff --git a/images/iconLibrary.png b/images/iconLibrary.png index 4c4d8a694..07799e119 100644 Binary files a/images/iconLibrary.png and b/images/iconLibrary.png differ diff --git a/images/iconSearch.png b/images/iconSearch.png deleted file mode 100644 index 6a238061d..000000000 Binary files a/images/iconSearch.png and /dev/null differ diff --git a/images/iconSearch@2x.png b/images/iconSearch@2x.png deleted file mode 100644 index 1393f10f5..000000000 Binary files a/images/iconSearch@2x.png and /dev/null differ diff --git a/images/iconSearchNew.svg b/images/iconSearchNew.svg index e7fa36836..797143736 100644 --- a/images/iconSearchNew.svg +++ b/images/iconSearchNew.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/imgCenterSlide.png b/images/imgCenterSlide.png deleted file mode 100644 index 0c50ca860..000000000 Binary files a/images/imgCenterSlide.png and /dev/null differ diff --git a/images/imgCenterSlide@2x.png b/images/imgCenterSlide@2x.png deleted file mode 100644 index eb1108eda..000000000 Binary files a/images/imgCenterSlide@2x.png and /dev/null differ diff --git a/images/imgCenterSlidePressed.png b/images/imgCenterSlidePressed.png deleted file mode 100644 index 66b47ed2c..000000000 Binary files a/images/imgCenterSlidePressed.png and /dev/null differ diff --git a/images/imgCenterSlidePressed@2x.png b/images/imgCenterSlidePressed@2x.png deleted file mode 100644 index e6d216b6a..000000000 Binary files a/images/imgCenterSlidePressed@2x.png and /dev/null differ diff --git a/images/imgGoToSlide.png b/images/imgGoToSlide.png deleted file mode 100644 index 3187cfc5f..000000000 Binary files a/images/imgGoToSlide.png and /dev/null differ diff --git a/images/imgGoToSlide@2x.png b/images/imgGoToSlide@2x.png deleted file mode 100644 index f833be3c6..000000000 Binary files a/images/imgGoToSlide@2x.png and /dev/null differ diff --git a/images/imgGoToSlidePressed.png b/images/imgGoToSlidePressed.png deleted file mode 100644 index 76f5b0b15..000000000 Binary files a/images/imgGoToSlidePressed.png and /dev/null differ diff --git a/images/imgGoToSlidePressed@2x.png b/images/imgGoToSlidePressed@2x.png deleted file mode 100644 index 354993d75..000000000 Binary files a/images/imgGoToSlidePressed@2x.png and /dev/null differ diff --git a/images/import/coversToggle.svg b/images/import/coversToggle.svg new file mode 100644 index 000000000..e7f4195bd --- /dev/null +++ b/images/import/coversToggle.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/images/import/importBottomCoversDecoration.svg b/images/import/importBottomCoversDecoration.svg new file mode 100644 index 000000000..73fd3b749 --- /dev/null +++ b/images/import/importBottomCoversDecoration.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/images/import/importTopCoversDecoration.svg b/images/import/importTopCoversDecoration.svg new file mode 100644 index 000000000..b2ad35f38 --- /dev/null +++ b/images/import/importTopCoversDecoration.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/images/import/importingIcon.svg b/images/import/importingIcon.svg new file mode 100644 index 000000000..a79f3c282 --- /dev/null +++ b/images/import/importingIcon.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/import/updatingIcon.svg b/images/import/updatingIcon.svg new file mode 100644 index 000000000..2d82a53c3 --- /dev/null +++ b/images/import/updatingIcon.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/importBottomCoversDecoration.png b/images/importBottomCoversDecoration.png deleted file mode 100644 index 7508ce178..000000000 Binary files a/images/importBottomCoversDecoration.png and /dev/null differ diff --git a/images/importComicsInfo.png b/images/importComicsInfo.png deleted file mode 100644 index 6830bc076..000000000 Binary files a/images/importComicsInfo.png and /dev/null differ diff --git a/images/importLibrary.png b/images/importLibrary.png deleted file mode 100644 index fa9366bf0..000000000 Binary files a/images/importLibrary.png and /dev/null differ diff --git a/images/importTopCoversDecoration.png b/images/importTopCoversDecoration.png deleted file mode 100644 index 0343fdb42..000000000 Binary files a/images/importTopCoversDecoration.png and /dev/null differ diff --git a/images/importingIcon.png b/images/importingIcon.png deleted file mode 100644 index a53e768aa..000000000 Binary files a/images/importingIcon.png and /dev/null differ diff --git a/images/library_dialogs/edit.svg b/images/library_dialogs/edit.svg new file mode 100644 index 000000000..37f087e96 --- /dev/null +++ b/images/library_dialogs/edit.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/library_dialogs/exportComicsInfo.svg b/images/library_dialogs/exportComicsInfo.svg new file mode 100644 index 000000000..9117d72d5 --- /dev/null +++ b/images/library_dialogs/exportComicsInfo.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/library_dialogs/exportLibrary.svg b/images/library_dialogs/exportLibrary.svg new file mode 100644 index 000000000..b834319cd --- /dev/null +++ b/images/library_dialogs/exportLibrary.svg @@ -0,0 +1,22 @@ + + + + + + + + + + \ No newline at end of file diff --git a/images/library_dialogs/importComicsInfo.svg b/images/library_dialogs/importComicsInfo.svg new file mode 100644 index 000000000..71a8b717f --- /dev/null +++ b/images/library_dialogs/importComicsInfo.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/images/library_dialogs/importLibrary.svg b/images/library_dialogs/importLibrary.svg new file mode 100644 index 000000000..ec5f096b8 --- /dev/null +++ b/images/library_dialogs/importLibrary.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/library_dialogs/new.svg b/images/library_dialogs/new.svg new file mode 100644 index 000000000..a755c5800 --- /dev/null +++ b/images/library_dialogs/new.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/images/library_dialogs/openLibrary.svg b/images/library_dialogs/openLibrary.svg new file mode 100644 index 000000000..1a64f11e6 --- /dev/null +++ b/images/library_dialogs/openLibrary.svg @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/images/lists/default_0.svg b/images/lists/default_0.svg index 1b290d531..75babfca6 100644 --- a/images/lists/default_0.svg +++ b/images/lists/default_0.svg @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/lists/default_1.svg b/images/lists/default_1.svg index 837ec29c8..c4ddc2840 100644 --- a/images/lists/default_1.svg +++ b/images/lists/default_1.svg @@ -1 +1,17 @@ - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/images/lists/default_2.svg b/images/lists/default_2.svg index 88ab6868d..eea9ed7e5 100644 --- a/images/lists/default_2.svg +++ b/images/lists/default_2.svg @@ -1,19 +1,28 @@ - + + - - + + - - + + \ No newline at end of file diff --git a/images/lists/label_blue.svg b/images/lists/label_blue.svg deleted file mode 100644 index d735f3bc5..000000000 --- a/images/lists/label_blue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_cyan.svg b/images/lists/label_cyan.svg deleted file mode 100644 index e028467b1..000000000 --- a/images/lists/label_cyan.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_dark.svg b/images/lists/label_dark.svg deleted file mode 100644 index c25fb5219..000000000 --- a/images/lists/label_dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_green.svg b/images/lists/label_green.svg deleted file mode 100644 index 7cbe39424..000000000 --- a/images/lists/label_green.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_light.svg b/images/lists/label_light.svg deleted file mode 100644 index fea8b87f1..000000000 --- a/images/lists/label_light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_orange.svg b/images/lists/label_orange.svg deleted file mode 100644 index a2838c644..000000000 --- a/images/lists/label_orange.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_pink.svg b/images/lists/label_pink.svg deleted file mode 100644 index c957673d9..000000000 --- a/images/lists/label_pink.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_purple.svg b/images/lists/label_purple.svg deleted file mode 100644 index 85dd2a230..000000000 --- a/images/lists/label_purple.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_red.svg b/images/lists/label_red.svg deleted file mode 100644 index 8ef4a8a85..000000000 --- a/images/lists/label_red.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_template.svg b/images/lists/label_template.svg new file mode 100644 index 000000000..5b13b18f7 --- /dev/null +++ b/images/lists/label_template.svg @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/images/lists/label_violet.svg b/images/lists/label_violet.svg deleted file mode 100644 index 3400101f1..000000000 --- a/images/lists/label_violet.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_white.svg b/images/lists/label_white.svg deleted file mode 100644 index dfe2ffc84..000000000 --- a/images/lists/label_white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/label_yellow.svg b/images/lists/label_yellow.svg deleted file mode 100644 index 3d2f0da19..000000000 --- a/images/lists/label_yellow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/lists/list.svg b/images/lists/list.svg index aabef84bc..a24c621b5 100644 --- a/images/lists/list.svg +++ b/images/lists/list.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/lists/original colors.md b/images/lists/original colors.md new file mode 100644 index 000000000..7e5859ed5 --- /dev/null +++ b/images/lists/original colors.md @@ -0,0 +1,24 @@ + +shadow in all icons is represented with #0ff -> original color was #000000 + +all labels have shadow and the icons should be generated from `label_template.svg`, this is the list of actual colors needed per label +label_blue.svg -> #82c7ff +label_cyan.svg -> #a0fddb +label_dark.svg -> #b7b7b7 +label_green.svg -> #ade738 +label_light.svg -> #cbcbcb +label_orange.svg -> #f5c240 +label_pink.svg -> #fd9cda +label_purple.svg -> #d692fc +label_red.svg -> #f67a7b +label_violet.svg -> #8f95ff +label_white.svg -> #fcfcfc +label_yellow.svg -> #f2e446 + +other icons + +default_2.svg -> #f0f -> #ffcc00 #0ff -> #000000 #ff0 -> #33000000 +default_1.svg -> #f0f -> #e15055 #0ff -> #000000 +default_0.svg -> #f0f -> #e7e7e7 #0ff -> #000000 + +list.svg -> #f0f -> #e7e7e7 #0ff -> #000000 #ff0 -> #464646 \ No newline at end of file diff --git a/images/main_toolbar/back.svg b/images/main_toolbar/back.svg index 08a5777f7..f6a4cc94d 100644 --- a/images/main_toolbar/back.svg +++ b/images/main_toolbar/back.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/back_disabled.png b/images/main_toolbar/back_disabled.png deleted file mode 100644 index 9e09b69aa..000000000 Binary files a/images/main_toolbar/back_disabled.png and /dev/null differ diff --git a/images/main_toolbar/back_disabled_osx.png b/images/main_toolbar/back_disabled_osx.png deleted file mode 100644 index 92ef82c9b..000000000 Binary files a/images/main_toolbar/back_disabled_osx.png and /dev/null differ diff --git a/images/main_toolbar/back_osx.png b/images/main_toolbar/back_osx.png deleted file mode 100644 index e6e7724e9..000000000 Binary files a/images/main_toolbar/back_osx.png and /dev/null differ diff --git a/images/main_toolbar/back_osx@2x.png b/images/main_toolbar/back_osx@2x.png deleted file mode 100644 index c56d5126c..000000000 Binary files a/images/main_toolbar/back_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/flow.svg b/images/main_toolbar/flow.svg index afde5c5bd..c84719fc6 100644 --- a/images/main_toolbar/flow.svg +++ b/images/main_toolbar/flow.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/flow_osx.png b/images/main_toolbar/flow_osx.png deleted file mode 100644 index 261a8ebdf..000000000 Binary files a/images/main_toolbar/flow_osx.png and /dev/null differ diff --git a/images/main_toolbar/flow_osx@2x.png b/images/main_toolbar/flow_osx@2x.png deleted file mode 100644 index 69081e1e0..000000000 Binary files a/images/main_toolbar/flow_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/forward.svg b/images/main_toolbar/forward.svg index 50a5f21ab..2a786f996 100644 --- a/images/main_toolbar/forward.svg +++ b/images/main_toolbar/forward.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/forward_disabled.png b/images/main_toolbar/forward_disabled.png deleted file mode 100644 index 1e4b070a9..000000000 Binary files a/images/main_toolbar/forward_disabled.png and /dev/null differ diff --git a/images/main_toolbar/forward_disabled_osx.png b/images/main_toolbar/forward_disabled_osx.png deleted file mode 100644 index b62d0e762..000000000 Binary files a/images/main_toolbar/forward_disabled_osx.png and /dev/null differ diff --git a/images/main_toolbar/forward_osx.png b/images/main_toolbar/forward_osx.png deleted file mode 100644 index dbe0779b6..000000000 Binary files a/images/main_toolbar/forward_osx.png and /dev/null differ diff --git a/images/main_toolbar/forward_osx@2x.png b/images/main_toolbar/forward_osx@2x.png deleted file mode 100644 index 20f673513..000000000 Binary files a/images/main_toolbar/forward_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/fullscreen.svg b/images/main_toolbar/fullscreen.svg index f0bf9e9c9..b7ac674c7 100644 --- a/images/main_toolbar/fullscreen.svg +++ b/images/main_toolbar/fullscreen.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/fullscreen_osx.png b/images/main_toolbar/fullscreen_osx.png deleted file mode 100644 index 0b3a1d49c..000000000 Binary files a/images/main_toolbar/fullscreen_osx.png and /dev/null differ diff --git a/images/main_toolbar/grid.svg b/images/main_toolbar/grid.svg index 6c6d534de..4787059c1 100644 --- a/images/main_toolbar/grid.svg +++ b/images/main_toolbar/grid.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/grid_osx.png b/images/main_toolbar/grid_osx.png deleted file mode 100644 index 986b5cba1..000000000 Binary files a/images/main_toolbar/grid_osx.png and /dev/null differ diff --git a/images/main_toolbar/grid_osx@2x.png b/images/main_toolbar/grid_osx@2x.png deleted file mode 100644 index daa81e6cc..000000000 Binary files a/images/main_toolbar/grid_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/help.svg b/images/main_toolbar/help.svg index f0d090536..ce5fc309e 100644 --- a/images/main_toolbar/help.svg +++ b/images/main_toolbar/help.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/help_osx.png b/images/main_toolbar/help_osx.png deleted file mode 100644 index 87cd40080..000000000 Binary files a/images/main_toolbar/help_osx.png and /dev/null differ diff --git a/images/main_toolbar/help_osx@2x.png b/images/main_toolbar/help_osx@2x.png deleted file mode 100644 index 398875a3f..000000000 Binary files a/images/main_toolbar/help_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/info.svg b/images/main_toolbar/info.svg index 4b7510e01..a8e8bb548 100644 --- a/images/main_toolbar/info.svg +++ b/images/main_toolbar/info.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/info_osx.png b/images/main_toolbar/info_osx.png deleted file mode 100644 index 171689901..000000000 Binary files a/images/main_toolbar/info_osx.png and /dev/null differ diff --git a/images/main_toolbar/info_osx@2x.png b/images/main_toolbar/info_osx@2x.png deleted file mode 100644 index 4f78fefba..000000000 Binary files a/images/main_toolbar/info_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/server.svg b/images/main_toolbar/server.svg index 0bd8cfebd..57c4f2d76 100644 --- a/images/main_toolbar/server.svg +++ b/images/main_toolbar/server.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/server_osx.png b/images/main_toolbar/server_osx.png deleted file mode 100644 index 0ca28a412..000000000 Binary files a/images/main_toolbar/server_osx.png and /dev/null differ diff --git a/images/main_toolbar/server_osx@2x.png b/images/main_toolbar/server_osx@2x.png deleted file mode 100644 index 6150248ba..000000000 Binary files a/images/main_toolbar/server_osx@2x.png and /dev/null differ diff --git a/images/main_toolbar/settings.svg b/images/main_toolbar/settings.svg index 4f01a4d0b..d97d6f54e 100644 --- a/images/main_toolbar/settings.svg +++ b/images/main_toolbar/settings.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/main_toolbar/settings_osx.png b/images/main_toolbar/settings_osx.png deleted file mode 100644 index 14629c4e1..000000000 Binary files a/images/main_toolbar/settings_osx.png and /dev/null differ diff --git a/images/main_toolbar/settings_osx@2x.png b/images/main_toolbar/settings_osx@2x.png deleted file mode 100644 index add7e7a7a..000000000 Binary files a/images/main_toolbar/settings_osx@2x.png and /dev/null differ diff --git a/images/menus_icons/editIcon.svg b/images/menus_icons/editIcon.svg index ef898daae..0404a54e8 100644 --- a/images/menus_icons/editIcon.svg +++ b/images/menus_icons/editIcon.svg @@ -1 +1 @@ - + diff --git a/images/menus_icons/exportComicsInfoIcon.svg b/images/menus_icons/exportComicsInfoIcon.svg index 2f2d32a67..ef26e40c2 100644 --- a/images/menus_icons/exportComicsInfoIcon.svg +++ b/images/menus_icons/exportComicsInfoIcon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/menus_icons/exportLibraryIcon.svg b/images/menus_icons/exportLibraryIcon.svg index e36a771cc..677f74d48 100644 --- a/images/menus_icons/exportLibraryIcon.svg +++ b/images/menus_icons/exportLibraryIcon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/menus_icons/importComicsInfoIcon.svg b/images/menus_icons/importComicsInfoIcon.svg index fc2c0dc8d..c5eb625c8 100644 --- a/images/menus_icons/importComicsInfoIcon.svg +++ b/images/menus_icons/importComicsInfoIcon.svg @@ -1 +1 @@ - + diff --git a/images/menus_icons/importLibraryIcon.svg b/images/menus_icons/importLibraryIcon.svg index 752ba386c..b897d65ac 100644 --- a/images/menus_icons/importLibraryIcon.svg +++ b/images/menus_icons/importLibraryIcon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/menus_icons/open_containing_folder.svg b/images/menus_icons/open_containing_folder.svg index 3080991e2..7258b0d2f 100644 --- a/images/menus_icons/open_containing_folder.svg +++ b/images/menus_icons/open_containing_folder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/menus_icons/removeLibraryIcon.svg b/images/menus_icons/removeLibraryIcon.svg index 51141dd45..6dfb053d4 100644 --- a/images/menus_icons/removeLibraryIcon.svg +++ b/images/menus_icons/removeLibraryIcon.svg @@ -1 +1 @@ - + diff --git a/images/menus_icons/updateLibraryIcon.svg b/images/menus_icons/updateLibraryIcon.svg index 016c9622d..f99b0e605 100644 --- a/images/menus_icons/updateLibraryIcon.svg +++ b/images/menus_icons/updateLibraryIcon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/menus_icons/update_current_folder.svg b/images/menus_icons/update_current_folder.svg index 016c9622d..f99b0e605 100644 --- a/images/menus_icons/update_current_folder.svg +++ b/images/menus_icons/update_current_folder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/images/loadCustomCover.svg b/images/metadata_dialog/loadCustomCover.svg similarity index 100% rename from images/loadCustomCover.svg rename to images/metadata_dialog/loadCustomCover.svg diff --git a/images/metadata_dialog/nextCoverPage.svg b/images/metadata_dialog/nextCoverPage.svg new file mode 100644 index 000000000..73be5c01e --- /dev/null +++ b/images/metadata_dialog/nextCoverPage.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/metadata_dialog/previousCoverPage.svg b/images/metadata_dialog/previousCoverPage.svg new file mode 100644 index 000000000..b598c43f5 --- /dev/null +++ b/images/metadata_dialog/previousCoverPage.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/resetCover.svg b/images/metadata_dialog/resetCover.svg similarity index 100% rename from images/resetCover.svg rename to images/metadata_dialog/resetCover.svg diff --git a/images/new.png b/images/new.png deleted file mode 100644 index 7ca944115..000000000 Binary files a/images/new.png and /dev/null differ diff --git a/images/nextCoverPage.png b/images/nextCoverPage.png deleted file mode 100644 index 67e063994..000000000 Binary files a/images/nextCoverPage.png and /dev/null differ diff --git a/images/noLibrariesIcon.png b/images/noLibrariesIcon.png deleted file mode 100644 index cf11b95d9..000000000 Binary files a/images/noLibrariesIcon.png and /dev/null differ diff --git a/images/noLibrariesIcon.svg b/images/noLibrariesIcon.svg new file mode 100644 index 000000000..99c432a00 --- /dev/null +++ b/images/noLibrariesIcon.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/noLibrariesLine.png b/images/noLibrariesLine.png deleted file mode 100644 index 18599349a..000000000 Binary files a/images/noLibrariesLine.png and /dev/null differ diff --git a/images/noLibrariesLine.svg b/images/noLibrariesLine.svg new file mode 100644 index 000000000..316f51f78 --- /dev/null +++ b/images/noLibrariesLine.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/openLibrary.png b/images/openLibrary.png deleted file mode 100644 index 320e6882f..000000000 Binary files a/images/openLibrary.png and /dev/null differ diff --git a/images/previousCoverPage.png b/images/previousCoverPage.png deleted file mode 100644 index 5a99a7e96..000000000 Binary files a/images/previousCoverPage.png and /dev/null differ diff --git a/images/rating0.png b/images/rating0.png deleted file mode 100644 index ba09981f0..000000000 Binary files a/images/rating0.png and /dev/null differ diff --git a/images/rating1.png b/images/rating1.png deleted file mode 100644 index 5210caf75..000000000 Binary files a/images/rating1.png and /dev/null differ diff --git a/images/rating2.png b/images/rating2.png deleted file mode 100644 index b7f594923..000000000 Binary files a/images/rating2.png and /dev/null differ diff --git a/images/rating3.png b/images/rating3.png deleted file mode 100644 index d2c312d56..000000000 Binary files a/images/rating3.png and /dev/null differ diff --git a/images/rating4.png b/images/rating4.png deleted file mode 100644 index 2ce6f202b..000000000 Binary files a/images/rating4.png and /dev/null differ diff --git a/images/rating5.png b/images/rating5.png deleted file mode 100644 index 23eee225f..000000000 Binary files a/images/rating5.png and /dev/null differ diff --git a/images/readRibbon.png b/images/readRibbon.png deleted file mode 100644 index 4dcd32e21..000000000 Binary files a/images/readRibbon.png and /dev/null differ diff --git a/images/readRibbon.svg b/images/readRibbon.svg new file mode 100644 index 000000000..7eced57ee --- /dev/null +++ b/images/readRibbon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/readingRibbon.png b/images/readingRibbon.png deleted file mode 100644 index 476912ef2..000000000 Binary files a/images/readingRibbon.png and /dev/null differ diff --git a/images/readingRibbon.svg b/images/readingRibbon.svg new file mode 100644 index 000000000..1cd07eaac --- /dev/null +++ b/images/readingRibbon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/search_result.svg b/images/search_result.svg new file mode 100644 index 000000000..dd1cf23b9 --- /dev/null +++ b/images/search_result.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/searching_icon.png b/images/searching_icon.png deleted file mode 100644 index 95355bfc3..000000000 Binary files a/images/searching_icon.png and /dev/null differ diff --git a/images/serverConfigBackground.png b/images/serverConfigBackground.png deleted file mode 100644 index c89bf73ba..000000000 Binary files a/images/serverConfigBackground.png and /dev/null differ diff --git a/images/serverConfigBackground.svg b/images/serverConfigBackground.svg new file mode 100644 index 000000000..c15d8d61a --- /dev/null +++ b/images/serverConfigBackground.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/images/accept_shortcut.svg b/images/shortcuts/accept_shortcut.svg similarity index 100% rename from images/accept_shortcut.svg rename to images/shortcuts/accept_shortcut.svg diff --git a/images/clear_shortcut.svg b/images/shortcuts/clear_shortcut.svg similarity index 100% rename from images/clear_shortcut.svg rename to images/shortcuts/clear_shortcut.svg diff --git a/images/shortcuts/shortcuts_group_comics.svg b/images/shortcuts/shortcuts_group_comics.svg new file mode 100644 index 000000000..d7fadd8a7 --- /dev/null +++ b/images/shortcuts/shortcuts_group_comics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_folders.svg b/images/shortcuts/shortcuts_group_folders.svg new file mode 100644 index 000000000..8b650c1cd --- /dev/null +++ b/images/shortcuts/shortcuts_group_folders.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_general.svg b/images/shortcuts/shortcuts_group_general.svg new file mode 100644 index 000000000..762471797 --- /dev/null +++ b/images/shortcuts/shortcuts_group_general.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_libraries.svg b/images/shortcuts/shortcuts_group_libraries.svg new file mode 100644 index 000000000..59b168dce --- /dev/null +++ b/images/shortcuts/shortcuts_group_libraries.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_mglass.svg b/images/shortcuts/shortcuts_group_mglass.svg new file mode 100644 index 000000000..38d2ae65b --- /dev/null +++ b/images/shortcuts/shortcuts_group_mglass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_page.svg b/images/shortcuts/shortcuts_group_page.svg new file mode 100644 index 000000000..5ce4138e5 --- /dev/null +++ b/images/shortcuts/shortcuts_group_page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_reading.svg b/images/shortcuts/shortcuts_group_reading.svg new file mode 100644 index 000000000..9f8ff719d --- /dev/null +++ b/images/shortcuts/shortcuts_group_reading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts/shortcuts_group_visualization.svg b/images/shortcuts/shortcuts_group_visualization.svg new file mode 100644 index 000000000..2924e94c6 --- /dev/null +++ b/images/shortcuts/shortcuts_group_visualization.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/shortcuts_group_comics.svg b/images/shortcuts_group_comics.svg deleted file mode 100644 index 66cc3bd6e..000000000 --- a/images/shortcuts_group_comics.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_folders.svg b/images/shortcuts_group_folders.svg deleted file mode 100644 index d66245abb..000000000 --- a/images/shortcuts_group_folders.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_general.svg b/images/shortcuts_group_general.svg deleted file mode 100644 index eb25e4de7..000000000 --- a/images/shortcuts_group_general.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_libraries.svg b/images/shortcuts_group_libraries.svg deleted file mode 100644 index 250963dce..000000000 --- a/images/shortcuts_group_libraries.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_mglass.svg b/images/shortcuts_group_mglass.svg deleted file mode 100644 index 64c1e7807..000000000 --- a/images/shortcuts_group_mglass.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_page.svg b/images/shortcuts_group_page.svg deleted file mode 100644 index 950d28906..000000000 --- a/images/shortcuts_group_page.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_reading.svg b/images/shortcuts_group_reading.svg deleted file mode 100644 index eccd1f81c..000000000 --- a/images/shortcuts_group_reading.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shortcuts_group_visualization.svg b/images/shortcuts_group_visualization.svg deleted file mode 100644 index ee2b6c0be..000000000 --- a/images/shortcuts_group_visualization.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/images/shownCovers.png b/images/shownCovers.png deleted file mode 100644 index 089baaf02..000000000 Binary files a/images/shownCovers.png and /dev/null differ diff --git a/images/sidebar/addLabelIcon.svg b/images/sidebar/addLabelIcon.svg index 732fb362f..bd2f8eded 100644 --- a/images/sidebar/addLabelIcon.svg +++ b/images/sidebar/addLabelIcon.svg @@ -1 +1,11 @@ - \ No newline at end of file + + + + + + + + diff --git a/images/sidebar/addLabelIcon_osx.png b/images/sidebar/addLabelIcon_osx.png deleted file mode 100755 index 3f8a8a51a..000000000 Binary files a/images/sidebar/addLabelIcon_osx.png and /dev/null differ diff --git a/images/sidebar/addLabelIcon_osx@2x.png b/images/sidebar/addLabelIcon_osx@2x.png deleted file mode 100755 index e0e1fea8c..000000000 Binary files a/images/sidebar/addLabelIcon_osx@2x.png and /dev/null differ diff --git a/images/sidebar/addNew_sidebar.svg b/images/sidebar/addNew_sidebar.svg index 4c8b6e421..585a1cbf4 100644 --- a/images/sidebar/addNew_sidebar.svg +++ b/images/sidebar/addNew_sidebar.svg @@ -1 +1,11 @@ - \ No newline at end of file + + + + + + + + diff --git a/images/sidebar/addNew_sidebar_osx.png b/images/sidebar/addNew_sidebar_osx.png deleted file mode 100755 index aa101d8b0..000000000 Binary files a/images/sidebar/addNew_sidebar_osx.png and /dev/null differ diff --git a/images/sidebar/addNew_sidebar_osx@2x.png b/images/sidebar/addNew_sidebar_osx@2x.png deleted file mode 100755 index 30c05b8af..000000000 Binary files a/images/sidebar/addNew_sidebar_osx@2x.png and /dev/null differ diff --git a/images/sidebar/branch-closed.svg b/images/sidebar/branch-closed.svg index ea2269639..ba3cabfb1 100644 --- a/images/sidebar/branch-closed.svg +++ b/images/sidebar/branch-closed.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + diff --git a/images/sidebar/branch-open.svg b/images/sidebar/branch-open.svg index c60277d11..e07abfe75 100644 --- a/images/sidebar/branch-open.svg +++ b/images/sidebar/branch-open.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + diff --git a/images/sidebar/colapse.svg b/images/sidebar/colapse.svg index 3a4f09fe3..fcb89d1cc 100644 --- a/images/sidebar/colapse.svg +++ b/images/sidebar/colapse.svg @@ -1 +1,17 @@ - + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/colapse_osx.png b/images/sidebar/colapse_osx.png deleted file mode 100755 index b5b330083..000000000 Binary files a/images/sidebar/colapse_osx.png and /dev/null differ diff --git a/images/sidebar/colapse_osx@2x.png b/images/sidebar/colapse_osx@2x.png deleted file mode 100755 index 9c746a478..000000000 Binary files a/images/sidebar/colapse_osx@2x.png and /dev/null differ diff --git a/images/sidebar/collapsed_branch_osx.png b/images/sidebar/collapsed_branch_osx.png deleted file mode 100644 index 873c70482..000000000 Binary files a/images/sidebar/collapsed_branch_osx.png and /dev/null differ diff --git a/images/sidebar/collapsed_branch_selected.png b/images/sidebar/collapsed_branch_selected.png deleted file mode 100644 index 9c6c6a6df..000000000 Binary files a/images/sidebar/collapsed_branch_selected.png and /dev/null differ diff --git a/images/sidebar/delete_sidebar.svg b/images/sidebar/delete_sidebar.svg index bc7f2fb71..66c75d57f 100644 --- a/images/sidebar/delete_sidebar.svg +++ b/images/sidebar/delete_sidebar.svg @@ -1 +1,25 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/sidebar/delete_sidebar_osx.png b/images/sidebar/delete_sidebar_osx.png deleted file mode 100755 index 61bf6f9ed..000000000 Binary files a/images/sidebar/delete_sidebar_osx.png and /dev/null differ diff --git a/images/sidebar/delete_sidebar_osx@2x.png b/images/sidebar/delete_sidebar_osx@2x.png deleted file mode 100755 index b15e34f6e..000000000 Binary files a/images/sidebar/delete_sidebar_osx@2x.png and /dev/null differ diff --git a/images/sidebar/expand.svg b/images/sidebar/expand.svg index 4918efd7d..22ee714fe 100644 --- a/images/sidebar/expand.svg +++ b/images/sidebar/expand.svg @@ -1 +1,17 @@ - + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/expand_osx.png b/images/sidebar/expand_osx.png deleted file mode 100755 index 754d92c17..000000000 Binary files a/images/sidebar/expand_osx.png and /dev/null differ diff --git a/images/sidebar/expand_osx@2x.png b/images/sidebar/expand_osx@2x.png deleted file mode 100755 index 7bb3316ea..000000000 Binary files a/images/sidebar/expand_osx@2x.png and /dev/null differ diff --git a/images/sidebar/expanded_branch_osx.png b/images/sidebar/expanded_branch_osx.png deleted file mode 100644 index bc812fc7b..000000000 Binary files a/images/sidebar/expanded_branch_osx.png and /dev/null differ diff --git a/images/sidebar/expanded_branch_selected.png b/images/sidebar/expanded_branch_selected.png deleted file mode 100644 index 896697624..000000000 Binary files a/images/sidebar/expanded_branch_selected.png and /dev/null differ diff --git a/images/sidebar/folder.svg b/images/sidebar/folder.svg index acd1186b8..2cce9a56a 100644 --- a/images/sidebar/folder.svg +++ b/images/sidebar/folder.svg @@ -1 +1,19 @@ - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/folder_finished.svg b/images/sidebar/folder_finished.svg index 7a437f009..7d3aa4615 100644 --- a/images/sidebar/folder_finished.svg +++ b/images/sidebar/folder_finished.svg @@ -1 +1,24 @@ - \ No newline at end of file + + + + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/folder_read_overlay.svg b/images/sidebar/folder_read_overlay.svg new file mode 100644 index 000000000..3b8628e54 --- /dev/null +++ b/images/sidebar/folder_read_overlay.svg @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/images/sidebar/libraryIcon.svg b/images/sidebar/libraryIcon.svg index b9d1deb36..fc7089d40 100644 --- a/images/sidebar/libraryIcon.svg +++ b/images/sidebar/libraryIcon.svg @@ -1 +1,19 @@ - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/libraryIconSelected.svg b/images/sidebar/libraryIconSelected.svg index 032e708ee..1303e5783 100644 --- a/images/sidebar/libraryIconSelected.svg +++ b/images/sidebar/libraryIconSelected.svg @@ -1 +1,13 @@ - + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/libraryIcon_osx.png b/images/sidebar/libraryIcon_osx.png deleted file mode 100644 index ce99dde64..000000000 Binary files a/images/sidebar/libraryIcon_osx.png and /dev/null differ diff --git a/images/sidebar/libraryOptions.svg b/images/sidebar/libraryOptions.svg index f2fddde2f..2bdef9c7f 100644 --- a/images/sidebar/libraryOptions.svg +++ b/images/sidebar/libraryOptions.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + diff --git a/images/sidebar/newLibraryIcon.svg b/images/sidebar/newLibraryIcon.svg index 4c8b6e421..585a1cbf4 100644 --- a/images/sidebar/newLibraryIcon.svg +++ b/images/sidebar/newLibraryIcon.svg @@ -1 +1,11 @@ - \ No newline at end of file + + + + + + + + diff --git a/images/sidebar/newLibraryIcon_osx.png b/images/sidebar/newLibraryIcon_osx.png deleted file mode 100755 index 7c4a5aea2..000000000 Binary files a/images/sidebar/newLibraryIcon_osx.png and /dev/null differ diff --git a/images/sidebar/newLibraryIcon_osx@2x.png b/images/sidebar/newLibraryIcon_osx@2x.png deleted file mode 100755 index 30c05b8af..000000000 Binary files a/images/sidebar/newLibraryIcon_osx@2x.png and /dev/null differ diff --git a/images/sidebar/openLibraryIcon.svg b/images/sidebar/openLibraryIcon.svg index 3e49f2c13..d266567ee 100644 --- a/images/sidebar/openLibraryIcon.svg +++ b/images/sidebar/openLibraryIcon.svg @@ -1 +1,37 @@ - \ No newline at end of file + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/openLibraryIcon_osx.png b/images/sidebar/openLibraryIcon_osx.png deleted file mode 100755 index 0a61bd9aa..000000000 Binary files a/images/sidebar/openLibraryIcon_osx.png and /dev/null differ diff --git a/images/sidebar/openLibraryIcon_osx@2x.png b/images/sidebar/openLibraryIcon_osx@2x.png deleted file mode 100755 index 0875b44dd..000000000 Binary files a/images/sidebar/openLibraryIcon_osx@2x.png and /dev/null differ diff --git a/images/sidebar/renameListIcon.svg b/images/sidebar/renameListIcon.svg index dded4036f..93b8a9666 100644 --- a/images/sidebar/renameListIcon.svg +++ b/images/sidebar/renameListIcon.svg @@ -1 +1,25 @@ - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/renameListIcon_osx.png b/images/sidebar/renameListIcon_osx.png deleted file mode 100755 index 3ed190fd6..000000000 Binary files a/images/sidebar/renameListIcon_osx.png and /dev/null differ diff --git a/images/sidebar/renameListIcon_osx@2x.png b/images/sidebar/renameListIcon_osx@2x.png deleted file mode 100755 index 9a6a25c9d..000000000 Binary files a/images/sidebar/renameListIcon_osx@2x.png and /dev/null differ diff --git a/images/sidebar/setRoot.svg b/images/sidebar/setRoot.svg index 49f3e6e9a..ddf029f34 100644 --- a/images/sidebar/setRoot.svg +++ b/images/sidebar/setRoot.svg @@ -1 +1,38 @@ - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/sidebar/setRoot_osx.png b/images/sidebar/setRoot_osx.png deleted file mode 100755 index a2da070d9..000000000 Binary files a/images/sidebar/setRoot_osx.png and /dev/null differ diff --git a/images/sidebar/setRoot_osx@2x.png b/images/sidebar/setRoot_osx@2x.png deleted file mode 100755 index 5dfcdd991..000000000 Binary files a/images/sidebar/setRoot_osx@2x.png and /dev/null differ diff --git a/images/social_dialog/close.png b/images/social_dialog/close.png deleted file mode 100644 index 28e7c24f6..000000000 Binary files a/images/social_dialog/close.png and /dev/null differ diff --git a/images/social_dialog/facebook.png b/images/social_dialog/facebook.png deleted file mode 100644 index 3d7aa8deb..000000000 Binary files a/images/social_dialog/facebook.png and /dev/null differ diff --git a/images/social_dialog/google+.png b/images/social_dialog/google+.png deleted file mode 100644 index 1d0bc3556..000000000 Binary files a/images/social_dialog/google+.png and /dev/null differ diff --git a/images/social_dialog/icon.png b/images/social_dialog/icon.png deleted file mode 100644 index a15c47f31..000000000 Binary files a/images/social_dialog/icon.png and /dev/null differ diff --git a/images/social_dialog/separator.png b/images/social_dialog/separator.png deleted file mode 100644 index 4a3b73c42..000000000 Binary files a/images/social_dialog/separator.png and /dev/null differ diff --git a/images/social_dialog/shadow.png b/images/social_dialog/shadow.png deleted file mode 100644 index 49b5d588c..000000000 Binary files a/images/social_dialog/shadow.png and /dev/null differ diff --git a/images/social_dialog/twitter.png b/images/social_dialog/twitter.png deleted file mode 100644 index 4a9df502a..000000000 Binary files a/images/social_dialog/twitter.png and /dev/null differ diff --git a/images/speaker.png b/images/speaker.png deleted file mode 100644 index e75be689f..000000000 Binary files a/images/speaker.png and /dev/null differ diff --git a/images/translator/close.svg b/images/translator/close.svg new file mode 100644 index 000000000..26729e51e --- /dev/null +++ b/images/translator/close.svg @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/images/translator/dropDownArrow.svg b/images/translator/dropDownArrow.svg new file mode 100644 index 000000000..46e0d5873 --- /dev/null +++ b/images/translator/dropDownArrow.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/translator/fromTo.svg b/images/translator/fromTo.svg new file mode 100644 index 000000000..53e0843de --- /dev/null +++ b/images/translator/fromTo.svg @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/images/translator/speaker.svg b/images/translator/speaker.svg new file mode 100644 index 000000000..27fe7bf40 --- /dev/null +++ b/images/translator/speaker.svg @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/images/translator/translatorSearch.svg b/images/translator/translatorSearch.svg new file mode 100644 index 000000000..c8fddaef6 --- /dev/null +++ b/images/translator/translatorSearch.svg @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/images/translatorSearch.png b/images/translatorSearch.png deleted file mode 100644 index 066f21e9b..000000000 Binary files a/images/translatorSearch.png and /dev/null differ diff --git a/images/up.png b/images/up.png deleted file mode 100644 index cae28b7e7..000000000 Binary files a/images/up.png and /dev/null differ diff --git a/images/updatingIcon.png b/images/updatingIcon.png deleted file mode 100644 index bb4f6afbd..000000000 Binary files a/images/updatingIcon.png and /dev/null differ diff --git a/images/viewer_toolbar/bookmark.svg b/images/viewer_toolbar/bookmark.svg index 7b33172fe..9f65129c2 100644 --- a/images/viewer_toolbar/bookmark.svg +++ b/images/viewer_toolbar/bookmark.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/bookmark_18x18.svg b/images/viewer_toolbar/bookmark_18x18.svg index edf0e4f81..43fa8da1d 100644 --- a/images/viewer_toolbar/bookmark_18x18.svg +++ b/images/viewer_toolbar/bookmark_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/bookmark_osx.png b/images/viewer_toolbar/bookmark_osx.png deleted file mode 100755 index 42a5f24a5..000000000 Binary files a/images/viewer_toolbar/bookmark_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/bookmark_osx@2x.png b/images/viewer_toolbar/bookmark_osx@2x.png deleted file mode 100644 index 85427aa94..000000000 Binary files a/images/viewer_toolbar/bookmark_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/close.svg b/images/viewer_toolbar/close.svg index 60a87915c..c46bb01ef 100644 --- a/images/viewer_toolbar/close.svg +++ b/images/viewer_toolbar/close.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/close_18x18.svg b/images/viewer_toolbar/close_18x18.svg index 82fad4058..d02a3606a 100644 --- a/images/viewer_toolbar/close_18x18.svg +++ b/images/viewer_toolbar/close_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/close_osx.png b/images/viewer_toolbar/close_osx.png deleted file mode 100755 index 760da5048..000000000 Binary files a/images/viewer_toolbar/close_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/close_osx@2x.png b/images/viewer_toolbar/close_osx@2x.png deleted file mode 100644 index ef3c51c06..000000000 Binary files a/images/viewer_toolbar/close_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/doubleMangaPage.svg b/images/viewer_toolbar/doubleMangaPage.svg index 58493cf4c..d8d4936cb 100644 --- a/images/viewer_toolbar/doubleMangaPage.svg +++ b/images/viewer_toolbar/doubleMangaPage.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/doubleMangaPage_18x18.svg b/images/viewer_toolbar/doubleMangaPage_18x18.svg index 781526a3f..3ce103e01 100644 --- a/images/viewer_toolbar/doubleMangaPage_18x18.svg +++ b/images/viewer_toolbar/doubleMangaPage_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/doubleMangaPage_osx.png b/images/viewer_toolbar/doubleMangaPage_osx.png deleted file mode 100644 index 4e5f241e6..000000000 Binary files a/images/viewer_toolbar/doubleMangaPage_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/doubleMangaPage_osx@2x.png b/images/viewer_toolbar/doubleMangaPage_osx@2x.png deleted file mode 100644 index ffdab7909..000000000 Binary files a/images/viewer_toolbar/doubleMangaPage_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/doublePage.svg b/images/viewer_toolbar/doublePage.svg index c12f5d4d9..0373f631d 100644 --- a/images/viewer_toolbar/doublePage.svg +++ b/images/viewer_toolbar/doublePage.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/doublePage_18x18.svg b/images/viewer_toolbar/doublePage_18x18.svg index c5c60e39b..3a80c5c83 100644 --- a/images/viewer_toolbar/doublePage_18x18.svg +++ b/images/viewer_toolbar/doublePage_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/doublePage_osx.png b/images/viewer_toolbar/doublePage_osx.png deleted file mode 100755 index ed76ee977..000000000 Binary files a/images/viewer_toolbar/doublePage_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/doublePage_osx@2x.png b/images/viewer_toolbar/doublePage_osx@2x.png deleted file mode 100644 index 950fd95fb..000000000 Binary files a/images/viewer_toolbar/doublePage_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/fitToPage.svg b/images/viewer_toolbar/fitToPage.svg index 28b1675a0..4b92c11dd 100644 --- a/images/viewer_toolbar/fitToPage.svg +++ b/images/viewer_toolbar/fitToPage.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/fitToPage_18x18.svg b/images/viewer_toolbar/fitToPage_18x18.svg index 390220d92..fda948446 100644 --- a/images/viewer_toolbar/fitToPage_18x18.svg +++ b/images/viewer_toolbar/fitToPage_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/fitToPage_osx.png b/images/viewer_toolbar/fitToPage_osx.png deleted file mode 100644 index 8afdcdaca..000000000 Binary files a/images/viewer_toolbar/fitToPage_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/fitToPage_osx@2x.png b/images/viewer_toolbar/fitToPage_osx@2x.png deleted file mode 100644 index 739a5a057..000000000 Binary files a/images/viewer_toolbar/fitToPage_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/flow.svg b/images/viewer_toolbar/flow.svg index 779f27d7c..ad0034b15 100644 --- a/images/viewer_toolbar/flow.svg +++ b/images/viewer_toolbar/flow.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/flow_18x18.svg b/images/viewer_toolbar/flow_18x18.svg index 20c060d13..9a4089fe9 100644 --- a/images/viewer_toolbar/flow_18x18.svg +++ b/images/viewer_toolbar/flow_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/flow_osx.png b/images/viewer_toolbar/flow_osx.png deleted file mode 100644 index 3b90b92fb..000000000 Binary files a/images/viewer_toolbar/flow_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/flow_osx@2x.png b/images/viewer_toolbar/flow_osx@2x.png deleted file mode 100644 index eeba6d29f..000000000 Binary files a/images/viewer_toolbar/flow_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/full.svg b/images/viewer_toolbar/full.svg index 10ffa55af..caea60b1c 100644 --- a/images/viewer_toolbar/full.svg +++ b/images/viewer_toolbar/full.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/full_18x18.svg b/images/viewer_toolbar/full_18x18.svg index 2a264091b..751362b8e 100644 --- a/images/viewer_toolbar/full_18x18.svg +++ b/images/viewer_toolbar/full_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/full_osx.png b/images/viewer_toolbar/full_osx.png deleted file mode 100755 index ab8f27662..000000000 Binary files a/images/viewer_toolbar/full_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/full_osx@2x.png b/images/viewer_toolbar/full_osx@2x.png deleted file mode 100644 index 5436dd033..000000000 Binary files a/images/viewer_toolbar/full_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/goto.svg b/images/viewer_toolbar/goto.svg index e2b346abd..3aa3d9ec4 100644 --- a/images/viewer_toolbar/goto.svg +++ b/images/viewer_toolbar/goto.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/goto_18x18.svg b/images/viewer_toolbar/goto_18x18.svg index 1005c9d6c..b03669e4f 100644 --- a/images/viewer_toolbar/goto_18x18.svg +++ b/images/viewer_toolbar/goto_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/goto_osx.png b/images/viewer_toolbar/goto_osx.png deleted file mode 100644 index 75d810cab..000000000 Binary files a/images/viewer_toolbar/goto_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/goto_osx@2x.png b/images/viewer_toolbar/goto_osx@2x.png deleted file mode 100644 index e7d4e2bad..000000000 Binary files a/images/viewer_toolbar/goto_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/help.svg b/images/viewer_toolbar/help.svg index 1a318207d..40dfc1fd2 100644 --- a/images/viewer_toolbar/help.svg +++ b/images/viewer_toolbar/help.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/help_18x18.svg b/images/viewer_toolbar/help_18x18.svg index a665d883a..59d9389e5 100644 --- a/images/viewer_toolbar/help_18x18.svg +++ b/images/viewer_toolbar/help_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/help_osx.png b/images/viewer_toolbar/help_osx.png deleted file mode 100755 index 9cb2574db..000000000 Binary files a/images/viewer_toolbar/help_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/help_osx@2x.png b/images/viewer_toolbar/help_osx@2x.png deleted file mode 100644 index 28865a05c..000000000 Binary files a/images/viewer_toolbar/help_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/info.svg b/images/viewer_toolbar/info.svg index a2ea17257..0175b7934 100644 --- a/images/viewer_toolbar/info.svg +++ b/images/viewer_toolbar/info.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/info_18x18.svg b/images/viewer_toolbar/info_18x18.svg index 013a91ea3..8ef26e484 100644 --- a/images/viewer_toolbar/info_18x18.svg +++ b/images/viewer_toolbar/info_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/info_osx.png b/images/viewer_toolbar/info_osx.png deleted file mode 100755 index f3018893c..000000000 Binary files a/images/viewer_toolbar/info_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/info_osx@2x.png b/images/viewer_toolbar/info_osx@2x.png deleted file mode 100644 index e079aa3d4..000000000 Binary files a/images/viewer_toolbar/info_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/magnifyingGlass.svg b/images/viewer_toolbar/magnifyingGlass.svg index 06d16b1fd..8fd53ea62 100644 --- a/images/viewer_toolbar/magnifyingGlass.svg +++ b/images/viewer_toolbar/magnifyingGlass.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/magnifyingGlass_18x18.svg b/images/viewer_toolbar/magnifyingGlass_18x18.svg index 37610af84..b13536b51 100644 --- a/images/viewer_toolbar/magnifyingGlass_18x18.svg +++ b/images/viewer_toolbar/magnifyingGlass_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/magnifyingGlass_osx.png b/images/viewer_toolbar/magnifyingGlass_osx.png deleted file mode 100755 index ef0a57ad3..000000000 Binary files a/images/viewer_toolbar/magnifyingGlass_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/magnifyingGlass_osx@2x.png b/images/viewer_toolbar/magnifyingGlass_osx@2x.png deleted file mode 100644 index 9748a4b75..000000000 Binary files a/images/viewer_toolbar/magnifyingGlass_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/menuArrow.svg b/images/viewer_toolbar/menuArrow.svg new file mode 100644 index 000000000..077aad90f --- /dev/null +++ b/images/viewer_toolbar/menuArrow.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/images/viewer_toolbar/next.svg b/images/viewer_toolbar/next.svg index 67d8de348..bca7b6514 100644 --- a/images/viewer_toolbar/next.svg +++ b/images/viewer_toolbar/next.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/next_18x18.svg b/images/viewer_toolbar/next_18x18.svg index 76993a677..78bc7ef7e 100644 --- a/images/viewer_toolbar/next_18x18.svg +++ b/images/viewer_toolbar/next_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/next_osx.png b/images/viewer_toolbar/next_osx.png deleted file mode 100755 index eb76ac9a2..000000000 Binary files a/images/viewer_toolbar/next_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/next_osx@2x.png b/images/viewer_toolbar/next_osx@2x.png deleted file mode 100644 index 9a32ec514..000000000 Binary files a/images/viewer_toolbar/next_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/open.svg b/images/viewer_toolbar/open.svg index 66cc3bd6e..88ae9d84e 100644 --- a/images/viewer_toolbar/open.svg +++ b/images/viewer_toolbar/open.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openFolder.svg b/images/viewer_toolbar/openFolder.svg index 9ebf90364..b76891912 100644 --- a/images/viewer_toolbar/openFolder.svg +++ b/images/viewer_toolbar/openFolder.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openFolder_18x18.svg b/images/viewer_toolbar/openFolder_18x18.svg index dc6a2221f..f68344222 100644 --- a/images/viewer_toolbar/openFolder_18x18.svg +++ b/images/viewer_toolbar/openFolder_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openFolder_osx.png b/images/viewer_toolbar/openFolder_osx.png deleted file mode 100644 index 0ea0222fd..000000000 Binary files a/images/viewer_toolbar/openFolder_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/openFolder_osx@2x.png b/images/viewer_toolbar/openFolder_osx@2x.png deleted file mode 100644 index 4eccb17e3..000000000 Binary files a/images/viewer_toolbar/openFolder_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/openNext.svg b/images/viewer_toolbar/openNext.svg index b35a8a55b..55d0a52e8 100644 --- a/images/viewer_toolbar/openNext.svg +++ b/images/viewer_toolbar/openNext.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openNext_18x18.svg b/images/viewer_toolbar/openNext_18x18.svg index a3e827bfb..ea6143324 100644 --- a/images/viewer_toolbar/openNext_18x18.svg +++ b/images/viewer_toolbar/openNext_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openNext_osx.png b/images/viewer_toolbar/openNext_osx.png deleted file mode 100644 index 120e83b62..000000000 Binary files a/images/viewer_toolbar/openNext_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/openNext_osx@2x.png b/images/viewer_toolbar/openNext_osx@2x.png deleted file mode 100644 index 4f2fa26ec..000000000 Binary files a/images/viewer_toolbar/openNext_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/openPrevious.svg b/images/viewer_toolbar/openPrevious.svg index cc1a77e60..5595b3a35 100644 --- a/images/viewer_toolbar/openPrevious.svg +++ b/images/viewer_toolbar/openPrevious.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openPrevious_18x18.svg b/images/viewer_toolbar/openPrevious_18x18.svg index d6fe899bb..c8d6100f6 100644 --- a/images/viewer_toolbar/openPrevious_18x18.svg +++ b/images/viewer_toolbar/openPrevious_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/openPrevious_osx.png b/images/viewer_toolbar/openPrevious_osx.png deleted file mode 100644 index d68d878e0..000000000 Binary files a/images/viewer_toolbar/openPrevious_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/openPrevious_osx@2x.png b/images/viewer_toolbar/openPrevious_osx@2x.png deleted file mode 100644 index 7cc39da2e..000000000 Binary files a/images/viewer_toolbar/openPrevious_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/open_18x18.svg b/images/viewer_toolbar/open_18x18.svg index 91c4d420c..cb8353bb5 100644 --- a/images/viewer_toolbar/open_18x18.svg +++ b/images/viewer_toolbar/open_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/open_osx.png b/images/viewer_toolbar/open_osx.png deleted file mode 100644 index 36a97c13a..000000000 Binary files a/images/viewer_toolbar/open_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/open_osx@2x.png b/images/viewer_toolbar/open_osx@2x.png deleted file mode 100644 index 5ad3413a7..000000000 Binary files a/images/viewer_toolbar/open_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/options.svg b/images/viewer_toolbar/options.svg index eb25e4de7..9b8005c7d 100644 --- a/images/viewer_toolbar/options.svg +++ b/images/viewer_toolbar/options.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/options_1.svg b/images/viewer_toolbar/options_1.svg index eb25e4de7..9b8005c7d 100644 --- a/images/viewer_toolbar/options_1.svg +++ b/images/viewer_toolbar/options_1.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/options_18x18.svg b/images/viewer_toolbar/options_18x18.svg index f11fb32cb..3a84feb81 100644 --- a/images/viewer_toolbar/options_18x18.svg +++ b/images/viewer_toolbar/options_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/options_18x18_1.svg b/images/viewer_toolbar/options_18x18_1.svg index f11fb32cb..3a84feb81 100644 --- a/images/viewer_toolbar/options_18x18_1.svg +++ b/images/viewer_toolbar/options_18x18_1.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/options_osx.png b/images/viewer_toolbar/options_osx.png deleted file mode 100755 index 30be20e5c..000000000 Binary files a/images/viewer_toolbar/options_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/options_osx@2x.png b/images/viewer_toolbar/options_osx@2x.png deleted file mode 100644 index 0aff0e1fe..000000000 Binary files a/images/viewer_toolbar/options_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/previous.svg b/images/viewer_toolbar/previous.svg index f672d5a9f..1222a6c2b 100644 --- a/images/viewer_toolbar/previous.svg +++ b/images/viewer_toolbar/previous.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/previous_18x18.svg b/images/viewer_toolbar/previous_18x18.svg index 9b3b1ce18..18fb0d7e3 100644 --- a/images/viewer_toolbar/previous_18x18.svg +++ b/images/viewer_toolbar/previous_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/previous_osx.png b/images/viewer_toolbar/previous_osx.png deleted file mode 100755 index 6ec8b86ae..000000000 Binary files a/images/viewer_toolbar/previous_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/previous_osx@2x.png b/images/viewer_toolbar/previous_osx@2x.png deleted file mode 100644 index c65f87cce..000000000 Binary files a/images/viewer_toolbar/previous_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/rotateL.svg b/images/viewer_toolbar/rotateL.svg index bbba31fa3..5e06ceb50 100644 --- a/images/viewer_toolbar/rotateL.svg +++ b/images/viewer_toolbar/rotateL.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/rotateL_18x18.svg b/images/viewer_toolbar/rotateL_18x18.svg index 9a4bf7489..a8e93ff16 100644 --- a/images/viewer_toolbar/rotateL_18x18.svg +++ b/images/viewer_toolbar/rotateL_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/rotateL_osx.png b/images/viewer_toolbar/rotateL_osx.png deleted file mode 100644 index ecd5768bd..000000000 Binary files a/images/viewer_toolbar/rotateL_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/rotateL_osx@2x.png b/images/viewer_toolbar/rotateL_osx@2x.png deleted file mode 100644 index 5e296332e..000000000 Binary files a/images/viewer_toolbar/rotateL_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/rotateR.svg b/images/viewer_toolbar/rotateR.svg index 2b24771e3..9eaa50d65 100644 --- a/images/viewer_toolbar/rotateR.svg +++ b/images/viewer_toolbar/rotateR.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/rotateR_18x18.svg b/images/viewer_toolbar/rotateR_18x18.svg index 8c7464a73..21ac8af27 100644 --- a/images/viewer_toolbar/rotateR_18x18.svg +++ b/images/viewer_toolbar/rotateR_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/rotateR_osx.png b/images/viewer_toolbar/rotateR_osx.png deleted file mode 100644 index 4f39d11f3..000000000 Binary files a/images/viewer_toolbar/rotateR_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/rotateR_osx@2x.png b/images/viewer_toolbar/rotateR_osx@2x.png deleted file mode 100644 index 18beffc7c..000000000 Binary files a/images/viewer_toolbar/rotateR_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/save.svg b/images/viewer_toolbar/save.svg index fb24afb54..179403c9d 100644 --- a/images/viewer_toolbar/save.svg +++ b/images/viewer_toolbar/save.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/save_18x18.svg b/images/viewer_toolbar/save_18x18.svg index 23b312248..b15d15d57 100644 --- a/images/viewer_toolbar/save_18x18.svg +++ b/images/viewer_toolbar/save_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/save_osx.png b/images/viewer_toolbar/save_osx.png deleted file mode 100644 index a0b1bd2f7..000000000 Binary files a/images/viewer_toolbar/save_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/save_osx@2x.png b/images/viewer_toolbar/save_osx@2x.png deleted file mode 100644 index ed23db668..000000000 Binary files a/images/viewer_toolbar/save_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/shortcuts.svg b/images/viewer_toolbar/shortcuts.svg index 4b798fb02..ec1e84d4a 100644 --- a/images/viewer_toolbar/shortcuts.svg +++ b/images/viewer_toolbar/shortcuts.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/shortcuts_18x18.svg b/images/viewer_toolbar/shortcuts_18x18.svg index 1036b8862..4768fde68 100644 --- a/images/viewer_toolbar/shortcuts_18x18.svg +++ b/images/viewer_toolbar/shortcuts_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/shortcuts_osx.png b/images/viewer_toolbar/shortcuts_osx.png deleted file mode 100755 index b57f7ae1b..000000000 Binary files a/images/viewer_toolbar/shortcuts_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/shortcuts_osx@2x.png b/images/viewer_toolbar/shortcuts_osx@2x.png deleted file mode 100644 index 7e8e5f923..000000000 Binary files a/images/viewer_toolbar/shortcuts_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/showBookmarks.svg b/images/viewer_toolbar/showBookmarks.svg index 33a4f6e5e..aaf160c26 100644 --- a/images/viewer_toolbar/showBookmarks.svg +++ b/images/viewer_toolbar/showBookmarks.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/showBookmarks_18x18.svg b/images/viewer_toolbar/showBookmarks_18x18.svg index 1a94eba9d..3514a4fb6 100644 --- a/images/viewer_toolbar/showBookmarks_18x18.svg +++ b/images/viewer_toolbar/showBookmarks_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/showBookmarks_osx.png b/images/viewer_toolbar/showBookmarks_osx.png deleted file mode 100755 index 34d3b5acd..000000000 Binary files a/images/viewer_toolbar/showBookmarks_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/showBookmarks_osx@2x.png b/images/viewer_toolbar/showBookmarks_osx@2x.png deleted file mode 100644 index f7cd50146..000000000 Binary files a/images/viewer_toolbar/showBookmarks_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/toContinuousScroll.svg b/images/viewer_toolbar/toContinuousScroll.svg new file mode 100644 index 000000000..17ded9c24 --- /dev/null +++ b/images/viewer_toolbar/toContinuousScroll.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/images/viewer_toolbar/toContinuousScroll_18x18.svg b/images/viewer_toolbar/toContinuousScroll_18x18.svg new file mode 100644 index 000000000..76040304a --- /dev/null +++ b/images/viewer_toolbar/toContinuousScroll_18x18.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/images/viewer_toolbar/toHeight.svg b/images/viewer_toolbar/toHeight.svg index 4f63694e6..4f8fa86b4 100644 --- a/images/viewer_toolbar/toHeight.svg +++ b/images/viewer_toolbar/toHeight.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/toHeight_18x18.svg b/images/viewer_toolbar/toHeight_18x18.svg index 6c9729bbd..abe065f90 100644 --- a/images/viewer_toolbar/toHeight_18x18.svg +++ b/images/viewer_toolbar/toHeight_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/toHeight_osx.png b/images/viewer_toolbar/toHeight_osx.png deleted file mode 100755 index 96b85efc5..000000000 Binary files a/images/viewer_toolbar/toHeight_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/toHeight_osx@2x.png b/images/viewer_toolbar/toHeight_osx@2x.png deleted file mode 100644 index b4eda55fa..000000000 Binary files a/images/viewer_toolbar/toHeight_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/toWidth.svg b/images/viewer_toolbar/toWidth.svg index 62a6c8462..868b27e40 100644 --- a/images/viewer_toolbar/toWidth.svg +++ b/images/viewer_toolbar/toWidth.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/toWidthSlider_osx.png b/images/viewer_toolbar/toWidthSlider_osx.png deleted file mode 100644 index 469b702bc..000000000 Binary files a/images/viewer_toolbar/toWidthSlider_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/toWidthSlider_osx@2x.png b/images/viewer_toolbar/toWidthSlider_osx@2x.png deleted file mode 100644 index a952762e4..000000000 Binary files a/images/viewer_toolbar/toWidthSlider_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/toWidth_18x18.svg b/images/viewer_toolbar/toWidth_18x18.svg index f796a3da6..e8eef8fde 100644 --- a/images/viewer_toolbar/toWidth_18x18.svg +++ b/images/viewer_toolbar/toWidth_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/toWidth_osx.png b/images/viewer_toolbar/toWidth_osx.png deleted file mode 100755 index 988348c33..000000000 Binary files a/images/viewer_toolbar/toWidth_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/toWidth_osx@2x.png b/images/viewer_toolbar/toWidth_osx@2x.png deleted file mode 100644 index cea0b4bef..000000000 Binary files a/images/viewer_toolbar/toWidth_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/translator.svg b/images/viewer_toolbar/translator.svg index 6ff468e29..b2f201dca 100644 --- a/images/viewer_toolbar/translator.svg +++ b/images/viewer_toolbar/translator.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/translator_18x18.svg b/images/viewer_toolbar/translator_18x18.svg index d78e22607..9f316dc25 100644 --- a/images/viewer_toolbar/translator_18x18.svg +++ b/images/viewer_toolbar/translator_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/translator_osx.png b/images/viewer_toolbar/translator_osx.png deleted file mode 100755 index dc30f36f1..000000000 Binary files a/images/viewer_toolbar/translator_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/translator_osx@2x.png b/images/viewer_toolbar/translator_osx@2x.png deleted file mode 100644 index 16c641c45..000000000 Binary files a/images/viewer_toolbar/translator_osx@2x.png and /dev/null differ diff --git a/images/viewer_toolbar/zoom.svg b/images/viewer_toolbar/zoom.svg index 5f0856031..79252ee5d 100644 --- a/images/viewer_toolbar/zoom.svg +++ b/images/viewer_toolbar/zoom.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/zoom_18x18.svg b/images/viewer_toolbar/zoom_18x18.svg index 270470fad..c7db044f8 100644 --- a/images/viewer_toolbar/zoom_18x18.svg +++ b/images/viewer_toolbar/zoom_18x18.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/images/viewer_toolbar/zoom_osx.png b/images/viewer_toolbar/zoom_osx.png deleted file mode 100644 index 9705a7e33..000000000 Binary files a/images/viewer_toolbar/zoom_osx.png and /dev/null differ diff --git a/images/viewer_toolbar/zoom_osx@2x.png b/images/viewer_toolbar/zoom_osx@2x.png deleted file mode 100644 index 6d9b428f3..000000000 Binary files a/images/viewer_toolbar/zoom_osx@2x.png and /dev/null differ diff --git a/images/whats_new/whatsnew_header.svg b/images/whats_new/whatsnew_header.svg index 0cc109c3d..2a03d852e 100644 --- a/images/whats_new/whatsnew_header.svg +++ b/images/whats_new/whatsnew_header.svg @@ -1,28 +1,28 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/release/server/docroot/css/reset.css b/release/server/docroot/css/reset.css deleted file mode 100644 index b1f6c072a..000000000 --- a/release/server/docroot/css/reset.css +++ /dev/null @@ -1,46 +0,0 @@ -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td -{ - margin: 0; - padding: 0; - border: 0; - outline: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; -} -/* remember to define focus styles! */ -:focus -{ - outline: 0; -} -body -{ - line-height: 1; - color: black; -} -ol, ul -{ - list-style: none; -} -/* tables still need 'cellspacing="0"' in the markup */ -table, td, tr -{ - border: 0; - border-collapse: separate; - border-spacing: 0; -} -caption, th, td -{ - text-align: left; - font-weight: normal; -} -blockquote:before, blockquote:after, q:before, q:after -{ - content: ""; -} -blockquote, q -{ - quotes: "" ""; -} diff --git a/release/server/docroot/css/styles_ipad.css b/release/server/docroot/css/styles_ipad.css deleted file mode 100644 index d14b3cfb7..000000000 --- a/release/server/docroot/css/styles_ipad.css +++ /dev/null @@ -1,466 +0,0 @@ -body{ - background-color: #F5F5F5; - font-family: Arial, Helvetica, sans-serif; -} - -/* libraries */ -#contentLibraries{ - width: 400px; - border: 1px solid #C6C6C6; - background-color: white; - margin-left: auto; - margin-right: auto; - margin-top: 9px; -} - -#contentLibraries .library-icon -{ - float: left; - background-color: white; - height: 18px; - padding: 11px 19px 10px 19px; - display:block; -} - -#contentLibraries li -{ - border-bottom: 1px solid #e2e2e2; - position: relative; - list-style: none; -} - -#contentLibraries li:last-child -{ - border: none; -} - -#contentLibraries .library-link -{ - width: 311px; - height: 28px; - border: none; - padding: 11px 0 0 0px; - background-color: white; - display: block; - float:left; - font-family: Arial; - font-size: 16px; - text-decoration: none; - color: #525252 ; - overflow: hidden; -} - - #contentLibraries a -{ - position: absolute; - height: 39px; - width: 100%; - z-index: 10; - display: block; - top 0; - text-decoration: none; -} - -#contentLibraries .library-indicator -{ - float: left; - background-color: white; - height: 8px; - padding: 16px 16px 15px 16px; - display:block; -} - - -#content h1 -{ - color: #292929; - text-align: center; - font-size: 21px; -} - -#contentLibraries h1{ - color: #292929; - text-align: center; - border-bottom: 1px solid #C6C6C6; - font-size: 21px; - padding: 15px 0 16px 0; -} - -#folder-header -{ - position: fixed; - width: 100%; - height: 88px; - background-color: rgba(255,255,255,0.9); - border-bottom: 1px solid #C6C6C6; - z-index: 999; -} - -#folder-subheader1 -{ - width: 100%; - height: 40px; - margin-top: 18px; - -} - -#folder-subheader2 -{ - width: 100%; - padding-left: 16px; -} - -#topIndex -{ - position: absolute; - left: 16px; - top: 19px; -} - -#topIndex a -{ - float: left; -} - -.indicator { - margin: 0 9px; -} - -.path { - text-decoration: none; - color: #5C5C5C; - font-family: Arial, Helvetica; - font-size: 15px; - -} - -#header-combos -{ - position: absolute; - right: 15px; - top: 15px; - color: #a3a3a3; - width: 160px; -} - -#topIndex .next{ - width: 25px; - height: 19px; - border: none; - margin: 0 21px 4px 0; - padding: 5px 0 0 0; - display: block; - background: url("/images/next.png") no-repeat scroll 0 0 transparent; - background-size: 25px 19px; - padding: 0; - text-indent: -99999px; -} - -#topIndex .previous{ - width: 25px; - height: 19px; - border: none; - margin: 0 14px 4px 0; - padding: 5px 0 0 0; - display: block; - background: url("/images/prev.png") no-repeat scroll 0 0 transparent; - background-size: 25px 19px; - padding: 0; - text-indent: -99999px; -} - -#topIndex .up{ - width: 15px; - height: 19px; - border: none; - background: url("/images/up.png") no-repeat scroll 0 0 transparent; - background-size: 15px 19px; - color: #FFF; - display: block; - text-indent: -99999px; -} - -#itemContainer li -{ -float: left; -width: 242px; -height: 120px; -border: 1px solid #E2E2E2; -margin: 9px 9px 0px 0; -background-color: white; -overflow: hidden; -position: relative; -} - -.folderContent -{ - padding-top: 90px; - padding-left: 9px; -} -/* hasta aquí */ - -.folder -{ -float: left; - -} - -.cover -{ -float: left; -overflow: hidden; -} - -.mark -{ - position: absolute; - top: 0px; - margin-left: 55px; -} - -.info -{ -padding: 8px 0px 0px 0px; -float: left; -position: relative; -height: 115px; -width: 158px; - -} - -.buttons -{ - position:absolute; - bottom:0px; - left:0px; - border-top: 1px solid #e2e2e2; - padding-top: 3px; - height: 25px; - width: 162px; - font-family: Arial; - color: #6e6e6e; - font-size: 10px; -} - -.elementInfo -{ - position:absolute; - bottom:24px; - padding-top: 3px; - height: 25px; - width: 162px; - font-family: Arial; - color: #adadad; - font-size: 10px; -} - -.numPages -{ - float: left; - padding-left:8px; -} - -.comicSize -{ - float: right; - padding-right: 9px; -} - - - -#itemContainer a -{ - text-decoration: none; - - -} - -.browseButton -{ - width: 60px; - background: url("/images/browse.png") no-repeat scroll 0 0 transparent; - background-position: 1px 6px; - background-size: 7px 7px; - border: none; - text-align:right; - display: block; - float: right; - padding: 4px 10px 0 0; - color: #6e6e6e; -} - -.importButton -{ - width: 60px; - background: url("/images/download.png") no-repeat scroll 0 0 transparent; - background-position: 3px 5px; - background-size: 7px 8px; - border: none; - text-align:left; - display: block; - float: left; - margin: 0 0 0 4px; - padding: 4px 0 0 16px; - color: #6e6e6e; -} - -.readButton -{ - width: 60px; - background: url("/images/read.png") no-repeat scroll 0 0 transparent; - background-position: 18px 5px; - background-size: 7px 9px; - border: none; - text-align:right; - display: block; - float: right; - padding: 4px 10px 0 0; - color: #6e6e6e; -} - -.importedButton -{ - width: 60px; - background: url("/images/imported.png") no-repeat scroll 0 0 transparent; - background-position: 2px 6px; - background-size: 8px 6px; - border: none; - text-align:left; - display: block; - float: left; - margin: 0 0 0 4px; - padding: 4px 0 0 16px; - color: #6e6e6e; -} - - -#indexes{ - border-top: 1px solid #C6C6C6; - background-color: white; - padding: 0px; - margin: 9px 0 0 0; -} - -.index{ - background-color: white; - margin: 9px 0 9px 0; -} - - -#alphaIndex a, #pageIndex a{ - width: 29px; - height: 24px; - border: none; - margin: 0 0 9px 9px; - padding: 5px 0 0 0px; - color: #5C5C5C; - font-size: 20px; - text-align: center; - display: block; - text-decoration: none; - font-family: Arial; - border: 1px solid #E2E2E2; - text-align:center; -} - -#alphaIndex li, #pageIndex li{ - float: left; -} - -#pageIndex .current{ - color: white; - background-color: #A2A2A2; - border: 1px solid #A2A2A2; - -} - - #content h2, #contentLibraries h2{ - color: #000; - font-weight: bold; - font-size: 12px; - margin: 0 0 16px 0; - } - - .inputs_login{ - width: 256px; - height: 64px; - background: url("/images/fnd_inputs.jpg") no-repeat scroll 0 0 #FFF; - margin: 0 0 18px 0; - } - .username{ - width: 200px; - height: 24px; - background: url("/images/fnd_input_username.jpg") no-repeat scroll 0 0 #2b2b2b; - border: none; - padding: 0 0 0 44px; - margin: 5px 0 6px 8px; - font-size: 14px; - color: #6e6e6e; - } - .pass{ - width: 200px; - height: 24px; - background: url("/images/fnd_input_pass.jpg") no-repeat scroll 0 0 #2b2b2b; - border: none; - padding: 0 0 0 44px; - margin: 0 0 0 8px; - font-size: 14px; - color: #6e6e6e; - } - .button_sign{ - width: 86px; - height: 30px; - background: url("/images/bt_login.jpg") no-repeat scroll 0 0 transparent; - border: none; - margin: 0; - padding: 0; - color: #FFF; - font-size: 14px; - float: left; - } - .infor{ - color: #666; - font-size: 8px; - float: left; - width: 112px; - margin: 0 0 0 8px; - line-height: 120%; - } - -.clear{ - height: 2px; - clear: both; -} - -.title{ - font-family: Arial; - font-size: 12px; - margin: 0 0 0 6px; - color: #555555 ; - overflow: hidden; - word-wrap: break-word; - height: 80px; - text-decoration: none; -} - -#indexalpha, #indexnumber{ - - -webkit-appearance: none; - background-color: rgba(255,255,255,0); - border-radius: 0px; - border: none; - color: #a3a3a3; - font-size: 16px; - font-family: Arial, Helvetica; - height: 30px; - margin: 0 0 0 10px; - padding:0; - float: right; -} - -.comboIndicator { - float: right; - padding: 14px 0 0 0; - margin: 0 0 0 4px; - width: 5px; -} \ No newline at end of file diff --git a/release/server/docroot/css/styles_iphone.css b/release/server/docroot/css/styles_iphone.css deleted file mode 100644 index 109b11554..000000000 --- a/release/server/docroot/css/styles_iphone.css +++ /dev/null @@ -1,463 +0,0 @@ -body{ - background-color: #F5F5F5; - font-family: Arial, Helvetica, sans-serif; -} - -/* libraries */ -#contentLibraries{ - border: 1px solid #C6C6C6; - background-color: white; - margin-left: 20px; - margin-right: 20px; - margin-top: 9px; -} - -#contentLibraries .library-icon -{ - float: left; - background-color: white; - height: 18px; - padding: 11px 19px 10px 19px; - display:block; -} - -#contentLibraries li -{ - border-bottom: 1px solid #e2e2e2; - position: relative; - list-style: none; -} - -#contentLibraries li:last-child -{ - border: none; -} - -#contentLibraries .library-link -{ - width: 65%; - height: 28px; - border: none; - padding: 11px 0 0 0px; - background-color: white; - display: block; - float:left; - font-family: Arial; - font-size: 16px; - text-decoration: none; - color: #525252 ; - overflow: hidden; -} - - #contentLibraries a -{ - position: absolute; - height: 39px; - width: 100%; - z-index: 10; - display: block; - top 0; - text-decoration: none; -} - -#contentLibraries .library-indicator -{ - float: right; - background-color: white; - height: 8px; - padding: 16px 16px 15px 16px; - display:block; -} - - -#content h1 -{ - color: #292929; - text-align: center; - font-size: 21px; -} - -#contentLibraries h1{ - color: #292929; - text-align: center; - border-bottom: 1px solid #C6C6C6; - font-size: 21px; - padding: 15px 0 16px 0; -} - -#folder-header -{ - position: fixed; - width: 100%; - height: 88px; - background-color: rgba(255,255,255,0.9); - border-bottom: 1px solid #C6C6C6; - z-index: 999; -} - -#folder-subheader1 -{ - width: 100%; - height: 40px; - margin-top: 18px; - -} - -#folder-subheader2 -{ - width: 100%; - padding-left: 16px; -} - -#topIndex -{ - position: absolute; - left: 16px; - top: 19px; -} - -#topIndex a -{ - float: left; -} - -.indicator { - margin: 0 5px; -} - -.path { - text-decoration: none; - color: #5C5C5C; - font-family: Arial, Helvetica; - font-size: 15px; - -} - -#header-combos -{ - position: absolute; - right: 10px; - top: 15px; - color: #a3a3a3; - width: 160px; -} - -#topIndex .next{ - width: 25px; - height: 19px; - border: none; - margin: 0 21px 4px 0; - padding: 5px 0 0 0; - display: block; - background: url("/images/next.png") no-repeat scroll 0 0 transparent; - background-size: 25px 19px; - padding: 0; - text-indent: -99999px; -} - -#topIndex .previous{ - width: 25px; - height: 19px; - border: none; - margin: 0 14px 4px 0; - padding: 5px 0 0 0; - display: block; - background: url("/images/prev.png") no-repeat scroll 0 0 transparent; - background-size: 25px 19px; - padding: 0; - text-indent: -99999px; -} - -#topIndex .up{ - width: 15px; - height: 19px; - border: none; - background: url("/images/up.png") no-repeat scroll 0 0 transparent; - background-size: 15px 19px; - color: #FFF; - display: block; - text-indent: -99999px; -} - -#itemContainer li -{ - -height: 120px; -border: 1px solid #E2E2E2; -margin: 9px 10px 0px 10px; -background-color: white; -overflow: hidden; -position: relative; -} - -.folderContent -{ - padding-top: 90px; -} -/* hasta aquí */ - -.folder -{ -float: left; - -} - -.cover -{ -float: left; -overflow: hidden; -} - -.mark -{ - position: absolute; - top: 0px; - margin-left: 55px; -} - -.info -{ -padding: 8px 0px 0px 0px; - -position: relative; -height: 115px; - -padding-left: 82px; -} - -.buttons -{ - position:absolute; - bottom:0px; - left:80px; - right: 0px; - border-top: 1px solid #e2e2e2; - padding-top: 3px; - height: 25px; - font-family: Arial; - color: #6e6e6e; - font-size: 10px; -} - -.elementInfo -{ - position:absolute; - bottom:24px; - padding-top: 3px; - height: 25px; - width: 100%; - font-family: Arial; - color: #adadad; - font-size: 10px; -} - -.numPages -{ - float: left; - padding-left:8px; -} - -.comicSize -{ - float: right; - padding-right: 9px; -} - - - -#itemContainer a -{ - text-decoration: none; - - -} - -.browseButton -{ - width: 60px; - background: url("/images/browse.png") no-repeat scroll 0 0 transparent; - background-position: 1px 6px; - background-size: 7px 7px; - border: none; - text-align:right; - display: block; - float: right; - padding: 4px 10px 0 0; - color: #6e6e6e; -} - -.importButton -{ - width: 60px; - background: url("/images/download.png") no-repeat scroll 0 0 transparent; - background-position: 3px 5px; - background-size: 7px 8px; - border: none; - text-align:left; - display: block; - float: left; - margin: 0 0 0 4px; - padding: 4px 0 0 16px; - color: #6e6e6e; -} - -.readButton -{ - width: 60px; - background: url("/images/read.png") no-repeat scroll 0 0 transparent; - background-position: 18px 5px; - background-size: 7px 9px; - border: none; - text-align:right; - display: block; - float: right; - padding: 4px 10px 0 0; - color: #6e6e6e; -} - -.importedButton -{ - width: 60px; - background: url("/images/imported.png") no-repeat scroll 0 0 transparent; - background-position: 2px 6px; - background-size: 8px 6px; - border: none; - text-align:left; - display: block; - float: left; - margin: 0 0 0 4px; - padding: 4px 0 0 16px; - color: #6e6e6e; -} - - -#indexes{ - border-top: 1px solid #C6C6C6; - background-color: white; - padding: 0px; - margin: 9px 0 0 0; -} - -.index{ - background-color: white; - margin: 9px 0 9px 0; -} - - -#alphaIndex a, #pageIndex a{ - width: 29px; - height: 24px; - border: none; - margin: 0 0 9px 9px; - padding: 5px 0 0 0px; - color: #5C5C5C; - font-size: 20px; - text-align: center; - display: block; - text-decoration: none; - font-family: Arial; - border: 1px solid #E2E2E2; - text-align:center; -} - -#alphaIndex li, #pageIndex li{ - float: left; -} - -#pageIndex .current{ - color: white; - background-color: #A2A2A2; - border: 1px solid #A2A2A2; - -} - - #content h2, #contentLibraries h2{ - color: #000; - font-weight: bold; - font-size: 12px; - margin: 0 0 16px 0; - } - - .inputs_login{ - width: 256px; - height: 64px; - background: url("/images/fnd_inputs.jpg") no-repeat scroll 0 0 #FFF; - margin: 0 0 18px 0; - } - .username{ - width: 200px; - height: 24px; - background: url("/images/fnd_input_username.jpg") no-repeat scroll 0 0 #2b2b2b; - border: none; - padding: 0 0 0 44px; - margin: 5px 0 6px 8px; - font-size: 14px; - color: #6e6e6e; - } - .pass{ - width: 200px; - height: 24px; - background: url("/images/fnd_input_pass.jpg") no-repeat scroll 0 0 #2b2b2b; - border: none; - padding: 0 0 0 44px; - margin: 0 0 0 8px; - font-size: 14px; - color: #6e6e6e; - } - .button_sign{ - width: 86px; - height: 30px; - background: url("/images/bt_login.jpg") no-repeat scroll 0 0 transparent; - border: none; - margin: 0; - padding: 0; - color: #FFF; - font-size: 14px; - float: left; - } - .infor{ - color: #666; - font-size: 8px; - float: left; - width: 112px; - margin: 0 0 0 8px; - line-height: 120%; - } - -.clear{ - height: 2px; - clear: both; -} - -.title{ - font-family: Arial; - font-size: 12px; - margin: 0 0 0 6px; - color: #555555 ; - overflow: hidden; - word-wrap: break-word; - height: 65px; - text-decoration: none; -} - -#indexalpha, #indexnumber{ - - -webkit-appearance: none; - background-color: rgba(255,255,255,0); - border-radius: 0px; - border: none; - color: #a3a3a3; - font-size: 16px; - font-family: Arial, Helvetica; - height: 30px; - margin: 0 0 0 10px; - padding:0; - float: right; -} - -.comboIndicator { - float: right; - padding: 14px 0 0 0; - margin: 0 0 0 4px; - width: 5px; -} \ No newline at end of file diff --git a/release/server/docroot/images/browse.png b/release/server/docroot/images/browse.png deleted file mode 100644 index 9043aa9d9..000000000 Binary files a/release/server/docroot/images/browse.png and /dev/null differ diff --git a/release/server/docroot/images/browse@2x.png b/release/server/docroot/images/browse@2x.png deleted file mode 100644 index 06d5f0580..000000000 Binary files a/release/server/docroot/images/browse@2x.png and /dev/null differ diff --git a/release/server/docroot/images/combo.png b/release/server/docroot/images/combo.png deleted file mode 100644 index 54edc9faf..000000000 Binary files a/release/server/docroot/images/combo.png and /dev/null differ diff --git a/release/server/docroot/images/combo@2x.png b/release/server/docroot/images/combo@2x.png deleted file mode 100644 index 39e5c7009..000000000 Binary files a/release/server/docroot/images/combo@2x.png and /dev/null differ diff --git a/release/server/docroot/images/download.png b/release/server/docroot/images/download.png deleted file mode 100644 index 10b43d66b..000000000 Binary files a/release/server/docroot/images/download.png and /dev/null differ diff --git a/release/server/docroot/images/download@2x.png b/release/server/docroot/images/download@2x.png deleted file mode 100644 index 98c6ae38f..000000000 Binary files a/release/server/docroot/images/download@2x.png and /dev/null differ diff --git a/release/server/docroot/images/f.png b/release/server/docroot/images/f.png deleted file mode 100644 index 32fb38677..000000000 Binary files a/release/server/docroot/images/f.png and /dev/null differ diff --git a/release/server/docroot/images/f@2x.png b/release/server/docroot/images/f@2x.png deleted file mode 100644 index e388d804f..000000000 Binary files a/release/server/docroot/images/f@2x.png and /dev/null differ diff --git a/release/server/docroot/images/imported.png b/release/server/docroot/images/imported.png deleted file mode 100644 index 1eaf45d4e..000000000 Binary files a/release/server/docroot/images/imported.png and /dev/null differ diff --git a/release/server/docroot/images/imported@2x.png b/release/server/docroot/images/imported@2x.png deleted file mode 100644 index 41b9ad4e9..000000000 Binary files a/release/server/docroot/images/imported@2x.png and /dev/null differ diff --git a/release/server/docroot/images/indicator.png b/release/server/docroot/images/indicator.png deleted file mode 100644 index 138c77a84..000000000 Binary files a/release/server/docroot/images/indicator.png and /dev/null differ diff --git a/release/server/docroot/images/indicator@2x.png b/release/server/docroot/images/indicator@2x.png deleted file mode 100644 index 9f30e7041..000000000 Binary files a/release/server/docroot/images/indicator@2x.png and /dev/null differ diff --git a/release/server/docroot/images/library.png b/release/server/docroot/images/library.png deleted file mode 100644 index 1a185057a..000000000 Binary files a/release/server/docroot/images/library.png and /dev/null differ diff --git a/release/server/docroot/images/library@2x.png b/release/server/docroot/images/library@2x.png deleted file mode 100644 index 131046c70..000000000 Binary files a/release/server/docroot/images/library@2x.png and /dev/null differ diff --git a/release/server/docroot/images/next.png b/release/server/docroot/images/next.png deleted file mode 100644 index 06efccc33..000000000 Binary files a/release/server/docroot/images/next.png and /dev/null differ diff --git a/release/server/docroot/images/next@2x.png b/release/server/docroot/images/next@2x.png deleted file mode 100644 index ec4feb220..000000000 Binary files a/release/server/docroot/images/next@2x.png and /dev/null differ diff --git a/release/server/docroot/images/prev.png b/release/server/docroot/images/prev.png deleted file mode 100644 index 43e4805e3..000000000 Binary files a/release/server/docroot/images/prev.png and /dev/null differ diff --git a/release/server/docroot/images/prev@2x.png b/release/server/docroot/images/prev@2x.png deleted file mode 100644 index d505f4f51..000000000 Binary files a/release/server/docroot/images/prev@2x.png and /dev/null differ diff --git a/release/server/docroot/images/read.png b/release/server/docroot/images/read.png deleted file mode 100644 index 9465a7d5f..000000000 Binary files a/release/server/docroot/images/read.png and /dev/null differ diff --git a/release/server/docroot/images/read@2x.png b/release/server/docroot/images/read@2x.png deleted file mode 100644 index 68ed87153..000000000 Binary files a/release/server/docroot/images/read@2x.png and /dev/null differ diff --git a/release/server/docroot/images/readMark.png b/release/server/docroot/images/readMark.png deleted file mode 100644 index b672027dd..000000000 Binary files a/release/server/docroot/images/readMark.png and /dev/null differ diff --git a/release/server/docroot/images/readMark@2x.png b/release/server/docroot/images/readMark@2x.png deleted file mode 100644 index 1d9d0d3e3..000000000 Binary files a/release/server/docroot/images/readMark@2x.png and /dev/null differ diff --git a/release/server/docroot/images/readingMark.png b/release/server/docroot/images/readingMark.png deleted file mode 100644 index e37f3c80c..000000000 Binary files a/release/server/docroot/images/readingMark.png and /dev/null differ diff --git a/release/server/docroot/images/readingMark@2x.png b/release/server/docroot/images/readingMark@2x.png deleted file mode 100644 index 589e2e9bf..000000000 Binary files a/release/server/docroot/images/readingMark@2x.png and /dev/null differ diff --git a/release/server/docroot/images/up.png b/release/server/docroot/images/up.png deleted file mode 100644 index b039b35f6..000000000 Binary files a/release/server/docroot/images/up.png and /dev/null differ diff --git a/release/server/docroot/images/up@2x.png b/release/server/docroot/images/up@2x.png deleted file mode 100644 index d990ce0d8..000000000 Binary files a/release/server/docroot/images/up@2x.png and /dev/null differ diff --git a/release/server/docroot/login.html b/release/server/docroot/login.html deleted file mode 100644 index 188109500..000000000 --- a/release/server/docroot/login.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Login - - -
- -

LOGIN

-

YACREADER LIBRARY

- -
- - -

If you have forgotten your login information, please reset it on the YACReaderLibrary

-
 
-
-
-
 
- - \ No newline at end of file diff --git a/release/server/templates/folder.tpl b/release/server/templates/folder.tpl deleted file mode 100644 index cb13a1648..000000000 --- a/release/server/templates/folder.tpl +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - Folder - - -
-
- -
-
{if pageIndex} {end pageIndex} up
- - -
- {if device.ipad} -

{folder.name}

- {end device.ipad} -
- -
- Libraries {library.name} {loop path} {path.name} {end path} -
-
- {if pageIndex} - - - {end pageIndex} - - {if alphaIndex} - - - {end alphaIndex} - -
-
- - -
-
    - {loop element} -
  • -
    - {element.cover.browse} {element.cover.browse.end} -
    -
    -

    {element.name}

    -
    -
    {element.pages} {element.size} -
    -
    {element.download} {element.read} {element.browse} -
    -
    - {element.status} -
  • - {end element} -
-
 
-
-
- - {if index} -
- {if alphaIndex} - -
- -
 
-
- - {end alphaIndex} - - - {if pageIndex} - -
- -
 
-
- {end pageIndex} -
- {end index} - - - - - diff --git a/release/server/templates/libraries.tpl b/release/server/templates/libraries.tpl deleted file mode 100644 index 0de6f4d95..000000000 --- a/release/server/templates/libraries.tpl +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - Libraries - - -
-

Libraries

-

-

    - {loop library} -
  • -
    - -
    -   -
     
    -
  • - {end library} -
-

-
- - diff --git a/scripts/clang-format-linux.sh b/scripts/clang-format-linux.sh new file mode 100755 index 000000000..f400e2aea --- /dev/null +++ b/scripts/clang-format-linux.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +TEST_MODE=0 +if [[ $# -gt 1 ]]; then + echo "Unknown arguments. Supported flags: --test, -t" >&2 + exit 2 +fi + +if [[ $# -eq 1 ]]; then + if [[ "${1:-}" == "--test" || "${1:-}" == "-t" ]]; then + TEST_MODE=1 + else + echo "Unknown argument: ${1:-}. Supported flags: --test, -t" >&2 + exit 2 + fi +fi + +cd "${REPO_ROOT}" + +if ! VERSION_OUTPUT="$(clang-format --version 2>/dev/null)"; then + echo "Unable to run clang-format --version. Make sure clang-format is in PATH." >&2 + exit 127 +fi + +if [[ "${VERSION_OUTPUT}" =~ clang-format[[:space:]]+version[[:space:]]+([0-9]+(\.[0-9]+)*) ]]; then + VERSION="${BASH_REMATCH[1]}" + echo "Running using clang-format ${VERSION}" +else + echo "Running using ${VERSION_OUTPUT}" +fi + +find . \( -name '*.h' -or -name '*.cpp' -or -name '*.c' -or -name '*.mm' -or -name '*.m' \) -print0 | xargs -0 clang-format -style=file -i + +if [[ "${TEST_MODE}" -eq 1 ]]; then + BASE_SHA="$(git rev-parse HEAD)" + git diff "${BASE_SHA}" + if [[ "$(git diff "${BASE_SHA}")" != "" ]]; then + exit 1 + fi +fi diff --git a/scripts/clang-format-macos.sh b/scripts/clang-format-macos.sh new file mode 100755 index 000000000..f400e2aea --- /dev/null +++ b/scripts/clang-format-macos.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" + +TEST_MODE=0 +if [[ $# -gt 1 ]]; then + echo "Unknown arguments. Supported flags: --test, -t" >&2 + exit 2 +fi + +if [[ $# -eq 1 ]]; then + if [[ "${1:-}" == "--test" || "${1:-}" == "-t" ]]; then + TEST_MODE=1 + else + echo "Unknown argument: ${1:-}. Supported flags: --test, -t" >&2 + exit 2 + fi +fi + +cd "${REPO_ROOT}" + +if ! VERSION_OUTPUT="$(clang-format --version 2>/dev/null)"; then + echo "Unable to run clang-format --version. Make sure clang-format is in PATH." >&2 + exit 127 +fi + +if [[ "${VERSION_OUTPUT}" =~ clang-format[[:space:]]+version[[:space:]]+([0-9]+(\.[0-9]+)*) ]]; then + VERSION="${BASH_REMATCH[1]}" + echo "Running using clang-format ${VERSION}" +else + echo "Running using ${VERSION_OUTPUT}" +fi + +find . \( -name '*.h' -or -name '*.cpp' -or -name '*.c' -or -name '*.mm' -or -name '*.m' \) -print0 | xargs -0 clang-format -style=file -i + +if [[ "${TEST_MODE}" -eq 1 ]]; then + BASE_SHA="$(git rev-parse HEAD)" + git diff "${BASE_SHA}" + if [[ "$(git diff "${BASE_SHA}")" != "" ]]; then + exit 1 + fi +fi diff --git a/scripts/clang-format-windows.cmd b/scripts/clang-format-windows.cmd new file mode 100644 index 000000000..9d59fcdd0 --- /dev/null +++ b/scripts/clang-format-windows.cmd @@ -0,0 +1,6 @@ +@echo off +setlocal + +set "SCRIPT_DIR=%~dp0" +powershell -NoProfile -ExecutionPolicy Bypass -File "%SCRIPT_DIR%clang-format-windows.ps1" %* +exit /b %ERRORLEVEL% diff --git a/scripts/clang-format-windows.ps1 b/scripts/clang-format-windows.ps1 new file mode 100644 index 000000000..a905ce92e --- /dev/null +++ b/scripts/clang-format-windows.ps1 @@ -0,0 +1,62 @@ +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +$test = $false +foreach ($arg in $args) { + switch ($arg) { + "--test" { $test = $true; continue } + "-test" { $test = $true; continue } + "-t" { $test = $true; continue } + default { + Write-Error "Unknown argument: $arg. Supported flags: --test, -test, -t" + exit 2 + } + } +} + +$repoRoot = (Resolve-Path "$PSScriptRoot/..").Path +Set-Location $repoRoot + +$clangFormatCommand = Get-Command clang-format -ErrorAction SilentlyContinue +if (-not $clangFormatCommand) { + Write-Error "Unable to find clang-format in PATH." + exit 127 +} + +$clangFormat = $clangFormatCommand.Source +$versionOutput = & $clangFormat --version +if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($versionOutput)) { + Write-Error "Unable to run clang-format --version. Make sure clang-format is in PATH." + exit 127 +} + +$versionMatch = [regex]::Match($versionOutput, "clang-format version ([0-9]+(\.[0-9]+)*)") +if ($versionMatch.Success) { + Write-Host "Running using clang-format $($versionMatch.Groups[1].Value)" +} +else { + Write-Host "Running using $versionOutput" +} + +$extensions = @("*.h", "*.cpp", "*.c", "*.mm", "*.m") +$files = Get-ChildItem -Path . -Recurse -File | Where-Object { + $name = $_.Name + foreach ($ext in $extensions) { + if ($name -clike $ext) { + return $true + } + } + return $false +} + +foreach ($file in $files) { + & $clangFormat -style=file -i $file.FullName +} + +if ($test) { + $baseSha = "$(git rev-parse HEAD)".Trim() + git diff $baseSha + if ("$(git diff $baseSha)" -ne "") { + exit 1 + } +} diff --git a/shortcuts_management/CMakeLists.txt b/shortcuts_management/CMakeLists.txt new file mode 100644 index 000000000..88fab140c --- /dev/null +++ b/shortcuts_management/CMakeLists.txt @@ -0,0 +1,36 @@ +# Shortcuts management for YACReader +# Two targets: reader-specific, library-specific (compiled with different defines) + +set(SHORTCUTS_SOURCES + edit_shortcuts_dialog.h + edit_shortcuts_dialog.cpp + actions_groups_model.h + actions_groups_model.cpp + actions_shortcuts_model.h + actions_shortcuts_model.cpp + edit_shortcut_item_delegate.h + edit_shortcut_item_delegate.cpp + shortcuts_manager.h + shortcuts_manager.cpp +) + +# --- shortcuts_reader (YACREADER define) --- +add_library(shortcuts_reader STATIC ${SHORTCUTS_SOURCES}) +target_include_directories(shortcuts_reader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(shortcuts_reader) +# App-specific theme.h needed because themable.h → theme_manager.h → theme.h +target_include_directories(shortcuts_reader PRIVATE + ${PROJECT_SOURCE_DIR}/YACReader/themes +) +target_compile_definitions(shortcuts_reader PRIVATE YACREADER) +target_link_libraries(shortcuts_reader PUBLIC Qt6::Core Qt6::Widgets yr_global common_gui) + +# --- shortcuts_library (YACREADER_LIBRARY define) --- +add_library(shortcuts_library STATIC ${SHORTCUTS_SOURCES}) +target_include_directories(shortcuts_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +yacreader_apply_build_options(shortcuts_library) +target_include_directories(shortcuts_library PRIVATE + ${PROJECT_SOURCE_DIR}/YACReaderLibrary/themes +) +target_compile_definitions(shortcuts_library PRIVATE YACREADER_LIBRARY) +target_link_libraries(shortcuts_library PUBLIC Qt6::Core Qt6::Widgets yr_global common_gui) diff --git a/shortcuts_management/actions_groups_model.cpp b/shortcuts_management/actions_groups_model.cpp index d58dbbd00..6656eccc1 100644 --- a/shortcuts_management/actions_groups_model.cpp +++ b/shortcuts_management/actions_groups_model.cpp @@ -62,6 +62,15 @@ QList ActionsGroupsModel::getActions(const QModelIndex &mi) return QList(); } +void ActionsGroupsModel::updateGroupIcon(int row, const QIcon &icon) +{ + if (row >= 0 && row < groups.size()) { + groups[row].setIcon(icon); + QModelIndex idx = index(row, 0); + emit dataChanged(idx, idx, { Qt::DecorationRole }); + } +} + //------------------------------------------------------------------- ActionsGroup::ActionsGroup(const QString &name, const QIcon &icon, QList &actions) @@ -74,6 +83,11 @@ QString ActionsGroup::getName() const return name; } +void ActionsGroup::setIcon(const QIcon &newIcon) +{ + icon = newIcon; +} + QIcon ActionsGroup::getIcon() const { return icon; diff --git a/shortcuts_management/actions_groups_model.h b/shortcuts_management/actions_groups_model.h index 82b4c335e..31d21f576 100644 --- a/shortcuts_management/actions_groups_model.h +++ b/shortcuts_management/actions_groups_model.h @@ -13,6 +13,7 @@ class ActionsGroup QString getName() const; QIcon getIcon() const; QList getActions() const; + void setIcon(const QIcon &icon); protected: QString name; @@ -34,6 +35,7 @@ class ActionsGroupsModel : public QAbstractItemModel void addActionsGroup(const ActionsGroup &group); QList getActions(const QModelIndex &mi); + void updateGroupIcon(int row, const QIcon &icon); signals: public slots: diff --git a/shortcuts_management/actions_shortcuts_model.cpp b/shortcuts_management/actions_shortcuts_model.cpp index 7238b2c74..71528288f 100644 --- a/shortcuts_management/actions_shortcuts_model.cpp +++ b/shortcuts_management/actions_shortcuts_model.cpp @@ -1,4 +1,5 @@ #include "actions_shortcuts_model.h" + #include "shortcuts_manager.h" #include @@ -34,7 +35,7 @@ QModelIndex ActionsShortcutsModel::index(int row, int column, const QModelIndex Qt::ItemFlags ActionsShortcutsModel::flags(const QModelIndex &index) const { if (!index.isValid()) - return {}; + return { }; if (index.column() == KEYS) return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; diff --git a/shortcuts_management/edit_shortcut_item_delegate.cpp b/shortcuts_management/edit_shortcut_item_delegate.cpp index ca93e88dd..90a1b0afa 100644 --- a/shortcuts_management/edit_shortcut_item_delegate.cpp +++ b/shortcuts_management/edit_shortcut_item_delegate.cpp @@ -63,12 +63,12 @@ KeySequenceLineEdit::KeySequenceLineEdit(QWidget *parent) acceptButton = new QToolButton(this); QString buttonsStyle = "QToolButton { border: none; padding: 0px; }"; - clearButton->setIcon(QIcon(":/images/clear_shortcut.svg")); + clearButton->setIcon(QIcon(":/images/shortcuts/clear_shortcut.svg")); clearButton->setIconSize(QSize(15, 15)); clearButton->setCursor(Qt::ArrowCursor); clearButton->setStyleSheet(buttonsStyle); - acceptButton->setIcon(QIcon(":/images/accept_shortcut.svg")); + acceptButton->setIcon(QIcon(":/images/shortcuts/accept_shortcut.svg")); acceptButton->setIconSize(QSize(15, 15)); acceptButton->setCursor(Qt::ArrowCursor); acceptButton->setStyleSheet(buttonsStyle); diff --git a/shortcuts_management/edit_shortcut_item_delegate.h b/shortcuts_management/edit_shortcut_item_delegate.h index cc6f0500d..7293514ab 100644 --- a/shortcuts_management/edit_shortcut_item_delegate.h +++ b/shortcuts_management/edit_shortcut_item_delegate.h @@ -2,9 +2,9 @@ #define EDIT_SHORTCUT_ITEM_DELEGATE_H #include -#include #include #include +#include #include class KeySequenceLineEdit : public QLineEdit diff --git a/shortcuts_management/edit_shortcuts_dialog.cpp b/shortcuts_management/edit_shortcuts_dialog.cpp index 0f9da75fb..149c940bb 100644 --- a/shortcuts_management/edit_shortcuts_dialog.cpp +++ b/shortcuts_management/edit_shortcuts_dialog.cpp @@ -1,21 +1,17 @@ #include "edit_shortcuts_dialog.h" -#include "yacreader_global.h" - #include "actions_groups_model.h" #include "actions_shortcuts_model.h" #include "edit_shortcut_item_delegate.h" -#include -#include -#include -#include -#include #include #include +#include #include - -#include "QsLog.h" +#include +#include +#include +#include EditShortcutsDialog::EditShortcutsDialog(QWidget *parent) : QDialog(parent) @@ -71,6 +67,32 @@ EditShortcutsDialog::EditShortcutsDialog(QWidget *parent) setWindowTitle(tr("Shortcuts settings")); setModal(true); + + initTheme(this); +} + +void EditShortcutsDialog::applyTheme(const Theme &theme) +{ + updateGroupIcons(theme); +} + +void EditShortcutsDialog::updateGroupIcons(const Theme &theme) +{ + // Update icons for all groups based on the mapping + for (int i = 0; i < groupsModel->rowCount(); ++i) { + QModelIndex idx = groupsModel->index(i, 0); + QString groupName = groupsModel->data(idx, Qt::DisplayRole).toString(); + + if (groupIconMapping.contains(groupName)) { + QIcon newIcon = groupIconMapping[groupName](theme); + groupsModel->updateGroupIcon(i, newIcon); + } + } +} + +void EditShortcutsDialog::setGroupIconMapping(const QMap> &mapping) +{ + groupIconMapping = mapping; } void EditShortcutsDialog::addActionsGroup(const QString &name, const QIcon &ico, QList &group) diff --git a/shortcuts_management/edit_shortcuts_dialog.h b/shortcuts_management/edit_shortcuts_dialog.h index 2e51b76fc..39c0b7326 100644 --- a/shortcuts_management/edit_shortcuts_dialog.h +++ b/shortcuts_management/edit_shortcuts_dialog.h @@ -1,6 +1,8 @@ #ifndef EDIT_SHORTCUTS_DIALOG_H #define EDIT_SHORTCUTS_DIALOG_H +#include "themable.h" + #include #include @@ -10,12 +12,13 @@ class QTableView; class ActionsGroupsModel; class ActionsShortcutsModel; -class EditShortcutsDialog : public QDialog +class EditShortcutsDialog : public QDialog, protected Themable { Q_OBJECT public: explicit EditShortcutsDialog(QWidget *parent = 0); void addActionsGroup(const QString &name, const QIcon &ico, QList &group); + void setGroupIconMapping(const QMap> &mapping); signals: public slots: @@ -24,9 +27,14 @@ public slots: void processConflict(const QString &shortcutInConflict); protected: + void applyTheme(const Theme &theme) override; + void updateGroupIcons(const Theme &theme); + QListView *actionsGroupsListView; QTableView *actionsTableView; ActionsGroupsModel *groupsModel; + + QMap> groupIconMapping; ActionsShortcutsModel *actionsModel; }; diff --git a/shortcuts_management/shortcuts_management.pri b/shortcuts_management/shortcuts_management.pri deleted file mode 100644 index b70a60da3..000000000 --- a/shortcuts_management/shortcuts_management.pri +++ /dev/null @@ -1,16 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += \ - $$PWD/edit_shortcuts_dialog.h \ - $$PWD/actions_groups_model.h \ - $$PWD/actions_shortcuts_model.h \ - $$PWD/edit_shortcut_item_delegate.h \ - $$PWD/shortcuts_manager.h - -SOURCES += \ - $$PWD/edit_shortcuts_dialog.cpp \ - $$PWD/actions_groups_model.cpp \ - $$PWD/actions_shortcuts_model.cpp \ - $$PWD/edit_shortcut_item_delegate.cpp \ - $$PWD/shortcuts_manager.cpp diff --git a/shortcuts_management/shortcuts_manager.cpp b/shortcuts_management/shortcuts_manager.cpp index 8dc5c7b20..87eca2b8f 100644 --- a/shortcuts_management/shortcuts_manager.cpp +++ b/shortcuts_management/shortcuts_manager.cpp @@ -1,9 +1,12 @@ #include "shortcuts_manager.h" -#include -#include #include "yacreader_global.h" +#include +#include + +#include + ShortcutsManager::ShortcutsManager() { initDefaultShorcuts(); @@ -126,7 +129,7 @@ bool ShortcutsManager::checkConflicts(const QKeySequence &shortcut, const QActio if (shortcut.isEmpty()) return false; - foreach (QAction *action, actions) { + for (QAction *action : std::as_const(actions)) { if (action != dest) // if the same shortcut is setted there is no conflict if (action->shortcut() == shortcut) return true; diff --git a/shortcuts_management/shortcuts_manager.h b/shortcuts_management/shortcuts_manager.h index 5cf01bdf8..b8c6b90af 100644 --- a/shortcuts_management/shortcuts_manager.h +++ b/shortcuts_management/shortcuts_manager.h @@ -1,10 +1,10 @@ #ifndef SHORTCUTS_MANAGER_H #define SHORTCUTS_MANAGER_H -#include #include -#include #include +#include +#include class QAction; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 000000000..03bacbc14 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,4 @@ +# YACReader tests + +add_subdirectory(concurrent_queue_test) +add_subdirectory(compressed_archive_test) diff --git a/tests/compressed_archive_test/CMakeLists.txt b/tests/compressed_archive_test/CMakeLists.txt new file mode 100644 index 000000000..ad7f4ac89 --- /dev/null +++ b/tests/compressed_archive_test/CMakeLists.txt @@ -0,0 +1,14 @@ +# Compressed archive test + +qt_add_executable(compressed_archive_test + main.cpp +) +yacreader_apply_build_options(compressed_archive_test) +target_link_libraries(compressed_archive_test PRIVATE + Qt6::Core + cbx_backend +) +if(WIN32) + target_link_libraries(compressed_archive_test PRIVATE oleaut32 ole32) +endif() +add_test(NAME compressed_archive_test COMMAND compressed_archive_test) diff --git a/tests/compressed_archive_test/compressed_archive_test.pro b/tests/compressed_archive_test/compressed_archive_test.pro deleted file mode 100644 index b48980144..000000000 --- a/tests/compressed_archive_test/compressed_archive_test.pro +++ /dev/null @@ -1,26 +0,0 @@ -TEMPLATE = app -CONFIG += console - -SOURCES += \ - main.cpp \ - -QT += core - -win32 { - LIBS += -loleaut32 -lole32 - msvc { - QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT - QMAKE_LFLAGS_RELEASE += /LTCG - } - CONFIG -= embed_manifest_exe -} - -CONFIG(7zip) { -include(../../compressed_archive/wrapper.pri) -} else:CONFIG(unarr) { -include(../../compressed_archive/unarr/unarr-wrapper.pri) -} else:CONFIG(libarchive) { -include(../../compressed_archive/libarchive/libarchive-wrapper.pri) -} else { -include(../../compressed_archive/wrapper.pri) -} diff --git a/tests/compressed_archive_test/main.cpp b/tests/compressed_archive_test/main.cpp index f5b1e7ebe..44177efd4 100644 --- a/tests/compressed_archive_test/main.cpp +++ b/tests/compressed_archive_test/main.cpp @@ -1,11 +1,12 @@ -#include +#include "compressed_archive.h" + #include #include - -#include "compressed_archive.h" +#include #include +#include using namespace std; @@ -36,7 +37,7 @@ int main(int argc, char *argv[]) timer.start(); quint32 totalFiles = 0; - foreach (QString format, supportedFormats) { + for (const QString &format : std::as_const(supportedFormats)) { QDir rootDir(s); if (!rootDir.cd(format)) { cout << "Folder for format '" << format.toStdString() << "' not found" << endl; @@ -49,7 +50,7 @@ int main(int argc, char *argv[]) quint32 errors = 0; quint64 init = timer.elapsed(); - foreach (QFileInfo fileInfo, files) { + for (const QFileInfo &fileInfo : std::as_const(files)) { totalFiles++; totalFormat++; CompressedArchive archive(fileInfo.filePath()); diff --git a/tests/concurrent_queue_test/CMakeLists.txt b/tests/concurrent_queue_test/CMakeLists.txt new file mode 100644 index 000000000..4df4df025 --- /dev/null +++ b/tests/concurrent_queue_test/CMakeLists.txt @@ -0,0 +1,13 @@ +# Concurrent queue test + +qt_add_executable(concurrent_queue_test + concurrent_queue_test.cpp +) +yacreader_apply_build_options(concurrent_queue_test) +target_link_libraries(concurrent_queue_test PRIVATE + Qt6::Core + Qt6::Test + concurrent_queue +) +add_test(NAME concurrent_queue_test + COMMAND concurrent_queue_test -maxwarnings 100000) diff --git a/tests/concurrent_queue_test/concurrent_queue_test.cpp b/tests/concurrent_queue_test/concurrent_queue_test.cpp index d9c4eb4bb..ee187df93 100644 --- a/tests/concurrent_queue_test/concurrent_queue_test.cpp +++ b/tests/concurrent_queue_test/concurrent_queue_test.cpp @@ -461,8 +461,8 @@ void ConcurrentQueueTest::singleUserThread_data() using ms = chrono::milliseconds; - QTest::newRow("-") << 0 << JobDataSet {}; - QTest::newRow("0") << 7 << JobDataSet {}; + QTest::newRow("-") << 0 << JobDataSet { }; + QTest::newRow("0") << 7 << JobDataSet { }; QTest::newRow("A") << 1 << JobDataSet { { 5, ms(0) } }; QTest::newRow("B") << 5 << JobDataSet { { 12, ms(1) } }; QTest::newRow("C") << 1 << JobDataSet { { 1, ms(0) }, { 5, ms(2) }, { 3, ms(1) } }; @@ -559,9 +559,9 @@ void ConcurrentQueueTest::cancelPending1UserThread_data() const auto ms = [](int count) -> Clock::duration { return chrono::milliseconds(count); }; const auto us = [](int count) -> Clock::duration { return chrono::microseconds(count); }; - QTest::newRow("-") << 0 << JobDataSet {} << ms(0); - QTest::newRow("01") << 2 << JobDataSet {} << ms(0); - QTest::newRow("02") << 3 << JobDataSet {} << ms(1); + QTest::newRow("-") << 0 << JobDataSet { } << ms(0); + QTest::newRow("01") << 2 << JobDataSet { } << ms(0); + QTest::newRow("02") << 3 << JobDataSet { } << ms(1); QTest::newRow("A") << 1 << JobDataSet { { 5, ms(3) } } << ms(1); QTest::newRow("B") << 5 << JobDataSet { { 12, ms(1) } } << ms(1); diff --git a/tests/concurrent_queue_test/concurrent_queue_test.pro b/tests/concurrent_queue_test/concurrent_queue_test.pro deleted file mode 100644 index 714039115..000000000 --- a/tests/concurrent_queue_test/concurrent_queue_test.pro +++ /dev/null @@ -1,9 +0,0 @@ -include(../qt_test.pri) - -PATH_TO_common = ../../common - -INCLUDEPATH += $$PATH_TO_common -HEADERS += $${PATH_TO_common}/concurrent_queue.h -SOURCES += \ - $${PATH_TO_common}/concurrent_queue.cpp \ - concurrent_queue_test.cpp diff --git a/tests/qt_test.pri b/tests/qt_test.pri deleted file mode 100644 index 1005fa030..000000000 --- a/tests/qt_test.pri +++ /dev/null @@ -1,9 +0,0 @@ -QT += testlib -QT -= gui - -CONFIG += qt console warn_on testcase no_testcase_installs -CONFIG -= app_bundle - -TEMPLATE = app - -include(../config.pri) diff --git a/tests/tests.pro b/tests/tests.pro deleted file mode 100644 index 15317f23f..000000000 --- a/tests/tests.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS += concurrent_queue_test diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt new file mode 100644 index 000000000..512e57457 --- /dev/null +++ b/third_party/CMakeLists.txt @@ -0,0 +1,80 @@ +# Third-party libraries for YACReader + +# --- QsLog (logging) --- +add_library(QsLog STATIC + QsLog/QsLogDest.cpp + QsLog/QsLog.cpp + QsLog/QsLogDestConsole.cpp + QsLog/QsLogDestFile.cpp + QsLog/QsLogDestFunctor.cpp + QsLog/QsLogMessage.cpp + QsLog/QsLogLevel.cpp + QsLog/QsLogDest.h + QsLog/QsLog.h + QsLog/QsLogDestConsole.h + QsLog/QsLogLevel.h + QsLog/QsLogDestFile.h + QsLog/QsLogDisableForThisFile.h + QsLog/QsLogDestFunctor.h + QsLog/QsLogMessage.h + QsLog/QsLogSharedLibrary.h +) +target_include_directories(QsLog PUBLIC QsLog) +target_compile_definitions(QsLog PUBLIC QS_LOG_SEPARATE_THREAD) +target_link_libraries(QsLog PUBLIC Qt6::Core) + +# --- QrCode (QR code generation, no Qt dependency) --- +add_library(QrCode STATIC + QrCode/qrcodegen.cpp + QrCode/qrcodegen.hpp +) +target_include_directories(QrCode PUBLIC QrCode) + +# --- QtWebApp HTTP server --- +add_library(QtWebApp_httpserver STATIC + QtWebApp/httpserver/httpglobal.cpp + QtWebApp/httpserver/httplistener.cpp + QtWebApp/httpserver/httpconnectionhandler.cpp + QtWebApp/httpserver/httpconnectionhandlerpool.cpp + QtWebApp/httpserver/httprequest.cpp + QtWebApp/httpserver/httpresponse.cpp + QtWebApp/httpserver/httpcookie.cpp + QtWebApp/httpserver/httprequesthandler.cpp + QtWebApp/httpserver/httpsession.cpp + QtWebApp/httpserver/httpsessionstore.cpp + QtWebApp/httpserver/staticfilecontroller.cpp + QtWebApp/httpserver/httpglobal.h + QtWebApp/httpserver/httplistener.h + QtWebApp/httpserver/httpconnectionhandler.h + QtWebApp/httpserver/httpconnectionhandlerpool.h + QtWebApp/httpserver/httprequest.h + QtWebApp/httpserver/httpresponse.h + QtWebApp/httpserver/httpcookie.h + QtWebApp/httpserver/httprequesthandler.h + QtWebApp/httpserver/httpsession.h + QtWebApp/httpserver/httpsessionstore.h + QtWebApp/httpserver/staticfilecontroller.h +) +target_include_directories(QtWebApp_httpserver PUBLIC QtWebApp/httpserver) +target_link_libraries(QtWebApp_httpserver PUBLIC Qt6::Network) + +# --- QtWebApp template engine --- +add_library(QtWebApp_templateengine STATIC + QtWebApp/templateengine/template.cpp + QtWebApp/templateengine/templateloader.cpp + QtWebApp/templateengine/templatecache.cpp + QtWebApp/templateengine/templateglobal.h + QtWebApp/templateengine/template.h + QtWebApp/templateengine/templateloader.h + QtWebApp/templateengine/templatecache.h +) +target_include_directories(QtWebApp_templateengine PUBLIC QtWebApp/templateengine) +target_link_libraries(QtWebApp_templateengine PUBLIC Qt6::Core5Compat) + +# --- KDSignalThrottler (from KDToolBox) --- +add_library(KDSignalThrottler STATIC + KDToolBox/KDSignalThrottler.cpp + KDToolBox/KDSignalThrottler.h +) +target_include_directories(KDSignalThrottler PUBLIC KDToolBox) +target_link_libraries(KDSignalThrottler PUBLIC Qt6::Core) diff --git a/third_party/KDToolBox/KDToolBox.pri b/third_party/KDToolBox/KDToolBox.pri deleted file mode 100644 index 1cfbb745d..000000000 --- a/third_party/KDToolBox/KDToolBox.pri +++ /dev/null @@ -1,4 +0,0 @@ -INCLUDEPATH += $$PWD - -SOURCES += $$PWD/KDSignalThrottler.cpp -HEADERS += $$PWD/KDSignalThrottler.h diff --git a/third_party/QrCode/QrCode.pri b/third_party/QrCode/QrCode.pri deleted file mode 100644 index 091426110..000000000 --- a/third_party/QrCode/QrCode.pri +++ /dev/null @@ -1,4 +0,0 @@ -INCLUDEPATH += $$PWD - -SOURCES += $$PWD/qrcodegen.cpp -HEADERS += $$PWD/qrcodegen.hpp diff --git a/third_party/QsLog/QsLog.pri b/third_party/QsLog/QsLog.pri deleted file mode 100644 index 20363e1c9..000000000 --- a/third_party/QsLog/QsLog.pri +++ /dev/null @@ -1,41 +0,0 @@ -INCLUDEPATH += $$PWD -#DEFINES += QS_LOG_LINE_NUMBERS # automatically writes the file and line for each log message -#DEFINES += QS_LOG_DISABLE # logging code is replaced with a no-op -DEFINES += QS_LOG_SEPARATE_THREAD # messages are queued and written from a separate thread -#DEFINES += QS_LOG_WIN_PRINTF_CONSOLE # Use fprintf instead of OutputDebugString on Windows -#DEFINES += QS_LOG_WINDOW # allows easily showing log messages in a UI - -contains(DEFINES, QS_LOG_WINDOW) { - message("Will include log window destination") - QT += gui - greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - SOURCES += $$PWD/QsLogWindow.cpp \ - $$PWD/QsLogWindowModel.cpp - HEADERS += $$PWD/QsLogWindow.h \ - $$PWD/QsLogWindowModel.h - FORMS += $$PWD/QsLogWindow.ui - RESOURCES += $$PWD/QsLogWindow.qrc -} - -SOURCES += $$PWD/QsLogDest.cpp \ - $$PWD/QsLog.cpp \ - $$PWD/QsLogDestConsole.cpp \ - $$PWD/QsLogDestFile.cpp \ - $$PWD/QsLogDestFunctor.cpp \ - $$PWD/QsLogMessage.cpp \ - $$PWD/QsLogLevel.cpp - -HEADERS += $$PWD/QsLogDest.h \ - $$PWD/QsLog.h \ - $$PWD/QsLogDestConsole.h \ - $$PWD/QsLogLevel.h \ - $$PWD/QsLogDestFile.h \ - $$PWD/QsLogDisableForThisFile.h \ - $$PWD/QsLogDestFunctor.h \ - $$PWD/QsLogMessage.h \ - $$PWD/QsLogSharedLibrary.h - -OTHER_FILES += \ - $$PWD/QsLogChanges.txt \ - $$PWD/README.md \ - $$PWD/LICENSE.txt diff --git a/third_party/QsLog/QsLogDestConsole.cpp b/third_party/QsLog/QsLogDestConsole.cpp index 472d538da..1e6fa1ec3 100644 --- a/third_party/QsLog/QsLogDestConsole.cpp +++ b/third_party/QsLog/QsLogDestConsole.cpp @@ -39,8 +39,17 @@ void QsDebugOutput::output( const QString& message ) #include void QsDebugOutput::output( const QString& message ) { - WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), message.utf16(), message.size(), NULL, NULL); - WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), L"\n", 1, NULL, NULL); + HANDLE stdErr = GetStdHandle(STD_ERROR_HANDLE); + DWORD mode; + if (GetConsoleMode(stdErr, &mode)) { + // Real console attached — use Unicode-aware WriteConsoleW + WriteConsoleW(stdErr, message.utf16(), message.size(), NULL, NULL); + WriteConsoleW(stdErr, L"\n", 1, NULL, NULL); + } else { + // Pipe (Qt Creator, redirect, etc.) — use stdio + fprintf(stdout, "%s\n", qPrintable(message)); + fflush(stdout); + } } #endif diff --git a/third_party/QsLog/QsLogSharedLibrary.pro b/third_party/QsLog/QsLogSharedLibrary.pro deleted file mode 100644 index 8d34111d0..000000000 --- a/third_party/QsLog/QsLogSharedLibrary.pro +++ /dev/null @@ -1,46 +0,0 @@ -# This pro file will build QsLog as a shared library -TARGET = QsLog -VERSION = "2.1.0" -QT -= gui -CONFIG -= console -CONFIG -= app_bundle -CONFIG += shared -CONFIG += c++11 -TEMPLATE = lib - -QSLOG_DESTDIR=$$(QSLOG_DESTDIR) -!isEmpty(QSLOG_DESTDIR) { - message(Will use $${QSLOG_DESTDIR} as destdir.) - DESTDIR = $${QSLOG_DESTDIR}/bin - OBJECTS_DIR = $${QSLOG_DESTDIR} - MOC_DIR = $${QSLOG_DESTDIR} - UI_DIR = $${QSLOG_DESTDIR} - RCC_DIR = $${QSLOG_DESTDIR} -} - -win32 { - DEFINES += QSLOG_IS_SHARED_LIBRARY -} - -include(QsLog.pri) - -unix:!macx { - DISTRO = $$system(uname -a) - - # make install will install the shared object in the appropriate folders - headers.files = QsLog.h QsLogDest.h QsLogLevel.h - headers.path = /usr/include/$(QMAKE_TARGET) - - other_files.files = LICENSE.txt QsLogChanges.txt README.md - other_files.path = /usr/local/share/$(QMAKE_TARGET) - contains(DISTRO, .*ARCH): other_files.path = /usr/share/$(QMAKE_TARGET) - - contains(QT_ARCH, x86_64) { - target.path = /usr/lib64 - contains(DISTRO, .*ARCH): target.path = /usr/lib - } else { - target.path = /usr/lib - } - - INSTALLS += headers target other_files -} diff --git a/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp b/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp index 5460f4052..d4de9ee19 100644 --- a/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp +++ b/third_party/QsLog/unittest/QtTestUtil/TestRegistry.cpp @@ -21,9 +21,10 @@ void TestRegistry::registerTest(QObject* test) { int TestRegistry::runTests(int argc, char* argv[]) { int result = 0; - foreach(QObject* test, tests_) { - result |= QTest::qExec(test, argc, argv); - } + const auto &tests = tests_; + for (auto *test : tests) { + result |= QTest::qExec(test, argc, argv); + } return result; } diff --git a/third_party/QsLog/unittest/TestLog.h b/third_party/QsLog/unittest/TestLog.h index ba3df1922..edc665834 100644 --- a/third_party/QsLog/unittest/TestLog.h +++ b/third_party/QsLog/unittest/TestLog.h @@ -63,7 +63,7 @@ class MockDestination : public QsLogging::Destination bool hasMessage(const QString &messageContent, QsLogging::Level level) const { - Q_FOREACH (const Message &m, mMessages) { + for (const auto &m : mMessages) { if (m.level == level && m.text.contains(messageContent)) return true; } diff --git a/third_party/QsLog/unittest/unittest.pro b/third_party/QsLog/unittest/unittest.pro deleted file mode 100644 index b59b8a93a..000000000 --- a/third_party/QsLog/unittest/unittest.pro +++ /dev/null @@ -1,29 +0,0 @@ -QT += core - -TARGET = QsLogUnitTest -CONFIG += console qtestlib c++11 -CONFIG -= app_bundle -TEMPLATE = app - -# optionally enable address sanitizer -linux-g++|macx { - QMAKE_CXXFLAGS += -fsanitize=address - QMAKE_LFLAGS += -fsanitize=address -} - -# test-case sources -SOURCES += TestLog.cpp - -HEADERS += TestLog.h - -# component sources -include(../QsLog.pri) - -SOURCES += \ - ./QtTestUtil/TestRegistry.cpp \ - ./QtTestUtil/SimpleChecker.cpp - -HEADERS += \ - ./QtTestUtil/TestRegistry.h \ - ./QtTestUtil/TestRegistration.h \ - ./QtTestUtil/QtTestUtil.h diff --git a/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp b/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp index 5a03d0ce5..240d0f92d 100644 --- a/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp +++ b/third_party/QtWebApp/httpserver/httpconnectionhandlerpool.cpp @@ -5,6 +5,7 @@ #include #endif #include +#include #include "httpconnectionhandlerpool.h" using namespace stefanfrings; @@ -25,7 +26,7 @@ HttpConnectionHandlerPool::HttpConnectionHandlerPool(const QSettings *settings, HttpConnectionHandlerPool::~HttpConnectionHandlerPool() { // delete all connection handlers and wait until their threads are closed - foreach(HttpConnectionHandler* handler, pool) + for (HttpConnectionHandler *handler : std::as_const(pool)) { delete handler; } @@ -39,7 +40,7 @@ HttpConnectionHandler* HttpConnectionHandlerPool::getConnectionHandler() HttpConnectionHandler* freeHandler=0; mutex.lock(); // find a free handler in pool - foreach(HttpConnectionHandler* handler, pool) + for (HttpConnectionHandler *handler : std::as_const(pool)) { if (!handler->isBusy()) { @@ -69,7 +70,7 @@ void HttpConnectionHandlerPool::cleanup() int maxIdleHandlers=settings->value("minThreads",1).toInt(); int idleCounter=0; mutex.lock(); - foreach(HttpConnectionHandler* handler, pool) + for (HttpConnectionHandler *handler : std::as_const(pool)) { if (!handler->isBusy()) { diff --git a/third_party/QtWebApp/httpserver/httpcookie.cpp b/third_party/QtWebApp/httpserver/httpcookie.cpp index d85232e83..bde70caac 100644 --- a/third_party/QtWebApp/httpserver/httpcookie.cpp +++ b/third_party/QtWebApp/httpserver/httpcookie.cpp @@ -4,6 +4,7 @@ */ #include "httpcookie.h" +#include using namespace stefanfrings; @@ -37,7 +38,7 @@ HttpCookie::HttpCookie(const QByteArray source) secure=false; httpOnly=false; QList list=splitCSV(source); - foreach(QByteArray part, list) + for (const QByteArray &part : std::as_const(list)) { // Split the part into name and value diff --git a/third_party/QtWebApp/httpserver/httprequest.cpp b/third_party/QtWebApp/httpserver/httprequest.cpp index c9294b7a4..c076c5d9b 100644 --- a/third_party/QtWebApp/httpserver/httprequest.cpp +++ b/third_party/QtWebApp/httpserver/httprequest.cpp @@ -6,6 +6,7 @@ #include "httprequest.h" #include #include +#include #include "httpcookie.h" using namespace stefanfrings; @@ -239,7 +240,7 @@ void HttpRequest::decodeRequestParams() } // Split the parameters into pairs of value and name QList list=rawParameters.split('&'); - foreach (QByteArray part, list) + for (const QByteArray &part : std::as_const(list)) { int equalsChar=part.indexOf('='); if (equalsChar>=0) @@ -261,10 +262,10 @@ void HttpRequest::extractCookies() #ifdef SUPERVERBOSE qDebug("HttpRequest: extract cookies"); #endif - foreach(QByteArray cookieStr, headers.values("cookie")) + for (const QByteArray &cookieStr : headers.values("cookie")) { QList list=HttpCookie::splitCSV(cookieStr); - foreach(QByteArray part, list) + for (const QByteArray &part : std::as_const(list)) { #ifdef SUPERVERBOSE qDebug("HttpRequest: found cookie %s",part.data()); @@ -532,7 +533,7 @@ void HttpRequest::parseMultiPartFile() HttpRequest::~HttpRequest() { - foreach(QByteArray key, uploadedFiles.keys()) + for (const QByteArray &key : uploadedFiles.keys()) { QTemporaryFile* file=uploadedFiles.value(key); if (file->isOpen()) diff --git a/third_party/QtWebApp/httpserver/httpresponse.cpp b/third_party/QtWebApp/httpserver/httpresponse.cpp index a2afba89c..597be0f4f 100644 --- a/third_party/QtWebApp/httpserver/httpresponse.cpp +++ b/third_party/QtWebApp/httpserver/httpresponse.cpp @@ -4,6 +4,7 @@ */ #include "httpresponse.h" +#include using namespace stefanfrings; @@ -54,14 +55,14 @@ void HttpResponse::writeHeaders() buffer.append(' '); buffer.append(statusText); buffer.append("\r\n"); - foreach(QByteArray name, headers.keys()) + for (const QByteArray &name : headers.keys()) { buffer.append(name); buffer.append(": "); buffer.append(headers.value(name)); buffer.append("\r\n"); } - foreach(HttpCookie cookie,cookies.values()) + for (const HttpCookie &cookie : cookies.values()) { buffer.append("Set-Cookie: "); buffer.append(cookie.toByteArray()); diff --git a/third_party/QtWebApp/httpserver/httpserver.pri b/third_party/QtWebApp/httpserver/httpserver.pri deleted file mode 100644 index 9bfabd24e..000000000 --- a/third_party/QtWebApp/httpserver/httpserver.pri +++ /dev/null @@ -1,33 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -QT += network - -# Enable very detailed debug messages when compiling the debug version -CONFIG(debug, debug|release) { - DEFINES += SUPERVERBOSE -} - -HEADERS += $$PWD/httpglobal.h \ - $$PWD/httplistener.h \ - $$PWD/httpconnectionhandler.h \ - $$PWD/httpconnectionhandlerpool.h \ - $$PWD/httprequest.h \ - $$PWD/httpresponse.h \ - $$PWD/httpcookie.h \ - $$PWD/httprequesthandler.h \ - $$PWD/httpsession.h \ - $$PWD/httpsessionstore.h \ - $$PWD/staticfilecontroller.h - -SOURCES += $$PWD/httpglobal.cpp \ - $$PWD/httplistener.cpp \ - $$PWD/httpconnectionhandler.cpp \ - $$PWD/httpconnectionhandlerpool.cpp \ - $$PWD/httprequest.cpp \ - $$PWD/httpresponse.cpp \ - $$PWD/httpcookie.cpp \ - $$PWD/httprequesthandler.cpp \ - $$PWD/httpsession.cpp \ - $$PWD/httpsessionstore.cpp \ - $$PWD/staticfilecontroller.cpp diff --git a/third_party/QtWebApp/templateengine/templateengine.pri b/third_party/QtWebApp/templateengine/templateengine.pri deleted file mode 100644 index faca956ac..000000000 --- a/third_party/QtWebApp/templateengine/templateengine.pri +++ /dev/null @@ -1,15 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -greaterThan(QT_VERSION,6) { - QT += core5compat -} - -HEADERS += $$PWD/templateglobal.h -HEADERS += $$PWD/template.h -HEADERS += $$PWD/templateloader.h -HEADERS += $$PWD/templatecache.h - -SOURCES += $$PWD/template.cpp -SOURCES += $$PWD/templateloader.cpp -SOURCES += $$PWD/templatecache.cpp diff --git a/third_party/QtWebApp/templateengine/templateloader.cpp b/third_party/QtWebApp/templateengine/templateloader.cpp index 0db3115b2..1dda0d7c8 100644 --- a/third_party/QtWebApp/templateengine/templateloader.cpp +++ b/third_party/QtWebApp/templateengine/templateloader.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include #else @@ -81,7 +82,7 @@ Template TemplateLoader::getTemplate(QString templateName, QString locales) #endif // Search for exact match - foreach (QString loc,locs) + for (QString loc : std::as_const(locs)) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) loc.replace(QRegularExpression(";.*"),""); @@ -102,7 +103,7 @@ Template TemplateLoader::getTemplate(QString templateName, QString locales) } // Search for correct language but any country - foreach (QString loc,locs) + for (QString loc : std::as_const(locs)) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) loc.replace(QRegularExpression("[;_-].*"),"");