diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..513eaeb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +*.kdev4 diff --git a/CMakeLists.txt b/CMakeLists.txt index aceea07..4197c35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.11) +cmake_minimum_required(VERSION 3.0.2) project(lximage-qt) @@ -10,6 +10,7 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") set(MAJOR_VERSION 0) set(MINOR_VERSION 4) set(PATCH_VERSION 0) +set(LXIMAGE_VERSION ${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -40,16 +41,14 @@ find_package(Qt5DBus REQUIRED) find_package(Qt5PrintSupport REQUIRED QUIET) find_package(Qt5X11Extras REQUIRED QUIET) find_package(Qt5LinguistTools REQUIRED QUIET) +find_package(fm-qt REQUIRED QUIET) message(STATUS "Building with Qt ${Qt5Core_VERSION_STRING}") find_package(PkgConfig REQUIRED) -pkg_check_modules(GLIB REQUIRED glib-2.0) # FIXME: we'll need this to provide detail info for photos in the future pkg_check_modules(EXIF REQUIRED libexif) -pkg_check_modules(LIBFM_QT REQUIRED libfm-qt5 libfm>=1.2) - # TODO: make the X11 stuff optional. # for screenshot support find_package(X11 REQUIRED) diff --git a/debian/changelog b/debian/changelog index 51429dd..92f568e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +lximage-qt (0.4.0+20160108-1) unstable; urgency=medium + + * Cherry-picked new upstream version 0.4.0+20160108. + * Removed outdated build dependency libfm-qt5-dev, + * Added build dependencies libfm-qt-dev and libmenu-cache-dev. + * Bump Standards to 3.9.7 + * Changed the VCS-fields to https:// + * Fix Years in copyright + * Enable hardening=+all + + -- Alf Gaida Sun, 07 Feb 2016 22:55:06 +0100 + lximage-qt (0.4.0+20151117-2) unstable; urgency=medium * Remove dbg package in favor of dbgsym. diff --git a/debian/control b/debian/control index e650844..8170279 100644 --- a/debian/control +++ b/debian/control @@ -10,16 +10,17 @@ Build-Depends: debhelper (>= 9), libexif-dev, libglib2.0-dev, libfm-dev, - libfm-qt5-dev, + libfm-qt-dev, + libmenu-cache-dev, libqt5x11extras5-dev, libx11-dev, libxfixes-dev, pkg-config, qttools5-dev, qttools5-dev-tools -Standards-Version: 3.9.6 -Vcs-Browser: http://anonscm.debian.org/cgit/pkg-lxqt/lximage-qt.git/?h=debian/sid -Vcs-Git: git://anonscm.debian.org/pkg-lxqt/lximage-qt.git -b debian/sid +Standards-Version: 3.9.7 +Vcs-Browser: https://anonscm.debian.org/git/pkg-lxqt/lximage-qt.git/?h=debian/sid +Vcs-Git: https://anonscm.debian.org/git/pkg-lxqt/lximage-qt.git -b debian/sid Homepage: https://github.com/lxde/lximage-qt Package: lximage-qt diff --git a/debian/copyright b/debian/copyright index 036ad8d..2f1a521 100644 --- a/debian/copyright +++ b/debian/copyright @@ -3,8 +3,8 @@ Upstream-Name: lximage-qt Source: https://github.com/lxde/lximage-qt Files: * -Copyright: 2013-2015 Hong Jen Yee (PCMan) - 2013-2015 LXQt team +Copyright: 2013-2016 Hong Jen Yee (PCMan) + 2013-2016 LXQt team License: GPL-2+ and LGPL-2.1+ Files: src/application.* @@ -14,7 +14,7 @@ Files: src/application.* src/preferencesdialog.* src/saveimagejob.* src/settings.* -Copyright: 2013-2015 Hong Jen Yee (PCMan) +Copyright: 2013-2016 Hong Jen Yee (PCMan) License: GPL-2+ Files: src/imageview.* @@ -27,7 +27,7 @@ Copyright: Copyright (C) 2013 - 2014 License: LGPL-2.1+ Files: debian/* -Copyright: 2014-2015 Alf Gaida +Copyright: 2014-2016 Alf Gaida 2015 Andrew Lee (李健秋) 2015 ChangZhuo Chen (陳昌倬) License: LGPL-2.1+ diff --git a/debian/rules b/debian/rules index c3be7f1..e620df4 100755 --- a/debian/rules +++ b/debian/rules @@ -1,7 +1,7 @@ #!/usr/bin/make -f #export DH_VERBOSE=1 -export DEB_CXXFLAGS_MAINT_APPEND = -fPIE -pie +export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed %: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3af7211..cfef7d0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,12 +1,7 @@ # set visibility to hidden to hide symbols, unlesss they're exporeted manually in the code -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_KEYWORDS -fno-exceptions") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") include_directories( - ${QTX_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} - ${GLIB_INCLUDE_DIRS} - ${EXIF_INCLUDE_DIRS} - ${LIBFM_QT_INCLUDE_DIRS} ${X11_INCLUDE_DIR} ${XFIXES_INCLUDE_DIRS} ) @@ -76,16 +71,15 @@ add_executable(lximage-qt add_definitions( -DLXIMAGE_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/lximage-qt" - -DLIBFM_QT_API=Q_DECL_IMPORT # FIXME: This should be done in libfm-qt headers instead :-( + -DLXIMAGE_VERSION="${LXIMAGE_VERSION}" ) set(QT_LIBRARIES Qt5::Widgets Qt5::Core Qt5::DBus Qt5::PrintSupport Qt5::X11Extras) target_link_libraries(lximage-qt + fm-qt ${QT_LIBRARIES} - ${GLIB_LIBRARIES} ${EXIF_LIBRARIES} - ${LIBFM_QT_LIBRARIES} ${X11_LIBRARIES} ${XFIXES_LIBRARIES} ) diff --git a/src/application.cpp b/src/application.cpp index 9f9af07..33e8390 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -37,6 +37,7 @@ Application::Application(int& argc, char** argv): QApplication(argc, argv), windowCount_(0), libFm() { + setApplicationVersion(LXIMAGE_VERSION); } bool Application::init(int argc, char** argv) { @@ -81,6 +82,7 @@ bool Application::init(int argc, char** argv) { bool Application::parseCommandLineArgs() { QCommandLineParser parser; parser.addHelpOption(); + parser.addVersionOption(); QCommandLineOption screenshotOption( QStringList() << "s" << "screenshot", @@ -152,7 +154,9 @@ void Application::newWindow(QStringList files) { if(settings_.windowMaximized()) window->setWindowState(window->windowState() | Qt::WindowMaximized); - window->show(); + /* when there's an image, we show the window AFTER resizing + and centering it appropriately at MainWindow::updateUI() */ + //window->show(); } } } diff --git a/src/imageview.cpp b/src/imageview.cpp index d88867f..173c179 100644 --- a/src/imageview.cpp +++ b/src/imageview.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include namespace LxImage { @@ -33,6 +35,7 @@ ImageView::ImageView(QWidget* parent): QGraphicsView(parent), imageItem_(new QGraphicsRectItem()), scene_(new QGraphicsScene(this)), + gifMovie_(NULL), autoZoomFit_(false), cacheTimer_(NULL), scaleFactor_(1.0) { @@ -48,7 +51,9 @@ ImageView::ImageView(QWidget* parent): } ImageView::~ImageView() { - delete imageItem_; + scene_->clear(); // deletes all items + if(gifMovie_) + delete gifMovie_; if(cacheTimer_) { cacheTimer_->stop(); delete cacheTimer_; @@ -130,7 +135,18 @@ void ImageView::zoomOriginal() { queueGenerateCache(); } -void ImageView::setImage(QImage image) { +void ImageView::setImage(QImage image, bool show) { + if(gifMovie_ && show) { // a gif animation was shown + scene_->clear(); + delete gifMovie_; + gifMovie_ = NULL; + // recreate the rect item + imageItem_ = new QGraphicsRectItem(); + imageItem_->hide(); + imageItem_->setPen(QPen(Qt::NoPen)); + scene_->addItem(imageItem_); + } + image_ = image; if(image.isNull()) { imageItem_->hide(); @@ -138,9 +154,11 @@ void ImageView::setImage(QImage image) { scene_->setSceneRect(0, 0, 0, 0); } else { - imageItem_->setRect(0, 0, image_.width(), image_.height()); - imageItem_->setBrush(image_); - imageItem_->show(); + if(show) { + imageItem_->setRect(0, 0, image_.width(), image_.height()); + imageItem_->setBrush(image_); + imageItem_->show(); + } scene_->setSceneRect(0, 0, image_.width(), image_.height()); } @@ -149,6 +167,43 @@ void ImageView::setImage(QImage image) { queueGenerateCache(); } +void ImageView::setGifAnimation(QString fileName) { + QImage image(fileName); + if(image.isNull()) { + image_ = QImage(); + imageItem_->hide(); + imageItem_->setBrush(QBrush()); + scene_->setSceneRect(0, 0, 0, 0); + } + else { + scene_->clear(); + imageItem_ = NULL; // it's deleted by clear(); + if(gifMovie_) { + delete gifMovie_; + gifMovie_ = NULL; + } + QPixmap pix(image.size()); + pix.fill(Qt::transparent); + QGraphicsItem *gifItem = new QGraphicsPixmapItem(pix); + QLabel *gifLabel = new QLabel(); + gifMovie_ = new QMovie(fileName); + QGraphicsProxyWidget* gifWidget = new QGraphicsProxyWidget(gifItem); + gifLabel->setAttribute(Qt::WA_NoSystemBackground); + gifLabel->setMovie(gifMovie_); + gifWidget->setWidget(gifLabel); + gifMovie_->start(); + /* the first frame won't be shown but will be + used for tracking position and dimensions */ + image_ = gifMovie_->currentImage(); + scene_->addItem(gifItem); + scene_->setSceneRect(gifItem->boundingRect()); + } + + if(autoZoomFit_) + zoomFit(); + queueGenerateCache(); // deletes the cache timer in this case +} + void ImageView::setScaleFactor(double factor) { if(factor != scaleFactor_) { scaleFactor_ = factor; @@ -189,7 +244,8 @@ void ImageView::queueGenerateCache() { cachedPixmap_ = QPixmap(); // we don't need to cache the scaled image if its the same as the original image (scale:1.0) - if(scaleFactor_ == 1.0) { + // no cache for gif animations either + if(scaleFactor_ == 1.0 || gifMovie_) { if(cacheTimer_) { cacheTimer_->stop(); delete cacheTimer_; @@ -198,12 +254,13 @@ void ImageView::queueGenerateCache() { return; } - if(!cacheTimer_) { + if(!cacheTimer_ && !gifMovie_) { cacheTimer_ = new QTimer(); cacheTimer_->setSingleShot(true); connect(cacheTimer_, SIGNAL(timeout()), SLOT(generateCache())); } - cacheTimer_->start(200); // restart the timer + if(cacheTimer_) + cacheTimer_->start(200); // restart the timer } // really generate the cache diff --git a/src/imageview.h b/src/imageview.h index 49fd6f3..5fb9b41 100644 --- a/src/imageview.h +++ b/src/imageview.h @@ -26,6 +26,7 @@ #include #include #include +#include #include class QTimer; @@ -39,7 +40,8 @@ public: ImageView(QWidget* parent = 0); virtual ~ImageView(); - void setImage(QImage image); + void setImage(QImage image, bool show = true); + void setGifAnimation(QString fileName); QImage image() { return image_; @@ -83,6 +85,7 @@ private: QGraphicsScene* scene_; // the topmost container of all graphic items QGraphicsRectItem* imageItem_; // the rect item used to draw the image QImage image_; // image to show + QMovie *gifMovie_; // gif animation to show (should be deleted explicitly) QPixmap cachedPixmap_; // caching of current viewport content (high quality scaled image) QRect cachedRect_; // rectangle containing the cached region (in viewport coordinate) QRect cachedSceneRect_; // rectangle containing the cached region (in scene/original image coordinate) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 03049bc..7d78b5e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include "application.h" #include #include @@ -437,6 +438,10 @@ void MainWindow::onImageLoaded(LoadImageJob* job) { // if there are errors // TODO: show a info bar? } + + /* we resized and moved the window without showing + it in updateUI(), so we need to show it here */ + show(); } void MainWindow::onImageSaved(SaveImageJob* job) { @@ -522,28 +527,56 @@ void MainWindow::updateUI() { if(currentFile_) { char* dispName = fm_path_display_basename(currentFile_); if(loadJob_) { // if loading is in progress - title = tr("%1 (Loading...) - Image Viewer") + title = tr("[*]%1 (Loading...) - Image Viewer") .arg(QString::fromUtf8(dispName)); } else { if(image_.isNull()) { - title = tr("%1 (Failed to Load) - Image Viewer") + title = tr("[*]%1 (Failed to Load) - Image Viewer") .arg(QString::fromUtf8(dispName)); } else { - title = tr("%1 (%2x%3) - Image Viewer") + title = tr("[*]%1 (%2x%3) - Image Viewer") .arg(QString::fromUtf8(dispName)) .arg(image_.width()) .arg(image_.height()); + /* Here we try to implement the following behavior as far as possible: + (1) A minimum size of 400x400 is assumed; + (2) The window is scaled to fit the image; + (3) But for too big images, the window is scaled down; + (4) The window is centered on the screen. */ + if (!isVisible()) { + /* To have a correct position, we should move the window BEFORE + it's shown but we also need to know the dimensions of its view. + Therefore, we use show() without really showing the window. */ + setAttribute(Qt::WA_DontShowOnScreen); + show(); + int scrollThickness = style()->pixelMetric(QStyle::PM_ScrollBarExtent); + QSize newSize = size() + image_.size() - ui.view->size() + QSize(scrollThickness, scrollThickness); + QRect ag = QApplication::desktop()->availableGeometry(); + // since the window isn't decorated yet, we have to assume a max thickness for its frame + QSize maxFrame = QSize(50, 100); + if (newSize.width() > ag.width() - maxFrame.width() || newSize.height() > ag.height() - maxFrame.height()) + newSize.scale (ag.width() - maxFrame.width(), ag.height() - maxFrame.height(), Qt::KeepAspectRatio); + // a minimum size of 400x400 is good + if (newSize.width() < 400) newSize.rwidth() = 400; + if (newSize.height() < 400 ) newSize.rheight() = 400; + move (ag.x() + (ag.width() - newSize.width())/2, + ag.y() + (ag.height() - newSize.height())/2); + resize(newSize); + hide(); // hide it to show it again later, at onImageLoaded() + setAttribute(Qt::WA_DontShowOnScreen, false); + } } } g_free(dispName); // TODO: update status bar, show current index in the folder } else { - title = tr("Image Viewer"); + title = tr("[*]Image Viewer"); } setWindowTitle(title); + setWindowModified(imageModified_); } // Load the specified image file asynchronously in a worker thread. @@ -567,11 +600,28 @@ void MainWindow::loadImage(FmPath* filePath, QModelIndex index) { // clear current image, but do not update the view now to prevent flickers image_ = QImage(); - // start a new gio job to load the specified image - loadJob_ = new LoadImageJob(this, filePath); - loadJob_->start(); + const char* basename = fm_path_get_basename(currentFile_); + char* mimeType = g_content_type_guess(basename, NULL, 0, NULL); + if(mimeType && strcmp(mimeType, "image/gif") == 0) { + g_free(mimeType); + char *file_Name = fm_path_to_str(currentFile_); + QString fileName(file_Name); + g_free(file_Name); + ui.view->setAutoZoomFit(true); // like in onImageLoaded() + ui.view->setGifAnimation(fileName); + image_ = ui.view->image(); + updateUI(); + show(); + } + else { + if(mimeType) + g_free(mimeType); + // start a new gio job to load the specified image + loadJob_ = new LoadImageJob(this, filePath); + loadJob_->start(); - updateUI(); + updateUI(); + } } void MainWindow::saveImage(FmPath* filePath) { @@ -583,24 +633,56 @@ void MainWindow::saveImage(FmPath* filePath) { // FIXME: add a cancel button to the UI? update status bar? } +QGraphicsItem* MainWindow::getGifItem() { + if(!ui.view->items().isEmpty()) { + QGraphicsItem *gifItem = ui.view->items().at(0); + if(gifItem->isWidget()) // we have gif animation + return gifItem; + } + return NULL; +} + void MainWindow::on_actionRotateClockwise_triggered() { + QGraphicsItem *gifItem = getGifItem(); if(!image_.isNull()) { QTransform transform; transform.rotate(90.0); image_ = image_.transformed(transform, Qt::SmoothTransformation); - ui.view->setImage(image_); + /* when this is a gif animation, we need to rotate the first frame + without showing it to have the right measure for auto-zooming */ + ui.view->setImage(image_, gifItem ? false : true); setModified(true); } + + if(gifItem) { + QTransform transform; + transform.translate(gifItem->sceneBoundingRect().height(), 0); + transform.rotate(90); + // we need to apply transformations in the reverse order + QTransform prevTrans = gifItem->transform(); + gifItem->setTransform(transform, false); + gifItem->setTransform(prevTrans, true); + } } void MainWindow::on_actionRotateCounterclockwise_triggered() { + QGraphicsItem *gifItem = getGifItem(); if(!image_.isNull()) { QTransform transform; transform.rotate(-90.0); image_ = image_.transformed(transform, Qt::SmoothTransformation); - ui.view->setImage(image_); + ui.view->setImage(image_, gifItem ? false : true); setModified(true); } + + if(gifItem) { + QTransform transform; + transform.translate(0, gifItem->sceneBoundingRect().width()); + transform.rotate(-90); + QTransform prevTrans = gifItem->transform(); + gifItem->setTransform(transform, false); + gifItem->setTransform(prevTrans, true); + } } void MainWindow::on_actionCopy_triggered() { @@ -626,26 +708,44 @@ void MainWindow::on_actionPaste_triggered() { } void MainWindow::on_actionFlipVertical_triggered() { - if(!image_.isNull()) { + if(QGraphicsItem *gifItem = getGifItem()) { + QTransform transform; + transform.scale(1, -1); + transform.translate(0, -gifItem->sceneBoundingRect().height()); + QTransform prevTrans = gifItem->transform(); + gifItem->setTransform(transform, false); + gifItem->setTransform(prevTrans, true); + setModified(true); + /* we don't need to flip the first frame because its position + and dimensions are the same as before while it isn't shown */ + } + else if(!image_.isNull()) { image_ = image_.mirrored(false, true); ui.view->setImage(image_); setModified(true); } - setModified(true); } void MainWindow::on_actionFlipHorizontal_triggered() { - if(!image_.isNull()) { + if(QGraphicsItem *gifItem = getGifItem()) { + QTransform transform; + transform.scale(-1, 1); + transform.translate(-gifItem->sceneBoundingRect().width(), 0); + QTransform prevTrans = gifItem->transform(); + gifItem->setTransform(transform, false); + gifItem->setTransform(prevTrans, true); + setModified(true); + } + else if(!image_.isNull()) { image_ = image_.mirrored(true, false); ui.view->setImage(image_); setModified(true); } - setModified(true); } void MainWindow::setModified(bool modified) { imageModified_ = modified; - updateUI(); // TODO: update title bar to reflect the state change + updateUI(); } void MainWindow::applySettings() { @@ -731,6 +831,13 @@ void MainWindow::setShowThumbnails(bool show) { thumbnailsView_->setFixedHeight(listView->gridSize().height() + scrollHeight); thumbnailsView_->setModel(proxyModel_); proxyModel_->setShowThumbnails(true); + if (currentFile_) { // select the loaded image + currentIndex_ = indexFromPath(currentFile_); + listView->setCurrentIndex(currentIndex_); + // wait to center the selection + QCoreApplication::processEvents(); + listView->scrollTo(currentIndex_, QAbstractItemView::PositionAtCenter); + } connect(thumbnailsView_->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(onThumbnailSelChanged(QItemSelection,QItemSelection))); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 35b77f9..3350395 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -126,6 +126,7 @@ private: void updateUI(); void setModified(bool modified); QModelIndex indexFromPath(FmPath* filePath); + QGraphicsItem* getGifItem(); // GObject related signal handers and callbacks static void _onFolderLoaded(FmFolder* folder, MainWindow* _this) { diff --git a/src/screenshotdialog.cpp b/src/screenshotdialog.cpp index afb82ec..ff922ee 100644 --- a/src/screenshotdialog.cpp +++ b/src/screenshotdialog.cpp @@ -150,7 +150,6 @@ void ScreenshotDialog::doScreenshot() { if(cursor) { if(cursor->pixels) { // pixles should be an ARGB array QImage cursorImage; - quint32* buf = NULL; if(sizeof(long) == 4) { // FIXME: will we encounter byte-order problems here? cursorImage = QImage((uchar*)cursor->pixels, cursor->width, cursor->height, QImage::Format_ARGB32); @@ -160,13 +159,11 @@ void ScreenshotDialog::doScreenshot() { quint32* buf = new quint32[len]; for(long i = 0; i < len; ++i) buf[i] = (quint32)cursor->pixels[i]; - cursorImage = QImage((uchar*)buf, cursor->width, cursor->height, QImage::Format_ARGB32); + cursorImage = QImage((uchar*)buf, cursor->width, cursor->height, QImage::Format_ARGB32, [](void* b) { delete[] (quint32*)b; }, buf); } // paint the cursor on the current image QPainter painter(&image); painter.drawImage(cursor->x - cursor->xhot, cursor->y - cursor->yhot, cursorImage); - if(buf) - delete []buf; } XFree(cursor); } diff --git a/src/translations/lximage-qt-screenshot_pl.desktop b/src/translations/lximage-qt-screenshot_pl.desktop new file mode 100644 index 0000000..1586e3f --- /dev/null +++ b/src/translations/lximage-qt-screenshot_pl.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Name[pl]=Zrzut ekranu +GenericName[pl]=Zrzut ekranu +Comment[pl]=Wykonaj zrzut ekranu + +#TRANSLATIONS_DIR=translations diff --git a/src/translations/lximage-qt-screenshot_ru.desktop b/src/translations/lximage-qt-screenshot_ru.desktop new file mode 100644 index 0000000..3113724 --- /dev/null +++ b/src/translations/lximage-qt-screenshot_ru.desktop @@ -0,0 +1,4 @@ +#Translations +Name[ru]=Снимок экрана +GenericName[ru]=Снимок экрана +Comment[ru]=Сделать снимок экрана diff --git a/src/translations/lximage-qt_it.ts b/src/translations/lximage-qt_it.ts index 7a48c0c..9ad8cf0 100644 --- a/src/translations/lximage-qt_it.ts +++ b/src/translations/lximage-qt_it.ts @@ -1,6 +1,6 @@ - + LxImage::Application @@ -19,7 +19,7 @@ About - A proposito + Informazioni @@ -31,12 +31,12 @@ LXDE Project: http://lxde.org/ Authors: Hong Jen Yee (PCMan) <pcman.tw@gmail.com> need update... - LXImage - un visualizzatore immagini semplice e veloce + LXImage - un visualizzatore immagini semplice e veloce Copyright (C) 2013 LXDE Project: http://lxde.org/ -Autor: +Autori: Hong Jen Yee (PCMan) <pcman.tw@gmail.com> @@ -58,17 +58,17 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> %1 (Loading...) - Image Viewer - %1 (Caricando...) - Visualizzatore immagini + %1 (Caricamento in corso...) - Visualizzatore immagini %1 (Failed to Load) - Image Viewer - %1 (Errore in caricamento) - Visualizzatore immagini + %1 (Caricamento non riuscito) - Visualizzatore immagini %1 (%2x%3) - Image Viewer - %1 (%2x%3) - Visualizzatore Immagini + %1 (%2x%3) - Visualizzatore immagini @@ -91,12 +91,12 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> &About - A &proposito + Inform&azioni &Open File - &Apri + &Apri file @@ -112,7 +112,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Ctrl+S - + Ctrl+S @@ -122,7 +122,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Ctrl+A - + Ctrl+A @@ -132,7 +132,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Ctrl+W - + Ctrl+W @@ -142,7 +142,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Ctrl++ - + Ctrl++ @@ -152,7 +152,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Ctrl+- - + Ctrl+- @@ -163,13 +163,13 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Next File - Prossimo + File successivo Previous File - Precedente + File precedente @@ -179,57 +179,57 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> PgUp - Pagina sù + Pagina su Original Size - &Dimensioni originiali + Dimensioni originali &Fit - &Adatta alla finestra + &Adatta &Rotate Clockwise - Gira a &destra + &Ruota in senso orario Rotate &Counterclockwise - Gira a &sinistra + Ruota in &senso antiorario P&references - &Preferenze + P&referenze &Print - &Stampa + Stam&pa Ctrl+P - + Ctrl+P First File - Primo + Primo file Home - + Home Last File - Ultimo + Ultimo file @@ -244,12 +244,12 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Ctrl+N - + Ctrl+N Flip &Horizontally - Rispecchia &horizzontalmente + Rispecchia &orizzontalmente @@ -264,7 +264,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> F11 - + F11 @@ -274,7 +274,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> &Paste from Clipboard - &Incolla da appunti + &Incolla dagli appunti @@ -284,23 +284,23 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> &Delete - &Cestina + &Elimina Del - + Canc Show Thumbnails - &Mostra barra miniature + Mostra miniature File Properties Übersetzung von 'file' weggelassen, da redundant. - Proprietà + Proprietà del file diff --git a/src/translations/lximage-qt_pl.desktop b/src/translations/lximage-qt_pl.desktop new file mode 100644 index 0000000..50bbe00 --- /dev/null +++ b/src/translations/lximage-qt_pl.desktop @@ -0,0 +1,5 @@ +[Desktop Entry] +GenericName[pl]=Przeglądarka obrazów +Comment[pl]=Przeglądarka obrazów LXQt + +#TRANSLATIONS_DIR=translations diff --git a/src/translations/lximage-qt_pl.ts b/src/translations/lximage-qt_pl.ts index 1377cf1..4102e60 100644 --- a/src/translations/lximage-qt_pl.ts +++ b/src/translations/lximage-qt_pl.ts @@ -77,7 +77,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Thumbnails - + Miniaturki @@ -145,7 +145,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Zoom &Out - Po&mniejsz + Po&mniejsz @@ -300,12 +300,12 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Show Thumbnails - + Pokaż miniaturki File Properties - + Właściwości pliku @@ -335,7 +335,7 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Toolbar - + Pasek narzędziowy toolBar @@ -352,27 +352,27 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Icon theme: - + Zestaw ikon: Normal background color: - + Kolor tła: Fullscreen background color: - + Kolor tła dla pełnego ekranu: Slide show interval (seconds): - + Interwał pokazu slajdów (sekundy): General - + Ogólne TODO: Add configuration options here diff --git a/src/translations/lximage-qt_ru.desktop b/src/translations/lximage-qt_ru.desktop new file mode 100644 index 0000000..23edb85 --- /dev/null +++ b/src/translations/lximage-qt_ru.desktop @@ -0,0 +1,4 @@ +#Translations +Name[ru]=LXImage +GenericName[ru]=Просмотрщик изображений +Comment[ru]=Просмотрщик изображений LXQt diff --git a/src/translations/lximage-qt_ru.ts b/src/translations/lximage-qt_ru.ts index 3368d39..64b257e 100644 --- a/src/translations/lximage-qt_ru.ts +++ b/src/translations/lximage-qt_ru.ts @@ -6,12 +6,12 @@ Take a screenshot - + Сделать снимок экрана [FILE1, FILE2,...] - + [ФАЙЛ1, ФАЙЛ2, ...] @@ -19,7 +19,7 @@ About - + О программе @@ -30,48 +30,54 @@ LXDE Project: http://lxde.org/ Authors: Hong Jen Yee (PCMan) <pcman.tw@gmail.com> - + LXImage - простой и быстрый просмотрщик изображений + +Copyright (C) 2013 +LXDE Project: http://lxde.org/ + +Authors: +Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Open File - + Открыть файл Image files (%1) - + Файлы изображений (%1) Save File - + Сохранить файл %1 (Loading...) - Image Viewer - + %1 (Загружается...) - Просмотрщик изображений %1 (Failed to Load) - Image Viewer - + %1 (Ошибка загрузки) - Просмотрщик изображений %1 (%2x%3) - Image Viewer - + %1 (%2x%3) - Просмотрщик изображений Image Viewer - + Просмотрщик изображений Thumbnails - + Эскизы @@ -79,249 +85,249 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Image Viewer - + Просмотрщик изображений &About - + О &программе &Open File - + &Открыть файл Ctrl+O - + &Save - + &Сохранить Ctrl+S - + Save &As - + Сохранить &как Ctrl+A - + &Close - + &Закрыть Ctrl+W - + Zoom &In - + При&близить Ctrl++ - + Zoom &Out - + От&далить Ctrl+- - + &Copy to Clipboard - + Скопировать в &буфер обмена Next File - + Следующий файл Previous File - + Предыдущий файл PgDown - + PgUp - + Original Size - + Исходный размер &Fit - + &Заполнить &Rotate Clockwise - + Пове&рнуть по часовой стрелке Rotate &Counterclockwise - + Повернуть &против часовой стрелки P&references - + &Настройки &Print - + &Печать Ctrl+P - + First File - + Первый файл Home - + Last File - + Последний файл End - + &New Window - + Новое &окно Ctrl+N - + Flip &Horizontally - + Отразить &горизонтально Capture Screenshot - + Сделать снимок экрана F&ull Screen - + Полный &экран F11 - + Flip &Vertically - + Отразить &вертикально &Paste from Clipboard - + &Вставить из буфера обмена &Slide Show - + &Слайд-шоу &Delete - + &Удалить Del - + Show Thumbnails - + Показать эскизы File Properties - + Свойства файла &File - + &Файл &Help - + &Помощь Go - + Перейти &View - + &Вид &Edit - + &Редактировать Toolbar - + Панель инструментов @@ -329,32 +335,32 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Preferences - + Настройки Icon theme: - + Тема значков: Normal background color: - + Обычный цвет фона: Fullscreen background color: - + Цвет фона для режима полного экрана: Slide show interval (seconds): - + Интервал слайд-шоу (в секундах): General - + Общие @@ -362,47 +368,47 @@ Hong Jen Yee (PCMan) <pcman.tw@gmail.com> Screenshot - + Снимок экрана Take a screenshot - + Сделать снимок экрана Region - + Область Whole screen - + Весь экран Current window only - + Только активное окно Include mouse cursor - + Показывать курсор мыши seconds - + секунд(ы) Delay: - + Задержка: Include window title and frame - + Показывать заголовок и обрамление окна