Compare commits
58 Commits
505ab9e2a6
...
1.4.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 8f0d4da7ad | |||
| 9c8ffb6c1b | |||
| 4c5c5e6fc6 | |||
| b8cb10bb33 | |||
| 6e2f40633e | |||
|
|
a0ba7c1d17 | ||
|
|
b6d759d7c6 | ||
| 437c2f5618 | |||
|
|
7fd4924e64 | ||
| c77808f3d8 | |||
| 86075a1ad0 | |||
| a8e40a725c | |||
|
|
8edb6b015e | ||
| 5b2255e903 | |||
| 4948ea7445 | |||
| e09348e064 | |||
|
|
fce6a835b7 | ||
| afcd126c00 | |||
| aa025b0f3b | |||
| e6e738412d | |||
| 2e748e19e1 | |||
| 4b5c9e9ebd | |||
| cdfa8b78a4 | |||
| 1ba5ae60dc | |||
|
|
08d1c09033 | ||
| 612b542e2a | |||
| d74db66ab5 | |||
| 9dd34b3fce | |||
| adfe6c51da | |||
|
|
96565b2ccf | ||
| 107440145a | |||
| 1c55e3194e | |||
| 9021ff2579 | |||
| 10e1e91e7b | |||
| ef887d7a06 | |||
| 5446d94966 | |||
| a2f42c2e3d | |||
| 56b18353db | |||
| 9170765344 | |||
|
|
ee7b3beda4 | ||
| 919a672c17 | |||
| e52a6d8eed | |||
| 8b0c8ec194 | |||
|
|
1da7fff518 | ||
| e216592205 | |||
| 8fc9d06937 | |||
| 73b15da182 | |||
| f4f7d93e38 | |||
| 591b01a83a | |||
| f8d3dcc899 | |||
| f0ed9d0ca1 | |||
|
|
13227cfac9 | ||
| b73df5ea1a | |||
| 4375fe1c2d | |||
| 4654cb21a0 | |||
| ba23208a7a | |||
| ed5a602332 | |||
| 347681e604 |
3
.git-blame-ignore-revs
Normal file
3
.git-blame-ignore-revs
Normal file
@@ -0,0 +1,3 @@
|
||||
# .git-blame-ignore-revs
|
||||
# CR LF to LF
|
||||
ed5a6023326fd2ab420ded76976501be33e0b389
|
||||
5
.gitattributes
vendored
Normal file
5
.gitattributes
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
*.txt text eol=lf
|
||||
*.cpp text eol=lf
|
||||
*.h text eol=lf
|
||||
*.ui text eol=lf
|
||||
*.qml text eol=lf
|
||||
35
.github/workflows/deepin.yml
vendored
Normal file
35
.github/workflows/deepin.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: deepin 25 CI
|
||||
|
||||
on: [push, pull_request, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
build-deepin-25-deb:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: linuxdeepin/deepin:crimson
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- name: Update package lists and install basic tools
|
||||
run: |
|
||||
apt update
|
||||
apt install -y git ca-certificates curl file
|
||||
- uses: actions/checkout@v6
|
||||
- name: Get build dept.
|
||||
run: |
|
||||
apt install -y cmake qt6-base-dev qt6-svg-dev qt6-tools-dev libexiv2-dev
|
||||
- name: Build it
|
||||
run: |
|
||||
git config --global --add safe.directory '*' # to avoid "fatal: detected dubious ownership in repository at xxx"
|
||||
cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr .
|
||||
cmake --build build -j
|
||||
cd build
|
||||
cpack -G DEB
|
||||
- name: Try install it
|
||||
run: |
|
||||
cd build
|
||||
apt install -y ./*.deb
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: deepin-25-deb-package
|
||||
path: build/*.deb
|
||||
7
.github/workflows/macos.yml
vendored
7
.github/workflows/macos.yml
vendored
@@ -8,12 +8,13 @@ jobs:
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: '6.9.1'
|
||||
version: '6.10.3'
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Install Conan and Dependencies
|
||||
id: conan
|
||||
working-directory: ./
|
||||
@@ -32,7 +33,7 @@ jobs:
|
||||
run: |
|
||||
macdeployqt ./ppic.app -dmg
|
||||
ls
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "macos-bundle"
|
||||
path: "*.dmg"
|
||||
|
||||
6
.github/workflows/ubuntu.yml
vendored
6
.github/workflows/ubuntu.yml
vendored
@@ -1,12 +1,12 @@
|
||||
name: Ubuntu CI
|
||||
|
||||
on: [push, pull_request]
|
||||
on: [push, pull_request, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
ubuntu-24-04-build:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Get build dept.
|
||||
run: |
|
||||
sudo apt update
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
run: |
|
||||
cd build
|
||||
sudo apt install ./*.deb
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ubuntu-24.04-deb-package
|
||||
path: build/*.deb
|
||||
|
||||
50
.github/workflows/windows.yml
vendored
50
.github/workflows/windows.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- qt_ver: '6.9.1'
|
||||
- qt_ver: '6.10.3'
|
||||
vs: '2022'
|
||||
aqt_arch: 'win64_msvc2022_64'
|
||||
msvc_arch: 'x64'
|
||||
@@ -16,13 +16,14 @@ jobs:
|
||||
runs-on: windows-2022
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
arch: ${{ matrix.aqt_arch }}
|
||||
version: ${{ matrix.qt_ver }}
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Build
|
||||
shell: cmd
|
||||
run: |
|
||||
@@ -34,7 +35,7 @@ jobs:
|
||||
nmake
|
||||
nmake clean
|
||||
windeployqt --verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-system-d3d-compiler --no-system-dxc-compiler --skip-plugin-types tls,networkinformation release\ppic.exe
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "windows-msvc${{ matrix.vs }}-qt${{ matrix.qt_ver }}-qmake-package"
|
||||
path: release/*
|
||||
@@ -44,7 +45,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- qt_ver: '6.9.1'
|
||||
- qt_ver: '6.10.3'
|
||||
vs: '2022'
|
||||
aqt_arch: 'win64_msvc2022_64'
|
||||
msvc_arch: 'x64'
|
||||
@@ -52,13 +53,14 @@ jobs:
|
||||
runs-on: windows-2022
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
arch: ${{ matrix.aqt_arch }}
|
||||
version: ${{ matrix.qt_ver }}
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Build
|
||||
shell: cmd
|
||||
run: |
|
||||
@@ -72,33 +74,33 @@ jobs:
|
||||
set CMAKE_PREFIX_PATH=%PWD%/dependencies_bin
|
||||
mkdir dependencies_src
|
||||
echo ::group::===== exiv2 =====
|
||||
curl -fsSL -o exiv2_bin.zip https://github.com/Exiv2/exiv2/releases/download/v0.28.5/exiv2-0.28.5-2022msvc-AMD64.zip
|
||||
curl -fsSL -o exiv2_bin.zip https://github.com/Exiv2/exiv2/releases/download/v0.28.7/exiv2-0.28.7-2022msvc-AMD64.zip
|
||||
7z x exiv2_bin.zip -y
|
||||
ren .\exiv2-0.28.5-2022msvc-AMD64 dependencies_bin
|
||||
ren .\exiv2-0.28.7-2022msvc-AMD64 dependencies_bin
|
||||
echo ::endgroup::
|
||||
echo ::group::===== zlib =====
|
||||
curl -fsSL -o zlib_src.zip https://zlib.net/zlib131.zip
|
||||
curl -fsSL -o zlib_src.zip https://zlib.net/zlib132.zip
|
||||
7z x zlib_src.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\zlib-1.3.1 zlib || goto :error
|
||||
ren .\dependencies_src\zlib-1.3.2 zlib || goto :error
|
||||
cmake ./dependencies_src/zlib -Bbuild_dependencies/zlib -DCMAKE_INSTALL_PREFIX="dependencies_bin" || goto :error
|
||||
cmake --build build_dependencies/zlib --config Release --target=install || goto :error
|
||||
curl -fsSL -o expat_src.zip https://github.com/libexpat/libexpat/archive/R_2_6_2.zip
|
||||
echo ::endgroup::
|
||||
echo ::group::===== AOM for libavif AVI decoding support =====
|
||||
git clone -q -b v3.12.0 --depth 1 https://aomedia.googlesource.com/aom dependencies_src/aom
|
||||
git clone -q -b v3.13.1 --depth 1 https://aomedia.googlesource.com/aom dependencies_src/aom
|
||||
cmake ./dependencies_src/aom -Bbuild_dependencies/aom -DCMAKE_INSTALL_PREFIX="dependencies_bin" -DENABLE_DOCS=OFF -DBUILD_SHARED_LIBS=ON -DAOM_TARGET_CPU=generic -DENABLE_TESTS=OFF -DENABLE_TESTDATA=OFF -DENABLE_TOOLS=OFF -DENABLE_EXAMPLES=0 || goto :error
|
||||
cmake --build build_dependencies/aom --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
echo ::group::===== libavif =====
|
||||
curl -fsSL -o libavif-v1_2_1.zip https://github.com/AOMediaCodec/libavif/archive/v1.2.1.zip
|
||||
7z x libavif-v1_2_1.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\libavif-1.2.1 libavif || goto :error
|
||||
cmake ./dependencies_src/libavif -Bbuild_dependencies/libavif -DCMAKE_INSTALL_PREFIX="dependencies_bin" -DAVIF_CODEC_AOM=ON -DAVIF_LIBYUV=LOCAL
|
||||
curl -fsSL -o libavif-v1_3_0.zip https://github.com/AOMediaCodec/libavif/archive/v1.3.0.zip
|
||||
7z x libavif-v1_3_0.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\libavif-1.3.0 libavif || goto :error
|
||||
cmake ./dependencies_src/libavif -Bbuild_dependencies/libavif -DCMAKE_INSTALL_PREFIX="dependencies_bin" -DAVIF_CODEC_AOM=SYSTEM -DAVIF_CODEC_AOM_DECODE=ON -DAVIF_CODEC_AOM_ENCODE=ON -DAVIF_LIBYUV=LOCAL
|
||||
cmake --build build_dependencies/libavif --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
echo ::group::===== expat =====
|
||||
curl -fsSL -o expat_src.zip https://github.com/libexpat/libexpat/archive/R_2_7_3.zip
|
||||
7z x expat_src.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\libexpat-R_2_6_2 expat || goto :error
|
||||
ren .\dependencies_src\libexpat-R_2_7_3 expat || goto :error
|
||||
cmake ./dependencies_src/expat/expat -Bbuild_dependencies/expat -DCMAKE_INSTALL_PREFIX="dependencies_bin" || goto :error
|
||||
cmake --build build_dependencies/expat --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
@@ -114,20 +116,26 @@ jobs:
|
||||
echo ::endgroup::
|
||||
echo ::group::===== KImageFormats =====
|
||||
git clone -q https://invent.kde.org/frameworks/kimageformats.git dependencies_src/kimageformats
|
||||
cmake .\dependencies_src\kimageformats -Bbuild_dependencies/kimageformats -DKDE_INSTALL_QTPLUGINDIR=%QT_ROOT_DIR%\plugins || goto :error
|
||||
cmake .\dependencies_src\kimageformats -Bbuild_dependencies/kimageformats -DBUILD_TESTING=OFF -DKDE_INSTALL_QTPLUGINDIR=%QT_ROOT_DIR%\plugins || goto :error
|
||||
cmake --build build_dependencies/kimageformats --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
:: ------ app ------
|
||||
cmake -Bbuild . -DCMAKE_INSTALL_PREFIX="%PWD%\build\"
|
||||
echo ::group::===== App (Build'n'Install) =====
|
||||
cmake -Bbuild .
|
||||
cmake --build build --config Release
|
||||
cmake --build build --config Release --target=install
|
||||
cmake --install build --config Release --prefix "%PWD%\build"
|
||||
echo ::endgroup::
|
||||
echo ::group::===== passoc stuff =====
|
||||
curl -fsSL -o passoc-standalone.zip https://github.com/BLumia/pineapple-assoc-manager/releases/latest/download/pineapple-assoc-manager-qt${{ matrix.qt_ver }}-standalone.zip
|
||||
7z x passoc-standalone.zip passoc.exe -y -o"build/bin"
|
||||
echo ::endgroup::
|
||||
:: ------ pkg ------
|
||||
windeployqt --verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-system-d3d-compiler --no-system-dxc-compiler --skip-plugin-types tls,networkinformation build\bin\ppic.exe
|
||||
windeployqt --verbose=2 --no-compiler-runtime --no-quick-import --no-translations --no-network --no-opengl-sw --no-system-d3d-compiler --no-system-dxc-compiler --skip-plugin-types tls,networkinformation build\bin\ppic.exe
|
||||
robocopy ./dependencies_bin/bin build/bin *.dll
|
||||
if ErrorLevel 8 (exit /B 1)
|
||||
copy LICENSE build\bin
|
||||
exit /B 0
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "windows-msvc${{ matrix.vs }}-qt${{ matrix.qt_ver }}-cmake-package"
|
||||
path: build/bin/*
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -16,3 +16,7 @@ cmake-build-*/
|
||||
# IDE/Editor config folders
|
||||
.vscode/
|
||||
.idea/
|
||||
.qtcreator/
|
||||
|
||||
# Clangd cache
|
||||
.cache/
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(pineapple-pictures VERSION 1.1.0) # don't forget to update NEWS file and AppStream metadata.
|
||||
project(pineapple-pictures VERSION 1.4.1) # don't forget to update NEWS file and AppStream metadata.
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(FeatureSummary)
|
||||
@@ -94,7 +94,8 @@ file (GLOB PPIC_TS_FILES app/translations/*.ts)
|
||||
set (PPIC_CPP_FILES_FOR_I18N ${PPIC_CPP_FILES})
|
||||
|
||||
if (WIN32)
|
||||
list(APPEND PPIC_RC_FILES assets/pineapple-pictures.rc)
|
||||
configure_file(assets/pineapple-pictures.rc.in pineapple-pictures.rc @ONLY)
|
||||
list(APPEND PPIC_RC_FILES ${CMAKE_CURRENT_BINARY_DIR}/pineapple-pictures.rc)
|
||||
endif ()
|
||||
|
||||
add_executable (${EXE_NAME}
|
||||
@@ -269,6 +270,25 @@ if (DEFINED QM_FILE_INSTALL_DIR)
|
||||
)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
install(
|
||||
FILES dist/passoc/ppic.pacfg
|
||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
RENAME default-assoc.pacfg
|
||||
)
|
||||
|
||||
install(
|
||||
FILES
|
||||
dist/passoc/generic.ico
|
||||
dist/passoc/jpeg.ico
|
||||
dist/passoc/gif.ico
|
||||
dist/passoc/svg.ico
|
||||
dist/passoc/png.ico
|
||||
dist/passoc/psd.ico
|
||||
DESTINATION "${CMAKE_INSTALL_BINDIR}/icons"
|
||||
)
|
||||
endif()
|
||||
|
||||
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||
|
||||
# CPACK: General Settings
|
||||
@@ -284,7 +304,7 @@ elseif (APPLE)
|
||||
elseif (UNIX)
|
||||
set (CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
|
||||
set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||
set (CPACK_DEBIAN_PACKAGE_RECOMMENDS "kimageformat-plugins")
|
||||
set (CPACK_DEBIAN_PACKAGE_RECOMMENDS "kimageformat6-plugins")
|
||||
endif()
|
||||
|
||||
include(CPack)
|
||||
|
||||
42
LICENSE
42
LICENSE
@@ -1,21 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 BLumia
|
||||
|
||||
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.
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 BLumia
|
||||
|
||||
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.
|
||||
|
||||
96
NEWS
96
NEWS
@@ -1,3 +1,98 @@
|
||||
Version 1.4.1
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2026-04-05
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Update Qt version to 6.10.3 for Windows and macOS pre-built binaries
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels (vistaus), Loc Huynh (hthienloc)
|
||||
|
||||
Version 1.4.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2026-02-11
|
||||
|
||||
Features:
|
||||
* Action to save image as new file with different format
|
||||
* Add Vietnamese and Slovenian translation
|
||||
|
||||
Miscellaneous:
|
||||
* Update copyright year to 2026
|
||||
* Update translations
|
||||
* Update Qt version to 6.10.2 for Windows and macOS pre-built binaries
|
||||
|
||||
Contributors:
|
||||
Loc Huynh, Sabri Ünal, VenusGirl, Andrej Poženel, Andrey
|
||||
|
||||
Version 1.3.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-12-20
|
||||
|
||||
Features:
|
||||
* New option to limit SVG support to SVG Tiny 1.2 standard
|
||||
* Windows: ship tools and configurations that help user associate image files to this program
|
||||
|
||||
Bugfixes:
|
||||
* Fix window not appear at the screen that the mouse cursor is at
|
||||
* Fix Windows prebuilt binary having AVIF plugin included but not actually support it
|
||||
|
||||
Miscellaneous:
|
||||
* CPack DEB: will now recommend "kimageformat6-plugins" instead of the KF5 version
|
||||
* Update translations
|
||||
* Update exiv2 version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
VenusGirl, Andrey
|
||||
|
||||
Version 1.2.1
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-11-22
|
||||
|
||||
Bugfixes:
|
||||
* Fix incorrect color when display some CMYK images.
|
||||
|
||||
Miscellaneous:
|
||||
* Now use Qt 6.10.1 for pre-built binary
|
||||
* Update README description and AppStream metainfo
|
||||
* Update translations
|
||||
* Update libavif, AOM and expat version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
albanobattistella
|
||||
|
||||
Version 1.2.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-09-21
|
||||
|
||||
Features:
|
||||
* Long image mode that detect extra wide image and auto fit by its thin side
|
||||
* Windows: Add product version to binary metadata / resource file
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Update libavif version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels, albanobattistella, Sabri Ünal
|
||||
|
||||
Version 1.1.1
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-08-02
|
||||
|
||||
Features:
|
||||
* Click dock icon should show window when it's hidden on macOS
|
||||
|
||||
Bugfixes:
|
||||
* Ensure "Fit by Width" position the view to the beginning of the image
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Update Exiv2 version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels, VenusGirl, தமிழ்நேரம்
|
||||
|
||||
Version 1.1.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-07-06
|
||||
@@ -166,4 +261,3 @@ Bugfixes:
|
||||
|
||||
Contributors:
|
||||
yyc12345
|
||||
|
||||
|
||||
12
README.md
12
README.md
@@ -25,10 +25,20 @@ Pineapple Pictures is a lightweight image viewer that allows you view JPEG, PNG,
|
||||
|
||||
[](https://repology.org/project/pineapple-pictures/versions)
|
||||
|
||||
## Help Translation!
|
||||
## Contribution
|
||||
|
||||
Beside feedback and code contribution, other contributions are also welcome!
|
||||
|
||||
### Help Translation!
|
||||
|
||||
[Translate this project on Weblate!](https://hosted.weblate.org/projects/pineapple-pictures/)
|
||||
|
||||
### Funding
|
||||
|
||||
[](https://ko-fi.com/blumia)
|
||||
|
||||
[Afdian](https://afdian.com/a/BLumia)
|
||||
|
||||
## Build it manually:
|
||||
|
||||
Current state, we need:
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
### 由原作者维护
|
||||
|
||||
- [GitHub Release 页面](https://github.com/BLumia/pineapple-pictures/releases) | [gitee 发布页面](https://gitee.com/blumia/pineapple-pictures/releases)
|
||||
- [GitHub Release 页面](https://github.com/BLumia/pineapple-pictures/releases)
|
||||
- [SourceForge](https://sourceforge.net/projects/pineapple-pictures/)
|
||||
- Archlinux AUR: [pineapple-pictures](https://aur.archlinux.org/packages/pineapple-pictures/) | [pineapple-pictures-git](https://aur.archlinux.org/packages/pineapple-pictures-git/)
|
||||
- [Itch.io 商店](https://blumia.itch.io/pineapple-pictures)
|
||||
@@ -26,10 +26,20 @@
|
||||
|
||||
[](https://repology.org/project/pineapple-pictures/versions)
|
||||
|
||||
## 帮助翻译!
|
||||
## 参与贡献
|
||||
|
||||
除了参与反馈和代码贡献外,也欢迎各种类型的贡献!
|
||||
|
||||
### 帮助翻译!
|
||||
|
||||
[在 Weblate 上帮助此项目翻译到更多语言!](https://hosted.weblate.org/projects/pineapple-pictures/)
|
||||
|
||||
### 打赏
|
||||
|
||||
[Afdian | 爱发电](https://afdian.com/a/BLumia)
|
||||
|
||||
[](https://ko-fi.com/blumia)
|
||||
|
||||
## 手动构建步骤:
|
||||
|
||||
当前状态,我们需要先确保如下依赖可用:
|
||||
|
||||
72
REUSE.toml
72
REUSE.toml
@@ -1,33 +1,39 @@
|
||||
version = 1
|
||||
SPDX-PackageName = "Pineapple Pictures"
|
||||
SPDX-PackageDownloadLocation = "https://github.com/BLumia/pineapple-pictures"
|
||||
|
||||
[[annotations]]
|
||||
path = [".gitignore", "appveyor.yml", ".github/**"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "None"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["README**.md", "NEWS", "assets/**.rc", "assets/**.qrc", "dist/**"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "None"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["app/translations/**.ts", "assets/plain/translators.html"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Translators from hosted.weblate.org"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "assets/icons/**.svg"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2022 Gary Wang"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "assets/icons/app-icon.**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2020 Lovelyblack"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
version = 1
|
||||
SPDX-PackageName = "Pineapple Pictures"
|
||||
SPDX-PackageDownloadLocation = "https://github.com/BLumia/pineapple-pictures"
|
||||
|
||||
[[annotations]]
|
||||
path = [".gitattributes", ".git-blame-ignore-revs", ".gitignore", "appveyor.yml", ".github/**"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "None"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["README**.md", "NEWS", "assets/**.rc.in", "assets/**.qrc", "dist/appstream/**", "dist/**.in", "dist/**.desktop"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "None"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["dist/passoc/**"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2025 Gary Wang"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = ["app/translations/**.ts", "assets/plain/translators.html"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "Translators from hosted.weblate.org"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "assets/icons/**.svg"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2022 Gary Wang"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = "assets/icons/app-icon.**"
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2020 Lovelyblack"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
@@ -1,181 +1,181 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "aboutdialog.h"
|
||||
|
||||
#include <QAbstractButton>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QTextBrowser>
|
||||
#include <QTabWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QApplication>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QFile>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
AboutDialog::AboutDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_tabWidget(new QTabWidget)
|
||||
, m_buttonBox(new QDialogButtonBox)
|
||||
, m_helpTextEdit(new QTextBrowser)
|
||||
, m_aboutTextEdit(new QTextBrowser)
|
||||
, m_specialThanksTextEdit(new QTextBrowser)
|
||||
, m_licenseTextEdit(new QTextBrowser)
|
||||
, m_3rdPartyLibsTextEdit(new QTextBrowser)
|
||||
{
|
||||
this->setWindowTitle(tr("About"));
|
||||
|
||||
const QStringList helpStr {
|
||||
u"<p>%1</p>"_s.arg(tr("Launch application with image file path as argument to load the file.")),
|
||||
u"<p>%1</p>"_s.arg(tr("Drag and drop image file onto the window is also supported.")),
|
||||
u"<p>%1</p>"_s.arg(tr("None of the operations in this application will alter the pictures on disk.")),
|
||||
u"<p>%1</p>"_s.arg(tr("Context menu option explanation:")),
|
||||
u"<ul>"_s,
|
||||
// blumia: Chain two arg() here since it seems lupdate will remove one of them if we use
|
||||
// the old `arg(QCoreApp::translate(), tr())` way, but it's worth to mention
|
||||
// `arg(QCoreApp::translate(), this->tr())` works, but lupdate will complain about the usage.
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Stay on top"))
|
||||
.arg(tr("Make window stay on top of all other windows.")),
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Protected mode"))
|
||||
.arg(tr("Avoid close window accidentally. (eg. by double clicking the window)")),
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"))
|
||||
.arg(tr("Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.")),
|
||||
u"</ul>"_s
|
||||
};
|
||||
|
||||
const QStringList aboutStr {
|
||||
u"<center><img width='128' height='128' src=':/icons/app-icon.svg'/><br/>"_s,
|
||||
qApp->applicationDisplayName(),
|
||||
(u"<br/>"_s + tr("Version: %1").arg(
|
||||
#ifdef GIT_DESCRIBE_VERSION_STRING
|
||||
GIT_DESCRIBE_VERSION_STRING
|
||||
#else
|
||||
qApp->applicationVersion()
|
||||
#endif // GIT_DESCRIBE_VERSION_STRING
|
||||
)),
|
||||
u"<hr/>"_s,
|
||||
tr("Copyright (c) %1 %2", "%1 is year, %2 is the name of copyright holder(s)")
|
||||
.arg(u"2025"_s, u"<a href='https://github.com/BLumia'>@BLumia</a>"_s),
|
||||
u"<br/>"_s,
|
||||
tr("Logo designed by %1").arg(u"<a href='https://github.com/Lovelyblack'>@Lovelyblack</a>"_s),
|
||||
u"<hr/>"_s,
|
||||
tr("Built with Qt %1 (%2)").arg(QT_VERSION_STR, QSysInfo::buildCpuArchitecture()),
|
||||
QStringLiteral("<br/><a href='%1'>%2</a>").arg("https://github.com/BLumia/pineapple-pictures", tr("Source code")),
|
||||
u"</center>"_s
|
||||
};
|
||||
|
||||
QFile translaterHtml(u":/plain/translators.html"_s);
|
||||
bool canOpenFile = translaterHtml.open(QIODevice::ReadOnly);
|
||||
const QByteArray & translatorList = canOpenFile ? translaterHtml.readAll() : QByteArrayLiteral("");
|
||||
|
||||
const QStringList specialThanksStr {
|
||||
u"<h1 align='center'>%1</h1><a href='%2'>%3</a><p>%4</p>"_s.arg(
|
||||
tr("Contributors"),
|
||||
u"https://github.com/BLumia/pineapple-pictures/graphs/contributors"_s,
|
||||
tr("List of contributors on GitHub"),
|
||||
tr("Thanks to all people who contributed to this project.")
|
||||
),
|
||||
|
||||
u"<h1 align='center'>%1</h1><p>%2</p>%3"_s.arg(
|
||||
tr("Translators"),
|
||||
tr("I would like to thank the following people who volunteered to translate this application."),
|
||||
translatorList
|
||||
)
|
||||
};
|
||||
|
||||
const QStringList licenseStr {
|
||||
u"<h1 align='center'><b>%1</b></h1>"_s.arg(tr("Your Rights")),
|
||||
u"<p>%1</p><p>%2</p><ul><li>%3</li><li>%4</li><li>%5</li><li>%6</li></ul>"_s.arg(
|
||||
tr("%1 is released under the MIT License."), // %1
|
||||
tr("This license grants people a number of freedoms:"), // %2
|
||||
tr("You are free to use %1, for any purpose"), // %3
|
||||
tr("You are free to distribute %1"), // %4
|
||||
tr("You can study how %1 works and change it"), // %5
|
||||
tr("You can distribute changed versions of %1") // %6
|
||||
).arg(u"<i>%1</i>"_s),
|
||||
u"<p>%1</p>"_s.arg(tr("The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.")),
|
||||
u"<hr/><pre>%2</pre>"_s
|
||||
};
|
||||
|
||||
const QString mitLicense(QStringLiteral(R"(Expat/MIT License
|
||||
|
||||
Copyright (c) 2025 BLumia
|
||||
|
||||
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.
|
||||
)"));
|
||||
|
||||
const QStringList thirdPartyLibsStr {
|
||||
u"<h1 align='center'><b>%1</b></h1>"_s.arg(tr("Third-party Libraries used by %1")),
|
||||
tr("%1 is built on the following free software libraries:", "Free as in freedom"),
|
||||
u"<ul>"_s,
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.exiv2.org/", "Exiv2", "GPLv2"),
|
||||
#endif // EXIV2_VERSION
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.qt.io/", "Qt", "GPLv2 + GPLv3 + LGPLv2.1 + LGPLv3"),
|
||||
u"</ul>"_s
|
||||
};
|
||||
|
||||
m_helpTextEdit->setText(helpStr.join('\n'));
|
||||
|
||||
m_aboutTextEdit->setText(aboutStr.join('\n'));
|
||||
m_aboutTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_specialThanksTextEdit->setText(specialThanksStr.join('\n'));
|
||||
m_specialThanksTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_licenseTextEdit->setText(licenseStr.join('\n').arg(qApp->applicationDisplayName(), mitLicense));
|
||||
|
||||
m_3rdPartyLibsTextEdit->setText(thirdPartyLibsStr.join('\n').arg(u"<i>%1</i>"_s).arg(qApp->applicationDisplayName()));
|
||||
m_3rdPartyLibsTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_tabWidget->addTab(m_helpTextEdit, tr("&Help"));
|
||||
m_tabWidget->addTab(m_aboutTextEdit, tr("&About"));
|
||||
m_tabWidget->addTab(m_specialThanksTextEdit, tr("&Special Thanks"));
|
||||
m_tabWidget->addTab(m_licenseTextEdit, tr("&License"));
|
||||
m_tabWidget->addTab(m_3rdPartyLibsTextEdit, tr("&Third-party Libraries"));
|
||||
|
||||
m_buttonBox->setStandardButtons(QDialogButtonBox::Close);
|
||||
connect(m_buttonBox, QOverload<QAbstractButton *>::of(&QDialogButtonBox::clicked), this, [this](){
|
||||
this->close();
|
||||
});
|
||||
|
||||
setLayout(new QVBoxLayout);
|
||||
|
||||
layout()->addWidget(m_tabWidget);
|
||||
layout()->addWidget(m_buttonBox);
|
||||
|
||||
setMinimumSize(361, 161); // not sure why it complain "Unable to set geometry"
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
AboutDialog::~AboutDialog()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QSize AboutDialog::sizeHint() const
|
||||
{
|
||||
return QSize(520, 350);
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "aboutdialog.h"
|
||||
|
||||
#include <QAbstractButton>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QTextBrowser>
|
||||
#include <QTabWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QApplication>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QFile>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
AboutDialog::AboutDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_tabWidget(new QTabWidget)
|
||||
, m_buttonBox(new QDialogButtonBox)
|
||||
, m_helpTextEdit(new QTextBrowser)
|
||||
, m_aboutTextEdit(new QTextBrowser)
|
||||
, m_specialThanksTextEdit(new QTextBrowser)
|
||||
, m_licenseTextEdit(new QTextBrowser)
|
||||
, m_3rdPartyLibsTextEdit(new QTextBrowser)
|
||||
{
|
||||
this->setWindowTitle(tr("About"));
|
||||
|
||||
const QStringList helpStr {
|
||||
u"<p>%1</p>"_s.arg(tr("Launch application with image file path as argument to load the file.")),
|
||||
u"<p>%1</p>"_s.arg(tr("Drag and drop image file onto the window is also supported.")),
|
||||
u"<p>%1</p>"_s.arg(tr("None of the operations in this application will alter the pictures on disk.")),
|
||||
u"<p>%1</p>"_s.arg(tr("Context menu option explanation:")),
|
||||
u"<ul>"_s,
|
||||
// blumia: Chain two arg() here since it seems lupdate will remove one of them if we use
|
||||
// the old `arg(QCoreApp::translate(), tr())` way, but it's worth to mention
|
||||
// `arg(QCoreApp::translate(), this->tr())` works, but lupdate will complain about the usage.
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Stay on top"))
|
||||
.arg(tr("Make window stay on top of all other windows.")),
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Protected mode"))
|
||||
.arg(tr("Avoid close window accidentally. (eg. by double clicking the window)")),
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"))
|
||||
.arg(tr("Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.")),
|
||||
u"</ul>"_s
|
||||
};
|
||||
|
||||
const QStringList aboutStr {
|
||||
u"<center><img width='128' height='128' src=':/icons/app-icon.svg'/><br/>"_s,
|
||||
qApp->applicationDisplayName(),
|
||||
(u"<br/>"_s + tr("Version: %1").arg(
|
||||
#ifdef GIT_DESCRIBE_VERSION_STRING
|
||||
GIT_DESCRIBE_VERSION_STRING
|
||||
#else
|
||||
qApp->applicationVersion()
|
||||
#endif // GIT_DESCRIBE_VERSION_STRING
|
||||
)),
|
||||
u"<hr/>"_s,
|
||||
tr("Copyright (c) %1 %2", "%1 is year, %2 is the name of copyright holder(s)")
|
||||
.arg(u"2026"_s, u"<a href='https://github.com/BLumia'>@BLumia</a>"_s),
|
||||
u"<br/>"_s,
|
||||
tr("Logo designed by %1").arg(u"<a href='https://github.com/Lovelyblack'>@Lovelyblack</a>"_s),
|
||||
u"<hr/>"_s,
|
||||
tr("Built with Qt %1 (%2)").arg(QT_VERSION_STR, QSysInfo::buildCpuArchitecture()),
|
||||
QStringLiteral("<br/><a href='%1'>%2</a>").arg("https://github.com/BLumia/pineapple-pictures", tr("Source code")),
|
||||
u"</center>"_s
|
||||
};
|
||||
|
||||
QFile translaterHtml(u":/plain/translators.html"_s);
|
||||
bool canOpenFile = translaterHtml.open(QIODevice::ReadOnly);
|
||||
const QByteArray & translatorList = canOpenFile ? translaterHtml.readAll() : QByteArrayLiteral("");
|
||||
|
||||
const QStringList specialThanksStr {
|
||||
u"<h1 align='center'>%1</h1><a href='%2'>%3</a><p>%4</p>"_s.arg(
|
||||
tr("Contributors"),
|
||||
u"https://github.com/BLumia/pineapple-pictures/graphs/contributors"_s,
|
||||
tr("List of contributors on GitHub"),
|
||||
tr("Thanks to all people who contributed to this project.")
|
||||
),
|
||||
|
||||
u"<h1 align='center'>%1</h1><p>%2</p>%3"_s.arg(
|
||||
tr("Translators"),
|
||||
tr("I would like to thank the following people who volunteered to translate this application."),
|
||||
translatorList
|
||||
)
|
||||
};
|
||||
|
||||
const QStringList licenseStr {
|
||||
u"<h1 align='center'><b>%1</b></h1>"_s.arg(tr("Your Rights")),
|
||||
u"<p>%1</p><p>%2</p><ul><li>%3</li><li>%4</li><li>%5</li><li>%6</li></ul>"_s.arg(
|
||||
tr("%1 is released under the MIT License."), // %1
|
||||
tr("This license grants people a number of freedoms:"), // %2
|
||||
tr("You are free to use %1, for any purpose"), // %3
|
||||
tr("You are free to distribute %1"), // %4
|
||||
tr("You can study how %1 works and change it"), // %5
|
||||
tr("You can distribute changed versions of %1") // %6
|
||||
).arg(u"<i>%1</i>"_s),
|
||||
u"<p>%1</p>"_s.arg(tr("The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.")),
|
||||
u"<hr/><pre>%2</pre>"_s
|
||||
};
|
||||
|
||||
const QString mitLicense(QStringLiteral(R"(Expat/MIT License
|
||||
|
||||
Copyright © 2026 BLumia
|
||||
|
||||
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.
|
||||
)"));
|
||||
|
||||
const QStringList thirdPartyLibsStr {
|
||||
u"<h1 align='center'><b>%1</b></h1>"_s.arg(tr("Third-party Libraries used by %1")),
|
||||
tr("%1 is built on the following free software libraries:", "Free as in freedom"),
|
||||
u"<ul>"_s,
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.exiv2.org/", "Exiv2", "GPLv2"),
|
||||
#endif // EXIV2_VERSION
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.qt.io/", "Qt", "GPLv2 + GPLv3 + LGPLv2.1 + LGPLv3"),
|
||||
u"</ul>"_s
|
||||
};
|
||||
|
||||
m_helpTextEdit->setText(helpStr.join('\n'));
|
||||
|
||||
m_aboutTextEdit->setText(aboutStr.join('\n'));
|
||||
m_aboutTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_specialThanksTextEdit->setText(specialThanksStr.join('\n'));
|
||||
m_specialThanksTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_licenseTextEdit->setText(licenseStr.join('\n').arg(qApp->applicationDisplayName(), mitLicense));
|
||||
|
||||
m_3rdPartyLibsTextEdit->setText(thirdPartyLibsStr.join('\n').arg(u"<i>%1</i>"_s).arg(qApp->applicationDisplayName()));
|
||||
m_3rdPartyLibsTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_tabWidget->addTab(m_helpTextEdit, tr("&Help"));
|
||||
m_tabWidget->addTab(m_aboutTextEdit, tr("&About"));
|
||||
m_tabWidget->addTab(m_specialThanksTextEdit, tr("&Special Thanks"));
|
||||
m_tabWidget->addTab(m_licenseTextEdit, tr("&License"));
|
||||
m_tabWidget->addTab(m_3rdPartyLibsTextEdit, tr("&Third-party Libraries"));
|
||||
|
||||
m_buttonBox->setStandardButtons(QDialogButtonBox::Close);
|
||||
connect(m_buttonBox, QOverload<QAbstractButton *>::of(&QDialogButtonBox::clicked), this, [this](){
|
||||
this->close();
|
||||
});
|
||||
|
||||
setLayout(new QVBoxLayout);
|
||||
|
||||
layout()->addWidget(m_tabWidget);
|
||||
layout()->addWidget(m_buttonBox);
|
||||
|
||||
setMinimumSize(361, 161); // not sure why it complain "Unable to set geometry"
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
AboutDialog::~AboutDialog()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QSize AboutDialog::sizeHint() const
|
||||
{
|
||||
return QSize(520, 350);
|
||||
}
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef ABOUTDIALOG_H
|
||||
#define ABOUTDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTextBrowser;
|
||||
class QTabWidget;
|
||||
class QDialogButtonBox;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class AboutDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AboutDialog(QWidget *parent = nullptr);
|
||||
~AboutDialog() override;
|
||||
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private:
|
||||
QTabWidget * m_tabWidget = nullptr;
|
||||
QDialogButtonBox * m_buttonBox = nullptr;
|
||||
|
||||
QTextBrowser * m_helpTextEdit = nullptr;
|
||||
QTextBrowser * m_aboutTextEdit = nullptr;
|
||||
QTextBrowser * m_specialThanksTextEdit = nullptr;
|
||||
QTextBrowser * m_licenseTextEdit = nullptr;
|
||||
QTextBrowser * m_3rdPartyLibsTextEdit = nullptr;
|
||||
};
|
||||
|
||||
#endif // ABOUTDIALOG_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef ABOUTDIALOG_H
|
||||
#define ABOUTDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTextBrowser;
|
||||
class QTabWidget;
|
||||
class QDialogButtonBox;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class AboutDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AboutDialog(QWidget *parent = nullptr);
|
||||
~AboutDialog() override;
|
||||
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private:
|
||||
QTabWidget * m_tabWidget = nullptr;
|
||||
QDialogButtonBox * m_buttonBox = nullptr;
|
||||
|
||||
QTextBrowser * m_helpTextEdit = nullptr;
|
||||
QTextBrowser * m_aboutTextEdit = nullptr;
|
||||
QTextBrowser * m_specialThanksTextEdit = nullptr;
|
||||
QTextBrowser * m_licenseTextEdit = nullptr;
|
||||
QTextBrowser * m_3rdPartyLibsTextEdit = nullptr;
|
||||
};
|
||||
|
||||
#endif // ABOUTDIALOG_H
|
||||
|
||||
@@ -1,153 +1,158 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "actionmanager.h"
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QSvgRenderer>
|
||||
#include <QPainter>
|
||||
|
||||
#define ICON_NAME(name)\
|
||||
QStringLiteral(":/icons/" #name ".svg")
|
||||
|
||||
#define ACTION_NAME(s) QStringLiteral(STRIFY(s))
|
||||
#define STRIFY(s) #s
|
||||
|
||||
QIcon ActionManager::loadHidpiIcon(const QString &resp, QSize sz)
|
||||
{
|
||||
QSvgRenderer r(resp);
|
||||
QPixmap pm = QPixmap(sz * qApp->devicePixelRatio());
|
||||
pm.fill(Qt::transparent);
|
||||
QPainter p(&pm);
|
||||
r.render(&p);
|
||||
pm.setDevicePixelRatio(qApp->devicePixelRatio());
|
||||
return QIcon(pm);
|
||||
}
|
||||
|
||||
void ActionManager::setupAction(MainWindow *mainWindow)
|
||||
{
|
||||
auto create_action = [] (QWidget *w, QAction **a, QString i, QString an, bool iconFromTheme = false) {
|
||||
*a = new QAction(w);
|
||||
if (!i.isNull())
|
||||
(*a)->setIcon(iconFromTheme ? QIcon::fromTheme(i) : ActionManager::loadHidpiIcon(i));
|
||||
(*a)->setObjectName(an);
|
||||
w->addAction(*a);
|
||||
};
|
||||
#define CREATE_NEW_ICON_ACTION(w, a, i) create_action(w, &a, ICON_NAME(i), ACTION_NAME(a))
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionActualSize, zoom-original);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleMaximize, view-fullscreen);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionZoomIn, zoom-in);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionZoomOut, zoom-out);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleCheckerboard, view-background-checkerboard);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionRotateClockwise, object-rotate-right);
|
||||
#undef CREATE_NEW_ICON_ACTION
|
||||
|
||||
#define CREATE_NEW_ACTION(w, a) create_action(w, &a, QString(), ACTION_NAME(a))
|
||||
#define CREATE_NEW_THEMEICON_ACTION(w, a, i) create_action(w, &a, QLatin1String(STRIFY(i)), ACTION_NAME(a), true)
|
||||
CREATE_NEW_ACTION(mainWindow, actionRotateCounterClockwise);
|
||||
CREATE_NEW_ACTION(mainWindow, actionPrevPicture);
|
||||
CREATE_NEW_ACTION(mainWindow, actionNextPicture);
|
||||
|
||||
CREATE_NEW_ACTION(mainWindow, actionTogglePauseAnimation);
|
||||
CREATE_NEW_ACTION(mainWindow, actionAnimationNextFrame);
|
||||
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionOpen, document-open);
|
||||
CREATE_NEW_ACTION(mainWindow, actionHorizontalFlip);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitInView);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitByWidth);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionCopyPixmap, edit-copy);
|
||||
CREATE_NEW_ACTION(mainWindow, actionCopyFilePath);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionPaste, edit-paste);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionTrash, edit-delete);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleStayOnTop);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleAvoidResetTransform);
|
||||
CREATE_NEW_ACTION(mainWindow, actionSettings);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionHelp, system-help);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionLocateInFileManager, system-file-manager);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionProperties, document-properties);
|
||||
CREATE_NEW_ACTION(mainWindow, actionQuitApp);
|
||||
#undef CREATE_NEW_ACTION
|
||||
#undef CREATE_NEW_THEMEICON_ACTION
|
||||
|
||||
retranslateUi(mainWindow);
|
||||
|
||||
QMetaObject::connectSlotsByName(mainWindow);
|
||||
}
|
||||
|
||||
void ActionManager::retranslateUi(MainWindow *mainWindow)
|
||||
{
|
||||
Q_UNUSED(mainWindow);
|
||||
|
||||
actionOpen->setText(QCoreApplication::translate("MainWindow", "&Open...", nullptr));
|
||||
|
||||
actionActualSize->setText(QCoreApplication::translate("MainWindow", "Actual size", nullptr));
|
||||
actionToggleMaximize->setText(QCoreApplication::translate("MainWindow", "Toggle maximize", nullptr));
|
||||
actionZoomIn->setText(QCoreApplication::translate("MainWindow", "Zoom in", nullptr));
|
||||
actionZoomOut->setText(QCoreApplication::translate("MainWindow", "Zoom out", nullptr));
|
||||
actionToggleCheckerboard->setText(QCoreApplication::translate("MainWindow", "Toggle Checkerboard", nullptr));
|
||||
actionRotateClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate right", nullptr));
|
||||
actionRotateCounterClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate left", nullptr));
|
||||
|
||||
actionPrevPicture->setText(QCoreApplication::translate("MainWindow", "Previous image", nullptr));
|
||||
actionNextPicture->setText(QCoreApplication::translate("MainWindow", "Next image", nullptr));
|
||||
|
||||
actionTogglePauseAnimation->setText(QCoreApplication::translate("MainWindow", "Pause/Resume Animation", nullptr));
|
||||
actionAnimationNextFrame->setText(QCoreApplication::translate("MainWindow", "Animation Go to Next Frame", nullptr));
|
||||
|
||||
actionHorizontalFlip->setText(QCoreApplication::translate("MainWindow", "Flip &Horizontally", nullptr));
|
||||
actionFitInView->setText(QCoreApplication::translate("MainWindow", "Fit to view", nullptr));
|
||||
actionFitByWidth->setText(QCoreApplication::translate("MainWindow", "Fit to width", nullptr));
|
||||
actionCopyPixmap->setText(QCoreApplication::translate("MainWindow", "Copy P&ixmap", nullptr));
|
||||
actionCopyFilePath->setText(QCoreApplication::translate("MainWindow", "Copy &File Path", nullptr));
|
||||
actionPaste->setText(QCoreApplication::translate("MainWindow", "&Paste", nullptr));
|
||||
actionTrash->setText(QCoreApplication::translate("MainWindow", "Move to Trash", nullptr));
|
||||
actionToggleStayOnTop->setText(QCoreApplication::translate("MainWindow", "Stay on top", nullptr));
|
||||
actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr));
|
||||
actionToggleAvoidResetTransform->setText(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"));
|
||||
actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
|
||||
actionHelp->setText(QCoreApplication::translate("MainWindow", "Help", nullptr));
|
||||
#ifdef Q_OS_WIN
|
||||
actionLocateInFileManager->setText(
|
||||
QCoreApplication::translate(
|
||||
"MainWindow", "Show in File Explorer",
|
||||
"File Explorer is the name of explorer.exe under Windows"
|
||||
)
|
||||
);
|
||||
#else
|
||||
actionLocateInFileManager->setText(QCoreApplication::translate("MainWindow", "Show in directory", nullptr));
|
||||
#endif // Q_OS_WIN
|
||||
actionProperties->setText(QCoreApplication::translate("MainWindow", "Properties", nullptr));
|
||||
actionQuitApp->setText(QCoreApplication::translate("MainWindow", "Quit", nullptr));
|
||||
}
|
||||
|
||||
void ActionManager::setupShortcuts()
|
||||
{
|
||||
actionOpen->setShortcut(QKeySequence::Open);
|
||||
actionActualSize->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
|
||||
actionZoomIn->setShortcut(QKeySequence::ZoomIn);
|
||||
actionZoomOut->setShortcut(QKeySequence::ZoomOut);
|
||||
actionPrevPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_PageUp),
|
||||
QKeySequence(Qt::Key_Left),
|
||||
});
|
||||
actionNextPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_PageDown),
|
||||
QKeySequence(Qt::Key_Right),
|
||||
});
|
||||
actionHorizontalFlip->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
|
||||
actionCopyPixmap->setShortcut(QKeySequence::Copy);
|
||||
actionPaste->setShortcut(QKeySequence::Paste);
|
||||
actionTrash->setShortcut(QKeySequence::Delete);
|
||||
actionHelp->setShortcut(QKeySequence::HelpContents);
|
||||
actionSettings->setShortcut(QKeySequence::Preferences);
|
||||
actionProperties->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_I));
|
||||
actionQuitApp->setShortcuts({
|
||||
QKeySequence(Qt::Key_Space),
|
||||
QKeySequence(Qt::Key_Escape)
|
||||
});
|
||||
}
|
||||
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "actionmanager.h"
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QSvgRenderer>
|
||||
#include <QPainter>
|
||||
|
||||
#define ICON_NAME(name)\
|
||||
QStringLiteral(":/icons/" #name ".svg")
|
||||
|
||||
#define ACTION_NAME(s) QStringLiteral(STRIFY(s))
|
||||
#define STRIFY(s) #s
|
||||
|
||||
QIcon ActionManager::loadHidpiIcon(const QString &resp, QSize sz)
|
||||
{
|
||||
QSvgRenderer r(resp);
|
||||
QPixmap pm = QPixmap(sz * qApp->devicePixelRatio());
|
||||
pm.fill(Qt::transparent);
|
||||
QPainter p(&pm);
|
||||
r.render(&p);
|
||||
pm.setDevicePixelRatio(qApp->devicePixelRatio());
|
||||
return QIcon(pm);
|
||||
}
|
||||
|
||||
void ActionManager::setupAction(MainWindow *mainWindow)
|
||||
{
|
||||
auto create_action = [] (QWidget *w, QAction **a, QString i, QString an, bool iconFromTheme = false) {
|
||||
*a = new QAction(w);
|
||||
if (!i.isNull())
|
||||
(*a)->setIcon(iconFromTheme ? QIcon::fromTheme(i) : ActionManager::loadHidpiIcon(i));
|
||||
(*a)->setObjectName(an);
|
||||
w->addAction(*a);
|
||||
};
|
||||
#define CREATE_NEW_ICON_ACTION(w, a, i) create_action(w, &a, ICON_NAME(i), ACTION_NAME(a))
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionActualSize, zoom-original);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleMaximize, view-fullscreen);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionZoomIn, zoom-in);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionZoomOut, zoom-out);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleCheckerboard, view-background-checkerboard);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionRotateClockwise, object-rotate-right);
|
||||
#undef CREATE_NEW_ICON_ACTION
|
||||
|
||||
#define CREATE_NEW_ACTION(w, a) create_action(w, &a, QString(), ACTION_NAME(a))
|
||||
#define CREATE_NEW_THEMEICON_ACTION(w, a, i) create_action(w, &a, QLatin1String(STRIFY(i)), ACTION_NAME(a), true)
|
||||
CREATE_NEW_ACTION(mainWindow, actionRotateCounterClockwise);
|
||||
CREATE_NEW_ACTION(mainWindow, actionPrevPicture);
|
||||
CREATE_NEW_ACTION(mainWindow, actionNextPicture);
|
||||
|
||||
CREATE_NEW_ACTION(mainWindow, actionTogglePauseAnimation);
|
||||
CREATE_NEW_ACTION(mainWindow, actionAnimationNextFrame);
|
||||
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionOpen, document-open);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionSaveAs, document-save-as);
|
||||
CREATE_NEW_ACTION(mainWindow, actionHorizontalFlip);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitInView);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitByWidth);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitLongImage);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionCopyPixmap, edit-copy);
|
||||
CREATE_NEW_ACTION(mainWindow, actionCopyFilePath);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionPaste, edit-paste);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionTrash, edit-delete);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleStayOnTop);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleAvoidResetTransform);
|
||||
CREATE_NEW_ACTION(mainWindow, actionSettings);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionHelp, system-help);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionLocateInFileManager, system-file-manager);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionProperties, document-properties);
|
||||
CREATE_NEW_ACTION(mainWindow, actionQuitApp);
|
||||
#undef CREATE_NEW_ACTION
|
||||
#undef CREATE_NEW_THEMEICON_ACTION
|
||||
|
||||
retranslateUi(mainWindow);
|
||||
|
||||
QMetaObject::connectSlotsByName(mainWindow);
|
||||
}
|
||||
|
||||
void ActionManager::retranslateUi(MainWindow *mainWindow)
|
||||
{
|
||||
Q_UNUSED(mainWindow);
|
||||
|
||||
actionOpen->setText(QCoreApplication::translate("MainWindow", "&Open...", nullptr));
|
||||
actionSaveAs->setText(QCoreApplication::translate("MainWindow", "Save &As...", nullptr));
|
||||
|
||||
actionActualSize->setText(QCoreApplication::translate("MainWindow", "Actual size", nullptr));
|
||||
actionToggleMaximize->setText(QCoreApplication::translate("MainWindow", "Toggle maximize", nullptr));
|
||||
actionZoomIn->setText(QCoreApplication::translate("MainWindow", "Zoom in", nullptr));
|
||||
actionZoomOut->setText(QCoreApplication::translate("MainWindow", "Zoom out", nullptr));
|
||||
actionToggleCheckerboard->setText(QCoreApplication::translate("MainWindow", "Toggle Checkerboard", nullptr));
|
||||
actionRotateClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate right", nullptr));
|
||||
actionRotateCounterClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate left", nullptr));
|
||||
|
||||
actionPrevPicture->setText(QCoreApplication::translate("MainWindow", "Previous image", nullptr));
|
||||
actionNextPicture->setText(QCoreApplication::translate("MainWindow", "Next image", nullptr));
|
||||
|
||||
actionTogglePauseAnimation->setText(QCoreApplication::translate("MainWindow", "Pause/Resume Animation", nullptr));
|
||||
actionAnimationNextFrame->setText(QCoreApplication::translate("MainWindow", "Animation Go to Next Frame", nullptr));
|
||||
|
||||
actionHorizontalFlip->setText(QCoreApplication::translate("MainWindow", "Flip &Horizontally", nullptr));
|
||||
actionFitInView->setText(QCoreApplication::translate("MainWindow", "Fit to view", nullptr));
|
||||
actionFitByWidth->setText(QCoreApplication::translate("MainWindow", "Fit to width", nullptr));
|
||||
actionFitLongImage->setText(QCoreApplication::translate("MainWindow", "Fit long image", nullptr));
|
||||
actionCopyPixmap->setText(QCoreApplication::translate("MainWindow", "Copy P&ixmap", nullptr));
|
||||
actionCopyFilePath->setText(QCoreApplication::translate("MainWindow", "Copy &File Path", nullptr));
|
||||
actionPaste->setText(QCoreApplication::translate("MainWindow", "&Paste", nullptr));
|
||||
actionTrash->setText(QCoreApplication::translate("MainWindow", "Move to Trash", nullptr));
|
||||
actionToggleStayOnTop->setText(QCoreApplication::translate("MainWindow", "Stay on top", nullptr));
|
||||
actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr));
|
||||
actionToggleAvoidResetTransform->setText(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"));
|
||||
actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
|
||||
actionHelp->setText(QCoreApplication::translate("MainWindow", "Help", nullptr));
|
||||
#ifdef Q_OS_WIN
|
||||
actionLocateInFileManager->setText(
|
||||
QCoreApplication::translate(
|
||||
"MainWindow", "Show in File Explorer",
|
||||
"File Explorer is the name of explorer.exe under Windows"
|
||||
)
|
||||
);
|
||||
#else
|
||||
actionLocateInFileManager->setText(QCoreApplication::translate("MainWindow", "Show in directory", nullptr));
|
||||
#endif // Q_OS_WIN
|
||||
actionProperties->setText(QCoreApplication::translate("MainWindow", "Properties", nullptr));
|
||||
actionQuitApp->setText(QCoreApplication::translate("MainWindow", "Quit", nullptr));
|
||||
}
|
||||
|
||||
void ActionManager::setupShortcuts()
|
||||
{
|
||||
actionOpen->setShortcut(QKeySequence::Open);
|
||||
actionSaveAs->setShortcut(QKeySequence::SaveAs);
|
||||
actionActualSize->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
|
||||
actionZoomIn->setShortcut(QKeySequence::ZoomIn);
|
||||
actionZoomOut->setShortcut(QKeySequence::ZoomOut);
|
||||
actionPrevPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_PageUp),
|
||||
QKeySequence(Qt::Key_Left),
|
||||
});
|
||||
actionNextPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_PageDown),
|
||||
QKeySequence(Qt::Key_Right),
|
||||
});
|
||||
actionHorizontalFlip->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
|
||||
actionCopyPixmap->setShortcut(QKeySequence::Copy);
|
||||
actionPaste->setShortcut(QKeySequence::Paste);
|
||||
actionTrash->setShortcut(QKeySequence::Delete);
|
||||
actionHelp->setShortcut(QKeySequence::HelpContents);
|
||||
actionSettings->setShortcut(QKeySequence::Preferences);
|
||||
actionProperties->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_I));
|
||||
actionQuitApp->setShortcuts({
|
||||
QKeySequence(Qt::Key_Space),
|
||||
QKeySequence(Qt::Key_Escape)
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,58 +1,60 @@
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef ACTIONMANAGER_H
|
||||
#define ACTIONMANAGER_H
|
||||
|
||||
#include <QAction>
|
||||
|
||||
class MainWindow;
|
||||
|
||||
class ActionManager
|
||||
{
|
||||
public:
|
||||
explicit ActionManager() = default;
|
||||
~ActionManager() = default;
|
||||
|
||||
void setupAction(MainWindow * mainWindow);
|
||||
void retranslateUi(MainWindow *MainWindow);
|
||||
void setupShortcuts();
|
||||
|
||||
static QIcon loadHidpiIcon(const QString &resp, QSize sz = QSize(32, 32));
|
||||
|
||||
public:
|
||||
QAction *actionOpen;
|
||||
|
||||
QAction *actionActualSize;
|
||||
QAction *actionToggleMaximize;
|
||||
QAction *actionZoomIn;
|
||||
QAction *actionZoomOut;
|
||||
QAction *actionToggleCheckerboard;
|
||||
QAction *actionRotateClockwise;
|
||||
QAction *actionRotateCounterClockwise;
|
||||
|
||||
QAction *actionPrevPicture;
|
||||
QAction *actionNextPicture;
|
||||
|
||||
QAction *actionTogglePauseAnimation;
|
||||
QAction *actionAnimationNextFrame;
|
||||
|
||||
QAction *actionHorizontalFlip;
|
||||
QAction *actionFitInView;
|
||||
QAction *actionFitByWidth;
|
||||
QAction *actionCopyPixmap;
|
||||
QAction *actionCopyFilePath;
|
||||
QAction *actionPaste;
|
||||
QAction *actionTrash;
|
||||
QAction *actionToggleStayOnTop;
|
||||
QAction *actionToggleProtectMode;
|
||||
QAction *actionToggleAvoidResetTransform;
|
||||
QAction *actionSettings;
|
||||
QAction *actionHelp;
|
||||
QAction *actionLocateInFileManager;
|
||||
QAction *actionProperties;
|
||||
QAction *actionQuitApp;
|
||||
};
|
||||
|
||||
#endif // ACTIONMANAGER_H
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef ACTIONMANAGER_H
|
||||
#define ACTIONMANAGER_H
|
||||
|
||||
#include <QAction>
|
||||
|
||||
class MainWindow;
|
||||
|
||||
class ActionManager
|
||||
{
|
||||
public:
|
||||
explicit ActionManager() = default;
|
||||
~ActionManager() = default;
|
||||
|
||||
void setupAction(MainWindow * mainWindow);
|
||||
void retranslateUi(MainWindow *MainWindow);
|
||||
void setupShortcuts();
|
||||
|
||||
static QIcon loadHidpiIcon(const QString &resp, QSize sz = QSize(32, 32));
|
||||
|
||||
public:
|
||||
QAction *actionOpen;
|
||||
QAction *actionSaveAs;
|
||||
|
||||
QAction *actionActualSize;
|
||||
QAction *actionToggleMaximize;
|
||||
QAction *actionZoomIn;
|
||||
QAction *actionZoomOut;
|
||||
QAction *actionToggleCheckerboard;
|
||||
QAction *actionRotateClockwise;
|
||||
QAction *actionRotateCounterClockwise;
|
||||
|
||||
QAction *actionPrevPicture;
|
||||
QAction *actionNextPicture;
|
||||
|
||||
QAction *actionTogglePauseAnimation;
|
||||
QAction *actionAnimationNextFrame;
|
||||
|
||||
QAction *actionHorizontalFlip;
|
||||
QAction *actionFitInView;
|
||||
QAction *actionFitByWidth;
|
||||
QAction *actionFitLongImage;
|
||||
QAction *actionCopyPixmap;
|
||||
QAction *actionCopyFilePath;
|
||||
QAction *actionPaste;
|
||||
QAction *actionTrash;
|
||||
QAction *actionToggleStayOnTop;
|
||||
QAction *actionToggleProtectMode;
|
||||
QAction *actionToggleAvoidResetTransform;
|
||||
QAction *actionSettings;
|
||||
QAction *actionHelp;
|
||||
QAction *actionLocateInFileManager;
|
||||
QAction *actionProperties;
|
||||
QAction *actionQuitApp;
|
||||
};
|
||||
|
||||
#endif // ACTIONMANAGER_H
|
||||
|
||||
@@ -1,57 +1,57 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "bottombuttongroup.h"
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QToolButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QDebug>
|
||||
|
||||
BottomButtonGroup::BottomButtonGroup(const std::vector<QAction *> &actionList, QWidget *parent)
|
||||
: QGroupBox (parent)
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
QHBoxLayout * mainLayout = new QHBoxLayout(this);
|
||||
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
this->setLayout(mainLayout);
|
||||
this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
||||
this->setStyleSheet("BottomButtonGroup {"
|
||||
"border: 1px solid gray;"
|
||||
"border-top-left-radius: 10px;"
|
||||
"border-top-right-radius: 10px;"
|
||||
"border-style: none;"
|
||||
"background-color:rgba(0,0,0,120)"
|
||||
"}"
|
||||
"QToolButton {"
|
||||
"background:transparent;"
|
||||
"}"
|
||||
"QToolButton:!focus {"
|
||||
"border-style: none;"
|
||||
"}");
|
||||
|
||||
auto newActionBtn = [this](QAction * action) -> QToolButton * {
|
||||
QToolButton * btn = new QToolButton(this);
|
||||
btn->setDefaultAction(action);
|
||||
btn->setIconSize(QSize(32, 32));
|
||||
btn->setFixedSize(40, 40);
|
||||
return btn;
|
||||
};
|
||||
|
||||
for (QAction * action : actionList) {
|
||||
addButton(newActionBtn(action));
|
||||
}
|
||||
}
|
||||
|
||||
void BottomButtonGroup::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
void BottomButtonGroup::addButton(QAbstractButton *button)
|
||||
{
|
||||
layout()->addWidget(button);
|
||||
updateGeometry();
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "bottombuttongroup.h"
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QToolButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QDebug>
|
||||
|
||||
BottomButtonGroup::BottomButtonGroup(const std::vector<QAction *> &actionList, QWidget *parent)
|
||||
: QGroupBox (parent)
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
QHBoxLayout * mainLayout = new QHBoxLayout(this);
|
||||
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
this->setLayout(mainLayout);
|
||||
this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
||||
this->setStyleSheet("BottomButtonGroup {"
|
||||
"border: 1px solid gray;"
|
||||
"border-top-left-radius: 10px;"
|
||||
"border-top-right-radius: 10px;"
|
||||
"border-style: none;"
|
||||
"background-color:rgba(0,0,0,120)"
|
||||
"}"
|
||||
"QToolButton {"
|
||||
"background:transparent;"
|
||||
"}"
|
||||
"QToolButton:!focus {"
|
||||
"border-style: none;"
|
||||
"}");
|
||||
|
||||
auto newActionBtn = [this](QAction * action) -> QToolButton * {
|
||||
QToolButton * btn = new QToolButton(this);
|
||||
btn->setDefaultAction(action);
|
||||
btn->setIconSize(QSize(32, 32));
|
||||
btn->setFixedSize(40, 40);
|
||||
return btn;
|
||||
};
|
||||
|
||||
for (QAction * action : actionList) {
|
||||
addButton(newActionBtn(action));
|
||||
}
|
||||
}
|
||||
|
||||
void BottomButtonGroup::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
void BottomButtonGroup::addButton(QAbstractButton *button)
|
||||
{
|
||||
layout()->addWidget(button);
|
||||
updateGeometry();
|
||||
}
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef BOTTOMBUTTONGROUP_H
|
||||
#define BOTTOMBUTTONGROUP_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <QAbstractButton>
|
||||
#include <QGroupBox>
|
||||
|
||||
class OpacityHelper;
|
||||
class BottomButtonGroup : public QGroupBox
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BottomButtonGroup(const std::vector<QAction *> & actionList, QWidget *parent = nullptr);
|
||||
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
void addButton(QAbstractButton *button);
|
||||
|
||||
private:
|
||||
OpacityHelper * m_opacityHelper;
|
||||
};
|
||||
|
||||
#endif // BOTTOMBUTTONGROUP_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef BOTTOMBUTTONGROUP_H
|
||||
#define BOTTOMBUTTONGROUP_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <QAbstractButton>
|
||||
#include <QGroupBox>
|
||||
|
||||
class OpacityHelper;
|
||||
class BottomButtonGroup : public QGroupBox
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BottomButtonGroup(const std::vector<QAction *> & actionList, QWidget *parent = nullptr);
|
||||
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
void addButton(QAbstractButton *button);
|
||||
|
||||
private:
|
||||
OpacityHelper * m_opacityHelper;
|
||||
};
|
||||
|
||||
#endif // BOTTOMBUTTONGROUP_H
|
||||
|
||||
@@ -1,138 +1,138 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "exiv2wrapper.h"
|
||||
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
#include <exiv2/exiv2.hpp>
|
||||
#else // HAVE_EXIV2_VERSION
|
||||
namespace Exiv2 {
|
||||
class Image {};
|
||||
}
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include <QFile>
|
||||
#include <QDebug>
|
||||
|
||||
Exiv2Wrapper::Exiv2Wrapper()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Exiv2Wrapper::~Exiv2Wrapper()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_EXIV2_VERSION // stupid AppleClang...
|
||||
template<typename Collection, typename Iterator>
|
||||
void Exiv2Wrapper::cacheSection(Collection collection)
|
||||
{
|
||||
const Collection& exifData = collection;
|
||||
Iterator it = exifData.begin(), end = exifData.end();
|
||||
for (; it != end; ++it) {
|
||||
QString key = QString::fromUtf8(it->key().c_str());
|
||||
if (it->tagName().substr(0, 2) == "0x") continue;
|
||||
// We might get exceptions like "No namespace info available for XMP prefix `Item'"
|
||||
// when trying to get tagLabel() data from a Xmpdatum if the tag is not common-used.
|
||||
// We don't care for those rare tags so let's just use a try-cache...
|
||||
try {
|
||||
QString label = QString::fromLocal8Bit(it->tagLabel().c_str());
|
||||
std::ostringstream stream;
|
||||
stream << *it;
|
||||
QString value = QString::fromUtf8(stream.str().c_str());
|
||||
m_metadataValue.insert(key, value);
|
||||
m_metadataLabel.insert(key, label);
|
||||
qDebug() << key << label << value;
|
||||
#if EXIV2_TEST_VERSION(0, 28, 0)
|
||||
} catch (Exiv2::Error & err) {
|
||||
#else // 0.27.x
|
||||
} catch (Exiv2::AnyError & err) {
|
||||
#endif // EXIV2_TEST_VERSION(0, 28, 0)
|
||||
qWarning() << "Error loading key" << key << ":" << err.what();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
|
||||
bool Exiv2Wrapper::load(const QString &filePath)
|
||||
{
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
QByteArray filePathByteArray = QFile::encodeName(filePath);
|
||||
try {
|
||||
m_exivImage.reset(Exiv2::ImageFactory::open(filePathByteArray.constData()).release());
|
||||
m_exivImage->readMetadata();
|
||||
} catch (const Exiv2::Error& error) {
|
||||
m_errMsg = QString::fromUtf8(error.what());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else // HAVE_EXIV2_VERSION
|
||||
Q_UNUSED(filePath);
|
||||
return false;
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
}
|
||||
|
||||
void Exiv2Wrapper::cacheSections()
|
||||
{
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
if (m_exivImage->checkMode(Exiv2::mdExif) & Exiv2::amRead) {
|
||||
cacheSection<Exiv2::ExifData, Exiv2::ExifData::const_iterator>(m_exivImage->exifData());
|
||||
}
|
||||
|
||||
if (m_exivImage->checkMode(Exiv2::mdIptc) & Exiv2::amRead) {
|
||||
cacheSection<Exiv2::IptcData, Exiv2::IptcData::const_iterator>(m_exivImage->iptcData());
|
||||
}
|
||||
|
||||
if (m_exivImage->checkMode(Exiv2::mdXmp) & Exiv2::amRead) {
|
||||
cacheSection<Exiv2::XmpData, Exiv2::XmpData::const_iterator>(m_exivImage->xmpData());
|
||||
}
|
||||
|
||||
// qDebug() << m_metadataValue;
|
||||
// qDebug() << m_metadataLabel;
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::comment() const
|
||||
{
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
return m_exivImage->comment().c_str();
|
||||
#else // HAVE_EXIV2_VERSION
|
||||
return QString();
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::label(const QString &key) const
|
||||
{
|
||||
return m_metadataLabel.value(key);
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::value(const QString &key) const
|
||||
{
|
||||
return m_metadataValue.value(key);
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::XmpValue(const QString &rawValue)
|
||||
{
|
||||
QString ignored;
|
||||
return Exiv2Wrapper::XmpValue(rawValue, ignored);
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::XmpValue(const QString &rawValue, QString &language)
|
||||
{
|
||||
if (rawValue.size() > 6 && rawValue.startsWith(QLatin1String("lang=\""))) {
|
||||
int pos = rawValue.indexOf('"', 6);
|
||||
|
||||
if (pos != -1) {
|
||||
language = rawValue.mid(6, pos - 6);
|
||||
return (rawValue.mid(pos + 2));
|
||||
}
|
||||
}
|
||||
|
||||
language.clear();
|
||||
return rawValue;
|
||||
}
|
||||
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "exiv2wrapper.h"
|
||||
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
#include <exiv2/exiv2.hpp>
|
||||
#else // HAVE_EXIV2_VERSION
|
||||
namespace Exiv2 {
|
||||
class Image {};
|
||||
}
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include <QFile>
|
||||
#include <QDebug>
|
||||
|
||||
Exiv2Wrapper::Exiv2Wrapper()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Exiv2Wrapper::~Exiv2Wrapper()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_EXIV2_VERSION // stupid AppleClang...
|
||||
template<typename Collection, typename Iterator>
|
||||
void Exiv2Wrapper::cacheSection(Collection collection)
|
||||
{
|
||||
const Collection& exifData = collection;
|
||||
Iterator it = exifData.begin(), end = exifData.end();
|
||||
for (; it != end; ++it) {
|
||||
QString key = QString::fromUtf8(it->key().c_str());
|
||||
if (it->tagName().substr(0, 2) == "0x") continue;
|
||||
// We might get exceptions like "No namespace info available for XMP prefix `Item'"
|
||||
// when trying to get tagLabel() data from a Xmpdatum if the tag is not common-used.
|
||||
// We don't care for those rare tags so let's just use a try-cache...
|
||||
try {
|
||||
QString label = QString::fromLocal8Bit(it->tagLabel().c_str());
|
||||
std::ostringstream stream;
|
||||
stream << *it;
|
||||
QString value = QString::fromUtf8(stream.str().c_str());
|
||||
m_metadataValue.insert(key, value);
|
||||
m_metadataLabel.insert(key, label);
|
||||
qDebug() << key << label << value;
|
||||
#if EXIV2_TEST_VERSION(0, 28, 0)
|
||||
} catch (Exiv2::Error & err) {
|
||||
#else // 0.27.x
|
||||
} catch (Exiv2::AnyError & err) {
|
||||
#endif // EXIV2_TEST_VERSION(0, 28, 0)
|
||||
qWarning() << "Error loading key" << key << ":" << err.what();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
|
||||
bool Exiv2Wrapper::load(const QString &filePath)
|
||||
{
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
QByteArray filePathByteArray = QFile::encodeName(filePath);
|
||||
try {
|
||||
m_exivImage.reset(Exiv2::ImageFactory::open(filePathByteArray.constData()).release());
|
||||
m_exivImage->readMetadata();
|
||||
} catch (const Exiv2::Error& error) {
|
||||
m_errMsg = QString::fromUtf8(error.what());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else // HAVE_EXIV2_VERSION
|
||||
Q_UNUSED(filePath);
|
||||
return false;
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
}
|
||||
|
||||
void Exiv2Wrapper::cacheSections()
|
||||
{
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
if (m_exivImage->checkMode(Exiv2::mdExif) & Exiv2::amRead) {
|
||||
cacheSection<Exiv2::ExifData, Exiv2::ExifData::const_iterator>(m_exivImage->exifData());
|
||||
}
|
||||
|
||||
if (m_exivImage->checkMode(Exiv2::mdIptc) & Exiv2::amRead) {
|
||||
cacheSection<Exiv2::IptcData, Exiv2::IptcData::const_iterator>(m_exivImage->iptcData());
|
||||
}
|
||||
|
||||
if (m_exivImage->checkMode(Exiv2::mdXmp) & Exiv2::amRead) {
|
||||
cacheSection<Exiv2::XmpData, Exiv2::XmpData::const_iterator>(m_exivImage->xmpData());
|
||||
}
|
||||
|
||||
// qDebug() << m_metadataValue;
|
||||
// qDebug() << m_metadataLabel;
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::comment() const
|
||||
{
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
return m_exivImage->comment().c_str();
|
||||
#else // HAVE_EXIV2_VERSION
|
||||
return QString();
|
||||
#endif // HAVE_EXIV2_VERSION
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::label(const QString &key) const
|
||||
{
|
||||
return m_metadataLabel.value(key);
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::value(const QString &key) const
|
||||
{
|
||||
return m_metadataValue.value(key);
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::XmpValue(const QString &rawValue)
|
||||
{
|
||||
QString ignored;
|
||||
return Exiv2Wrapper::XmpValue(rawValue, ignored);
|
||||
}
|
||||
|
||||
QString Exiv2Wrapper::XmpValue(const QString &rawValue, QString &language)
|
||||
{
|
||||
if (rawValue.size() > 6 && rawValue.startsWith(QLatin1String("lang=\""))) {
|
||||
int pos = rawValue.indexOf('"', 6);
|
||||
|
||||
if (pos != -1) {
|
||||
language = rawValue.mid(6, pos - 6);
|
||||
return (rawValue.mid(pos + 2));
|
||||
}
|
||||
}
|
||||
|
||||
language.clear();
|
||||
return rawValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef EXIV2WRAPPER_H
|
||||
#define EXIV2WRAPPER_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
|
||||
namespace Exiv2 {
|
||||
class Image;
|
||||
}
|
||||
|
||||
class Exiv2Wrapper
|
||||
{
|
||||
public:
|
||||
Exiv2Wrapper();
|
||||
~Exiv2Wrapper();
|
||||
|
||||
bool load(const QString& filePath);
|
||||
void cacheSections();
|
||||
|
||||
QString comment() const;
|
||||
QString label(const QString & key) const;
|
||||
QString value(const QString & key) const;
|
||||
|
||||
static QString XmpValue(const QString &rawValue);
|
||||
static QString XmpValue(const QString &rawValue, QString & language);
|
||||
|
||||
private:
|
||||
std::unique_ptr<Exiv2::Image> m_exivImage;
|
||||
QMap<QString, QString> m_metadataValue;
|
||||
QMap<QString, QString> m_metadataLabel;
|
||||
QString m_errMsg;
|
||||
|
||||
template<typename Collection, typename Iterator>
|
||||
void cacheSection(Collection collection);
|
||||
};
|
||||
|
||||
#endif // EXIV2WRAPPER_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef EXIV2WRAPPER_H
|
||||
#define EXIV2WRAPPER_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
|
||||
namespace Exiv2 {
|
||||
class Image;
|
||||
}
|
||||
|
||||
class Exiv2Wrapper
|
||||
{
|
||||
public:
|
||||
Exiv2Wrapper();
|
||||
~Exiv2Wrapper();
|
||||
|
||||
bool load(const QString& filePath);
|
||||
void cacheSections();
|
||||
|
||||
QString comment() const;
|
||||
QString label(const QString & key) const;
|
||||
QString value(const QString & key) const;
|
||||
|
||||
static QString XmpValue(const QString &rawValue);
|
||||
static QString XmpValue(const QString &rawValue, QString & language);
|
||||
|
||||
private:
|
||||
std::unique_ptr<Exiv2::Image> m_exivImage;
|
||||
QMap<QString, QString> m_metadataValue;
|
||||
QMap<QString, QString> m_metadataLabel;
|
||||
QString m_errMsg;
|
||||
|
||||
template<typename Collection, typename Iterator>
|
||||
void cacheSection(Collection collection);
|
||||
};
|
||||
|
||||
#endif // EXIV2WRAPPER_H
|
||||
|
||||
@@ -1,136 +1,136 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2023 Tad Young <yyc12321@outlook.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "framelesswindow.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QHoverEvent>
|
||||
#include <QApplication>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWindow>
|
||||
|
||||
FramelessWindow::FramelessWindow(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_centralLayout(new QVBoxLayout(this))
|
||||
, m_oldCursorShape(Qt::ArrowCursor)
|
||||
, m_oldEdges()
|
||||
{
|
||||
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
|
||||
this->setMouseTracking(true);
|
||||
this->setAttribute(Qt::WA_Hover, true);
|
||||
this->installEventFilter(this);
|
||||
|
||||
m_centralLayout->setContentsMargins(QMargins());
|
||||
}
|
||||
|
||||
void FramelessWindow::setCentralWidget(QWidget *widget)
|
||||
{
|
||||
if (m_centralWidget) {
|
||||
m_centralLayout->removeWidget(m_centralWidget);
|
||||
m_centralWidget->deleteLater();
|
||||
}
|
||||
|
||||
m_centralLayout->addWidget(widget);
|
||||
m_centralWidget = widget;
|
||||
}
|
||||
|
||||
void FramelessWindow::installResizeCapture(QObject* widget)
|
||||
{
|
||||
widget->installEventFilter(this);
|
||||
}
|
||||
|
||||
bool FramelessWindow::eventFilter(QObject* o, QEvent* e)
|
||||
{
|
||||
switch (e->type()) {
|
||||
case QEvent::HoverMove:
|
||||
{
|
||||
QWidget* wg = qobject_cast<QWidget*>(o);
|
||||
if (wg != nullptr)
|
||||
return mouseHover(static_cast<QHoverEvent*>(e), wg);
|
||||
|
||||
break;
|
||||
}
|
||||
case QEvent::MouseButtonPress:
|
||||
return mousePress(static_cast<QMouseEvent*>(e));
|
||||
}
|
||||
|
||||
return QWidget::eventFilter(o, e);
|
||||
}
|
||||
|
||||
bool FramelessWindow::mouseHover(QHoverEvent* event, QWidget* wg)
|
||||
{
|
||||
if (!isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
Qt::Edges edges = this->getEdgesByPos(wg->mapToGlobal(event->oldPos()), win->frameGeometry());
|
||||
|
||||
// backup & restore cursor shape
|
||||
if (edges && !m_oldEdges)
|
||||
// entering the edge. backup cursor shape
|
||||
m_oldCursorShape = win->cursor().shape();
|
||||
if (!edges && m_oldEdges)
|
||||
// leaving the edge. restore cursor shape
|
||||
win->setCursor(m_oldCursorShape);
|
||||
|
||||
// save the latest edges status
|
||||
m_oldEdges = edges;
|
||||
|
||||
// show resize cursor shape if cursor is within border
|
||||
if (edges) {
|
||||
win->setCursor(this->getCursorByEdge(edges, Qt::ArrowCursor));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FramelessWindow::mousePress(QMouseEvent* event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && !isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
Qt::Edges edges = this->getEdgesByPos(event->globalPosition().toPoint(), win->frameGeometry());
|
||||
if (edges) {
|
||||
win->startSystemResize(edges);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Qt::CursorShape FramelessWindow::getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor)
|
||||
{
|
||||
if ((edges == (Qt::TopEdge | Qt::LeftEdge)) || (edges == (Qt::RightEdge | Qt::BottomEdge)))
|
||||
return Qt::SizeFDiagCursor;
|
||||
else if ((edges == (Qt::TopEdge | Qt::RightEdge)) || (edges == (Qt::LeftEdge | Qt::BottomEdge)))
|
||||
return Qt::SizeBDiagCursor;
|
||||
else if (edges & (Qt::TopEdge | Qt::BottomEdge))
|
||||
return Qt::SizeVerCursor;
|
||||
else if (edges & (Qt::LeftEdge | Qt::RightEdge))
|
||||
return Qt::SizeHorCursor;
|
||||
else
|
||||
return default_cursor;
|
||||
}
|
||||
|
||||
Qt::Edges FramelessWindow::getEdgesByPos(const QPoint gpos, const QRect& winrect)
|
||||
{
|
||||
const int borderWidth = 8;
|
||||
Qt::Edges edges;
|
||||
|
||||
int x = gpos.x() - winrect.x();
|
||||
int y = gpos.y() - winrect.y();
|
||||
|
||||
if (x < borderWidth)
|
||||
edges |= Qt::LeftEdge;
|
||||
if (x > (winrect.width() - borderWidth))
|
||||
edges |= Qt::RightEdge;
|
||||
if (y < borderWidth)
|
||||
edges |= Qt::TopEdge;
|
||||
if (y > (winrect.height() - borderWidth))
|
||||
edges |= Qt::BottomEdge;
|
||||
|
||||
return edges;
|
||||
}
|
||||
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2023 Tad Young <yyc12321@outlook.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "framelesswindow.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QHoverEvent>
|
||||
#include <QApplication>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWindow>
|
||||
|
||||
FramelessWindow::FramelessWindow(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_centralLayout(new QVBoxLayout(this))
|
||||
, m_oldCursorShape(Qt::ArrowCursor)
|
||||
, m_oldEdges()
|
||||
{
|
||||
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
|
||||
this->setMouseTracking(true);
|
||||
this->setAttribute(Qt::WA_Hover, true);
|
||||
this->installEventFilter(this);
|
||||
|
||||
m_centralLayout->setContentsMargins(QMargins());
|
||||
}
|
||||
|
||||
void FramelessWindow::setCentralWidget(QWidget *widget)
|
||||
{
|
||||
if (m_centralWidget) {
|
||||
m_centralLayout->removeWidget(m_centralWidget);
|
||||
m_centralWidget->deleteLater();
|
||||
}
|
||||
|
||||
m_centralLayout->addWidget(widget);
|
||||
m_centralWidget = widget;
|
||||
}
|
||||
|
||||
void FramelessWindow::installResizeCapture(QObject* widget)
|
||||
{
|
||||
widget->installEventFilter(this);
|
||||
}
|
||||
|
||||
bool FramelessWindow::eventFilter(QObject* o, QEvent* e)
|
||||
{
|
||||
switch (e->type()) {
|
||||
case QEvent::HoverMove:
|
||||
{
|
||||
QWidget* wg = qobject_cast<QWidget*>(o);
|
||||
if (wg != nullptr)
|
||||
return mouseHover(static_cast<QHoverEvent*>(e), wg);
|
||||
|
||||
break;
|
||||
}
|
||||
case QEvent::MouseButtonPress:
|
||||
return mousePress(static_cast<QMouseEvent*>(e));
|
||||
}
|
||||
|
||||
return QWidget::eventFilter(o, e);
|
||||
}
|
||||
|
||||
bool FramelessWindow::mouseHover(QHoverEvent* event, QWidget* wg)
|
||||
{
|
||||
if (!isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
Qt::Edges edges = this->getEdgesByPos(wg->mapToGlobal(event->oldPos()), win->frameGeometry());
|
||||
|
||||
// backup & restore cursor shape
|
||||
if (edges && !m_oldEdges)
|
||||
// entering the edge. backup cursor shape
|
||||
m_oldCursorShape = win->cursor().shape();
|
||||
if (!edges && m_oldEdges)
|
||||
// leaving the edge. restore cursor shape
|
||||
win->setCursor(m_oldCursorShape);
|
||||
|
||||
// save the latest edges status
|
||||
m_oldEdges = edges;
|
||||
|
||||
// show resize cursor shape if cursor is within border
|
||||
if (edges) {
|
||||
win->setCursor(this->getCursorByEdge(edges, Qt::ArrowCursor));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FramelessWindow::mousePress(QMouseEvent* event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && !isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
Qt::Edges edges = this->getEdgesByPos(event->globalPosition().toPoint(), win->frameGeometry());
|
||||
if (edges) {
|
||||
win->startSystemResize(edges);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Qt::CursorShape FramelessWindow::getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor)
|
||||
{
|
||||
if ((edges == (Qt::TopEdge | Qt::LeftEdge)) || (edges == (Qt::RightEdge | Qt::BottomEdge)))
|
||||
return Qt::SizeFDiagCursor;
|
||||
else if ((edges == (Qt::TopEdge | Qt::RightEdge)) || (edges == (Qt::LeftEdge | Qt::BottomEdge)))
|
||||
return Qt::SizeBDiagCursor;
|
||||
else if (edges & (Qt::TopEdge | Qt::BottomEdge))
|
||||
return Qt::SizeVerCursor;
|
||||
else if (edges & (Qt::LeftEdge | Qt::RightEdge))
|
||||
return Qt::SizeHorCursor;
|
||||
else
|
||||
return default_cursor;
|
||||
}
|
||||
|
||||
Qt::Edges FramelessWindow::getEdgesByPos(const QPoint gpos, const QRect& winrect)
|
||||
{
|
||||
const int borderWidth = 8;
|
||||
Qt::Edges edges;
|
||||
|
||||
int x = gpos.x() - winrect.x();
|
||||
int y = gpos.y() - winrect.y();
|
||||
|
||||
if (x < borderWidth)
|
||||
edges |= Qt::LeftEdge;
|
||||
if (x > (winrect.width() - borderWidth))
|
||||
edges |= Qt::RightEdge;
|
||||
if (y < borderWidth)
|
||||
edges |= Qt::TopEdge;
|
||||
if (y > (winrect.height() - borderWidth))
|
||||
edges |= Qt::BottomEdge;
|
||||
|
||||
return edges;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef FRAMELESSWINDOW_H
|
||||
#define FRAMELESSWINDOW_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QVBoxLayout;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class FramelessWindow : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FramelessWindow(QWidget *parent = nullptr);
|
||||
|
||||
void setCentralWidget(QWidget * widget);
|
||||
void installResizeCapture(QObject* widget);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *o, QEvent *e) override;
|
||||
bool mouseHover(QHoverEvent* event, QWidget* wg);
|
||||
bool mousePress(QMouseEvent* event);
|
||||
|
||||
private:
|
||||
Qt::Edges m_oldEdges;
|
||||
Qt::CursorShape m_oldCursorShape;
|
||||
|
||||
Qt::CursorShape getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor);
|
||||
Qt::Edges getEdgesByPos(const QPoint pos, const QRect& winrect);
|
||||
|
||||
QVBoxLayout * m_centralLayout = nullptr;
|
||||
QWidget * m_centralWidget = nullptr; // just a pointer, doesn't take the ownership.
|
||||
};
|
||||
|
||||
#endif // FRAMELESSWINDOW_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef FRAMELESSWINDOW_H
|
||||
#define FRAMELESSWINDOW_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QVBoxLayout;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class FramelessWindow : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FramelessWindow(QWidget *parent = nullptr);
|
||||
|
||||
void setCentralWidget(QWidget * widget);
|
||||
void installResizeCapture(QObject* widget);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *o, QEvent *e) override;
|
||||
bool mouseHover(QHoverEvent* event, QWidget* wg);
|
||||
bool mousePress(QMouseEvent* event);
|
||||
|
||||
private:
|
||||
Qt::Edges m_oldEdges;
|
||||
Qt::CursorShape m_oldCursorShape;
|
||||
|
||||
Qt::CursorShape getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor);
|
||||
Qt::Edges getEdgesByPos(const QPoint pos, const QRect& winrect);
|
||||
|
||||
QVBoxLayout * m_centralLayout = nullptr;
|
||||
QWidget * m_centralWidget = nullptr; // just a pointer, doesn't take the ownership.
|
||||
};
|
||||
|
||||
#endif // FRAMELESSWINDOW_H
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include "graphicsscene.h"
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QMimeData>
|
||||
#include <QDebug>
|
||||
@@ -130,10 +132,9 @@ void GraphicsScene::showSvg(const QString &filepath)
|
||||
QGraphicsSvgItem * svgItem = new QGraphicsSvgItem();
|
||||
QSvgRenderer * render = new QSvgRenderer(svgItem);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
// Qt 6.7.0's SVG support is terrible caused by huge memory usage, see QTBUG-124287
|
||||
// Qt 6.7.1's is somewhat better, memory issue seems fixed, but still laggy when zoom in,
|
||||
// see QTBUG-126771. Anyway let's disable it for now.
|
||||
render->setOptions(QtSvg::Tiny12FeaturesOnly);
|
||||
if (Settings::instance()->svgTiny12Only()) {
|
||||
render->setOptions(QtSvg::Tiny12FeaturesOnly);
|
||||
}
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
render->load(filepath);
|
||||
svgItem->setSharedRenderer(render);
|
||||
|
||||
@@ -1,371 +1,509 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "graphicsview.h"
|
||||
|
||||
#include "graphicsscene.h"
|
||||
#include "settings.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMouseEvent>
|
||||
#include <QScrollBar>
|
||||
#include <QMimeData>
|
||||
#include <QImageReader>
|
||||
#include <QStyleOptionGraphicsItem>
|
||||
|
||||
GraphicsView::GraphicsView(QWidget *parent)
|
||||
: QGraphicsView (parent)
|
||||
{
|
||||
setDragMode(QGraphicsView::ScrollHandDrag);
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
|
||||
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
||||
setStyleSheet("background-color: rgba(0, 0, 0, 220);"
|
||||
"border-radius: 3px;");
|
||||
setAcceptDrops(false);
|
||||
setCheckerboardEnabled(false);
|
||||
|
||||
connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
|
||||
connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
|
||||
}
|
||||
|
||||
void GraphicsView::showFileFromPath(const QString &filePath)
|
||||
{
|
||||
emit navigatorViewRequired(false, transform());
|
||||
|
||||
if (filePath.endsWith(".svg")) {
|
||||
showSvg(filePath);
|
||||
} else {
|
||||
QImageReader imageReader(filePath);
|
||||
imageReader.setAutoTransform(true);
|
||||
imageReader.setDecideFormatFromContent(true);
|
||||
imageReader.setAllocationLimit(0);
|
||||
|
||||
// Since if the image format / plugin does not support this feature, imageFormat() will returns an invalid format.
|
||||
// So we cannot use imageFormat() and check if it returns QImage::Format_Invalid to detect if we support the file.
|
||||
// QImage::Format imageFormat = imageReader.imageFormat();
|
||||
if (imageReader.format().isEmpty()) {
|
||||
showText(tr("File is not a valid image"));
|
||||
} else if (imageReader.supportsAnimation() && imageReader.imageCount() > 1) {
|
||||
showAnimated(filePath);
|
||||
} else if (!imageReader.canRead()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
QPixmap && pixmap = QPixmap::fromImageReader(&imageReader);
|
||||
if (pixmap.isNull()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
pixmap.setDevicePixelRatio(devicePixelRatioF());
|
||||
showImage(pixmap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::showImage(const QPixmap &pixmap)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showImage(pixmap);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showImage(const QImage &image)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showImage(QPixmap::fromImage(image));
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showText(const QString &text)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showText(text);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showSvg(const QString &filepath)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showSvg(filepath);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showAnimated(const QString &filepath)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showAnimated(filepath);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
GraphicsScene *GraphicsView::scene() const
|
||||
{
|
||||
return qobject_cast<GraphicsScene*>(QGraphicsView::scene());
|
||||
}
|
||||
|
||||
void GraphicsView::setScene(GraphicsScene *scene)
|
||||
{
|
||||
return QGraphicsView::setScene(scene);
|
||||
}
|
||||
|
||||
qreal GraphicsView::scaleFactor() const
|
||||
{
|
||||
return QStyleOptionGraphicsItem::levelOfDetailFromTransform(transform());
|
||||
}
|
||||
|
||||
void GraphicsView::resetTransform()
|
||||
{
|
||||
if (!shouldAvoidTransform()) {
|
||||
QGraphicsView::resetTransform();
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::zoomView(qreal scaleFactor)
|
||||
{
|
||||
m_enableFitInView = false;
|
||||
scale(scaleFactor, scaleFactor);
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
// This is always according to user's view.
|
||||
// the direction of the rotation will NOT be clockwise because the y-axis points downwards.
|
||||
void GraphicsView::rotateView(bool clockwise)
|
||||
{
|
||||
resetScale();
|
||||
|
||||
QTransform tf(0, clockwise ? 1 : -1, 0,
|
||||
clockwise ? -1 : 1, 0, 0,
|
||||
0, 0, 1);
|
||||
tf = transform() * tf;
|
||||
setTransform(tf);
|
||||
}
|
||||
|
||||
void GraphicsView::flipView(bool horizontal)
|
||||
{
|
||||
QTransform tf(horizontal ? -1 : 1, 0, 0,
|
||||
0, horizontal ? 1 : -1, 0,
|
||||
0, 0, 1);
|
||||
tf = transform() * tf;
|
||||
setTransform(tf);
|
||||
|
||||
// Ensure the navigation view is also flipped.
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
void GraphicsView::resetScale()
|
||||
{
|
||||
setTransform(resetScale(transform()));
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
void GraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode)
|
||||
{
|
||||
QGraphicsView::fitInView(rect, aspectRadioMode);
|
||||
applyTransformationModeByScaleFactor();
|
||||
}
|
||||
|
||||
void GraphicsView::fitByOrientation(Qt::Orientation ori, bool scaleDownOnly)
|
||||
{
|
||||
resetScale();
|
||||
|
||||
QRectF viewRect = this->viewport()->rect().adjusted(2, 2, -2, -2);
|
||||
QRectF imageRect = transform().mapRect(sceneRect());
|
||||
|
||||
qreal ratio;
|
||||
|
||||
if (ori == Qt::Horizontal) {
|
||||
ratio = viewRect.width() / imageRect.width();
|
||||
} else {
|
||||
ratio = viewRect.height() / imageRect.height();
|
||||
}
|
||||
|
||||
if (scaleDownOnly && ratio > 1) ratio = 1;
|
||||
|
||||
scale(ratio, ratio);
|
||||
centerOn(imageRect.top(), 0);
|
||||
m_enableFitInView = false;
|
||||
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
void GraphicsView::displayScene()
|
||||
{
|
||||
if (shouldAvoidTransform()) {
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
return;
|
||||
}
|
||||
|
||||
if (isSceneBiggerThanView()) {
|
||||
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||
}
|
||||
|
||||
m_enableFitInView = true;
|
||||
m_firstUserMediaLoaded = true;
|
||||
}
|
||||
|
||||
bool GraphicsView::isSceneBiggerThanView() const
|
||||
{
|
||||
if (!isThingSmallerThanWindowWith(transform())) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Automately do fit in view when viewport(window) smaller than image original size.
|
||||
void GraphicsView::setEnableAutoFitInView(bool enable)
|
||||
{
|
||||
m_enableFitInView = enable;
|
||||
}
|
||||
|
||||
bool GraphicsView::avoidResetTransform() const
|
||||
{
|
||||
return m_avoidResetTransform;
|
||||
}
|
||||
|
||||
void GraphicsView::setAvoidResetTransform(bool avoidReset)
|
||||
{
|
||||
m_avoidResetTransform = avoidReset;
|
||||
}
|
||||
|
||||
inline double zeroOrOne(double number)
|
||||
{
|
||||
return qFuzzyIsNull(number) ? 0 : (number > 0 ? 1 : -1);
|
||||
}
|
||||
|
||||
// Note: this only works if we only have 90 degree based rotation
|
||||
// and no shear/translate.
|
||||
QTransform GraphicsView::resetScale(const QTransform & orig)
|
||||
{
|
||||
return QTransform(zeroOrOne(orig.m11()), zeroOrOne(orig.m12()),
|
||||
zeroOrOne(orig.m21()), zeroOrOne(orig.m22()),
|
||||
orig.dx(), orig.dy());
|
||||
}
|
||||
|
||||
void GraphicsView::toggleCheckerboard(bool invertCheckerboardColor)
|
||||
{
|
||||
setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor);
|
||||
}
|
||||
|
||||
void GraphicsView::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (shouldIgnoreMousePressMoveEvent(event)) {
|
||||
event->ignore();
|
||||
// blumia: return here, or the QMouseEvent event transparency won't
|
||||
// work if we set a QGraphicsView::ScrollHandDrag drag mode.
|
||||
return;
|
||||
}
|
||||
|
||||
return QGraphicsView::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void GraphicsView::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (shouldIgnoreMousePressMoveEvent(event)) {
|
||||
event->ignore();
|
||||
}
|
||||
|
||||
return QGraphicsView::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
void GraphicsView::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::ForwardButton || event->button() == Qt::BackButton) {
|
||||
event->ignore();
|
||||
} else {
|
||||
QGraphicsItem *item = itemAt(event->pos());
|
||||
if (!item) {
|
||||
event->ignore();
|
||||
}
|
||||
}
|
||||
|
||||
return QGraphicsView::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
void GraphicsView::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
event->ignore();
|
||||
// blumia: no need for calling parent method.
|
||||
}
|
||||
|
||||
void GraphicsView::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
if (m_enableFitInView) {
|
||||
bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(resetScale(transform()));
|
||||
if (originalSizeSmallerThanWindow && scaleFactor() >= 1) {
|
||||
// no longer need to do fitInView()
|
||||
// but we leave the m_enableFitInView value unchanged in case
|
||||
// user resize down the window again.
|
||||
} else if (originalSizeSmallerThanWindow && scaleFactor() < 1) {
|
||||
resetScale();
|
||||
} else {
|
||||
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||
}
|
||||
} else {
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
return QGraphicsView::resizeEvent(event);
|
||||
}
|
||||
|
||||
bool GraphicsView::isThingSmallerThanWindowWith(const QTransform &transform) const
|
||||
{
|
||||
return rect().size().expandedTo(transform.mapRect(sceneRect()).size().toSize())
|
||||
== rect().size();
|
||||
}
|
||||
|
||||
bool GraphicsView::shouldIgnoreMousePressMoveEvent(const QMouseEvent *event) const
|
||||
{
|
||||
if (event->buttons() == Qt::NoButton) {
|
||||
return true;
|
||||
}
|
||||
|
||||
QGraphicsItem *item = itemAt(event->pos());
|
||||
if (!item) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isThingSmallerThanWindowWith(transform())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void GraphicsView::setCheckerboardEnabled(bool enabled, bool invertColor)
|
||||
{
|
||||
m_checkerboardEnabled = enabled;
|
||||
bool isLightCheckerboard = Settings::instance()->useLightCheckerboard() ^ invertColor;
|
||||
if (m_checkerboardEnabled) {
|
||||
// Prepare background check-board pattern
|
||||
QPixmap tilePixmap(0x20, 0x20);
|
||||
tilePixmap.fill(isLightCheckerboard ? QColor(220, 220, 220, 170) : QColor(35, 35, 35, 170));
|
||||
QPainter tilePainter(&tilePixmap);
|
||||
constexpr QColor color(45, 45, 45, 170);
|
||||
constexpr QColor invertedColor(210, 210, 210, 170);
|
||||
tilePainter.fillRect(0, 0, 0x10, 0x10, isLightCheckerboard ? invertedColor : color);
|
||||
tilePainter.fillRect(0x10, 0x10, 0x10, 0x10, isLightCheckerboard ? invertedColor : color);
|
||||
tilePainter.end();
|
||||
|
||||
setBackgroundBrush(tilePixmap);
|
||||
} else {
|
||||
setBackgroundBrush(Qt::transparent);
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::applyTransformationModeByScaleFactor()
|
||||
{
|
||||
if (this->scaleFactor() < 1) {
|
||||
scene()->trySetTransformationMode(Qt::SmoothTransformation, this->scaleFactor());
|
||||
} else {
|
||||
scene()->trySetTransformationMode(Qt::FastTransformation, this->scaleFactor());
|
||||
}
|
||||
}
|
||||
|
||||
bool GraphicsView::shouldAvoidTransform() const
|
||||
{
|
||||
return m_firstUserMediaLoaded && m_avoidResetTransform;
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "graphicsview.h"
|
||||
|
||||
#include "graphicsscene.h"
|
||||
#include "settings.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QColorSpace>
|
||||
#include <QMouseEvent>
|
||||
#include <QScrollBar>
|
||||
#include <QMimeData>
|
||||
#include <QImageReader>
|
||||
#include <QStyleOptionGraphicsItem>
|
||||
|
||||
GraphicsView::GraphicsView(QWidget *parent)
|
||||
: QGraphicsView (parent)
|
||||
{
|
||||
setDragMode(QGraphicsView::ScrollHandDrag);
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
|
||||
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
||||
setStyleSheet("background-color: rgba(0, 0, 0, 220);"
|
||||
"border-radius: 3px;");
|
||||
setAcceptDrops(false);
|
||||
setCheckerboardEnabled(false);
|
||||
|
||||
connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
|
||||
connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
|
||||
}
|
||||
|
||||
void GraphicsView::showFileFromPath(const QString &filePath)
|
||||
{
|
||||
emit navigatorViewRequired(false, transform());
|
||||
|
||||
if (filePath.endsWith(".svg")) {
|
||||
showSvg(filePath);
|
||||
} else {
|
||||
QImageReader imageReader(filePath);
|
||||
imageReader.setAutoTransform(true);
|
||||
imageReader.setDecideFormatFromContent(true);
|
||||
imageReader.setAllocationLimit(0);
|
||||
|
||||
// Since if the image format / plugin does not support this feature, imageFormat() will returns an invalid format.
|
||||
// So we cannot use imageFormat() and check if it returns QImage::Format_Invalid to detect if we support the file.
|
||||
// QImage::Format imageFormat = imageReader.imageFormat();
|
||||
if (imageReader.format().isEmpty()) {
|
||||
showText(tr("File is not a valid image"));
|
||||
} else if (imageReader.supportsAnimation() && imageReader.imageCount() > 1) {
|
||||
showAnimated(filePath);
|
||||
} else if (!imageReader.canRead()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
QImage && img = imageReader.read();
|
||||
if (img.isNull()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
if (img.format() == QImage::Format_CMYK8888) {
|
||||
img.convertToColorSpace(QColorSpace::SRgb);
|
||||
}
|
||||
img.setDevicePixelRatio(devicePixelRatioF());
|
||||
showImage(img);
|
||||
}
|
||||
#else
|
||||
QPixmap && pixmap = QPixmap::fromImageReader(&imageReader);
|
||||
if (pixmap.isNull()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
pixmap.setDevicePixelRatio(devicePixelRatioF());
|
||||
showImage(pixmap);
|
||||
}
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::showImage(const QPixmap &pixmap)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showImage(pixmap);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showImage(const QImage &image)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showImage(QPixmap::fromImage(image));
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showText(const QString &text)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showText(text);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showSvg(const QString &filepath)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showSvg(filepath);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
void GraphicsView::showAnimated(const QString &filepath)
|
||||
{
|
||||
resetTransform();
|
||||
scene()->showAnimated(filepath);
|
||||
displayScene();
|
||||
}
|
||||
|
||||
GraphicsScene *GraphicsView::scene() const
|
||||
{
|
||||
return qobject_cast<GraphicsScene*>(QGraphicsView::scene());
|
||||
}
|
||||
|
||||
void GraphicsView::setScene(GraphicsScene *scene)
|
||||
{
|
||||
return QGraphicsView::setScene(scene);
|
||||
}
|
||||
|
||||
qreal GraphicsView::scaleFactor() const
|
||||
{
|
||||
return QStyleOptionGraphicsItem::levelOfDetailFromTransform(transform());
|
||||
}
|
||||
|
||||
void GraphicsView::resetTransform()
|
||||
{
|
||||
if (!shouldAvoidTransform()) {
|
||||
QGraphicsView::resetTransform();
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::zoomView(qreal scaleFactor)
|
||||
{
|
||||
m_enableFitInView = false;
|
||||
m_longImageMode = false;
|
||||
scale(scaleFactor, scaleFactor);
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
// This is always according to user's view.
|
||||
// the direction of the rotation will NOT be clockwise because the y-axis points downwards.
|
||||
void GraphicsView::rotateView(bool clockwise)
|
||||
{
|
||||
resetScale();
|
||||
|
||||
QTransform tf(0, clockwise ? 1 : -1, 0,
|
||||
clockwise ? -1 : 1, 0, 0,
|
||||
0, 0, 1);
|
||||
tf = transform() * tf;
|
||||
setTransform(tf);
|
||||
|
||||
// Apply transformation mode but don't emit navigator signal here
|
||||
// Let displayScene() handle the navigator visibility correctly
|
||||
applyTransformationModeByScaleFactor();
|
||||
}
|
||||
|
||||
void GraphicsView::flipView(bool horizontal)
|
||||
{
|
||||
QTransform tf(horizontal ? -1 : 1, 0, 0,
|
||||
0, horizontal ? 1 : -1, 0,
|
||||
0, 0, 1);
|
||||
tf = transform() * tf;
|
||||
setTransform(tf);
|
||||
|
||||
// Ensure the navigation view is also flipped.
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
void GraphicsView::resetScale()
|
||||
{
|
||||
setTransform(resetScale(transform()));
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
void GraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode)
|
||||
{
|
||||
QGraphicsView::fitInView(rect, aspectRadioMode);
|
||||
applyTransformationModeByScaleFactor();
|
||||
}
|
||||
|
||||
void GraphicsView::fitByOrientation(Qt::Orientation ori, bool scaleDownOnly)
|
||||
{
|
||||
resetScale();
|
||||
|
||||
QRectF viewRect = this->viewport()->rect();
|
||||
QRectF imageRect = transform().mapRect(sceneRect());
|
||||
QSize viewSize = viewRect.size().toSize();
|
||||
|
||||
qreal ratio;
|
||||
|
||||
if (ori == Qt::Horizontal) {
|
||||
// Horizontal fit means fit by width
|
||||
if (scaleDownOnly && imageRect.width() <= viewSize.width()) {
|
||||
// Image width already fits, no scaling needed
|
||||
ratio = 1;
|
||||
} else {
|
||||
ratio = viewRect.width() / imageRect.width();
|
||||
}
|
||||
} else {
|
||||
// Vertical fit means fit by height
|
||||
if (scaleDownOnly && imageRect.height() <= viewSize.height()) {
|
||||
// Image height already fits, no scaling needed
|
||||
ratio = 1;
|
||||
} else {
|
||||
ratio = viewRect.height() / imageRect.height();
|
||||
}
|
||||
}
|
||||
|
||||
if (ratio != 1) {
|
||||
scale(ratio, ratio);
|
||||
}
|
||||
|
||||
// Position the image correctly based on orientation with rotation consideration
|
||||
QRectF originalScene = sceneRect();
|
||||
QTransform currentTransform = transform();
|
||||
|
||||
if (ori == Qt::Horizontal) {
|
||||
// For horizontal fit (fit by width), position at top (for tall images)
|
||||
// Find the scene point that corresponds to the top-center of the transformed image
|
||||
QPointF sceneTopCenter;
|
||||
|
||||
if (qFuzzyIsNull(currentTransform.m12()) && qFuzzyIsNull(currentTransform.m21())) {
|
||||
// 0° or 180° rotation
|
||||
if (currentTransform.m11() > 0 && currentTransform.m22() > 0) {
|
||||
// 0° rotation: use original top-center
|
||||
sceneTopCenter = QPointF(originalScene.center().x(), originalScene.top());
|
||||
} else {
|
||||
// 180° rotation: the visual "top" is now at the scene bottom
|
||||
sceneTopCenter = QPointF(originalScene.center().x(), originalScene.bottom());
|
||||
}
|
||||
} else {
|
||||
// 90/270 degree rotation: the "top" in view corresponds to left/right in scene
|
||||
if (currentTransform.m12() > 0) {
|
||||
// 90 degree: top in view = left in scene
|
||||
sceneTopCenter = QPointF(originalScene.left(), originalScene.center().y());
|
||||
} else {
|
||||
// 270 degree: top in view = right in scene
|
||||
sceneTopCenter = QPointF(originalScene.right(), originalScene.center().y());
|
||||
}
|
||||
}
|
||||
centerOn(sceneTopCenter);
|
||||
} else {
|
||||
// For vertical fit (fit by height), position at left (for wide images)
|
||||
// Find the scene point that corresponds to the left-center of the transformed image
|
||||
QPointF sceneLeftCenter;
|
||||
|
||||
if (qFuzzyIsNull(currentTransform.m12()) && qFuzzyIsNull(currentTransform.m21())) {
|
||||
// 0° or 180° rotation
|
||||
if (currentTransform.m11() > 0 && currentTransform.m22() > 0) {
|
||||
// 0° rotation: use original left-center
|
||||
sceneLeftCenter = QPointF(originalScene.left(), originalScene.center().y());
|
||||
} else {
|
||||
// 180° rotation: the visual "left" is now at the scene right
|
||||
sceneLeftCenter = QPointF(originalScene.right(), originalScene.center().y());
|
||||
}
|
||||
} else {
|
||||
// 90/270 degree rotation: the "left" in view corresponds to top/bottom in scene
|
||||
if (currentTransform.m21() > 0) {
|
||||
// 90 degree: left in view = top in scene
|
||||
sceneLeftCenter = QPointF(originalScene.center().x(), originalScene.top());
|
||||
} else {
|
||||
// 270 degree: left in view = bottom in scene
|
||||
sceneLeftCenter = QPointF(originalScene.center().x(), originalScene.bottom());
|
||||
}
|
||||
}
|
||||
centerOn(sceneLeftCenter);
|
||||
}
|
||||
|
||||
m_enableFitInView = false;
|
||||
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
bool GraphicsView::isLongImage() const
|
||||
{
|
||||
// Get the transformed image size (considering rotation and other transforms)
|
||||
QRectF transformedRect = transform().mapRect(sceneRect());
|
||||
QSizeF imageSize = transformedRect.size();
|
||||
|
||||
if (imageSize.isEmpty()) return false;
|
||||
|
||||
qreal aspectRatio = imageSize.width() / imageSize.height();
|
||||
|
||||
// Check if aspect ratio exceeds 5:2 (wide) or 2:5 (tall)
|
||||
return aspectRatio > 2.5 || aspectRatio < 0.4;
|
||||
}
|
||||
|
||||
void GraphicsView::fitLongImage()
|
||||
{
|
||||
QRectF transformedRect = transform().mapRect(sceneRect());
|
||||
|
||||
if (transformedRect.width() < transformedRect.height()) {
|
||||
fitByOrientation(Qt::Horizontal, true);
|
||||
} else {
|
||||
fitByOrientation(Qt::Vertical, true);
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::displayScene()
|
||||
{
|
||||
if (shouldAvoidTransform()) {
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if should apply long image mode
|
||||
if (Settings::instance()->autoLongImageMode() && isLongImage()) {
|
||||
m_longImageMode = true;
|
||||
m_firstUserMediaLoaded = true;
|
||||
if (isSceneBiggerThanView()) fitLongImage();
|
||||
return;
|
||||
}
|
||||
|
||||
if (isSceneBiggerThanView()) {
|
||||
// Do fit-in-view
|
||||
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||
// After fitInView, the image should fit the window, so hide navigator
|
||||
emit navigatorViewRequired(false, transform());
|
||||
} else {
|
||||
// Image is already smaller than window, no navigator needed
|
||||
emit navigatorViewRequired(false, transform());
|
||||
}
|
||||
|
||||
m_longImageMode = false;
|
||||
m_enableFitInView = true;
|
||||
m_firstUserMediaLoaded = true;
|
||||
}
|
||||
|
||||
bool GraphicsView::isSceneBiggerThanView() const
|
||||
{
|
||||
if (!isThingSmallerThanWindowWith(transform())) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Automately do fit in view when viewport(window) smaller than image original size.
|
||||
void GraphicsView::setEnableAutoFitInView(bool enable)
|
||||
{
|
||||
m_enableFitInView = enable;
|
||||
}
|
||||
|
||||
void GraphicsView::setLongImageMode(bool enable)
|
||||
{
|
||||
m_longImageMode = enable;
|
||||
}
|
||||
|
||||
bool GraphicsView::avoidResetTransform() const
|
||||
{
|
||||
return m_avoidResetTransform;
|
||||
}
|
||||
|
||||
void GraphicsView::setAvoidResetTransform(bool avoidReset)
|
||||
{
|
||||
m_avoidResetTransform = avoidReset;
|
||||
}
|
||||
|
||||
inline double zeroOrOne(double number)
|
||||
{
|
||||
return qFuzzyIsNull(number) ? 0 : (number > 0 ? 1 : -1);
|
||||
}
|
||||
|
||||
// Note: this only works if we only have 90 degree based rotation
|
||||
// and no shear/translate.
|
||||
QTransform GraphicsView::resetScale(const QTransform & orig)
|
||||
{
|
||||
return QTransform(zeroOrOne(orig.m11()), zeroOrOne(orig.m12()),
|
||||
zeroOrOne(orig.m21()), zeroOrOne(orig.m22()),
|
||||
orig.dx(), orig.dy());
|
||||
}
|
||||
|
||||
void GraphicsView::toggleCheckerboard(bool invertCheckerboardColor)
|
||||
{
|
||||
setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor);
|
||||
}
|
||||
|
||||
void GraphicsView::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (shouldIgnoreMousePressMoveEvent(event)) {
|
||||
event->ignore();
|
||||
// blumia: return here, or the QMouseEvent event transparency won't
|
||||
// work if we set a QGraphicsView::ScrollHandDrag drag mode.
|
||||
return;
|
||||
}
|
||||
|
||||
return QGraphicsView::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void GraphicsView::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (shouldIgnoreMousePressMoveEvent(event)) {
|
||||
event->ignore();
|
||||
}
|
||||
|
||||
return QGraphicsView::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
void GraphicsView::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::ForwardButton || event->button() == Qt::BackButton) {
|
||||
event->ignore();
|
||||
} else {
|
||||
QGraphicsItem *item = itemAt(event->pos());
|
||||
if (!item) {
|
||||
event->ignore();
|
||||
}
|
||||
}
|
||||
|
||||
return QGraphicsView::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
void GraphicsView::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
event->ignore();
|
||||
// blumia: no need for calling parent method.
|
||||
}
|
||||
|
||||
void GraphicsView::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
if (m_longImageMode) {
|
||||
// In long image mode, reapply long image logic on resize
|
||||
// We directly apply the long image mode logic without rechecking
|
||||
// if we should enter long image mode, as the mode is already active
|
||||
fitLongImage();
|
||||
} else if (m_enableFitInView) {
|
||||
bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(resetScale(transform()));
|
||||
if (originalSizeSmallerThanWindow && scaleFactor() >= 1) {
|
||||
// no longer need to do fitInView()
|
||||
// but we leave the m_enableFitInView value unchanged in case
|
||||
// user resize down the window again.
|
||||
} else if (originalSizeSmallerThanWindow && scaleFactor() < 1) {
|
||||
resetScale();
|
||||
} else {
|
||||
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||
}
|
||||
} else {
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
return QGraphicsView::resizeEvent(event);
|
||||
}
|
||||
|
||||
bool GraphicsView::isThingSmallerThanWindowWith(const QTransform &transform) const
|
||||
{
|
||||
return rect().size().expandedTo(transform.mapRect(sceneRect()).size().toSize())
|
||||
== rect().size();
|
||||
}
|
||||
|
||||
bool GraphicsView::shouldIgnoreMousePressMoveEvent(const QMouseEvent *event) const
|
||||
{
|
||||
if (event->buttons() == Qt::NoButton) {
|
||||
return true;
|
||||
}
|
||||
|
||||
QGraphicsItem *item = itemAt(event->pos());
|
||||
if (!item) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (isThingSmallerThanWindowWith(transform())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void GraphicsView::setCheckerboardEnabled(bool enabled, bool invertColor)
|
||||
{
|
||||
m_checkerboardEnabled = enabled;
|
||||
bool isLightCheckerboard = Settings::instance()->useLightCheckerboard() ^ invertColor;
|
||||
if (m_checkerboardEnabled) {
|
||||
// Prepare background check-board pattern
|
||||
QPixmap tilePixmap(0x20, 0x20);
|
||||
tilePixmap.fill(isLightCheckerboard ? QColor(220, 220, 220, 170) : QColor(35, 35, 35, 170));
|
||||
QPainter tilePainter(&tilePixmap);
|
||||
constexpr QColor color(45, 45, 45, 170);
|
||||
constexpr QColor invertedColor(210, 210, 210, 170);
|
||||
tilePainter.fillRect(0, 0, 0x10, 0x10, isLightCheckerboard ? invertedColor : color);
|
||||
tilePainter.fillRect(0x10, 0x10, 0x10, 0x10, isLightCheckerboard ? invertedColor : color);
|
||||
tilePainter.end();
|
||||
|
||||
setBackgroundBrush(tilePixmap);
|
||||
} else {
|
||||
setBackgroundBrush(Qt::transparent);
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::applyTransformationModeByScaleFactor()
|
||||
{
|
||||
if (this->scaleFactor() < 1) {
|
||||
scene()->trySetTransformationMode(Qt::SmoothTransformation, this->scaleFactor());
|
||||
} else {
|
||||
scene()->trySetTransformationMode(Qt::FastTransformation, this->scaleFactor());
|
||||
}
|
||||
}
|
||||
|
||||
bool GraphicsView::shouldAvoidTransform() const
|
||||
{
|
||||
return m_firstUserMediaLoaded && m_avoidResetTransform;
|
||||
}
|
||||
|
||||
@@ -1,79 +1,85 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef GRAPHICSVIEW_H
|
||||
#define GRAPHICSVIEW_H
|
||||
|
||||
#include <QGraphicsView>
|
||||
#include <QUrl>
|
||||
|
||||
class GraphicsScene;
|
||||
class GraphicsView : public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GraphicsView(QWidget *parent = nullptr);
|
||||
|
||||
void showFileFromPath(const QString &filePath);
|
||||
|
||||
void showImage(const QPixmap &pixmap);
|
||||
void showImage(const QImage &image);
|
||||
void showText(const QString &text);
|
||||
void showSvg(const QString &filepath);
|
||||
void showAnimated(const QString &filepath);
|
||||
|
||||
GraphicsScene * scene() const;
|
||||
void setScene(GraphicsScene *scene);
|
||||
|
||||
qreal scaleFactor() const;
|
||||
|
||||
void resetTransform();
|
||||
void zoomView(qreal scaleFactor);
|
||||
void rotateView(bool clockwise = true);
|
||||
void flipView(bool horizontal = true);
|
||||
void resetScale();
|
||||
void fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode = Qt::IgnoreAspectRatio);
|
||||
void fitByOrientation(Qt::Orientation ori = Qt::Horizontal, bool scaleDownOnly = false);
|
||||
|
||||
void displayScene();
|
||||
bool isSceneBiggerThanView() const;
|
||||
void setEnableAutoFitInView(bool enable = true);
|
||||
|
||||
bool avoidResetTransform() const;
|
||||
void setAvoidResetTransform(bool avoidReset);
|
||||
|
||||
static QTransform resetScale(const QTransform & orig);
|
||||
|
||||
signals:
|
||||
void navigatorViewRequired(bool required, QTransform transform);
|
||||
void viewportRectChanged();
|
||||
|
||||
public slots:
|
||||
void toggleCheckerboard(bool invertCheckerboardColor = false);
|
||||
|
||||
private:
|
||||
void mousePressEvent(QMouseEvent * event) override;
|
||||
void mouseMoveEvent(QMouseEvent * event) override;
|
||||
void mouseReleaseEvent(QMouseEvent * event) override;
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
|
||||
bool isThingSmallerThanWindowWith(const QTransform &transform) const;
|
||||
bool shouldIgnoreMousePressMoveEvent(const QMouseEvent *event) const;
|
||||
void setCheckerboardEnabled(bool enabled, bool invertColor = false);
|
||||
void applyTransformationModeByScaleFactor();
|
||||
|
||||
inline bool shouldAvoidTransform() const;
|
||||
|
||||
// Consider switch to 3 state for "no fit", "always fit" and "fit when view is smaller"?
|
||||
// ... or even more? e.g. "fit/snap width" things...
|
||||
// Currently it's "no fit" when it's false and "fit when view is smaller" when it's true.
|
||||
bool m_enableFitInView = false;
|
||||
bool m_avoidResetTransform = false;
|
||||
bool m_checkerboardEnabled = false;
|
||||
bool m_useLightCheckerboard = false;
|
||||
bool m_firstUserMediaLoaded = false;
|
||||
};
|
||||
|
||||
#endif // GRAPHICSVIEW_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef GRAPHICSVIEW_H
|
||||
#define GRAPHICSVIEW_H
|
||||
|
||||
#include <QGraphicsView>
|
||||
#include <QUrl>
|
||||
|
||||
class GraphicsScene;
|
||||
class GraphicsView : public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
GraphicsView(QWidget *parent = nullptr);
|
||||
|
||||
void showFileFromPath(const QString &filePath);
|
||||
|
||||
void showImage(const QPixmap &pixmap);
|
||||
void showImage(const QImage &image);
|
||||
void showText(const QString &text);
|
||||
void showSvg(const QString &filepath);
|
||||
void showAnimated(const QString &filepath);
|
||||
|
||||
GraphicsScene * scene() const;
|
||||
void setScene(GraphicsScene *scene);
|
||||
|
||||
qreal scaleFactor() const;
|
||||
|
||||
void resetTransform();
|
||||
void zoomView(qreal scaleFactor);
|
||||
void rotateView(bool clockwise = true);
|
||||
void flipView(bool horizontal = true);
|
||||
void resetScale();
|
||||
void fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode = Qt::IgnoreAspectRatio);
|
||||
void fitByOrientation(Qt::Orientation ori = Qt::Horizontal, bool scaleDownOnly = false);
|
||||
|
||||
void displayScene();
|
||||
bool isSceneBiggerThanView() const;
|
||||
void setEnableAutoFitInView(bool enable = true);
|
||||
void setLongImageMode(bool enable = true);
|
||||
|
||||
bool avoidResetTransform() const;
|
||||
void setAvoidResetTransform(bool avoidReset);
|
||||
|
||||
static QTransform resetScale(const QTransform & orig);
|
||||
|
||||
// Long image mode support
|
||||
bool isLongImage() const;
|
||||
void fitLongImage();
|
||||
|
||||
signals:
|
||||
void navigatorViewRequired(bool required, QTransform transform);
|
||||
void viewportRectChanged();
|
||||
|
||||
public slots:
|
||||
void toggleCheckerboard(bool invertCheckerboardColor = false);
|
||||
|
||||
private:
|
||||
void mousePressEvent(QMouseEvent * event) override;
|
||||
void mouseMoveEvent(QMouseEvent * event) override;
|
||||
void mouseReleaseEvent(QMouseEvent * event) override;
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
|
||||
bool isThingSmallerThanWindowWith(const QTransform &transform) const;
|
||||
bool shouldIgnoreMousePressMoveEvent(const QMouseEvent *event) const;
|
||||
void setCheckerboardEnabled(bool enabled, bool invertColor = false);
|
||||
void applyTransformationModeByScaleFactor();
|
||||
|
||||
inline bool shouldAvoidTransform() const;
|
||||
|
||||
// Consider switch to 3 state for "no fit", "always fit" and "fit when view is smaller"?
|
||||
// ... or even more? e.g. "fit/snap width" things...
|
||||
// Currently it's "no fit" when it's false and "fit when view is smaller" when it's true.
|
||||
bool m_enableFitInView = false;
|
||||
bool m_longImageMode = false;
|
||||
bool m_avoidResetTransform = false;
|
||||
bool m_checkerboardEnabled = false;
|
||||
bool m_useLightCheckerboard = false;
|
||||
bool m_firstUserMediaLoaded = false;
|
||||
};
|
||||
|
||||
#endif // GRAPHICSVIEW_H
|
||||
|
||||
194
app/main.cpp
194
app/main.cpp
@@ -1,91 +1,103 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "playlistmanager.h"
|
||||
#include "settings.h"
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
#include "fileopeneventhandler.h"
|
||||
#endif // Q_OS_MACOS
|
||||
|
||||
#include <QApplication>
|
||||
#include <QCommandLineParser>
|
||||
#include <QDir>
|
||||
#include <QTranslator>
|
||||
#include <QUrl>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication::setApplicationName(u"Pineapple Pictures"_s);
|
||||
QCoreApplication::setApplicationVersion(PPIC_VERSION_STRING);
|
||||
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Settings::instance()->hiDpiScaleFactorBehavior());
|
||||
|
||||
QApplication a(argc, argv);
|
||||
|
||||
QTranslator translator;
|
||||
#if defined(TRANSLATION_RESOURCE_EMBEDDING)
|
||||
const QString qmDir = u":/i18n/"_s;
|
||||
#elif defined(QM_FILE_INSTALL_ABSOLUTE_DIR)
|
||||
const QString qmDir = QT_STRINGIFY(QM_FILE_INSTALL_ABSOLUTE_DIR);
|
||||
#else
|
||||
const QString qmDir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath("translations");
|
||||
#endif
|
||||
if (translator.load(QLocale(), u"PineapplePictures"_s, u"_"_s, qmDir)) {
|
||||
QCoreApplication::installTranslator(&translator);
|
||||
}
|
||||
|
||||
QGuiApplication::setApplicationDisplayName(QCoreApplication::translate("main", "Pineapple Pictures"));
|
||||
|
||||
// commandline options
|
||||
QCommandLineOption supportedImageFormats(u"supported-image-formats"_s, QCoreApplication::translate("main", "List supported image format suffixes, and quit program."));
|
||||
// parse commandline arguments
|
||||
QCommandLineParser parser;
|
||||
parser.addOption(supportedImageFormats);
|
||||
parser.addPositionalArgument("File list", QCoreApplication::translate("main", "File list."));
|
||||
parser.addHelpOption();
|
||||
parser.process(a);
|
||||
|
||||
if (parser.isSet(supportedImageFormats)) {
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 9, 0)
|
||||
fputs(qPrintable(MainWindow::supportedImageFormats().join(QChar('\n'))), stdout);
|
||||
::exit(EXIT_SUCCESS);
|
||||
#else
|
||||
QCommandLineParser::showMessageAndExit(QCommandLineParser::MessageType::Information,
|
||||
MainWindow::supportedImageFormats().join(QChar('\n')));
|
||||
#endif
|
||||
}
|
||||
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
FileOpenEventHandler * fileOpenEventHandler = new FileOpenEventHandler(&a);
|
||||
a.installEventFilter(fileOpenEventHandler);
|
||||
a.connect(fileOpenEventHandler, &FileOpenEventHandler::fileOpen, [&w](const QUrl & url){
|
||||
if (w.isHidden()) {
|
||||
w.setWindowOpacity(1);
|
||||
w.showNormal();
|
||||
} else {
|
||||
w.activateWindow();
|
||||
}
|
||||
w.showUrls({url});
|
||||
w.initWindowSize();
|
||||
});
|
||||
#endif // Q_OS_MACOS
|
||||
|
||||
QStringList urlStrList = parser.positionalArguments();
|
||||
QList<QUrl> && urlList = PlaylistManager::convertToUrlList(urlStrList);
|
||||
|
||||
if (!urlList.isEmpty()) {
|
||||
w.showUrls(urlList);
|
||||
}
|
||||
|
||||
w.initWindowSize();
|
||||
|
||||
return QApplication::exec();
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "playlistmanager.h"
|
||||
#include "settings.h"
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
#include "fileopeneventhandler.h"
|
||||
#endif // Q_OS_MACOS
|
||||
|
||||
#include <QApplication>
|
||||
#include <QCommandLineParser>
|
||||
#include <QDir>
|
||||
#include <QTranslator>
|
||||
#include <QUrl>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication::setApplicationName(u"Pineapple Pictures"_s);
|
||||
QCoreApplication::setApplicationVersion(PPIC_VERSION_STRING);
|
||||
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Settings::instance()->hiDpiScaleFactorBehavior());
|
||||
|
||||
QApplication a(argc, argv);
|
||||
|
||||
QTranslator translator;
|
||||
#if defined(TRANSLATION_RESOURCE_EMBEDDING)
|
||||
const QString qmDir = u":/i18n/"_s;
|
||||
#elif defined(QM_FILE_INSTALL_ABSOLUTE_DIR)
|
||||
const QString qmDir = QT_STRINGIFY(QM_FILE_INSTALL_ABSOLUTE_DIR);
|
||||
#else
|
||||
const QString qmDir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath("translations");
|
||||
#endif
|
||||
if (translator.load(QLocale(), u"PineapplePictures"_s, u"_"_s, qmDir)) {
|
||||
QCoreApplication::installTranslator(&translator);
|
||||
}
|
||||
|
||||
QGuiApplication::setApplicationDisplayName(QCoreApplication::translate("main", "Pineapple Pictures"));
|
||||
|
||||
// commandline options
|
||||
QCommandLineOption supportedImageFormats(u"supported-image-formats"_s, QCoreApplication::translate("main", "List supported image format suffixes, and quit program."));
|
||||
// parse commandline arguments
|
||||
QCommandLineParser parser;
|
||||
parser.addOption(supportedImageFormats);
|
||||
parser.addPositionalArgument("File list", QCoreApplication::translate("main", "File list."));
|
||||
parser.addHelpOption();
|
||||
parser.process(a);
|
||||
|
||||
if (parser.isSet(supportedImageFormats)) {
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 9, 0)
|
||||
fputs(qPrintable(MainWindow::supportedImageFormats().join(QChar('\n'))), stdout);
|
||||
::exit(EXIT_SUCCESS);
|
||||
#else
|
||||
QCommandLineParser::showMessageAndExit(QCommandLineParser::MessageType::Information,
|
||||
MainWindow::supportedImageFormats().join(QChar('\n')));
|
||||
#endif
|
||||
}
|
||||
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
FileOpenEventHandler * fileOpenEventHandler = new FileOpenEventHandler(&a);
|
||||
a.installEventFilter(fileOpenEventHandler);
|
||||
a.connect(fileOpenEventHandler, &FileOpenEventHandler::fileOpen, [&w](const QUrl & url){
|
||||
if (w.isHidden()) {
|
||||
w.setWindowOpacity(1);
|
||||
w.showNormal();
|
||||
} else {
|
||||
w.activateWindow();
|
||||
}
|
||||
w.showUrls({url});
|
||||
w.initWindowSize();
|
||||
});
|
||||
|
||||
// Handle dock icon clicks to show hidden window
|
||||
a.connect(&a, &QApplication::applicationStateChanged, [&w](Qt::ApplicationState state) {
|
||||
if (state == Qt::ApplicationActive && w.isHidden()) {
|
||||
w.showUrls({});
|
||||
w.galleryCurrent(true, true);
|
||||
w.setWindowOpacity(1);
|
||||
w.showNormal();
|
||||
w.raise();
|
||||
w.activateWindow();
|
||||
}
|
||||
});
|
||||
#endif // Q_OS_MACOS
|
||||
|
||||
QStringList urlStrList = parser.positionalArguments();
|
||||
QList<QUrl> && urlList = PlaylistManager::convertToUrlList(urlStrList);
|
||||
|
||||
if (!urlList.isEmpty()) {
|
||||
w.showUrls(urlList);
|
||||
}
|
||||
|
||||
w.initWindowSize();
|
||||
|
||||
return QApplication::exec();
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <QProcess>
|
||||
#include <QDesktopServices>
|
||||
#include <QMessageBox>
|
||||
#include <QImageWriter>
|
||||
|
||||
#ifdef HAVE_QTDBUS
|
||||
#include <QDBusInterface>
|
||||
@@ -188,6 +189,7 @@ void MainWindow::showUrls(const QList<QUrl> &urls)
|
||||
m_pm->loadPlaylist(urls);
|
||||
} else {
|
||||
m_graphicsView->showText(tr("File url list is empty"));
|
||||
m_pm->setPlaylist(urls);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -503,6 +505,12 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
|
||||
menu->addAction(paste);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (currentFileUrl.isValid()) {
|
||||
menu->addAction(m_am->actionSaveAs);
|
||||
}
|
||||
#endif // 0
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
menu->addAction(m_am->actionHorizontalFlip);
|
||||
@@ -695,10 +703,75 @@ void MainWindow::on_actionOpen_triggered()
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionSaveAs_triggered()
|
||||
{
|
||||
QUrl currentFileUrl = currentImageFileUrl();
|
||||
if (!currentFileUrl.isValid()) {
|
||||
QMessageBox::warning(this, tr("Save As"), tr("No image is currently open."));
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList supportedFormats;
|
||||
QStringList nameFilters;
|
||||
|
||||
const QList<QByteArray> imageFormats = QImageWriter::supportedImageFormats();
|
||||
for (const QByteArray &format : imageFormats) {
|
||||
QString formatStr = QString::fromLatin1(format).toLower();
|
||||
if (!formatStr.isEmpty()) {
|
||||
supportedFormats << formatStr;
|
||||
nameFilters << tr("%1 Image (*.%2)").arg(formatStr.toUpper(), formatStr);
|
||||
}
|
||||
}
|
||||
|
||||
if (imageFormats.isEmpty()) {
|
||||
QMessageBox::warning(this, tr("Save As"),
|
||||
tr("No supported image formats are available."));
|
||||
return;
|
||||
}
|
||||
|
||||
QString selectedFilter;
|
||||
QString saveFilePath = QFileDialog::getSaveFileName(this,
|
||||
tr("Save As"),
|
||||
QStandardPaths::writableLocation(QStandardPaths::PicturesLocation),
|
||||
nameFilters.join(";;"),
|
||||
&selectedFilter);
|
||||
|
||||
if (saveFilePath.isEmpty()) {
|
||||
return; // User cancelled
|
||||
}
|
||||
|
||||
// Ensure the file has the correct extension
|
||||
QString expectedExtension;
|
||||
|
||||
const int filterIndex = nameFilters.indexOf(selectedFilter);
|
||||
if (filterIndex != -1) {
|
||||
expectedExtension = supportedFormats.at(filterIndex);
|
||||
}
|
||||
|
||||
if (!expectedExtension.isEmpty() && !saveFilePath.endsWith('.' + expectedExtension, Qt::CaseInsensitive)) {
|
||||
saveFilePath += '.' + expectedExtension;
|
||||
}
|
||||
|
||||
// Save the image
|
||||
QImageReader imageReader(currentFileUrl.toLocalFile());
|
||||
imageReader.setAutoTransform(true);
|
||||
imageReader.setDecideFormatFromContent(true);
|
||||
imageReader.setAllocationLimit(0);
|
||||
QImage img(imageReader.read());
|
||||
QImageWriter writer(saveFilePath);
|
||||
writer.setFormat(expectedExtension.toLatin1());
|
||||
if (!writer.write(img)) {
|
||||
QMessageBox::warning(this, tr("Save As"),
|
||||
tr("Failed to save image: %1").arg(writer.errorString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionActualSize_triggered()
|
||||
{
|
||||
m_graphicsView->resetScale();
|
||||
m_graphicsView->setEnableAutoFitInView(false);
|
||||
m_graphicsView->setLongImageMode(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleMaximize_triggered()
|
||||
@@ -727,6 +800,7 @@ void MainWindow::on_actionFitInView_triggered()
|
||||
{
|
||||
m_graphicsView->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
|
||||
m_graphicsView->setEnableAutoFitInView(m_graphicsView->scaleFactor() <= 1);
|
||||
m_graphicsView->setLongImageMode(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFitByWidth_triggered()
|
||||
@@ -734,6 +808,12 @@ void MainWindow::on_actionFitByWidth_triggered()
|
||||
m_graphicsView->fitByOrientation();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFitLongImage_triggered()
|
||||
{
|
||||
m_graphicsView->setLongImageMode(true);
|
||||
m_graphicsView->fitLongImage();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionCopyPixmap_triggered()
|
||||
{
|
||||
QClipboard *cb = QApplication::clipboard();
|
||||
@@ -812,14 +892,12 @@ void MainWindow::on_actionRotateClockwise_triggered()
|
||||
{
|
||||
m_graphicsView->rotateView();
|
||||
m_graphicsView->displayScene();
|
||||
m_gv->setVisible(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionRotateCounterClockwise_triggered()
|
||||
{
|
||||
m_graphicsView->rotateView(false);
|
||||
m_graphicsView->displayScene();
|
||||
m_gv->setVisible(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionPrevPicture_triggered()
|
||||
|
||||
270
app/mainwindow.h
270
app/mainwindow.h
@@ -1,134 +1,136 @@
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include "framelesswindow.h"
|
||||
|
||||
#include <QParallelAnimationGroup>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QPushButton>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QGraphicsView;
|
||||
class QFileSystemWatcher;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class ActionManager;
|
||||
class PlaylistManager;
|
||||
class ToolButton;
|
||||
class GraphicsView;
|
||||
class NavigatorView;
|
||||
class BottomButtonGroup;
|
||||
class MainWindow : public FramelessWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow() override;
|
||||
|
||||
void showUrls(const QList<QUrl> &urls);
|
||||
void initWindowSize();
|
||||
void adjustWindowSizeBySceneRect();
|
||||
QUrl currentImageFileUrl() const;
|
||||
|
||||
void clearGallery();
|
||||
void galleryPrev();
|
||||
void galleryNext();
|
||||
void galleryCurrent(bool showLoadImageHintWhenEmpty, bool reloadImage);
|
||||
|
||||
static QStringList supportedImageFormats();
|
||||
|
||||
protected slots:
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void enterEvent(QEnterEvent *event) override;
|
||||
void leaveEvent(QEvent *event) override;
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
void contextMenuEvent(QContextMenuEvent *event) override;
|
||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||
void dropEvent(QDropEvent *event) override;
|
||||
|
||||
void centerWindow();
|
||||
void closeWindow();
|
||||
void updateWidgetsPosition();
|
||||
void toggleProtectedMode();
|
||||
void toggleStayOnTop();
|
||||
void toggleAvoidResetTransform();
|
||||
bool stayOnTop() const;
|
||||
bool canPaste() const;
|
||||
void quitAppAction(bool force = false);
|
||||
void toggleFullscreen();
|
||||
void toggleMaximize();
|
||||
|
||||
protected:
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private slots:
|
||||
void on_actionOpen_triggered();
|
||||
|
||||
void on_actionActualSize_triggered();
|
||||
void on_actionToggleMaximize_triggered();
|
||||
void on_actionZoomIn_triggered();
|
||||
void on_actionZoomOut_triggered();
|
||||
void on_actionToggleCheckerboard_triggered();
|
||||
void on_actionRotateClockwise_triggered();
|
||||
void on_actionRotateCounterClockwise_triggered();
|
||||
|
||||
void on_actionPrevPicture_triggered();
|
||||
void on_actionNextPicture_triggered();
|
||||
|
||||
void on_actionTogglePauseAnimation_triggered();
|
||||
void on_actionAnimationNextFrame_triggered();
|
||||
|
||||
void on_actionHorizontalFlip_triggered();
|
||||
void on_actionFitInView_triggered();
|
||||
void on_actionFitByWidth_triggered();
|
||||
void on_actionCopyPixmap_triggered();
|
||||
void on_actionCopyFilePath_triggered();
|
||||
void on_actionPaste_triggered();
|
||||
void on_actionTrash_triggered();
|
||||
void on_actionToggleStayOnTop_triggered();
|
||||
void on_actionToggleProtectMode_triggered();
|
||||
void on_actionToggleAvoidResetTransform_triggered();
|
||||
void on_actionSettings_triggered();
|
||||
void on_actionHelp_triggered();
|
||||
void on_actionProperties_triggered();
|
||||
void on_actionLocateInFileManager_triggered();
|
||||
void on_actionQuitApp_triggered();
|
||||
|
||||
void doCloseWindow();
|
||||
|
||||
private:
|
||||
bool updateFileWatcher(const QString & basePath = QString());
|
||||
void updateGalleryButtonsVisibility();
|
||||
|
||||
private:
|
||||
ActionManager *m_am;
|
||||
PlaylistManager *m_pm;
|
||||
|
||||
QPoint m_oldMousePos;
|
||||
QPropertyAnimation *m_fadeOutAnimation;
|
||||
QPropertyAnimation *m_floatUpAnimation;
|
||||
QParallelAnimationGroup *m_exitAnimationGroup;
|
||||
QFileSystemWatcher *m_fileSystemWatcher;
|
||||
ToolButton *m_closeButton;
|
||||
ToolButton *m_prevButton;
|
||||
ToolButton *m_nextButton;
|
||||
GraphicsView *m_graphicsView;
|
||||
NavigatorView *m_gv;
|
||||
BottomButtonGroup *m_bottomButtonGroup;
|
||||
bool m_protectedMode = false;
|
||||
bool m_clickedOnWindow = false;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include "framelesswindow.h"
|
||||
|
||||
#include <QParallelAnimationGroup>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QPushButton>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QGraphicsView;
|
||||
class QFileSystemWatcher;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class ActionManager;
|
||||
class PlaylistManager;
|
||||
class ToolButton;
|
||||
class GraphicsView;
|
||||
class NavigatorView;
|
||||
class BottomButtonGroup;
|
||||
class MainWindow : public FramelessWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow() override;
|
||||
|
||||
void showUrls(const QList<QUrl> &urls);
|
||||
void initWindowSize();
|
||||
void adjustWindowSizeBySceneRect();
|
||||
QUrl currentImageFileUrl() const;
|
||||
|
||||
void clearGallery();
|
||||
void galleryPrev();
|
||||
void galleryNext();
|
||||
void galleryCurrent(bool showLoadImageHintWhenEmpty, bool reloadImage);
|
||||
|
||||
static QStringList supportedImageFormats();
|
||||
|
||||
protected slots:
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void enterEvent(QEnterEvent *event) override;
|
||||
void leaveEvent(QEvent *event) override;
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
void contextMenuEvent(QContextMenuEvent *event) override;
|
||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||
void dropEvent(QDropEvent *event) override;
|
||||
|
||||
void centerWindow();
|
||||
void closeWindow();
|
||||
void updateWidgetsPosition();
|
||||
void toggleProtectedMode();
|
||||
void toggleStayOnTop();
|
||||
void toggleAvoidResetTransform();
|
||||
bool stayOnTop() const;
|
||||
bool canPaste() const;
|
||||
void quitAppAction(bool force = false);
|
||||
void toggleFullscreen();
|
||||
void toggleMaximize();
|
||||
|
||||
protected:
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private slots:
|
||||
void on_actionOpen_triggered();
|
||||
void on_actionSaveAs_triggered();
|
||||
|
||||
void on_actionActualSize_triggered();
|
||||
void on_actionToggleMaximize_triggered();
|
||||
void on_actionZoomIn_triggered();
|
||||
void on_actionZoomOut_triggered();
|
||||
void on_actionToggleCheckerboard_triggered();
|
||||
void on_actionRotateClockwise_triggered();
|
||||
void on_actionRotateCounterClockwise_triggered();
|
||||
|
||||
void on_actionPrevPicture_triggered();
|
||||
void on_actionNextPicture_triggered();
|
||||
|
||||
void on_actionTogglePauseAnimation_triggered();
|
||||
void on_actionAnimationNextFrame_triggered();
|
||||
|
||||
void on_actionHorizontalFlip_triggered();
|
||||
void on_actionFitInView_triggered();
|
||||
void on_actionFitByWidth_triggered();
|
||||
void on_actionFitLongImage_triggered();
|
||||
void on_actionCopyPixmap_triggered();
|
||||
void on_actionCopyFilePath_triggered();
|
||||
void on_actionPaste_triggered();
|
||||
void on_actionTrash_triggered();
|
||||
void on_actionToggleStayOnTop_triggered();
|
||||
void on_actionToggleProtectMode_triggered();
|
||||
void on_actionToggleAvoidResetTransform_triggered();
|
||||
void on_actionSettings_triggered();
|
||||
void on_actionHelp_triggered();
|
||||
void on_actionProperties_triggered();
|
||||
void on_actionLocateInFileManager_triggered();
|
||||
void on_actionQuitApp_triggered();
|
||||
|
||||
void doCloseWindow();
|
||||
|
||||
private:
|
||||
bool updateFileWatcher(const QString & basePath = QString());
|
||||
void updateGalleryButtonsVisibility();
|
||||
|
||||
private:
|
||||
ActionManager *m_am;
|
||||
PlaylistManager *m_pm;
|
||||
|
||||
QPoint m_oldMousePos;
|
||||
QPropertyAnimation *m_fadeOutAnimation;
|
||||
QPropertyAnimation *m_floatUpAnimation;
|
||||
QParallelAnimationGroup *m_exitAnimationGroup;
|
||||
QFileSystemWatcher *m_fileSystemWatcher;
|
||||
ToolButton *m_closeButton;
|
||||
ToolButton *m_prevButton;
|
||||
ToolButton *m_nextButton;
|
||||
GraphicsView *m_graphicsView;
|
||||
NavigatorView *m_gv;
|
||||
BottomButtonGroup *m_bottomButtonGroup;
|
||||
bool m_protectedMode = false;
|
||||
bool m_clickedOnWindow = false;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
|
||||
@@ -1,110 +1,110 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "metadatadialog.h"
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
#include <QPainter>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTreeView>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include "metadatamodel.h"
|
||||
|
||||
class PropertyTreeView : public QTreeView
|
||||
{
|
||||
public:
|
||||
explicit PropertyTreeView(QWidget* parent) : QTreeView(parent) {}
|
||||
~PropertyTreeView() {}
|
||||
|
||||
protected:
|
||||
void rowsInserted(const QModelIndex& parent, int start, int end) override
|
||||
{
|
||||
QTreeView::rowsInserted(parent, start, end);
|
||||
if (!parent.isValid()) {
|
||||
// we are inserting a section group
|
||||
for (int row = start; row <= end; ++row) {
|
||||
setupSection(row);
|
||||
}
|
||||
} else {
|
||||
// we are inserting a property
|
||||
setRowHidden(parent.row(), QModelIndex(), false);
|
||||
}
|
||||
}
|
||||
|
||||
void reset() override
|
||||
{
|
||||
QTreeView::reset();
|
||||
if (model()) {
|
||||
for (int row = 0; row < model()->rowCount(); ++row) {
|
||||
setupSection(row);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void setupSection(int row)
|
||||
{
|
||||
expand(model()->index(row, 0));
|
||||
setFirstColumnSpanned(row, QModelIndex(), true);
|
||||
setRowHidden(row, QModelIndex(), !model()->hasChildren(model()->index(row, 0)));
|
||||
}
|
||||
};
|
||||
|
||||
class PropertyTreeItemDelegate : public QStyledItemDelegate
|
||||
{
|
||||
public:
|
||||
PropertyTreeItemDelegate(QObject* parent)
|
||||
: QStyledItemDelegate(parent)
|
||||
{}
|
||||
|
||||
protected:
|
||||
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
|
||||
{
|
||||
QStyleOptionViewItem opt = option;
|
||||
if (!index.parent().isValid()) {
|
||||
opt.font.setBold(true);
|
||||
opt.features.setFlag(QStyleOptionViewItem::Alternate);
|
||||
}
|
||||
QStyledItemDelegate::paint(painter, opt, index);
|
||||
}
|
||||
};
|
||||
|
||||
MetadataDialog::MetadataDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_treeView(new PropertyTreeView(this))
|
||||
{
|
||||
m_treeView->setRootIsDecorated(false);
|
||||
m_treeView->setIndentation(0);
|
||||
m_treeView->setItemDelegate(new PropertyTreeItemDelegate(m_treeView));
|
||||
m_treeView->header()->resizeSection(0, sizeHint().width() / 2);
|
||||
|
||||
setWindowTitle(tr("Image Metadata"));
|
||||
|
||||
QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
|
||||
|
||||
setLayout(new QVBoxLayout);
|
||||
layout()->addWidget(m_treeView);
|
||||
layout()->addWidget(buttonBox);
|
||||
|
||||
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::close);
|
||||
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
MetadataDialog::~MetadataDialog()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MetadataDialog::setMetadataModel(MetadataModel * model)
|
||||
{
|
||||
m_treeView->setModel(model);
|
||||
}
|
||||
|
||||
QSize MetadataDialog::sizeHint() const
|
||||
{
|
||||
return QSize(520, 350);
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "metadatadialog.h"
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
#include <QPainter>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTreeView>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include "metadatamodel.h"
|
||||
|
||||
class PropertyTreeView : public QTreeView
|
||||
{
|
||||
public:
|
||||
explicit PropertyTreeView(QWidget* parent) : QTreeView(parent) {}
|
||||
~PropertyTreeView() {}
|
||||
|
||||
protected:
|
||||
void rowsInserted(const QModelIndex& parent, int start, int end) override
|
||||
{
|
||||
QTreeView::rowsInserted(parent, start, end);
|
||||
if (!parent.isValid()) {
|
||||
// we are inserting a section group
|
||||
for (int row = start; row <= end; ++row) {
|
||||
setupSection(row);
|
||||
}
|
||||
} else {
|
||||
// we are inserting a property
|
||||
setRowHidden(parent.row(), QModelIndex(), false);
|
||||
}
|
||||
}
|
||||
|
||||
void reset() override
|
||||
{
|
||||
QTreeView::reset();
|
||||
if (model()) {
|
||||
for (int row = 0; row < model()->rowCount(); ++row) {
|
||||
setupSection(row);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void setupSection(int row)
|
||||
{
|
||||
expand(model()->index(row, 0));
|
||||
setFirstColumnSpanned(row, QModelIndex(), true);
|
||||
setRowHidden(row, QModelIndex(), !model()->hasChildren(model()->index(row, 0)));
|
||||
}
|
||||
};
|
||||
|
||||
class PropertyTreeItemDelegate : public QStyledItemDelegate
|
||||
{
|
||||
public:
|
||||
PropertyTreeItemDelegate(QObject* parent)
|
||||
: QStyledItemDelegate(parent)
|
||||
{}
|
||||
|
||||
protected:
|
||||
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
|
||||
{
|
||||
QStyleOptionViewItem opt = option;
|
||||
if (!index.parent().isValid()) {
|
||||
opt.font.setBold(true);
|
||||
opt.features.setFlag(QStyleOptionViewItem::Alternate);
|
||||
}
|
||||
QStyledItemDelegate::paint(painter, opt, index);
|
||||
}
|
||||
};
|
||||
|
||||
MetadataDialog::MetadataDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_treeView(new PropertyTreeView(this))
|
||||
{
|
||||
m_treeView->setRootIsDecorated(false);
|
||||
m_treeView->setIndentation(0);
|
||||
m_treeView->setItemDelegate(new PropertyTreeItemDelegate(m_treeView));
|
||||
m_treeView->header()->resizeSection(0, sizeHint().width() / 2);
|
||||
|
||||
setWindowTitle(tr("Image Metadata"));
|
||||
|
||||
QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
|
||||
|
||||
setLayout(new QVBoxLayout);
|
||||
layout()->addWidget(m_treeView);
|
||||
layout()->addWidget(buttonBox);
|
||||
|
||||
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::close);
|
||||
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
MetadataDialog::~MetadataDialog()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MetadataDialog::setMetadataModel(MetadataModel * model)
|
||||
{
|
||||
m_treeView->setModel(model);
|
||||
}
|
||||
|
||||
QSize MetadataDialog::sizeHint() const
|
||||
{
|
||||
return QSize(520, 350);
|
||||
}
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef METADATADIALOG_H
|
||||
#define METADATADIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTreeView;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class MetadataModel;
|
||||
class MetadataDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit MetadataDialog(QWidget * parent);
|
||||
~MetadataDialog() override;
|
||||
|
||||
void setMetadataModel(MetadataModel * model);
|
||||
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private:
|
||||
QTreeView * m_treeView = nullptr;
|
||||
};
|
||||
|
||||
#endif // METADATADIALOG_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef METADATADIALOG_H
|
||||
#define METADATADIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTreeView;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class MetadataModel;
|
||||
class MetadataDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit MetadataDialog(QWidget * parent);
|
||||
~MetadataDialog() override;
|
||||
|
||||
void setMetadataModel(MetadataModel * model);
|
||||
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private:
|
||||
QTreeView * m_treeView = nullptr;
|
||||
};
|
||||
|
||||
#endif // METADATADIALOG_H
|
||||
|
||||
@@ -1,320 +1,320 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "metadatamodel.h"
|
||||
#include "exiv2wrapper.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QDebug>
|
||||
#include <QDateTime>
|
||||
#include <QFileInfo>
|
||||
#include <QImageReader>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
MetadataModel::MetadataModel(QObject *parent)
|
||||
: QAbstractItemModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
MetadataModel::~MetadataModel()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MetadataModel::setFile(const QString &imageFilePath)
|
||||
{
|
||||
QFileInfo fileInfo(imageFilePath);
|
||||
// It'll be fine if we don't re-use the image reader we pass to the graphics scene for now.
|
||||
QImageReader imgReader(imageFilePath);
|
||||
imgReader.setAutoTransform(true);
|
||||
imgReader.setDecideFormatFromContent(true);
|
||||
|
||||
const QString & itemTypeString = tr("%1 File").arg(QString(imgReader.format().toUpper()));
|
||||
const QString & sizeString = QLocale().formattedDataSize(fileInfo.size());
|
||||
const QString & birthTimeString = QLocale().toString(fileInfo.birthTime(), QLocale::LongFormat);
|
||||
const QString & lastModifiedTimeString = QLocale().toString(fileInfo.lastModified(), QLocale::LongFormat);
|
||||
const QString & imageDimensionsString = imageSize(imgReader.size());
|
||||
const QString & imageRatioString = imageSizeRatio(imgReader.size());
|
||||
|
||||
appendSection(u"Description"_s, tr("Description", "Section name."));
|
||||
appendSection(u"Origin"_s, tr("Origin", "Section name."));
|
||||
appendSection(u"Image"_s, tr("Image", "Section name."));
|
||||
appendSection(u"Camera"_s, tr("Camera", "Section name."));
|
||||
appendSection(u"AdvancedPhoto"_s, tr("Advanced photo", "Section name."));
|
||||
appendSection(u"GPS"_s, tr("GPS", "Section name."));
|
||||
appendSection(u"File"_s, tr("File", "Section name."));
|
||||
|
||||
if (imgReader.supportsOption(QImageIOHandler::Size)) {
|
||||
appendProperty(u"Image"_s, u"Image.Dimensions"_s,
|
||||
tr("Dimensions"), imageDimensionsString);
|
||||
appendProperty(u"Image"_s, u"Image.SizeRatio"_s,
|
||||
tr("Aspect ratio"), imageRatioString);
|
||||
}
|
||||
if (imgReader.supportsAnimation() && imgReader.imageCount() > 1) {
|
||||
appendProperty(u"Image"_s, u"Image.FrameCount"_s,
|
||||
tr("Frame count"), QString::number(imgReader.imageCount()));
|
||||
}
|
||||
|
||||
appendProperty(u"File"_s, u"File.Name"_s,
|
||||
tr("Name"), fileInfo.fileName());
|
||||
appendProperty(u"File"_s, u"File.ItemType"_s,
|
||||
tr("Item type"), itemTypeString);
|
||||
appendProperty(u"File"_s, u"File.Path"_s,
|
||||
tr("Folder path"), QDir::toNativeSeparators(fileInfo.path()));
|
||||
appendProperty(u"File"_s, u"File.Size"_s,
|
||||
tr("Size"), sizeString);
|
||||
appendProperty(u"File"_s, u"File.CreatedTime"_s,
|
||||
tr("Date created"), birthTimeString);
|
||||
appendProperty(u"File"_s, u"File.LastModified"_s,
|
||||
tr("Date modified"), lastModifiedTimeString);
|
||||
|
||||
Exiv2Wrapper wrapper;
|
||||
if (wrapper.load(imageFilePath)) {
|
||||
wrapper.cacheSections();
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Xmp.dc.title"_s, tr("Title"), true);
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Exif.Image.ImageDescription"_s, tr("Subject"), true);
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Exif.Image.Rating"_s, tr("Rating"));
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Xmp.dc.subject"_s, tr("Tags"));
|
||||
appendPropertyIfNotEmpty(u"Description"_s, u"Description.Comments"_s,
|
||||
tr("Comments"), wrapper.comment());
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Artist"_s, tr("Authors"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Photo.DateTimeOriginal"_s, tr("Date taken"));
|
||||
// FIXME: We may fetch the same type of metadata from different metadata collection.
|
||||
// Current implementation is not pretty and may need to do a rework...
|
||||
// appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
// QStringLiteral("Xmp.xmp.CreatorTool"), tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Software"_s, tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Copyright"_s, tr("Copyright"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.XResolution"_s, tr("Horizontal resolution"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.YResolution"_s, tr("Vertical resolution"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.ResolutionUnit"_s, tr("Resolution unit"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Photo.ColorSpace"_s, tr("Colour representation"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Image.Make"_s, tr("Camera maker"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Image.Model"_s, tr("Camera model"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FNumber"_s, tr("F-stop"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ExposureTime"_s, tr("Exposure time"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ISOSpeedRatings"_s, tr("ISO speed"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ExposureBiasValue"_s, tr("Exposure bias"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FocalLength"_s, tr("Focal length"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.MaxApertureValue"_s, tr("Max aperture"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.MeteringMode"_s, tr("Metering mode"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.SubjectDistance"_s, tr("Subject distance"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.Flash"_s, tr("Flash mode"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FocalLengthIn35mmFilm"_s, tr("35mm focal length"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.LensModel"_s, tr("Lens model"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Contrast"_s, tr("Contrast"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.BrightnessValue"_s, tr("Brightness"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.ExposureProgram"_s, tr("Exposure program"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Saturation"_s, tr("Saturation"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Sharpness"_s, tr("Sharpness"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.WhiteBalance"_s, tr("White balance"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.DigitalZoomRatio"_s, tr("Digital zoom"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.ExifVersion"_s, tr("EXIF version"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLatitudeRef"_s, tr("Latitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLatitude"_s, tr("Latitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLongitudeRef"_s, tr("Longitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLongitude"_s, tr("Longitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSAltitudeRef"_s, tr("Altitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSAltitude"_s, tr("Altitude"));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
QString MetadataModel::imageSize(const QSize &size)
|
||||
{
|
||||
QString imageSize;
|
||||
|
||||
if (size.isValid()) {
|
||||
imageSize = tr("%1 x %2").arg(QString::number(size.width()), QString::number(size.height()));
|
||||
} else {
|
||||
imageSize = QLatin1Char('-');
|
||||
}
|
||||
|
||||
return imageSize;
|
||||
}
|
||||
|
||||
int simplegcd(int a, int b) {
|
||||
return b == 0 ? a : simplegcd(b, a % b);
|
||||
}
|
||||
|
||||
QString MetadataModel::imageSizeRatio(const QSize &size)
|
||||
{
|
||||
if (!size.isValid()) {
|
||||
return QStringLiteral("-");
|
||||
}
|
||||
int gcd = simplegcd(size.width(), size.height());
|
||||
return tr("%1 : %2").arg(QString::number(size.width() / gcd), QString::number(size.height() / gcd));
|
||||
}
|
||||
|
||||
bool MetadataModel::appendSection(const QString §ionKey, QStringView sectionDisplayName)
|
||||
{
|
||||
if (m_sections.contains(sectionKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_sections.append(sectionKey);
|
||||
m_sectionProperties[sectionKey] = qMakePair<QString, QList<QString> >(sectionDisplayName.toString(), {});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MetadataModel::appendPropertyIfNotEmpty(const QString §ionKey, const QString &propertyKey, const QString &propertyDisplayName, const QString &propertyValue)
|
||||
{
|
||||
if (propertyValue.isEmpty()) return false;
|
||||
|
||||
return appendProperty(sectionKey, propertyKey, propertyDisplayName, propertyValue);
|
||||
}
|
||||
|
||||
bool MetadataModel::appendProperty(const QString §ionKey, const QString &propertyKey, QStringView propertyDisplayName, QStringView propertyValue)
|
||||
{
|
||||
if (!m_sections.contains(sectionKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QList<QString> & propertyList = m_sectionProperties[sectionKey].second;
|
||||
if (!propertyList.contains(propertyKey)) {
|
||||
propertyList.append(propertyKey);
|
||||
}
|
||||
|
||||
m_properties[propertyKey] = qMakePair<QString, QString>(propertyDisplayName.toString(), propertyValue.toString());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MetadataModel::appendExivPropertyIfExist(const Exiv2Wrapper &wrapper, const QString §ionKey, const QString &exiv2propertyKey, const QString &propertyDisplayName, bool isXmpString)
|
||||
{
|
||||
const QString & value = wrapper.value(exiv2propertyKey);
|
||||
if (!value.isEmpty()) {
|
||||
appendProperty(sectionKey, exiv2propertyKey,
|
||||
propertyDisplayName.isEmpty() ? wrapper.label(exiv2propertyKey) : propertyDisplayName,
|
||||
isXmpString ? Exiv2Wrapper::XmpValue(value) : value);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QModelIndex MetadataModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
if (!hasIndex(row, column, parent)) {
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
if (!parent.isValid()) {
|
||||
return createIndex(row, column, RowType::SectionRow);
|
||||
} else {
|
||||
// internalid param: row means nth section it belongs to.
|
||||
return createIndex(row, column, RowType::PropertyRow + parent.row());
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex MetadataModel::parent(const QModelIndex &child) const
|
||||
{
|
||||
if (!child.isValid()) {
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
if (child.internalId() == RowType::SectionRow) {
|
||||
return QModelIndex();
|
||||
} else {
|
||||
return createIndex(child.internalId() - RowType::PropertyRow, 0, SectionRow);
|
||||
}
|
||||
}
|
||||
|
||||
int MetadataModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
if (!parent.isValid()) {
|
||||
return m_sections.count();
|
||||
}
|
||||
|
||||
if (parent.internalId() == RowType::SectionRow) {
|
||||
const QString & sectionKey = m_sections[parent.row()];
|
||||
return m_sectionProperties[sectionKey].second.count();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MetadataModel::columnCount(const QModelIndex &) const
|
||||
{
|
||||
// Always key(display name) and value.
|
||||
return 2;
|
||||
}
|
||||
|
||||
QVariant MetadataModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid()) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
if (role != Qt::DisplayRole) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
if (index.internalId() == RowType::SectionRow) {
|
||||
return (index.column() == 0) ? m_sectionProperties[m_sections[index.row()]].first
|
||||
: QVariant();
|
||||
} else {
|
||||
int sectionIndex = index.internalId() - RowType::PropertyRow;
|
||||
const QString & sectionKey = m_sections[sectionIndex];
|
||||
const QList<QString> & propertyList = m_sectionProperties[sectionKey].second;
|
||||
return (index.column() == 0) ? m_properties[propertyList[index.row()]].first
|
||||
: m_properties[propertyList[index.row()]].second;
|
||||
}
|
||||
}
|
||||
|
||||
QVariant MetadataModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (orientation == Qt::Vertical || role != Qt::DisplayRole) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
return section == 0 ? tr("Property") : tr("Value");
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "metadatamodel.h"
|
||||
#include "exiv2wrapper.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QDebug>
|
||||
#include <QDateTime>
|
||||
#include <QFileInfo>
|
||||
#include <QImageReader>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
MetadataModel::MetadataModel(QObject *parent)
|
||||
: QAbstractItemModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
MetadataModel::~MetadataModel()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MetadataModel::setFile(const QString &imageFilePath)
|
||||
{
|
||||
QFileInfo fileInfo(imageFilePath);
|
||||
// It'll be fine if we don't re-use the image reader we pass to the graphics scene for now.
|
||||
QImageReader imgReader(imageFilePath);
|
||||
imgReader.setAutoTransform(true);
|
||||
imgReader.setDecideFormatFromContent(true);
|
||||
|
||||
const QString & itemTypeString = tr("%1 File").arg(QString(imgReader.format().toUpper()));
|
||||
const QString & sizeString = QLocale().formattedDataSize(fileInfo.size());
|
||||
const QString & birthTimeString = QLocale().toString(fileInfo.birthTime(), QLocale::LongFormat);
|
||||
const QString & lastModifiedTimeString = QLocale().toString(fileInfo.lastModified(), QLocale::LongFormat);
|
||||
const QString & imageDimensionsString = imageSize(imgReader.size());
|
||||
const QString & imageRatioString = imageSizeRatio(imgReader.size());
|
||||
|
||||
appendSection(u"Description"_s, tr("Description", "Section name."));
|
||||
appendSection(u"Origin"_s, tr("Origin", "Section name."));
|
||||
appendSection(u"Image"_s, tr("Image", "Section name."));
|
||||
appendSection(u"Camera"_s, tr("Camera", "Section name."));
|
||||
appendSection(u"AdvancedPhoto"_s, tr("Advanced photo", "Section name."));
|
||||
appendSection(u"GPS"_s, tr("GPS", "Section name."));
|
||||
appendSection(u"File"_s, tr("File", "Section name."));
|
||||
|
||||
if (imgReader.supportsOption(QImageIOHandler::Size)) {
|
||||
appendProperty(u"Image"_s, u"Image.Dimensions"_s,
|
||||
tr("Dimensions"), imageDimensionsString);
|
||||
appendProperty(u"Image"_s, u"Image.SizeRatio"_s,
|
||||
tr("Aspect ratio"), imageRatioString);
|
||||
}
|
||||
if (imgReader.supportsAnimation() && imgReader.imageCount() > 1) {
|
||||
appendProperty(u"Image"_s, u"Image.FrameCount"_s,
|
||||
tr("Frame count"), QString::number(imgReader.imageCount()));
|
||||
}
|
||||
|
||||
appendProperty(u"File"_s, u"File.Name"_s,
|
||||
tr("Name"), fileInfo.fileName());
|
||||
appendProperty(u"File"_s, u"File.ItemType"_s,
|
||||
tr("Item type"), itemTypeString);
|
||||
appendProperty(u"File"_s, u"File.Path"_s,
|
||||
tr("Folder path"), QDir::toNativeSeparators(fileInfo.path()));
|
||||
appendProperty(u"File"_s, u"File.Size"_s,
|
||||
tr("Size"), sizeString);
|
||||
appendProperty(u"File"_s, u"File.CreatedTime"_s,
|
||||
tr("Date created"), birthTimeString);
|
||||
appendProperty(u"File"_s, u"File.LastModified"_s,
|
||||
tr("Date modified"), lastModifiedTimeString);
|
||||
|
||||
Exiv2Wrapper wrapper;
|
||||
if (wrapper.load(imageFilePath)) {
|
||||
wrapper.cacheSections();
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Xmp.dc.title"_s, tr("Title"), true);
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Exif.Image.ImageDescription"_s, tr("Subject"), true);
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Exif.Image.Rating"_s, tr("Rating"));
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Xmp.dc.subject"_s, tr("Tags"));
|
||||
appendPropertyIfNotEmpty(u"Description"_s, u"Description.Comments"_s,
|
||||
tr("Comments"), wrapper.comment());
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Artist"_s, tr("Authors"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Photo.DateTimeOriginal"_s, tr("Date taken"));
|
||||
// FIXME: We may fetch the same type of metadata from different metadata collection.
|
||||
// Current implementation is not pretty and may need to do a rework...
|
||||
// appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
// QStringLiteral("Xmp.xmp.CreatorTool"), tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Software"_s, tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Copyright"_s, tr("Copyright"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.XResolution"_s, tr("Horizontal resolution"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.YResolution"_s, tr("Vertical resolution"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.ResolutionUnit"_s, tr("Resolution unit"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Photo.ColorSpace"_s, tr("Colour representation"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Image.Make"_s, tr("Camera maker"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Image.Model"_s, tr("Camera model"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FNumber"_s, tr("F-stop"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ExposureTime"_s, tr("Exposure time"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ISOSpeedRatings"_s, tr("ISO speed"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ExposureBiasValue"_s, tr("Exposure bias"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FocalLength"_s, tr("Focal length"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.MaxApertureValue"_s, tr("Max aperture"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.MeteringMode"_s, tr("Metering mode"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.SubjectDistance"_s, tr("Subject distance"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.Flash"_s, tr("Flash mode"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FocalLengthIn35mmFilm"_s, tr("35mm focal length"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.LensModel"_s, tr("Lens model"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Contrast"_s, tr("Contrast"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.BrightnessValue"_s, tr("Brightness"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.ExposureProgram"_s, tr("Exposure program"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Saturation"_s, tr("Saturation"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Sharpness"_s, tr("Sharpness"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.WhiteBalance"_s, tr("White balance"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.DigitalZoomRatio"_s, tr("Digital zoom"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.ExifVersion"_s, tr("EXIF version"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLatitudeRef"_s, tr("Latitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLatitude"_s, tr("Latitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLongitudeRef"_s, tr("Longitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLongitude"_s, tr("Longitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSAltitudeRef"_s, tr("Altitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSAltitude"_s, tr("Altitude"));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
QString MetadataModel::imageSize(const QSize &size)
|
||||
{
|
||||
QString imageSize;
|
||||
|
||||
if (size.isValid()) {
|
||||
imageSize = tr("%1 x %2").arg(QString::number(size.width()), QString::number(size.height()));
|
||||
} else {
|
||||
imageSize = QLatin1Char('-');
|
||||
}
|
||||
|
||||
return imageSize;
|
||||
}
|
||||
|
||||
int simplegcd(int a, int b) {
|
||||
return b == 0 ? a : simplegcd(b, a % b);
|
||||
}
|
||||
|
||||
QString MetadataModel::imageSizeRatio(const QSize &size)
|
||||
{
|
||||
if (!size.isValid()) {
|
||||
return QStringLiteral("-");
|
||||
}
|
||||
int gcd = simplegcd(size.width(), size.height());
|
||||
return tr("%1 : %2").arg(QString::number(size.width() / gcd), QString::number(size.height() / gcd));
|
||||
}
|
||||
|
||||
bool MetadataModel::appendSection(const QString §ionKey, QStringView sectionDisplayName)
|
||||
{
|
||||
if (m_sections.contains(sectionKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_sections.append(sectionKey);
|
||||
m_sectionProperties[sectionKey] = qMakePair<QString, QList<QString> >(sectionDisplayName.toString(), {});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MetadataModel::appendPropertyIfNotEmpty(const QString §ionKey, const QString &propertyKey, const QString &propertyDisplayName, const QString &propertyValue)
|
||||
{
|
||||
if (propertyValue.isEmpty()) return false;
|
||||
|
||||
return appendProperty(sectionKey, propertyKey, propertyDisplayName, propertyValue);
|
||||
}
|
||||
|
||||
bool MetadataModel::appendProperty(const QString §ionKey, const QString &propertyKey, QStringView propertyDisplayName, QStringView propertyValue)
|
||||
{
|
||||
if (!m_sections.contains(sectionKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QList<QString> & propertyList = m_sectionProperties[sectionKey].second;
|
||||
if (!propertyList.contains(propertyKey)) {
|
||||
propertyList.append(propertyKey);
|
||||
}
|
||||
|
||||
m_properties[propertyKey] = qMakePair<QString, QString>(propertyDisplayName.toString(), propertyValue.toString());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MetadataModel::appendExivPropertyIfExist(const Exiv2Wrapper &wrapper, const QString §ionKey, const QString &exiv2propertyKey, const QString &propertyDisplayName, bool isXmpString)
|
||||
{
|
||||
const QString & value = wrapper.value(exiv2propertyKey);
|
||||
if (!value.isEmpty()) {
|
||||
appendProperty(sectionKey, exiv2propertyKey,
|
||||
propertyDisplayName.isEmpty() ? wrapper.label(exiv2propertyKey) : propertyDisplayName,
|
||||
isXmpString ? Exiv2Wrapper::XmpValue(value) : value);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QModelIndex MetadataModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
if (!hasIndex(row, column, parent)) {
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
if (!parent.isValid()) {
|
||||
return createIndex(row, column, RowType::SectionRow);
|
||||
} else {
|
||||
// internalid param: row means nth section it belongs to.
|
||||
return createIndex(row, column, RowType::PropertyRow + parent.row());
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex MetadataModel::parent(const QModelIndex &child) const
|
||||
{
|
||||
if (!child.isValid()) {
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
if (child.internalId() == RowType::SectionRow) {
|
||||
return QModelIndex();
|
||||
} else {
|
||||
return createIndex(child.internalId() - RowType::PropertyRow, 0, SectionRow);
|
||||
}
|
||||
}
|
||||
|
||||
int MetadataModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
if (!parent.isValid()) {
|
||||
return m_sections.count();
|
||||
}
|
||||
|
||||
if (parent.internalId() == RowType::SectionRow) {
|
||||
const QString & sectionKey = m_sections[parent.row()];
|
||||
return m_sectionProperties[sectionKey].second.count();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MetadataModel::columnCount(const QModelIndex &) const
|
||||
{
|
||||
// Always key(display name) and value.
|
||||
return 2;
|
||||
}
|
||||
|
||||
QVariant MetadataModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid()) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
if (role != Qt::DisplayRole) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
if (index.internalId() == RowType::SectionRow) {
|
||||
return (index.column() == 0) ? m_sectionProperties[m_sections[index.row()]].first
|
||||
: QVariant();
|
||||
} else {
|
||||
int sectionIndex = index.internalId() - RowType::PropertyRow;
|
||||
const QString & sectionKey = m_sections[sectionIndex];
|
||||
const QList<QString> & propertyList = m_sectionProperties[sectionKey].second;
|
||||
return (index.column() == 0) ? m_properties[propertyList[index.row()]].first
|
||||
: m_properties[propertyList[index.row()]].second;
|
||||
}
|
||||
}
|
||||
|
||||
QVariant MetadataModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (orientation == Qt::Vertical || role != Qt::DisplayRole) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
return section == 0 ? tr("Property") : tr("Value");
|
||||
}
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef METADATAMODEL_H
|
||||
#define METADATAMODEL_H
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
|
||||
class Exiv2Wrapper;
|
||||
class MetadataModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MetadataModel(QObject *parent = nullptr);
|
||||
~MetadataModel();
|
||||
|
||||
void setFile(const QString & imageFilePath);
|
||||
static QString imageSize(const QSize &size);
|
||||
static QString imageSizeRatio(const QSize &size);
|
||||
bool appendSection(const QString & sectionKey, QStringView sectionDisplayName);
|
||||
bool appendPropertyIfNotEmpty(const QString & sectionKey, const QString & propertyKey,
|
||||
const QString & propertyDisplayName, const QString & propertyValue = QString());
|
||||
bool appendProperty(const QString & sectionKey, const QString & propertyKey,
|
||||
QStringView propertyDisplayName, QStringView propertyValue = QString());
|
||||
bool appendExivPropertyIfExist(const Exiv2Wrapper & wrapper, const QString & sectionKey,
|
||||
const QString & exiv2propertyKey, const QString & propertyDisplayName = QString(),
|
||||
bool isXmpString = false);
|
||||
|
||||
private:
|
||||
enum RowType : quintptr {
|
||||
SectionRow,
|
||||
PropertyRow,
|
||||
};
|
||||
|
||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
|
||||
QModelIndex parent(const QModelIndex &child) const override;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
int columnCount(const QModelIndex & = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
|
||||
// [SECTION_KEY]
|
||||
QList<QString> m_sections;
|
||||
// {SECTION_KEY: (SECTION_DISPLAY_NAME, [PROPERTY_KEY])}
|
||||
QMap<QString, QPair<QString, QList<QString> > > m_sectionProperties;
|
||||
// {PROPERTY_KEY: (PROPERTY_DISPLAY_NAME, PROPERTY_VALUE)}
|
||||
QMap<QString, QPair<QString, QString> > m_properties;
|
||||
};
|
||||
|
||||
#endif // METADATAMODEL_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef METADATAMODEL_H
|
||||
#define METADATAMODEL_H
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
|
||||
class Exiv2Wrapper;
|
||||
class MetadataModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MetadataModel(QObject *parent = nullptr);
|
||||
~MetadataModel();
|
||||
|
||||
void setFile(const QString & imageFilePath);
|
||||
static QString imageSize(const QSize &size);
|
||||
static QString imageSizeRatio(const QSize &size);
|
||||
bool appendSection(const QString & sectionKey, QStringView sectionDisplayName);
|
||||
bool appendPropertyIfNotEmpty(const QString & sectionKey, const QString & propertyKey,
|
||||
const QString & propertyDisplayName, const QString & propertyValue = QString());
|
||||
bool appendProperty(const QString & sectionKey, const QString & propertyKey,
|
||||
QStringView propertyDisplayName, QStringView propertyValue = QString());
|
||||
bool appendExivPropertyIfExist(const Exiv2Wrapper & wrapper, const QString & sectionKey,
|
||||
const QString & exiv2propertyKey, const QString & propertyDisplayName = QString(),
|
||||
bool isXmpString = false);
|
||||
|
||||
private:
|
||||
enum RowType : quintptr {
|
||||
SectionRow,
|
||||
PropertyRow,
|
||||
};
|
||||
|
||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
|
||||
QModelIndex parent(const QModelIndex &child) const override;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
int columnCount(const QModelIndex & = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
|
||||
// [SECTION_KEY]
|
||||
QList<QString> m_sections;
|
||||
// {SECTION_KEY: (SECTION_DISPLAY_NAME, [PROPERTY_KEY])}
|
||||
QMap<QString, QPair<QString, QList<QString> > > m_sectionProperties;
|
||||
// {PROPERTY_KEY: (PROPERTY_DISPLAY_NAME, PROPERTY_VALUE)}
|
||||
QMap<QString, QPair<QString, QString> > m_properties;
|
||||
};
|
||||
|
||||
#endif // METADATAMODEL_H
|
||||
|
||||
@@ -1,86 +1,91 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "navigatorview.h"
|
||||
|
||||
#include "graphicsview.h"
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QDebug>
|
||||
|
||||
NavigatorView::NavigatorView(QWidget *parent)
|
||||
: QGraphicsView (parent)
|
||||
, m_viewportRegion(this->rect())
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setStyleSheet("background-color: rgba(0, 0, 0, 120);"
|
||||
"border-radius: 3px;");
|
||||
}
|
||||
|
||||
// doesn't take or manage its ownership
|
||||
void NavigatorView::setMainView(GraphicsView *mainView)
|
||||
{
|
||||
m_mainView = mainView;
|
||||
}
|
||||
|
||||
void NavigatorView::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
void NavigatorView::updateMainViewportRegion()
|
||||
{
|
||||
if (m_mainView != nullptr) {
|
||||
m_viewportRegion = mapFromScene(m_mainView->mapToScene(m_mainView->rect()));
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
void NavigatorView::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseDown = true;
|
||||
|
||||
if (m_mainView) {
|
||||
m_mainView->centerOn(mapToScene(event->pos()));
|
||||
update();
|
||||
}
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void NavigatorView::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (m_mouseDown && m_mainView) {
|
||||
m_mainView->centerOn(mapToScene(event->pos()));
|
||||
update();
|
||||
event->accept();
|
||||
} else {
|
||||
event->ignore();
|
||||
}
|
||||
}
|
||||
|
||||
void NavigatorView::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseDown = false;
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void NavigatorView::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
event->ignore();
|
||||
return QGraphicsView::wheelEvent(event);
|
||||
}
|
||||
|
||||
void NavigatorView::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QGraphicsView::paintEvent(event);
|
||||
|
||||
QPainter painter(viewport());
|
||||
painter.setPen(QPen(Qt::gray, 2));
|
||||
painter.drawRect(m_viewportRegion.boundingRect());
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "navigatorview.h"
|
||||
|
||||
#include "graphicsview.h"
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
NavigatorView::NavigatorView(QWidget *parent)
|
||||
: QGraphicsView (parent)
|
||||
, m_viewportRegion(this->rect())
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setStyleSheet("background-color: rgba(0, 0, 0, 120);"
|
||||
"border-radius: 3px;");
|
||||
}
|
||||
|
||||
// doesn't take or manage its ownership
|
||||
void NavigatorView::setMainView(GraphicsView *mainView)
|
||||
{
|
||||
m_mainView = mainView;
|
||||
}
|
||||
|
||||
void NavigatorView::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
void NavigatorView::updateMainViewportRegion()
|
||||
{
|
||||
// Use QTimer::singleShot with lambda to delay the update
|
||||
// This ensures all geometry updates are complete before calculating viewport region
|
||||
QTimer::singleShot(0, [this]() {
|
||||
if (m_mainView != nullptr) {
|
||||
m_viewportRegion = mapFromScene(m_mainView->mapToScene(m_mainView->rect()));
|
||||
update();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void NavigatorView::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseDown = true;
|
||||
|
||||
if (m_mainView) {
|
||||
m_mainView->centerOn(mapToScene(event->pos()));
|
||||
update();
|
||||
}
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void NavigatorView::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (m_mouseDown && m_mainView) {
|
||||
m_mainView->centerOn(mapToScene(event->pos()));
|
||||
update();
|
||||
event->accept();
|
||||
} else {
|
||||
event->ignore();
|
||||
}
|
||||
}
|
||||
|
||||
void NavigatorView::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseDown = false;
|
||||
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void NavigatorView::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
event->ignore();
|
||||
return QGraphicsView::wheelEvent(event);
|
||||
}
|
||||
|
||||
void NavigatorView::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QGraphicsView::paintEvent(event);
|
||||
|
||||
QPainter painter(viewport());
|
||||
painter.setPen(QPen(Qt::gray, 2));
|
||||
painter.drawRect(m_viewportRegion.boundingRect());
|
||||
}
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef NAVIGATORVIEW_H
|
||||
#define NAVIGATORVIEW_H
|
||||
|
||||
#include <QGraphicsView>
|
||||
|
||||
class OpacityHelper;
|
||||
class GraphicsView;
|
||||
class NavigatorView : public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
NavigatorView(QWidget *parent = nullptr);
|
||||
|
||||
void setMainView(GraphicsView *mainView);
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
public slots:
|
||||
void updateMainViewportRegion();
|
||||
|
||||
private:
|
||||
void mousePressEvent(QMouseEvent * event) override;
|
||||
void mouseMoveEvent(QMouseEvent * event) override;
|
||||
void mouseReleaseEvent(QMouseEvent * event) override;
|
||||
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
|
||||
bool m_mouseDown = false;
|
||||
QPolygon m_viewportRegion;
|
||||
QGraphicsView *m_mainView = nullptr;
|
||||
OpacityHelper *m_opacityHelper = nullptr;
|
||||
};
|
||||
|
||||
#endif // NAVIGATORVIEW_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef NAVIGATORVIEW_H
|
||||
#define NAVIGATORVIEW_H
|
||||
|
||||
#include <QGraphicsView>
|
||||
|
||||
class OpacityHelper;
|
||||
class GraphicsView;
|
||||
class NavigatorView : public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
NavigatorView(QWidget *parent = nullptr);
|
||||
|
||||
void setMainView(GraphicsView *mainView);
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
public slots:
|
||||
void updateMainViewportRegion();
|
||||
|
||||
private:
|
||||
void mousePressEvent(QMouseEvent * event) override;
|
||||
void mouseMoveEvent(QMouseEvent * event) override;
|
||||
void mouseReleaseEvent(QMouseEvent * event) override;
|
||||
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
|
||||
bool m_mouseDown = false;
|
||||
QPolygon m_viewportRegion;
|
||||
QGraphicsView *m_mainView = nullptr;
|
||||
OpacityHelper *m_opacityHelper = nullptr;
|
||||
};
|
||||
|
||||
#endif // NAVIGATORVIEW_H
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
OpacityHelper::OpacityHelper(QWidget *parent)
|
||||
: QObject(parent)
|
||||
, m_opacityFx(new QGraphicsOpacityEffect(parent))
|
||||
, m_opacityAnimation(new QPropertyAnimation(m_opacityFx, "opacity"))
|
||||
{
|
||||
parent->setGraphicsEffect(m_opacityFx);
|
||||
|
||||
m_opacityAnimation->setDuration(300);
|
||||
}
|
||||
|
||||
void OpacityHelper::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
if (!animated) {
|
||||
m_opacityFx->setOpacity(opacity);
|
||||
return;
|
||||
}
|
||||
|
||||
m_opacityAnimation->stop();
|
||||
m_opacityAnimation->setStartValue(m_opacityFx->opacity());
|
||||
m_opacityAnimation->setEndValue(opacity);
|
||||
m_opacityAnimation->start();
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
OpacityHelper::OpacityHelper(QWidget *parent)
|
||||
: QObject(parent)
|
||||
, m_opacityFx(new QGraphicsOpacityEffect(parent))
|
||||
, m_opacityAnimation(new QPropertyAnimation(m_opacityFx, "opacity"))
|
||||
{
|
||||
parent->setGraphicsEffect(m_opacityFx);
|
||||
|
||||
m_opacityAnimation->setDuration(300);
|
||||
}
|
||||
|
||||
void OpacityHelper::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
if (!animated) {
|
||||
m_opacityFx->setOpacity(opacity);
|
||||
return;
|
||||
}
|
||||
|
||||
m_opacityAnimation->stop();
|
||||
m_opacityAnimation->setStartValue(m_opacityFx->opacity());
|
||||
m_opacityAnimation->setEndValue(opacity);
|
||||
m_opacityAnimation->start();
|
||||
}
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef OPACITYHELPER_H
|
||||
#define OPACITYHELPER_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QPropertyAnimation;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class OpacityHelper : QObject
|
||||
{
|
||||
public:
|
||||
OpacityHelper(QWidget * parent);
|
||||
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
protected:
|
||||
QGraphicsOpacityEffect * m_opacityFx;
|
||||
QPropertyAnimation * m_opacityAnimation;
|
||||
};
|
||||
|
||||
#endif // OPACITYHELPER_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef OPACITYHELPER_H
|
||||
#define OPACITYHELPER_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QPropertyAnimation;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class OpacityHelper : QObject
|
||||
{
|
||||
public:
|
||||
OpacityHelper(QWidget * parent);
|
||||
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
protected:
|
||||
QGraphicsOpacityEffect * m_opacityFx;
|
||||
QPropertyAnimation * m_opacityAnimation;
|
||||
};
|
||||
|
||||
#endif // OPACITYHELPER_H
|
||||
|
||||
@@ -1,283 +1,283 @@
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "playlistmanager.h"
|
||||
|
||||
#include <QCollator>
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QUrl>
|
||||
|
||||
PlaylistModel::PlaylistModel(QObject *parent)
|
||||
: QAbstractListModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PlaylistModel::~PlaylistModel()
|
||||
= default;
|
||||
|
||||
void PlaylistModel::setPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
beginResetModel();
|
||||
m_playlist = urls;
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::loadPlaylist(const QList<QUrl> & urls)
|
||||
{
|
||||
if (urls.isEmpty()) return {};
|
||||
if (urls.count() == 1) {
|
||||
return loadPlaylist(urls.constFirst());
|
||||
} else {
|
||||
setPlaylist(urls);
|
||||
return index(0);
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::loadPlaylist(const QUrl &url)
|
||||
{
|
||||
QFileInfo info(url.toLocalFile());
|
||||
QDir dir(info.path());
|
||||
QString && currentFileName = info.fileName();
|
||||
|
||||
if (dir.path() == m_currentDir) {
|
||||
int idx = indexOf(url);
|
||||
return idx == -1 ? appendToPlaylist(url) : index(idx);
|
||||
}
|
||||
|
||||
QStringList entryList = dir.entryList(
|
||||
m_autoLoadSuffixes,
|
||||
QDir::Files | QDir::NoSymLinks, QDir::NoSort);
|
||||
|
||||
QCollator collator;
|
||||
collator.setNumericMode(true);
|
||||
|
||||
std::sort(entryList.begin(), entryList.end(), collator);
|
||||
|
||||
QList<QUrl> playlist;
|
||||
|
||||
int idx = -1;
|
||||
for (int i = 0; i < entryList.count(); i++) {
|
||||
const QString & fileName = entryList.at(i);
|
||||
const QString & oneEntry = dir.absoluteFilePath(fileName);
|
||||
const QUrl & url = QUrl::fromLocalFile(oneEntry);
|
||||
playlist.append(url);
|
||||
if (fileName == currentFileName) {
|
||||
idx = i;
|
||||
}
|
||||
}
|
||||
if (idx == -1) {
|
||||
idx = playlist.count();
|
||||
playlist.append(url);
|
||||
}
|
||||
m_currentDir = dir.path();
|
||||
|
||||
setPlaylist(playlist);
|
||||
|
||||
return index(idx);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::appendToPlaylist(const QUrl &url)
|
||||
{
|
||||
const int lastIndex = rowCount();
|
||||
beginInsertRows(QModelIndex(), lastIndex, lastIndex);
|
||||
m_playlist.append(url);
|
||||
endInsertRows();
|
||||
return index(lastIndex);
|
||||
}
|
||||
|
||||
bool PlaylistModel::removeAt(int index)
|
||||
{
|
||||
if (index < 0 || index >= rowCount()) return false;
|
||||
beginRemoveRows(QModelIndex(), index, index);
|
||||
m_playlist.removeAt(index);
|
||||
endRemoveRows();
|
||||
return true;
|
||||
}
|
||||
|
||||
int PlaylistModel::indexOf(const QUrl &url) const
|
||||
{
|
||||
return m_playlist.indexOf(url);
|
||||
}
|
||||
|
||||
QUrl PlaylistModel::urlByIndex(int index) const
|
||||
{
|
||||
return m_playlist.value(index);
|
||||
}
|
||||
|
||||
QStringList PlaylistModel::autoLoadFilterSuffixes() const
|
||||
{
|
||||
return m_autoLoadSuffixes;
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> PlaylistModel::roleNames() const
|
||||
{
|
||||
QHash<int, QByteArray> result = QAbstractListModel::roleNames();
|
||||
result.insert(UrlRole, "url");
|
||||
return result;
|
||||
}
|
||||
|
||||
int PlaylistModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return m_playlist.count();
|
||||
}
|
||||
|
||||
QVariant PlaylistModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid()) return {};
|
||||
|
||||
switch (role) {
|
||||
case Qt::DisplayRole:
|
||||
return m_playlist.at(index.row()).fileName();
|
||||
case UrlRole:
|
||||
return m_playlist.at(index.row());
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
PlaylistManager::PlaylistManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
connect(&m_model, &PlaylistModel::rowsRemoved, this,
|
||||
[this](const QModelIndex &, int, int) {
|
||||
if (m_model.rowCount() <= m_currentIndex) {
|
||||
setProperty("currentIndex", m_currentIndex - 1);
|
||||
}
|
||||
});
|
||||
|
||||
auto onRowCountChanged = [this](){
|
||||
emit totalCountChanged(m_model.rowCount());
|
||||
};
|
||||
|
||||
connect(&m_model, &PlaylistModel::rowsInserted, this, onRowCountChanged);
|
||||
connect(&m_model, &PlaylistModel::rowsRemoved, this, onRowCountChanged);
|
||||
connect(&m_model, &PlaylistModel::modelReset, this, onRowCountChanged);
|
||||
}
|
||||
|
||||
PlaylistManager::~PlaylistManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PlaylistModel *PlaylistManager::model()
|
||||
{
|
||||
return &m_model;
|
||||
}
|
||||
|
||||
void PlaylistManager::setPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
m_model.setPlaylist(urls);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
QModelIndex idx = m_model.loadPlaylist(urls);
|
||||
setProperty("currentIndex", idx.row());
|
||||
return idx;
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadPlaylist(const QUrl &url)
|
||||
{
|
||||
QModelIndex idx = m_model.loadPlaylist(url);
|
||||
setProperty("currentIndex", idx.row());
|
||||
return idx;
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadM3U8Playlist(const QUrl &url)
|
||||
{
|
||||
QFile file(url.toLocalFile());
|
||||
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
QList<QUrl> urls;
|
||||
while (!file.atEnd()) {
|
||||
QString line = file.readLine();
|
||||
if (line.startsWith('#')) {
|
||||
continue;
|
||||
}
|
||||
QFileInfo fileInfo(file);
|
||||
QUrl item = QUrl::fromUserInput(line, fileInfo.absolutePath());
|
||||
urls.append(item);
|
||||
}
|
||||
return loadPlaylist(urls);
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
int PlaylistManager::totalCount() const
|
||||
{
|
||||
return m_model.rowCount();
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::previousIndex() const
|
||||
{
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(isFirstIndex() ? count - 1 : m_currentIndex - 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::nextIndex() const
|
||||
{
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(isLastIndex() ? 0 : m_currentIndex + 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::curIndex() const
|
||||
{
|
||||
return m_model.index(m_currentIndex);
|
||||
}
|
||||
|
||||
bool PlaylistManager::isFirstIndex() const
|
||||
{
|
||||
return m_currentIndex == 0;
|
||||
}
|
||||
|
||||
bool PlaylistManager::isLastIndex() const
|
||||
{
|
||||
return m_currentIndex + 1 == totalCount();
|
||||
}
|
||||
|
||||
void PlaylistManager::setCurrentIndex(const QModelIndex &index)
|
||||
{
|
||||
if (index.isValid() && index.row() >= 0 && index.row() < totalCount()) {
|
||||
setProperty("currentIndex", index.row());
|
||||
}
|
||||
}
|
||||
|
||||
QUrl PlaylistManager::urlByIndex(const QModelIndex &index)
|
||||
{
|
||||
return m_model.urlByIndex(index.row());
|
||||
}
|
||||
|
||||
QString PlaylistManager::localFileByIndex(const QModelIndex &index)
|
||||
{
|
||||
return urlByIndex(index).toLocalFile();
|
||||
}
|
||||
|
||||
bool PlaylistManager::removeAt(const QModelIndex &index)
|
||||
{
|
||||
return m_model.removeAt(index.row());
|
||||
}
|
||||
|
||||
void PlaylistManager::setAutoLoadFilterSuffixes(const QStringList &nameFilters)
|
||||
{
|
||||
m_model.setProperty("autoLoadFilterSuffixes", nameFilters);
|
||||
}
|
||||
|
||||
QList<QUrl> PlaylistManager::convertToUrlList(const QStringList &files)
|
||||
{
|
||||
QList<QUrl> urlList;
|
||||
for (const QString & str : std::as_const(files)) {
|
||||
QUrl url = QUrl::fromLocalFile(str);
|
||||
if (url.isValid()) {
|
||||
urlList.append(url);
|
||||
}
|
||||
}
|
||||
|
||||
return urlList;
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "playlistmanager.h"
|
||||
|
||||
#include <QCollator>
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QUrl>
|
||||
|
||||
PlaylistModel::PlaylistModel(QObject *parent)
|
||||
: QAbstractListModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PlaylistModel::~PlaylistModel()
|
||||
= default;
|
||||
|
||||
void PlaylistModel::setPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
beginResetModel();
|
||||
m_playlist = urls;
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::loadPlaylist(const QList<QUrl> & urls)
|
||||
{
|
||||
if (urls.isEmpty()) return {};
|
||||
if (urls.count() == 1) {
|
||||
return loadPlaylist(urls.constFirst());
|
||||
} else {
|
||||
setPlaylist(urls);
|
||||
return index(0);
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::loadPlaylist(const QUrl &url)
|
||||
{
|
||||
QFileInfo info(url.toLocalFile());
|
||||
QDir dir(info.path());
|
||||
QString && currentFileName = info.fileName();
|
||||
|
||||
if (dir.path() == m_currentDir) {
|
||||
int idx = indexOf(url);
|
||||
return idx == -1 ? appendToPlaylist(url) : index(idx);
|
||||
}
|
||||
|
||||
QStringList entryList = dir.entryList(
|
||||
m_autoLoadSuffixes,
|
||||
QDir::Files | QDir::NoSymLinks, QDir::NoSort);
|
||||
|
||||
QCollator collator;
|
||||
collator.setNumericMode(true);
|
||||
|
||||
std::sort(entryList.begin(), entryList.end(), collator);
|
||||
|
||||
QList<QUrl> playlist;
|
||||
|
||||
int idx = -1;
|
||||
for (int i = 0; i < entryList.count(); i++) {
|
||||
const QString & fileName = entryList.at(i);
|
||||
const QString & oneEntry = dir.absoluteFilePath(fileName);
|
||||
const QUrl & url = QUrl::fromLocalFile(oneEntry);
|
||||
playlist.append(url);
|
||||
if (fileName == currentFileName) {
|
||||
idx = i;
|
||||
}
|
||||
}
|
||||
if (idx == -1) {
|
||||
idx = playlist.count();
|
||||
playlist.append(url);
|
||||
}
|
||||
m_currentDir = dir.path();
|
||||
|
||||
setPlaylist(playlist);
|
||||
|
||||
return index(idx);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::appendToPlaylist(const QUrl &url)
|
||||
{
|
||||
const int lastIndex = rowCount();
|
||||
beginInsertRows(QModelIndex(), lastIndex, lastIndex);
|
||||
m_playlist.append(url);
|
||||
endInsertRows();
|
||||
return index(lastIndex);
|
||||
}
|
||||
|
||||
bool PlaylistModel::removeAt(int index)
|
||||
{
|
||||
if (index < 0 || index >= rowCount()) return false;
|
||||
beginRemoveRows(QModelIndex(), index, index);
|
||||
m_playlist.removeAt(index);
|
||||
endRemoveRows();
|
||||
return true;
|
||||
}
|
||||
|
||||
int PlaylistModel::indexOf(const QUrl &url) const
|
||||
{
|
||||
return m_playlist.indexOf(url);
|
||||
}
|
||||
|
||||
QUrl PlaylistModel::urlByIndex(int index) const
|
||||
{
|
||||
return m_playlist.value(index);
|
||||
}
|
||||
|
||||
QStringList PlaylistModel::autoLoadFilterSuffixes() const
|
||||
{
|
||||
return m_autoLoadSuffixes;
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> PlaylistModel::roleNames() const
|
||||
{
|
||||
QHash<int, QByteArray> result = QAbstractListModel::roleNames();
|
||||
result.insert(UrlRole, "url");
|
||||
return result;
|
||||
}
|
||||
|
||||
int PlaylistModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return m_playlist.count();
|
||||
}
|
||||
|
||||
QVariant PlaylistModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid()) return {};
|
||||
|
||||
switch (role) {
|
||||
case Qt::DisplayRole:
|
||||
return m_playlist.at(index.row()).fileName();
|
||||
case UrlRole:
|
||||
return m_playlist.at(index.row());
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
PlaylistManager::PlaylistManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
connect(&m_model, &PlaylistModel::rowsRemoved, this,
|
||||
[this](const QModelIndex &, int, int) {
|
||||
if (m_model.rowCount() <= m_currentIndex) {
|
||||
setProperty("currentIndex", m_currentIndex - 1);
|
||||
}
|
||||
});
|
||||
|
||||
auto onRowCountChanged = [this](){
|
||||
emit totalCountChanged(m_model.rowCount());
|
||||
};
|
||||
|
||||
connect(&m_model, &PlaylistModel::rowsInserted, this, onRowCountChanged);
|
||||
connect(&m_model, &PlaylistModel::rowsRemoved, this, onRowCountChanged);
|
||||
connect(&m_model, &PlaylistModel::modelReset, this, onRowCountChanged);
|
||||
}
|
||||
|
||||
PlaylistManager::~PlaylistManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PlaylistModel *PlaylistManager::model()
|
||||
{
|
||||
return &m_model;
|
||||
}
|
||||
|
||||
void PlaylistManager::setPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
m_model.setPlaylist(urls);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
QModelIndex idx = m_model.loadPlaylist(urls);
|
||||
setProperty("currentIndex", idx.row());
|
||||
return idx;
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadPlaylist(const QUrl &url)
|
||||
{
|
||||
QModelIndex idx = m_model.loadPlaylist(url);
|
||||
setProperty("currentIndex", idx.row());
|
||||
return idx;
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadM3U8Playlist(const QUrl &url)
|
||||
{
|
||||
QFile file(url.toLocalFile());
|
||||
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
QList<QUrl> urls;
|
||||
while (!file.atEnd()) {
|
||||
QString line = file.readLine();
|
||||
if (line.startsWith('#')) {
|
||||
continue;
|
||||
}
|
||||
QFileInfo fileInfo(file);
|
||||
QUrl item = QUrl::fromUserInput(line, fileInfo.absolutePath());
|
||||
urls.append(item);
|
||||
}
|
||||
return loadPlaylist(urls);
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
int PlaylistManager::totalCount() const
|
||||
{
|
||||
return m_model.rowCount();
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::previousIndex() const
|
||||
{
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(isFirstIndex() ? count - 1 : m_currentIndex - 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::nextIndex() const
|
||||
{
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(isLastIndex() ? 0 : m_currentIndex + 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::curIndex() const
|
||||
{
|
||||
return m_model.index(m_currentIndex);
|
||||
}
|
||||
|
||||
bool PlaylistManager::isFirstIndex() const
|
||||
{
|
||||
return m_currentIndex == 0;
|
||||
}
|
||||
|
||||
bool PlaylistManager::isLastIndex() const
|
||||
{
|
||||
return m_currentIndex + 1 == totalCount();
|
||||
}
|
||||
|
||||
void PlaylistManager::setCurrentIndex(const QModelIndex &index)
|
||||
{
|
||||
if (index.isValid() && index.row() >= 0 && index.row() < totalCount()) {
|
||||
setProperty("currentIndex", index.row());
|
||||
}
|
||||
}
|
||||
|
||||
QUrl PlaylistManager::urlByIndex(const QModelIndex &index)
|
||||
{
|
||||
return m_model.urlByIndex(index.row());
|
||||
}
|
||||
|
||||
QString PlaylistManager::localFileByIndex(const QModelIndex &index)
|
||||
{
|
||||
return urlByIndex(index).toLocalFile();
|
||||
}
|
||||
|
||||
bool PlaylistManager::removeAt(const QModelIndex &index)
|
||||
{
|
||||
return m_model.removeAt(index.row());
|
||||
}
|
||||
|
||||
void PlaylistManager::setAutoLoadFilterSuffixes(const QStringList &nameFilters)
|
||||
{
|
||||
m_model.setProperty("autoLoadFilterSuffixes", nameFilters);
|
||||
}
|
||||
|
||||
QList<QUrl> PlaylistManager::convertToUrlList(const QStringList &files)
|
||||
{
|
||||
QList<QUrl> urlList;
|
||||
for (const QString & str : std::as_const(files)) {
|
||||
QUrl url = QUrl::fromLocalFile(str);
|
||||
if (url.isValid()) {
|
||||
urlList.append(url);
|
||||
}
|
||||
}
|
||||
|
||||
return urlList;
|
||||
}
|
||||
|
||||
@@ -1,88 +1,88 @@
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QUrl>
|
||||
#include <QAbstractListModel>
|
||||
|
||||
class PlaylistModel : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum PlaylistRole {
|
||||
UrlRole = Qt::UserRole
|
||||
};
|
||||
Q_ENUM(PlaylistRole)
|
||||
Q_PROPERTY(QStringList autoLoadFilterSuffixes MEMBER m_autoLoadSuffixes NOTIFY autoLoadFilterSuffixesChanged)
|
||||
|
||||
explicit PlaylistModel(QObject *parent = nullptr);
|
||||
~PlaylistModel() override;
|
||||
|
||||
void setPlaylist(const QList<QUrl> & urls);
|
||||
QModelIndex loadPlaylist(const QList<QUrl> & urls);
|
||||
QModelIndex loadPlaylist(const QUrl & url);
|
||||
QModelIndex appendToPlaylist(const QUrl & url);
|
||||
bool removeAt(int index);
|
||||
int indexOf(const QUrl & url) const;
|
||||
QUrl urlByIndex(int index) const;
|
||||
QStringList autoLoadFilterSuffixes() const;
|
||||
|
||||
QHash<int, QByteArray> roleNames() const override;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
signals:
|
||||
void autoLoadFilterSuffixesChanged(QStringList suffixes);
|
||||
|
||||
private:
|
||||
// model data
|
||||
QList<QUrl> m_playlist;
|
||||
// properties
|
||||
QStringList m_autoLoadSuffixes = {};
|
||||
// internal
|
||||
QString m_currentDir;
|
||||
};
|
||||
|
||||
class PlaylistManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Q_PROPERTY(int currentIndex MEMBER m_currentIndex NOTIFY currentIndexChanged)
|
||||
Q_PROPERTY(QStringList autoLoadFilterSuffixes WRITE setAutoLoadFilterSuffixes)
|
||||
Q_PROPERTY(PlaylistModel * model READ model CONSTANT)
|
||||
|
||||
explicit PlaylistManager(QObject *parent = nullptr);
|
||||
~PlaylistManager();
|
||||
|
||||
PlaylistModel * model();
|
||||
|
||||
void setPlaylist(const QList<QUrl> & url);
|
||||
Q_INVOKABLE QModelIndex loadPlaylist(const QList<QUrl> & urls);
|
||||
Q_INVOKABLE QModelIndex loadPlaylist(const QUrl & url);
|
||||
Q_INVOKABLE QModelIndex loadM3U8Playlist(const QUrl & url);
|
||||
|
||||
int totalCount() const;
|
||||
QModelIndex previousIndex() const;
|
||||
QModelIndex nextIndex() const;
|
||||
QModelIndex curIndex() const;
|
||||
bool isFirstIndex() const;
|
||||
bool isLastIndex() const;
|
||||
void setCurrentIndex(const QModelIndex & index);
|
||||
QUrl urlByIndex(const QModelIndex & index);
|
||||
QString localFileByIndex(const QModelIndex & index);
|
||||
bool removeAt(const QModelIndex & index);
|
||||
|
||||
void setAutoLoadFilterSuffixes(const QStringList &nameFilters);
|
||||
|
||||
static QList<QUrl> convertToUrlList(const QStringList & files);
|
||||
|
||||
signals:
|
||||
void currentIndexChanged(int index);
|
||||
void totalCountChanged(int count);
|
||||
|
||||
private:
|
||||
int m_currentIndex = -1;
|
||||
PlaylistModel m_model;
|
||||
};
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QUrl>
|
||||
#include <QAbstractListModel>
|
||||
|
||||
class PlaylistModel : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum PlaylistRole {
|
||||
UrlRole = Qt::UserRole
|
||||
};
|
||||
Q_ENUM(PlaylistRole)
|
||||
Q_PROPERTY(QStringList autoLoadFilterSuffixes MEMBER m_autoLoadSuffixes NOTIFY autoLoadFilterSuffixesChanged)
|
||||
|
||||
explicit PlaylistModel(QObject *parent = nullptr);
|
||||
~PlaylistModel() override;
|
||||
|
||||
void setPlaylist(const QList<QUrl> & urls);
|
||||
QModelIndex loadPlaylist(const QList<QUrl> & urls);
|
||||
QModelIndex loadPlaylist(const QUrl & url);
|
||||
QModelIndex appendToPlaylist(const QUrl & url);
|
||||
bool removeAt(int index);
|
||||
int indexOf(const QUrl & url) const;
|
||||
QUrl urlByIndex(int index) const;
|
||||
QStringList autoLoadFilterSuffixes() const;
|
||||
|
||||
QHash<int, QByteArray> roleNames() const override;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
signals:
|
||||
void autoLoadFilterSuffixesChanged(QStringList suffixes);
|
||||
|
||||
private:
|
||||
// model data
|
||||
QList<QUrl> m_playlist;
|
||||
// properties
|
||||
QStringList m_autoLoadSuffixes = {};
|
||||
// internal
|
||||
QString m_currentDir;
|
||||
};
|
||||
|
||||
class PlaylistManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Q_PROPERTY(int currentIndex MEMBER m_currentIndex NOTIFY currentIndexChanged)
|
||||
Q_PROPERTY(QStringList autoLoadFilterSuffixes WRITE setAutoLoadFilterSuffixes)
|
||||
Q_PROPERTY(PlaylistModel * model READ model CONSTANT)
|
||||
|
||||
explicit PlaylistManager(QObject *parent = nullptr);
|
||||
~PlaylistManager();
|
||||
|
||||
PlaylistModel * model();
|
||||
|
||||
void setPlaylist(const QList<QUrl> & url);
|
||||
Q_INVOKABLE QModelIndex loadPlaylist(const QList<QUrl> & urls);
|
||||
Q_INVOKABLE QModelIndex loadPlaylist(const QUrl & url);
|
||||
Q_INVOKABLE QModelIndex loadM3U8Playlist(const QUrl & url);
|
||||
|
||||
int totalCount() const;
|
||||
QModelIndex previousIndex() const;
|
||||
QModelIndex nextIndex() const;
|
||||
QModelIndex curIndex() const;
|
||||
bool isFirstIndex() const;
|
||||
bool isLastIndex() const;
|
||||
void setCurrentIndex(const QModelIndex & index);
|
||||
QUrl urlByIndex(const QModelIndex & index);
|
||||
QString localFileByIndex(const QModelIndex & index);
|
||||
bool removeAt(const QModelIndex & index);
|
||||
|
||||
void setAutoLoadFilterSuffixes(const QStringList &nameFilters);
|
||||
|
||||
static QList<QUrl> convertToUrlList(const QStringList & files);
|
||||
|
||||
signals:
|
||||
void currentIndexChanged(int index);
|
||||
void totalCountChanged(int count);
|
||||
|
||||
private:
|
||||
int m_currentIndex = -1;
|
||||
PlaylistModel m_model;
|
||||
};
|
||||
|
||||
482
app/settings.cpp
482
app/settings.cpp
@@ -1,226 +1,256 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QStandardPaths>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QAction>
|
||||
#include <QWidget>
|
||||
#include <QKeySequence>
|
||||
#include <QMetaEnum>
|
||||
|
||||
namespace QEnumHelper
|
||||
{
|
||||
template <typename E>
|
||||
E fromString(const QString &text, const E defaultValue)
|
||||
{
|
||||
bool ok;
|
||||
E result = static_cast<E>(QMetaEnum::fromType<E>().keyToValue(text.toUtf8(), &ok));
|
||||
if (!ok) {
|
||||
return defaultValue;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename E>
|
||||
QString toString(E value)
|
||||
{
|
||||
const int intValue = static_cast<int>(value);
|
||||
return QString::fromUtf8(QMetaEnum::fromType<E>().valueToKey(intValue));
|
||||
}
|
||||
}
|
||||
|
||||
Settings *Settings::m_settings_instance = nullptr;
|
||||
|
||||
Settings *Settings::instance()
|
||||
{
|
||||
if (!m_settings_instance) {
|
||||
m_settings_instance = new Settings;
|
||||
}
|
||||
|
||||
return m_settings_instance;
|
||||
}
|
||||
|
||||
bool Settings::stayOnTop() const
|
||||
{
|
||||
return m_qsettings->value("stay_on_top", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useBuiltInCloseAnimation() const
|
||||
{
|
||||
return m_qsettings->value("use_built_in_close_animation", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useLightCheckerboard() const
|
||||
{
|
||||
return m_qsettings->value("use_light_checkerboard", false).toBool();
|
||||
}
|
||||
|
||||
bool Settings::loopGallery() const
|
||||
{
|
||||
return m_qsettings->value("loop_gallery", true).toBool();
|
||||
}
|
||||
|
||||
Settings::DoubleClickBehavior Settings::doubleClickBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("double_click_behavior", "Close").toString();
|
||||
|
||||
return QEnumHelper::fromString<DoubleClickBehavior>(result, DoubleClickBehavior::Close);
|
||||
}
|
||||
|
||||
Settings::MouseWheelBehavior Settings::mouseWheelBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("mouse_wheel_behavior", "Zoom").toString();
|
||||
|
||||
return QEnumHelper::fromString<MouseWheelBehavior>(result, MouseWheelBehavior::Zoom);
|
||||
}
|
||||
|
||||
Settings::WindowSizeBehavior Settings::initWindowSizeBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("init_window_size_behavior", "Auto").toString();
|
||||
|
||||
return QEnumHelper::fromString<WindowSizeBehavior>(result, WindowSizeBehavior::Auto);
|
||||
}
|
||||
|
||||
Qt::HighDpiScaleFactorRoundingPolicy Settings::hiDpiScaleFactorBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("hidpi_scale_factor_behavior", "PassThrough").toString();
|
||||
|
||||
return QEnumHelper::fromString<Qt::HighDpiScaleFactorRoundingPolicy>(result, Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||
}
|
||||
|
||||
void Settings::setStayOnTop(bool on)
|
||||
{
|
||||
m_qsettings->setValue("stay_on_top", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setUseBuiltInCloseAnimation(bool on)
|
||||
{
|
||||
m_qsettings->setValue("use_built_in_close_animation", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setUseLightCheckerboard(bool light)
|
||||
{
|
||||
m_qsettings->setValue("use_light_checkerboard", light);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setLoopGallery(bool on)
|
||||
{
|
||||
m_qsettings->setValue("loop_gallery", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setDoubleClickBehavior(DoubleClickBehavior dcb)
|
||||
{
|
||||
m_qsettings->setValue("double_click_behavior", QEnumHelper::toString(dcb));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setMouseWheelBehavior(MouseWheelBehavior mwb)
|
||||
{
|
||||
m_qsettings->setValue("mouse_wheel_behavior", QEnumHelper::toString(mwb));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setInitWindowSizeBehavior(WindowSizeBehavior wsb)
|
||||
{
|
||||
m_qsettings->setValue("init_window_size_behavior", QEnumHelper::toString(wsb));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setHiDpiScaleFactorBehavior(Qt::HighDpiScaleFactorRoundingPolicy hidpi)
|
||||
{
|
||||
m_qsettings->setValue("hidpi_scale_factor_behavior", QEnumHelper::toString(hidpi));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::applyUserShortcuts(QWidget *widget)
|
||||
{
|
||||
m_qsettings->beginGroup("shortcuts");
|
||||
const QStringList shortcutNames = m_qsettings->allKeys();
|
||||
for (const QString & name : shortcutNames) {
|
||||
QList<QKeySequence> shortcuts = m_qsettings->value(name).value<QList<QKeySequence>>();
|
||||
setShortcutsForAction(widget, name, shortcuts, false);
|
||||
}
|
||||
m_qsettings->endGroup();
|
||||
}
|
||||
|
||||
bool Settings::setShortcutsForAction(QWidget *widget, const QString &objectName,
|
||||
QList<QKeySequence> shortcuts, bool writeConfig)
|
||||
{
|
||||
QAction * targetAction = nullptr;
|
||||
for (QAction * action : widget->actions()) {
|
||||
if (action->objectName() == objectName) {
|
||||
targetAction = action;
|
||||
} else {
|
||||
for (const QKeySequence & shortcut : std::as_const(shortcuts)) {
|
||||
if (action->shortcuts().contains(shortcut)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (targetAction) {
|
||||
targetAction->setShortcuts(shortcuts);
|
||||
}
|
||||
|
||||
if (targetAction && writeConfig) {
|
||||
m_qsettings->beginGroup("shortcuts");
|
||||
m_qsettings->setValue(objectName, QVariant::fromValue(shortcuts));
|
||||
m_qsettings->endGroup();
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
#include <windows.h>
|
||||
// QCoreApplication::applicationDirPath() parses the "applicationDirPath" from arg0, which...
|
||||
// 1. rely on a QApplication object instance
|
||||
// but we need to call QGuiApplication::setHighDpiScaleFactorRoundingPolicy() before QApplication get created
|
||||
// 2. arg0 is NOT garanteed to be the path of execution
|
||||
// see also: https://stackoverflow.com/questions/383973/is-args0-guaranteed-to-be-the-path-of-execution
|
||||
// This function is here mainly for #1.
|
||||
QString getApplicationDirPath()
|
||||
{
|
||||
WCHAR buffer[MAX_PATH];
|
||||
GetModuleFileNameW(NULL, buffer, MAX_PATH);
|
||||
QString appPath = QString::fromWCharArray(buffer);
|
||||
|
||||
return appPath.left(appPath.lastIndexOf('\\'));
|
||||
}
|
||||
#endif // defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
|
||||
Settings::Settings()
|
||||
: QObject(qApp)
|
||||
{
|
||||
QString configPath;
|
||||
|
||||
#if defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
QString portableConfigDirPath = QDir(getApplicationDirPath()).absoluteFilePath("data");
|
||||
QFileInfo portableConfigDirInfo(portableConfigDirPath);
|
||||
if (portableConfigDirInfo.exists() && portableConfigDirInfo.isDir() && portableConfigDirInfo.isWritable()) {
|
||||
// we can use it.
|
||||
configPath = portableConfigDirPath;
|
||||
}
|
||||
#endif // defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
|
||||
if (configPath.isEmpty()) {
|
||||
// Should be %LOCALAPPDATA%\<APPNAME> under Windows, ~/.config/<APPNAME> under Linux.
|
||||
configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
|
||||
}
|
||||
|
||||
m_qsettings = new QSettings(QDir(configPath).absoluteFilePath("config.ini"), QSettings::IniFormat, this);
|
||||
|
||||
qRegisterMetaType<QList<QKeySequence>>();
|
||||
}
|
||||
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QStandardPaths>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QAction>
|
||||
#include <QWidget>
|
||||
#include <QKeySequence>
|
||||
#include <QMetaEnum>
|
||||
|
||||
namespace QEnumHelper
|
||||
{
|
||||
template <typename E>
|
||||
E fromString(const QString &text, const E defaultValue)
|
||||
{
|
||||
bool ok;
|
||||
E result = static_cast<E>(QMetaEnum::fromType<E>().keyToValue(text.toUtf8(), &ok));
|
||||
if (!ok) {
|
||||
return defaultValue;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename E>
|
||||
QString toString(E value)
|
||||
{
|
||||
const int intValue = static_cast<int>(value);
|
||||
return QString::fromUtf8(QMetaEnum::fromType<E>().valueToKey(intValue));
|
||||
}
|
||||
}
|
||||
|
||||
Settings *Settings::m_settings_instance = nullptr;
|
||||
|
||||
Settings *Settings::instance()
|
||||
{
|
||||
if (!m_settings_instance) {
|
||||
m_settings_instance = new Settings;
|
||||
}
|
||||
|
||||
return m_settings_instance;
|
||||
}
|
||||
|
||||
bool Settings::stayOnTop() const
|
||||
{
|
||||
return m_qsettings->value("stay_on_top", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useBuiltInCloseAnimation() const
|
||||
{
|
||||
return m_qsettings->value("use_built_in_close_animation", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useLightCheckerboard() const
|
||||
{
|
||||
return m_qsettings->value("use_light_checkerboard", false).toBool();
|
||||
}
|
||||
|
||||
bool Settings::loopGallery() const
|
||||
{
|
||||
return m_qsettings->value("loop_gallery", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::autoLongImageMode() const
|
||||
{
|
||||
return m_qsettings->value("auto_long_image_mode", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::svgTiny12Only() const
|
||||
{
|
||||
// Qt 6.7.0's SVG support is terrible caused by huge memory usage, see QTBUG-124287
|
||||
// Qt 6.7.1's is somewhat better, memory issue seems fixed, but still laggy when zoom in, see QTBUG-126771.
|
||||
// Qt 6.9.3 and Qt 6.10.1 seems no longer have the laggy issue, so let's make the default value different
|
||||
// based on Qt version.
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 9, 3)
|
||||
return m_qsettings->value("svg_tiny12_only", true).toBool();
|
||||
#else
|
||||
return m_qsettings->value("svg_tiny12_only", false).toBool();
|
||||
#endif // QT_VERSION < QT_VERSION_CHECK(6, 9, 3)
|
||||
}
|
||||
|
||||
Settings::DoubleClickBehavior Settings::doubleClickBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("double_click_behavior", "Close").toString();
|
||||
|
||||
return QEnumHelper::fromString<DoubleClickBehavior>(result, DoubleClickBehavior::Close);
|
||||
}
|
||||
|
||||
Settings::MouseWheelBehavior Settings::mouseWheelBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("mouse_wheel_behavior", "Zoom").toString();
|
||||
|
||||
return QEnumHelper::fromString<MouseWheelBehavior>(result, MouseWheelBehavior::Zoom);
|
||||
}
|
||||
|
||||
Settings::WindowSizeBehavior Settings::initWindowSizeBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("init_window_size_behavior", "Auto").toString();
|
||||
|
||||
return QEnumHelper::fromString<WindowSizeBehavior>(result, WindowSizeBehavior::Auto);
|
||||
}
|
||||
|
||||
Qt::HighDpiScaleFactorRoundingPolicy Settings::hiDpiScaleFactorBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("hidpi_scale_factor_behavior", "PassThrough").toString();
|
||||
|
||||
return QEnumHelper::fromString<Qt::HighDpiScaleFactorRoundingPolicy>(result, Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||
}
|
||||
|
||||
void Settings::setStayOnTop(bool on)
|
||||
{
|
||||
m_qsettings->setValue("stay_on_top", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setUseBuiltInCloseAnimation(bool on)
|
||||
{
|
||||
m_qsettings->setValue("use_built_in_close_animation", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setUseLightCheckerboard(bool light)
|
||||
{
|
||||
m_qsettings->setValue("use_light_checkerboard", light);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setLoopGallery(bool on)
|
||||
{
|
||||
m_qsettings->setValue("loop_gallery", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setAutoLongImageMode(bool on)
|
||||
{
|
||||
m_qsettings->setValue("auto_long_image_mode", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setSvgTiny12Only(bool on)
|
||||
{
|
||||
m_qsettings->setValue("svg_tiny12_only", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setDoubleClickBehavior(DoubleClickBehavior dcb)
|
||||
{
|
||||
m_qsettings->setValue("double_click_behavior", QEnumHelper::toString(dcb));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setMouseWheelBehavior(MouseWheelBehavior mwb)
|
||||
{
|
||||
m_qsettings->setValue("mouse_wheel_behavior", QEnumHelper::toString(mwb));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setInitWindowSizeBehavior(WindowSizeBehavior wsb)
|
||||
{
|
||||
m_qsettings->setValue("init_window_size_behavior", QEnumHelper::toString(wsb));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setHiDpiScaleFactorBehavior(Qt::HighDpiScaleFactorRoundingPolicy hidpi)
|
||||
{
|
||||
m_qsettings->setValue("hidpi_scale_factor_behavior", QEnumHelper::toString(hidpi));
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::applyUserShortcuts(QWidget *widget)
|
||||
{
|
||||
m_qsettings->beginGroup("shortcuts");
|
||||
const QStringList shortcutNames = m_qsettings->allKeys();
|
||||
for (const QString & name : shortcutNames) {
|
||||
QList<QKeySequence> shortcuts = m_qsettings->value(name).value<QList<QKeySequence>>();
|
||||
setShortcutsForAction(widget, name, shortcuts, false);
|
||||
}
|
||||
m_qsettings->endGroup();
|
||||
}
|
||||
|
||||
bool Settings::setShortcutsForAction(QWidget *widget, const QString &objectName,
|
||||
QList<QKeySequence> shortcuts, bool writeConfig)
|
||||
{
|
||||
QAction * targetAction = nullptr;
|
||||
for (QAction * action : widget->actions()) {
|
||||
if (action->objectName() == objectName) {
|
||||
targetAction = action;
|
||||
} else {
|
||||
for (const QKeySequence & shortcut : std::as_const(shortcuts)) {
|
||||
if (action->shortcuts().contains(shortcut)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (targetAction) {
|
||||
targetAction->setShortcuts(shortcuts);
|
||||
}
|
||||
|
||||
if (targetAction && writeConfig) {
|
||||
m_qsettings->beginGroup("shortcuts");
|
||||
m_qsettings->setValue(objectName, QVariant::fromValue(shortcuts));
|
||||
m_qsettings->endGroup();
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
#include <windows.h>
|
||||
// QCoreApplication::applicationDirPath() parses the "applicationDirPath" from arg0, which...
|
||||
// 1. rely on a QApplication object instance
|
||||
// but we need to call QGuiApplication::setHighDpiScaleFactorRoundingPolicy() before QApplication get created
|
||||
// 2. arg0 is NOT garanteed to be the path of execution
|
||||
// see also: https://stackoverflow.com/questions/383973/is-args0-guaranteed-to-be-the-path-of-execution
|
||||
// This function is here mainly for #1.
|
||||
QString getApplicationDirPath()
|
||||
{
|
||||
WCHAR buffer[MAX_PATH];
|
||||
GetModuleFileNameW(NULL, buffer, MAX_PATH);
|
||||
QString appPath = QString::fromWCharArray(buffer);
|
||||
|
||||
return appPath.left(appPath.lastIndexOf('\\'));
|
||||
}
|
||||
#endif // defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
|
||||
Settings::Settings()
|
||||
: QObject(qApp)
|
||||
{
|
||||
QString configPath;
|
||||
|
||||
#if defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
QString portableConfigDirPath = QDir(getApplicationDirPath()).absoluteFilePath("data");
|
||||
QFileInfo portableConfigDirInfo(portableConfigDirPath);
|
||||
if (portableConfigDirInfo.exists() && portableConfigDirInfo.isDir() && portableConfigDirInfo.isWritable()) {
|
||||
// we can use it.
|
||||
configPath = portableConfigDirPath;
|
||||
}
|
||||
#endif // defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
|
||||
if (configPath.isEmpty()) {
|
||||
// Should be %LOCALAPPDATA%\<APPNAME> under Windows, ~/.config/<APPNAME> under Linux.
|
||||
configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
|
||||
}
|
||||
|
||||
m_qsettings = new QSettings(QDir(configPath).absoluteFilePath("config.ini"), QSettings::IniFormat, this);
|
||||
|
||||
qRegisterMetaType<QList<QKeySequence>>();
|
||||
}
|
||||
|
||||
|
||||
142
app/settings.h
142
app/settings.h
@@ -1,69 +1,73 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QSettings>
|
||||
|
||||
class Settings : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum DoubleClickBehavior {
|
||||
Ignore,
|
||||
Close,
|
||||
Maximize,
|
||||
FullScreen,
|
||||
};
|
||||
Q_ENUM(DoubleClickBehavior)
|
||||
|
||||
enum MouseWheelBehavior {
|
||||
Zoom,
|
||||
Switch,
|
||||
};
|
||||
Q_ENUM(MouseWheelBehavior)
|
||||
|
||||
enum WindowSizeBehavior {
|
||||
Auto,
|
||||
Maximized,
|
||||
Windowed,
|
||||
};
|
||||
Q_ENUM(WindowSizeBehavior)
|
||||
|
||||
static Settings *instance();
|
||||
|
||||
bool stayOnTop() const;
|
||||
bool useBuiltInCloseAnimation() const;
|
||||
bool useLightCheckerboard() const;
|
||||
bool loopGallery() const;
|
||||
DoubleClickBehavior doubleClickBehavior() const;
|
||||
MouseWheelBehavior mouseWheelBehavior() const;
|
||||
WindowSizeBehavior initWindowSizeBehavior() const;
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hiDpiScaleFactorBehavior() const;
|
||||
|
||||
void setStayOnTop(bool on);
|
||||
void setUseBuiltInCloseAnimation(bool on);
|
||||
void setUseLightCheckerboard(bool light);
|
||||
void setLoopGallery(bool on);
|
||||
void setDoubleClickBehavior(DoubleClickBehavior dcb);
|
||||
void setMouseWheelBehavior(MouseWheelBehavior mwb);
|
||||
void setInitWindowSizeBehavior(WindowSizeBehavior wsb);
|
||||
void setHiDpiScaleFactorBehavior(Qt::HighDpiScaleFactorRoundingPolicy hidpi);
|
||||
|
||||
void applyUserShortcuts(QWidget * widget);
|
||||
bool setShortcutsForAction(QWidget * widget, const QString & objectName,
|
||||
QList<QKeySequence> shortcuts, bool writeConfig = true);
|
||||
|
||||
private:
|
||||
Settings();
|
||||
|
||||
static Settings *m_settings_instance;
|
||||
|
||||
QSettings *m_qsettings;
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
};
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QSettings>
|
||||
|
||||
class Settings : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum DoubleClickBehavior {
|
||||
Ignore,
|
||||
Close,
|
||||
Maximize,
|
||||
FullScreen,
|
||||
};
|
||||
Q_ENUM(DoubleClickBehavior)
|
||||
|
||||
enum MouseWheelBehavior {
|
||||
Zoom,
|
||||
Switch,
|
||||
};
|
||||
Q_ENUM(MouseWheelBehavior)
|
||||
|
||||
enum WindowSizeBehavior {
|
||||
Auto,
|
||||
Maximized,
|
||||
Windowed,
|
||||
};
|
||||
Q_ENUM(WindowSizeBehavior)
|
||||
|
||||
static Settings *instance();
|
||||
|
||||
bool stayOnTop() const;
|
||||
bool useBuiltInCloseAnimation() const;
|
||||
bool useLightCheckerboard() const;
|
||||
bool loopGallery() const;
|
||||
bool autoLongImageMode() const;
|
||||
bool svgTiny12Only() const;
|
||||
DoubleClickBehavior doubleClickBehavior() const;
|
||||
MouseWheelBehavior mouseWheelBehavior() const;
|
||||
WindowSizeBehavior initWindowSizeBehavior() const;
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hiDpiScaleFactorBehavior() const;
|
||||
|
||||
void setStayOnTop(bool on);
|
||||
void setUseBuiltInCloseAnimation(bool on);
|
||||
void setUseLightCheckerboard(bool light);
|
||||
void setLoopGallery(bool on);
|
||||
void setAutoLongImageMode(bool on);
|
||||
void setSvgTiny12Only(bool on);
|
||||
void setDoubleClickBehavior(DoubleClickBehavior dcb);
|
||||
void setMouseWheelBehavior(MouseWheelBehavior mwb);
|
||||
void setInitWindowSizeBehavior(WindowSizeBehavior wsb);
|
||||
void setHiDpiScaleFactorBehavior(Qt::HighDpiScaleFactorRoundingPolicy hidpi);
|
||||
|
||||
void applyUserShortcuts(QWidget * widget);
|
||||
bool setShortcutsForAction(QWidget * widget, const QString & objectName,
|
||||
QList<QKeySequence> shortcuts, bool writeConfig = true);
|
||||
|
||||
private:
|
||||
Settings();
|
||||
|
||||
static Settings *m_settings_instance;
|
||||
|
||||
QSettings *m_qsettings;
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
};
|
||||
|
||||
@@ -1,200 +1,214 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "settingsdialog.h"
|
||||
|
||||
#include "settings.h"
|
||||
#include "shortcutedit.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QCheckBox>
|
||||
#include <QComboBox>
|
||||
#include <QFormLayout>
|
||||
#include <QKeySequenceEdit>
|
||||
#include <QScrollArea>
|
||||
#include <QSplitter>
|
||||
#include <QStringListModel>
|
||||
#include <QMessageBox>
|
||||
|
||||
SettingsDialog::SettingsDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_stayOnTop(new QCheckBox)
|
||||
, m_useBuiltInCloseAnimation(new QCheckBox)
|
||||
, m_useLightCheckerboard(new QCheckBox)
|
||||
, m_loopGallery(new QCheckBox)
|
||||
, m_doubleClickBehavior(new QComboBox)
|
||||
, m_mouseWheelBehavior(new QComboBox)
|
||||
, m_initWindowSizeBehavior(new QComboBox)
|
||||
, m_hiDpiRoundingPolicyBehavior(new QComboBox)
|
||||
{
|
||||
this->setWindowTitle(tr("Settings"));
|
||||
|
||||
QHBoxLayout * mainLayout = new QHBoxLayout(this);
|
||||
QTabWidget * settingsTabs = new QTabWidget(this);
|
||||
mainLayout->addWidget(settingsTabs);
|
||||
|
||||
QWidget * settingsFormHolder = new QWidget;
|
||||
QFormLayout * settingsForm = new QFormLayout(settingsFormHolder);
|
||||
settingsTabs->addTab(settingsFormHolder, tr("Options"));
|
||||
|
||||
QSplitter * shortcutEditorSplitter = new QSplitter;
|
||||
shortcutEditorSplitter->setOrientation(Qt::Vertical);
|
||||
shortcutEditorSplitter->setChildrenCollapsible(false);
|
||||
QScrollArea * shortcutScrollArea = new QScrollArea;
|
||||
shortcutEditorSplitter->addWidget(shortcutScrollArea);
|
||||
shortcutScrollArea->setWidgetResizable(true);
|
||||
shortcutScrollArea->setMinimumHeight(200);
|
||||
QWidget * shortcutsFormHolder = new QWidget;
|
||||
QFormLayout * shortcutsForm = new QFormLayout(shortcutsFormHolder);
|
||||
shortcutScrollArea->setWidget(shortcutsFormHolder);
|
||||
settingsTabs->addTab(shortcutEditorSplitter, tr("Shortcuts"));
|
||||
|
||||
for (const QAction * action : parent->actions()) {
|
||||
ShortcutEdit * shortcutEdit = new ShortcutEdit;
|
||||
shortcutEdit->setObjectName(QLatin1String("shortcut_") + action->objectName());
|
||||
shortcutEdit->setShortcuts(action->shortcuts());
|
||||
shortcutsForm->addRow(action->text(), shortcutEdit);
|
||||
connect(shortcutEdit, &ShortcutEdit::editButtonClicked, this, [=](){
|
||||
if (shortcutEditorSplitter->count() == 1) shortcutEditorSplitter->addWidget(new QWidget);
|
||||
ShortcutEditor * shortcutEditor = new ShortcutEditor(shortcutEdit);
|
||||
shortcutEditor->setDescription(tr("Editing shortcuts for action \"%1\":").arg(action->text()));
|
||||
QWidget * oldEditor = shortcutEditorSplitter->replaceWidget(1, shortcutEditor);
|
||||
shortcutEditorSplitter->setSizes({shortcutEditorSplitter->height(), 1});
|
||||
oldEditor->deleteLater();
|
||||
});
|
||||
connect(shortcutEdit, &ShortcutEdit::applyShortcutsRequested, this, [=](QList<QKeySequence> newShortcuts){
|
||||
bool succ = Settings::instance()->setShortcutsForAction(parent, shortcutEdit->objectName().mid(9),
|
||||
newShortcuts);
|
||||
if (!succ) {
|
||||
QMessageBox::warning(this, tr("Failed to set shortcuts"),
|
||||
tr("Please check if shortcuts are duplicated with existing shortcuts."));
|
||||
}
|
||||
shortcutEdit->setShortcuts(action->shortcuts());
|
||||
});
|
||||
}
|
||||
|
||||
static QList< QPair<Settings::DoubleClickBehavior, QString> > _dc_options {
|
||||
{ Settings::DoubleClickBehavior::Ignore, tr("Do nothing") },
|
||||
{ Settings::DoubleClickBehavior::Close, tr("Close the window") },
|
||||
{ Settings::DoubleClickBehavior::Maximize, tr("Toggle maximize") },
|
||||
{ Settings::DoubleClickBehavior::FullScreen, tr("Toggle fullscreen") }
|
||||
};
|
||||
|
||||
static QList< QPair<Settings::MouseWheelBehavior, QString> > _mw_options {
|
||||
{ Settings::MouseWheelBehavior::Zoom, tr("Zoom in and out") },
|
||||
{ Settings::MouseWheelBehavior::Switch, tr("View next or previous item") }
|
||||
};
|
||||
|
||||
static QList< QPair<Settings::WindowSizeBehavior, QString> > _iws_options {
|
||||
{ Settings::WindowSizeBehavior::Auto, tr("Auto size") },
|
||||
{ Settings::WindowSizeBehavior::Maximized, tr("Maximized") },
|
||||
{ Settings::WindowSizeBehavior::Windowed, tr("Windowed") }
|
||||
};
|
||||
|
||||
static QList< QPair<Qt::HighDpiScaleFactorRoundingPolicy, QString> > _hidpi_options {
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Round, tr("Round (Integer scaling)", "This option means round up for .5 and above") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Ceil, tr("Ceil (Integer scaling)", "This option means always round up") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Floor, tr("Floor (Integer scaling)", "This option means always round down") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::PassThrough, tr("Follow system (Fractional scaling)", "This option means don't round") }
|
||||
};
|
||||
|
||||
QStringList dcbDropDown;
|
||||
for (const QPair<Settings::DoubleClickBehavior, QString> & dcOption : _dc_options) {
|
||||
dcbDropDown.append(dcOption.second);
|
||||
}
|
||||
|
||||
QStringList mwbDropDown;
|
||||
for (const QPair<Settings::MouseWheelBehavior, QString> & mwOption : _mw_options) {
|
||||
mwbDropDown.append(mwOption.second);
|
||||
}
|
||||
|
||||
QStringList iwsbDropDown;
|
||||
for (const QPair<Settings::WindowSizeBehavior, QString> & iwsOption : _iws_options) {
|
||||
iwsbDropDown.append(iwsOption.second);
|
||||
}
|
||||
|
||||
QStringList hidpiDropDown;
|
||||
for (const QPair<Qt::HighDpiScaleFactorRoundingPolicy, QString> & hidpiOption : _hidpi_options) {
|
||||
hidpiDropDown.append(hidpiOption.second);
|
||||
}
|
||||
|
||||
settingsForm->addRow(tr("Stay on top when start-up"), m_stayOnTop);
|
||||
settingsForm->addRow(tr("Use built-in close window animation"), m_useBuiltInCloseAnimation);
|
||||
settingsForm->addRow(tr("Use light-color checkerboard"), m_useLightCheckerboard);
|
||||
settingsForm->addRow(tr("Loop the loaded gallery"), m_loopGallery);
|
||||
settingsForm->addRow(tr("Double-click behavior"), m_doubleClickBehavior);
|
||||
settingsForm->addRow(tr("Mouse wheel behavior"), m_mouseWheelBehavior);
|
||||
settingsForm->addRow(tr("Default window size"), m_initWindowSizeBehavior);
|
||||
settingsForm->addRow(tr("HiDPI scale factor rounding policy"), m_hiDpiRoundingPolicyBehavior);
|
||||
|
||||
m_stayOnTop->setChecked(Settings::instance()->stayOnTop());
|
||||
m_useBuiltInCloseAnimation->setChecked(Settings::instance()->useBuiltInCloseAnimation());
|
||||
m_useLightCheckerboard->setChecked(Settings::instance()->useLightCheckerboard());
|
||||
m_loopGallery->setChecked(Settings::instance()->loopGallery());
|
||||
m_doubleClickBehavior->setModel(new QStringListModel(dcbDropDown));
|
||||
Settings::DoubleClickBehavior dcb = Settings::instance()->doubleClickBehavior();
|
||||
m_doubleClickBehavior->setCurrentIndex(static_cast<int>(dcb));
|
||||
m_mouseWheelBehavior->setModel(new QStringListModel(mwbDropDown));
|
||||
Settings::MouseWheelBehavior mwb = Settings::instance()->mouseWheelBehavior();
|
||||
m_mouseWheelBehavior->setCurrentIndex(static_cast<int>(mwb));
|
||||
m_initWindowSizeBehavior->setModel(new QStringListModel(iwsbDropDown));
|
||||
Settings::WindowSizeBehavior iwsb = Settings::instance()->initWindowSizeBehavior();
|
||||
m_initWindowSizeBehavior->setCurrentIndex(static_cast<int>(iwsb));
|
||||
m_hiDpiRoundingPolicyBehavior->setModel(new QStringListModel(hidpiDropDown));
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hidpi = Settings::instance()->hiDpiScaleFactorBehavior();
|
||||
for (int i = 0; i < _hidpi_options.count(); i++) {
|
||||
if (_hidpi_options.at(i).first == hidpi) {
|
||||
m_hiDpiRoundingPolicyBehavior->setCurrentIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::checkStateChanged
|
||||
# define QT_CHECKSTATE Qt::CheckState
|
||||
#else
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::stateChanged
|
||||
# define QT_CHECKSTATE int
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
|
||||
connect(m_stayOnTop, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setStayOnTop(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useBuiltInCloseAnimation, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseBuiltInCloseAnimation(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseLightCheckerboard(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_loopGallery, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setLoopGallery(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_doubleClickBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setDoubleClickBehavior(_dc_options.at(index).first);
|
||||
});
|
||||
|
||||
connect(m_mouseWheelBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setMouseWheelBehavior(_mw_options.at(index).first);
|
||||
});
|
||||
|
||||
connect(m_initWindowSizeBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setInitWindowSizeBehavior(_iws_options.at(index).first);
|
||||
});
|
||||
|
||||
connect(m_hiDpiRoundingPolicyBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setHiDpiScaleFactorBehavior(_hidpi_options.at(index).first);
|
||||
});
|
||||
|
||||
adjustSize();
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
SettingsDialog::~SettingsDialog()
|
||||
{
|
||||
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "settingsdialog.h"
|
||||
|
||||
#include "settings.h"
|
||||
#include "shortcutedit.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QCheckBox>
|
||||
#include <QComboBox>
|
||||
#include <QFormLayout>
|
||||
#include <QKeySequenceEdit>
|
||||
#include <QScrollArea>
|
||||
#include <QSplitter>
|
||||
#include <QStringListModel>
|
||||
#include <QMessageBox>
|
||||
|
||||
SettingsDialog::SettingsDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_stayOnTop(new QCheckBox)
|
||||
, m_useBuiltInCloseAnimation(new QCheckBox)
|
||||
, m_useLightCheckerboard(new QCheckBox)
|
||||
, m_loopGallery(new QCheckBox)
|
||||
, m_autoLongImageMode(new QCheckBox)
|
||||
, m_svgTiny12Only(new QCheckBox)
|
||||
, m_doubleClickBehavior(new QComboBox)
|
||||
, m_mouseWheelBehavior(new QComboBox)
|
||||
, m_initWindowSizeBehavior(new QComboBox)
|
||||
, m_hiDpiRoundingPolicyBehavior(new QComboBox)
|
||||
{
|
||||
this->setWindowTitle(tr("Settings"));
|
||||
|
||||
QHBoxLayout * mainLayout = new QHBoxLayout(this);
|
||||
QTabWidget * settingsTabs = new QTabWidget(this);
|
||||
mainLayout->addWidget(settingsTabs);
|
||||
|
||||
QWidget * settingsFormHolder = new QWidget;
|
||||
QFormLayout * settingsForm = new QFormLayout(settingsFormHolder);
|
||||
settingsTabs->addTab(settingsFormHolder, tr("Options"));
|
||||
|
||||
QSplitter * shortcutEditorSplitter = new QSplitter;
|
||||
shortcutEditorSplitter->setOrientation(Qt::Vertical);
|
||||
shortcutEditorSplitter->setChildrenCollapsible(false);
|
||||
QScrollArea * shortcutScrollArea = new QScrollArea;
|
||||
shortcutEditorSplitter->addWidget(shortcutScrollArea);
|
||||
shortcutScrollArea->setWidgetResizable(true);
|
||||
shortcutScrollArea->setMinimumHeight(200);
|
||||
QWidget * shortcutsFormHolder = new QWidget;
|
||||
QFormLayout * shortcutsForm = new QFormLayout(shortcutsFormHolder);
|
||||
shortcutScrollArea->setWidget(shortcutsFormHolder);
|
||||
settingsTabs->addTab(shortcutEditorSplitter, tr("Shortcuts"));
|
||||
|
||||
for (const QAction * action : parent->actions()) {
|
||||
ShortcutEdit * shortcutEdit = new ShortcutEdit;
|
||||
shortcutEdit->setObjectName(QLatin1String("shortcut_") + action->objectName());
|
||||
shortcutEdit->setShortcuts(action->shortcuts());
|
||||
shortcutsForm->addRow(action->text(), shortcutEdit);
|
||||
connect(shortcutEdit, &ShortcutEdit::editButtonClicked, this, [=](){
|
||||
if (shortcutEditorSplitter->count() == 1) shortcutEditorSplitter->addWidget(new QWidget);
|
||||
ShortcutEditor * shortcutEditor = new ShortcutEditor(shortcutEdit);
|
||||
shortcutEditor->setDescription(tr("Editing shortcuts for action \"%1\":").arg(action->text()));
|
||||
QWidget * oldEditor = shortcutEditorSplitter->replaceWidget(1, shortcutEditor);
|
||||
shortcutEditorSplitter->setSizes({shortcutEditorSplitter->height(), 1});
|
||||
oldEditor->deleteLater();
|
||||
});
|
||||
connect(shortcutEdit, &ShortcutEdit::applyShortcutsRequested, this, [=](QList<QKeySequence> newShortcuts){
|
||||
bool succ = Settings::instance()->setShortcutsForAction(parent, shortcutEdit->objectName().mid(9),
|
||||
newShortcuts);
|
||||
if (!succ) {
|
||||
QMessageBox::warning(this, tr("Failed to set shortcuts"),
|
||||
tr("Please check if shortcuts are duplicated with existing shortcuts."));
|
||||
}
|
||||
shortcutEdit->setShortcuts(action->shortcuts());
|
||||
});
|
||||
}
|
||||
|
||||
static QList< QPair<Settings::DoubleClickBehavior, QString> > _dc_options {
|
||||
{ Settings::DoubleClickBehavior::Ignore, tr("Do nothing") },
|
||||
{ Settings::DoubleClickBehavior::Close, tr("Close the window") },
|
||||
{ Settings::DoubleClickBehavior::Maximize, tr("Toggle maximize") },
|
||||
{ Settings::DoubleClickBehavior::FullScreen, tr("Toggle fullscreen") }
|
||||
};
|
||||
|
||||
static QList< QPair<Settings::MouseWheelBehavior, QString> > _mw_options {
|
||||
{ Settings::MouseWheelBehavior::Zoom, tr("Zoom in and out") },
|
||||
{ Settings::MouseWheelBehavior::Switch, tr("View next or previous item") }
|
||||
};
|
||||
|
||||
static QList< QPair<Settings::WindowSizeBehavior, QString> > _iws_options {
|
||||
{ Settings::WindowSizeBehavior::Auto, tr("Auto size") },
|
||||
{ Settings::WindowSizeBehavior::Maximized, tr("Maximized") },
|
||||
{ Settings::WindowSizeBehavior::Windowed, tr("Windowed") }
|
||||
};
|
||||
|
||||
static QList< QPair<Qt::HighDpiScaleFactorRoundingPolicy, QString> > _hidpi_options {
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Round, tr("Round (Integer scaling)", "This option means round up for .5 and above") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Ceil, tr("Ceil (Integer scaling)", "This option means always round up") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Floor, tr("Floor (Integer scaling)", "This option means always round down") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::PassThrough, tr("Follow system (Fractional scaling)", "This option means don't round") }
|
||||
};
|
||||
|
||||
QStringList dcbDropDown;
|
||||
for (const QPair<Settings::DoubleClickBehavior, QString> & dcOption : _dc_options) {
|
||||
dcbDropDown.append(dcOption.second);
|
||||
}
|
||||
|
||||
QStringList mwbDropDown;
|
||||
for (const QPair<Settings::MouseWheelBehavior, QString> & mwOption : _mw_options) {
|
||||
mwbDropDown.append(mwOption.second);
|
||||
}
|
||||
|
||||
QStringList iwsbDropDown;
|
||||
for (const QPair<Settings::WindowSizeBehavior, QString> & iwsOption : _iws_options) {
|
||||
iwsbDropDown.append(iwsOption.second);
|
||||
}
|
||||
|
||||
QStringList hidpiDropDown;
|
||||
for (const QPair<Qt::HighDpiScaleFactorRoundingPolicy, QString> & hidpiOption : _hidpi_options) {
|
||||
hidpiDropDown.append(hidpiOption.second);
|
||||
}
|
||||
|
||||
settingsForm->addRow(tr("Stay on top when start-up"), m_stayOnTop);
|
||||
settingsForm->addRow(tr("Use built-in close window animation"), m_useBuiltInCloseAnimation);
|
||||
settingsForm->addRow(tr("Use light-color checkerboard"), m_useLightCheckerboard);
|
||||
settingsForm->addRow(tr("Loop the loaded gallery"), m_loopGallery);
|
||||
settingsForm->addRow(tr("Auto long image mode"), m_autoLongImageMode);
|
||||
settingsForm->addRow(tr("Limit SVG support to SVG Tiny 1.2"), m_svgTiny12Only);
|
||||
settingsForm->addRow(tr("Double-click behavior"), m_doubleClickBehavior);
|
||||
settingsForm->addRow(tr("Mouse wheel behavior"), m_mouseWheelBehavior);
|
||||
settingsForm->addRow(tr("Default window size"), m_initWindowSizeBehavior);
|
||||
settingsForm->addRow(tr("HiDPI scale factor rounding policy"), m_hiDpiRoundingPolicyBehavior);
|
||||
|
||||
m_stayOnTop->setChecked(Settings::instance()->stayOnTop());
|
||||
m_useBuiltInCloseAnimation->setChecked(Settings::instance()->useBuiltInCloseAnimation());
|
||||
m_useLightCheckerboard->setChecked(Settings::instance()->useLightCheckerboard());
|
||||
m_loopGallery->setChecked(Settings::instance()->loopGallery());
|
||||
m_autoLongImageMode->setChecked(Settings::instance()->autoLongImageMode());
|
||||
m_svgTiny12Only->setChecked(Settings::instance()->svgTiny12Only());
|
||||
m_doubleClickBehavior->setModel(new QStringListModel(dcbDropDown));
|
||||
Settings::DoubleClickBehavior dcb = Settings::instance()->doubleClickBehavior();
|
||||
m_doubleClickBehavior->setCurrentIndex(static_cast<int>(dcb));
|
||||
m_mouseWheelBehavior->setModel(new QStringListModel(mwbDropDown));
|
||||
Settings::MouseWheelBehavior mwb = Settings::instance()->mouseWheelBehavior();
|
||||
m_mouseWheelBehavior->setCurrentIndex(static_cast<int>(mwb));
|
||||
m_initWindowSizeBehavior->setModel(new QStringListModel(iwsbDropDown));
|
||||
Settings::WindowSizeBehavior iwsb = Settings::instance()->initWindowSizeBehavior();
|
||||
m_initWindowSizeBehavior->setCurrentIndex(static_cast<int>(iwsb));
|
||||
m_hiDpiRoundingPolicyBehavior->setModel(new QStringListModel(hidpiDropDown));
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hidpi = Settings::instance()->hiDpiScaleFactorBehavior();
|
||||
for (int i = 0; i < _hidpi_options.count(); i++) {
|
||||
if (_hidpi_options.at(i).first == hidpi) {
|
||||
m_hiDpiRoundingPolicyBehavior->setCurrentIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::checkStateChanged
|
||||
# define QT_CHECKSTATE Qt::CheckState
|
||||
#else
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::stateChanged
|
||||
# define QT_CHECKSTATE int
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
|
||||
connect(m_stayOnTop, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setStayOnTop(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useBuiltInCloseAnimation, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseBuiltInCloseAnimation(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseLightCheckerboard(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_loopGallery, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setLoopGallery(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_autoLongImageMode, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setAutoLongImageMode(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_svgTiny12Only, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setSvgTiny12Only(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_doubleClickBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setDoubleClickBehavior(_dc_options.at(index).first);
|
||||
});
|
||||
|
||||
connect(m_mouseWheelBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setMouseWheelBehavior(_mw_options.at(index).first);
|
||||
});
|
||||
|
||||
connect(m_initWindowSizeBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setInitWindowSizeBehavior(_iws_options.at(index).first);
|
||||
});
|
||||
|
||||
connect(m_hiDpiRoundingPolicyBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setHiDpiScaleFactorBehavior(_hidpi_options.at(index).first);
|
||||
});
|
||||
|
||||
adjustSize();
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
SettingsDialog::~SettingsDialog()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -1,35 +1,37 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef SETTINGSDIALOG_H
|
||||
#define SETTINGSDIALOG_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QDialog>
|
||||
|
||||
class QCheckBox;
|
||||
class QComboBox;
|
||||
class SettingsDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SettingsDialog(QWidget *parent = nullptr);
|
||||
~SettingsDialog();
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
QCheckBox * m_stayOnTop = nullptr;
|
||||
QCheckBox * m_useBuiltInCloseAnimation = nullptr;
|
||||
QCheckBox * m_useLightCheckerboard = nullptr;
|
||||
QCheckBox * m_loopGallery = nullptr;
|
||||
QComboBox * m_doubleClickBehavior = nullptr;
|
||||
QComboBox * m_mouseWheelBehavior = nullptr;
|
||||
QComboBox * m_initWindowSizeBehavior = nullptr;
|
||||
QComboBox * m_hiDpiRoundingPolicyBehavior = nullptr;
|
||||
};
|
||||
|
||||
#endif // SETTINGSDIALOG_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef SETTINGSDIALOG_H
|
||||
#define SETTINGSDIALOG_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QDialog>
|
||||
|
||||
class QCheckBox;
|
||||
class QComboBox;
|
||||
class SettingsDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SettingsDialog(QWidget *parent = nullptr);
|
||||
~SettingsDialog();
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
QCheckBox * m_stayOnTop = nullptr;
|
||||
QCheckBox * m_useBuiltInCloseAnimation = nullptr;
|
||||
QCheckBox * m_useLightCheckerboard = nullptr;
|
||||
QCheckBox * m_loopGallery = nullptr;
|
||||
QCheckBox * m_autoLongImageMode = nullptr;
|
||||
QCheckBox * m_svgTiny12Only = nullptr;
|
||||
QComboBox * m_doubleClickBehavior = nullptr;
|
||||
QComboBox * m_mouseWheelBehavior = nullptr;
|
||||
QComboBox * m_initWindowSizeBehavior = nullptr;
|
||||
QComboBox * m_hiDpiRoundingPolicyBehavior = nullptr;
|
||||
};
|
||||
|
||||
#endif // SETTINGSDIALOG_H
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "toolbutton.h"
|
||||
|
||||
#include "actionmanager.h"
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
ToolButton::ToolButton(bool hoverColor, QWidget *parent)
|
||||
: QPushButton(parent)
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
setFlat(true);
|
||||
QString qss = "QPushButton {"
|
||||
"background: transparent;"
|
||||
"}";
|
||||
if (hoverColor) {
|
||||
qss += "QPushButton:hover {"
|
||||
"background: red;"
|
||||
"}";
|
||||
}
|
||||
setStyleSheet(qss);
|
||||
}
|
||||
|
||||
void ToolButton::setIconResourcePath(const QString &iconp)
|
||||
{
|
||||
this->setIcon(ActionManager::loadHidpiIcon(iconp, this->iconSize()));
|
||||
}
|
||||
|
||||
void ToolButton::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "toolbutton.h"
|
||||
|
||||
#include "actionmanager.h"
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
ToolButton::ToolButton(bool hoverColor, QWidget *parent)
|
||||
: QPushButton(parent)
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
setFlat(true);
|
||||
QString qss = "QPushButton {"
|
||||
"background: transparent;"
|
||||
"}";
|
||||
if (hoverColor) {
|
||||
qss += "QPushButton:hover {"
|
||||
"background: red;"
|
||||
"}";
|
||||
}
|
||||
setStyleSheet(qss);
|
||||
}
|
||||
|
||||
void ToolButton::setIconResourcePath(const QString &iconp)
|
||||
{
|
||||
this->setIcon(ActionManager::loadHidpiIcon(iconp, this->iconSize()));
|
||||
}
|
||||
|
||||
void ToolButton::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef TOOLBUTTON_H
|
||||
#define TOOLBUTTON_H
|
||||
|
||||
#include <QPushButton>
|
||||
|
||||
class OpacityHelper;
|
||||
class ToolButton : public QPushButton
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ToolButton(bool hoverColor = false, QWidget * parent = nullptr);
|
||||
void setIconResourcePath(const QString &iconp);
|
||||
|
||||
public slots:
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
private:
|
||||
OpacityHelper * m_opacityHelper;
|
||||
};
|
||||
|
||||
#endif // TOOLBUTTON_H
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef TOOLBUTTON_H
|
||||
#define TOOLBUTTON_H
|
||||
|
||||
#include <QPushButton>
|
||||
|
||||
class OpacityHelper;
|
||||
class ToolButton : public QPushButton
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ToolButton(bool hoverColor = false, QWidget * parent = nullptr);
|
||||
void setIconResourcePath(const QString &iconp);
|
||||
|
||||
public slots:
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
private:
|
||||
OpacityHelper * m_opacityHelper;
|
||||
};
|
||||
|
||||
#endif // TOOLBUTTON_H
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Arrossegueu una imatge aquí</translation>
|
||||
</message>
|
||||
@@ -187,13 +187,14 @@
|
||||
<translation type="vanished">La llista d'ubicacions de fitxer és buida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>El fitxer no és una imatge vàlida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Les dades de la imatge no són vàlides o no són compatibles</translation>
|
||||
</message>
|
||||
@@ -209,189 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>La llista d'ubicacions és buida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Les dades de la imatge no són vàlides</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>El tipus MIME no és compatible: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copia el &mapa de píxels</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copia el camí del &fitxer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propietats</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Mantén a sobre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Mode protegit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Amplia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Redueix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Inverteix &horitzontalment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Enganxa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Commuta el tauler d'escacs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Obre...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Mida real</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Commuta la maximització</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Commuta la maximització</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Imatge anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Imatge següent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configura...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Ajuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Mostra al navegador de fitxers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Mostra a la carpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Surt</translation>
|
||||
</message>
|
||||
@@ -722,141 +761,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Paràmetres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>No facis res</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Tanca la finestra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Commuta la maximització</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Amplia i redueix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Mostra l'element següent o l'anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Mida automàtica</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maximitza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Mantingues a sobre a l'inici</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Comportament del doble clic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Comportament de la roda del ratolí</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Mida de la finestra per defecte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -864,7 +913,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -872,7 +921,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Ziehen Sie das Bild hierher</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">Die Datei-URL-Liste ist leer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Datei ist kein gültiges Bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Bilddaten sind ungültig oder werden derzeit nicht unterstützt</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Die Datei-URL-Liste ist leer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Bilddaten sind ungültig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Nicht unterstützte Mimedaten: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>P&ixmap kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>&Dateipfad kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Eigenschaften</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Oben bleiben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Geschützter Modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Hineinzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Herauszoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>&Horizontal spiegeln</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>%Einfügen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Schachbrettmuster umschalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Öffnen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Tatsächliche Größe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximieren umschalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Nach rechts drehen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Vorheriges Bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Nächstes Bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfigurieren …</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Hilfe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Im Dateiexplorer zeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Im Verzeichnis zeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Beenden</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Nichts tun</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Fenster schließen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximieren umschalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Hinein- und Hinauszoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Zeige nächstes oder vorheriges Element</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Automatische Größe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maximiert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Beim Start oben bleiben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Doppelklickverhalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Mausradverhalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Standard-Fenstergröße</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -183,13 +183,14 @@
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -197,189 +198,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -710,141 +749,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Default window size</source>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -852,7 +901,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -860,7 +909,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Arrastre una imagen aquí</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">La lista de ubicaciones está vacía</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>El archivo no es una imagen válida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Los datos de la imagen no son válidos o no son compatibles</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>La lista de ubicaciones está vacía</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copiar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Los datos de la imagen no son válidos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>El tipo MIME no es compatible: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Imagen del portapapeles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>¿Estás seguro de que quieres mover "%1" a la papelera de reciclaje?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Mover a la papelera ha fallado, puede deberse a un problema con los permisos de los archivos, una limitación del sistema de archivos o una limitación de la plataforma.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copiar &mapa de píxeles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copiar &ruta de archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propiedades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Mantener encima</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Modo protegido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Conservar la transformación</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Ampliar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Reducir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Pausar/Reanudar animación</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Ir al siguiente fotograma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Voltear &horizontalmente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Para visualizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Ajustar al ancho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Pegar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Activar/desactivar el tablero de ajedrez</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Abrir...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Tamaño real</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximizar/desmaximizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Girar a la derecha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Girar a la izquierda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Imagen anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Imagen siguiente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Mover a la papelera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configurar...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Ayuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Mostrar en el Explorador de archivos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Mostrar en la carpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Salir</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Preferencias</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Opciones</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Atajos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Editando atajos para la acción "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>No se pudieron establecer accesos directos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Por favor, verifique si los accesos directos están duplicados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>No hacer nada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Cerrar la ventana</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximizar/desmaximizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Ampliar y reducir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Mostrar el elemento siguiente/anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Tamaño automático</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maximizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Redondeo (escala de enteros)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Ceil (redondear enteros hacia arriba)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Floor (redondear enteros hacia abajo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Redondeo (redondear los enteros)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Mantener encima al inicio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Utilice un tablero de ajedrez de color claro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Comportamiento del doble clic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Comportamiento de la rueda del ratón</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Tamaño de la ventana por defecto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Política de redondeo del factor de escala HiDPI</translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Sin atajos</translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Atajos #%1</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Faites glisser l'image ici</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">La liste des URL du fichier est vide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Le fichier n'est pas une image valide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Les données d'image ne sont pas valides ou ne sont actuellement pas prises en charge</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>La liste des URL de fichiers est vide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Les données d'image ne sont pas valides</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Mimedata non pris en charge : %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copier P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copier le &chemin du fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propriétés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Rester en-haut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Mode protégé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Zoom avant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Zoom arrière</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Retourner &horizontalement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>Co&ller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Dés/activer le damier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Ouvrir...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Taille actuelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Dés/activer l'agrandissement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Pivoter vers la droite</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Image précédente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Image suivant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configurer…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Afficher dans le navigateur de fichiers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Afficher dans le dossier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Quitter</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Paramètres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Ne rien faire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Fermer la fenêtre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Activer/désactiver l'agrandissement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Zoom avant et arrière</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Voir l'élément suivant ou précédent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Taille automatique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Agrandi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Rester en-haut lors du démarrage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Comportement du double-clic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Comportement de la molette de la souris</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Taille de la fenêtre par défaut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Tarik gambar ke sini</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">Daftar url file kosong</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>File bukan gambar yang valid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Data gambar tidak valid atau belum didukung</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Daftar url file kosong</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Salin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Data gambar tidak valid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Tidak didukung mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Salin P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Salin &Path Berkas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Properti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Tetap di atas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Mode Terlindungi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Simpan transformasi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Perbesar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Perkecil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Putar Secara &Horizontal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Tempel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Ukuran asli</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Putar ke kanan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfigurasi...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Dukungan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Keluar</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Pengaturan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Jangan lakukan apapun</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Tutup jendela</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Perbesar dan perkecil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Lihat item berikutnya atau sebelumnya</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Default window size</source>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Trascina qui l'immagine</translation>
|
||||
</message>
|
||||
@@ -187,13 +187,14 @@
|
||||
<translation type="vanished">L'elenco degli URL dei file è vuoto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Il file non è un'immagine valida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>I dati dell'immagine non sono validi o non sono attualmente supportati</translation>
|
||||
</message>
|
||||
@@ -209,189 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>L'elenco degli URL dei file è vuoto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>I dati dell'immagine non sono validi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Dati mime non supportati: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Immagine dagli appunti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Sei sicuro di voler spostare "%1" nel cestino?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Impossibile spostare il file nel cestino</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Lo spostamento nel cestino non è riuscito, potrebbe essere causato da un problema di autorizzazione del file, da una limitazione del file system o da una limitazione della piattaforma.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copia P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copia &Percorso file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Proprietà</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Rimani in cima</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Modalità protetta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Mantieni trasformazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Zoom avanti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Zoom indietro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Pausa/Riprendi animazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Animazione Vai al fotogramma successivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Capovolgi &Orizzontalmente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Adatto alla visualizzazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Adatta alla larghezza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Adatta immagine lunga</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Incolla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Attiva/disattiva scacchiera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Apri...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Dimensione reale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Attiva massimizzazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Ruota a destra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Ruota a sinistra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Immagine precedente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Immagine successiva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Sposta nel cestino</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configura...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Aiuto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Mostra in Esplora file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Mostra nella directory</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Esci</translation>
|
||||
</message>
|
||||
@@ -722,141 +761,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Impostazioni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Opzioni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Scorciatoie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Modifica delle scorciatoie per l'azione "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Impossibile impostare le scorciatoie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Controlla se i collegamenti sono duplicati con collegamenti esistenti.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Non fare nulla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Chiudi la finestra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Attiva massimizzazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Attiva schermo intero</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Zoom avanti e indietro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Visualizza l'elemento successivo o precedente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Dimensione automatica</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Massimizzato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Finestrato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Round (ridimensionamento intero)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Ceil (ridimensionamento intero)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Floor (ridimensionamento intero)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Segui il sistema (scala frazionaria)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Rimani in cima quando si avvia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Utilizza l'animazione di chiusura della finestra integrata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Utilizzare scacchiera di colore chiaro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>Esegui il loop della galleria caricata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Modalità immagine lunga automatica</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Comportamento del doppio clic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Comportamento della rotellina del mouse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Dimensioni predefinite della finestra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Politica di arrotondamento del fattore di scala HiDPI</translation>
|
||||
</message>
|
||||
@@ -864,7 +913,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Nessuna scorciatoia</translation>
|
||||
</message>
|
||||
@@ -872,7 +921,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Scorciatoia #%1</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>ここに画像をドラッグしてください</translation>
|
||||
</message>
|
||||
@@ -187,13 +187,14 @@
|
||||
<translation type="vanished">ファイルURLリストがエンプティーです</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>ファイルが有効な画像ではありません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>無効またはサポートされていない画像データ</translation>
|
||||
</message>
|
||||
@@ -209,189 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>ファイルurlリストがエンプティーです</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>コピー(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>画像のデータが無効です</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>無効なmimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>クリップボードからの画像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>「%1」をゴミ箱に移動しますか?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>ゴミ箱への移動に失敗しました。ファイルのアクセス許可や、ファイルシステムの制限、プラットフォームの制限などを確認してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>画像をコピー(&I)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>ファイルパスをコピー(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>プロパティ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>最前面に表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>プロテクトモード</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>表示状態を維持する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>拡大</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>縮小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>一時停止 / 再開のアニメーション</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>次のフレームへ移動するアニメーション</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>画像を左右反転する(&H)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>表示に合わせる</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>横幅に合わせる</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>貼り付け(&P)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>背景を格子模様に切り替え</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>開く(&O)…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>実際のサイズ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>最大化を切り替える</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>右に回転</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>左に回転</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>前の画像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>次の画像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>ゴミ箱へ移動する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>設定...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>ヘルプ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>エクスプローラーで表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>ディレクトリに表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>終了</translation>
|
||||
</message>
|
||||
@@ -722,141 +761,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>オプション</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>ショートカット</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>「%1」のショートカットを編集します:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>ショートカットの設定に失敗しました</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>既存のショートカットと重複していないことを確認してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>何もしない</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>ウィンドウを終了する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>最大サイズに切り替える</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>フルスクリーン表示に切り替える</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>拡大・縮小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>次の項目または前の項目を表示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>オートサイズ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>最大化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>四捨五入 (整数スケーリング)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>切り上げ (整数スケーリング)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>切り捨て (整数スケーリング)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>システム設定に従う (小数スケーリング)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>起動時に最前面に表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>明るい色の格子模様を使用する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>ダブルクリックの動作</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>マウスホイールの動作</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>既定のウィンドウサイズ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>高DPIスケーリングの四捨五入方法</translation>
|
||||
</message>
|
||||
@@ -864,7 +913,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>ショートカットなし</translation>
|
||||
</message>
|
||||
@@ -872,7 +921,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>ショートカット #%1</translation>
|
||||
</message>
|
||||
|
||||
@@ -36,12 +36,12 @@
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="45"/>
|
||||
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
|
||||
<translation>실수로 창을 닫지 마십시오. (예: 창을 두 번 클릭하여)</translation>
|
||||
<translation>실수로 창을 닫지 않도록 합니다. (예: 창을 더블 클릭하는 경우)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="48"/>
|
||||
<source>Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.</source>
|
||||
<translation>이미지 간 전환 시 이미지 보기에 적용되었던 줌/회전/플립 상태를 재설정하지 마세요.</translation>
|
||||
<translation>이미지 간 전환 시 이미지 보기에 적용된 확대/축소, 회전, 뒤집기 상태를 재설정하지 않습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="55"/>
|
||||
@@ -92,7 +92,7 @@
|
||||
<location filename="../aboutdialog.cpp" line="131"/>
|
||||
<source>%1 is built on the following free software libraries:</source>
|
||||
<comment>Free as in freedom</comment>
|
||||
<translation>%1은 다음과 같은 무료 소프트웨어 라이브러리를 기반으로 합니다:</translation>
|
||||
<translation>%1는 다음과 같은 무료 소프트웨어 라이브러리를 기반으로 합니다:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="155"/>
|
||||
@@ -118,7 +118,7 @@
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="95"/>
|
||||
<source>%1 is released under the MIT License.</source>
|
||||
<translation>사용자의 권한 %1은 MIT 라이선스에 따라 릴리스됩니다.</translation>
|
||||
<translation>%1는 MIT 라이선스에 따라 배포됩니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="96"/>
|
||||
@@ -128,7 +128,7 @@
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="97"/>
|
||||
<source>You are free to use %1, for any purpose</source>
|
||||
<translation>%1을(를) 어떤 용도로도 자유롭게 사용할 수 있습니다</translation>
|
||||
<translation>%1를 어떤 용도로도 자유롭게 사용할 수 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="98"/>
|
||||
@@ -143,7 +143,7 @@
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="100"/>
|
||||
<source>You can distribute changed versions of %1</source>
|
||||
<translation>변경된 버전의 %1을 배포할 수 있습니다</translation>
|
||||
<translation>변경된 버전의 %1를 배포할 수 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="102"/>
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>이미지를 여기로 끌기</translation>
|
||||
</message>
|
||||
@@ -187,13 +187,14 @@
|
||||
<translation type="vanished">파일 URL 목록이 비어 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>파일이 올바른 이미지가 아닙니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>이미지 데이터가 잘못되었거나 현재 지원되지 않습니다</translation>
|
||||
</message>
|
||||
@@ -209,189 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>파일 URL 목록이 비어 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>복사(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>이미지 데이터가 잘못되었습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>지원되지 않는 mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>클립보드에서 이미지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>"%1"을 휴지통으로 옮기시겠습니까?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>파일을 휴지통으로 이동하지 못했습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>휴지통으로 이동하지 못했습니다. 파일 권한 문제, 파일 시스템 제한 또는 플랫폼 제한으로 인해 발생할 수 있습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Pixmap 복사(&I)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>파일 경로 복사(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>속성</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>맨 위에 유지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>보호 모드</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>변형 유지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>확대</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>축소</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>애니메이션 일시 중지/재개</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>애니메이션 다음 프레임으로 이동</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>수평으로 뒤집기(&H)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>보기에 맞춤</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>너비에 맞춤</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>긴 이미지 맞추기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>붙여넣기(&P)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>바둑판 전환</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>열기(&O)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>실제 크기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>최대화 전환</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>오른쪽으로 회전</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>왼쪽으로 회전</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>이전 이미지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>다음 이미지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>휴지통으로 이동</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>구성...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>도움말</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>파일 탐색기에 표시</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>디렉터리에 표시</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>종료</translation>
|
||||
</message>
|
||||
@@ -722,141 +761,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>설정</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>옵션</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>단축키</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>작업 "%1"의 단축키 편집:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>단축키 설정 실패</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>단축키가 기존 단축키와 중복되는지 확인해 주세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>아무것도 하지 않음</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>창 닫기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>최대화 전환</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>전체 화면 전환</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>확대 및 축소</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>다음 또는 이전 항목 보기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>자동 크기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>최대화</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>라운드 (정수 스케일링)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>셰일 (정수 스케일링)</translation>
|
||||
<translation>창 모드</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>바닥 (정수 스케일링)</translation>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>반올림 (정수 스케일링)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>팔로우 시스템 (부분 스케일링)</translation>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>올림 (정수 스케일링)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>내림 (정수 스케일링)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>시스템 따르기 (소수점 스케일링)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>시작 시 맨 위에 유지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>내장된 창 닫기 애니메이션 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>밝은 색상의 바둑판 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>더블클릭 동작</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>로드된 갤러리 반복</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>자동 긴 이미지 모드</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>SVG 지원을 SVG Tiny 1.2로 제한</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>더블 클릭 동작</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>마우스 휠 동작</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>기본 창 크기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>HiDPI 배율 반올림 정책</translation>
|
||||
</message>
|
||||
@@ -864,17 +913,17 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>단축키 없음</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>단축키 #%1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Dra bilde hit</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">Listen over filnettadresser er tom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Filen er ikke et gyldig bilde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Ugyldig bildedata, eller for tiden ustøttet</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Listen over filnettadresser er ugyldig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Ugyldig bildedata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Ustøttet MIME-data: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Er du sikker på at du vil flytte "%1" til papirkurven?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Flytt til papirkurven mislyktes, det kan skyldes filtillatelsesproblem, filsystembegrensning eller plattformbegrensning.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished">Kopier p&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Kopier &filbane</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Egenskaper</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Behold øverst</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Beskyttet modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Behold transformasjon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Førstørr</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Forminsk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Speilvend &horisontalt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Lim inn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished">Skru av/på rutemønster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Åpne …</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Faktisk størrelse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maksimering av/på</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Roter til høyre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Forrige bilde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Neste bilde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Flytt til papirkurven</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Sett opp …</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Hjelp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Vis i filutforsker</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished">Vis i mappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Avslutt</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Innstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Ikke gjør noe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Lukk vinduet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maksimering av/på</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Zoom inn og ut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Vis neste eller forrige element</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation type="unfinished">Automatisk størrelse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maksimert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Behold i forgrunnen ved oppstart</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Dobbeltklikksoppførsel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Musehjulsoppførsel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Forvalgt vindusstørrelse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Sleep een afbeelding hierheen</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">De bestandspadlijst is leeg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Het bestand is geen afbeelding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>De afbeeldingsgegevens zijn beschadigd of worden niet ondersteund</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>De bestandspadlijst is leeg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopiëren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Beschadigde afbeeldingsgegevens</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Niet-ondersteunde mime-gegevens: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Opslaan als</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>Er is geen afbeelding geopend.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1-afbeelding (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Er zijn geen ondersteunde formaten beschikbaar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>De afbeelding kan niet worden opgeslagen: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Afbeelding van klembord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Weet u zeker dat u “%1” naar de prullenbak wilt verplaatsen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Verplaatsen naar prullenbak mislukt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Het bestand kan niet naar de prullenbak worden verplaatst, mogelijk door een rechtenprobleem of systeembeperking.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>P&ixmap kopiëren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>&Bestandspad kopiëren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Eigenschappen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Altijd bovenop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Beschermde modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Bewerkingen onthouden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Inzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Opslaan &als…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Uitzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Animatie pauzeren/hervatten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Ga naar volgend animatieframe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>&Horizontaal spiegelen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Inpassen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Aanpassen aan breedte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Lange afbeelding inpassen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Plakken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Schaakbordpatroon aan/uit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Openen…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Ware grootte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximaliseren aan/uit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Naar rechts draaien</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Naar links draaien</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Vorige afbeelding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Volgende afbeelding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Verplaatsen naar prullenbak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Instellen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Hulp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Tonen in bestandsbeheer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Tonen in map</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Afsluiten</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Instellingen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Opties</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Sneltoetsen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Bewerken van sneltoetsen voor actie ‘%1’:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Instellen mislukt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Controleer of de gekozen sneltoetsen niet al in gebruik zijn.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Niets doen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Venster sluiten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximaliseren/Demaximaliseren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Schermvullende weergave aan/uit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>In-/Uitzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Ga naar volgende of vorige item</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Automatische grootte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Gemaximaliseerd</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Venster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Rond (geheel getal)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Keil (geheel getal)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Grond (geheel getal)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Systeeminstelling (fractionele schaal)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Automatisch altijd bovenop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Meegeleverde animatie voor venster sluiten gebruiken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Licht schaakbordpatroon gebruiken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Gekozen galerij herhalen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Automatische langeafbeeldingsmodus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>Svg-ondersteuning beperken tot SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Dubbelklikgedrag</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Scrollwielgedrag</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Standaard vensterafmetingen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>HiDPI-schaalfactor - afrondbeleid</translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Geen sneltoetsen</translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Sneltoets #%1</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -183,13 +183,14 @@
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -197,189 +198,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>کاپی کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>تصویر دا نقشہ کاپی کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>وشیشتاواں</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>سرکھیات سیٹنگ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>وڈا کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>چھوٹا کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>لیٹویں اُلٹاؤ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>پیسٹ کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>چیکبورڈ چالو بدلو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>کھُلھو…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>اصلی اکار</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>ودھو ودھ بدلو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>سجے گھنماؤ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>پچھلی تصویر</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>اگلی تصویر</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>مدد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>بند کرو</translation>
|
||||
</message>
|
||||
@@ -710,141 +749,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>سیٹنگاں</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished">ودھو ودھ بدلو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>ودھ توں ودھ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Default window size</source>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -852,7 +901,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -860,7 +909,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="48"/>
|
||||
<source>Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Избегайте сброса настроек масштабирования/поворота/поворота, которые были применены к просмотру изображения при переключении между изображениями.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="63"/>
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Перетащите изображение сюда</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">Список URL-адресов файлов пуст</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Файл не является допустимым изображением</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Параметры изображения недействительны или не поддерживаются в настоящее время</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Список URL-адресов файлов пуст</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Скопировать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Параметры изображения недействительны</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Неподдерживаемые mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Сохранить как</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>В настоящее время нет открытых изображений.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1 Изображение (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Нет доступных поддерживаемых форматов изображений.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>Не удалось сохранить изображение: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Изображение из буфера обмена</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Вы уверены, что хотите переместить "%1" в корзину?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Не удалось переместить файл в корзину</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Перемещение в корзину не удалось, возможно, из-за проблем с правами доступа к файлу, ограничений файловой системы или ограничений платформы.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Скопировать P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Скопировать &путь к файлу</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Свойства</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Поверх всех окон</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Защищенный режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Сохранять трансформацию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Увеличить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Сохранить как...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Уменьшить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Пауза/Возобновление анимации</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Перейти к следующему кадру анимации</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Отразить по &горизонтали</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Уместить все</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Уместить по ширине</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Уместить по длине</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Вставить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Переключить фоновый рисунок</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Открыть...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Фактический размер</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Переключить окно</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Повернуть вправо</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Повернуть влево</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Предыдущее изображение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Следующее изображение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Переместить в корзину</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Параметры...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Помощь</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Показать в проводнике</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Показать в папке</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Выход</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Параметры</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Опции</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ярлыки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Сокращенные команды для действия "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Не удалось установить ярлыки</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Пожалуйста, проверьте, не дублируются ли ярлыки с существующими ярлыками.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Ничего не делать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Закрыть окно</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Переключить окно</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Переключить полноэкранный режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Увеличение и уменьшение масштаба</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Следующее или предыдущее изображение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Авторазмер</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Максимизировать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Оконный</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Round (целочисленное масштабирование)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Ceil (целочисленное масштабирование)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Floor (целочисленное масштабирование)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Следовать системе (дробное масштабирование)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Поверх всех окон при запуске</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>Использовать встроенную анимацию закрытия окна</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Использовать легкий шахматный узор</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>Зациклить загруженную галерею</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Режим автоматического увеличения изображения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>Ограничить поддержку SVG до SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Действие при двойном щелчке</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Действие колеса мыши</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Размер окна по умолчанию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Политика округления коэффициента масштабирования HiDPI</translation>
|
||||
</message>
|
||||
@@ -868,17 +917,17 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Нет ярлыков</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ярлык #%1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -891,7 +940,7 @@
|
||||
<message>
|
||||
<location filename="../main.cpp" line="45"/>
|
||||
<source>List supported image format suffixes, and quit program.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Вывести список поддерживаемых суффиксов форматов изображений и завершить работу программы.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="49"/>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="obsolete">ගොනු ඒ.ස.නි. (url) ලැයිස්තුව හිස් ය</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>ගොනුව වලංගු නොවන රූපයකි</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -209,189 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>ගොනු ඒ.ස.නි. (url) ලැයිස්තුව හිස් ය</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&පිටපත්</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>රූපයේ දත්ත වලංගු නොවේ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -722,141 +761,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>සැකසුම්</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>කිසිවක් නොකරන්න</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>කවුළුව වහන්න</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Default window size</source>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -864,7 +913,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -872,7 +921,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
935
app/translations/PineapplePictures_sl.ts
Normal file
935
app/translations/PineapplePictures_sl.ts
Normal file
@@ -0,0 +1,935 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="sl">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="29"/>
|
||||
<source>About</source>
|
||||
<translation>O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="32"/>
|
||||
<source>Launch application with image file path as argument to load the file.</source>
|
||||
<translation>Zaženite aplikacijo s potjo do slikovne datoteke kot argumentom za nalaganje datoteke.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="33"/>
|
||||
<source>Drag and drop image file onto the window is also supported.</source>
|
||||
<translation>Podprta je tudi funkcija povleci in spusti, da povlečete slikovno datoteko v okno.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="34"/>
|
||||
<source>None of the operations in this application will alter the pictures on disk.</source>
|
||||
<translation>Nobena od operacij v tej aplikaciji ne bo spremenila slik na disku.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="35"/>
|
||||
<source>Context menu option explanation:</source>
|
||||
<translation>Razlaga možnosti kontekstnega menija:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="42"/>
|
||||
<source>Make window stay on top of all other windows.</source>
|
||||
<translation>Okno naj ostane nad vsemi drugimi okni.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="45"/>
|
||||
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
|
||||
<translation>Izogibajte se nenamernemu zapiranju okna (npr. z dvojnim klikom na okno)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="48"/>
|
||||
<source>Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.</source>
|
||||
<translation>Pri preklapljanju med slikami se izogibajte ponastavitvi stanja povečave/vrtenja/preobrata, ki je bilo uporabljeno za pogled slike.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="55"/>
|
||||
<source>Version: %1</source>
|
||||
<translation>Različica: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="66"/>
|
||||
<source>Logo designed by %1</source>
|
||||
<translation>Logotip je oblikoval %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="68"/>
|
||||
<source>Built with Qt %1 (%2)</source>
|
||||
<translation>Zgrajeno s Qt %1 (%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="69"/>
|
||||
<source>Source code</source>
|
||||
<translation>Izvorna koda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="79"/>
|
||||
<source>Contributors</source>
|
||||
<translation>Sodelavci</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="81"/>
|
||||
<source>List of contributors on GitHub</source>
|
||||
<translation>Seznam sodelavcev na GitHubu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="82"/>
|
||||
<source>Thanks to all people who contributed to this project.</source>
|
||||
<translation>Hvala vsem ljudem, ki so prispevali k temu projektu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="86"/>
|
||||
<source>Translators</source>
|
||||
<translation>Prevajalci</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="87"/>
|
||||
<source>I would like to thank the following people who volunteered to translate this application.</source>
|
||||
<translation>Rad bi se zahvalil naslednjim ljudem, ki so se prostovoljno javili za prevod te aplikacije.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="131"/>
|
||||
<source>%1 is built on the following free software libraries:</source>
|
||||
<comment>Free as in freedom</comment>
|
||||
<translation>%1 je zgrajen na naslednjih knjižnicah brezplačne programske opreme:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="155"/>
|
||||
<source>&Special Thanks</source>
|
||||
<translation>&Posebna zahvala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="157"/>
|
||||
<source>&Third-party Libraries</source>
|
||||
<translation>&Knjižnice tretjih oseb</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="93"/>
|
||||
<source>Your Rights</source>
|
||||
<translation>Vaše pravice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="63"/>
|
||||
<source>Copyright (c) %1 %2</source>
|
||||
<comment>%1 is year, %2 is the name of copyright holder(s)</comment>
|
||||
<translation>Avtorske pravice (c) %1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="95"/>
|
||||
<source>%1 is released under the MIT License.</source>
|
||||
<translation>%1 je izdan pod licenco MIT.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="96"/>
|
||||
<source>This license grants people a number of freedoms:</source>
|
||||
<translation>Ta licenca daje ljudem številne svoboščine:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="97"/>
|
||||
<source>You are free to use %1, for any purpose</source>
|
||||
<translation>%1 lahko uporabljate za kakršen koli namen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="98"/>
|
||||
<source>You are free to distribute %1</source>
|
||||
<translation>Prosto lahko distribuirate %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="99"/>
|
||||
<source>You can study how %1 works and change it</source>
|
||||
<translation>Lahko preučite, kako deluje %1, in ga spremenite</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="100"/>
|
||||
<source>You can distribute changed versions of %1</source>
|
||||
<translation>Spremenjene različice %1 lahko distribuirate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="102"/>
|
||||
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
|
||||
<translation>Licenca MIT vam zagotavlja to svobodo. Nihče vam je ne sme vzeti.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="130"/>
|
||||
<source>Third-party Libraries used by %1</source>
|
||||
<translation>Knjižnice tretjih oseb, ki jih uporablja %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="153"/>
|
||||
<source>&Help</source>
|
||||
<translation>&Pomoč</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="154"/>
|
||||
<source>&About</source>
|
||||
<translation>&O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="156"/>
|
||||
<source>&License</source>
|
||||
<translation>&Licenca</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Povlecite sliko sem</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Datoteka ni veljavna slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Podatki o sliki so neveljavni ali trenutno niso podprti</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Seznam url-jev datotek je prazen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopiraj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Podatki slike so neveljavni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Ni podprtih podatkov mime: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Shrani kot</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>Trenutno ni odprta nobena slika.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>Slika %1 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Nobenih podprtih formatov slik ni na razpolago.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>Shranjevanje slike ni uspelo: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Slika iz odložišča</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Ali ste prepričani, da želite premakniti "%1" v koš?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Datoteke ni bilo mogoče premakniti v koš</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Premik v koš ni uspel. Morda je vzrok težava z dovoljenji za datoteke, omejitev datotečnega sistema ali omejitev platforme.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Kopiraj P&ixmapo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Kopiraj &pot datoteke</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Lastnosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Ostani na vrhu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Zaščiten način</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Ohrani transformacijo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Povečaj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Shrani &kot...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Pomanjšaj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Začasna ustavitev/nadaljevanje animacije</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Animacija Pojdi na naslednji okvir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Obrni &vodoravno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Prilagodi pogledu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Prilagodi širini</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Prilagodi dolgi sliki</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Prilepi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Preklopi šahovnico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Odpri...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Dejanska velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Preklopi maksimiranje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Zavrti desno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Zavrti levo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Prejšnja slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Naslednja slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Premakni v koš</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfiguriraj...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Pomoč</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Prikaži v Raziskovalcu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Prikaži v imeniku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Izhod</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataDialog</name>
|
||||
<message>
|
||||
<location filename="../metadatadialog.cpp" line="84"/>
|
||||
<source>Image Metadata</source>
|
||||
<translation>Metapodatki slike</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataModel</name>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="43"/>
|
||||
<source>Origin</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Izvor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="44"/>
|
||||
<source>Image</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="48"/>
|
||||
<source>File</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Datoteka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="45"/>
|
||||
<source>Camera</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Kamera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="35"/>
|
||||
<source>%1 File</source>
|
||||
<translation>%1 Datoteka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="42"/>
|
||||
<source>Description</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Opis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="46"/>
|
||||
<source>Advanced photo</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Napredna fotografija</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="47"/>
|
||||
<source>GPS</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>GPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="52"/>
|
||||
<source>Dimensions</source>
|
||||
<translation>Dimenzije</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="54"/>
|
||||
<source>Aspect ratio</source>
|
||||
<translation>Razmerje stranic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="58"/>
|
||||
<source>Frame count</source>
|
||||
<translation>Število sličic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="62"/>
|
||||
<source>Name</source>
|
||||
<translation>Ime</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="64"/>
|
||||
<source>Item type</source>
|
||||
<translation>Vrsta elementa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="66"/>
|
||||
<source>Folder path</source>
|
||||
<translation>Pot do imenika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="68"/>
|
||||
<source>Size</source>
|
||||
<translation>Velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="70"/>
|
||||
<source>Date created</source>
|
||||
<translation>Datum nastanka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="72"/>
|
||||
<source>Date modified</source>
|
||||
<translation>Datum spremembe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="79"/>
|
||||
<source>Title</source>
|
||||
<translation>Naslov</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="81"/>
|
||||
<source>Subject</source>
|
||||
<translation>Zadeva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="83"/>
|
||||
<source>Rating</source>
|
||||
<translation>Ocena</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="85"/>
|
||||
<source>Tags</source>
|
||||
<translation>Oznake</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="87"/>
|
||||
<source>Comments</source>
|
||||
<translation>Komentarji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="90"/>
|
||||
<source>Authors</source>
|
||||
<translation>Avtorji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="92"/>
|
||||
<source>Date taken</source>
|
||||
<translation>Datum posnetka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="98"/>
|
||||
<source>Program name</source>
|
||||
<translation>Ime programa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="100"/>
|
||||
<source>Copyright</source>
|
||||
<translation>Avtorske pravice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="103"/>
|
||||
<source>Horizontal resolution</source>
|
||||
<translation>Horizontalna ločljivost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="105"/>
|
||||
<source>Vertical resolution</source>
|
||||
<translation>Navpična ločljivost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="107"/>
|
||||
<source>Resolution unit</source>
|
||||
<translation>Enota ločljivosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="109"/>
|
||||
<source>Colour representation</source>
|
||||
<translation>Barvna predstavitev</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="112"/>
|
||||
<source>Camera maker</source>
|
||||
<translation>Izdelovalec kamer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="114"/>
|
||||
<source>Camera model</source>
|
||||
<translation>Model kamere</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="116"/>
|
||||
<source>F-stop</source>
|
||||
<translation>F-stop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="118"/>
|
||||
<source>Exposure time</source>
|
||||
<translation>Čas izpostavljenosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="120"/>
|
||||
<source>ISO speed</source>
|
||||
<translation>Hitrost ISO</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="122"/>
|
||||
<source>Exposure bias</source>
|
||||
<translation>Pristranskost izpostavljenosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="124"/>
|
||||
<source>Focal length</source>
|
||||
<translation>Goriščna razdalja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="126"/>
|
||||
<source>Max aperture</source>
|
||||
<translation>Največja zaslonka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="128"/>
|
||||
<source>Metering mode</source>
|
||||
<translation>Način merjenja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="130"/>
|
||||
<source>Subject distance</source>
|
||||
<translation>Razdalja motiva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="132"/>
|
||||
<source>Flash mode</source>
|
||||
<translation>Način bliskavice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="134"/>
|
||||
<source>35mm focal length</source>
|
||||
<translation>Goriščna razdalja 35 mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="137"/>
|
||||
<source>Lens model</source>
|
||||
<translation>Model objektiva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="139"/>
|
||||
<source>Contrast</source>
|
||||
<translation>Kontrast</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="141"/>
|
||||
<source>Brightness</source>
|
||||
<translation>Svetlost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="143"/>
|
||||
<source>Exposure program</source>
|
||||
<translation>Program izpostavljenosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="145"/>
|
||||
<source>Saturation</source>
|
||||
<translation>Nasičenost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="147"/>
|
||||
<source>Sharpness</source>
|
||||
<translation>Ostrina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="149"/>
|
||||
<source>White balance</source>
|
||||
<translation>Ravnovesje beline</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="151"/>
|
||||
<source>Digital zoom</source>
|
||||
<translation>Digitalna povečava</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="153"/>
|
||||
<source>EXIF version</source>
|
||||
<translation>Različica EXIF</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="156"/>
|
||||
<source>Latitude reference</source>
|
||||
<translation>Referenčna zemljepisna širina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="158"/>
|
||||
<source>Latitude</source>
|
||||
<translation>Zemljepisna širina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="160"/>
|
||||
<source>Longitude reference</source>
|
||||
<translation>Referenčna dolžina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="162"/>
|
||||
<source>Longitude</source>
|
||||
<translation>Zemljepisna dolžina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="164"/>
|
||||
<source>Altitude reference</source>
|
||||
<translation>Referenčna višina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="166"/>
|
||||
<source>Altitude</source>
|
||||
<translation>Nadmorska višina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="176"/>
|
||||
<source>%1 x %2</source>
|
||||
<translation>%1 x %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="194"/>
|
||||
<source>%1 : %2</source>
|
||||
<translation>%1 : %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Property</source>
|
||||
<translation>Lastnost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Value</source>
|
||||
<translation>Vrednost</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Nastavitve</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Možnosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Bližnjice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Urejanje bližnjic za dejanje "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Nastavitev bližnjic ni uspela</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Preverite, ali so bližnjice podvojene z obstoječimi bližnjicami.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Ne naredi ničesar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Zapri okno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Preklopi maksimiranje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Preklopi celozaslonski način</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Povečava in pomanjšava</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Ogled naslednjega ali prejšnjega elementa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Samodejna velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maksimizirano</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Okenski način</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Zaokroženo (celoštevilsko skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Zaokroževanje navzgor (celoštevilsko skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Zaokroževanje navzdol (celoštevilsko skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Sledi sistemu (delno skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Ostani na vrhu pri zagonu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>Uporabi vgrajeno animacijo zapiranja okna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Uporabite svetlo šahovnico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>Ponavljaj naloženo galerijo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Samodejni način dolge slike</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>Omeji podporo za SVG na SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Obnašanje dvojnega klika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Obnašanje miškinega kolesca</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Privzeta velikost okna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Politika zaokroževanja faktorja merila HiDPI</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Brez bližnjic</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Bližnjica #%1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="42"/>
|
||||
<source>Pineapple Pictures</source>
|
||||
<translation>Pineapple Slike</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="45"/>
|
||||
<source>List supported image format suffixes, and quit program.</source>
|
||||
<translation>Naštej podprte pripone slikovnih formatov in zapri program.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="49"/>
|
||||
<source>File list.</source>
|
||||
<translation>Seznam datotek.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>படத்தை இங்கே இழுக்கவும்</translation>
|
||||
</message>
|
||||
@@ -183,13 +183,14 @@
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>கோப்பு சரியான படம் அல்ல</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>படத் தரவு தவறானது அல்லது தற்போது ஆதரிக்கப்படாதது</translation>
|
||||
</message>
|
||||
@@ -197,189 +198,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>கோப்பு முகவரி பட்டியல் காலியாக உள்ளது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>நகலெடு (&c)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>படத் தரவு தவறானது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>மைமெடாட்டாவை ஆதரிக்கவில்லை: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>கிளிப்போர்டிலிருந்து படம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>பின் மறுசுழற்சி செய்ய "%1" ஐ நகர்த்த விரும்புகிறீர்களா?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>கோப்பை குப்பைக்கு நகர்த்துவதில் தோல்வி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>குப்பைக்கு நகர்வது தோல்வியுற்றது, இது கோப்பு இசைவு சிக்கல், கோப்பு முறைமை வரம்பு அல்லது இயங்குதள வரம்பு ஆகியவற்றால் ஏற்படலாம்.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>பி & ஐஎக்ச்மேப்பை நகலெடுக்கவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>கோப்பு பாதையை நகலெடுக்கவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>பண்புகள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>மேலே இருங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>பாதுகாக்கப்பட்ட பயன்முறை</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>மாற்றத்தைத் தொடருங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>பெரிதாக்கு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>சிறிதாக்கு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>இடைநிறுத்தம்/அனிமேசனை மீண்டும் தொடங்குங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>அனிமேசன் அடுத்த சட்டகத்திற்குச் செல்லுங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>கிடைமட்டமாக புரட்டவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>பார்க்க பொருத்தமானது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>அகலத்திற்கு ஏற்றது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>ஒட்டு (&p)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>செக்கர்போர்டை மாற்றவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>& திறந்த ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>உண்மையான அளவு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>அதிகபட்சத்தை மாற்றவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>வலதுபுறம் சுழற்றுங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>இடதுபுறம் சுழலும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>முந்தைய படம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>அடுத்த படம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>குப்பைக்கு நகர்த்தவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>உள்ளமைக்கவும் ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>உதவி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>கோப்பு எக்ச்ப்ளோரரில் காண்பி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>கோப்பகத்தில் காட்டு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>வெளியேறு</translation>
|
||||
</message>
|
||||
@@ -710,141 +749,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>அமைப்புகள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>விருப்பங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>குறுக்குவழிகள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>செயலுக்கான குறுக்குவழிகளைத் திருத்துதல் "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>குறுக்குவழிகளை அமைப்பதில் தோல்வி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>தற்போதுள்ள குறுக்குவழிகளுடன் குறுக்குவழிகள் நகல் செய்யப்பட்டுள்ளதா என்று சரிபார்க்கவும்.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>எதுவும் செய்ய வேண்டாம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>சாளரத்தை மூடு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>அதிகபட்சத்தை மாற்றவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>மாற்று முழுத்திரை</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>உள்ளேயும் வெளியேயும் பெரிதாக்கவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>அடுத்த அல்லது முந்தைய உருப்படியைக் காண்க</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>வாகன அளவு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>அதிகபட்சம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>சாளரம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>சுற்று (முழு எண் அளவிடுதல்)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>சீல் (முழு எண் அளவிடுதல்)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>மாடி (முழு எண் அளவிடுதல்)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>கணினியைப் பின்பற்றவும் (பகுதியளவு அளவிடுதல்)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>தொடக்கத்தில் இருக்கும்போது மேலே இருங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>உள்ளமைக்கப்பட்ட நெருக்கமான சாளர அனிமேஷனைப் பயன்படுத்தவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>ஒளி-வண்ண செக்கர்போர்டைப் பயன்படுத்தவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>ஏற்றப்பட்ட கேலரியை சுற்றுங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>நடத்தை இருமுறை சொடுக்கு செய்யவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>சுட்டி சக்கர நடத்தை</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>இயல்புநிலை சாளர அளவு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>HIDPI அளவிலான காரணி ரவுண்டிங் கொள்கை</translation>
|
||||
</message>
|
||||
@@ -852,7 +901,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>குறுக்குவழிகள் இல்லை</translation>
|
||||
</message>
|
||||
@@ -860,7 +909,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>குறுக்குவழி #%1</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Resmi buraya sürükleyin</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">Dosya URL listesi boş</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Dosya, geçerli bir resim değil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Resim verisi geçersiz veya şuan desteklenmiyor</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Dosya URL listesi boş</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopyala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Resim verisi geçersiz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Desteklenmeyen dosya türü verisi: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Panodaki Resim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>"%1" ögesini geri dönüşüm kutusuna taşımak istediğinizden emin misiniz?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Dosya çöpe taşınamadı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Çöp kutusuna taşıma başarısız oldu, dosya izin sorunu, dosya sistemi sınırlaması veya platform sınırlamasından kaynaklanıyor olabilir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>P&ixmap'i Kopyala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>&Dosya Yolunu Kopyala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Özellikler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Üstte tut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Korumalı kip</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Dönüşümü koru</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Yaklaştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Uzaklaştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Canlandırmayı Duraklat/Sürdür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Canlandırma Sonraki Kareye Git</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>&Yatay Çevir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Görünüme sığdır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Genişliğe sığdır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Geniş resmi sığdır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>Ya&pıştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Damalı Ekrana Geç</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Aç...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Gerçek boyut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Tam boyuta geç</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Sağa döndür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Sola döndür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Önceki resim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Sonraki resim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Çöp Kutusuna Taşı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Yapılandır...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Yardım</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Dosya Gezgini'nde Göster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Dizinde göster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Çıkış</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Ayarlar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Seçenekler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Kısayollar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>"%1" için kısayol düzenleniyor:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Kısayollar ayarlanamadı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Kısayolların var olan kısayollarla çakışma durumunu denetleyin.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Hiçbir şey yapma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Pencereyi kapat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Tam boyuta geç</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Tam ekranı aç/kapat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Yaklaştır ve uzaklaştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Sonraki veya önceki ögeyi görüntüle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Otomatik boyut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Tam boyut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Pencereli</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Yuvarlak (Tamsayı ölçekleme)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Tavan (Tamsayı ölçekleme)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Kat (Tamsayı ölçekleme)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Sistemi takip et (Kesirli ölçekleme)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Açılışta pencerelerin üstünde kal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Yerleşik kapat pencere canlandırmasını kullan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Açık renk dama tahtası kullan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Yüklenen galeriyi döngüye al</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Kendiliğinden uzun resim kipi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>SVG desteğini SVG Tiny 1.2 ile sınırla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Çift tıklama davranışı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Fare tekeri davranışı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Öntanımlı pencere boyutu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>HiDPI ölçek katsayısı yuvarlama ilkesi</translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Kısayol yok</translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Kısayol #%1</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Перетягніть зображення сюди</translation>
|
||||
</message>
|
||||
@@ -187,13 +187,14 @@
|
||||
<translation type="vanished">Список URL-адрес файлів порожній</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Файл не є дійсним зображенням</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Дані зображення недійсні або наразі не підтримуються</translation>
|
||||
</message>
|
||||
@@ -209,189 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Список URL-адрес файлів порожній</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Скопіювати</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Дані зображення недійсні</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Не підтримується mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Скопіювати P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Скопіювати &шлях до файлу</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Властивості</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Поверх всіх вікон</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Захищений режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Зберігати трансформацію</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Збільшити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Зменшити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Перевернути по &горизонталі</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Вставити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Перемкнути шахову дошку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Відкрити...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Фактичний розмір</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Перемкнути на максимум</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Перегорнути праворуч</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Попереднє зображення</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Наступне зображення</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Налаштувати...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Допомога</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Показати у файловому провіднику</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Показати у теці</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Вийти</translation>
|
||||
</message>
|
||||
@@ -722,141 +761,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Налаштування</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Нічого не робити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Закрити вікно</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Перемкнути на максимум</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Збільшення та зменшення</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Переглянути наступний або попередній елемент</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Автоматичний розмір</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Максимізувати</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Round (цілочисельне масштабування)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Ceil (цілочисельне масштабування)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Floor (цілочисельне масштабування)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Стежити за системою (дробове масштабування)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Поверх всіх вікон під час запуску</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Поведінка при подвійному кліку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Поведінка колеса миші</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Розмір вікна за замовчуванням</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Політика округлення коефіцієнта HiDPI</translation>
|
||||
</message>
|
||||
@@ -864,7 +913,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -872,7 +921,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
936
app/translations/PineapplePictures_vi.ts
Normal file
936
app/translations/PineapplePictures_vi.ts
Normal file
@@ -0,0 +1,936 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="vi">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="29"/>
|
||||
<source>About</source>
|
||||
<translation>Giới thiệu về</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="32"/>
|
||||
<source>Launch application with image file path as argument to load the file.</source>
|
||||
<translation>Khởi chạy ứng dụng với đường dẫn tệp hình ảnh làm đối số để tải tệp.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="33"/>
|
||||
<source>Drag and drop image file onto the window is also supported.</source>
|
||||
<translation>Kéo và thả tệp hình ảnh vào cửa sổ cũng được hỗ trợ.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="34"/>
|
||||
<source>None of the operations in this application will alter the pictures on disk.</source>
|
||||
<translation>Không có thao tác nào trong ứng dụng này sẽ làm thay đổi hình ảnh trên đĩa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="35"/>
|
||||
<source>Context menu option explanation:</source>
|
||||
<translation>Giải thích tùy chọn menu ngữ cảnh:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="42"/>
|
||||
<source>Make window stay on top of all other windows.</source>
|
||||
<translation>Đặt cửa sổ ở trên cùng của tất cả các cửa sổ khác.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="45"/>
|
||||
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
|
||||
<translation>Tránh vô tình đóng cửa sổ. (ví dụ: bằng cách nhấp đúp vào cửa sổ)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="48"/>
|
||||
<source>Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.</source>
|
||||
<translation>Tránh đặt lại trạng thái zoom/xoay/lật đã được áp dụng cho xem hình ảnh khi chuyển đổi giữa các hình ảnh.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="55"/>
|
||||
<source>Version: %1</source>
|
||||
<translation>Phiên bản: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="66"/>
|
||||
<source>Logo designed by %1</source>
|
||||
<translation>Logo được thiết kế bởi %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="68"/>
|
||||
<source>Built with Qt %1 (%2)</source>
|
||||
<translation>Được xây dựng với Qt %1 (%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="69"/>
|
||||
<source>Source code</source>
|
||||
<translation>Mã nguồn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="79"/>
|
||||
<source>Contributors</source>
|
||||
<translation>Người đóng góp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="81"/>
|
||||
<source>List of contributors on GitHub</source>
|
||||
<translation>Danh sách những người đóng góp trên GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="82"/>
|
||||
<source>Thanks to all people who contributed to this project.</source>
|
||||
<translation>Cảm ơn tất cả những người đã đóng góp cho dự án này.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="86"/>
|
||||
<source>Translators</source>
|
||||
<translation>Vietnam Linux L10n <https://github.com/linux-l10n-vi>
|
||||
Loc Huynh <https://github.com/hthienloc></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="87"/>
|
||||
<source>I would like to thank the following people who volunteered to translate this application.</source>
|
||||
<translation>Tôi xin cảm ơn những người sau đây đã tình nguyện dịch ứng dụng này.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="131"/>
|
||||
<source>%1 is built on the following free software libraries:</source>
|
||||
<comment>Free as in freedom</comment>
|
||||
<translation>%1 được xây dựng trên các thư viện phần mềm miễn phí sau:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="155"/>
|
||||
<source>&Special Thanks</source>
|
||||
<translation>&Cảm ơn đặc biệt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="157"/>
|
||||
<source>&Third-party Libraries</source>
|
||||
<translation>&Thư viện của bên thứ ba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="93"/>
|
||||
<source>Your Rights</source>
|
||||
<translation>Quyền của bạn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="63"/>
|
||||
<source>Copyright (c) %1 %2</source>
|
||||
<comment>%1 is year, %2 is the name of copyright holder(s)</comment>
|
||||
<translation>Bản quyền (c) %1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="95"/>
|
||||
<source>%1 is released under the MIT License.</source>
|
||||
<translation>%1 được phát hành theo Giấy phép MIT.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="96"/>
|
||||
<source>This license grants people a number of freedoms:</source>
|
||||
<translation>Giấy phép này cấp cho mọi người một số quyền tự do:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="97"/>
|
||||
<source>You are free to use %1, for any purpose</source>
|
||||
<translation>Bạn được tự do sử dụng %1, cho bất kỳ mục đích nào</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="98"/>
|
||||
<source>You are free to distribute %1</source>
|
||||
<translation>Bạn được tự do phân phối %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="99"/>
|
||||
<source>You can study how %1 works and change it</source>
|
||||
<translation>Bạn có thể nghiên cứu cách %1 hoạt động và thay đổi nó</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="100"/>
|
||||
<source>You can distribute changed versions of %1</source>
|
||||
<translation>Bạn có thể phân phối các phiên bản đã thay đổi của %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="102"/>
|
||||
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
|
||||
<translation>Giấy phép MIT đảm bảo cho bạn sự tự do này. Không ai được phép mang nó đi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="130"/>
|
||||
<source>Third-party Libraries used by %1</source>
|
||||
<translation>Thư viện của bên thứ ba được %1 sử dụng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="153"/>
|
||||
<source>&Help</source>
|
||||
<translation>&Trợ giúp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="154"/>
|
||||
<source>&About</source>
|
||||
<translation>&Giới thiệu giới thiệu về</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="156"/>
|
||||
<source>&License</source>
|
||||
<translation>&Giấy phép</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Kéo hình ảnh vào đây</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Tệp không phải là hình ảnh hợp lệ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Dữ liệu hình ảnh không hợp lệ hoặc hiện không được hỗ trợ</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Danh sách url tệp trống</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Sao chép</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Dữ liệu hình ảnh không hợp lệ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Dữ liệu mimedata không được hỗ trợ: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Lưu dưới dạng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>Hiện tại không có hình ảnh nào được mở.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>Hình ảnh %1 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Không có định dạng hình ảnh được hỗ trợ.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>Không lưu được hình ảnh: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Hình ảnh từ bộ nhớ tạm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Bạn có chắc chắn muốn chuyển "%1" vào thùng rác không?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Không thể di chuyển tệp vào thùng rác</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Di chuyển vào thùng rác không thành công, nguyên nhân có thể là do vấn đề về quyền đối với tệp, giới hạn hệ thống tệp hoặc giới hạn nền tảng.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Sao chép P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Sao chép Đường &dẫn tệp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Thuộc tính</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Luôn trên đầu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Chế độ bảo vệ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Giữ sự chuyển đổi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Phóng to</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Lưu &dưới dạng...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Thu nhỏ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Tạm dừng/Tiếp tục hoạt ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Hoạt hình Chuyển đến khung tiếp theo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Lật &Theo chiều ngang</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Phù hợp để xem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Vừa với chiều rộng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Vừa với hình ảnh dài</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Dán</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Chuyển đổi bàn cờ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Mở...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Kích thước thực tế</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Chuyển đổi tối đa hóa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Xoay phải</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Xoay trái</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Hình ảnh trước đó</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Hình ảnh tiếp theo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Chuyển vào Thùng rác</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Cấu hình...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Trợ giúp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Hiển thị trong tệp Explorer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Hiển thị trong thư mục</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Thoát</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataDialog</name>
|
||||
<message>
|
||||
<location filename="../metadatadialog.cpp" line="84"/>
|
||||
<source>Image Metadata</source>
|
||||
<translation>Siêu dữ liệu hình ảnh</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataModel</name>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="43"/>
|
||||
<source>Origin</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Nguồn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="44"/>
|
||||
<source>Image</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Hình ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="48"/>
|
||||
<source>File</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Tệp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="45"/>
|
||||
<source>Camera</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Camera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="35"/>
|
||||
<source>%1 File</source>
|
||||
<translation>Tệp %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="42"/>
|
||||
<source>Description</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Mô tả</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="46"/>
|
||||
<source>Advanced photo</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Ảnh nâng cao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="47"/>
|
||||
<source>GPS</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>GPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="52"/>
|
||||
<source>Dimensions</source>
|
||||
<translation>Kích thước</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="54"/>
|
||||
<source>Aspect ratio</source>
|
||||
<translation>Tỷ lệ khung hình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="58"/>
|
||||
<source>Frame count</source>
|
||||
<translation>Số khung hình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="62"/>
|
||||
<source>Name</source>
|
||||
<translation>Tên</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="64"/>
|
||||
<source>Item type</source>
|
||||
<translation>Loại mặt hàng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="66"/>
|
||||
<source>Folder path</source>
|
||||
<translation>Đường dẫn thư mục</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="68"/>
|
||||
<source>Size</source>
|
||||
<translation>Kích thước</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="70"/>
|
||||
<source>Date created</source>
|
||||
<translation>Ngày tạo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="72"/>
|
||||
<source>Date modified</source>
|
||||
<translation>Ngày sửa đổi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="79"/>
|
||||
<source>Title</source>
|
||||
<translation>Tiêu đề</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="81"/>
|
||||
<source>Subject</source>
|
||||
<translation>Chủ thể</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="83"/>
|
||||
<source>Rating</source>
|
||||
<translation>Đánh giá</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="85"/>
|
||||
<source>Tags</source>
|
||||
<translation>Thẻ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="87"/>
|
||||
<source>Comments</source>
|
||||
<translation>Bình luận</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="90"/>
|
||||
<source>Authors</source>
|
||||
<translation>Các tác giả</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="92"/>
|
||||
<source>Date taken</source>
|
||||
<translation>Ngày chụp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="98"/>
|
||||
<source>Program name</source>
|
||||
<translation>Tên chương trình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="100"/>
|
||||
<source>Copyright</source>
|
||||
<translation>Bản quyền</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="103"/>
|
||||
<source>Horizontal resolution</source>
|
||||
<translation>Độ phân giải ngang</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="105"/>
|
||||
<source>Vertical resolution</source>
|
||||
<translation>Độ phân giải dọc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="107"/>
|
||||
<source>Resolution unit</source>
|
||||
<translation>Đơn vị độ phân giải</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="109"/>
|
||||
<source>Colour representation</source>
|
||||
<translation>Thể hiện màu sắc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="112"/>
|
||||
<source>Camera maker</source>
|
||||
<translation>Nhà sản xuất máy ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="114"/>
|
||||
<source>Camera model</source>
|
||||
<translation>Mẫu máy ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="116"/>
|
||||
<source>F-stop</source>
|
||||
<translation>F-dừng lại</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="118"/>
|
||||
<source>Exposure time</source>
|
||||
<translation>Thời gian phơi nhiễm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="120"/>
|
||||
<source>ISO speed</source>
|
||||
<translation>Tốc độ ISO</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="122"/>
|
||||
<source>Exposure bias</source>
|
||||
<translation>Xu hướng tiếp xúc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="124"/>
|
||||
<source>Focal length</source>
|
||||
<translation>Tiêu cự</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="126"/>
|
||||
<source>Max aperture</source>
|
||||
<translation>Khẩu độ tối đa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="128"/>
|
||||
<source>Metering mode</source>
|
||||
<translation>Chế độ đo sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="130"/>
|
||||
<source>Subject distance</source>
|
||||
<translation>Khoảng cách chủ đề</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="132"/>
|
||||
<source>Flash mode</source>
|
||||
<translation>Chế độ đèn nháy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="134"/>
|
||||
<source>35mm focal length</source>
|
||||
<translation>tiêu cự 35mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="137"/>
|
||||
<source>Lens model</source>
|
||||
<translation>Mẫu ống kính</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="139"/>
|
||||
<source>Contrast</source>
|
||||
<translation>Độ tương phản</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="141"/>
|
||||
<source>Brightness</source>
|
||||
<translation>Độ sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="143"/>
|
||||
<source>Exposure program</source>
|
||||
<translation>Chương trình phơi sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="145"/>
|
||||
<source>Saturation</source>
|
||||
<translation>Độ bão hòa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="147"/>
|
||||
<source>Sharpness</source>
|
||||
<translation>Độ sắc nét</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="149"/>
|
||||
<source>White balance</source>
|
||||
<translation>Cân bằng trắng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="151"/>
|
||||
<source>Digital zoom</source>
|
||||
<translation>Zoom kỹ thuật số</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="153"/>
|
||||
<source>EXIF version</source>
|
||||
<translation>Phiên bản EXIF</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="156"/>
|
||||
<source>Latitude reference</source>
|
||||
<translation>Tham chiếu vĩ độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="158"/>
|
||||
<source>Latitude</source>
|
||||
<translation>Vĩ độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="160"/>
|
||||
<source>Longitude reference</source>
|
||||
<translation>Tham chiếu kinh độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="162"/>
|
||||
<source>Longitude</source>
|
||||
<translation>Kinh độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="164"/>
|
||||
<source>Altitude reference</source>
|
||||
<translation>Tham chiếu độ cao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="166"/>
|
||||
<source>Altitude</source>
|
||||
<translation>Độ cao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="176"/>
|
||||
<source>%1 x %2</source>
|
||||
<translation>%1 x %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="194"/>
|
||||
<source>%1 : %2</source>
|
||||
<translation>%1 : %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Property</source>
|
||||
<translation>Tài sản</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Value</source>
|
||||
<translation>Giá trị</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Cài đặt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Tùy chọn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Phím tắt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Chỉnh sửa phím tắt cho hành động "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Không đặt được phím tắt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Vui lòng kiểm tra xem các phím tắt có bị trùng lặp với các phím tắt hiện có hay không.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Không làm gì cả</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Đóng cửa sổ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Chuyển đổi tối đa hóa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Chuyển đổi toàn màn hình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Zoom và thu nhỏ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Xem mục tiếp theo hoặc trước đó</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Kích thước tự động</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Tối đa hóa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Có cửa sổ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Tròn (Tỷ lệ số nguyên)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Ceil (Tỷ lệ số nguyên)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Tầng (Tỷ lệ số nguyên)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Hệ thống theo dõi (Chia tỷ lệ phân số)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Luôn dẫn đầu khi khởi nghiệp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>Sử dụng hoạt ảnh đóng cửa sổ tích hợp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Sử dụng bàn cờ màu sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>Lặp lại thư viện đã tải</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Chế độ hình ảnh dài tự động</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>Giới hạn hỗ trợ SVG ở SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Hành vi bấm đúp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Hành vi của bánh xe chuột</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Kích thước cửa sổ mặc định</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Chính sách làm tròn hệ số tỷ lệ HiDPI</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Không phím tắt</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Phím tắt #%1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="42"/>
|
||||
<source>Pineapple Pictures</source>
|
||||
<translation>Pineapple Pictures</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="45"/>
|
||||
<source>List supported image format suffixes, and quit program.</source>
|
||||
<translation>Liệt kê các hậu tố định dạng hình ảnh được hỗ trợ và thoát khỏi chương trình.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="49"/>
|
||||
<source>File list.</source>
|
||||
<translation>Danh sách tệp.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -178,8 +178,8 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="276"/>
|
||||
<location filename="../graphicsscene.cpp" line="100"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>拖放图片至此</translation>
|
||||
</message>
|
||||
@@ -191,13 +191,14 @@
|
||||
<translation type="vanished">文件 URL 列表为空</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="50"/>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>文件不是有效的图片文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="54"/>
|
||||
<location filename="../graphicsview.cpp" line="58"/>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>图像数据无效或暂未支持</translation>
|
||||
</message>
|
||||
@@ -213,189 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="181"/>
|
||||
<location filename="../mainwindow.cpp" line="545"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>文件 URL 列表为空</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="445"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>复制(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="553"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>图片数据无效</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="560"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>不受支持的 MimeData 格式:%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="759"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>另存为</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>当前未打开图像。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1 图像 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>没有可用的图像格式。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>保存图像失败:%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>剪切板图片</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="777"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>您确认要将“%1”移动到回收站吗?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="781"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>无法移动文件至回收站</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="782"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>移至回收站失败,这可能由文件权限、文件系统或平台限制导致。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>复制位图(&I)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>复制文件路径(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="133"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>属性</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="118"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>总在最前</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>保护模式</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="120"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>保持视图变换</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>放大</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>另存为(&A)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>缩小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>暂定/继续动画播放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>动画逐帧播放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>水平翻转(&H)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>自适应视图大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>自适应宽度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>自适应长图</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>粘贴(&P)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>切换棋盘格</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>打开(&O)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>实际大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>最大化窗口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>向右旋转</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>向左旋转</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>上一个图像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>下一个图像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="776"/>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>移至回收站</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="121"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>设置...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="122"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>帮助</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>在文件资源管理器中显示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="131"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>在文件夹中显示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="134"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>退出</translation>
|
||||
</message>
|
||||
@@ -726,141 +765,151 @@
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="31"/>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>设定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="39"/>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>选项</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="51"/>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>快捷键</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="61"/>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>编辑“%1”的快捷键:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="70"/>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>快捷键设置失败</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="71"/>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>请检查快捷键是否与现有快捷键冲突。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="78"/>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>什么也不做</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="79"/>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>关闭窗口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>最大化窗口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>全屏窗口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="85"/>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>放大和缩小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="86"/>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>查看下一项或上一项</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="90"/>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>自动大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="91"/>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>最大化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>窗口化</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="96"/>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>四舍五入(整数缩放)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="97"/>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>向上取整(整数缩放)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>向下取整(整数缩放)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>跟随系统(小数缩放)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="122"/>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>启动时保持窗口总在最前</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="123"/>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>使用内置的关闭窗口动画</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>使用亮色棋盘格</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>循环所加载的图像列表</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>自动进入长图模式</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>限制 SVG 支持标准到 SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>双击时的行为</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>鼠标滚轮行为</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>默认窗口大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>HiDPI 高分屏缩放策略</translation>
|
||||
</message>
|
||||
@@ -868,7 +917,7 @@
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="109"/>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>无快捷键</translation>
|
||||
</message>
|
||||
@@ -876,7 +925,7 @@
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="75"/>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>快捷键 %1</translation>
|
||||
</message>
|
||||
|
||||
32
appveyor.yml
32
appveyor.yml
@@ -10,9 +10,9 @@ environment:
|
||||
matrix:
|
||||
- job_name: mingw_64_qt6_8
|
||||
QTDIR: C:\Qt\6.8\mingw_64
|
||||
MINGW64: C:\Qt\Tools\mingw1310_64
|
||||
KF_BRANCH: master
|
||||
EXIV2_VERSION: "0.28.5"
|
||||
MINGW64: C:\Qt\mingw_64\Tools\mingw1310_64
|
||||
KF_BRANCH: v6.24.0
|
||||
EXIV2_VERSION: "0.28.7"
|
||||
EXIV2_CMAKE_OPTIONS: "-DEXIV2_ENABLE_BROTLI=OFF -DEXIV2_ENABLE_INIH=OFF -DEXIV2_BUILD_EXIV2_COMMAND=OFF"
|
||||
PPIC_CMAKE_OPTIONS: "-DPREFER_QT_5=OFF"
|
||||
WINDEPLOYQT_ARGS: "--verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-system-d3d-compiler --skip-plugin-types tls,networkinformation"
|
||||
@@ -39,9 +39,9 @@ build_script:
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# download and install zlib for KArchive
|
||||
- cd %LIBZ%
|
||||
- curl -fsSL -o zlib131.zip https://zlib.net/zlib131.zip
|
||||
- 7z x zlib131.zip -y
|
||||
- cd zlib-1.3.1
|
||||
- curl -fsSL -o zlib132.zip https://zlib.net/zlib132.zip
|
||||
- 7z x zlib132.zip -y
|
||||
- cd zlib-1.3.2
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX%
|
||||
@@ -74,12 +74,12 @@ build_script:
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install libavif for avif format support of KImageFormats
|
||||
- cd %LIBAVIF%
|
||||
- curl -fsSL -o libavif-v1_1_1.zip https://github.com/AOMediaCodec/libavif/archive/v1.1.1.zip
|
||||
- 7z x libavif-v1_1_1.zip -y
|
||||
- cd libavif-1.1.1
|
||||
- curl -fsSL -o libavif-v1_3_0.zip https://github.com/AOMediaCodec/libavif/archive/v1.3.0.zip
|
||||
- 7z x libavif-v1_3_0.zip -y
|
||||
- cd libavif-1.3.0
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DAVIF_CODEC_AOM=ON -DAVIF_LOCAL_LIBYUV=ON
|
||||
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DAVIF_CODEC_AOM=SYSTEM -DAVIF_CODEC_AOM_DECODE=ON -DAVIF_CODEC_AOM_ENCODE=ON -DAVIF_LIBYUV=LOCAL
|
||||
- cmake --build . --config Release
|
||||
- cmake --build . --config Release --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
@@ -96,9 +96,9 @@ build_script:
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# build libexpat for libexiv2
|
||||
- cd %LIBEXPAT%
|
||||
- curl -fsSL -o R_2_6_2.zip https://github.com/libexpat/libexpat/archive/R_2_6_2.zip
|
||||
- 7z x R_2_6_2.zip -y
|
||||
- cd libexpat-R_2_6_2/expat/
|
||||
- curl -fsSL -o R_2_7_3.zip https://github.com/libexpat/libexpat/archive/R_2_7_3.zip
|
||||
- 7z x R_2_7_3.zip -y
|
||||
- cd libexpat-R_2_7_3/expat/
|
||||
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF
|
||||
- cmake --build . --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
@@ -134,7 +134,7 @@ build_script:
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libexpat-1.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libexiv2.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libavif.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libzlib.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libz.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libKF?Archive.dll
|
||||
- windeployqt %WINDEPLOYQT_ARGS% .\ppic.exe
|
||||
# copy 3rdparty licenses for the libs we vendored for windows...
|
||||
@@ -143,8 +143,8 @@ build_script:
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\3rdparty\aom\LICENSE License.aom.txt
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\3rdparty\karchive\LICENSES\LGPL-2.0-or-later.txt License.KArchive.txt
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\3rdparty\kimageformats\LICENSES\LGPL-2.1-or-later.txt License.kimageformats.txt
|
||||
- copy %LIBEXPAT%\libexpat-R_2_6_2\expat\COPYING License.expat.txt
|
||||
- copy %LIBAVIF%\libavif-1.1.1\LICENSE License.libavif.txt
|
||||
- copy %LIBEXPAT%\libexpat-R_2_7_3\expat\COPYING License.expat.txt
|
||||
- copy %LIBAVIF%\libavif-1.3.0\LICENSE License.libavif.txt
|
||||
- copy %LIBEXIV2%\exiv2-%EXIV2_VERSION%\COPYING License.exiv2.txt
|
||||
# TODO: Qt, zlib
|
||||
- cd ..
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
IDI_ICON1 ICON DISCARDABLE "icons/app-icon.ico"
|
||||
1 VERSIONINFO
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "FileDescription", "Pineapple Pictures - Image Viewer"
|
||||
VALUE "LegalCopyright", "MIT/Expat License - Copyright (C) 2024 Gary Wang"
|
||||
VALUE "ProductName", "Pineapple Pictures"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
IDI_ICON1 ICON DISCARDABLE "@CMAKE_CURRENT_SOURCE_DIR@/assets/icons/app-icon.ico"
|
||||
1 VERSIONINFO
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "FileDescription", "Pineapple Pictures - Image Viewer"
|
||||
VALUE "LegalCopyright", "MIT/Expat License - Copyright (C) 2026 Gary Wang"
|
||||
VALUE "ProductName", "Pineapple Pictures"
|
||||
VALUE "ProductVersion", "@PROJECT_VERSION@"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
@@ -12,8 +12,10 @@
|
||||
<li><u>Punjabi (Pakistan)</u>: bgo-eiu</li>
|
||||
<li><u>Russian</u>: Sergey Shornikov, Artem, Andrey</li>
|
||||
<li><u>Sinhala</u>: HelaBasa</li>
|
||||
<li><u>Slovenian</u>: Andrej Poženel - SDT</li>
|
||||
<li><u>Spanish</u>: Toni Estévez, Génesis Toxical, William(ѕ)ⁿ, gallegonovato</li>
|
||||
<li><u>Tamil</u>: தமிழ்நேரம் (TamilNeram)</li>
|
||||
<li><u>Turkish</u>: E-Akcaer, Oğuz Ersen, Sabri Ünal</li>
|
||||
<li><u>Ukrainian</u>: Dan, volkov, Сергій</li>
|
||||
<li><u>Vietnamese</u>: Loc Huynh</li>
|
||||
</ul>
|
||||
|
||||
272
dist/MacOSXBundleInfo.plist.in
vendored
272
dist/MacOSXBundleInfo.plist.in
vendored
@@ -1,136 +1,136 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleLongVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||
<key>CSResourcesFileMapped</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||
<!-- FIXME: this list can't be automatically generated by Qt's CMake API, don't know why. -->
|
||||
<key>CFBundleLocalizations</key>
|
||||
<array>
|
||||
<string>en</string>
|
||||
<string>ca</string>
|
||||
<string>de</string>
|
||||
<string>es</string>
|
||||
<string>fr</string>
|
||||
<string>id</string>
|
||||
<string>it</string>
|
||||
<string>ja</string>
|
||||
<string>ko</string>
|
||||
<string>nb_NO</string>
|
||||
<string>nl</string>
|
||||
<string>pa_PK</string>
|
||||
<string>ru</string>
|
||||
<string>si</string>
|
||||
<string>ta</string>
|
||||
<string>tr</string>
|
||||
<string>uk</string>
|
||||
<string>zh_CN</string>
|
||||
</array>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<!-- JPEG -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>JPEG Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>jpg</string>
|
||||
<string>jpeg</string>
|
||||
<string>jfif</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/jpeg</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- PNG -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>PNG Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>png</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/png</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- WebP -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>WebP Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>webp</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/webp</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- GIF -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>GIF Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>gif</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/gif</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- SVG -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>SVG Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>svg</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/svg+xml</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleLongVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||
<key>CSResourcesFileMapped</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||
<!-- FIXME: this list can't be automatically generated by Qt's CMake API, don't know why. -->
|
||||
<key>CFBundleLocalizations</key>
|
||||
<array>
|
||||
<string>en</string>
|
||||
<string>ca</string>
|
||||
<string>de</string>
|
||||
<string>es</string>
|
||||
<string>fr</string>
|
||||
<string>id</string>
|
||||
<string>it</string>
|
||||
<string>ja</string>
|
||||
<string>ko</string>
|
||||
<string>nb_NO</string>
|
||||
<string>nl</string>
|
||||
<string>pa_PK</string>
|
||||
<string>ru</string>
|
||||
<string>si</string>
|
||||
<string>ta</string>
|
||||
<string>tr</string>
|
||||
<string>uk</string>
|
||||
<string>zh_CN</string>
|
||||
</array>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<!-- JPEG -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>JPEG Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>jpg</string>
|
||||
<string>jpeg</string>
|
||||
<string>jfif</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/jpeg</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- PNG -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>PNG Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>png</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/png</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- WebP -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>WebP Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>webp</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/webp</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- GIF -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>GIF Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>gif</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/gif</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
<!-- SVG -->
|
||||
<dict>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>SVG Image</string>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>svg</string>
|
||||
</array>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>image/svg+xml</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -4,18 +4,26 @@
|
||||
<name>Pineapple Pictures</name>
|
||||
<name xml:lang="es">Pineapple Pictures</name>
|
||||
<name xml:lang="ja">Pineapple Pictures</name>
|
||||
<name xml:lang="ko">Pineapple Pictures</name>
|
||||
<name xml:lang="nl">Pineapple Afbeeldingen</name>
|
||||
<name xml:lang="ru">Pineapple Pictures</name>
|
||||
<name xml:lang="sl">Pineapple Slike</name>
|
||||
<name xml:lang="ta">அன்னாசி படங்கள்</name>
|
||||
<name xml:lang="tr">Pineapple Resimler</name>
|
||||
<name xml:lang="uk">Pineapple Pictures</name>
|
||||
<name xml:lang="vi">Pineapple Pictures</name>
|
||||
<name xml:lang="zh-CN">菠萝看图</name>
|
||||
<summary>Image Viewer</summary>
|
||||
<summary xml:lang="es">Visor de imágenes</summary>
|
||||
<summary xml:lang="ja">画像ビューアー</summary>
|
||||
<summary xml:lang="ko">이미지 뷰어</summary>
|
||||
<summary xml:lang="nl">Afbeeldingsweergave</summary>
|
||||
<summary xml:lang="ru">Просмотр изображений</summary>
|
||||
<summary xml:lang="sl">Pregledovalnik slik</summary>
|
||||
<summary xml:lang="ta">பட பார்வையாளர்</summary>
|
||||
<summary xml:lang="tr">Resim Görüntüleyici</summary>
|
||||
<summary xml:lang="uk">Переглядач зображень</summary>
|
||||
<summary xml:lang="vi">Trình xem ảnh</summary>
|
||||
<summary xml:lang="zh-CN">图像查看器</summary>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>MIT</project_license>
|
||||
@@ -23,10 +31,13 @@
|
||||
<p>Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support.</p>
|
||||
<p xml:lang="es">Pineapple Pictures es un visor de imágenes ligero y fácil de usar que viene con una práctica miniatura de navegación al hacer zoom, y no contiene ningún soporte de gestión de imágenes.</p>
|
||||
<p xml:lang="ja">Pineapple Picturesは、ズームイン時に便利なナビゲーションサムネイルを備えた軽量で使いやすい画像ビューアです。画像管理のサポートは含まれていません。</p>
|
||||
<p xml:lang="ko">Pineapple Pictures는 가볍고 사용하기 쉬운 이미지 뷰어로, 확대 시 편리한 내비게이션 썸네일과 함께 제공되며 이미지 관리 지원이 포함되어 있지 않습니다.</p>
|
||||
<p xml:lang="nl">Pineapple Afbeeldingen is een licht en eenvoudig te gebruiken afbeeldingsweergaveprogramma met miniatuurnavigatie na inzoomen. Het programma heeft echter geen fotobeheermogelijkheid.</p>
|
||||
<p xml:lang="ru">Pineapple Pictures - это легкий и простой в использовании просмотрщик изображений, оснащенный удобной навигацией по миниатюрам при увеличении масштаба и не содержащий никакой поддержки управления изображениями.</p>
|
||||
<p xml:lang="sl">Pineapple Pictures je lahek in enostaven pregledovalnik slik, ki ima pri povečavi priročno sličico za navigacijo in ne vsebuje nobene podpore za upravljanje slik.</p>
|
||||
<p xml:lang="ta">அன்னாசி படங்கள் ஒரு இலகுரக மற்றும் பயன்படுத்த எளிதான பட பார்வையாளராகும், இது பெரிதாக்கும்போது ஒரு எளிமையான வழிசெலுத்தல் சிறுபடத்துடன் வருகிறது, மேலும் எந்த பட மேலாண்மை ஆதரவையும் கொண்டிருக்கவில்லை.</p>
|
||||
<p xml:lang="uk">Pineapple Pictures – це легкий і простий у використанні переглядач зображень, який постачається зі зручною навігаційною мініатюрою при збільшенні масштабу і не містить жодної підтримки керування зображеннями.</p>
|
||||
<p xml:lang="vi">Pineapple Pictures là trình xem hình ảnh nhẹ và dễ sử dụng, đi kèm với hình thu nhỏ điều hướng tiện dụng khi phóng to và không chứa bất kỳ hỗ trợ quản lý hình ảnh nào.</p>
|
||||
<p xml:lang="zh-CN">菠萝看图是一个轻量级易用的图像查看器,在图片放大时提供了方便的鸟瞰导航功能,且不包含任何图片管理功能。</p>
|
||||
</description>
|
||||
<developer id="net.blumia">
|
||||
@@ -40,6 +51,7 @@
|
||||
<launchable type="desktop-id">net.blumia.pineapple-pictures.desktop</launchable>
|
||||
<url type="homepage">https://github.com/BLumia/pineapple-pictures</url>
|
||||
<url type="bugtracker">https://github.com/BLumia/pineapple-pictures/issues</url>
|
||||
<url type="donation">https://ko-fi.com/blumia</url>
|
||||
<url type="translate">https://hosted.weblate.org/projects/pineapple-pictures/</url>
|
||||
<provides>
|
||||
<binary>ppic</binary>
|
||||
@@ -49,10 +61,13 @@
|
||||
<caption>Main window when an image file is loaded</caption>
|
||||
<caption xml:lang="es">Ventana principal cuando se carga un archivo de imagen</caption>
|
||||
<caption xml:lang="ja">画像ファイル読み込み時のメインウィンドウ</caption>
|
||||
<caption xml:lang="ko">이미지 파일이 로드될 때 기본 창</caption>
|
||||
<caption xml:lang="nl">Hoofdvenster na het laden van een afbeelding</caption>
|
||||
<caption xml:lang="ru">Основное окно после загрузки файла изображения</caption>
|
||||
<caption xml:lang="sl">Glavno okno ob nalaganju slikovne datoteke</caption>
|
||||
<caption xml:lang="ta">ஒரு படக் கோப்பு ஏற்றப்படும் போது முதன்மையான சாளரம்</caption>
|
||||
<caption xml:lang="uk">Головне вікно після завантаження файлу зображення</caption>
|
||||
<caption xml:lang="vi">Cửa sổ chính khi tải tệp hình ảnh</caption>
|
||||
<caption xml:lang="zh-CN">加载图片后的主窗口</caption>
|
||||
<image type="source" width="1503" height="640">https://pineapple-pictures.sourceforge.io/ppic-gui-static.png</image>
|
||||
</screenshot>
|
||||
@@ -60,10 +75,13 @@
|
||||
<caption>Zooming in a raster image</caption>
|
||||
<caption xml:lang="es">Ampliar una imagen rasterizada</caption>
|
||||
<caption xml:lang="ja">ラスター画像の拡大</caption>
|
||||
<caption xml:lang="ko">래스터 이미지 확대하기</caption>
|
||||
<caption xml:lang="nl">Inzoomen op een roosterafbeelding</caption>
|
||||
<caption xml:lang="ru">Масштабирование растрового изображения</caption>
|
||||
<caption xml:lang="sl">Povečevanje rastrske slike</caption>
|
||||
<caption xml:lang="ta">ராச்டர் படத்தில் பெரிதாக்குதல்</caption>
|
||||
<caption xml:lang="uk">Масштабування растрового зображення</caption>
|
||||
<caption xml:lang="vi">Phóng to hình ảnh raster</caption>
|
||||
<caption xml:lang="zh-CN">放大浏览位图</caption>
|
||||
<image type="source" width="771" height="553">https://pineapple-pictures.sourceforge.io/ppic-zoom-raster.png</image>
|
||||
</screenshot>
|
||||
@@ -71,15 +89,120 @@
|
||||
<caption>Zooming in a vector image</caption>
|
||||
<caption xml:lang="es">Ampliar una imagen vectorial</caption>
|
||||
<caption xml:lang="ja">ベクター画像の拡大</caption>
|
||||
<caption xml:lang="ko">벡터 이미지 확대하기</caption>
|
||||
<caption xml:lang="nl">Inzoomen op een vectorafbeelding</caption>
|
||||
<caption xml:lang="ru">Масштабирование векторного изображения</caption>
|
||||
<caption xml:lang="sl">Povečevanje vektorske slike</caption>
|
||||
<caption xml:lang="ta">ஒரு திசையன் படத்தில் பெரிதாக்குதல்</caption>
|
||||
<caption xml:lang="uk">Масштабування векторного зображення</caption>
|
||||
<caption xml:lang="vi">Phóng to hình ảnh vector</caption>
|
||||
<caption xml:lang="zh-CN">放大浏览矢量图</caption>
|
||||
<image type="source" width="771" height="553">https://pineapple-pictures.sourceforge.io/ppic-zoom-svg.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release type="stable" version="1.4.1" date="2026-04-05T00:00:00Z">
|
||||
<description>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Update Qt version to 6.10.3 for Windows and macOS pre-built binaries</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels (vistaus), Loc Huynh (hthienloc)</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.4.0" date="2026-02-11T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>Action to save image as new file with different format</li>
|
||||
<li>Add Vietnamese and Slovenian translation</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update copyright year to 2026</li>
|
||||
<li>Update translations</li>
|
||||
<li>Update Qt version to 6.10.2 for Windows and macOS pre-built binaries</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Loc Huynh, Sabri Ünal, VenusGirl, Andrej Poženel, Andrey</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.3.0" date="2025-12-20T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>New option to limit SVG support to SVG Tiny 1.2 standard</li>
|
||||
<li>Windows: ship tools and configurations that help user associate image files to this program</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bugs:</p>
|
||||
<ul>
|
||||
<li>Fix window not appear at the screen that the mouse cursor is at</li>
|
||||
<li>Fix Windows prebuilt binary having AVIF plugin included but not actually support it</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>CPack DEB: will now recommend "kimageformat6-plugins" instead of the KF5 version</li>
|
||||
<li>Update translations</li>
|
||||
<li>Update exiv2 version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>VenusGirl, Andrey</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.2.1" date="2025-11-22T00:00:00Z">
|
||||
<description>
|
||||
<p>This release fixes the following bug:</p>
|
||||
<ul>
|
||||
<li>Fix incorrect color when display some CMYK images.</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Now use Qt 6.10.1 for pre-built binary</li>
|
||||
<li>Update README description and AppStream metainfo</li>
|
||||
<li>Update translations</li>
|
||||
<li>Update libavif, AOM and expat version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>albanobattistella</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.2.0" date="2025-09-21T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>Long image mode that detect extra wide image and auto fit by its thin side</li>
|
||||
<li>Windows: Add product version to binary metadata / resource file</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Update libavif version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels, albanobattistella, Sabri Ünal</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.1.1" date="2025-08-02T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following feature:</p>
|
||||
<ul>
|
||||
<li>Click dock icon should show window when it's hidden on macOS</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bug:</p>
|
||||
<ul>
|
||||
<li>Ensure "Fit by Width" position the view to the beginning of the image</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Update Exiv2 version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels, VenusGirl, தமிழ்நேரம்</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.1.0" date="2025-07-06T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ca.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ca.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.de.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.de.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.fr.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.fr.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.id.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.id.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: id\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.it.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.it.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
51
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ko.po
vendored
Normal file
51
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ko.po
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2025-12-27 02:00+0000\n"
|
||||
"Last-Translator: Gary Wang <wzc782970009@gmail.com>\n"
|
||||
"Language-Team: Korean <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/ko/>\n"
|
||||
"Language: ko\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr "Pineapple Pictures"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "이미지 뷰어"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
"Pineapple Pictures는 가볍고 사용하기 쉬운 이미지 뷰어로, 확대 시 편리한 내비"
|
||||
"게이션 썸네일과 함께 제공되며 이미지 관리 지원이 포함되어 있지 않습니다."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr "이미지 파일이 로드될 때 기본 창"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr "래스터 이미지 확대하기"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr "벡터 이미지 확대하기"
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang 외"
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.nb_NO.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.nb_NO.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: nb_NO\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.pa_PK.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.pa_PK.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: pa_PK\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.si.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.si.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: si\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
53
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.sl.po
vendored
Normal file
53
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.sl.po
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2026-01-25 01:53+0000\n"
|
||||
"Last-Translator: Andrej Poženel - SDT <anderlli0053@live.com>\n"
|
||||
"Language-Team: Slovenian <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/sl/>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
|
||||
"n%100==4 ? 2 : 3;\n"
|
||||
"X-Generator: Weblate 5.16-dev\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr "Pineapple Slike"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "Pregledovalnik slik"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
"Pineapple Pictures je lahek in enostaven pregledovalnik slik, ki ima pri "
|
||||
"povečavi priročno sličico za navigacijo in ne vsebuje nobene podpore za "
|
||||
"upravljanje slik."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr "Glavno okno ob nalaganju slikovne datoteke"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr "Povečevanje rastrske slike"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr "Povečevanje vektorske slike"
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
49
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.tr.po
vendored
Normal file
49
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.tr.po
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2025-12-20 20:00+0000\n"
|
||||
"Last-Translator: Sabri Ünal <yakushabb@gmail.com>\n"
|
||||
"Language-Team: Turkish <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/tr/>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr "Pineapple Resimler"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "Resim Görüntüleyici"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
52
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.vi.po
vendored
Normal file
52
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.vi.po
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2025-12-25 17:00+0000\n"
|
||||
"Last-Translator: Loc Huynh <huynhloc.contact@gmail.com>\n"
|
||||
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/vi/>\n"
|
||||
"Language: vi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr "Pineapple Pictures"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "Trình xem ảnh"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
"Pineapple Pictures là trình xem hình ảnh nhẹ và dễ sử dụng, đi kèm với hình "
|
||||
"thu nhỏ điều hướng tiện dụng khi phóng to và không chứa bất kỳ hỗ trợ quản "
|
||||
"lý hình ảnh nào."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr "Cửa sổ chính khi tải tệp hình ảnh"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr "Phóng to hình ảnh raster"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr "Phóng to hình ảnh vector"
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
BIN
dist/passoc/generic.ico
vendored
Normal file
BIN
dist/passoc/generic.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
BIN
dist/passoc/gif.ico
vendored
Normal file
BIN
dist/passoc/gif.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/passoc/jpeg.ico
vendored
Normal file
BIN
dist/passoc/jpeg.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/passoc/png.ico
vendored
Normal file
BIN
dist/passoc/png.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
118
dist/passoc/ppic.pacfg
vendored
Normal file
118
dist/passoc/ppic.pacfg
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
targetApp=ppic.exe
|
||||
friendlyAppName=Pineapple Pictures
|
||||
friendlyAppName[zh_CN]=菠萝看图
|
||||
openCommand="\"{targetAppFullPath}\" \"%1\""
|
||||
|
||||
[ProgId/jpeg]
|
||||
name=JPEG Image
|
||||
name[zh_CN]=JPEG 图像
|
||||
extensions=jpg,jpeg,jfif
|
||||
|
||||
[ProgId/gif]
|
||||
name=GIF Animation Image
|
||||
name[zh_CN]=GIF 动图
|
||||
|
||||
[ProgId/png]
|
||||
name=PNG Image
|
||||
name[zh_CN]=PNG 图像
|
||||
|
||||
[ProgId/svg]
|
||||
name=Scalable Vector Graphics
|
||||
name[zh_CN]=可缩放矢量图像
|
||||
|
||||
[ProgId/webp]
|
||||
name=WebP Image
|
||||
name[zh_CN]=WebP 图像
|
||||
extensions=webp
|
||||
|
||||
[ProgId/avif]
|
||||
name=AV1 Image File
|
||||
name[zh_CN]=AV1 图像文件
|
||||
|
||||
[ProgId/ico]
|
||||
name=Windows Icon Image
|
||||
name[zh_CN]=Windows 图标图像
|
||||
|
||||
[ProgId/icns]
|
||||
name=Apple Icon Image
|
||||
name[zh_CN]=苹果图标图像
|
||||
|
||||
[ProgId/psd]
|
||||
name=Photoshop Document
|
||||
name[zh_CN]=Photoshop 文档
|
||||
extensions=psd,psb,pdd,psdt
|
||||
|
||||
[ProgId/kra]
|
||||
name=Krita Document
|
||||
name[zh_CN]=Krita 文档
|
||||
|
||||
[ProgId/xcf]
|
||||
name=GIMP Document
|
||||
name[zh_CN]=GIMP 文档
|
||||
|
||||
[ProgId/tga]
|
||||
name=TARGA Image
|
||||
name[zh_CN]=TARGA 图像
|
||||
|
||||
[ProgId/tif]
|
||||
name=Tagged Image File Format
|
||||
name[zh_CN]=标签图像文件格式
|
||||
extensions=tif,tiff
|
||||
|
||||
[ProgId/bmp]
|
||||
name=Bitmap
|
||||
name[zh_CN]=位图
|
||||
|
||||
[ProgId/wbmp]
|
||||
name=Wireless Bitmap
|
||||
name[zh_CN]=无线位图
|
||||
|
||||
[ProgId/dds]
|
||||
name=DirectDraw Surface
|
||||
|
||||
[ProgId/hdr]
|
||||
name=High Dynamic Range Image
|
||||
name[zh_CN]=高动态范围图像
|
||||
|
||||
[ProgId/iff]
|
||||
name=Interchange File Format
|
||||
name[zh_CN]=可交换文件格式
|
||||
|
||||
[ProgId/pic]
|
||||
name=Softimage Picture
|
||||
name[zh_CN]=Softimage 图像
|
||||
|
||||
[ProgId/pcx]
|
||||
name=PiCture eXchange PC Paintbrush Image
|
||||
name[zh_CN]=PC Paintbrush 图像
|
||||
|
||||
[ProgId/qoi]
|
||||
name=Quite OK Image
|
||||
name[zh_CN]=挺 OK 图像
|
||||
|
||||
[ProgId/ras]
|
||||
name=Sun Raster Image
|
||||
name[zh_CN]=Sun 栅格图象
|
||||
extensions=ras,sun
|
||||
|
||||
[ProgId/ora]
|
||||
name=OpenRaster Image
|
||||
name[zh_CN]=OpenRaster 图象
|
||||
|
||||
[ProgId/ani]
|
||||
name=Animated Cursor
|
||||
name[zh_CN]=动态光标
|
||||
|
||||
[ProgId/pfm]
|
||||
name=Portable Float Map
|
||||
extensions=pfm,phm
|
||||
|
||||
[ProgId/rgb]
|
||||
name=Silicon Graphics Image
|
||||
extensions=rgb,rgba,bw,sgi
|
||||
|
||||
[ProgId/pxr]
|
||||
name=Pixar Raster Image
|
||||
|
||||
[ProgId/sct]
|
||||
name=Scitex Continuous Tone
|
||||
BIN
dist/passoc/psd.ico
vendored
Normal file
BIN
dist/passoc/psd.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/passoc/svg.ico
vendored
Normal file
BIN
dist/passoc/svg.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
@@ -1,101 +1,101 @@
|
||||
# SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
QT += core widgets gui svg svgwidgets
|
||||
|
||||
TARGET = ppic
|
||||
TEMPLATE = app
|
||||
DEFINES += PPIC_VERSION_STRING=\\\"x.y.z\\\"
|
||||
|
||||
win32 {
|
||||
DEFINES += FLAG_PORTABLE_MODE_SUPPORT=1
|
||||
}
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
CONFIG += c++17 lrelease embed_translations
|
||||
|
||||
SOURCES += \
|
||||
app/aboutdialog.cpp \
|
||||
app/main.cpp \
|
||||
app/framelesswindow.cpp \
|
||||
app/mainwindow.cpp \
|
||||
app/graphicsview.cpp \
|
||||
app/bottombuttongroup.cpp \
|
||||
app/graphicsscene.cpp \
|
||||
app/navigatorview.cpp \
|
||||
app/opacityhelper.cpp \
|
||||
app/toolbutton.cpp \
|
||||
app/settings.cpp \
|
||||
app/settingsdialog.cpp \
|
||||
app/metadatamodel.cpp \
|
||||
app/metadatadialog.cpp \
|
||||
app/exiv2wrapper.cpp \
|
||||
app/actionmanager.cpp \
|
||||
app/playlistmanager.cpp \
|
||||
app/shortcutedit.cpp \
|
||||
app/fileopeneventhandler.cpp
|
||||
|
||||
HEADERS += \
|
||||
app/aboutdialog.h \
|
||||
app/framelesswindow.h \
|
||||
app/mainwindow.h \
|
||||
app/graphicsview.h \
|
||||
app/bottombuttongroup.h \
|
||||
app/graphicsscene.h \
|
||||
app/navigatorview.h \
|
||||
app/opacityhelper.h \
|
||||
app/toolbutton.h \
|
||||
app/settings.h \
|
||||
app/settingsdialog.h \
|
||||
app/metadatamodel.h \
|
||||
app/metadatadialog.h \
|
||||
app/exiv2wrapper.h \
|
||||
app/actionmanager.h \
|
||||
app/playlistmanager.h \
|
||||
app/shortcutedit.h \
|
||||
app/fileopeneventhandler.h
|
||||
|
||||
TRANSLATIONS = \
|
||||
app/translations/PineapplePictures_en.ts \
|
||||
app/translations/PineapplePictures_zh_CN.ts \
|
||||
app/translations/PineapplePictures_de.ts \
|
||||
app/translations/PineapplePictures_es.ts \
|
||||
app/translations/PineapplePictures_fr.ts \
|
||||
app/translations/PineapplePictures_nb_NO.ts \
|
||||
app/translations/PineapplePictures_nl.ts \
|
||||
app/translations/PineapplePictures_ru.ts \
|
||||
app/translations/PineapplePictures_si.ts \
|
||||
app/translations/PineapplePictures_id.ts
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
RESOURCES += \
|
||||
assets/resources.qrc
|
||||
|
||||
# Generate from svg:
|
||||
# magick convert -density 512x512 -background none app-icon.svg -define icon:auto-resize app-icon.ico
|
||||
RC_ICONS = assets/icons/app-icon.ico
|
||||
|
||||
# Windows only, for rc file (we're not going to use the .rc file in this repo)
|
||||
QMAKE_TARGET_PRODUCT = Pineapple Pictures
|
||||
QMAKE_TARGET_DESCRIPTION = Pineapple Pictures - Image Viewer
|
||||
QMAKE_TARGET_COPYRIGHT = MIT/Expat License - Copyright (C) 2024 Gary Wang
|
||||
|
||||
# MSVC only, since QMake doesn't have a CMAKE_CXX_STANDARD_LIBRARIES or cpp_winlibs similar thing
|
||||
win32-msvc* {
|
||||
LIBS += -luser32
|
||||
}
|
||||
# SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
QT += core widgets gui svg svgwidgets
|
||||
|
||||
TARGET = ppic
|
||||
TEMPLATE = app
|
||||
DEFINES += PPIC_VERSION_STRING=\\\"x.y.z\\\"
|
||||
|
||||
win32 {
|
||||
DEFINES += FLAG_PORTABLE_MODE_SUPPORT=1
|
||||
}
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
CONFIG += c++17 lrelease embed_translations
|
||||
|
||||
SOURCES += \
|
||||
app/aboutdialog.cpp \
|
||||
app/main.cpp \
|
||||
app/framelesswindow.cpp \
|
||||
app/mainwindow.cpp \
|
||||
app/graphicsview.cpp \
|
||||
app/bottombuttongroup.cpp \
|
||||
app/graphicsscene.cpp \
|
||||
app/navigatorview.cpp \
|
||||
app/opacityhelper.cpp \
|
||||
app/toolbutton.cpp \
|
||||
app/settings.cpp \
|
||||
app/settingsdialog.cpp \
|
||||
app/metadatamodel.cpp \
|
||||
app/metadatadialog.cpp \
|
||||
app/exiv2wrapper.cpp \
|
||||
app/actionmanager.cpp \
|
||||
app/playlistmanager.cpp \
|
||||
app/shortcutedit.cpp \
|
||||
app/fileopeneventhandler.cpp
|
||||
|
||||
HEADERS += \
|
||||
app/aboutdialog.h \
|
||||
app/framelesswindow.h \
|
||||
app/mainwindow.h \
|
||||
app/graphicsview.h \
|
||||
app/bottombuttongroup.h \
|
||||
app/graphicsscene.h \
|
||||
app/navigatorview.h \
|
||||
app/opacityhelper.h \
|
||||
app/toolbutton.h \
|
||||
app/settings.h \
|
||||
app/settingsdialog.h \
|
||||
app/metadatamodel.h \
|
||||
app/metadatadialog.h \
|
||||
app/exiv2wrapper.h \
|
||||
app/actionmanager.h \
|
||||
app/playlistmanager.h \
|
||||
app/shortcutedit.h \
|
||||
app/fileopeneventhandler.h
|
||||
|
||||
TRANSLATIONS = \
|
||||
app/translations/PineapplePictures_en.ts \
|
||||
app/translations/PineapplePictures_zh_CN.ts \
|
||||
app/translations/PineapplePictures_de.ts \
|
||||
app/translations/PineapplePictures_es.ts \
|
||||
app/translations/PineapplePictures_fr.ts \
|
||||
app/translations/PineapplePictures_nb_NO.ts \
|
||||
app/translations/PineapplePictures_nl.ts \
|
||||
app/translations/PineapplePictures_ru.ts \
|
||||
app/translations/PineapplePictures_si.ts \
|
||||
app/translations/PineapplePictures_id.ts
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
RESOURCES += \
|
||||
assets/resources.qrc
|
||||
|
||||
# Generate from svg:
|
||||
# magick -density 512x512 -background none app-icon.svg -define icon:auto-resize app-icon.ico
|
||||
RC_ICONS = assets/icons/app-icon.ico
|
||||
|
||||
# Windows only, for rc file (we're not going to use the .rc file in this repo)
|
||||
QMAKE_TARGET_PRODUCT = Pineapple Pictures
|
||||
QMAKE_TARGET_DESCRIPTION = Pineapple Pictures - Image Viewer
|
||||
QMAKE_TARGET_COPYRIGHT = MIT/Expat License - Copyright (C) 2024 Gary Wang
|
||||
|
||||
# MSVC only, since QMake doesn't have a CMAKE_CXX_STANDARD_LIBRARIES or cpp_winlibs similar thing
|
||||
win32-msvc* {
|
||||
LIBS += -luser32
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user