45 Commits

Author SHA1 Message Date
e92ccb0986 Revert "feat: fit by width"
This reverts commit 038d04b3da.
2021-05-29 11:00:47 +08:00
3e51cd5603 fix(CI): QT_PLUGIN_INSTALL_DIR is deprecated, use KDE_INSTALL_QTPLUGINDIR instead 2021-05-29 10:44:12 +08:00
71e8df3107 fix: memory leak when switching between animated image files 2021-05-21 00:06:37 +08:00
8b86fb1434 fix: use metainfo.xml suffix instead of appdata.xml
resolve: GH-30
2021-05-19 01:11:41 +08:00
038d04b3da feat: fit by width
Signed-off-by: Gary Wang <wzc782970009@gmail.com>
2021-05-14 00:10:08 +08:00
69802a433e fix: navigator view not get updated in some edge case
Signed-off-by: Gary Wang <wzc782970009@gmail.com>
2021-05-12 13:55:04 +08:00
e4d54e85e2 Update README.md 2021-05-01 09:58:26 +08:00
b12328f41e Translations update from Weblate (#29)
* Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.9% (110 of 121 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nb_NO/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (121 of 121 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nl/

* Translated using Weblate (Russian)

Currently translated at 100.0% (121 of 121 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@fastmail.com>
Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
2021-04-29 00:00:58 +08:00
6acafc77b4 feat: add exif copyright info and gif frame count to property dialog
also fix some letter case issue in original copywriting.
2021-04-17 00:50:59 +08:00
fa4b49ddf7 Translations update from Weblate (#27)
* Translated using Weblate (Norwegian Bokmål)

Currently translated at 91.4% (107 of 117 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nb_NO/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (117 of 117 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nl/

* Translated using Weblate (Russian)

Currently translated at 100.0% (117 of 117 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (117 of 117 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Heimen Stoffels <vistausss@outlook.com>
Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
2021-04-17 00:12:18 +08:00
8ae93ac4ae fix: should show any animated image than just gif 2021-04-15 00:00:18 +08:00
52a7883dbf ci(build): use the install/strip target instead of CMAKE_CXX_FLAGS_RELEASE 2021-04-08 13:18:02 +08:00
8c05969c18 fix: get rid of wrong tr() usage 2021-04-06 22:11:09 +08:00
8d80f263b0 feat: add default shortcuts for some actions 2021-04-05 23:21:15 +08:00
114e7359cd misc: don't call parent method since we don't need 2021-04-04 11:17:44 +08:00
622938ac23 fix: always rotate according to current viewport state 2021-03-29 22:43:37 +08:00
e1324d901c fix: always flip according to current viewport state 2021-03-27 22:22:04 +08:00
483bb07b09 chore: keep flipping state while rotation and etc. 2021-03-25 23:05:50 +08:00
cd94f1a84c ci(windows): switch to x64 build 2021-03-21 01:19:13 +08:00
6a9e5e80d0 feat: basic image flip support 2021-03-19 23:13:22 +08:00
deed477d49 fix(build): build with qmake
...and also fix missing translation strings caused by broken qmake
project file.
2021-03-14 01:12:28 +08:00
a98b69eb6c Update README.md 2021-03-13 14:53:31 +08:00
f7cc22a032 i18n: update ts files, restructure folder hierarchy 2021-03-13 14:50:53 +08:00
05f808a26d Translations update from Weblate (#26)
* Translated using Weblate (Russian)

Currently translated at 100.0% (116 of 116 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 92.2% (107 of 116 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nb_NO/

* Added translation using Weblate (Sinhala)

* Translated using Weblate (Sinhala)

Currently translated at 1.7% (2 of 116 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/si/

* Translated using Weblate (Sinhala)

Currently translated at 56.0% (65 of 116 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/si/

Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: HelaBasa <R45XvezA@protonmail.ch>
2021-03-13 14:09:30 +08:00
7e7c36ea72 ci(mac): build with 5.15.2 explicitly 2021-03-09 21:41:51 +08:00
6d460a27d7 fix: build with lower Qt version 2021-03-01 13:24:03 +08:00
552d0fe072 fix: compat for older Qt (lower than 5.13) 2021-03-01 13:11:17 +08:00
b146150528 feat: Shift+Click to use color-inverted checkerboard 2021-03-01 00:44:50 +08:00
aecc3cf163 i18n: update ts files 2021-02-26 01:01:24 +08:00
9c460f2ede chore: add webp to default image queue filter list 2021-02-26 00:57:12 +08:00
6316431dcc i18n: update translator list and AppStream copywriting 2021-02-26 00:32:41 +08:00
713057412f Translations update from Weblate (#24)
* Translated using Weblate (Russian)

Currently translated at 100.0% (114 of 114 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

* Added translation using Weblate (Dutch)

* Translated using Weblate (Dutch)

Currently translated at 100.0% (114 of 114 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nl/

Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
Co-authored-by: Heimen Stoffels <vistausss@outlook.com>
2021-02-26 00:13:23 +08:00
7a69bb2fa2 partially revert 50170eb for the maximize shortcut on Windows
Since the workaround actually doesn't work, so we
remain the old behavior unchanged.
2021-02-19 19:22:50 +08:00
50170eb4aa feat: shortcuts for zoom in and out
This also fix maximize shortcut on Windows.
2021-02-19 00:04:15 +08:00
858c9e0ccf chore: add max zoom-in scale limit (1000x) 2021-02-18 20:03:23 +08:00
2b4bbc91a7 fix: should now be able to show property dialog for all supported files 2021-02-09 14:19:09 +08:00
2b51194143 i18n: update translator list 2021-02-04 13:13:55 +08:00
356fc6f670 Translations update from Weblate (#23)
* Added translation using Weblate (Japanese)

* Translated using Weblate (Russian)

Currently translated at 100.0% (114 of 114 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 92.1% (105 of 114 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/nb_NO/

* Deleted translation using Weblate (Japanese)

Co-authored-by: Gary Wang <wzc782970009@gmail.com>
Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2021-02-04 13:00:10 +08:00
a9ce8b0154 fix: add missing return for canPaste check 2021-01-24 00:47:42 +08:00
1449844fdd fix: avoid create menu actions everytime when trigger context menu.
fix the minor memory leak issue, also bring some possibility to
implement custom keybinding.

And oops I also did another feature in this commit..
Now we are able to set mouse wheel behavior in config dialog.
2021-01-24 00:07:58 +08:00
b3011f47e4 Translations update from Weblate (#22)
* Translated using Weblate (French)

Currently translated at 100.0% (111 of 111 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/fr/

* Translated using Weblate (German)

Currently translated at 97.2% (108 of 111 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/de/

* Translated using Weblate (Russian)

Currently translated at 100.0% (111 of 111 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
2021-01-20 00:15:51 +08:00
9b1b125d01 fix: also move the windows include for windows build 2021-01-10 15:23:49 +08:00
6d8f353602 fix: some clazy checks 2021-01-10 14:57:01 +08:00
4d8d98b2ff feat: display some GPS information from EXIF metadata 2021-01-04 19:06:12 +08:00
e658fb20a9 Translations update from Weblate (#18)
* Added translation using Weblate (Spanish)

* Translated using Weblate (Spanish)

Currently translated at 17.1% (18 of 105 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/es/

* Translated using Weblate (French)

Currently translated at 100.0% (105 of 105 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/fr/

* Translated using Weblate (German)

Currently translated at 100.0% (105 of 105 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/de/

* Translated using Weblate (Russian)

Currently translated at 100.0% (105 of 105 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/ru/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (105 of 105 strings)

Translation: pineapple-pictures/Application
Translate-URL: https://hosted.weblate.org/projects/pineapple-pictures/application/zh_Hans/

Co-authored-by: William(ѕ)ⁿ <600699d5-d2ad-4cfc-a1b3-fca4d102afea@anonaddy.me>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Sergey Shornikov <sergey0000000000@gmail.com>
Co-authored-by: Percy Hong <doraemonworldx@gmail.com>
2021-01-04 18:57:04 +08:00
38 changed files with 4547 additions and 1591 deletions

View File

@ -10,7 +10,9 @@ jobs:
steps:
- uses: actions/checkout@v1
- name: Install Qt
uses: jurplel/install-qt-action@v2.10.0
uses: jurplel/install-qt-action@v2
with:
version: '5.15.2'
- name: Run a qt project
run: |
cmake ./

View File

@ -30,6 +30,7 @@ set (PPIC_CPP_FILES
app/main.cpp
app/framelesswindow.cpp
app/mainwindow.cpp
app/actionmanager.cpp
app/graphicsview.cpp
app/graphicsscene.cpp
app/bottombuttongroup.cpp
@ -42,11 +43,13 @@ set (PPIC_CPP_FILES
app/metadatamodel.cpp
app/metadatadialog.cpp
app/exiv2wrapper.cpp
app/playlistmanager.cpp
)
set (PPIC_HEADER_FILES
app/framelesswindow.h
app/mainwindow.h
app/actionmanager.h
app/graphicsview.h
app/graphicsscene.h
app/bottombuttongroup.h
@ -59,6 +62,7 @@ set (PPIC_HEADER_FILES
app/metadatamodel.h
app/metadatadialog.h
app/exiv2wrapper.h
app/playlistmanager.h
)
set (PPIC_QRC_FILES
@ -72,7 +76,7 @@ set (PPIC_RC_FILES
set (EXE_NAME ppic)
# Translation
file (GLOB PPIC_TS_FILES translations/*.ts)
file (GLOB PPIC_TS_FILES app/translations/*.ts)
set (PPIC_CPP_FILES_FOR_I18N ${PPIC_CPP_FILES})
qt5_create_translation(PPIC_QM_FILES ${PPIC_CPP_FILES_FOR_I18N} ${PPIC_TS_FILES})
@ -197,7 +201,7 @@ elseif (UNIX)
# install app metadata file for appstream (and some other stuff using this metadata like snapcraft)
install (
FILES dist/appstream/net.blumia.pineapple-pictures.appdata.xml
FILES dist/appstream/net.blumia.pineapple-pictures.metainfo.xml
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo"
)
endif()

View File

@ -8,11 +8,16 @@ Yet another image viewer.
![Pineapple Pictures - Main Window](https://repository-images.githubusercontent.com/211888654/21fb6300-269f-11ea-8e85-953e5d57da44)
## Summary
Pineapple Pictures is a lightweight image viewer that allows you view JPEG, PNG, GIF, SVG, PSD, KRA, XCF, TGA, AVIF and some other frequently used image formats files quickly and easily, and also provide a Stay-on-Top window setting that allows you pin the window so you can use it to pin a reference image at the top and then you can work with other software.
## Get it!
- [GitHub Release Page](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/)
- Debian (sid / testing): `sudo apt install pineapple-pictures`
- Debian (since bullseye) or Ubuntu (since 21.04): `sudo apt install pineapple-pictures`
- [Itch.io Store](https://blumia.itch.io/pineapple-pictures)
## Help Translation!

View File

@ -8,11 +8,16 @@
![Pineapple Pictures - Main Window](https://repository-images.githubusercontent.com/211888654/21fb6300-269f-11ea-8e85-953e5d57da44)
## 简介
菠萝看图是一个轻量图像查看器,允许你简单快捷的查看 JPEG, PNG, GIF, SVG, PSD, KRA, XCF, TGA, AVIF 等常用格式的图像文件,并提供了置顶窗口的选项以便你在使用其它软件时也可以将参考图片固定在顶端。
## 立即获取!
- [GitHub Release 页面](https://github.com/BLumia/pineapple-pictures/releases) | [gitee 发布页面](https://gitee.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/)
- Debian (sid / testing): `sudo apt install pineapple-pictures`
- Debian (自 bullseye 起) 或 Ubuntu (自 21.04 起): `sudo apt install pineapple-pictures`
- [Itch.io 商店](https://blumia.itch.io/pineapple-pictures)
## 帮助翻译!

View File

@ -25,16 +25,18 @@ AboutDialog::AboutDialog(QWidget *parent)
const QStringList helpStr {
QStringLiteral("<p>%1</p>").arg(tr("Launch application with image file path as argument to load the file.")),
QStringLiteral("<p>%1</p>").arg(tr("Drag and drop image file onto the window is also supported.")),
QStringLiteral("<p>%1</p>").arg(tr("None of the operations in this application will alter the pictures on disk.")),
QStringLiteral("<p>%1</p>").arg(tr("Context menu option explanation:")),
QStringLiteral("<ul>"),
QStringLiteral("<li><b>%1</b>:<br/>%2</li>").arg(
QCoreApplication::translate("MainWindow", "Stay on top"),
this->tr("Make window stay on top of all other windows.")
),
QStringLiteral("<li><b>%1</b>:<br/>%2</li>").arg(
QCoreApplication::translate("MainWindow", "Protected mode"),
this->tr("Avoid close window accidentally. (eg. by double clicking the window)")
),
// 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.
QStringLiteral("<li><b>%1</b>:<br/>%2</li>")
.arg(QCoreApplication::translate("MainWindow", "Stay on top"))
.arg(tr("Make window stay on top of all other windows.")),
QStringLiteral("<li><b>%1</b>:<br/>%2</li>")
.arg(QCoreApplication::translate("MainWindow", "Protected mode"))
.arg(tr("Avoid close window accidentally. (eg. by double clicking the window)")),
QStringLiteral("</ul>")
};
@ -131,7 +133,7 @@ SOFTWARE.
m_licenseTextEdit->setText(licenseStr.join('\n').arg(qApp->applicationDisplayName(), mitLicense));
m_3rdPartyLibsTextEdit->setText(thirdPartyLibsStr.join('\n').arg(QStringLiteral("<i>%1</i>")).arg(qApp->applicationDisplayName()));
m_3rdPartyLibsTextEdit->setText(thirdPartyLibsStr.join('\n').arg(QStringLiteral("<i>%1</i>").arg(qApp->applicationDisplayName())));
m_3rdPartyLibsTextEdit->setOpenExternalLinks(true);
m_tabWidget->addTab(m_helpTextEdit, tr("&Help"));

77
app/actionmanager.cpp Normal file
View File

@ -0,0 +1,77 @@
#include "actionmanager.h"
#include "mainwindow.h"
#include <QCoreApplication>
#define CREATE_NEW_ACTION(window, action)\
action = new QAction(window);\
action->setObjectName(QString::fromUtf8( #action ));\
window->addAction(action);
ActionManager::ActionManager()
{
}
ActionManager::~ActionManager()
{
}
void ActionManager::setupAction(MainWindow *mainWindow)
{
CREATE_NEW_ACTION(mainWindow, actionZoomIn);
CREATE_NEW_ACTION(mainWindow, actionZoomOut);
CREATE_NEW_ACTION(mainWindow, actionHorizontalFlip);
CREATE_NEW_ACTION(mainWindow, actionCopyPixmap);
CREATE_NEW_ACTION(mainWindow, actionCopyFilePath);
CREATE_NEW_ACTION(mainWindow, actionPaste);
CREATE_NEW_ACTION(mainWindow, actionToggleCheckerboard);
CREATE_NEW_ACTION(mainWindow, actionToggleStayOnTop);
CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode);
CREATE_NEW_ACTION(mainWindow, actionSettings);
CREATE_NEW_ACTION(mainWindow, actionHelp);
CREATE_NEW_ACTION(mainWindow, actionProperties);
CREATE_NEW_ACTION(mainWindow, actionQuitApp);
retranslateUi(mainWindow);
QMetaObject::connectSlotsByName(mainWindow);
}
void ActionManager::retranslateUi(MainWindow *mainWindow)
{
Q_UNUSED(mainWindow);
actionZoomIn->setText(QCoreApplication::translate("MainWindow", "Zoom in", nullptr));
actionZoomOut->setText(QCoreApplication::translate("MainWindow", "Zoom out", nullptr));
actionHorizontalFlip->setText(QCoreApplication::translate("MainWindow", "Flip &Horizontally", 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));
actionToggleCheckerboard->setText(QCoreApplication::translate("MainWindow", "Toggle Checkerboard", nullptr));
actionToggleStayOnTop->setText(QCoreApplication::translate("MainWindow", "Stay on top", nullptr));
actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr));
actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
actionHelp->setText(QCoreApplication::translate("MainWindow", "Help", nullptr));
actionProperties->setText(QCoreApplication::translate("MainWindow", "Properties", nullptr));
actionQuitApp->setText(QCoreApplication::translate("MainWindow", "Quit", nullptr));
}
void ActionManager::setupShortcuts()
{
actionZoomIn->setShortcut(QKeySequence(QKeySequence::ZoomIn));
actionZoomOut->setShortcut(QKeySequence(QKeySequence::ZoomOut));
actionHorizontalFlip->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R));
actionCopyPixmap->setShortcut(QKeySequence(QKeySequence::Copy));
actionPaste->setShortcut(QKeySequence::Paste);
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)
});
}

34
app/actionmanager.h Normal file
View File

@ -0,0 +1,34 @@
#ifndef ACTIONMANAGER_H
#define ACTIONMANAGER_H
#include <QAction>
class MainWindow;
class ActionManager
{
public:
ActionManager();
~ActionManager();
void setupAction(MainWindow * mainWindow);
void retranslateUi(MainWindow *MainWindow);
void setupShortcuts();
public:
QAction *actionZoomIn;
QAction *actionZoomOut;
QAction *actionHorizontalFlip;
QAction *actionCopyPixmap;
QAction *actionCopyFilePath;
QAction *actionPaste;
QAction *actionToggleCheckerboard;
QAction *actionToggleStayOnTop;
QAction *actionToggleProtectMode;
QAction *actionSettings;
QAction *actionHelp;
QAction *actionProperties;
QAction *actionQuitApp;
};
#endif // ACTIONMANAGER_H

View File

@ -1,11 +1,20 @@
#include "framelesswindow.h"
#include <QApplication>
#include <QVBoxLayout>
#ifdef _WIN32
#include <windows.h>
#endif // _WIN32
FramelessWindow::FramelessWindow(QWidget *parent)
: QWidget(parent)
, m_centralLayout(new QVBoxLayout(this))
{
// We should use Qt::WindowMinMaxButtonsHint here but there is a bug in Qt
// that will make pressing Meta+Up cause the app fullscreen under Windows,
// so for now we only use the Qt::WindowMinimizeButtonHint flag here.
// https://bugreports.qt.io/browse/QTBUG-91226
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);
m_centralLayout->setMargin(0);
@ -21,3 +30,90 @@ void FramelessWindow::setCentralWidget(QWidget *widget)
m_centralLayout->addWidget(widget);
m_centralWidget = widget;
}
bool FramelessWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef _WIN32
// https://stackoverflow.com/questions/43505580/qt-windows-resizable-frameless-window
// Too lazy to do this now.. just stackoverflow it and did a copy and paste..
Q_UNUSED(eventType)
MSG* msg = static_cast<MSG*>(message);
if (msg->message == WM_NCHITTEST) {
if (isMaximized()) {
return false;
}
*result = 0;
const LONG borderWidth = 8;
RECT winrect;
GetWindowRect(reinterpret_cast<HWND>(winId()), &winrect);
// must be short to correctly work with multiple monitors (negative coordinates)
short x = msg->lParam & 0x0000FFFF;
short y = (msg->lParam & 0xFFFF0000) >> 16;
bool resizeWidth = minimumWidth() != maximumWidth();
bool resizeHeight = minimumHeight() != maximumHeight();
if (resizeWidth) {
//left border
if (x >= winrect.left && x < winrect.left + borderWidth) {
*result = HTLEFT;
}
//right border
if (x < winrect.right && x >= winrect.right - borderWidth) {
*result = HTRIGHT;
}
}
if (resizeHeight) {
//bottom border
if (y < winrect.bottom && y >= winrect.bottom - borderWidth) {
*result = HTBOTTOM;
}
//top border
if (y >= winrect.top && y < winrect.top + borderWidth) {
*result = HTTOP;
}
}
if (resizeWidth && resizeHeight) {
//bottom left corner
if (x >= winrect.left && x < winrect.left + borderWidth &&
y < winrect.bottom && y >= winrect.bottom - borderWidth)
{
*result = HTBOTTOMLEFT;
}
//bottom right corner
if (x < winrect.right && x >= winrect.right - borderWidth &&
y < winrect.bottom && y >= winrect.bottom - borderWidth)
{
*result = HTBOTTOMRIGHT;
}
//top left corner
if (x >= winrect.left && x < winrect.left + borderWidth &&
y >= winrect.top && y < winrect.top + borderWidth)
{
*result = HTTOPLEFT;
}
//top right corner
if (x < winrect.right && x >= winrect.right - borderWidth &&
y >= winrect.top && y < winrect.top + borderWidth)
{
*result = HTTOPRIGHT;
}
}
if (*result != 0)
return true;
QWidget *action = QApplication::widgetAt(QCursor::pos());
if (action == this) {
*result = HTCAPTION;
return true;
}
}
return false;
#else
return QWidget::nativeEvent(eventType, message, result);
#endif // _WIN32
}

View File

@ -15,7 +15,8 @@ public:
void setCentralWidget(QWidget * widget);
signals:
protected:
bool nativeEvent(const QByteArray& eventType, void* message, long* result) override;
private:
QVBoxLayout * m_centralLayout = nullptr;

View File

@ -48,11 +48,11 @@ void GraphicsScene::showSvg(const QString &filepath)
this->setSceneRect(m_theThing->boundingRect());
}
void GraphicsScene::showGif(const QString &filepath)
void GraphicsScene::showAnimated(const QString &filepath)
{
this->clear();
QMovie * movie = new QMovie(filepath);
QLabel * label = new QLabel;
QMovie * movie = new QMovie(filepath, QByteArray(), label);
label->setStyleSheet("background-color:rgba(225,255,255,0);");
label->setMovie(movie);
this->addWidget(label);

View File

@ -13,7 +13,7 @@ public:
void showImage(const QPixmap &pixmap);
void showText(const QString &text);
void showSvg(const QString &filepath);
void showGif(const QString &filepath);
void showAnimated(const QString &filepath);
bool trySetTransformationMode(Qt::TransformationMode mode);

View File

@ -7,6 +7,14 @@
#include <QScrollBar>
#include <QMimeData>
#include <QImageReader>
#include <QStyleOptionGraphicsItem>
// TODO: remove this once we drop older Qt support.
#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
#define COMPAT_CONSTCOLOR constexpr
#else
#define COMPAT_CONSTCOLOR const
#endif
GraphicsView::GraphicsView(QWidget *parent)
: QGraphicsView (parent)
@ -25,30 +33,32 @@ GraphicsView::GraphicsView(QWidget *parent)
connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
}
void GraphicsView::showFileFromUrl(const QUrl &url, bool doRequestGallery)
void GraphicsView::showFileFromPath(const QString &filePath, bool doRequestGallery)
{
emit navigatorViewRequired(false, 0);
QString filePath(url.toLocalFile());
emit navigatorViewRequired(false, transform());
if (filePath.endsWith(".svg")) {
showSvg(filePath);
} else if (filePath.endsWith(".gif")) {
showGif(filePath);
} else {
QImageReader imageReader(filePath);
imageReader.setAutoTransform(true);
imageReader.setDecideFormatFromContent(true);
// 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()) {
doRequestGallery = false;
showText(tr("File is not a valid image"));
} else if (!imageReader.supportsAnimation() && !imageReader.canRead()) {
} else if (imageReader.supportsAnimation() && imageReader.imageCount() > 1) {
showAnimated(filePath);
} else if (!imageReader.canRead()) {
doRequestGallery = false;
showText(tr("Image data is invalid or currently unsupported"));
} else {
const QPixmap & pixmap = QPixmap::fromImageReader(&imageReader);
if (pixmap.isNull()) {
doRequestGallery = false;
showText(tr("Image data is invalid or currently unsupported"));
} else {
showImage(pixmap);
@ -89,10 +99,10 @@ void GraphicsView::showSvg(const QString &filepath)
checkAndDoFitInView();
}
void GraphicsView::showGif(const QString &filepath)
void GraphicsView::showAnimated(const QString &filepath)
{
resetTransform();
scene()->showGif(filepath);
scene()->showAnimated(filepath);
checkAndDoFitInView();
}
@ -108,17 +118,11 @@ void GraphicsView::setScene(GraphicsScene *scene)
qreal GraphicsView::scaleFactor() const
{
int angle = static_cast<int>(m_rotateAngle);
if (angle == 0 || angle == 180) {
return qAbs(transform().m11());
} else {
return qAbs(transform().m12());
}
return QStyleOptionGraphicsItem::levelOfDetailFromTransform(transform());
}
void GraphicsView::resetTransform()
{
m_rotateAngle = 0;
QGraphicsView::resetTransform();
}
@ -127,20 +131,38 @@ void GraphicsView::zoomView(qreal scaleFactor)
m_enableFitInView = false;
scale(scaleFactor, scaleFactor);
applyTransformationModeByScaleFactor();
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle);
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()
{
resetWithScaleAndRotate(1, m_rotateAngle);
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), m_rotateAngle);
}
void GraphicsView::rotateView(qreal rotateAngel)
{
m_rotateAngle += rotateAngel;
m_rotateAngle = static_cast<int>(m_rotateAngle) % 360;
resetWithScaleAndRotate(1, m_rotateAngle);
setTransform(resetScale(transform()));
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
}
void GraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode)
@ -161,9 +183,23 @@ void GraphicsView::checkAndDoFitInView(bool markItOnAnyway)
}
}
void GraphicsView::toggleCheckerboard()
inline double zeroOrOne(double number)
{
setCheckerboardEnabled(!m_checkerboardEnabled);
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)
@ -206,17 +242,18 @@ void GraphicsView::wheelEvent(QWheelEvent *event)
void GraphicsView::resizeEvent(QResizeEvent *event)
{
if (m_enableFitInView) {
QTransform tf;
tf.rotate(m_rotateAngle);
if (isThingSmallerThanWindowWith(tf) && scaleFactor() >= 1) {
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()), m_rotateAngle);
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
}
return QGraphicsView::resizeEvent(event);
}
@ -253,7 +290,7 @@ void GraphicsView::dropEvent(QDropEvent *event)
if (urls.isEmpty()) {
showText(tr("File url list is empty"));
} else {
showFileFromUrl(urls.first(), true);
showFileFromPath(urls.first().toLocalFile(), true);
}
} else if (mimeData->hasImage()) {
QImage img = qvariant_cast<QImage>(mimeData->imageData());
@ -294,17 +331,19 @@ bool GraphicsView::shouldIgnoreMousePressMoveEvent(const QMouseEvent *event) con
return false;
}
void GraphicsView::setCheckerboardEnabled(bool enabled)
void GraphicsView::setCheckerboardEnabled(bool enabled, bool invertColor)
{
m_checkerboardEnabled = enabled;
m_isLastCheckerboardColorInverted = invertColor;
if (m_checkerboardEnabled) {
// Prepare background check-board pattern
QPixmap tilePixmap(0x20, 0x20);
tilePixmap.fill(QColor(35, 35, 35, 170));
tilePixmap.fill(invertColor ? QColor(220, 220, 220, 170) : QColor(35, 35, 35, 170));
QPainter tilePainter(&tilePixmap);
QColor color(45, 45, 45, 170);
tilePainter.fillRect(0, 0, 0x10, 0x10, color);
tilePainter.fillRect(0x10, 0x10, 0x10, 0x10, color);
COMPAT_CONSTCOLOR QColor color(45, 45, 45, 170);
COMPAT_CONSTCOLOR QColor invertedColor(210, 210, 210, 170);
tilePainter.fillRect(0, 0, 0x10, 0x10, invertColor ? invertedColor : color);
tilePainter.fillRect(0x10, 0x10, 0x10, 0x10, invertColor ? invertedColor : color);
tilePainter.end();
setBackgroundBrush(tilePixmap);
@ -321,10 +360,3 @@ void GraphicsView::applyTransformationModeByScaleFactor()
scene()->trySetTransformationMode(Qt::FastTransformation);
}
}
void GraphicsView::resetWithScaleAndRotate(qreal scaleFactor, qreal rotateAngle)
{
QGraphicsView::resetTransform();
scale(scaleFactor, scaleFactor);
rotate(rotateAngle);
}

View File

@ -11,13 +11,13 @@ class GraphicsView : public QGraphicsView
public:
GraphicsView(QWidget *parent = nullptr);
void showFileFromUrl(const QUrl &url, bool requestGallery = false);
void showFileFromPath(const QString &filePath, bool requestGallery = false);
void showImage(const QPixmap &pixmap);
void showImage(const QImage &image);
void showText(const QString &text);
void showSvg(const QString &filepath);
void showGif(const QString &filepath);
void showAnimated(const QString &filepath);
GraphicsScene * scene() const;
void setScene(GraphicsScene *scene);
@ -26,19 +26,22 @@ public:
void resetTransform();
void zoomView(qreal scaleFactor);
void rotateView(bool clockwise = true);
void flipView(bool horizontal = true);
void resetScale();
void rotateView(qreal rotateAngel);
void fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRadioMode = Qt::IgnoreAspectRatio);
void checkAndDoFitInView(bool markItOnAnyway = true);
static QTransform resetScale(const QTransform & orig);
signals:
void navigatorViewRequired(bool required, qreal angle);
void navigatorViewRequired(bool required, QTransform transform);
void viewportRectChanged();
void requestGallery(const QString &filePath);
public slots:
void toggleCheckerboard();
void toggleCheckerboard(bool invertCheckerboardColor = false);
private:
void mousePressEvent(QMouseEvent * event) override;
@ -53,14 +56,12 @@ private:
bool isThingSmallerThanWindowWith(const QTransform &transform) const;
bool shouldIgnoreMousePressMoveEvent(const QMouseEvent *event) const;
void setCheckerboardEnabled(bool enabled);
void setCheckerboardEnabled(bool enabled, bool invertColor = false);
void applyTransformationModeByScaleFactor();
void resetWithScaleAndRotate(qreal scaleFactor, qreal rotateAngle);
bool m_enableFitInView = false;
bool m_checkerboardEnabled = false;
qreal m_rotateAngle = 0;
bool m_isLastCheckerboardColorInverted = false;
};
#endif // GRAPHICSVIEW_H

View File

@ -1,4 +1,7 @@
#include "mainwindow.h"
#include "playlistmanager.h"
#include <QApplication>
#include <QCommandLineParser>
#include <QDir>
@ -34,18 +37,12 @@ int main(int argc, char *argv[])
parser.process(a);
QStringList urlStrList = parser.positionalArguments();
QList<QUrl> urlList;
for (const QString & str : urlStrList) {
QUrl url = QUrl::fromLocalFile(str);
if (url.isValid()) {
urlList.append(url);
}
}
MainWindow w;
w.show();
QStringList urlStrList = parser.positionalArguments();
QList<QUrl> && urlList = PlaylistManager::convertToUrlList(urlStrList);
if (!urlList.isEmpty()) {
w.showUrls(urlList);
w.adjustWindowSizeBySceneRect();

View File

@ -10,6 +10,8 @@
#include "aboutdialog.h"
#include "metadatamodel.h"
#include "metadatadialog.h"
#include "actionmanager.h"
#include "playlistmanager.h"
#include <QMouseEvent>
#include <QMovie>
@ -20,18 +22,15 @@
#include <QScreen>
#include <QMenu>
#include <QShortcut>
#include <QDir>
#include <QCollator>
#include <QClipboard>
#include <QMimeData>
#include <QWindow>
#include <QTimer>
#ifdef _WIN32
#include <windows.h>
#endif // _WIN32
MainWindow::MainWindow(QWidget *parent) :
FramelessWindow(parent)
MainWindow::MainWindow(QWidget *parent)
: FramelessWindow(parent)
, m_am(new ActionManager)
, m_pm(new PlaylistManager(PlaylistManager::PL_SAMEFOLDER, this))
{
if (Settings::instance()->stayOnTop()) {
this->setWindowFlag(Qt::WindowStaysOnTopHint);
@ -42,6 +41,8 @@ MainWindow::MainWindow(QWidget *parent) :
this->setWindowIcon(QIcon(":/icons/app-icon.svg"));
this->setMouseTracking(true);
m_pm->setAutoLoadFilterSuffix({"*.jpg", "*.jpeg", "*.jfif", "*.png", "*.gif", "*.svg", "*.bmp", "*.webp"});
m_fadeOutAnimation = new QPropertyAnimation(this, "windowOpacity");
m_fadeOutAnimation->setDuration(300);
m_fadeOutAnimation->setStartValue(1);
@ -49,7 +50,7 @@ MainWindow::MainWindow(QWidget *parent) :
m_floatUpAnimation = new QPropertyAnimation(this, "geometry");
m_floatUpAnimation->setDuration(300);
m_floatUpAnimation->setEasingCurve(QEasingCurve::OutCirc);
m_exitAnimationGroup = new QParallelAnimationGroup;
m_exitAnimationGroup = new QParallelAnimationGroup(this);
m_exitAnimationGroup->addAnimation(m_fadeOutAnimation);
m_exitAnimationGroup->addAnimation(m_floatUpAnimation);
connect(m_exitAnimationGroup, &QParallelAnimationGroup::finished,
@ -68,9 +69,8 @@ MainWindow::MainWindow(QWidget *parent) :
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
connect(m_graphicsView, &GraphicsView::navigatorViewRequired,
this, [ = ](bool required, qreal angle){
m_gv->resetTransform();
m_gv->rotate(angle);
this, [ = ](bool required, QTransform tf){
m_gv->setTransform(GraphicsView::resetScale(tf));
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
m_gv->setVisible(required);
m_gv->updateMainViewportRegion();
@ -112,15 +112,14 @@ MainWindow::MainWindow(QWidget *parent) :
connect(m_bottomButtonGroup, &BottomButtonGroup::toggleWindowMaximum,
this, &MainWindow::toggleMaximize);
connect(m_bottomButtonGroup, &BottomButtonGroup::zoomInBtnClicked,
this, [ = ](){ m_graphicsView->zoomView(1.25); });
this, &MainWindow::on_actionZoomIn_triggered);
connect(m_bottomButtonGroup, &BottomButtonGroup::zoomOutBtnClicked,
this, [ = ](){ m_graphicsView->zoomView(0.75); });
this, &MainWindow::on_actionZoomOut_triggered);
connect(m_bottomButtonGroup, &BottomButtonGroup::toggleCheckerboardBtnClicked,
this, [ = ](){ m_graphicsView->toggleCheckerboard(); });
this, &MainWindow::toggleCheckerboard);
connect(m_bottomButtonGroup, &BottomButtonGroup::rotateRightBtnClicked,
this, [ = ](){
m_graphicsView->resetScale();
m_graphicsView->rotateView(90);
m_graphicsView->rotateView();
m_graphicsView->checkAndDoFitInView();
m_gv->setVisible(false);
});
@ -129,19 +128,11 @@ MainWindow::MainWindow(QWidget *parent) :
m_gv->setOpacity(0, false);
m_closeButton->setOpacity(0, false);
connect(this, &MainWindow::galleryLoaded, this, [this]() {
m_prevButton->setVisible(isGalleryAvailable());
m_nextButton->setVisible(isGalleryAvailable());
connect(m_pm, &PlaylistManager::loaded, this, [this](int galleryFileCount) {
m_prevButton->setVisible(galleryFileCount > 1);
m_nextButton->setVisible(galleryFileCount > 1);
});
QShortcut * quitAppShorucut = new QShortcut(QKeySequence(Qt::Key_Space), this);
connect(quitAppShorucut, &QShortcut::activated,
std::bind(&MainWindow::quitAppAction, this, false));
QShortcut * quitAppShorucut2 = new QShortcut(QKeySequence(Qt::Key_Escape), this);
connect(quitAppShorucut2, &QShortcut::activated,
std::bind(&MainWindow::quitAppAction, this, false));
QShortcut * prevPictureShorucut = new QShortcut(QKeySequence(Qt::Key_PageUp), this);
connect(prevPictureShorucut, &QShortcut::activated,
this, &MainWindow::galleryPrev);
@ -154,7 +145,13 @@ MainWindow::MainWindow(QWidget *parent) :
connect(fullscreenShorucut, &QShortcut::activated,
this, &MainWindow::toggleFullscreen);
m_am->setupAction(this);
centerWindow();
QTimer::singleShot(0, this, [this](){
m_am->setupShortcuts();
});
}
MainWindow::~MainWindow()
@ -166,11 +163,11 @@ void MainWindow::showUrls(const QList<QUrl> &urls)
{
if (!urls.isEmpty()) {
if (urls.count() == 1) {
m_graphicsView->showFileFromUrl(urls.first(), true);
m_graphicsView->showFileFromPath(urls.first().toLocalFile(), true);
} else {
m_graphicsView->showFileFromUrl(urls.first(), false);
m_files = urls;
m_currentFileIndex = 0;
m_graphicsView->showFileFromPath(urls.first().toLocalFile(), false);
m_pm->setPlaylist(urls);
m_pm->setCurrentIndex(0);
}
} else {
m_graphicsView->showText(tr("File url list is empty"));
@ -211,77 +208,44 @@ void MainWindow::adjustWindowSizeBySceneRect()
// can be empty if it is NOT from a local file.
QUrl MainWindow::currentImageFileUrl() const
{
if (m_currentFileIndex != -1) {
return m_files.value(m_currentFileIndex);
}
QUrl url;
std::tie(std::ignore, url) = m_pm->currentFileUrl();
return QUrl();
return url;
}
void MainWindow::clearGallery()
{
m_currentFileIndex = -1;
m_files.clear();
m_pm->clear();
}
void MainWindow::loadGalleryBySingleLocalFile(const QString &path)
{
QFileInfo info(path);
QDir dir(info.path());
QString currentFileName = info.fileName();
QStringList entryList = dir.entryList({"*.jpg", "*.jpeg", "*.jfif", "*.png", "*.gif", "*.svg", "*.bmp"},
QDir::Files | QDir::NoSymLinks, QDir::NoSort);
QCollator collator;
collator.setNumericMode(true);
std::sort(entryList.begin(), entryList.end(), collator);
clearGallery();
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);
m_files.append(url);
if (fileName == currentFileName) {
m_currentFileIndex = i;
}
}
emit galleryLoaded();
m_pm->setCurrentFile(path);
}
void MainWindow::galleryPrev()
{
int count = m_files.count();
if (!isGalleryAvailable()) {
return;
int index;
QString filePath;
std::tie(index, filePath) = m_pm->previousFile();
if (index >= 0) {
m_graphicsView->showFileFromPath(filePath, false);
m_pm->setCurrentIndex(index);
}
m_currentFileIndex = m_currentFileIndex - 1 < 0 ? count - 1 : m_currentFileIndex - 1;
m_graphicsView->showFileFromUrl(m_files.at(m_currentFileIndex), false);
}
void MainWindow::galleryNext()
{
int count = m_files.count();
if (!isGalleryAvailable()) {
return;
int index;
QString filePath;
std::tie(index, filePath) = m_pm->nextFile();
if (index >= 0) {
m_graphicsView->showFileFromPath(filePath, false);
m_pm->setCurrentIndex(index);
}
m_currentFileIndex = m_currentFileIndex + 1 == count ? 0 : m_currentFileIndex + 1;
m_graphicsView->showFileFromUrl(m_files.at(m_currentFileIndex), false);
}
bool MainWindow::isGalleryAvailable()
{
if (m_currentFileIndex < 0 || m_files.isEmpty() || m_currentFileIndex >= m_files.count()) {
return false;
}
return true;
}
void MainWindow::showEvent(QShowEvent *event)
@ -374,19 +338,33 @@ void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
void MainWindow::wheelEvent(QWheelEvent *event)
{
QPoint numDegrees = event->angleDelta() / 8;
bool needZoom = false, zoomIn = false;
bool needWeelEvent = false, wheelUp = false;
bool actionIsZoom = event->modifiers().testFlag(Qt::ControlModifier)
|| Settings::instance()->mouseWheelBehavior() == ActionZoomImage;
// NOTE: Only checking angleDelta since the QWheelEvent::pixelDelta() doc says
// pixelDelta() value is driver specific and unreliable on X11...
// We are not scrolling the canvas, just zoom in or out, so it probably
// doesn't matter here.
if (!numDegrees.isNull() && numDegrees.y() != 0) {
needZoom = true;
zoomIn = numDegrees.y() > 0;
needWeelEvent = true;
wheelUp = numDegrees.y() > 0;
}
if (needZoom) {
m_graphicsView->zoomView(zoomIn ? 1.25 : 0.8);
if (needWeelEvent) {
if (actionIsZoom) {
if (wheelUp) {
on_actionZoomIn_triggered();
} else {
on_actionZoomOut_triggered();
}
} else {
if (wheelUp) {
galleryPrev();
} else {
galleryNext();
}
}
event->accept();
} else {
FramelessWindow::wheelEvent(event);
@ -408,97 +386,42 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
QImage clipboardImage;
QUrl clipboardFileUrl;
const QMimeData * clipboardData = QApplication::clipboard()->mimeData();
if (clipboardData->hasImage()) {
QVariant imageVariant(clipboardData->imageData());
if (imageVariant.isValid()) {
clipboardImage = qvariant_cast<QImage>(imageVariant);
}
} else if (clipboardData->hasText()) {
QString clipboardText(clipboardData->text());
if (clipboardText.startsWith("PICTURE:")) {
QString maybeFilename(clipboardText.mid(8));
if (QFile::exists(maybeFilename)) {
clipboardFileUrl = QUrl::fromLocalFile(maybeFilename);
}
}
}
QAction * copyPixmap = m_am->actionCopyPixmap;
QAction * copyFilePath = m_am->actionCopyFilePath;
QAction * copyPixmap = new QAction(tr("Copy P&ixmap"));
connect(copyPixmap, &QAction::triggered, this, [ = ](){
QClipboard *cb = QApplication::clipboard();
cb->setPixmap(m_graphicsView->scene()->renderToPixmap());
});
QAction * copyFilePath = new QAction(tr("Copy &File Path"));
connect(copyFilePath, &QAction::triggered, this, [ = ](){
QClipboard *cb = QApplication::clipboard();
cb->setText(currentFileUrl.toLocalFile());
});
copyMenu->addAction(copyPixmap);
if (currentFileUrl.isValid()) {
copyMenu->addAction(copyFilePath);
}
QAction * pasteImage = new QAction(tr("&Paste Image"));
connect(pasteImage, &QAction::triggered, this, [ = ](){
clearGallery();
m_graphicsView->showImage(clipboardImage);
});
QAction * paste = m_am->actionPaste;
QAction * pasteImageFile = new QAction(tr("&Paste Image File"));
connect(pasteImageFile, &QAction::triggered, this, [ = ](){
m_graphicsView->showFileFromUrl(clipboardFileUrl, true);
});
QAction * stayOnTopMode = new QAction(tr("Stay on top"));
connect(stayOnTopMode, &QAction::triggered, this, [ = ](){
toggleStayOnTop();
});
QAction * stayOnTopMode = m_am->actionToggleStayOnTop;
stayOnTopMode->setCheckable(true);
stayOnTopMode->setChecked(stayOnTop());
QAction * protectedMode = new QAction(tr("Protected mode"));
connect(protectedMode, &QAction::triggered, this, [ = ](){
toggleProtectedMode();
});
QAction * protectedMode = m_am->actionToggleProtectMode;
protectedMode->setCheckable(true);
protectedMode->setChecked(m_protectedMode);
QAction * toggleSettings = new QAction(tr("Configure..."));
connect(toggleSettings, &QAction::triggered, this, [ = ](){
SettingsDialog * sd = new SettingsDialog(this);
sd->exec();
sd->deleteLater();
});
QAction * helpAction = new QAction(tr("Help"));
connect(helpAction, &QAction::triggered, this, [ = ](){
AboutDialog * ad = new AboutDialog(this);
ad->exec();
ad->deleteLater();
});
QAction * propertiesAction = new QAction(tr("Properties"));
connect(propertiesAction, &QAction::triggered, this, [ = ](){
MetadataModel * md = new MetadataModel();
md->setFile(currentFileUrl.toLocalFile());
MetadataDialog * ad = new MetadataDialog(this);
ad->setMetadataModel(md);
ad->exec();
ad->deleteLater();
});
QAction * toggleSettings = m_am->actionSettings;
QAction * helpAction = m_am->actionHelp;
QAction * propertiesAction = m_am->actionProperties;
if (copyMenu->actions().count() == 1) {
menu->addActions(copyMenu->actions());
} else {
menu->addMenu(copyMenu);
}
if (!clipboardImage.isNull()) {
menu->addAction(pasteImage);
} else if (clipboardFileUrl.isValid()) {
menu->addAction(pasteImageFile);
if (canPaste()) {
menu->addAction(paste);
}
menu->addSeparator();
menu->addAction(m_am->actionHorizontalFlip);
menu->addSeparator();
menu->addAction(stayOnTopMode);
menu->addAction(protectedMode);
@ -511,102 +434,11 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
}
menu->exec(mapToGlobal(event->pos()));
menu->deleteLater();
copyMenu->deleteLater();
return FramelessWindow::contextMenuEvent(event);
}
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef _WIN32
// https://stackoverflow.com/questions/43505580/qt-windows-resizable-frameless-window
// Too lazy to do this now.. just stackoverflow it and did a copy and paste..
Q_UNUSED(eventType)
MSG* msg = static_cast<MSG*>(message);
if (msg->message == WM_NCHITTEST) {
if (isMaximized()) {
return false;
}
*result = 0;
const LONG borderWidth = 8;
RECT winrect;
GetWindowRect(reinterpret_cast<HWND>(winId()), &winrect);
// must be short to correctly work with multiple monitors (negative coordinates)
short x = msg->lParam & 0x0000FFFF;
short y = (msg->lParam & 0xFFFF0000) >> 16;
bool resizeWidth = minimumWidth() != maximumWidth();
bool resizeHeight = minimumHeight() != maximumHeight();
if (resizeWidth) {
//left border
if (x >= winrect.left && x < winrect.left + borderWidth) {
*result = HTLEFT;
}
//right border
if (x < winrect.right && x >= winrect.right - borderWidth) {
*result = HTRIGHT;
}
}
if (resizeHeight) {
//bottom border
if (y < winrect.bottom && y >= winrect.bottom - borderWidth) {
*result = HTBOTTOM;
}
//top border
if (y >= winrect.top && y < winrect.top + borderWidth) {
*result = HTTOP;
}
}
if (resizeWidth && resizeHeight) {
//bottom left corner
if (x >= winrect.left && x < winrect.left + borderWidth &&
y < winrect.bottom && y >= winrect.bottom - borderWidth)
{
*result = HTBOTTOMLEFT;
}
//bottom right corner
if (x < winrect.right && x >= winrect.right - borderWidth &&
y < winrect.bottom && y >= winrect.bottom - borderWidth)
{
*result = HTBOTTOMRIGHT;
}
//top left corner
if (x >= winrect.left && x < winrect.left + borderWidth &&
y >= winrect.top && y < winrect.top + borderWidth)
{
*result = HTTOPLEFT;
}
//top right corner
if (x < winrect.right && x >= winrect.right - borderWidth &&
y >= winrect.top && y < winrect.top + borderWidth)
{
*result = HTTOPRIGHT;
}
}
if (*result != 0)
return true;
QWidget *action = QApplication::widgetAt(QCursor::pos());
if (action == this) {
*result = HTCAPTION;
return true;
}
}
return false;
#else
return FramelessWindow::nativeEvent(eventType, message, result);
#endif // _WIN32
}
QSize MainWindow::sizeHint() const
{
return QSize(710, 530);
}
void MainWindow::centerWindow()
{
this->setGeometry(
@ -640,6 +472,11 @@ void MainWindow::updateWidgetsPosition()
m_gv->move(width() - m_gv->width(), height() - m_gv->height());
}
void MainWindow::toggleCheckerboard()
{
m_graphicsView->toggleCheckerboard(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier));
}
void MainWindow::toggleProtectedMode()
{
m_protectedMode = !m_protectedMode;
@ -659,6 +496,24 @@ bool MainWindow::stayOnTop()
return windowFlags().testFlag(Qt::WindowStaysOnTopHint);
}
bool MainWindow::canPaste()
{
const QMimeData * clipboardData = QApplication::clipboard()->mimeData();
if (clipboardData->hasImage()) {
return true;
} else if (clipboardData->hasText()) {
QString clipboardText(clipboardData->text());
if (clipboardText.startsWith("PICTURE:")) {
QString maybeFilename(clipboardText.mid(8));
if (QFile::exists(maybeFilename)) {
return true;
}
}
}
return false;
}
void MainWindow::quitAppAction(bool force)
{
if (!m_protectedMode || force) {
@ -683,3 +538,119 @@ void MainWindow::toggleMaximize()
showMaximized();
}
}
QSize MainWindow::sizeHint() const
{
return QSize(710, 530);
}
void MainWindow::on_actionZoomIn_triggered()
{
if (m_graphicsView->scaleFactor() < 1000) {
m_graphicsView->zoomView(1.25);
}
}
void MainWindow::on_actionZoomOut_triggered()
{
m_graphicsView->zoomView(0.8);
}
void MainWindow::on_actionHorizontalFlip_triggered()
{
m_graphicsView->flipView();
}
void MainWindow::on_actionCopyPixmap_triggered()
{
QClipboard *cb = QApplication::clipboard();
cb->setPixmap(m_graphicsView->scene()->renderToPixmap());
}
void MainWindow::on_actionCopyFilePath_triggered()
{
QUrl currentFileUrl(currentImageFileUrl());
if (currentFileUrl.isValid()) {
QClipboard *cb = QApplication::clipboard();
cb->setText(currentFileUrl.toLocalFile());
}
}
void MainWindow::on_actionPaste_triggered()
{
QImage clipboardImage;
QUrl clipboardFileUrl;
const QMimeData * clipboardData = QApplication::clipboard()->mimeData();
if (clipboardData->hasImage()) {
QVariant imageVariant(clipboardData->imageData());
if (imageVariant.isValid()) {
clipboardImage = qvariant_cast<QImage>(imageVariant);
}
} else if (clipboardData->hasText()) {
QString clipboardText(clipboardData->text());
if (clipboardText.startsWith("PICTURE:")) {
QString maybeFilename(clipboardText.mid(8));
if (QFile::exists(maybeFilename)) {
clipboardFileUrl = QUrl::fromLocalFile(maybeFilename);
}
}
}
if (!clipboardImage.isNull()) {
m_graphicsView->showImage(clipboardImage);
clearGallery();
} else if (clipboardFileUrl.isValid()) {
QString localFile(clipboardFileUrl.toLocalFile());
m_graphicsView->showFileFromPath(localFile, true);
m_pm->setCurrentFile(localFile);
}
}
void MainWindow::on_actionToggleCheckerboard_triggered()
{
m_graphicsView->toggleCheckerboard();
}
void MainWindow::on_actionToggleStayOnTop_triggered()
{
toggleStayOnTop();
}
void MainWindow::on_actionToggleProtectMode_triggered()
{
toggleProtectedMode();
}
void MainWindow::on_actionSettings_triggered()
{
SettingsDialog * sd = new SettingsDialog(this);
sd->exec();
sd->deleteLater();
}
void MainWindow::on_actionHelp_triggered()
{
AboutDialog * ad = new AboutDialog(this);
ad->exec();
ad->deleteLater();
}
void MainWindow::on_actionProperties_triggered()
{
QUrl currentFileUrl = currentImageFileUrl();
if (!currentFileUrl.isValid()) return;
MetadataModel * md = new MetadataModel();
md->setFile(currentFileUrl.toLocalFile());
MetadataDialog * ad = new MetadataDialog(this);
ad->setMetadataModel(md);
ad->exec();
ad->deleteLater();
}
void MainWindow::on_actionQuitApp_triggered()
{
quitAppAction(false);
}

View File

@ -12,6 +12,8 @@ class QGraphicsOpacityEffect;
class QGraphicsView;
QT_END_NAMESPACE
class ActionManager;
class PlaylistManager;
class ToolButton;
class GraphicsView;
class NavigatorView;
@ -32,10 +34,6 @@ public:
void loadGalleryBySingleLocalFile(const QString &path);
void galleryPrev();
void galleryNext();
bool isGalleryAvailable();
signals:
void galleryLoaded();
protected slots:
void showEvent(QShowEvent *event) override;
@ -49,21 +47,40 @@ protected slots:
void resizeEvent(QResizeEvent *event) override;
void contextMenuEvent(QContextMenuEvent *event) override;
bool nativeEvent(const QByteArray& eventType, void* message, long* result) override;
QSize sizeHint() const override;
void centerWindow();
void closeWindow();
void updateWidgetsPosition();
void toggleCheckerboard();
void toggleProtectedMode();
void toggleStayOnTop();
bool stayOnTop();
bool canPaste();
void quitAppAction(bool force = false);
void toggleFullscreen();
void toggleMaximize();
protected:
QSize sizeHint() const override;
private slots:
void on_actionZoomIn_triggered();
void on_actionZoomOut_triggered();
void on_actionHorizontalFlip_triggered();
void on_actionCopyPixmap_triggered();
void on_actionCopyFilePath_triggered();
void on_actionPaste_triggered();
void on_actionToggleCheckerboard_triggered();
void on_actionToggleStayOnTop_triggered();
void on_actionToggleProtectMode_triggered();
void on_actionSettings_triggered();
void on_actionHelp_triggered();
void on_actionProperties_triggered();
void on_actionQuitApp_triggered();
private:
ActionManager *m_am;
PlaylistManager *m_pm;
QPoint m_oldMousePos;
QPropertyAnimation *m_fadeOutAnimation;
QPropertyAnimation *m_floatUpAnimation;
@ -76,9 +93,6 @@ private:
BottomButtonGroup *m_bottomButtonGroup;
bool m_protectedMode = false;
bool m_clickedOnWindow = false;
QList<QUrl> m_files;
int m_currentFileIndex = -1;
};
#endif // MAINWINDOW_H

View File

@ -37,15 +37,17 @@ void MetadataModel::setFile(const QString &imageFilePath)
appendSection(QStringLiteral("Image"), tr("Image", "Section name."));
appendSection(QStringLiteral("Camera"), tr("Camera", "Section name."));
appendSection(QStringLiteral("AdvancedPhoto"), tr("Advanced photo", "Section name."));
#if 0
appendSection(QStringLiteral("GPS"), tr("GPS", "Section name."));
#endif // 0
appendSection(QStringLiteral("File"), tr("File", "Section name."));
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.Dimensions"),
tr("Dimensions"), imageDimensionsString);
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.SizeRatio"),
tr("Aspect Ratio"), imageRatioString);
tr("Aspect ratio"), imageRatioString);
if (imgReader.supportsAnimation() && imgReader.imageCount() > 1) {
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.FrameCount"),
tr("Frame count"), QString::number(imgReader.imageCount()));
}
appendProperty(QStringLiteral("File"), QStringLiteral("File.Name"),
tr("Name"), fileInfo.fileName());
@ -56,9 +58,9 @@ void MetadataModel::setFile(const QString &imageFilePath)
appendProperty(QStringLiteral("File"), QStringLiteral("File.Size"),
tr("Size"), sizeString);
appendProperty(QStringLiteral("File"), QStringLiteral("File.CreatedTime"),
tr("Date Created"), birthTimeString);
tr("Date created"), birthTimeString);
appendProperty(QStringLiteral("File"), QStringLiteral("File.LastModified"),
tr("Date Modified"), lastModifiedTimeString);
tr("Date modified"), lastModifiedTimeString);
Exiv2Wrapper wrapper;
if (wrapper.load(imageFilePath)) {
@ -75,6 +77,8 @@ void MetadataModel::setFile(const QString &imageFilePath)
QStringLiteral("Exif.Photo.DateTimeOriginal"), tr("Date taken"));
appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
QStringLiteral("Exif.Image.Software"), tr("Program name"));
appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
QStringLiteral("Exif.Image.Copyright"), tr("Copyright"));
appendExivPropertyIfExist(wrapper, QStringLiteral("Image"),
QStringLiteral("Exif.Image.XResolution"), tr("Horizontal resolution"));
@ -124,6 +128,20 @@ void MetadataModel::setFile(const QString &imageFilePath)
QStringLiteral("Exif.Photo.DigitalZoomRatio"), tr("Digital zoom"));
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
QStringLiteral("Exif.Photo.ExifVersion"), tr("EXIF version"));
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
QStringLiteral("Exif.GPSInfo.GPSLatitudeRef"), tr("Latitude reference"));
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
QStringLiteral("Exif.GPSInfo.GPSLatitude"), tr("Latitude"));
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
QStringLiteral("Exif.GPSInfo.GPSLongitudeRef"), tr("Longitude reference"));
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
QStringLiteral("Exif.GPSInfo.GPSLongitude"), tr("Longitude"));
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
QStringLiteral("Exif.GPSInfo.GPSAltitudeRef"), tr("Altitude reference"));
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
QStringLiteral("Exif.GPSInfo.GPSAltitude"), tr("Altitude"));
}
}

View File

@ -32,6 +32,7 @@ void NavigatorView::updateMainViewportRegion()
{
if (m_mainView != nullptr) {
m_viewportRegion = mapFromScene(m_mainView->mapToScene(m_mainView->rect()));
update();
}
}
@ -44,7 +45,7 @@ void NavigatorView::mousePressEvent(QMouseEvent *event)
update();
}
return QGraphicsView::mousePressEvent(event);
event->accept();
}
void NavigatorView::mouseMoveEvent(QMouseEvent *event)
@ -52,16 +53,17 @@ void NavigatorView::mouseMoveEvent(QMouseEvent *event)
if (m_mouseDown && m_mainView) {
m_mainView->centerOn(mapToScene(event->pos()));
update();
event->accept();
} else {
event->ignore();
}
return QGraphicsView::mouseMoveEvent(event);
}
void NavigatorView::mouseReleaseEvent(QMouseEvent *event)
{
m_mouseDown = false;
return QGraphicsView::mouseReleaseEvent(event);
event->accept();
}
void NavigatorView::wheelEvent(QWheelEvent *event)

164
app/playlistmanager.cpp Normal file
View File

@ -0,0 +1,164 @@
#include "playlistmanager.h"
#include <QCollator>
#include <QDir>
#include <QFileInfo>
#include <QUrl>
PlaylistManager::PlaylistManager(PlaylistType type, QObject *parent)
: QObject(parent)
, m_type(type)
{
}
PlaylistManager::~PlaylistManager()
{
}
void PlaylistManager::setPlaylistType(PlaylistManager::PlaylistType type)
{
m_type = type;
}
PlaylistManager::PlaylistType PlaylistManager::playlistType() const
{
return m_type;
}
QStringList PlaylistManager::autoLoadFilterSuffix() const
{
return m_autoLoadSuffix;
}
void PlaylistManager::setAutoLoadFilterSuffix(const QStringList & nameFilters)
{
m_autoLoadSuffix = nameFilters;
}
void PlaylistManager::clear()
{
m_currentIndex = -1;
m_playlist.clear();
}
void PlaylistManager::setPlaylist(const QList<QUrl> &urls)
{
m_playlist = urls;
}
void PlaylistManager::setCurrentFile(const QString & filePath)
{
QFileInfo info(filePath);
QDir dir(info.path());
QString && currentFileName = info.fileName();
switch (playlistType()) {
case PL_SAMEFOLDER: {
if (dir.path() == m_currentDir) {
int index = indexOf(filePath);
m_currentIndex = index == -1 ? appendFile(filePath) : index;
} else {
QStringList entryList = dir.entryList(
m_autoLoadSuffix,
QDir::Files | QDir::NoSymLinks, QDir::NoSort);
QCollator collator;
collator.setNumericMode(true);
std::sort(entryList.begin(), entryList.end(), collator);
clear();
int index = -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);
m_playlist.append(url);
if (fileName == currentFileName) {
index = i;
}
}
m_currentIndex = index == -1 ? appendFile(filePath) : index;
m_currentDir = dir.path();
}
break;
}
case PL_USERPLAYLIST:{
int index = indexOf(filePath);
m_currentIndex = index == -1 ? appendFile(filePath) : index;
break;
}
default:
break;
}
emit loaded(m_playlist.count());
}
void PlaylistManager::setCurrentIndex(int index)
{
if (index < 0 || index >= m_playlist.count()) return;
m_currentIndex = index;
}
int PlaylistManager::appendFile(const QString &filePath)
{
int index = m_playlist.length();
m_playlist.append(QUrl::fromLocalFile(filePath));
return index;
}
int PlaylistManager::indexOf(const QString &filePath)
{
const QUrl & url = QUrl::fromLocalFile(filePath);
return m_playlist.indexOf(url);
}
std::tuple<int, QString> PlaylistManager::previousFile() const
{
int count = m_playlist.count();
if (count == 0) return std::make_tuple(-1, QString());
int index = m_currentIndex - 1 < 0 ? count - 1 : m_currentIndex - 1;
return std::make_tuple(index, m_playlist.at(index).toLocalFile());
}
std::tuple<int, QString> PlaylistManager::nextFile() const
{
int count = m_playlist.count();
if (count == 0) return std::make_tuple(-1, QString());
int index = m_currentIndex + 1 == count ? 0 : m_currentIndex + 1;
return std::make_tuple(index, m_playlist.at(index).toLocalFile());
}
std::tuple<int, QString> PlaylistManager::currentFile() const
{
if (m_playlist.count() == 0) return std::make_tuple(-1, QString());
return std::make_tuple(m_currentIndex, m_playlist.at(m_currentIndex).toLocalFile());
}
std::tuple<int, QUrl> PlaylistManager::currentFileUrl() const
{
if (m_playlist.count() == 0) return std::make_tuple(-1, QUrl());
return std::make_tuple(m_currentIndex, m_playlist.at(m_currentIndex));
}
QList<QUrl> PlaylistManager::convertToUrlList(const QStringList &files)
{
QList<QUrl> urlList;
for (const QString & str : qAsConst(files)) {
QUrl url = QUrl::fromLocalFile(str);
if (url.isValid()) {
urlList.append(url);
}
}
return urlList;
}

48
app/playlistmanager.h Normal file
View File

@ -0,0 +1,48 @@
#pragma once
#include <QObject>
class PlaylistManager : public QObject
{
Q_OBJECT
public:
enum PlaylistType {
PL_USERPLAYLIST, // Regular playlist, managed by user.
PL_SAMEFOLDER // PlaylistManager managed playlist, loaded from files from same folder.
};
explicit PlaylistManager(PlaylistType type = PL_USERPLAYLIST, QObject *parent = nullptr);
~PlaylistManager();
void setPlaylistType(PlaylistType type);
PlaylistType playlistType() const;
QStringList autoLoadFilterSuffix() const;
void setAutoLoadFilterSuffix(const QStringList &nameFilters);
void clear();
void setPlaylist(const QList<QUrl> & urls);
void setCurrentFile(const QString & filePath);
void setCurrentIndex(int index);
int appendFile(const QString & filePath);
int indexOf(const QString & filePath);
std::tuple<int, QString> previousFile() const;
std::tuple<int, QString> nextFile() const;
std::tuple<int, QString> currentFile() const;
std::tuple<int, QUrl> currentFileUrl() const;
static QList<QUrl> convertToUrlList(const QStringList & files);
signals:
void loaded(int length);
private:
QList<QUrl> m_playlist;
PlaylistType m_type;
QString m_currentDir;
int m_currentIndex = -1;
QStringList m_autoLoadSuffix = {};
};

View File

@ -28,6 +28,13 @@ DoubleClickBehavior Settings::doubleClickBehavior()
return stringToDoubleClickBehavior(result);
}
MouseWheelBehavior Settings::mouseWheelBehavior()
{
QString result = m_qsettings->value("mouse_wheel_behavior", "close").toString().toLower();
return stringToMouseWheelBehavior(result);
}
void Settings::setStayOnTop(bool on)
{
m_qsettings->setValue("stay_on_top", on);
@ -40,6 +47,12 @@ void Settings::setDoubleClickBehavior(DoubleClickBehavior dcb)
m_qsettings->sync();
}
void Settings::setMouseWheelBehavior(MouseWheelBehavior mwb)
{
m_qsettings->setValue("mouse_wheel_behavior", mouseWheelBehaviorToString(mwb));
m_qsettings->sync();
}
QString Settings::doubleClickBehaviorToString(DoubleClickBehavior dcb)
{
static QMap<DoubleClickBehavior, QString> _map {
@ -51,6 +64,16 @@ QString Settings::doubleClickBehaviorToString(DoubleClickBehavior dcb)
return _map.value(dcb, "close");
}
QString Settings::mouseWheelBehaviorToString(MouseWheelBehavior mwb)
{
static QMap<MouseWheelBehavior, QString> _map {
{ActionZoomImage, "zoom"},
{ActionPrevNextImage, "switch"}
};
return _map.value(mwb, "zoom");
}
DoubleClickBehavior Settings::stringToDoubleClickBehavior(QString str)
{
static QMap<QString, DoubleClickBehavior> _map {
@ -62,6 +85,16 @@ DoubleClickBehavior Settings::stringToDoubleClickBehavior(QString str)
return _map.value(str, ActionCloseWindow);
}
MouseWheelBehavior Settings::stringToMouseWheelBehavior(QString str)
{
static QMap<QString, MouseWheelBehavior> _map {
{"zoom", ActionZoomImage},
{"switch", ActionPrevNextImage}
};
return _map.value(str, ActionZoomImage);
}
Settings::Settings()
: QObject(qApp)
{

View File

@ -8,8 +8,16 @@ enum DoubleClickBehavior {
ActionCloseWindow,
ActionMaximizeWindow,
ActionStart = ActionDoNothing,
ActionEnd = ActionMaximizeWindow
DCActionStart = ActionDoNothing,
DCActionEnd = ActionMaximizeWindow
};
enum MouseWheelBehavior {
ActionZoomImage,
ActionPrevNextImage,
MWActionStart = ActionZoomImage,
MWActionEnd = ActionPrevNextImage
};
class Settings : public QObject
@ -20,12 +28,16 @@ public:
bool stayOnTop();
DoubleClickBehavior doubleClickBehavior();
MouseWheelBehavior mouseWheelBehavior();
void setStayOnTop(bool on);
void setDoubleClickBehavior(DoubleClickBehavior dcb);
void setMouseWheelBehavior(MouseWheelBehavior mwb);
static QString doubleClickBehaviorToString(DoubleClickBehavior dcb);
static QString mouseWheelBehaviorToString(MouseWheelBehavior mwb);
static DoubleClickBehavior stringToDoubleClickBehavior(QString str);
static MouseWheelBehavior stringToMouseWheelBehavior(QString str);
private:
Settings();

View File

@ -11,29 +11,44 @@ SettingsDialog::SettingsDialog(QWidget *parent)
: QDialog(parent)
, m_stayOnTop(new QCheckBox)
, m_doubleClickBehavior(new QComboBox)
, m_mouseWheelBehavior(new QComboBox)
{
this->setWindowTitle(tr("Settings"));
QFormLayout * settingsForm = new QFormLayout(this);
static QMap<DoubleClickBehavior, QString> _map {
static QMap<DoubleClickBehavior, QString> _dc_map {
{ ActionDoNothing, tr("Do nothing") },
{ ActionCloseWindow, tr("Close the window") },
{ ActionMaximizeWindow, tr("Toggle maximize") }
};
QStringList dropDown;
for (int dcb = ActionStart; dcb <= ActionEnd; dcb++) {
dropDown.append(_map.value(static_cast<DoubleClickBehavior>(dcb)));
static QMap<MouseWheelBehavior, QString> _mw_map {
{ ActionZoomImage, tr("Zoom in and out") },
{ ActionPrevNextImage, tr("View next or previous item") }
};
QStringList dcbDropDown;
for (int dcb = DCActionStart; dcb <= DCActionEnd; dcb++) {
dcbDropDown.append(_dc_map.value(static_cast<DoubleClickBehavior>(dcb)));
}
QStringList mwbDropDown;
for (int mwb = MWActionStart; mwb <= MWActionEnd; mwb++) {
mwbDropDown.append(_mw_map.value(static_cast<MouseWheelBehavior>(mwb)));
}
settingsForm->addRow(tr("Stay on top when start-up"), m_stayOnTop);
settingsForm->addRow(tr("Double-click behavior"), m_doubleClickBehavior);
settingsForm->addRow(tr("Mouse wheel behavior"), m_mouseWheelBehavior);
m_stayOnTop->setChecked(Settings::instance()->stayOnTop());
m_doubleClickBehavior->setModel(new QStringListModel(dropDown));
m_doubleClickBehavior->setModel(new QStringListModel(dcbDropDown));
DoubleClickBehavior dcb = Settings::instance()->doubleClickBehavior();
m_doubleClickBehavior->setCurrentIndex(static_cast<int>(dcb));
m_mouseWheelBehavior->setModel(new QStringListModel(mwbDropDown));
MouseWheelBehavior mwb = Settings::instance()->mouseWheelBehavior();
m_mouseWheelBehavior->setCurrentIndex(static_cast<int>(mwb));
connect(m_stayOnTop, &QCheckBox::stateChanged, this, [ = ](int state){
Settings::instance()->setStayOnTop(state == Qt::Checked);
@ -43,6 +58,10 @@ SettingsDialog::SettingsDialog(QWidget *parent)
Settings::instance()->setDoubleClickBehavior(static_cast<DoubleClickBehavior>(index));
});
connect(m_mouseWheelBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
Settings::instance()->setMouseWheelBehavior(static_cast<MouseWheelBehavior>(index));
});
this->setMinimumSize(300, 61); // not sure why it complain "Unable to set geometry"
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
}

View File

@ -20,6 +20,7 @@ public slots:
private:
QCheckBox * m_stayOnTop = nullptr;
QComboBox * m_doubleClickBehavior = nullptr;
QComboBox * m_mouseWheelBehavior = nullptr;
};
#endif // SETTINGSDIALOG_H

View File

@ -4,158 +4,163 @@
<context>
<name>AboutDialog</name>
<message>
<location filename="../app/aboutdialog.cpp" line="23"/>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="26"/>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="27"/>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="28"/>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="32"/>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="36"/>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="45"/>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="48"/>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="50"/>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="52"/>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="53"/>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="63"/>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="65"/>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="66"/>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="70"/>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="71"/>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="115"/>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="139"/>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="141"/>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="77"/>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="79"/>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="80"/>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="81"/>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="82"/>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="83"/>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="84"/>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="86"/>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="114"/>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="137"/>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="138"/>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="140"/>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation type="unfinished"></translation>
</message>
@ -163,7 +168,7 @@
<context>
<name>GraphicsScene</name>
<message>
<location filename="../app/graphicsscene.cpp" line="16"/>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation type="unfinished"></translation>
</message>
@ -171,28 +176,28 @@
<context>
<name>GraphicsView</name>
<message>
<location filename="../app/graphicsview.cpp" line="254"/>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="46"/>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="48"/>
<location filename="../app/graphicsview.cpp" line="52"/>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="262"/>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation type="unfinished"></translation>
</message>
@ -200,67 +205,87 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../app/mainwindow.cpp" line="178"/>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="408"/>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="429"/>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="434"/>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="444"/>
<source>&amp;Paste Image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="450"/>
<source>&amp;Paste Image File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="483"/>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="31"/>
<location filename="../app/mainwindow.cpp" line="455"/>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="35"/>
<location filename="../app/mainwindow.cpp" line="462"/>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="469"/>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="476"/>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../app/metadatadialog.cpp" line="80"/>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation type="unfinished"></translation>
</message>
@ -268,249 +293,289 @@
<context>
<name>MetadataModel</name>
<message>
<location filename="../app/metadatamodel.cpp" line="36"/>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="37"/>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="43"/>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="38"/>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="28"/>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="35"/>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="39"/>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="46"/>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="48"/>
<source>Aspect Ratio</source>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="51"/>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="53"/>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="55"/>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="57"/>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="59"/>
<source>Date Created</source>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="61"/>
<source>Date Modified</source>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="68"/>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="73"/>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="75"/>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="77"/>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="80"/>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="82"/>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="84"/>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="86"/>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="89"/>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="91"/>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="93"/>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="95"/>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="97"/>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="99"/>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="101"/>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="103"/>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="105"/>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="107"/>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="109"/>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="112"/>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="114"/>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="116"/>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="118"/>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="120"/>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="122"/>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="124"/>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="126"/>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="135"/>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="153"/>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation type="unfinished"></translation>
</message>
@ -518,45 +583,60 @@
<context>
<name>SettingsDialog</name>
<message>
<location filename="../app/settingsdialog.cpp" line="15"/>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="20"/>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="21"/>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="22"/>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="30"/>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="31"/>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../app/main.cpp" line="28"/>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/main.cpp" line="32"/>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation type="unfinished"></translation>
</message>

View File

@ -4,162 +4,163 @@
<context>
<name>AboutDialog</name>
<message>
<location filename="../app/aboutdialog.cpp" line="23"/>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>Über</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="26"/>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation>Starten Sie die Anwendung mit dem Bilddateipfad als Argument zum Laden der Datei.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="27"/>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation>Das Ziehen und Ablegen von Bilddateien in das Fenster wird ebenfalls unterstützt.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="28"/>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation>Erklärung der Kontextmenüoptionen:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="32"/>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation>Sicher stellen, dass das Fenster über allen anderen Fenstern bleibt.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="36"/>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>Es vermeiden, das Fenster versehentlich zu schließen. (z.B. durch Doppelklick auf das Fenster)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="45"/>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>Version: %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="48"/>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation>Copyright © 2020 %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="50"/>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Logo entworfen von %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="52"/>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>Gemacht mit Qt %1 (%2)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="53"/>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation>Quellcode</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="63"/>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation>Mitwirkenden</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="65"/>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>Liste der Mitwirkenden auf GitHub</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="66"/>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Vielen Dank an alle, die zu diesem Projekt beigetragen haben.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="70"/>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation>Übersetzer</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="71"/>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>Ich möchte den folgenden Personen danken, die sich freiwillig zur Übersetzung dieser Anwendung gemeldet haben.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="115"/>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation type="unfinished">%1 basiert auf den folgenden freien Softwarebibliotheken:</translation>
<translation>%1 basiert auf den folgenden freien Softwarebibliotheken:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="139"/>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Besonderer Dank</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="141"/>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation>&amp;Bibliotheken von Drittanbietern</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="77"/>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation>Ihre Rechte</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="79"/>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 wird unter der MIT-Lizenz veröffentlicht.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="80"/>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation>Diese Lizenz gewährt Menschen eine Reihe von Freiheiten:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="81"/>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation>Sie dürfen %1 für jeden Zweck verwenden</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="82"/>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation>Sie dürfen %1 verteilen</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="83"/>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation>Sie können untersuchen, wie %1 funktioniert, und es ändern</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="84"/>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation>Sie können geänderte Versionen von %1 verteilen</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="86"/>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation>Die MIT-Lizenz garantiert Ihnen diese Freiheit. Niemand darf es jemals wegnehmen.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="114"/>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation>Von %1 verwendete Bibliotheken von Drittanbietern</translation>
</message>
<message>
<source>%1 is built on the following free software libraries:</source>
<translation type="vanished">%1 basiert auf den folgenden freien Softwarebibliotheken:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="137"/>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>&amp;Hilfe</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="138"/>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>&amp;Über</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="140"/>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>&amp;Lizenz</translation>
</message>
@ -167,7 +168,7 @@
<context>
<name>GraphicsScene</name>
<message>
<location filename="../app/graphicsscene.cpp" line="16"/>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation>Ziehen Sie das Bild hierher</translation>
</message>
@ -175,28 +176,28 @@
<context>
<name>GraphicsView</name>
<message>
<location filename="../app/graphicsview.cpp" line="254"/>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation>Die Datei-URL-Liste ist leer</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="46"/>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation>Datei ist kein gültiges Bild</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="48"/>
<location filename="../app/graphicsview.cpp" line="52"/>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation>Bilddaten sind ungültig oder werden derzeit nicht unterstützt</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="262"/>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation>Bilddaten sind ungültig</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation>Nicht unterstützte Mimedaten: %1</translation>
</message>
@ -204,67 +205,87 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../app/mainwindow.cpp" line="178"/>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation>Die Datei-URL-Liste ist leer</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="408"/>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>&amp;Kopieren</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="429"/>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation>P&amp;ixmap kopieren</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="434"/>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation>&amp;Dateipfad kopieren</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="444"/>
<source>&amp;Paste Image</source>
<translation>Bild &amp;einfügen</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="450"/>
<source>&amp;Paste Image File</source>
<translation>Bilddatei &amp;einfügen</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="483"/>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation>Eigenschaften</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="31"/>
<location filename="../app/mainwindow.cpp" line="455"/>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation>Oben bleiben</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="35"/>
<location filename="../app/mainwindow.cpp" line="462"/>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation>Geschützter Modus</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="469"/>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation>Konfigurieren&#xa0;</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="476"/>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation>Hilfe</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../app/metadatadialog.cpp" line="80"/>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation>Bildmetadaten</translation>
</message>
@ -272,249 +293,289 @@
<context>
<name>MetadataModel</name>
<message>
<location filename="../app/metadatamodel.cpp" line="36"/>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation>Ursprung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="37"/>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation>Bild</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="43"/>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation>Datei</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="38"/>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation>Fotoapparat</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="28"/>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>%1-Datei</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="35"/>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>Beschreibung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="39"/>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation>Erweitertes Foto</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="46"/>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation>Maße</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="48"/>
<source>Aspect Ratio</source>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation>Seitenverhältnis</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="51"/>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="53"/>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation>Objekttyp</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="55"/>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation>Ordnerpfad</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="57"/>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation>Größe</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="59"/>
<source>Date Created</source>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation>Datum erstellt</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="61"/>
<source>Date Modified</source>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation>Datum geändert</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="68"/>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation>Bewertung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation>Kommentare</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="73"/>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation>Autoren</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="75"/>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation>Datum genommen</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="77"/>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation>Programmname</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="80"/>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation>Horizontale Auflösung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="82"/>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation>Vertikale Auflösung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="84"/>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation>Auflösungseinheit</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="86"/>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation>Farbdarstellung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="89"/>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation>Kamerahersteller</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="91"/>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation>Kameramodell</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="93"/>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation>Blendenzahl</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="95"/>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation>Belichtungszeit</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="97"/>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation>ISO-Geschwindigkeit</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="99"/>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation>Belichtungskorrektur</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="101"/>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation>Brennweite</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="103"/>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation>Maximale Blende</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="105"/>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation>Messmodus</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="107"/>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation>Flash-Modus</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="109"/>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation>35&#xa0;mm Brennweite</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="112"/>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation>Objektivmodell</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="114"/>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation>Helligkeit</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="116"/>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation>Belichtungsprogramm</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="118"/>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation>Sättigung</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="120"/>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation>Schärfe</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="122"/>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation>Weißabgleich</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="124"/>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation>Digitaler Zoom</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="126"/>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation>EXIF-Version</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="135"/>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation>Breitengrad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation>Längengrad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation>Höhe</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 × %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="153"/>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation>Eigenschaft</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation>Wert</translation>
</message>
@ -522,45 +583,60 @@
<context>
<name>SettingsDialog</name>
<message>
<location filename="../app/settingsdialog.cpp" line="15"/>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="20"/>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation>Nichts tun</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="21"/>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation>Fenster schließen</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="22"/>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation>Maximieren umschalten</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="30"/>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation>Beim Start oben bleiben</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="31"/>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation>Doppelklickverhalten</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../app/main.cpp" line="28"/>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation>Pineapple Pictures</translation>
</message>
<message>
<location filename="../app/main.cpp" line="32"/>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation>Dateiliste.</translation>
</message>

View File

@ -0,0 +1,644 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es">
<context>
<name>AboutDialog</name>
<message>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>Acerca de</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation>Lanza la aplicación con la ruta del archivo de imagen como argumento para cargar el archivo.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation>También se admite la función de arrastrar y soltar el archivo de imagen en la ventana.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation>Explicación de la opción del menú contextual:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation>Haz que la ventana se quede encima de todas las demás ventanas.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>Evita cerrar la ventana accidentalmente. (por ejemplo, haciendo doble clic en la ventana)</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>Versión: %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation>Derechos reservados (c) 2020 %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Logo diseñado por %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>Construido con Qt %1 (%2)</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation>Código fuente</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation>Colaboradores</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>Lista de colaboradores en GitHub</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Gracias a todas las personas que contibuyen a este proyecto.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation>Traductores</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>Me gustaría dar las gracias a las siguientes personas que se ofrecieron a traducir esta solicitud.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation>%1 está construido sobre las siguientes bibliotecas de software libre:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Agradecimiento especial</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GraphicsScene</name>
<message>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GraphicsView</name>
<message>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataModel</name>
<message>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -4,162 +4,163 @@
<context>
<name>AboutDialog</name>
<message>
<location filename="../app/aboutdialog.cpp" line="23"/>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>À propos</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="26"/>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation>Lancer l&apos;application avec le chemin du fichier image comme argument pour charger le fichier.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="27"/>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation>Le glisser-déposer du fichier image sur la fenêtre est également pris en charge.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="28"/>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation>Explication des options du menu contextuel&#xa0;:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="32"/>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation>Faire en sorte que la fenêtre reste au-dessus de toutes les autres fenêtres.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="36"/>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>Éviter de fermer la fenêtre accidentellement. (par exemple en cliquant deux fois sur la fenêtre)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="45"/>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>Version&#xa0;: %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="48"/>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation>Copyright © 2020 %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="50"/>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Logo conçu par %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="52"/>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>Fait avec Qt %1 (%2)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="53"/>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation>Code source</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="63"/>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation>Contributeurs</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="65"/>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>Liste des contributeurs sur GitHub</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="66"/>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Merci à toutes les personnes qui ont contribué à ce projet.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="70"/>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation>Traducteurs</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="71"/>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>Je tiens à remercier les personnes suivantes qui se sont portées volontaires pour traduire cette application.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="115"/>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation type="unfinished">%1 est basé sur les bibliothèques de logiciels libres suivantes&#xa0;:</translation>
<translation>%1 est basé sur les bibliothèques de logiciels libres suivantes&#xa0;:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="139"/>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Remerciement spécial</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="141"/>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation>&amp;Bibliothèques tierces</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="77"/>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation>Vos droits</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="79"/>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 est publié sous licence MIT.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="80"/>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation>Cette licence accorde aux personnes un certain nombre de libertés&#xa0;:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="81"/>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation>Vous êtes libre d&apos;utiliser %1, dans n&apos;importe quel but</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="82"/>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation>Vous êtes libre de distribuer %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="83"/>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation>Vous pouvez étudier le fonctionnement de %1 et le modifier</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="84"/>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation>Vous pouvez distribuer des versions modifiées de %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="86"/>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation>La licence MIT vous garantit cette liberté. Personne n&apos;est autorisé à l&apos;enlever.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="114"/>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation>Bibliothèques tierces utilisées par %1</translation>
</message>
<message>
<source>%1 is built on the following free software libraries:</source>
<translation type="vanished">%1 est basé sur les bibliothèques de logiciels libres suivantes&#xa0;:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="137"/>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>&amp;Aide</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="138"/>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>&amp;À propos</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="140"/>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>&amp;Licence</translation>
</message>
@ -167,7 +168,7 @@
<context>
<name>GraphicsScene</name>
<message>
<location filename="../app/graphicsscene.cpp" line="16"/>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation>Faites glisser l&apos;image ici</translation>
</message>
@ -175,28 +176,28 @@
<context>
<name>GraphicsView</name>
<message>
<location filename="../app/graphicsview.cpp" line="254"/>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation>La liste des URL du fichier est vide</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="46"/>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation>Le fichier n&apos;est pas une image valide</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="48"/>
<location filename="../app/graphicsview.cpp" line="52"/>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation>Les données d&apos;image ne sont pas valides ou ne sont actuellement pas prises en charge</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="262"/>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation>Les données d&apos;image ne sont pas valides</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation>Mimedata non pris en charge&#xa0;: %1</translation>
</message>
@ -204,67 +205,87 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../app/mainwindow.cpp" line="178"/>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation>La liste des URL de fichiers est vide</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="408"/>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>&amp;Copier</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="429"/>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation>Copier P&amp;ixmap</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="434"/>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation>Copier le &amp;chemin du fichier</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="444"/>
<source>&amp;Paste Image</source>
<translation>&amp;Coller l&apos;image</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="450"/>
<source>&amp;Paste Image File</source>
<translation>&amp;Coller le fichier d&apos;image</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="483"/>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation>Propriétés</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="31"/>
<location filename="../app/mainwindow.cpp" line="455"/>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation>Rester en-haut</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="35"/>
<location filename="../app/mainwindow.cpp" line="462"/>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation>Mode protégé</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="469"/>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation>Configurer</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="476"/>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../app/metadatadialog.cpp" line="80"/>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation>Métadonnées d&apos;image</translation>
</message>
@ -272,249 +293,289 @@
<context>
<name>MetadataModel</name>
<message>
<location filename="../app/metadatamodel.cpp" line="36"/>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation>Origine</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="37"/>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation>Image</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="43"/>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation>Fichier</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="38"/>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation>Appareil photo</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="28"/>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>Fichier %1</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="35"/>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>Description</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="39"/>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation>Photo avancée</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="46"/>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation>Dimensions</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="48"/>
<source>Aspect Ratio</source>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation>Rapport d&apos;aspect</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="51"/>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation>Nom</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="53"/>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation>Type d&apos;élément</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="55"/>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation>Chemin du dossier</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="57"/>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation>Taille</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="59"/>
<source>Date Created</source>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation>Date créée</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="61"/>
<source>Date Modified</source>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation>Date modifiée</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="68"/>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation>Évaluation</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation>Commentaires</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="73"/>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation>Auteurs</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="75"/>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation>Date prise</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="77"/>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation>Nom du programme</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="80"/>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation>Résolution horizontale</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="82"/>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation>Résolution verticale</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="84"/>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation>Unité de résolution</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="86"/>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation>Représentation des couleurs</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="89"/>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation>Fabricant de l&apos;appareil photo</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="91"/>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation>Modèle d&apos;appareil photo</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="93"/>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation>Nombre d&apos;ouverture</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="95"/>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation>Temps d&apos;exposition</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="97"/>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation>Vitesse ISO</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="99"/>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation>Biais d&apos;exposition</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="101"/>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation>Distance focale</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="103"/>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation>Ouverture maximale</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="105"/>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation>Mode de mesure</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="107"/>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation>Mode flash</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="109"/>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation>Distance focale de 35&#xa0;mm</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="112"/>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation>Modèle d&apos;objectif</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="114"/>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation>Luminosité</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="116"/>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation>Programme d&apos;exposition</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="118"/>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation>Saturation</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="120"/>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation>Netteté</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="122"/>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation>Balance des blancs</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="124"/>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation>Zoom numérique</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="126"/>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation>Version EXIF</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="135"/>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation>Référence de latitude</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation>Latitude</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation>Référence de longitude</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation>Longitude</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation>Référence d&apos;altitude</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation>Altitude</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 × %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="153"/>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation>Propriété</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation>Valeur</translation>
</message>
@ -522,45 +583,60 @@
<context>
<name>SettingsDialog</name>
<message>
<location filename="../app/settingsdialog.cpp" line="15"/>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation>Paramètres</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="20"/>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation>Ne rien faire</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="21"/>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation>Fermer la fenêtre</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="22"/>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation>Activer/désactiver l&apos;agrandissement</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="30"/>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation>Rester en-haut lors du démarrage</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="31"/>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation>Comportement du double-clic</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../app/main.cpp" line="28"/>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation>Pineapple Pictures</translation>
</message>
<message>
<location filename="../app/main.cpp" line="32"/>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation>Liste des fichiers.</translation>
</message>

View File

@ -4,162 +4,163 @@
<context>
<name>AboutDialog</name>
<message>
<location filename="../app/aboutdialog.cpp" line="23"/>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>Om</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="26"/>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation>Kjør programmer ved å angi en filsti som argument for å laste inn filen.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="27"/>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation>Å dra og slippe filen i vinduet støttes også.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="28"/>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation>Ingen av operasjonene i dette programmet vil endre bildet som det er lagret.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation>Forklaring av alternativer i bindeleddsmeny:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="32"/>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation> vinduet til å alltid ligge over andre vinduer.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="36"/>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>Unngå lukking av vinduet ved feiltagelser (f.eks. ved dobbeltklikking av vinduet)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="45"/>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>Versjon: %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="48"/>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation>Opphavsrett © 2020 %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="50"/>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Logo designet av %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="52"/>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>Bygd med Qt %1 (%2)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="53"/>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation>Kildekode</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="63"/>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation>Bidragsytere</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="65"/>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>Liste over bidragsytere GitHub</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="66"/>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Takk til alle som har bidratt til prosjektet.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="70"/>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation>Oversettere</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="71"/>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>Takk til følgende dugnadsoversettere.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="115"/>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation type="unfinished">%1 er bygd med følgende friprog-bibliotek:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="139"/>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Spesiell takk til</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="141"/>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation>&amp;Tredjepartslisenser</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="77"/>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation>Dine rettigheter</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="79"/>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 er MIT-lisensiert.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="80"/>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation>Lisensen gir den en rekke friheter:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="81"/>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation>Du kan bruke %1 som du vil</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="82"/>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation>Du kan dele %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="83"/>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation>Du kan se kildekoden til %1 og endre den</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="84"/>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation>Du kan distribuere endrede versjoner av %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="86"/>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation>MIT-lisensen garanterer deg disse frihetene.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="114"/>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation>Tredjepartsbibliotek brukt av %1</translation>
</message>
<message>
<source>%1 is built on the following free software libraries:</source>
<translation type="vanished">%1 er bygd med følgende friprog-bibliotek:</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="137"/>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>&amp;Hjelp</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="138"/>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>&amp;Om</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="140"/>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>&amp;Lisens</translation>
</message>
@ -167,7 +168,7 @@
<context>
<name>GraphicsScene</name>
<message>
<location filename="../app/graphicsscene.cpp" line="16"/>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation>Dra bilde hit</translation>
</message>
@ -175,28 +176,28 @@
<context>
<name>GraphicsView</name>
<message>
<location filename="../app/graphicsview.cpp" line="254"/>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation>Listen over filnettadresser er tom</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="46"/>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation>Filen er ikke et gyldig bilde</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="48"/>
<location filename="../app/graphicsview.cpp" line="52"/>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation>Ugyldig bildedata, eller for tiden ustøttet</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="262"/>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation>Ugyldig bildedata</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation>Ustøttet MIME-data: %1</translation>
</message>
@ -204,67 +205,87 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../app/mainwindow.cpp" line="178"/>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation>Listen over filnettadresser er ugyldig</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="408"/>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>&amp;Kopier</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="429"/>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Kopier p&amp;ixmap</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="434"/>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation>Kopier %filsti</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="444"/>
<source>&amp;Paste Image</source>
<translation>&amp;Lim inn bilde</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="450"/>
<source>&amp;Paste Image File</source>
<translation>&amp;Lim inn bildefil</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="483"/>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation>Egenskaper</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="31"/>
<location filename="../app/mainwindow.cpp" line="455"/>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation>Behold øverst</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="35"/>
<location filename="../app/mainwindow.cpp" line="462"/>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation>Beskyttet modus</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="469"/>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation>Førstørr</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation>Forminsk</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation>Vent &amp;vanrett</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation>&amp;Lim inn</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation type="unfinished">Skru av/ rutemønster</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation>Sett opp </translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="476"/>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation>Hjelp</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation>Avslutt</translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../app/metadatadialog.cpp" line="80"/>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation>Bilde-metadata</translation>
</message>
@ -272,249 +293,289 @@
<context>
<name>MetadataModel</name>
<message>
<location filename="../app/metadatamodel.cpp" line="36"/>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
<translation>Opprinnelse</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="37"/>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation>Bilde</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="43"/>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation>Fil</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="38"/>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation>Kamera</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="28"/>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>%1-fil</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="35"/>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>Beskrivelse</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="39"/>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation>Avansert bilde</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="46"/>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation>Dimensjoner</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="48"/>
<source>Aspect Ratio</source>
<translation type="unfinished"></translation>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation>Størrelsesforhold</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="51"/>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation type="unfinished">Rammeantall</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation>Navn</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="53"/>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation>Elementstype</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="55"/>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation>Mappesti</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="57"/>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation>Størrelse</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="59"/>
<source>Date Created</source>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation>Dato opprettet</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="61"/>
<source>Date Modified</source>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation>Dato endret</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="68"/>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation>Vurdering</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation>Kommentarer</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="73"/>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Opphavsmenn</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="75"/>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation>Dato tatt</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="77"/>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation>Programnavn</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="80"/>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation>Opphavsrett</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation>Vannrett oppløsning</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="82"/>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation>Loddrett oppløsning</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="84"/>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation>Oppløsningsenhet</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="86"/>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation>Fargerepresentasjon</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="89"/>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation type="unfinished"></translation>
<translation>Kamerafabrikat</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="91"/>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation>Kameramodell</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="93"/>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation>Blenderåpning</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="95"/>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation>Eksponeringstid</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="97"/>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation>ISO-hastighet</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="99"/>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Eksponeringskorrigering</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="101"/>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation>Brennvidde</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="103"/>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Maks. blenderåpning</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="105"/>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Målingsmodus</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="107"/>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation>Blitz-modus</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="109"/>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation type="unfinished"></translation>
<translation type="unfinished">35 mm-brennvidde</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="112"/>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation>Linsemodell</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="114"/>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation>Lysstyrke</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="116"/>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Eksponeringsprogram</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="118"/>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation>Metning</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="120"/>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation>Skarphet</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="122"/>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation>Hvitbalanse</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="124"/>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation>Digital forstørrelse</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="126"/>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation>EXIF-versjon</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="135"/>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation>Breddegradsreferanse</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation>Breddegrad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation>Lengdegradsreferanse</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation>Lengdegrad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation>Høydereferanse</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation>Høyde</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="153"/>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation>Egenskap</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation>Verdi</translation>
</message>
@ -522,45 +583,60 @@
<context>
<name>SettingsDialog</name>
<message>
<location filename="../app/settingsdialog.cpp" line="15"/>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation>Innstillinger</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="20"/>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation>Ikke gjør noe</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="21"/>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation>Lukk vinduet</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="22"/>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation>Veksle maksimering</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="30"/>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation>Zoom inn og ut</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation>Vis neste eller forrige element</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation>Behold i forgrunnen ved oppstart</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="31"/>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation>Dobbeltklikksoppførsel</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation>Musehjulsoppførsel</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../app/main.cpp" line="28"/>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation type="unfinished">Ananasbilder</translation>
</message>
<message>
<location filename="../app/main.cpp" line="32"/>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation>Filliste.</translation>
</message>

View File

@ -0,0 +1,644 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="nl">
<context>
<name>AboutDialog</name>
<message>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>Over</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation>Start het programma met het opgegeven afbeeldingsbestandspad.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation>U kunt tevens afbeeldingen naar het venster slepen.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation>Geen van de handelingen in dit programma veranderen de afbeeldingen op de schijf.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation>Rechtermuisknopmenu-uitleg:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation>Houdt het venster boven andere vensters.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>Voorkomt per ongeluk sluiten (bijv. door te dubbelklikken op het venster).</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>Versie: %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation>Copyright (c) 2020 %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Logo gemaakt door %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>Gebouwd met Qt %1 (%2)</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation>Broncode</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation>Bijdragers</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>Lijst met bijdragers op GitHub</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Met dank aan alle personen die hebben bijgedragen aan dit project.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation>Vertalers</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>Ik wil graag de volgende mensen bedanken die vrijwillig hebben bijgedragen aan vertalingen.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation>%1 is gebouwd met de volgende vrijesoftwarebibliotheken:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Met dank aan</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation>Ex&amp;terne bibliotheken</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation>Uw rechten</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 is uitgebracht onder de MIT-licentie.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation>Deze licentie biedt een hoop vrijheden:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation>U mag %1 gratis gebruiken, voor welk doeleinde dan ook</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation>U mag %1 vrij verspreiden</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation>U kunt bekijken hoe %1 werkt en aanpassingen doen</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation>U mag aangepaste versie van %1 vrij verspreiden</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation>De MIT-licentie garandeert u deze vrijheid, en niemand mag deze vrijheid wegnemen.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation>Door %1 gebruikte externe bibliotheken</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>&amp;Hulp</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>&amp;Over</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>&amp;Licentie</translation>
</message>
</context>
<context>
<name>GraphicsScene</name>
<message>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation>Sleep een afbeelding hierheen</translation>
</message>
</context>
<context>
<name>GraphicsView</name>
<message>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation>De bestandspadlijst is leeg</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation>Het bestand is geen afbeelding</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation>De afbeeldingsgegevens zijn beschadigd of worden niet ondersteund</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation>Beschadigde afbeeldingsgegevens</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation>Niet-ondersteunde mime-gegevens: %1</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation>De bestandspadlijst is leeg</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>&amp;Kopiëren</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation>P&amp;ixmap kopiëren</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation>&amp;Bestandspad kopiëren</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation>Eigenschappen</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation>Altijd bovenop</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation>Beschermde modus</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation>Inzoomen</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation>Uitzoomen</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation>&amp;Horizontaal spiegelen</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation>&amp;Plakken</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation>Schaakbordpatroon aan/uit</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation>Instellen...</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation>Hulp</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation>Afsluiten</translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation>Afbeeldingsmetagegevens</translation>
</message>
</context>
<context>
<name>MetadataModel</name>
<message>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation>Oorsprong</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation>Afbeelding</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation>Bestand</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation>Camera</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>%1-bestand</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>Omschrijving</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation>Uitgebreide foto</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation>Afmetingen</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation>Beeldverhouding</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation>Aantal frames</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation>Naam</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation>Soort item</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation>Bestandspad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation>Grootte</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation>Gemaakt op</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation>Bewerkt op</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation>Waardering</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation>Opmerkingen</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation>Makers</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation>Genomen op</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation>Programmanaam</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation>Copyright</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation>Horizontale resolutie</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation>Verticale resolutie</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation>Resolutie-eenheid</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation>Kleurweergave</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation>Camerafabrikant</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation>Cameramodel</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation>Openingsverhouding</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation>Belichtingstijd</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation>ISO-snelheid</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation>Belichtingsvertekening</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation>Focale lengte</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation>Max. opening</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation>Metermodus</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation>Flitsmodus</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation>35mm focale lengte</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation>Lensmodel</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation>Helderheid</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation>Belichtingsprogramma</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation>Verzadiging</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation>Scherpte</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation>Witbalans</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation>Digitale zoom</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation>EXIF-versie</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation>Breedtegraadverwijzing</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation>Breedtegraad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation>Lengtegraadverwijzing</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation>Lengtegraad</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation>Hoogteverwijzing</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation>Hoogte</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation>Eigenschap</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation>Waarde</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation>Instellingen</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation>Niets doen</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation>Venster sluiten</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation>Maximaliseren/Demaximaliseren</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation>In-/Uitzoomen</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation>Ga naar volgende of vorige item</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation>Automatisch altijd bovenop</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation>Dubbelklikgedrag</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation>Scrollwielgedrag</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation>Pineapple Afbeeldingen</translation>
</message>
<message>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation>Bestandslijst.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,644 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru">
<context>
<name>AboutDialog</name>
<message>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>О программе</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation>Запустите приложение, указав путь к файлу изображения в качестве аргумента для загрузки файла.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation>Перетаскивание файла изображения в окно также поддерживается.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation>Ни одна из операций в этом приложении не изменит изображения на диске.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation>Объяснение пунктов контекстного меню:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation>Сделать окно поверх всех остальных окон.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>Избежать случайного закрытия окна (например, двойным щелчком по окну).</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>Версия: %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation>Авторское право (c) 2020 %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Логотип разработан %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>Создано с использованием Qt %1 (%2)</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation>Исходный код</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation>Участники</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>Список участников на GitHub</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Спасибо всем, кто внёс свой вклад в этот проект.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation>Переводчики</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>Я хотел бы поблагодарить следующих людей, которые вызвались перевести это приложение.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation>%1 собран на следующих бесплатных библиотеках программного обеспечения:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Особая благодарность</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation>&amp;Сторонние библиотеки</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation>Ваши Права</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 выпущен под лицензией MIT.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation>Эта лицензия дает людям ряд свобод:</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation>Вы можете свободно использовать %1 для любых целей</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation>Вы можете свободно распространять %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation>Вы можете изучать, как работает %1, и изменять его</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation>Вы можете распространять измененные версии %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation>Лицензия MIT гарантирует вам эту свободу. Никому и никогда не разрешается забирать её.</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation>Сторонние библиотеки, используемые %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>&amp;Помощь</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>&amp;О программе</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>&amp;Лицензия</translation>
</message>
</context>
<context>
<name>GraphicsScene</name>
<message>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation>Перетащите изображение сюда</translation>
</message>
</context>
<context>
<name>GraphicsView</name>
<message>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation>Список URL-адресов файлов пуст</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation>Файл не является действительным изображением</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation>Данные изображения недействительны или в настоящее время не поддерживаются</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation>Данные изображения недействительны</translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation>Неподдерживаемые mimedata: %1</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation>Список URL-адресов файлов пуст</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>&amp;Копировать</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation>Копировать P&amp;ixmap</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation>Копировать &amp;путь к файлу</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation>Свойства</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation>Поверх всех окон</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation>Защищённый режим</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation>Увеличить</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation>Уменьшить</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation>Отразить по &amp;горизонтали</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation>&amp;Вставить</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation>Переключить шахматную доску</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation>Настроить...</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation>Помощь</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation>Выход</translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation>Метаданные изображения</translation>
</message>
</context>
<context>
<name>MetadataModel</name>
<message>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation>Происхождение</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation>Изображение</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation>Файл</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation>Камера</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>%1 Файл</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>Описание</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation>Расширенное фото</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation>Размеры</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation>Соотношение сторон</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation>Количество кадров</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation>Название</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation>Тип элемента</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation>Путь к папке</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation>Размер</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation>Дата создания</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation>Дата изменения</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation>Рейтинг</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation>Комментарии</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation>Авторы</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation>Дата захвата</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation>Название программы</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation>Авторские права</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation>Горизонтальное разрешение</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation>Вертикальное разрешение</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation>Единица разрешения</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation>Цветовое представление</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation>Производитель камеры</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation>Модель камеры</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation>F-stop</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation>Экспозиция</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation>ISO</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation>Смещение экспозиции</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation>Фокусное расстояние</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation>Максимальная апертура</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation>Режим замера</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation>Режим вспышки</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation>Фокусное расстояние 35 мм</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation>Модель объектива</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation>Яркость</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation>Программа экспозиции</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation>Насыщенность</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation>Чёткость</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation>Баланс белого</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation>Цифровой зум</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation>Версия EXIF</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation>Ссылка на широту</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation>Широта</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation>Ссылка на долготу</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation>Долгота</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation>Ссылка на высоту</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation>Высота</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation>Свойство</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation>Значение</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation>Ничего не делать</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation>Закрыть окно</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation>Развернуть окно</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation>Увеличение или уменьшение изображения</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation>Следующее или предыдущее изображение</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation>Поверх всех окон при запуске</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation>Действие при двойном щелчке</translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation>Действие колеса мыши</translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation>Pineapple Pictures</translation>
</message>
<message>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation>Список файлов.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,644 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="si">
<context>
<name>AboutDialog</name>
<message>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>: %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation> () 2020 %1</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation> </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation> .</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation> .</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation> </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation>%1 </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation>%1 </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation>%1 </translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>&amp;</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>&amp;</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>&amp;</translation>
</message>
</context>
<context>
<name>GraphicsScene</name>
<message>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GraphicsView</name>
<message>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation type="unfinished"> ... (url) </translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation> </translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation> </translation>
</message>
<message>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation> ... (url) </translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>&amp;</translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MetadataModel</name>
<message>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation> %1</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation> </translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation> </translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation> </translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation> </translation>
</message>
<message>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation> .</translation>
</message>
</context>
</TS>

View File

@ -4,162 +4,163 @@
<context>
<name>AboutDialog</name>
<message>
<location filename="../app/aboutdialog.cpp" line="23"/>
<location filename="../aboutdialog.cpp" line="23"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="26"/>
<location filename="../aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="27"/>
<location filename="../aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="28"/>
<location filename="../aboutdialog.cpp" line="28"/>
<source>None of the operations in this application will alter the pictures on disk.</source>
<translation></translation>
</message>
<message>
<location filename="../aboutdialog.cpp" line="29"/>
<source>Context menu option explanation:</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="32"/>
<location filename="../aboutdialog.cpp" line="36"/>
<source>Make window stay on top of all other windows.</source>
<translation>使</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="36"/>
<location filename="../aboutdialog.cpp" line="39"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="45"/>
<location filename="../aboutdialog.cpp" line="47"/>
<source>Version: %1</source>
<translation>: %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="48"/>
<location filename="../aboutdialog.cpp" line="50"/>
<source>Copyright (c) 2020 %1</source>
<translation> (c) 2020 %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="50"/>
<location filename="../aboutdialog.cpp" line="52"/>
<source>Logo designed by %1</source>
<translation>Logo %1 </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="52"/>
<location filename="../aboutdialog.cpp" line="54"/>
<source>Built with Qt %1 (%2)</source>
<translation>使 Qt %1 (%2) </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="53"/>
<location filename="../aboutdialog.cpp" line="55"/>
<source>Source code</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="63"/>
<location filename="../aboutdialog.cpp" line="65"/>
<source>Contributors</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="65"/>
<location filename="../aboutdialog.cpp" line="67"/>
<source>List of contributors on GitHub</source>
<translation>GitHub </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="66"/>
<location filename="../aboutdialog.cpp" line="68"/>
<source>Thanks to all people who contributed to this project.</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="70"/>
<location filename="../aboutdialog.cpp" line="72"/>
<source>Translators</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="71"/>
<location filename="../aboutdialog.cpp" line="73"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="115"/>
<location filename="../aboutdialog.cpp" line="117"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation>%1 </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="139"/>
<location filename="../aboutdialog.cpp" line="141"/>
<source>&amp;Special Thanks</source>
<translation>(&amp;S)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="141"/>
<location filename="../aboutdialog.cpp" line="143"/>
<source>&amp;Third-party Libraries</source>
<translation>(&amp;T)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="77"/>
<location filename="../aboutdialog.cpp" line="79"/>
<source>Your Rights</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="79"/>
<location filename="../aboutdialog.cpp" line="81"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 MIT </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="80"/>
<location filename="../aboutdialog.cpp" line="82"/>
<source>This license grants people a number of freedoms:</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="81"/>
<location filename="../aboutdialog.cpp" line="83"/>
<source>You are free to use %1, for any purpose</source>
<translation>使 %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="82"/>
<location filename="../aboutdialog.cpp" line="84"/>
<source>You are free to distribute %1</source>
<translation> %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="83"/>
<location filename="../aboutdialog.cpp" line="85"/>
<source>You can study how %1 works and change it</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="84"/>
<location filename="../aboutdialog.cpp" line="86"/>
<source>You can distribute changed versions of %1</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="86"/>
<location filename="../aboutdialog.cpp" line="88"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation> MIT </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="114"/>
<location filename="../aboutdialog.cpp" line="116"/>
<source>Third-party Libraries used by %1</source>
<translation>%1 使</translation>
</message>
<message>
<source>%1 is built on the following free software libraries:</source>
<translation type="vanished">%1 </translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="137"/>
<location filename="../aboutdialog.cpp" line="139"/>
<source>&amp;Help</source>
<translation>(&amp;H)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="138"/>
<location filename="../aboutdialog.cpp" line="140"/>
<source>&amp;About</source>
<translation>(&amp;A)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="140"/>
<location filename="../aboutdialog.cpp" line="142"/>
<source>&amp;License</source>
<translation>(&amp;L)</translation>
</message>
@ -167,7 +168,7 @@
<context>
<name>GraphicsScene</name>
<message>
<location filename="../app/graphicsscene.cpp" line="16"/>
<location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation></translation>
</message>
@ -175,28 +176,28 @@
<context>
<name>GraphicsView</name>
<message>
<location filename="../app/graphicsview.cpp" line="254"/>
<location filename="../graphicsview.cpp" line="291"/>
<source>File url list is empty</source>
<translation> URL </translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="46"/>
<location filename="../graphicsview.cpp" line="52"/>
<source>File is not a valid image</source>
<translation></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="48"/>
<location filename="../app/graphicsview.cpp" line="52"/>
<location filename="../graphicsview.cpp" line="57"/>
<location filename="../graphicsview.cpp" line="62"/>
<source>Image data is invalid or currently unsupported</source>
<translation></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="262"/>
<location filename="../graphicsview.cpp" line="299"/>
<source>Image data is invalid</source>
<translation></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<location filename="../graphicsview.cpp" line="306"/>
<source>Not supported mimedata: %1</source>
<translation> MimeData %1</translation>
</message>
@ -204,67 +205,87 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../app/mainwindow.cpp" line="178"/>
<location filename="../mainwindow.cpp" line="173"/>
<source>File url list is empty</source>
<translation> URL </translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="408"/>
<location filename="../mainwindow.cpp" line="384"/>
<source>&amp;Copy</source>
<translation>(&amp;C)</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="429"/>
<location filename="../actionmanager.cpp" line="50"/>
<source>Copy P&amp;ixmap</source>
<translation>(&amp;I)</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="434"/>
<location filename="../actionmanager.cpp" line="51"/>
<source>Copy &amp;File Path</source>
<translation>(&amp;F)</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="444"/>
<source>&amp;Paste Image</source>
<translation>(&amp;P)</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="450"/>
<source>&amp;Paste Image File</source>
<translation>(&amp;P)</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="483"/>
<location filename="../actionmanager.cpp" line="58"/>
<source>Properties</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="31"/>
<location filename="../app/mainwindow.cpp" line="455"/>
<location filename="../aboutdialog.cpp" line="35"/>
<location filename="../actionmanager.cpp" line="54"/>
<source>Stay on top</source>
<translation></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="35"/>
<location filename="../app/mainwindow.cpp" line="462"/>
<location filename="../aboutdialog.cpp" line="38"/>
<location filename="../actionmanager.cpp" line="55"/>
<source>Protected mode</source>
<translation></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="469"/>
<location filename="../actionmanager.cpp" line="47"/>
<source>Zoom in</source>
<translation></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="48"/>
<source>Zoom out</source>
<translation></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="49"/>
<source>Flip &amp;Horizontally</source>
<translation>(&amp;H)</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="52"/>
<source>&amp;Paste</source>
<translation>(&amp;P)</translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="53"/>
<source>Toggle Checkerboard</source>
<translation></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="56"/>
<source>Configure...</source>
<translation>...</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="476"/>
<location filename="../actionmanager.cpp" line="57"/>
<source>Help</source>
<translation></translation>
</message>
<message>
<location filename="../actionmanager.cpp" line="59"/>
<source>Quit</source>
<translation>退</translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../app/metadatadialog.cpp" line="80"/>
<location filename="../metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation></translation>
</message>
@ -272,249 +293,289 @@
<context>
<name>MetadataModel</name>
<message>
<location filename="../app/metadatamodel.cpp" line="36"/>
<location filename="../metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="37"/>
<location filename="../metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="43"/>
<location filename="../metadatamodel.cpp" line="41"/>
<source>File</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="38"/>
<location filename="../metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="28"/>
<location filename="../metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>%1 </translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="35"/>
<location filename="../metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="39"/>
<location filename="../metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<location filename="../metadatamodel.cpp" line="40"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="46"/>
<location filename="../metadatamodel.cpp" line="44"/>
<source>Dimensions</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="48"/>
<source>Aspect Ratio</source>
<location filename="../metadatamodel.cpp" line="46"/>
<source>Aspect ratio</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="51"/>
<location filename="../metadatamodel.cpp" line="49"/>
<source>Frame count</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="53"/>
<source>Name</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="53"/>
<location filename="../metadatamodel.cpp" line="55"/>
<source>Item type</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="55"/>
<location filename="../metadatamodel.cpp" line="57"/>
<source>Folder path</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="57"/>
<location filename="../metadatamodel.cpp" line="59"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="59"/>
<source>Date Created</source>
<location filename="../metadatamodel.cpp" line="61"/>
<source>Date created</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="61"/>
<source>Date Modified</source>
<location filename="../metadatamodel.cpp" line="63"/>
<source>Date modified</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="68"/>
<location filename="../metadatamodel.cpp" line="70"/>
<source>Rating</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<location filename="../metadatamodel.cpp" line="72"/>
<source>Comments</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="73"/>
<location filename="../metadatamodel.cpp" line="75"/>
<source>Authors</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="75"/>
<location filename="../metadatamodel.cpp" line="77"/>
<source>Date taken</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="77"/>
<location filename="../metadatamodel.cpp" line="79"/>
<source>Program name</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="80"/>
<location filename="../metadatamodel.cpp" line="81"/>
<source>Copyright</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="84"/>
<source>Horizontal resolution</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="82"/>
<location filename="../metadatamodel.cpp" line="86"/>
<source>Vertical resolution</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="84"/>
<location filename="../metadatamodel.cpp" line="88"/>
<source>Resolution unit</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="86"/>
<location filename="../metadatamodel.cpp" line="90"/>
<source>Colour representation</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="89"/>
<location filename="../metadatamodel.cpp" line="93"/>
<source>Camera maker</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="91"/>
<location filename="../metadatamodel.cpp" line="95"/>
<source>Camera model</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="93"/>
<location filename="../metadatamodel.cpp" line="97"/>
<source>F-stop</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="95"/>
<location filename="../metadatamodel.cpp" line="99"/>
<source>Exposure time</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="97"/>
<location filename="../metadatamodel.cpp" line="101"/>
<source>ISO speed</source>
<translation>ISO </translation>
<translation>ISO </translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="99"/>
<location filename="../metadatamodel.cpp" line="103"/>
<source>Exposure bias</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="101"/>
<location filename="../metadatamodel.cpp" line="105"/>
<source>Focal length</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="103"/>
<location filename="../metadatamodel.cpp" line="107"/>
<source>Max aperture</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="105"/>
<location filename="../metadatamodel.cpp" line="109"/>
<source>Metering mode</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="107"/>
<location filename="../metadatamodel.cpp" line="111"/>
<source>Flash mode</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="109"/>
<location filename="../metadatamodel.cpp" line="113"/>
<source>35mm focal length</source>
<translation>35mm </translation>
<translation> 35mm </translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="112"/>
<location filename="../metadatamodel.cpp" line="116"/>
<source>Lens model</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="114"/>
<location filename="../metadatamodel.cpp" line="118"/>
<source>Brightness</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="116"/>
<location filename="../metadatamodel.cpp" line="120"/>
<source>Exposure program</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="118"/>
<location filename="../metadatamodel.cpp" line="122"/>
<source>Saturation</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="120"/>
<location filename="../metadatamodel.cpp" line="124"/>
<source>Sharpness</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="122"/>
<location filename="../metadatamodel.cpp" line="126"/>
<source>White balance</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="124"/>
<location filename="../metadatamodel.cpp" line="128"/>
<source>Digital zoom</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="126"/>
<location filename="../metadatamodel.cpp" line="130"/>
<source>EXIF version</source>
<translation>EXIF </translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="135"/>
<location filename="../metadatamodel.cpp" line="133"/>
<source>Latitude reference</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="135"/>
<source>Latitude</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="137"/>
<source>Longitude reference</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="139"/>
<source>Longitude</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="141"/>
<source>Altitude reference</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="143"/>
<source>Altitude</source>
<translation></translation>
</message>
<message>
<location filename="../metadatamodel.cpp" line="153"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="153"/>
<location filename="../metadatamodel.cpp" line="171"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Property</source>
<translation></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<location filename="../metadatamodel.cpp" line="306"/>
<source>Value</source>
<translation></translation>
</message>
@ -522,45 +583,60 @@
<context>
<name>SettingsDialog</name>
<message>
<location filename="../app/settingsdialog.cpp" line="15"/>
<location filename="../settingsdialog.cpp" line="16"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="20"/>
<location filename="../settingsdialog.cpp" line="21"/>
<source>Do nothing</source>
<translation></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="21"/>
<location filename="../settingsdialog.cpp" line="22"/>
<source>Close the window</source>
<translation></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="22"/>
<location filename="../settingsdialog.cpp" line="23"/>
<source>Toggle maximize</source>
<translation></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="30"/>
<location filename="../settingsdialog.cpp" line="27"/>
<source>Zoom in and out</source>
<translation></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="28"/>
<source>View next or previous item</source>
<translation></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="41"/>
<source>Stay on top when start-up</source>
<translation></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="31"/>
<location filename="../settingsdialog.cpp" line="42"/>
<source>Double-click behavior</source>
<translation></translation>
</message>
<message>
<location filename="../settingsdialog.cpp" line="43"/>
<source>Mouse wheel behavior</source>
<translation></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../app/main.cpp" line="28"/>
<location filename="../main.cpp" line="31"/>
<source>Pineapple Pictures</source>
<translation></translation>
</message>
<message>
<location filename="../app/main.cpp" line="32"/>
<location filename="../main.cpp" line="35"/>
<source>File list.</source>
<translation></translation>
</message>

View File

@ -2,53 +2,60 @@ image:
- Visual Studio 2019
environment:
CMAKE_INSTALL_ROOT: C:\projects\cmake
ZLIB_ROOT: C:\projects\zlib
LIBZ: C:\projects\zlib
LIBEXPAT: C:\projects\libexpat
LIBAVIF: C:\projects\libavif
LIBEXIV2: C:\projects\exiv2
matrix:
- build_name: mingw81_32_qt5_15_2
QTPATH: C:\Qt\5.15.2\mingw81_32
MINGW32: C:\Qt\Tools\mingw810_32
- build_name: mingw81_64_qt5_15_2
QTPATH: C:\Qt\5.15.2\mingw81_64
MINGW64: C:\Qt\Tools\mingw810_64
install:
- mkdir %CMAKE_INSTALL_ROOT%
- mkdir %ZLIB_ROOT%
- mkdir %LIBZ%
- mkdir %LIBEXPAT%
- mkdir %LIBAVIF%
- mkdir %LIBEXIV2%
- cd %APPVEYOR_BUILD_FOLDER%
- git submodule update --init --recursive
- set PATH=%PATH%;%CMAKE_INSTALL_ROOT%;%QTPATH%\bin;%MINGW32%\bin
- set CC=%MINGW32%\bin\gcc.exe
- set CXX=%MINGW32%\bin\g++.exe
- set PATH=%PATH%;%CMAKE_INSTALL_ROOT%;%QTPATH%\bin;%MINGW64%\bin
- set CC=%MINGW64%\bin\gcc.exe
- set CXX=%MINGW64%\bin\g++.exe
build_script:
# prepare
- mkdir 3rdparty
- cinst ninja
# download and install zlib for KArchive
- cd %LIBZ%
- curl -fsSL -o zlib1211.zip https://zlib.net/zlib1211.zip
- 7z x zlib1211.zip -y
- cd zlib-1.2.11
- mkdir build
- cd build
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT%
- cmake --build . --config Release
- cmake --build . --config Release --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# install ECM so we can build KImageFormats
- cd 3rdparty
- git clone -q https://invent.kde.org/frameworks/extra-cmake-modules.git
- git rev-parse HEAD
- cd extra-cmake-modules
- cmake -G "Ninja" . -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DBUILD_TESTING=OFF
- cmake --build .
- cmake --build . --target install
- cd %APPVEYOR_BUILD_FOLDER%
# download and install zlib for KArchive
- cd %ZLIB_ROOT%
- curl -fsSL -o zlib128-dll.zip http://zlib.net/zlib128-dll.zip
- 7z x zlib128-dll.zip
- cd %APPVEYOR_BUILD_FOLDER%
# install AOM for libavif AV1 decoding support...
- cd 3rdparty
- git clone -b v2.0.1 --depth 1 https://aomedia.googlesource.com/aom
- cd aom
- mkdir build.libavif
- cd build.libavif
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DCMAKE_CXX_FLAGS_RELEASE="-s" -DENABLE_DOCS=OFF -DBUILD_SHARED_LIBS=ON -DAOM_TARGET_CPU=generic -DENABLE_TESTS=OFF -DENABLE_TESTDATA=OFF -DENABLE_TOOLS=OFF -DENABLE_EXAMPLES=0
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DENABLE_DOCS=OFF -DBUILD_SHARED_LIBS=ON -DAOM_TARGET_CPU=generic -DENABLE_TESTS=OFF -DENABLE_TESTDATA=OFF -DENABLE_TOOLS=OFF -DENABLE_EXAMPLES=0
- cmake --build . --config Release
- cmake --build . --config Release --target install
- cmake --build . --config Release --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# install libavif for avif format support of KImageFormats
- cd %LIBAVIF%
@ -57,52 +64,54 @@ build_script:
- cd libavif-0.8.4
- mkdir build
- cd build
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DCMAKE_CXX_FLAGS_RELEASE="-s" -DAVIF_CODEC_AOM=ON
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DAVIF_CODEC_AOM=ON
- cmake --build . --config Release
- cmake --build . --config Release --target install
- cmake --build . --config Release --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# install KArchive for kra format support of KImageFormats
- cd 3rdparty
- git clone -q https://invent.kde.org/frameworks/karchive.git
- git rev-parse HEAD
- cd karchive
- mkdir build
- cd build
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DCMAKE_CXX_FLAGS_RELEASE="-s" -DZLIB_ROOT=%ZLIB_ROOT%
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT%
- cmake --build . --config Release
- cmake --build . --config Release --target install
- cmake --build . --config Release --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# build libexpat for libexiv2
- cd %LIBEXPAT%
- curl -fsSL -o R_2_2_10.zip https://github.com/libexpat/libexpat/archive/R_2_2_10.zip
- 7z x R_2_2_10.zip -y
- cd libexpat-R_2_2_10/expat/
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DCMAKE_CXX_FLAGS_RELEASE="-s" -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF
- cmake --build . --target install
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF
- cmake --build . --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# build libexiv2
- cd %LIBEXIV2%
- curl -fsSL -o v0.27.3.zip https://github.com/Exiv2/exiv2/archive/v0.27.3.zip
- 7z x v0.27.3.zip -y
- cd exiv2-0.27.3
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DEXIV2_BUILD_SAMPLES=OFF -DEXIV2_ENABLE_WIN_UNICODE=ON -DCMAKE_CXX_FLAGS_RELEASE="-s" -DZLIB_ROOT=%ZLIB_ROOT%
- cmake --build . --target install
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_ROOT% -DEXIV2_BUILD_SAMPLES=OFF -DEXIV2_ENABLE_WIN_UNICODE=ON
- cmake --build . --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# install KImageFormats
- cd 3rdparty
- git clone -q https://invent.kde.org/frameworks/kimageformats.git
- git rev-parse HEAD
- cd kimageformats
- mkdir build
- cd build
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS_RELEASE="-s" -DQT_PLUGIN_INSTALL_DIR=%QTPATH%\plugins
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DKDE_INSTALL_QTPLUGINDIR=%QTPATH%\plugins
- cmake --build . --config Release
- cmake --build . --config Release --target install
- cmake --build . --config Release --target install/strip
- cd %APPVEYOR_BUILD_FOLDER%
# finally...
- mkdir build
- cd build
- cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS_RELEASE="-s" -DCMAKE_MAKE_PROGRAM=mingw32-make -DCMAKE_INSTALL_PREFIX='%cd%'
- mingw32-make
- mingw32-make install
- cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAKE_PROGRAM=mingw32-make -DCMAKE_INSTALL_PREFIX='%cd%'
- cmake --build . --config Release
- cmake --build . --config Release --target install/strip
# fixme: I don't know how to NOT make the binary installed to the ./bin/ folder...
- cd bin
- copy %APPVEYOR_BUILD_FOLDER%\LICENSE .
@ -110,7 +119,7 @@ build_script:
- copy %CMAKE_INSTALL_ROOT%\bin\libexpat.dll
- copy %CMAKE_INSTALL_ROOT%\bin\libexiv2.dll
- copy %CMAKE_INSTALL_ROOT%\bin\libavif.dll
- copy %ZLIB_ROOT%\zlib1.dll .
- copy %CMAKE_INSTALL_ROOT%\bin\libzlib.dll
- copy C:\projects\cmake\bin\libKF5Archive.dll .
- windeployqt --verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-angle --no-system-d3d-compiler .\ppic.exe
# copy 3rdparty licenses for the libs we vendored for windows...

View File

@ -1,6 +1,10 @@
<ul>
<li><u>Chinese (Simplified)</u>: Percy Hong</li>
<li><u>Dutch</u>: Heimen Stoffels</li>
<li><u>French</u>: J. Lavoie, K. Herbert</li>
<li><u>German</u>: K. Herbert, J. Lavoie</li>
<li><u>Norwegian Bokmål</u>: Allan Nordhøy</li>
<li><u>Russian</u>: Artem</li>
</ul>
<li><u>Russian</u>: Sergey Shornikov, Artem</li>
<li><u>Sinhala</u>: HelaBasa</li>
<li><u>Spanish</u>: William(ѕ)ⁿ</li>
</ul>

View File

@ -8,7 +8,7 @@
<summary>Image Viewer</summary>
<summary xml:lang="zh-CN">图像查看器</summary>
<description>
<p>Pineapple Pictures is a lightweight and easy to use image viewer, comes with a handy navigation thumbnail when zoom-in, and doesn't contains any image management support.</p>
<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="zh-CN">菠萝看图是一个轻量级易用的图像查看器,在图片放大时提供了方便的鸟瞰导航功能,且不包含任何图片管理功能。</p>
</description>
<url type="homepage">https://github.com/BLumia/pineapple-pictures</url>

View File

@ -19,6 +19,7 @@ CONFIG += c++11 lrelease embed_translations
SOURCES += \
app/aboutdialog.cpp \
app/main.cpp \
app/framelesswindow.cpp \
app/mainwindow.cpp \
app/graphicsview.cpp \
app/bottombuttongroup.cpp \
@ -30,10 +31,13 @@ SOURCES += \
app/settingsdialog.cpp \
app/metadatamodel.cpp \
app/metadatadialog.cpp \
app/exiv2wrapper.cpp
app/exiv2wrapper.cpp \
app/actionmanager.cpp \
app/playlistmanager.cpp
HEADERS += \
app/aboutdialog.h \
app/framelesswindow.h \
app/mainwindow.h \
app/graphicsview.h \
app/bottombuttongroup.h \
@ -45,15 +49,20 @@ HEADERS += \
app/settingsdialog.h \
app/metadatamodel.h \
app/metadatadialog.h \
app/exiv2wrapper.h
app/exiv2wrapper.h \
app/actionmanager.h \
app/playlistmanager.h
TRANSLATIONS = \
translations/PineapplePictures.ts \
translations/PineapplePictures_zh_CN.ts \
translations/PineapplePictures_de.ts \
translations/PineapplePictures_fr.ts \
translations/PineapplePictures_nb_NO.ts \
translations/PineapplePictures_ru.ts
app/translations/PineapplePictures.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
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
@ -64,7 +73,7 @@ RESOURCES += \
assets/resources.qrc
# Generate from svg:
# magick convert -background none app-icon.svg -define icon:auto-resize="16,32,48,64,128,256" app-icon.ico
# 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)

View File

@ -1,564 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru">
<context>
<name>AboutDialog</name>
<message>
<location filename="../app/aboutdialog.cpp" line="23"/>
<source>About</source>
<translation>О программе</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="26"/>
<source>Launch application with image file path as argument to load the file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="27"/>
<source>Drag and drop image file onto the window is also supported.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="28"/>
<source>Context menu option explanation:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="32"/>
<source>Make window stay on top of all other windows.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="36"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="45"/>
<source>Version: %1</source>
<translation>Версия: %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="48"/>
<source>Copyright (c) 2020 %1</source>
<translation>Авторское право (c) 2020 %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="50"/>
<source>Logo designed by %1</source>
<translation>Логотип разработан %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="52"/>
<source>Built with Qt %1 (%2)</source>
<translation>Создано с использованием Qt %1 (%2)</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="53"/>
<source>Source code</source>
<translation>Исходный код</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="63"/>
<source>Contributors</source>
<translation>Участники</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="65"/>
<source>List of contributors on GitHub</source>
<translation>Список участников на GitHub</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="66"/>
<source>Thanks to all people who contributed to this project.</source>
<translation>Спасибо всем, кто внес свой вклад в этот проект.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="70"/>
<source>Translators</source>
<translation>Переводчики</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="71"/>
<source>I would like to thank the following people who volunteered to translate this application.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="115"/>
<source>%1 is built on the following free software libraries:</source>
<comment>Free as in freedom</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="139"/>
<source>&amp;Special Thanks</source>
<translation>&amp;Особая благодарность</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="141"/>
<source>&amp;Third-party Libraries</source>
<translation>&amp;Сторонние библиотеки</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="77"/>
<source>Your Rights</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="79"/>
<source>%1 is released under the MIT License.</source>
<translation>%1 выпущен под лицензией MIT.</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="80"/>
<source>This license grants people a number of freedoms:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="81"/>
<source>You are free to use %1, for any purpose</source>
<translation>Вы можете использовать %1, для любых целей</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="82"/>
<source>You are free to distribute %1</source>
<translation>Вы можете свободно распространять %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="83"/>
<source>You can study how %1 works and change it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="84"/>
<source>You can distribute changed versions of %1</source>
<translation>Вы можете распространять измененные версии %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="86"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="114"/>
<source>Third-party Libraries used by %1</source>
<translation>Сторонние библиотеки, используемые %1</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="137"/>
<source>&amp;Help</source>
<translation>&amp;Помощь</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="138"/>
<source>&amp;About</source>
<translation>&amp;О программе</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="140"/>
<source>&amp;License</source>
<translation>&amp;Лицензия</translation>
</message>
</context>
<context>
<name>GraphicsScene</name>
<message>
<location filename="../app/graphicsscene.cpp" line="16"/>
<source>Drag image here</source>
<translation>Перетащите изображение сюда</translation>
</message>
</context>
<context>
<name>GraphicsView</name>
<message>
<location filename="../app/graphicsview.cpp" line="254"/>
<source>File url list is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="46"/>
<source>File is not a valid image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="48"/>
<location filename="../app/graphicsview.cpp" line="52"/>
<source>Image data is invalid or currently unsupported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="262"/>
<source>Image data is invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<source>Not supported mimedata: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../app/mainwindow.cpp" line="178"/>
<source>File url list is empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="408"/>
<source>&amp;Copy</source>
<translation>&amp;Копировать</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="429"/>
<source>Copy P&amp;ixmap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="434"/>
<source>Copy &amp;File Path</source>
<translation>Копировать &amp;Путь к файлу</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="444"/>
<source>&amp;Paste Image</source>
<translation>&amp;Вставить изображение</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="450"/>
<source>&amp;Paste Image File</source>
<translation>&amp;Вставить файл изображения</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="483"/>
<source>Properties</source>
<translation>Свойства</translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="31"/>
<location filename="../app/mainwindow.cpp" line="455"/>
<source>Stay on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/aboutdialog.cpp" line="35"/>
<location filename="../app/mainwindow.cpp" line="462"/>
<source>Protected mode</source>
<translation>Защищенный режим</translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="469"/>
<source>Configure...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/mainwindow.cpp" line="476"/>
<source>Help</source>
<translation>Помощь</translation>
</message>
</context>
<context>
<name>MetadataDialog</name>
<message>
<location filename="../app/metadatadialog.cpp" line="80"/>
<source>Image Metadata</source>
<translation>Метаданные изображения</translation>
</message>
</context>
<context>
<name>MetadataModel</name>
<message>
<location filename="../app/metadatamodel.cpp" line="36"/>
<source>Origin</source>
<comment>Section name.</comment>
<translation>Происхождение</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="37"/>
<source>Image</source>
<comment>Section name.</comment>
<translation>Изображение</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="43"/>
<source>File</source>
<comment>Section name.</comment>
<translation>Файл</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="38"/>
<source>Camera</source>
<comment>Section name.</comment>
<translation>Камера</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="28"/>
<source>%1 File</source>
<translation>%1 Файл</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="35"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>Описание</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="39"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="46"/>
<source>Dimensions</source>
<translation>Размеры</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="48"/>
<source>Aspect Ratio</source>
<translation>Соотношение сторон</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="51"/>
<source>Name</source>
<translation>Название</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="53"/>
<source>Item type</source>
<translation>Тип элемента</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="55"/>
<source>Folder path</source>
<translation>Путь к папке</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="57"/>
<source>Size</source>
<translation>Размер</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="59"/>
<source>Date Created</source>
<translation>Дата создания</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="61"/>
<source>Date Modified</source>
<translation>Дата изменения</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="68"/>
<source>Rating</source>
<translation>Рейтинг</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<source>Comments</source>
<translation>Комментарии</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="73"/>
<source>Authors</source>
<translation>Авторы</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="75"/>
<source>Date taken</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="77"/>
<source>Program name</source>
<translation>Название программы</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="80"/>
<source>Horizontal resolution</source>
<translation>Горизонтальное разрешение</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="82"/>
<source>Vertical resolution</source>
<translation>Вертикальное разрешение</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="84"/>
<source>Resolution unit</source>
<translation>Единица разрешения</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="86"/>
<source>Colour representation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="89"/>
<source>Camera maker</source>
<translation>Производитель камеры</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="91"/>
<source>Camera model</source>
<translation>Модель камеры</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="93"/>
<source>F-stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="95"/>
<source>Exposure time</source>
<translation>Экспозиция</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="97"/>
<source>ISO speed</source>
<translation>ISO</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="99"/>
<source>Exposure bias</source>
<translation>Смещение экспозиции</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="101"/>
<source>Focal length</source>
<translation>Фокусное расстояние</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="103"/>
<source>Max aperture</source>
<translation>Максимальная апертура</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="105"/>
<source>Metering mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="107"/>
<source>Flash mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="109"/>
<source>35mm focal length</source>
<translation>Фокусное расстояние 35 мм</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="112"/>
<source>Lens model</source>
<translation>Модель объектива</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="114"/>
<source>Brightness</source>
<translation>Яркость</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="116"/>
<source>Exposure program</source>
<translation>Программа экспозиции</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="118"/>
<source>Saturation</source>
<translation>Насыщенность</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="120"/>
<source>Sharpness</source>
<translation>Четкость</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="122"/>
<source>White balance</source>
<translation>Баланс белого</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="124"/>
<source>Digital zoom</source>
<translation>Цифровой зум</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="126"/>
<source>EXIF version</source>
<translation>Версия EXIF</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="135"/>
<source>%1 x %2</source>
<translation>%1 x %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="153"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<source>Property</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="288"/>
<source>Value</source>
<translation>Значение</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
<message>
<location filename="../app/settingsdialog.cpp" line="15"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="20"/>
<source>Do nothing</source>
<translation>Ничего не делать</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="21"/>
<source>Close the window</source>
<translation>Закрыть окно</translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="22"/>
<source>Toggle maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="30"/>
<source>Stay on top when start-up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/settingsdialog.cpp" line="31"/>
<source>Double-click behavior</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>main</name>
<message>
<location filename="../app/main.cpp" line="28"/>
<source>Pineapple Pictures</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/main.cpp" line="32"/>
<source>File list.</source>
<translation>Список файлов.</translation>
</message>
</context>
</TS>