Merged textbrowser-port into master.
This commit is contained in:
commit
5440c6167c
424
CMakeLists.txt
424
CMakeLists.txt
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This file is part of RSS Guard.
|
# This file is part of RSS Guard.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
# Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
#
|
#
|
||||||
# RSS Guard is free software: you can redistribute it and/or modify
|
# RSS Guard is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -25,22 +25,15 @@
|
|||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# a) DEBUG build for testing.
|
# a) DEBUG build for testing.
|
||||||
# cmake -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr -DUSE_QT_5=ON
|
# cmake -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr
|
||||||
#
|
#
|
||||||
# b) RELEASE build for production use.
|
# b) RELEASE build for production use.
|
||||||
# cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX=/usr -DUSE_QT_5=ON
|
# cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX=/usr
|
||||||
#
|
#
|
||||||
# Arguments:
|
# Arguments:
|
||||||
# -DCMAKE_INSTALL_PREFIX=/usr
|
# -DCMAKE_INSTALL_PREFIX=/usr
|
||||||
# Installation path, replace with something like "C:\rssguard" on Windows.
|
# Installation path, replace with something like "C:\rssguard" on Windows.
|
||||||
#
|
#
|
||||||
# -DUSE_QT_5=OFF
|
|
||||||
# Specifies which major Qt version to use. Qt 4 and Qt 5 are supported.
|
|
||||||
# If "OFF" is passed as an argument, then Qt 4 is used. Default is "OFF".
|
|
||||||
#
|
|
||||||
# -DENABLE_OS2_RC=OFF
|
|
||||||
# If "ON" then icon is compiled into executable file on OS/2. Defaults to "OFF".
|
|
||||||
#
|
|
||||||
# Refreshing translation sources:
|
# Refreshing translation sources:
|
||||||
# make lupdate
|
# make lupdate
|
||||||
#
|
#
|
||||||
@ -52,7 +45,7 @@
|
|||||||
#
|
#
|
||||||
# Other information:
|
# Other information:
|
||||||
# - supports Windows, Linux, OS/2 (eComStation),
|
# - supports Windows, Linux, OS/2 (eComStation),
|
||||||
# - Qt 4.7.3 and higher is required,
|
# - Qt 5.6 and higher is required,
|
||||||
# - resource compiler (windres.exe) is needed on MinGW,
|
# - resource compiler (windres.exe) is needed on MinGW,
|
||||||
# - resource compiler (rc.exe) is recommended on OS/2.
|
# - resource compiler (rc.exe) is recommended on OS/2.
|
||||||
#
|
#
|
||||||
@ -77,7 +70,7 @@ set(APP_URL_ISSUES_NEW_GITHUB "https://github.com/martinrotter/rssguard/issues/n
|
|||||||
set(APP_URL_ISSUES_NEW_BITBUCKET "http://bitbucket.org/skunkos/rssguard/issues/new")
|
set(APP_URL_ISSUES_NEW_BITBUCKET "http://bitbucket.org/skunkos/rssguard/issues/new")
|
||||||
set(APP_URL_WIKI "https://bitbucket.org/skunkos/rssguard/wiki/Home")
|
set(APP_URL_WIKI "https://bitbucket.org/skunkos/rssguard/wiki/Home")
|
||||||
set(APP_EMAIL "rotter.martinos@gmail.com")
|
set(APP_EMAIL "rotter.martinos@gmail.com")
|
||||||
set(MINIMUM_QT_VERSION 4.7.3)
|
set(MINIMUM_QT_VERSION 5.6.0)
|
||||||
set(EXE_NAME ${APP_LOW_NAME})
|
set(EXE_NAME ${APP_LOW_NAME})
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
@ -85,13 +78,8 @@ if(APPLE)
|
|||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
# Options declaration.
|
# Options declaration.
|
||||||
option(USE_QT_5 "Use Qt 5 for building" OFF)
|
|
||||||
option(ENABLE_ADDITIONAL_ICONS "Install additional icons" ON)
|
option(ENABLE_ADDITIONAL_ICONS "Install additional icons" ON)
|
||||||
|
|
||||||
if(OS2)
|
|
||||||
option(ENABLE_OS2_RC "Compile application icon on OS/2" OFF)
|
|
||||||
endif(OS2)
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
option(USE_NSIS "Use NSIS generator to produce installer" OFF)
|
option(USE_NSIS "Use NSIS generator to produce installer" OFF)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
@ -101,27 +89,16 @@ if(POLICY CMP0012)
|
|||||||
cmake_policy(SET CMP0012 NEW)
|
cmake_policy(SET CMP0012 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(USE_QT_5)
|
if(POLICY CMP0054)
|
||||||
cmake_minimum_required(VERSION 2.8.10)
|
cmake_policy(SET CMP0054 NEW)
|
||||||
else(USE_QT_5)
|
endif()
|
||||||
cmake_minimum_required(VERSION 2.6.0)
|
|
||||||
endif(USE_QT_5)
|
|
||||||
|
|
||||||
if(${APPLE})
|
cmake_minimum_required(VERSION 3.4)
|
||||||
if(NOT USE_QT_5)
|
|
||||||
message(FATAL_ERROR "[${APP_LOW_NAME}] Only Qt 5.x.x is supported on Mac OS X.")
|
|
||||||
endif(NOT USE_QT_5)
|
|
||||||
endif(${APPLE})
|
|
||||||
|
|
||||||
message(STATUS "")
|
message(STATUS "")
|
||||||
message(STATUS "[${APP_LOW_NAME}] ==== Options summary ====")
|
message(STATUS "[${APP_LOW_NAME}] ==== Options summary ====")
|
||||||
message(STATUS "[${APP_LOW_NAME}] Use Qt 5 for building -> ${USE_QT_5}")
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Install additional icons -> ${ENABLE_ADDITIONAL_ICONS}")
|
message(STATUS "[${APP_LOW_NAME}] Install additional icons -> ${ENABLE_ADDITIONAL_ICONS}")
|
||||||
|
|
||||||
if(OS2)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Compile application icon on OS/2 -> ${ENABLE_OS2_RC}")
|
|
||||||
endif(OS2)
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
message(STATUS "[${APP_LOW_NAME}] Use NSIS generator to produce installer -> ${USE_NSIS}")
|
message(STATUS "[${APP_LOW_NAME}] Use NSIS generator to produce installer -> ${USE_NSIS}")
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
@ -148,15 +125,10 @@ if(POLICY CMP0020)
|
|||||||
cmake_policy(SET CMP0020 NEW)
|
cmake_policy(SET CMP0020 NEW)
|
||||||
endif(POLICY CMP0020)
|
endif(POLICY CMP0020)
|
||||||
|
|
||||||
# Select which Qt version to use.
|
message(STATUS "[${APP_LOW_NAME}] Using Qt 5 library for building.")
|
||||||
if(USE_QT_5)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Using Qt 5 library for building.")
|
# Instruct CMake to run moc automatically when needed.
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
# Instruct CMake to run moc automatically when needed.
|
|
||||||
set(CMAKE_AUTOMOC ON)
|
|
||||||
else(USE_QT_5)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Using Qt 4 library for building.")
|
|
||||||
endif(USE_QT_5)
|
|
||||||
|
|
||||||
# Obtain revision number if available.
|
# Obtain revision number if available.
|
||||||
message(STATUS "[${APP_LOW_NAME}] Obtaining revision number.")
|
message(STATUS "[${APP_LOW_NAME}] Obtaining revision number.")
|
||||||
@ -169,7 +141,7 @@ if(EXISTS "${PROJECT_SOURCE_DIR}/.git")
|
|||||||
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
|
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
OUTPUT_VARIABLE GIT_REVISION
|
OUTPUT_VARIABLE GIT_REVISION
|
||||||
)
|
)
|
||||||
|
|
||||||
string(REGEX REPLACE "\n" "" GIT_REVISION "${GIT_REVISION}")
|
string(REGEX REPLACE "\n" "" GIT_REVISION "${GIT_REVISION}")
|
||||||
set(APP_REVISION ${GIT_REVISION})
|
set(APP_REVISION ${GIT_REVISION})
|
||||||
@ -191,7 +163,7 @@ if(UNIX)
|
|||||||
configure_file (
|
configure_file (
|
||||||
${PROJECT_SOURCE_DIR}/resources/desktop/rssguard.desktop.in
|
${PROJECT_SOURCE_DIR}/resources/desktop/rssguard.desktop.in
|
||||||
${CMAKE_BINARY_DIR}/resources/desktop/rssguard.desktop
|
${CMAKE_BINARY_DIR}/resources/desktop/rssguard.desktop
|
||||||
)
|
)
|
||||||
set(DESKTOP_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/applications)
|
set(DESKTOP_ENTRY_PATH ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||||
endif(UNIX)
|
endif(UNIX)
|
||||||
|
|
||||||
@ -199,7 +171,7 @@ endif(UNIX)
|
|||||||
configure_file (
|
configure_file (
|
||||||
${PROJECT_SOURCE_DIR}/src/definitions/definitions.h.in
|
${PROJECT_SOURCE_DIR}/src/definitions/definitions.h.in
|
||||||
${CMAKE_BINARY_DIR}/src/definitions/definitions.h
|
${CMAKE_BINARY_DIR}/src/definitions/definitions.h
|
||||||
)
|
)
|
||||||
|
|
||||||
# Define some useful DEBUG for, ehrm, debug build.
|
# Define some useful DEBUG for, ehrm, debug build.
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "release" OR CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RELEASE")
|
if(CMAKE_BUILD_TYPE STREQUAL "release" OR CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RELEASE")
|
||||||
@ -211,15 +183,15 @@ else(CMAKE_BUILD_TYPE STREQUAL "release" OR CMAKE_BUILD_TYPE STREQUAL "Release"
|
|||||||
add_definitions(-DDEBUG)
|
add_definitions(-DDEBUG)
|
||||||
set(CMAKE_BUILD_TYPE Debug)
|
set(CMAKE_BUILD_TYPE Debug)
|
||||||
|
|
||||||
# Enable compiler warnings.
|
# Enable compiler warnings.
|
||||||
# See http://stackoverflow.com/questions/2368811/how-to-set-warning-level-in-cmake
|
# See http://stackoverflow.com/questions/2368811/how-to-set-warning-level-in-cmake
|
||||||
message(STATUS "[${APP_LOW_NAME}] Enabling verbose makefile and full warning reports.")
|
message(STATUS "[${APP_LOW_NAME}] Enabling verbose makefile and full warning reports.")
|
||||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
||||||
add_definitions(-pedantic -Wall) # -Wextra -Wno-unused-variable
|
add_definitions(-pedantic -Wall) # -Wextra -Wno-unused-variable
|
||||||
endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
|
||||||
# Verbose compiling outputs.
|
# Verbose compiling outputs.
|
||||||
set(CMAKE_VERBOSE_MAKEFILE ON)
|
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||||
endif(CMAKE_BUILD_TYPE STREQUAL "release" OR CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RELEASE")
|
endif(CMAKE_BUILD_TYPE STREQUAL "release" OR CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RELEASE")
|
||||||
|
|
||||||
# Force Qt to use string builders.
|
# Force Qt to use string builders.
|
||||||
@ -230,75 +202,51 @@ add_definitions(-DUNICODE -D_UNICODE)
|
|||||||
|
|
||||||
# Check for C++ 11 features availability.
|
# Check for C++ 11 features availability.
|
||||||
# See http://stackoverflow.com/questions/10984442/how-to-detect-c11-support-of-a-compiler-with-cmake
|
# See http://stackoverflow.com/questions/10984442/how-to-detect-c11-support-of-a-compiler-with-cmake
|
||||||
if(USE_QT_5)
|
if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
execute_process(
|
||||||
execute_process(
|
COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION
|
||||||
COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION
|
|
||||||
)
|
)
|
||||||
|
if(${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
|
||||||
if(${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
|
add_definitions(-std=c++11)
|
||||||
add_definitions(-std=c++11)
|
elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
|
||||||
elseif(GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
|
add_definitions(-std=gnu++0x)
|
||||||
add_definitions(-std=gnu++0x)
|
else(${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
|
||||||
else(${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
|
|
||||||
message(FATAL_ERROR "[${APP_LOW_NAME}] Your C++ compiler does not support C++ 11.")
|
|
||||||
endif(${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
|
|
||||||
|
|
||||||
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
|
||||||
add_definitions(-std=c++11 -stdlib=libc++)
|
|
||||||
elseif(${MSVC_VERSION} VERSION_LESS 1600)
|
|
||||||
message(FATAL_ERROR "[${APP_LOW_NAME}] Your C++ compiler does not support C++ 11.")
|
message(FATAL_ERROR "[${APP_LOW_NAME}] Your C++ compiler does not support C++ 11.")
|
||||||
endif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
endif(${GCC_VERSION} VERSION_GREATER 4.7 OR ${GCC_VERSION} VERSION_EQUAL 4.7)
|
||||||
endif(USE_QT_5)
|
|
||||||
|
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
||||||
|
add_definitions(-std=c++11 -stdlib=libc++)
|
||||||
|
elseif(${MSVC_VERSION} VERSION_LESS 1600)
|
||||||
|
message(FATAL_ERROR "[${APP_LOW_NAME}] Your C++ compiler does not support C++ 11.")
|
||||||
|
endif(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||||
|
|
||||||
# Setup libraries.
|
# Setup libraries.
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
# On Unices, enable D-Bus support.
|
# On Unices, enable D-Bus support.
|
||||||
if(USE_QT_5)
|
find_package(Qt5 REQUIRED DBus Sql Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
||||||
find_package(Qt5 REQUIRED DBus Sql WebKit WebKitWidgets Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
|
||||||
else(USE_QT_5)
|
|
||||||
set(QT_MIN_VERSION ${MINIMUM_QT_VERSION})
|
|
||||||
find_package(Qt4 REQUIRED QtDBus QtCore QtGui QtSql QtNetwork QtWebkit QtXml QtXmlPatterns)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
endif(USE_QT_5)
|
|
||||||
else(UNIX)
|
else(UNIX)
|
||||||
if(USE_QT_5)
|
find_package(Qt5 REQUIRED Sql Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
||||||
find_package(Qt5 REQUIRED Sql WebKit WebKitWidgets Widgets Xml XmlPatterns Network LinguistTools PrintSupport)
|
|
||||||
else(USE_QT_5)
|
|
||||||
set(QT_MIN_VERSION ${MINIMUM_QT_VERSION})
|
|
||||||
find_package(Qt4 REQUIRED QtCore QtGui QtSql QtNetwork QtWebkit QtXml QtXmlPatterns)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
endif(USE_QT_5)
|
|
||||||
endif(UNIX)
|
endif(UNIX)
|
||||||
|
|
||||||
|
message(STATUS "[${APP_LOW_NAME}] Found Qt version: '${Qt5_VERSION}'.")
|
||||||
|
|
||||||
|
if(Qt5_VERSION VERSION_LESS MINIMUM_QT_VERSION)
|
||||||
|
message(FATAL_ERROR "[${APP_LOW_NAME}] Installed Qt has lower version than needed. You need at least '${MINIMUM_QT_VERSION}'.")
|
||||||
|
endif(Qt5_VERSION VERSION_LESS MINIMUM_QT_VERSION)
|
||||||
|
|
||||||
# Configure QStringBuilder behavior.
|
# Configure QStringBuilder behavior.
|
||||||
if(USE_QT_5)
|
message(STATUS "[${APP_LOW_NAME}] Enabling fast QString concatenation.")
|
||||||
message(STATUS "[${APP_LOW_NAME}] Enabling fast QString concatenation.")
|
|
||||||
|
|
||||||
add_definitions(-DQT_USE_FAST_CONCATENATION)
|
add_definitions(-DQT_USE_FAST_CONCATENATION)
|
||||||
add_definitions(-DQT_USE_FAST_OPERATOR_PLUS)
|
add_definitions(-DQT_USE_FAST_OPERATOR_PLUS)
|
||||||
elseif(NOT ${QTVERSION} VERSION_LESS 4.8.0)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Enabling fast QString concatenation.")
|
|
||||||
|
|
||||||
add_definitions(-DQT_USE_FAST_CONCATENATION)
|
# Configure executable "properties" for Windows.
|
||||||
add_definitions(-DQT_USE_FAST_OPERATOR_PLUS)
|
|
||||||
else(NOT ${QTVERSION} VERSION_LESS 4.8.0)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Disabling fast QString concatenation.")
|
|
||||||
endif(USE_QT_5)
|
|
||||||
|
|
||||||
# Configure executable "properties" for Windows or OS2.
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
message(STATUS "[${APP_LOW_NAME}] Generating executable file properties for Windows.")
|
message(STATUS "[${APP_LOW_NAME}] Generating executable file properties for Windows.")
|
||||||
configure_file (
|
configure_file (
|
||||||
${PROJECT_SOURCE_DIR}/resources/executable_properties/rssguard_win.rc.in
|
${PROJECT_SOURCE_DIR}/resources/executable_properties/rssguard_win.rc.in
|
||||||
${CMAKE_BINARY_DIR}/resources/executable_properties/rssguard_win.rc
|
${CMAKE_BINARY_DIR}/resources/executable_properties/rssguard_win.rc
|
||||||
)
|
)
|
||||||
elseif(OS2 AND ENABLE_OS2_RC)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Generating executable file properties for OS2.")
|
|
||||||
configure_file (
|
|
||||||
${PROJECT_SOURCE_DIR}/resources/executable_properties/rssguard_os2.rc.in
|
|
||||||
${CMAKE_BINARY_DIR}/resources/executable_properties/rssguard_os2.rc
|
|
||||||
)
|
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
# Set special linker flag for Windows XP & MSVC++ 2013 support.
|
# Set special linker flag for Windows XP & MSVC++ 2013 support.
|
||||||
@ -306,33 +254,18 @@ if(WIN32 AND MSVC)
|
|||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,5.01" )
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,5.01" )
|
||||||
endif(WIN32 AND MSVC)
|
endif(WIN32 AND MSVC)
|
||||||
|
|
||||||
# Compile application icon if compiling with MinGW on WIN32 or with OS2.
|
# Compile application icon if compiling with MinGW on WIN32.
|
||||||
if(WIN32 AND MINGW)
|
if(WIN32 AND MINGW)
|
||||||
enable_language(RC)
|
enable_language(RC)
|
||||||
set(CMAKE_RC_COMPILER_INIT windres)
|
set(CMAKE_RC_COMPILER_INIT windres)
|
||||||
message(STATUS "[${APP_LOW_NAME}] Icon file binary will be builded for Windows.")
|
message(STATUS "[${APP_LOW_NAME}] Icon file binary will be builded for Windows.")
|
||||||
message(STATUS "[${APP_LOW_NAME}] Used tool is: ${CMAKE_RC_COMPILER}")
|
message(STATUS "[${APP_LOW_NAME}] Used tool is: ${CMAKE_RC_COMPILER}")
|
||||||
set(CMAKE_RC_COMPILE_OBJECT
|
set(CMAKE_RC_COMPILE_OBJECT
|
||||||
"<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>")
|
"<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>")
|
||||||
|
|
||||||
set(APP_SOURCES
|
set(APP_SOURCES
|
||||||
${APP_SOURCES}
|
${APP_SOURCES}
|
||||||
${CMAKE_BINARY_DIR}/resources/executable_properties/rssguard_win.rc)
|
${CMAKE_BINARY_DIR}/resources/executable_properties/rssguard_win.rc)
|
||||||
elseif(OS2)
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Zstack 0x2000 -Zlinker \"DISABLE 1121\" -s -Zlinker /PM:PM -Zno-fork -Zhigh-mem -Zmap")
|
|
||||||
|
|
||||||
if(${ENABLE_OS2_RC})
|
|
||||||
enable_language(RC)
|
|
||||||
set(CMAKE_RC_COMPILER_INIT rc)
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Icon file binary will be builded for OS2.")
|
|
||||||
message(STATUS "[${APP_LOW_NAME}] Used tool is: ${CMAKE_RC_COMPILER}")
|
|
||||||
set(CMAKE_RC_COMPILE_OBJECT
|
|
||||||
"<CMAKE_RC_COMPILER> -n -r <SOURCE> <OBJECT>")
|
|
||||||
|
|
||||||
set(APP_SOURCES
|
|
||||||
${APP_SOURCES}
|
|
||||||
${CMAKE_BINARY_DIR}/resources/executable_properties/rssguard_os2.rc)
|
|
||||||
endif(${ENABLE_OS2_RC})
|
|
||||||
elseif(WIN32 AND MSVC)
|
elseif(WIN32 AND MSVC)
|
||||||
# MSVC takes care of this automatically - no need to use windres.exe
|
# MSVC takes care of this automatically - no need to use windres.exe
|
||||||
# for MSVC compilers.
|
# for MSVC compilers.
|
||||||
@ -364,13 +297,12 @@ file( GLOB APP_SOURCES_GL
|
|||||||
"src/services/owncloud/network/*.cpp"
|
"src/services/owncloud/network/*.cpp"
|
||||||
"src/services/owncloud/gui/*.cpp"
|
"src/services/owncloud/gui/*.cpp"
|
||||||
"src/network-web/*.cpp"
|
"src/network-web/*.cpp"
|
||||||
"src/network-web/adblock/*.cpp"
|
|
||||||
"src/*.cpp")
|
"src/*.cpp")
|
||||||
|
|
||||||
set(APP_SOURCES
|
set(APP_SOURCES
|
||||||
${APP_SOURCES}
|
${APP_SOURCES}
|
||||||
${APP_SOURCES_GL}
|
${APP_SOURCES_GL}
|
||||||
)
|
)
|
||||||
|
|
||||||
# APP headers.
|
# APP headers.
|
||||||
file( GLOB APP_HEADERS
|
file( GLOB APP_HEADERS
|
||||||
@ -395,8 +327,7 @@ file( GLOB APP_HEADERS
|
|||||||
"src/services/owncloud/*.h"
|
"src/services/owncloud/*.h"
|
||||||
"src/services/owncloud/network/*.h"
|
"src/services/owncloud/network/*.h"
|
||||||
"src/services/owncloud/gui/*.h"
|
"src/services/owncloud/gui/*.h"
|
||||||
"src/network-web/*.h"
|
"src/network-web/*.h")
|
||||||
"src/network-web/adblock/*.h")
|
|
||||||
|
|
||||||
# APP forms.
|
# APP forms.
|
||||||
file( GLOB APP_FORMS
|
file( GLOB APP_FORMS
|
||||||
@ -405,8 +336,7 @@ file( GLOB APP_FORMS
|
|||||||
"src/services/standard/gui/*.ui"
|
"src/services/standard/gui/*.ui"
|
||||||
"src/services/tt-rss/gui/*.ui"
|
"src/services/tt-rss/gui/*.ui"
|
||||||
"src/services/owncloud/gui/*.ui"
|
"src/services/owncloud/gui/*.ui"
|
||||||
"src/network-web/*.ui"
|
"src/network-web/*.ui")
|
||||||
"src/network-web/adblock/*.ui")
|
|
||||||
|
|
||||||
# APP translations.
|
# APP translations.
|
||||||
file( GLOB APP_TRANSLATIONS
|
file( GLOB APP_TRANSLATIONS
|
||||||
@ -419,18 +349,15 @@ file( GLOB APP_TEXT
|
|||||||
"resources/text/C*")
|
"resources/text/C*")
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
file( GLOB APP_DLLS_QT4_MSVC2013
|
|
||||||
"resources/binaries/windows/qt4-msvc2013/*.dll")
|
|
||||||
|
|
||||||
file( GLOB APP_DLLS_QT4_MSVC2013_IMAGEFORMATS
|
|
||||||
"resources/binaries/windows/qt4-msvc2013/imageformats/*.dll")
|
|
||||||
|
|
||||||
file( GLOB APP_DLLS_QT4_MSVC2013_SQLDRIVERS
|
|
||||||
"resources/binaries/windows/qt4-msvc2013/sqldrivers/*.dll")
|
|
||||||
|
|
||||||
file( GLOB APP_DLLS_QT5_MSVC2013
|
file( GLOB APP_DLLS_QT5_MSVC2013
|
||||||
"resources/binaries/windows/qt5-msvc2013/*.dll")
|
"resources/binaries/windows/qt5-msvc2013/*.dll")
|
||||||
|
|
||||||
|
file( GLOB APP_DLLS_QT5_MSVC2013_BEARER
|
||||||
|
"resources/binaries/windows/qt5-msvc2013/bearer/*.dll")
|
||||||
|
|
||||||
|
file( GLOB APP_DLLS_QT5_MSVC2013_ICONENGINES
|
||||||
|
"resources/binaries/windows/qt5-msvc2013/iconengines/*.dll")
|
||||||
|
|
||||||
file( GLOB APP_DLLS_QT5_MSVC2013_IMAGEFORMATS
|
file( GLOB APP_DLLS_QT5_MSVC2013_IMAGEFORMATS
|
||||||
"resources/binaries/windows/qt5-msvc2013/imageformats/*.dll")
|
"resources/binaries/windows/qt5-msvc2013/imageformats/*.dll")
|
||||||
|
|
||||||
@ -439,9 +366,6 @@ if(WIN32)
|
|||||||
|
|
||||||
file( GLOB APP_DLLS_QT5_MSVC2013_PLATFORMS
|
file( GLOB APP_DLLS_QT5_MSVC2013_PLATFORMS
|
||||||
"resources/binaries/windows/qt5-msvc2013/platforms/*.dll")
|
"resources/binaries/windows/qt5-msvc2013/platforms/*.dll")
|
||||||
|
|
||||||
file( GLOB APP_DLLS_QT5_MSVC2013_PRINTSUPPORT
|
|
||||||
"resources/binaries/windows/qt5-msvc2013/printsupport/*.dll")
|
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
# Add custom icon on Mac OS X.
|
# Add custom icon on Mac OS X.
|
||||||
@ -450,23 +374,15 @@ if(APPLE)
|
|||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
# Wrap files, create moc files.
|
# Wrap files, create moc files.
|
||||||
if(USE_QT_5)
|
qt5_wrap_ui(APP_UI ${APP_FORMS})
|
||||||
qt5_wrap_ui(APP_UI ${APP_FORMS})
|
|
||||||
|
# Load translations.
|
||||||
# Load translations.
|
if(${Qt5LinguistTools_FOUND})
|
||||||
if(${Qt5LinguistTools_FOUND})
|
message(STATUS "[${APP_LOW_NAME}] Qt Linguist Tools found. Translations will get compiled.")
|
||||||
message(STATUS "[${APP_LOW_NAME}] Qt Linguist Tools found. Translations will get compiled.")
|
qt5_add_translation(APP_QM ${APP_TRANSLATIONS})
|
||||||
qt5_add_translation(APP_QM ${APP_TRANSLATIONS})
|
else(${Qt5LinguistTools_FOUND})
|
||||||
else(${Qt5LinguistTools_FOUND})
|
message(STATUS "[${APP_LOW_NAME}] Qt Linguist Tools NOT found. No compilation for translations.")
|
||||||
message(STATUS "[${APP_LOW_NAME}] Qt Linguist Tools NOT found. No compilation for translations.")
|
endif(${Qt5LinguistTools_FOUND})
|
||||||
endif(${Qt5LinguistTools_FOUND})
|
|
||||||
else(USE_QT_5)
|
|
||||||
qt4_wrap_cpp(APP_MOC ${APP_HEADERS})
|
|
||||||
qt4_wrap_ui(APP_UI ${APP_FORMS})
|
|
||||||
|
|
||||||
# Load translations.
|
|
||||||
qt4_add_translation(APP_QM ${APP_TRANSLATIONS})
|
|
||||||
endif(USE_QT_5)
|
|
||||||
|
|
||||||
# Include additional directory paths.
|
# Include additional directory paths.
|
||||||
include_directories (
|
include_directories (
|
||||||
@ -475,105 +391,59 @@ include_directories (
|
|||||||
${CMAKE_SOURCE_DIR}/src/gui/dialogs
|
${CMAKE_SOURCE_DIR}/src/gui/dialogs
|
||||||
${CMAKE_SOURCE_DIR}/src/gui/notifications
|
${CMAKE_SOURCE_DIR}/src/gui/notifications
|
||||||
${CMAKE_SOURCE_DIR}/src/network-web
|
${CMAKE_SOURCE_DIR}/src/network-web
|
||||||
${CMAKE_SOURCE_DIR}/src/network-web/adblock
|
|
||||||
${CMAKE_SOURCE_DIR}/src/dynamic-shortcuts
|
${CMAKE_SOURCE_DIR}/src/dynamic-shortcuts
|
||||||
${CMAKE_BINARY_DIR}/src
|
${CMAKE_BINARY_DIR}/src
|
||||||
)
|
)
|
||||||
|
|
||||||
# Compile "rssguard"
|
# Compile "rssguard"
|
||||||
if(USE_QT_5)
|
add_executable(${EXE_NAME} WIN32 MACOSX_BUNDLE
|
||||||
add_executable(${EXE_NAME} WIN32 MACOSX_BUNDLE
|
${APP_SOURCES}
|
||||||
${APP_SOURCES}
|
${APP_FORMS}
|
||||||
${APP_FORMS}
|
${APP_RCC}
|
||||||
${APP_RCC}
|
${APP_QM}
|
||||||
${APP_QM}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(${EXE_NAME} Qt5::WinMain)
|
target_link_libraries(${EXE_NAME} Qt5::WinMain)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
# Use modules from Qt.
|
|
||||||
qt5_use_modules(${EXE_NAME}
|
|
||||||
DBus
|
|
||||||
Core
|
|
||||||
Widgets
|
|
||||||
Sql
|
|
||||||
Network
|
|
||||||
Xml
|
|
||||||
WebKit
|
|
||||||
WebKitWidgets
|
|
||||||
PrintSupport
|
|
||||||
)
|
|
||||||
else(UNIX)
|
|
||||||
# Use modules from Qt.
|
# Use modules from Qt.
|
||||||
qt5_use_modules(${EXE_NAME}
|
qt5_use_modules(${EXE_NAME}
|
||||||
Core
|
DBus
|
||||||
Widgets
|
Core
|
||||||
Sql
|
Widgets
|
||||||
Network
|
Sql
|
||||||
Xml
|
Network
|
||||||
WebKit
|
Xml
|
||||||
WebKitWidgets
|
PrintSupport
|
||||||
PrintSupport
|
|
||||||
)
|
)
|
||||||
endif(UNIX)
|
else(UNIX)
|
||||||
# Setup compilation for Qt 4.
|
# Use modules from Qt.
|
||||||
else(USE_QT_5)
|
qt5_use_modules(${EXE_NAME}
|
||||||
add_executable(${EXE_NAME} WIN32 MACOSX_BUNDLE
|
Core
|
||||||
${APP_SOURCES}
|
Widgets
|
||||||
${APP_FORMS}
|
Sql
|
||||||
${APP_MOC}
|
Network
|
||||||
${APP_RCC}
|
Xml
|
||||||
${APP_QM}
|
PrintSupport
|
||||||
)
|
|
||||||
|
|
||||||
if(UNIX)
|
|
||||||
# Link modules from Qt.
|
|
||||||
target_link_libraries(${EXE_NAME}
|
|
||||||
${QT_QTDBUS_LIBRARY}
|
|
||||||
${QT_QTCORE_LIBRARY}
|
|
||||||
${QT_QTGUI_LIBRARY}
|
|
||||||
${QT_QTNETWORK_LIBRARY}
|
|
||||||
${QT_QTSQL_LIBRARY}
|
|
||||||
${QT_QTXML_LIBRARY}
|
|
||||||
${QT_QTMAIN_LIBRARY}
|
|
||||||
${QT_QTWEBKIT_LIBRARY}
|
|
||||||
)
|
)
|
||||||
else(UNIX)
|
endif(UNIX)
|
||||||
# Link modules from Qt.
|
|
||||||
target_link_libraries(${EXE_NAME}
|
|
||||||
${QT_QTCORE_LIBRARY}
|
|
||||||
${QT_QTGUI_LIBRARY}
|
|
||||||
${QT_QTNETWORK_LIBRARY}
|
|
||||||
${QT_QTSQL_LIBRARY}
|
|
||||||
${QT_QTXML_LIBRARY}
|
|
||||||
${QT_QTMAIN_LIBRARY}
|
|
||||||
${QT_QTWEBKIT_LIBRARY}
|
|
||||||
)
|
|
||||||
endif(UNIX)
|
|
||||||
endif(USE_QT_5)
|
|
||||||
|
|
||||||
# Installation stage.
|
# Installation stage.
|
||||||
if(WIN32 OR OS2)
|
if(WIN32)
|
||||||
message(STATUS "[${APP_LOW_NAME}] You will probably install on Windows or OS/2.")
|
message(STATUS "[${APP_LOW_NAME}] You will probably install on Windows or OS/2.")
|
||||||
install(TARGETS ${EXE_NAME} RUNTIME DESTINATION ./)
|
install(TARGETS ${EXE_NAME} RUNTIME DESTINATION ./)
|
||||||
|
|
||||||
# Copy DLLs and other binary files for main installation.
|
# Copy DLLs and other binary files for main installation.
|
||||||
if(WIN32 AND USE_QT_5)
|
if(WIN32)
|
||||||
install(FILES ${APP_DLLS_QT5_MSVC2013} DESTINATION ./)
|
install(FILES ${APP_DLLS_QT5_MSVC2013} DESTINATION ./)
|
||||||
|
install(FILES ${APP_DLLS_QT5_MSVC2013_BEARER} DESTINATION ./bearer)
|
||||||
|
install(FILES ${APP_DLLS_QT5_MSVC2013_ICONENGINES} DESTINATION ./iconengines)
|
||||||
install(FILES ${APP_DLLS_QT5_MSVC2013_IMAGEFORMATS} DESTINATION ./imageformats)
|
install(FILES ${APP_DLLS_QT5_MSVC2013_IMAGEFORMATS} DESTINATION ./imageformats)
|
||||||
install(FILES ${APP_DLLS_QT5_MSVC2013_SQLDRIVERS} DESTINATION ./sqldrivers)
|
|
||||||
install(FILES ${APP_DLLS_QT5_MSVC2013_PLATFORMS} DESTINATION ./platforms)
|
install(FILES ${APP_DLLS_QT5_MSVC2013_PLATFORMS} DESTINATION ./platforms)
|
||||||
install(FILES ${APP_DLLS_QT5_MSVC2013_PRINTSUPPORT} DESTINATION ./printsupport)
|
install(FILES ${APP_DLLS_QT5_MSVC2013_SQLDRIVERS} DESTINATION ./sqldrivers)
|
||||||
endif(WIN32 AND USE_QT_5)
|
endif(WIN32)
|
||||||
|
|
||||||
if(WIN32 AND NOT USE_QT_5)
|
|
||||||
install(FILES ${APP_DLLS_QT4_MSVC2013} DESTINATION ./)
|
|
||||||
install(FILES ${APP_DLLS_QT4_MSVC2013_IMAGEFORMATS} DESTINATION ./imageformats)
|
|
||||||
install(FILES ${APP_DLLS_QT4_MSVC2013_SQLDRIVERS} DESTINATION ./sqldrivers)
|
|
||||||
endif(WIN32 AND NOT USE_QT_5)
|
|
||||||
|
|
||||||
install(DIRECTORY resources/graphics/icons/mini-kfaenza DESTINATION ./icons)
|
install(DIRECTORY resources/graphics/icons/mini-kfaenza DESTINATION ./icons)
|
||||||
|
|
||||||
@ -584,33 +454,33 @@ if(WIN32 OR OS2)
|
|||||||
endif(ENABLE_ADDITIONAL_ICONS)
|
endif(ENABLE_ADDITIONAL_ICONS)
|
||||||
|
|
||||||
install(DIRECTORY resources/skins/base
|
install(DIRECTORY resources/skins/base
|
||||||
DESTINATION ./skins)
|
DESTINATION ./skins)
|
||||||
install(DIRECTORY resources/misc
|
install(DIRECTORY resources/misc
|
||||||
DESTINATION ./)
|
DESTINATION ./)
|
||||||
install(DIRECTORY resources/initial_feeds
|
install(DIRECTORY resources/initial_feeds
|
||||||
DESTINATION ./)
|
DESTINATION ./)
|
||||||
install(FILES resources/graphics/${APP_LOW_NAME}_128.png
|
install(FILES resources/graphics/${APP_LOW_NAME}_128.png
|
||||||
DESTINATION ./
|
DESTINATION ./
|
||||||
RENAME ${APP_LOW_NAME}.png)
|
RENAME ${APP_LOW_NAME}.png)
|
||||||
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png
|
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png
|
||||||
DESTINATION ./
|
DESTINATION ./
|
||||||
RENAME ${APP_LOW_NAME}_plain.png)
|
RENAME ${APP_LOW_NAME}_plain.png)
|
||||||
install(FILES resources/graphics/${APP_LOW_NAME}.ico
|
install(FILES resources/graphics/${APP_LOW_NAME}.ico
|
||||||
DESTINATION ./)
|
DESTINATION ./)
|
||||||
install(FILES ${APP_QM}
|
install(FILES ${APP_QM}
|
||||||
DESTINATION ./l10n)
|
DESTINATION ./l10n)
|
||||||
install(FILES ${APP_TEXT}
|
install(FILES ${APP_TEXT}
|
||||||
DESTINATION ./)
|
DESTINATION ./)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
message(STATUS "[${APP_LOW_NAME}] You will probably install on Mac OS X.")
|
message(STATUS "[${APP_LOW_NAME}] You will probably install on Mac OS X.")
|
||||||
|
|
||||||
set_target_properties(${EXE_NAME}
|
set_target_properties(${EXE_NAME}
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
MACOSX_BUNDLE_INFO_PLIST
|
MACOSX_BUNDLE_INFO_PLIST
|
||||||
"${CMAKE_SOURCE_DIR}/resources/macosx/Info.plist.in")
|
"${CMAKE_SOURCE_DIR}/resources/macosx/Info.plist.in")
|
||||||
|
|
||||||
set_source_files_properties(${CMAKE_SOURCE_DIR}/resources/macosx/${APP_LOW_NAME}.icns
|
set_source_files_properties(${CMAKE_SOURCE_DIR}/resources/macosx/${APP_LOW_NAME}.icns
|
||||||
PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||||
|
|
||||||
set(MACOSX_BUNDLE_ICON_FILE ${APP_LOW_NAME}.icns)
|
set(MACOSX_BUNDLE_ICON_FILE ${APP_LOW_NAME}.icns)
|
||||||
set(MACOSX_BUNDLE_INFO_STRING "${EXE_NAME} ${APP_VERSION}")
|
set(MACOSX_BUNDLE_INFO_STRING "${EXE_NAME} ${APP_VERSION}")
|
||||||
@ -661,7 +531,7 @@ elseif(UNIX)
|
|||||||
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png DESTINATION share/rssguard/icons RENAME ${APP_LOW_NAME}_plain.png)
|
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png DESTINATION share/rssguard/icons RENAME ${APP_LOW_NAME}_plain.png)
|
||||||
install(FILES ${APP_QM} DESTINATION share/${APP_LOW_NAME}/l10n)
|
install(FILES ${APP_QM} DESTINATION share/${APP_LOW_NAME}/l10n)
|
||||||
install(FILES ${APP_TEXT} DESTINATION share/${APP_LOW_NAME}/information)
|
install(FILES ${APP_TEXT} DESTINATION share/${APP_LOW_NAME}/information)
|
||||||
endif(WIN32 OR OS2)
|
endif(WIN32)
|
||||||
|
|
||||||
# Custom target for packaging.
|
# Custom target for packaging.
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
@ -680,38 +550,30 @@ set(CPACK_PACKAGE_VERSION_PATCH "0")
|
|||||||
set(CPACK_PACKAGE_VENDOR ${APP_AUTHOR})
|
set(CPACK_PACKAGE_VENDOR ${APP_AUTHOR})
|
||||||
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY ${APP_NAME})
|
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY ${APP_NAME})
|
||||||
set(CPACK_IGNORE_FILES "/resources/aur/;\\\\.psd$;/resources/deployment;/CVS/;/\\\\.svn/;/\\\\.git/;\\\\.swp$;/CMakeLists.txt.user;\\\\.#;/#;\\\\.tar.gz$;/CMakeFiles/;CMakeCache.txt;\\\\.qm$;/build/;\\\\.diff$;.DS_Store'")
|
set(CPACK_IGNORE_FILES "/resources/aur/;\\\\.psd$;/resources/deployment;/CVS/;/\\\\.svn/;/\\\\.git/;\\\\.swp$;/CMakeLists.txt.user;\\\\.#;/#;\\\\.tar.gz$;/CMakeFiles/;CMakeCache.txt;\\\\.qm$;/build/;\\\\.diff$;.DS_Store'")
|
||||||
set(CPACK_SOURCE_GENERATOR "TGZ")
|
set(CPACK_SOURCE_GENERATOR "TGZ")
|
||||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
||||||
set(CPACK_SOURCE_IGNORE_FILES ${CPACK_IGNORE_FILES})
|
set(CPACK_SOURCE_IGNORE_FILES ${CPACK_IGNORE_FILES})
|
||||||
|
|
||||||
set(CPACK_NSIS_INSTALLED_ICON_NAME "${APP_LOW_NAME}.ico")
|
set(CPACK_NSIS_INSTALLED_ICON_NAME "${APP_LOW_NAME}.ico")
|
||||||
set(CPACK_NSIS_HELP_LINK ${APP_URL})
|
set(CPACK_NSIS_HELP_LINK ${APP_URL})
|
||||||
set(CPACK_NSIS_URL_INFO_ABOUT ${APP_URL})
|
set(CPACK_NSIS_URL_INFO_ABOUT ${APP_URL})
|
||||||
set(CPACK_NSIS_CONTACT ${APP_EMAIL})
|
set(CPACK_NSIS_CONTACT ${APP_EMAIL})
|
||||||
|
|
||||||
# Load packaging facilities.
|
# Load packaging facilities.
|
||||||
include(CPack)
|
include(CPack)
|
||||||
|
|
||||||
# Configure file with custom definitions for NSIS.
|
# Configure file with custom definitions for NSIS.
|
||||||
configure_file(
|
configure_file(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/resources/nsis/NSIS.definitions.nsh.in
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/nsis/NSIS.definitions.nsh.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/resources/nsis/NSIS.definitions.nsh
|
${CMAKE_CURRENT_BINARY_DIR}/resources/nsis/NSIS.definitions.nsh
|
||||||
)
|
)
|
||||||
|
|
||||||
# make dist implementation.
|
# make dist implementation.
|
||||||
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
|
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
|
||||||
|
|
||||||
# make lupdate implementation.
|
# make lupdate implementation.
|
||||||
if(USE_QT_5)
|
|
||||||
add_custom_target(lupdate
|
add_custom_target(lupdate
|
||||||
${Qt5Core_QMAKE_EXECUTABLE} -project -o ${CMAKE_BINARY_DIR}/${APP_LOW_NAME}.pro
|
${Qt5Core_QMAKE_EXECUTABLE} -project -o ${CMAKE_BINARY_DIR}/${APP_LOW_NAME}.pro
|
||||||
COMMAND ${Qt5_LUPDATE_EXECUTABLE} -no-obsolete -ts ${APP_TRANSLATIONS_WO_QT} -pro ${CMAKE_BINARY_DIR}/${APP_LOW_NAME}.pro
|
COMMAND ${Qt5_LUPDATE_EXECUTABLE} -no-obsolete -ts ${APP_TRANSLATIONS_WO_QT} -pro ${CMAKE_BINARY_DIR}/${APP_LOW_NAME}.pro
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
else(USE_QT_5)
|
|
||||||
add_custom_target(lupdate
|
|
||||||
${QT_QMAKE_EXECUTABLE} -project -o ${CMAKE_BINARY_DIR}/${APP_LOW_NAME}.pro
|
|
||||||
COMMAND ${QT_LUPDATE_EXECUTABLE} -no-obsolete -ts ${APP_TRANSLATIONS_WO_QT} -pro ${CMAKE_BINARY_DIR}/${APP_LOW_NAME}.pro
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
endif(USE_QT_5)
|
|
||||||
|
16
README.md
16
README.md
@ -2,7 +2,7 @@ RSS Guard
|
|||||||
=========
|
=========
|
||||||
Welcome to RSS Guard website. You can find here basic information.
|
Welcome to RSS Guard website. You can find here basic information.
|
||||||
|
|
||||||
RSS Guard is simple and easy-to-use RSS/ATOM feed aggregator developed using Qt framework which supports online feed synchronization.
|
RSS Guard is simple, light and easy-to-use RSS/ATOM feed aggregator developed using Qt framework which supports online feed synchronization.
|
||||||
|
|
||||||
#####################
|
#####################
|
||||||
# **PLEASE, ALL USERS -> fill [this survey](http://goo.gl/forms/GcvPYgS2a8).**
|
# **PLEASE, ALL USERS -> fill [this survey](http://goo.gl/forms/GcvPYgS2a8).**
|
||||||
@ -14,10 +14,9 @@ Core features are:
|
|||||||
* Tiny Tiny RSS (from RSS Guard 3.0.0),
|
* Tiny Tiny RSS (from RSS Guard 3.0.0),
|
||||||
* ownCloud News (from RSS Guard 3.1.0).
|
* ownCloud News (from RSS Guard 3.1.0).
|
||||||
* multiplatformity,
|
* multiplatformity,
|
||||||
* multiple data backend support,
|
* multiple data backend support.
|
||||||
* SQLite (in-memory DBs too),
|
* SQLite (in-memory DBs too),
|
||||||
* MySQL.
|
* MySQL.
|
||||||
* Adblock.
|
|
||||||
|
|
||||||
See below for more information about features and other RSS Guard aspects.
|
See below for more information about features and other RSS Guard aspects.
|
||||||
|
|
||||||
@ -80,7 +79,6 @@ RSS Guard is simple (yet powerful) feed reader. It is able to fetch the most kno
|
|||||||
|
|
||||||
* Windows XP and newer,
|
* Windows XP and newer,
|
||||||
* GNU/Linux,
|
* GNU/Linux,
|
||||||
* OS/2 (eComStation),
|
|
||||||
* Mac OS X,
|
* Mac OS X,
|
||||||
* xBSD (possibly),
|
* xBSD (possibly),
|
||||||
* Android (possibly),
|
* Android (possibly),
|
||||||
@ -98,9 +96,9 @@ RSS Guard is written in C++. It is pretty fast even with tons of messages loaded
|
|||||||
* downloader with own tab and support for up to 6 parallel downloads,
|
* downloader with own tab and support for up to 6 parallel downloads,
|
||||||
* message filter with regular expressions,
|
* message filter with regular expressions,
|
||||||
* feed metadata fetching including icons,
|
* feed metadata fetching including icons,
|
||||||
* simple Adblock functionality,
|
* no crazy dependencies,
|
||||||
* customized popup notifications,
|
* small memory footprint,
|
||||||
* Google-based auto-completion for internal web browser location bar,
|
* small installation package,
|
||||||
* ability to cleanup internal message database with various options,
|
* ability to cleanup internal message database with various options,
|
||||||
* enhanced feed auto-updating with separate time intervals,
|
* enhanced feed auto-updating with separate time intervals,
|
||||||
* multiple data backend support,
|
* multiple data backend support,
|
||||||
@ -111,11 +109,9 @@ RSS Guard is written in C++. It is pretty fast even with tons of messages loaded
|
|||||||
* feed categorization,
|
* feed categorization,
|
||||||
* drap-n-drop for feed list,
|
* drap-n-drop for feed list,
|
||||||
* automatic checking for updates,
|
* automatic checking for updates,
|
||||||
* ability to discover existing feeds on websites,
|
|
||||||
* full support of podcasts (both RSS & ATOM),
|
* full support of podcasts (both RSS & ATOM),
|
||||||
* ability to backup/restore database or settings,
|
* ability to backup/restore database or settings,
|
||||||
* fully-featured recycle bin,
|
* fully-featured recycle bin,
|
||||||
* printing of messages and any web pages,
|
|
||||||
* can be fully controlled via keyboard,
|
* can be fully controlled via keyboard,
|
||||||
* feed authentication (Digest-MD5, BASIC, NTLM-2),
|
* feed authentication (Digest-MD5, BASIC, NTLM-2),
|
||||||
* handles tons of messages & feeds,
|
* handles tons of messages & feeds,
|
||||||
@ -131,8 +127,6 @@ RSS Guard is written in C++. It is pretty fast even with tons of messages loaded
|
|||||||
* ability to hide list of feeds/categories,
|
* ability to hide list of feeds/categories,
|
||||||
* open-source development model based on GNU GPL license, version 3,
|
* open-source development model based on GNU GPL license, version 3,
|
||||||
* tabbed interface,
|
* tabbed interface,
|
||||||
* integrated web browser with adjustable behavior + external browser support,
|
|
||||||
* internal web browser mouse gestures support,
|
|
||||||
* desktop integration via tray icon,
|
* desktop integration via tray icon,
|
||||||
* localizations to some languages,
|
* localizations to some languages,
|
||||||
* Qt library is the only dependency,
|
* Qt library is the only dependency,
|
||||||
|
@ -1,174 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs_CZ" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs_CZ" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Přidat skupinu filtrů</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation>Vlastní seznam filtrů</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation>Zadaný název je v pořádku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation>Zadaný název je prázdný.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation>Zadaná adresa je v pořádku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation>Zadaná adresa je prázdná.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation>Nadpis</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation>Adresa</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation>Vlastní pravidla</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation>Nastavení Adblocku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation>Povolit Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation>Berte v potaz, že Adblock může tuto aplikaci podstatně zpomalit, pokud si aktivujete veliké skupiny filtrů. Příliš mnoho pravidel škodí výkonu. Také se ujistěte, že po významných úpravach nastavení Adblocku restartujete aplikaci. Adblock je znám tím, že může žrát hodně paměti.
|
|
||||||
|
|
||||||
Berte také na paměti, že některé prostředky webových stránek jsou interním webovým prohlížečem cachovány.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation>Možnosti</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation>Filtrovat pravidla</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation>Použít pouze základní části EasyListu (z výkonnostních důvodů)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Přidat pravidlo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Smazat pravidlo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Přidat skupinu filtrů</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation>Smazat skupinu filtrů</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation>Aktualizovat skupinu filtrů</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation>Jak psát filtry</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation>Zobrazit &nastavení Adblocku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation>Zakázat pro %1</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation>Zakázat pouze pro tuto stránku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation>Zablokovaná vyskakovací okna</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation>%1 skrze (%2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation>Nic se aktuálně neblokuje</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation>Nějaký obsah zablokován - klikněte pro editaci pravidla</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation>Adblock - jsem vzhůru a makám</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation>Adblock - nemakám</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation>Nelze načíst sadu pravidel!</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation>Zadejte své pravidlo sem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation>%1 (aktualizováno)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation>%1 (chyba: %2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Přidat pravidlo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Smazat pravidlo</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -269,38 +99,15 @@ Berte také na paměti, že některé prostředky webových stránek jsou intern
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Selected database does not exist (yet). It will be created. It's okay.</source>
|
<source>Selected database does not exist (yet). It will be created. It's okay.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Vybraná databáze doposud neexistuje, ale bude vytvořena při prvním použití.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>MySQL database not available</source>
|
<source>MySQL database not available</source>
|
||||||
<translation type="unfinished"/>
|
<translation>MySQL databáze není k dispozici</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 nemůže použít MySQL databází, není k dispozici. %1 se nyní přepne pro použití SQLite databáze. Pokud chcete opět použít MySQL, přepněte si to v nastavení.</translation>
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation>Tato stránka bohužel neobsahuje žádné kanály.</translation>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation><numerusform>Pro přidání kanálů z této stránky na mě klikni.
|
|
||||||
Tato stránka obsahuje %n kanál.</numerusform><numerusform>Pro přidání kanálů z této stránky na mě klikni.
|
|
||||||
Tato stránka obsahuje %n kanály.</numerusform><numerusform>Pro přidání kanálů z této stránky na mě klikni.
|
|
||||||
Tato stránka obsahuje %n kanálů.</numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation>Nepodporováno</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation>Tento účet nepodporuje přidávání kanálů.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1024,11 +831,11 @@ or this functionality is not implemented yet.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Force execution of server-side update when updating feeds from RSS Guard</source>
|
<source>Force execution of server-side update when updating feeds from RSS Guard</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Vynutit aktualizace kanálů na straně serveru</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Leaving this option on causes that updates of feeds will be probably much slower and may time-out often.</source>
|
<source>Leaving this option on causes that updates of feeds will be probably much slower and may time-out often.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Zapnutí této položky může výrazně zpomalit aktualizaci kanálů.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1057,10 +864,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Zvolte strategii auto-aktualizací tohoto kanálu. Výchozí strategorie auto-aktualizace znamená, že kanál bude aktualizován v intervalech udaných v nastavení aplikace.</translation>
|
<translation>Zvolte strategii auto-aktualizací tohoto kanálu. Výchozí strategorie auto-aktualizace znamená, že kanál bude aktualizován v intervalech udaných v nastavení aplikace.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minut</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Některé kanály vyžaduje autentizaci, a to včetně kanálů pro GMail. Je podporována autentizace BASIC, NTLM-2 a DIGEST-MD5.</translation>
|
<translation>Některé kanály vyžaduje autentizaci, a to včetně kanálů pro GMail. Je podporována autentizace BASIC, NTLM-2 a DIGEST-MD5.</translation>
|
||||||
@ -1154,7 +957,7 @@ or this functionality is not implemented yet.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Force execution of server-side update when updating feeds from RSS Guard</source>
|
<source>Force execution of server-side update when updating feeds from RSS Guard</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Vynutit aktualizace kanálů na straně serveru.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
@ -1182,11 +985,11 @@ or this functionality is not implemented yet.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Leaving this option on causes that updates of feeds will be probably much slower and may time-out often.</source>
|
<source>Leaving this option on causes that updates of feeds will be probably much slower and may time-out often.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Zapnutí této položky může výrazně zpomalit aktualizaci kanálů.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Note that at least version %1 is required.</source>
|
<source>Note that at least version %1 is required.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Je vyžadována minimálně verze %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Password for your TT-RSS account</source>
|
<source>Password for your TT-RSS account</source>
|
||||||
@ -1198,7 +1001,7 @@ or this functionality is not implemented yet.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>URL of your ownCloud server, without any API path</source>
|
<source>URL of your ownCloud server, without any API path</source>
|
||||||
<translation type="unfinished"/>
|
<translation>URL vašeho ownCloud serveru, bez jakýchkoliv API koncovek.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No test done yet.</source>
|
<source>No test done yet.</source>
|
||||||
@ -1210,19 +1013,19 @@ or this functionality is not implemented yet.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Add new ownCloud News account</source>
|
<source>Add new ownCloud News account</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Přidat nový ownCloud News účet</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit existing ownCloud News account</source>
|
<source>Edit existing ownCloud News account</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Upravit existující účet ownCloudNews</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Selected ownCloud News server is running unsupported version (%1). At least version %2 is required.</source>
|
<source>Selected ownCloud News server is running unsupported version (%1). At least version %2 is required.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Vybraný server pro ownCloud News běží na nepodporované verzi (%1). Je třeba minimálně verze %2.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Selected ownCloud News server is running unsupported version.</source>
|
<source>Selected ownCloud News server is running unsupported version.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Vybraný ownCloud News server běží na nepodporované verzi.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>OwnCloud News server is okay, running with version %1, while at least version %2 is required.</source>
|
<source>OwnCloud News server is okay, running with version %1, while at least version %2 is required.</source>
|
||||||
@ -1295,22 +1098,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>Na&stavení</translation>
|
<translation>Na&stavení</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>&Aktivní panel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Přidat panel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Zprávy</translation>
|
<translation>&Zprávy</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Webovy prohlížeč</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Přepnout &důležitost vybraných zpráv</translation>
|
<translation>Přepnout &důležitost vybraných zpráv</translation>
|
||||||
@ -1327,14 +1118,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Přepnout režim celé obrazovky.</translation>
|
<translation>Přepnout režim celé obrazovky.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Přidat nový panel webového prohlížeče.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Zavřít aktuální panel webového prohlížeče..</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Žádná dostupná akce</translation>
|
<translation>Žádná dostupná akce</translation>
|
||||||
@ -1367,22 +1150,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation>Sma&zat vybrané zprávy</translation>
|
<translation>Sma&zat vybrané zprávy</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Nastavení</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Skryje či zobrazí hlavní menu.</translation>
|
<translation>Skryje či zobrazí hlavní menu.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation>&Zavřít všechny taby až na ten aktivní</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation>&Zavřít aktivní tab</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation>Označit vybrané zprávy jako &přečtené</translation>
|
<translation>Označit vybrané zprávy jako &přečtené</translation>
|
||||||
@ -1399,10 +1170,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation>&Otevřít vybrané krátké články v interním prohlížeči</translation>
|
<translation>&Otevřít vybrané krátké články v interním prohlížeči</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation>&Otevřít vybrané zdrojové články v interním prohlížeči</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation>Vybrat &další zprávu</translation>
|
<translation>Vybrat &další zprávu</translation>
|
||||||
@ -1415,18 +1182,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation>Ověřit dostupnost &aktualizace</translation>
|
<translation>Ověřit dostupnost &aktualizace</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>Povolit &JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation>Povolit externí &pluginy</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation>Automaticky načítat &obrázky</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Zobrazit/skrýt</translation>
|
<translation>Zobrazit/skrýt</translation>
|
||||||
@ -1467,10 +1222,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation>&Hlavičky seznamů zpráv/kanálů</translation>
|
<translation>&Hlavičky seznamů zpráv/kanálů</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation>Zavřít všechny taby kromě aktivního.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation>Nahlásit &chybu (GitHub)...</translation>
|
<translation>Nahlásit &chybu (GitHub)...</translation>
|
||||||
@ -1669,11 +1420,11 @@ or this functionality is not implemented yet.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Stop running update</source>
|
<source>Stop running update</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Zastavit probíhající aktualizaci kanálů</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>No actions possible</source>
|
<source>No actions possible</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Žádná možná akce</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1856,14 +1607,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation>Otevírat nové panely poklepáním na panelový pruh</translation>
|
<translation>Otevírat nové panely poklepáním na panelový pruh</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Povolit gesta myši</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation>Zařadit nově otevíraný panel za ten aktuální</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -2009,10 +1752,6 @@ Autoři této aplikace nenesou žádnou odpovědnost za ztrátu Vašich dat.</tr
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation>paměťová databáze přepnuta</translation>
|
<translation>paměťová databáze přepnuta</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Interní webový prohlížeč</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Externí webový prohlížeč</translation>
|
<translation>Externí webový prohlížeč</translation>
|
||||||
@ -2041,10 +1780,6 @@ Autoři této aplikace nenesou žádnou odpovědnost za ztrátu Vašich dat.</tr
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Auto-aktualizovat všechny kanály každých</translation>
|
<translation>Auto-aktualizovat všechny kanály každých</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minut</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Časový limit stažení souboru kanálu</translation>
|
<translation>Časový limit stažení souboru kanálu</translation>
|
||||||
@ -2165,18 +1900,6 @@ Autoři této aplikace nenesou žádnou odpovědnost za ztrátu Vašich dat.</tr
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Spustit %1 při spuštění operačního systému</translation>
|
<translation>Spustit %1 při spuštění operačního systému</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Povolit JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation>Povolit externí NPAPI pluginy</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation>Načítat obrázky ve webových stránkách</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation><html><head/><body><p>Pokud bude nezaškrtnuto, pak se použije výchozí systémový webový prohlížeč.</p></body></html></translation>
|
<translation><html><head/><body><p>Pokud bude nezaškrtnuto, pak se použije výchozí systémový webový prohlížeč.</p></body></html></translation>
|
||||||
@ -2284,18 +2007,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation>Pracovní databáze</translation>
|
<translation>Pracovní databáze</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation>Gesta myši se aktivují kliknutím prostředního tlačítka myši, mezi gesta patří:
|
|
||||||
• předchozí stránka (táhnutí myši vlevo),
|
|
||||||
• následující stránka (táhnutí myši vpravo),
|
|
||||||
• obnovení aktuální stránky (táhnutí myši nahoru),
|
|
||||||
• otevření nového tabu (táhnutí myši dolu).</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation>Použít vlastní webový prohlížeč</translation>
|
<translation>Použít vlastní webový prohlížeč</translation>
|
||||||
@ -2352,46 +2063,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation>Pracovní databáze je ok.</translation>
|
<translation>Pracovní databáze je ok.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation>Pozice notifikací</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation>(Tray ikona není dostupná.)</translation>
|
<translation>(Tray ikona není dostupná.)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation>Levý-dolní roh</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation>Levý-horní roh</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation>Pravý-dolní roh</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation>Pravý-horní roh</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation>Písma interního prohlížeče zpráv</translation>
|
<translation>Písma interního prohlížeče zpráv</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation>Standardní písmo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation>Mějte na paměti, že rychlost a latence použitého MySQL serveru těžce ovlivňuje svižnost aplikace. Použití pomalého databázového spojení může vést ke špatnému výkonu aplikace např. při prohlížení zpráv.</translation>
|
<translation>Mějte na paměti, že rychlost a latence použitého MySQL serveru těžce ovlivňuje svižnost aplikace. Použití pomalého databázového spojení může vést ke špatnému výkonu aplikace např. při prohlížení zpráv.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation>Moderní notifikace (Toto používá nativní notifikace přes D-Bus, jsou-li dostupné.)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2400,26 +2083,34 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation>Povolit notifikace</translation>
|
<translation>Povolit notifikace</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation>Barva pozadí</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation>Změnit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Při začátku stahování otevírat správce stahování</translation>
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remember opened web browser tabs</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation>Povolit D-Bus notifikace</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation>&Změnit písmo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation>Náhled písma</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
|
<translation>(není k dispozici)</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>FormStandardCategoryDetails</name>
|
<name>FormStandardCategoryDetails</name>
|
||||||
@ -2583,10 +2274,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Zvolte strategii auto-aktualizací tohoto kanálu. Výchozí strategorie auto-aktualizace znamená, že kanál bude aktualizován v intervalech udaných v nastavení aplikace.</translation>
|
<translation>Zvolte strategii auto-aktualizací tohoto kanálu. Výchozí strategorie auto-aktualizace znamená, že kanál bude aktualizován v intervalech udaných v nastavení aplikace.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minut</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Nadpis</translation>
|
<translation>Nadpis</translation>
|
||||||
@ -3101,10 +2788,34 @@ Přejít na web aplikace a stáhnout jej ručně.</translation>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>Adresu webové stránky zadejte sem</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3283,14 +2994,6 @@ Přejít na web aplikace a stáhnout jej ručně.</translation>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Kontextové menu pro zprávy</translation>
|
<translation>Kontextové menu pro zprávy</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Zpráva bez URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>Zpráva '%s' neobsahuje URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>PRoblém s externím webovým prohlížečem</translation>
|
<translation>PRoblém s externím webovým prohlížečem</translation>
|
||||||
@ -3307,6 +3010,10 @@ Přejít na web aplikace a stáhnout jej ručně.</translation>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation>Externí e-mailový klient nemohl být úspěšně spuštěn.</translation>
|
<translation>Externí e-mailový klient nemohl být úspěšně spuštěn.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Novinový náhled</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3386,6 +3093,25 @@ Přejít na web aplikace a stáhnout jej ručně.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<source>unknown content</source>
|
<source>unknown content</source>
|
||||||
<extracomment>Network status.</extracomment>
|
<extracomment>Network status.</extracomment>
|
||||||
|
<translation>neznámý obsah</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3641,10 +3367,6 @@ ID účtu: %1</translation>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3663,7 +3385,7 @@ ID účtu: %1</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Toolbar spacer</source>
|
<source>Toolbar spacer</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Mezera</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3711,11 +3433,6 @@ Nepřečtené zprávy: %2</translation>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Procházet kanály a zprávy</translation>
|
<translation>Procházet kanály a zprávy</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Webový prohlížeč</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation>ZObrazí hlavní menu.</translation>
|
<translation>ZObrazí hlavní menu.</translation>
|
||||||
@ -3724,15 +3441,26 @@ Nepřečtené zprávy: %2</translation>
|
|||||||
<source>Main menu</source>
|
<source>Main menu</source>
|
||||||
<translation>Hlavní menu</translation>
|
<translation>Hlavní menu</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open new web browser tab.</source>
|
|
||||||
<translation>Otevřít nový tab webového prohlížeče.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source>Downloads</source>
|
||||||
<translation>Stahování</translation>
|
<translation>Stahování</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> and </source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ToolBarEditor</name>
|
<name>ToolBarEditor</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3845,215 +3573,4 @@ Poslední přihlášení: %5</translation>
|
|||||||
<translation>Nelze přidat kanál, protože probíhá jiná kritická operace.</translation>
|
<translation>Nelze přidat kanál, protože probíhá jiná kritická operace.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Navigační panel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Zpět</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Vpřed</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Obnovit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Zastavit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Přiblížení</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Bez názvu</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Oddálit aktivní webovou stránku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Obnovit zoom na 100%.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Přiblížit aktivní webovou stránku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Napsal </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Novinový náhled</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Jít zpět.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Jít vpřed.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Opět načíst aktuální webovou stránku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Zastavit načítání aktuální webové stránky.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Obnovit stránku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>Kopírovat adresu odkazu</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Kopírovat obrázek</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Kopírovat adresu obrázku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Otevřít odkaz v novém panelu</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Přejít</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Otevřít obrázek v novém panelu</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Webový prohlížeč</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Obrázek</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Hypertextový odkaz</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Opět načíst aktuální webovou stránku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Kopírovat výběr</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation>Zkopíruje aktuální výběr do schránky.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation>Kopírovat adresu odkazu do schránky.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation>Kopírovat obrázek do schránky.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation>Kopírovat adresu obrázku do schránky.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation>Otevřít tento odkaz v novém tabu.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation>Otevřít tento odkaz v aktuálním tabu.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Otevřít tento obrázek v aktuálním tabu.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation>Otevřít odkaz v externím prohlížeči</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation>Otevřít hypertextový odkaz v externím prohlížeči.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation>Vytisknout</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation>Vytisknout aktuální webovou stránku.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation>HTML stránky (*.html)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation>Zvolte cílový soubor pro webovou stránku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation>Nelze uložit webovou stránku</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation>Webová stránka nemůže být uložena, protože do cíle nelze zapisovat.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation>Uložit cíl jako...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation>Stáhnout cíl odkazu.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation>Uložit stránku jako...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation>Uloží obrázek na disk.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation>Uložit obrázek jako...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation>zdrojova_stranka</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation>Hledat "%1" přes Google...</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,172 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="da_DK" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="da_DK" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Tilføj abonnement</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation>Titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation>Addresse</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation>Brugerdefinerede regler</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation>Adblock-indstillinger</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation>Indstillinger</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Tilføj regel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Fjern regel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Tilføj abonnement</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation>Fjern abonnement</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation>Ajourfør abonnementer</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation>Vis Adblock ind&stillinger</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation>Deaktivér på %1</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation>Deaktivér kun på denne side</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation>Blokér pop-up vinduer</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation>%1 med (%2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation>%1 (fejl: %2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Tilføj regl</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Fjern regel</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -278,26 +110,6 @@ Also note that some resources are cached by internal web browser. Thus, after ch
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation>Uunderstøttet</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>DownloadItem</name>
|
<name>DownloadItem</name>
|
||||||
<message>
|
<message>
|
||||||
@ -1051,10 +863,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minutter</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Nogle feeds kræver godkendelse, inklusiv GMail feeds. BASIC, NTLM-2 og DIGEST-MD5 godkendelse er understøttet.</translation>
|
<translation>Nogle feeds kræver godkendelse, inklusiv GMail feeds. BASIC, NTLM-2 og DIGEST-MD5 godkendelse er understøttet.</translation>
|
||||||
@ -1289,22 +1097,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>Ind&stillinger</translation>
|
<translation>Ind&stillinger</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>&Nuværende faneblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>Tilføj f&aneblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Meddelelser</translation>
|
<translation>&Meddelelser</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Netlæser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Skift</translation>
|
<translation>Skift</translation>
|
||||||
@ -1321,14 +1117,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Skift til fuldskærmstilstand.</translation>
|
<translation>Skift til fuldskærmstilstand.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Opret nyt faneblad i netlæser.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Ingen tilgængelige handlinger</translation>
|
<translation>Ingen tilgængelige handlinger</translation>
|
||||||
@ -1361,22 +1149,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Indstillinger</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Skjuler eller viser hovedmenuen.</translation>
|
<translation>Skjuler eller viser hovedmenuen.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation>Marker</translation>
|
<translation>Marker</translation>
|
||||||
@ -1393,10 +1169,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation>Åben valgte beskeder i &intern netlæser</translation>
|
<translation>Åben valgte beskeder i &intern netlæser</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1409,18 +1181,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation>Tjek for</translation>
|
<translation>Tjek for</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>Aktiver &JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Vis/skjul</translation>
|
<translation>Vis/skjul</translation>
|
||||||
@ -1461,10 +1221,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1850,14 +1606,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -1992,10 +1740,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Intern netlæser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Ekstern netlæser</translation>
|
<translation>Ekstern netlæser</translation>
|
||||||
@ -2024,10 +1768,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minutter</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2126,7 +1866,7 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Text beside icon</source>
|
<source>Text beside icon</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Tekst ved siden af ikon</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Text under icon</source>
|
<source>Text under icon</source>
|
||||||
@ -2148,18 +1888,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Start %1 ved systemopstart</translation>
|
<translation>Start %1 ved systemopstart</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Aktiver JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2265,14 +1993,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2327,46 +2047,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation>Øverste venstre hjørne</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation>Nederste højre hjørne</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation>Øverste højre hjørne</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation>Standard skrifttype</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation>E-post</translation>
|
<translation>E-post</translation>
|
||||||
@ -2375,24 +2067,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation>Baggrundsfarve</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2558,10 +2258,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minutter</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Titel</translation>
|
<translation>Titel</translation>
|
||||||
@ -2896,7 +2592,7 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Feeds were exported successfully.</source>
|
<source>Feeds were exported successfully.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Feeds blev eksporteret succesfuldt.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Critical error occurred.</source>
|
<source>Critical error occurred.</source>
|
||||||
@ -3075,10 +2771,34 @@ Go to application website to obtain it manually.</source>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>Hjemmesideadresse indføres her</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3257,14 +2977,6 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3281,6 +2993,10 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3312,7 +3028,7 @@ Go to application website to obtain it manually.</source>
|
|||||||
<message>
|
<message>
|
||||||
<source>proxy server connection refused</source>
|
<source>proxy server connection refused</source>
|
||||||
<extracomment>Network status.</extracomment>
|
<extracomment>Network status.</extracomment>
|
||||||
<translation type="unfinished"/>
|
<translation>forbindelse til proxy server afvist</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>temporary failure</source>
|
<source>temporary failure</source>
|
||||||
@ -3363,6 +3079,25 @@ Go to application website to obtain it manually.</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>OwnCloudServiceRoot</name>
|
<name>OwnCloudServiceRoot</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3593,10 +3328,6 @@ Account ID: %1</source>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3630,7 +3361,7 @@ Account ID: %1</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>anonymous</source>
|
<source>anonymous</source>
|
||||||
<translation type="unfinished"/>
|
<translation>anonym</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3663,11 +3394,6 @@ Ulæste nyheder: %2</translation>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Netlæser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3677,11 +3403,22 @@ Ulæste nyheder: %2</translation>
|
|||||||
<translation>Hovedmenu</translation>
|
<translation>Hovedmenu</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Open new web browser tab.</source>
|
<source>Downloads</source>
|
||||||
<translation>Åben nyt faneblad i netlæser.</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source> and </source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3789,215 +3526,4 @@ Last login on: %5</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Tilbage</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Frem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Genindlæs</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Stop</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Ingen titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Zoom ud.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Nulstil zoom til standard.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Skrevet af</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Go tilbage.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Go frem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Genindlæs nuværende hjemmeside.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Genindlæs hjemmeside</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Kopier billede</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Kopier billedsti</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Åben billede i nyt faneblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Netlæser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Billede</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Genindlæs nuværende hjemmeside.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Kopiér udvalgte</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation>Kopier billedede til udklipsholder.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Åben dette billede i dette faneblad.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation>Åben link i ekstern netlæser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation>Udskriv</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation>Udskriv aktuelle hjemmeside.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation>HTML hjemmesider (*.html)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation>Vælg målfil til hjemmeside</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation>Kan ikke gemme hjemmeside</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation>Gem side som...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation>Gem billede på disk.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation>Gem billede som...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,172 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="de_DE" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="de_DE" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -278,26 +110,6 @@ Also note that some resources are cached by internal web browser. Thus, after ch
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation>Diese Website enthält keine Feeds.</translation>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>DownloadItem</name>
|
<name>DownloadItem</name>
|
||||||
<message>
|
<message>
|
||||||
@ -1051,10 +863,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>Minuten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Gewisse Feeds brauchen eine Authentifizierung, wie z.b. Gmail-Feeds. BASIC, NTLM-2 und DIGEST-MD5 Authentifizierungsmodelle werden unterstützt.</translation>
|
<translation>Gewisse Feeds brauchen eine Authentifizierung, wie z.b. Gmail-Feeds. BASIC, NTLM-2 und DIGEST-MD5 Authentifizierungsmodelle werden unterstützt.</translation>
|
||||||
@ -1289,22 +1097,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>&Einstellungen</translation>
|
<translation>&Einstellungen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>&Aktueller Reiter</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Reiter hinzufügen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Nachrichten</translation>
|
<translation>&Nachrichten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Web Browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Schalte die &Wichtigkeit der selektierten Nachrichten um</translation>
|
<translation>Schalte die &Wichtigkeit der selektierten Nachrichten um</translation>
|
||||||
@ -1321,14 +1117,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Schalte zum Vollbildmodus.</translation>
|
<translation>Schalte zum Vollbildmodus.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Füge neuen Web Browser Reiter hinzu.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Schliesse aktuellen Web Browser Reiter.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Keine Funktionen verfügbar</translation>
|
<translation>Keine Funktionen verfügbar</translation>
|
||||||
@ -1361,22 +1149,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Einstellungen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1393,10 +1169,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1409,18 +1181,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1461,10 +1221,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1850,14 +1606,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation>Öffne neue Reiter mit einem Doppelklick der linken Maustaste auf der Reiterleiste</translation>
|
<translation>Öffne neue Reiter mit einem Doppelklick der linken Maustaste auf der Reiterleiste</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Mausgesten einschalten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation>Reihe neue Reiter (mit Hyperlink) nach dem aktiven Reiter ein</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -1993,10 +1741,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation>In-Speicherdatenbank umgeschaltet</translation>
|
<translation>In-Speicherdatenbank umgeschaltet</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Interner Webbrowser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Externer Webbrowser</translation>
|
<translation>Externer Webbrowser</translation>
|
||||||
@ -2025,10 +1769,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Auto-Update alle Feeds alle</translation>
|
<translation>Auto-Update alle Feeds alle</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> Minuten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Verbindungs-Timeout des Feed</translation>
|
<translation>Verbindungs-Timeout des Feed</translation>
|
||||||
@ -2149,18 +1889,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2266,14 +1994,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2328,46 +2048,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2376,24 +2068,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2559,10 +2259,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>Minuten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Titel</translation>
|
<translation>Titel</translation>
|
||||||
@ -3079,10 +2775,34 @@ Go to application website to obtain it manually.</source>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>Die Webseitenadresse kommt hierhin</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3261,14 +2981,6 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Kontextmenü der Nachricht</translation>
|
<translation>Kontextmenü der Nachricht</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Nachricht ohne URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>Nachricht "%" enthält keine URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>Problem mit Start des externen Webbrowsers</translation>
|
<translation>Problem mit Start des externen Webbrowsers</translation>
|
||||||
@ -3285,6 +2997,10 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Zeitungsansicht</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3367,6 +3083,25 @@ Go to application website to obtain it manually.</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>OwnCloudServiceRoot</name>
|
<name>OwnCloudServiceRoot</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3597,10 +3332,6 @@ Account ID: %1</source>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3619,7 +3350,7 @@ Account ID: %1</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Toolbar spacer</source>
|
<source>Toolbar spacer</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Toolbar Platzhalter</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3666,11 +3397,6 @@ Unread news: %2</source>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Blätteren Sie Ihre Feeds und Nachrichten</translation>
|
<translation>Blätteren Sie Ihre Feeds und Nachrichten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Web Browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3680,11 +3406,22 @@ Unread news: %2</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Open new web browser tab.</source>
|
<source>Downloads</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source> and </source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3792,215 +3529,4 @@ Last login on: %5</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Navigations-Panel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Zurück</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Vorwärts</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Neu laden</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Stopp</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Kein Titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Zoom verkleinern.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Zoom auf Standard zurücksetzen.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Zoom vergrössern.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Geschrieben von</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Zeitungsansicht</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Geh zurück.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Geh vorwärts.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Aktuelle Webseite neu laden.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Stoppe das laden der Webseite.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Webseite neu laden</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>URL-Link kopieren</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Bild kopieren</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Bild-URL kopieren</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Link in neuem Reiter öffnen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Link folgen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Bild in neuem Reiter öffnen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Web Browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Bild</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Hyperlink</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Lade aktuelle Webseite neu.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Kopiere Selektion</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,174 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE TS>
|
<!DOCTYPE TS>
|
||||||
<TS version="2.1" language="en_GB">
|
<TS version="2.1" language="en_GB">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -280,29 +112,6 @@ Also note that some resources are cached by internal web browser. Thus, after ch
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation type="unfinished">
|
|
||||||
<numerusform></numerusform>
|
|
||||||
<numerusform></numerusform>
|
|
||||||
</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>DownloadItem</name>
|
<name>DownloadItem</name>
|
||||||
<message>
|
<message>
|
||||||
@ -1071,10 +880,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1309,22 +1114,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1341,14 +1134,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1381,22 +1166,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1413,10 +1186,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1429,18 +1198,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1481,10 +1238,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -1870,14 +1623,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -2011,10 +1756,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -2043,10 +1784,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -2167,18 +1904,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -2284,14 +2009,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -2346,46 +2063,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -2394,24 +2083,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2577,10 +2274,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -3094,9 +2787,33 @@ Go to application website to obtain it manually.</source>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3276,14 +2993,6 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -3300,6 +3009,10 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3382,6 +3095,28 @@ Go to application website to obtain it manually.</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished">
|
||||||
|
<numerusform></numerusform>
|
||||||
|
<numerusform></numerusform>
|
||||||
|
</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>OwnCloudServiceRoot</name>
|
<name>OwnCloudServiceRoot</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3624,10 +3359,6 @@ Account ID: %1</source>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -3693,11 +3424,6 @@ Unread news: %2</source>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
@ -3707,11 +3433,28 @@ Unread news: %2</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Open new web browser tab.</source>
|
<source>Downloads</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished">
|
||||||
|
<numerusform></numerusform>
|
||||||
|
<numerusform></numerusform>
|
||||||
|
</translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished">
|
||||||
|
<numerusform></numerusform>
|
||||||
|
<numerusform></numerusform>
|
||||||
|
</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source> and </source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3822,215 +3565,4 @@ Last login on: %5</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
||||||
|
@ -1,172 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="en_US" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="en_US" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -278,26 +110,6 @@ Also note that some resources are cached by internal web browser. Thus, after ch
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>DownloadItem</name>
|
<name>DownloadItem</name>
|
||||||
<message>
|
<message>
|
||||||
@ -1051,10 +863,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1289,22 +1097,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1321,14 +1117,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1361,22 +1149,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1393,10 +1169,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1409,18 +1181,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1461,10 +1221,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1850,14 +1606,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -1991,10 +1739,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2023,10 +1767,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2147,18 +1887,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2264,14 +1992,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2326,46 +2046,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2374,24 +2066,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2557,10 +2257,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3074,9 +2770,33 @@ Go to application website to obtain it manually.</source>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3256,14 +2976,6 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3280,6 +2992,10 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3362,6 +3078,25 @@ Go to application website to obtain it manually.</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>OwnCloudServiceRoot</name>
|
<name>OwnCloudServiceRoot</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3592,10 +3327,6 @@ Account ID: %1</source>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3661,11 +3392,6 @@ Unread news: %2</source>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3675,11 +3401,22 @@ Unread news: %2</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Open new web browser tab.</source>
|
<source>Downloads</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source> and </source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3787,215 +3524,4 @@ Last login on: %5</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,172 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="fr_FR" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="fr_FR" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -278,26 +110,6 @@ Also note that some resources are cached by internal web browser. Thus, after ch
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>DownloadItem</name>
|
<name>DownloadItem</name>
|
||||||
<message>
|
<message>
|
||||||
@ -1051,10 +863,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Sélectionner la stratégie des mises à jour automatique pour ce flux. Par défaut, cette stratégie signifie que le flux sera mis à jour par intervalle de temps défini dans les paramètres de l'application.</translation>
|
<translation>Sélectionner la stratégie des mises à jour automatique pour ce flux. Par défaut, cette stratégie signifie que le flux sera mis à jour par intervalle de temps défini dans les paramètres de l'application.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minutes</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Certain flux requière une authentification, incluant les flux GMail. Les schémas d'authentification BASIC, NTLM-2 et DIGEST-MD5 sont supportés.</translation>
|
<translation>Certain flux requière une authentification, incluant les flux GMail. Les schémas d'authentification BASIC, NTLM-2 et DIGEST-MD5 sont supportés.</translation>
|
||||||
@ -1289,22 +1097,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>&Paramètres</translation>
|
<translation>&Paramètres</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>&Onglet courant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Ajouter un onglet</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Messages</translation>
|
<translation>&Messages</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Navigateur web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Changer l'&importance pour les messages sélectionnés</translation>
|
<translation>Changer l'&importance pour les messages sélectionnés</translation>
|
||||||
@ -1321,14 +1117,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Passer en mode plein écran.</translation>
|
<translation>Passer en mode plein écran.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Ajouter un nouvel onglet de navigation web.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Fermer l'onglet de navigation web courant.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Aucune actions disponibles</translation>
|
<translation>Aucune actions disponibles</translation>
|
||||||
@ -1361,22 +1149,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation>&Supprimer les messages sélectionnés</translation>
|
<translation>&Supprimer les messages sélectionnés</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Paramètres</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Cacher ou montrer le menu principal.</translation>
|
<translation>Cacher ou montrer le menu principal.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation>&Fermer tout les onglets sauf le courant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation>&Fermer l'onglet courant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation>Marquer les messages &sélectionnés comme &lus</translation>
|
<translation>Marquer les messages &sélectionnés comme &lus</translation>
|
||||||
@ -1393,10 +1169,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation>Ouvrir les messages sélectionnés dans le navigateur &interne</translation>
|
<translation>Ouvrir les messages sélectionnés dans le navigateur &interne</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation>Ouvrir les sources de l'article sélectionnées dans le navigateur &interne</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation>Sélectionner le message &suivant</translation>
|
<translation>Sélectionner le message &suivant</translation>
|
||||||
@ -1409,18 +1181,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation>Vérifier pour &mise à jour</translation>
|
<translation>Vérifier pour &mise à jour</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>Activer &JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation>Activer les &plugins externes</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation>Chargement automatique des &images</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Montrer/cacher</translation>
|
<translation>Montrer/cacher</translation>
|
||||||
@ -1461,10 +1221,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1850,14 +1606,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation>Ouvrir de nouveaux onglets avec le double clic gauche de la souris sur la barre des onglets</translation>
|
<translation>Ouvrir de nouveaux onglets avec le double clic gauche de la souris sur la barre des onglets</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Activer les gestes de la souris</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation>Mettre les nouveaux onglets (avec les hyperliens) après l'onglet actif</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -2003,10 +1751,6 @@ Les auteurs de cette application NE sont PAS responsable de la perte de données
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation>base de données en mémoire changée</translation>
|
<translation>base de données en mémoire changée</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Navigateur web interne</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Navigateur web externe</translation>
|
<translation>Navigateur web externe</translation>
|
||||||
@ -2035,10 +1779,6 @@ Les auteurs de cette application NE sont PAS responsable de la perte de données
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Mettre les flux à jour automatiquement tout les</translation>
|
<translation>Mettre les flux à jour automatiquement tout les</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minutes</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Délai expiré pour les flux</translation>
|
<translation>Délai expiré pour les flux</translation>
|
||||||
@ -2159,18 +1899,6 @@ Les auteurs de cette application NE sont PAS responsable de la perte de données
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Lancer &1 au démarrage du système</translation>
|
<translation>Lancer &1 au démarrage du système</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Activer JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation>Activer les plugins externes basés sur NPAPI</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation>Chargement automatique des images</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation><html><head/><body><p>Si décoché, alors le navigateur internet du système par défaut est utilisé.</p></body></html></translation>
|
<translation><html><head/><body><p>Si décoché, alors le navigateur internet du système par défaut est utilisé.</p></body></html></translation>
|
||||||
@ -2276,14 +2004,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2338,46 +2058,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2386,24 +2078,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2569,10 +2269,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Sélectionner la stratégie des mises à jour automatique pour ce flux. Par défaut, cette stratégie signifie que le flux sera mis à jour par intervalle de temps défini dans les paramètres de l'application.</translation>
|
<translation>Sélectionner la stratégie des mises à jour automatique pour ce flux. Par défaut, cette stratégie signifie que le flux sera mis à jour par intervalle de temps défini dans les paramètres de l'application.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minutes</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Titre</translation>
|
<translation>Titre</translation>
|
||||||
@ -3090,10 +2786,34 @@ Aller sur le site de l'application pour les obtenir manuellement.</translat
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>L'adresse du site web pointe ici</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3272,14 +2992,6 @@ Aller sur le site de l'application pour les obtenir manuellement.</translat
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Menu contextuel pour les messages</translation>
|
<translation>Menu contextuel pour les messages</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Message sans URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>Le message '&s' ne contient pas d'URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>Problème avec le démarrage du navigateur internet externe</translation>
|
<translation>Problème avec le démarrage du navigateur internet externe</translation>
|
||||||
@ -3296,6 +3008,10 @@ Aller sur le site de l'application pour les obtenir manuellement.</translat
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Vue journal</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3378,6 +3094,25 @@ Aller sur le site de l'application pour les obtenir manuellement.</translat
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>OwnCloudServiceRoot</name>
|
<name>OwnCloudServiceRoot</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3608,10 +3343,6 @@ Account ID: %1</source>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3677,11 +3408,6 @@ Unread news: %2</source>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Parcourir vos flux et messages</translation>
|
<translation>Parcourir vos flux et messages</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Navigateur web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3691,11 +3417,22 @@ Unread news: %2</source>
|
|||||||
<translation>Menu principal</translation>
|
<translation>Menu principal</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Open new web browser tab.</source>
|
<source>Downloads</source>
|
||||||
<translation>Ouvrir un nouvel onglet de navigation web.</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source> and </source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3803,215 +3540,4 @@ Last login on: %5</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Panneau de navigation</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Retour</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Suivant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Recharger</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Stop</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Pas de titre</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Diminuer le zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Remettre le zoom par défaut.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Augmenter le zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Écrit par</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Vue journal</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Revenir en arrière.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Avancer.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Recharger la page courante</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Arrêter le chargement de la page</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Recharger la page web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>Copier le l'URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Copier l'image</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Copier l'URL de l'image</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Ouvrir dans un nouvel onglet</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Suivre le lien</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Ouvrir l'image dans un nouvel onglet</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Navigateur web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Image</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Hyperlien</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Recharger la page courante</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Copier la sélection</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation>Copier la sélection courante dans le presse-papier.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation>Copier l'URL dans le presse-papier.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation>Copier l'image dans le presse-papier.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation>Copier l'URL de l'image dans le presse-papier.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation>Ouvrir l'hyperlien dans un nouvel onglet.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation>Ouvrir l'hyperlien dans l'onglet.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Ouvrir l'image dans l'onglet.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,172 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="it_IT" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="it_IT" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Aggiungi sottoscrizione</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation>Un altra sottoscrizione</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation>Il titolo inserito è ok.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation>Titolo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation>Indirizzo</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation>Regole personalizzate</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation>Impostazioni Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation>Abilita Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation>Opzioni</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Aggiungi regola</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Rimuovi regola</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Aggiungi sottoscrizione</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation>Rimuovi sottoscrizione</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation>Aggiorna sottoscrizioni</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation>Disabilita solo su questa pagina</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation>Nessun contenuto bloccato</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Aggiungi regolaAggiungi regola</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Rimuovi regola</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -278,26 +110,6 @@ Also note that some resources are cached by internal web browser. Thus, after ch
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>DownloadItem</name>
|
<name>DownloadItem</name>
|
||||||
<message>
|
<message>
|
||||||
@ -1051,10 +863,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minuti</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1289,22 +1097,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>&Impostazioni</translation>
|
<translation>&Impostazioni</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>&Tab corrente</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Aggiungi tab</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Messaggi</translation>
|
<translation>&Messaggi</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Web browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1321,14 +1117,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Passa alla modalità schermo intero.</translation>
|
<translation>Passa alla modalità schermo intero.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Aggiungi nuovo web browser tab.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Chiudi tab web browser corrente.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Nessuna azione disponibile</translation>
|
<translation>Nessuna azione disponibile</translation>
|
||||||
@ -1361,22 +1149,10 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation>&Elimina i messaggi selezionati</translation>
|
<translation>&Elimina i messaggi selezionati</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Impostazioni</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Nascondi o visualizza il menu principale.</translation>
|
<translation>Nascondi o visualizza il menu principale.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation>&Chiudi tab corrente</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1393,10 +1169,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1409,18 +1181,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>Abilita &JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation>Abilita &plugin esterni</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation>Auto-carica &immagini</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Mostra/nascondi</translation>
|
<translation>Mostra/nascondi</translation>
|
||||||
@ -1461,10 +1221,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -1850,14 +1606,6 @@ or this functionality is not implemented yet.</source>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Abilità gesture con il mouse</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -1993,10 +1741,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Web browser interno</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Web browser esterno</translation>
|
<translation>Web browser esterno</translation>
|
||||||
@ -2025,10 +1769,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Auto-aggiorna tutti i feed ogni</translation>
|
<translation>Auto-aggiorna tutti i feed ogni</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minuti</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Timeout connessione feed</translation>
|
<translation>Timeout connessione feed</translation>
|
||||||
@ -2149,18 +1889,6 @@ Authors of this application are NOT responsible for lost data.</source>
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Lancia %1 all'avvio del sistema operativo</translation>
|
<translation>Lancia %1 all'avvio del sistema operativo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Abilita JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation>Abilita plugin esterni basati su NPAPI</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation>carica automaticamente immagini</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2266,14 +1994,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2328,46 +2048,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -2376,24 +2068,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2559,10 +2259,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minuti</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Titolo</translation>
|
<translation>Titolo</translation>
|
||||||
@ -3079,10 +2775,34 @@ Go to application website to obtain it manually.</source>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>L'indirizzo del sito web va qui</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3261,14 +2981,6 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Menu contestuale per i messaggi</translation>
|
<translation>Menu contestuale per i messaggi</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Messaggio senza URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>Il messaggio '%s' non contiene URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>Problema con l'avvio del web browser esterno</translation>
|
<translation>Problema con l'avvio del web browser esterno</translation>
|
||||||
@ -3285,6 +2997,10 @@ Go to application website to obtain it manually.</source>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Modalità giornale</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3367,6 +3083,25 @@ Go to application website to obtain it manually.</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>OwnCloudServiceRoot</name>
|
<name>OwnCloudServiceRoot</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3597,10 +3332,6 @@ Account ID: %1</source>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
@ -3666,11 +3397,6 @@ Unread news: %2</source>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Sfoglia i tuoi feed e i messaggi</translation>
|
<translation>Sfoglia i tuoi feed e i messaggi</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Web browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation>Visualizza menu principale</translation>
|
<translation>Visualizza menu principale</translation>
|
||||||
@ -3680,11 +3406,22 @@ Unread news: %2</source>
|
|||||||
<translation>Menu principale</translation>
|
<translation>Menu principale</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Open new web browser tab.</source>
|
<source>Downloads</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source> and </source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3792,215 +3529,4 @@ Last login on: %5</source>
|
|||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Pannello di navigazione</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Indietro</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Avanti</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Ricarica</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Ferma</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Nessun titolo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Diminuisci zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Reimposta zoom a default.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Aumenta zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Scritto da</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Modalità giornale</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Torna indietro.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Vai avanti.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Ricarica pagina web corrente.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Ferma caricamento pagina web.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Ricarica pagina web.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>Copia url link</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Copia immagine</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Copia url immagine</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Apri link in un nuovo tab</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Segui link</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Apri immagine in un nuovo tab</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Web browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Immagine</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Hyperlink</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Ricarica pagina web corrente.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Copia seleziona</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation>Apri questo hyperlink in un nuovo tab.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation>Apri l'hyperlink in questo tab.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Apri questa immagine in questo tab.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,174 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="nl_NL" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="nl_NL" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Voeg subscriptie toe</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation>Een andere subscriptie</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation>Ingevoerde titel is oke.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation>Ingevoerde titel is leeg.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation>Ingevoerde url is oke.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation>Ingevoerde url is leeg.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation>Titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation>Adres</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation>Aangepaste regels</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation>Adblock instellingen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation>Schakel Adblock in</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation>Merk op dat Adblock deze applicatie aanzienlijk kan vertragen als je eenmaal enorme subscripties activeert. Te veel regels zijn niet goed voor de prestaties. Zorg er ook voor dat je de toepassing opnieuw opstart nadat u Adblock heeft uitgeschakeld als u laag geheugen footprint wilt te hebben. Van Adblock is bekend dat het veel systeemgeheugen gebruikt.
|
|
||||||
|
|
||||||
Merk ook op dat sommige hulpbronnen worden gecached door de interne web browser. Zo, na het veranderen van een aantal regels of abonnementen zullen ze volledig gelden alleen voor nieuwe applicatie instances. Voor de beste Adblock ervaring moet je RSSguard herstarten.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation>Opties</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation>Filter regels</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation>Gebruik alleen essentieel onderdelen van EasyList (voor prestaties redenen)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Een regel toevoegen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Een regel verwijderen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Voeg subscriptie toe</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation>Verwijder subscriptie</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation>Update subscriptie</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation>De regels gids</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation>Toon Adblock &instellingen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation>Schakel %1 uit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation>Schakel het alleen op deze pagina uit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation>Geblokkeerde pop-upvensters</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation>%1 met (%2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation>Geen inhoud geblokkeerd</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation>Bepaalde inhoud geblokkeerd - klik om de regel te bewerken</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation>Adblock - Staat aan en werkt</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation>Adblock - werkt niet</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation>Kan supscriptie niet laden!</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation>Schrijf aub je regels hier</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation>%1 (onlangs bijgewerkt)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation>%1 (fout: %2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Een regel toevoegen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Een regel verwijderen</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -274,33 +104,11 @@ Gelezen berichten gewist...</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>MySQL database not available</source>
|
<source>MySQL database not available</source>
|
||||||
<translation type="unfinished"/>
|
<translation>MySQL database is niet beschikbaar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 kan geen gebruik maken van MySQL opslag, het is niet beschikbaar. %1 switch nu over naar de SQLite database. Start je MySQL server en maak aanpassingen in de programma-instellingen.</translation>
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation>Deze website bevat geen feeds.</translation>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation><numerusform>Klik hier om feeds van deze website toe tevoegen.
|
|
||||||
Deze website bevat %n feed.</numerusform><numerusform>Klik hier om feeds van deze website toe tevoegen.
|
|
||||||
Deze website bevat %n feeds.</numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation>Niet ondersteund</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation>Dit account ondersteunt geen toevoeging van feeds.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1058,10 +866,6 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Selekteer de automatische bijwerk strategie voor deze feed.Standaard automatische bijwerken strategie betekent dat de feed zal worden bijgewerkt in tijd tussenpauzes ingesteld in RSSguard instelling.</translation>
|
<translation>Selekteer de automatische bijwerk strategie voor deze feed.Standaard automatische bijwerken strategie betekent dat de feed zal worden bijgewerkt in tijd tussenpauzes ingesteld in RSSguard instelling.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minuten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Sommige feeds vereisen verificatie,inclusief GMail feeds, BASIC, NTLM-2 en DIGEST-MD5 verificaties schema's worden ondersteund.</translation>
|
<translation>Sommige feeds vereisen verificatie,inclusief GMail feeds, BASIC, NTLM-2 en DIGEST-MD5 verificaties schema's worden ondersteund.</translation>
|
||||||
@ -1296,22 +1100,10 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>&Instellingen</translation>
|
<translation>&Instellingen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>&Huidig tabblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Tabblad toevoegen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Berichten</translation>
|
<translation>&Berichten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Webbrowser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Wissel het &belang van geselecteerde berichten</translation>
|
<translation>Wissel het &belang van geselecteerde berichten</translation>
|
||||||
@ -1328,14 +1120,6 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Schakel beeldvullende modus.</translation>
|
<translation>Schakel beeldvullende modus.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Voeg nieuw webbrowser tabblad toe.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Sluit huidige webbrowser tabblad.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Geen acties beschikbaar</translation>
|
<translation>Geen acties beschikbaar</translation>
|
||||||
@ -1368,22 +1152,10 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation>Verwij&der geselecteerde berichten</translation>
|
<translation>Verwij&der geselecteerde berichten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Instellingen</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Verberg of toon het hoofdmenu.</translation>
|
<translation>Verberg of toon het hoofdmenu.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation>&Sluit alle tabbladen behalve deze</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation>&Sluit huidig tabblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation>Markeer ge&selecteerde berichten als &gelezen</translation>
|
<translation>Markeer ge&selecteerde berichten als &gelezen</translation>
|
||||||
@ -1400,10 +1172,6 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation>Open geselecteerde berichten met &ingebouwde webbrowser</translation>
|
<translation>Open geselecteerde berichten met &ingebouwde webbrowser</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation>Open geselecteerde bron artikelen met &ingebouwde webbrowser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation>Selecteer volge&nd bericht</translation>
|
<translation>Selecteer volge&nd bericht</translation>
|
||||||
@ -1416,18 +1184,6 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation>Controleer op &updates</translation>
|
<translation>Controleer op &updates</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>&Javascript aanzetten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation>Externe &plugins aanzetten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation>Automatisch afbeeld&ingen laden</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Toon/verberg</translation>
|
<translation>Toon/verberg</translation>
|
||||||
@ -1468,10 +1224,6 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation>&Feed/bericht kopteksten</translation>
|
<translation>&Feed/bericht kopteksten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation>Sluit alle tabbladen behalve deze.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation>Rapporteer een &bug (Github)...</translation>
|
<translation>Rapporteer een &bug (Github)...</translation>
|
||||||
@ -1857,14 +1609,6 @@ of deze functie bestaat nog niet.</translation>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation>Open nieuwe tabbladen met linker muisknop dubbel-klik op tabblad</translation>
|
<translation>Open nieuwe tabbladen met linker muisknop dubbel-klik op tabblad</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Muisbewegingen aanzetten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation>Wachtrij nieuwe tabbladen (met koppelingen) na de actieve tabblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -2011,10 +1755,6 @@ Auteurs van Rssguard zijn NIET verantwoordelijk voor verlies van gegevens.</tran
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation>in-geheugen database overgeschakeld</translation>
|
<translation>in-geheugen database overgeschakeld</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Interne webbrowser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Externe webbrowser</translation>
|
<translation>Externe webbrowser</translation>
|
||||||
@ -2043,10 +1783,6 @@ Auteurs van Rssguard zijn NIET verantwoordelijk voor verlies van gegevens.</tran
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Alle feeds automatisch bijwerken elke</translation>
|
<translation>Alle feeds automatisch bijwerken elke</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minuten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Feed verbindings time-out</translation>
|
<translation>Feed verbindings time-out</translation>
|
||||||
@ -2167,18 +1903,6 @@ Auteurs van Rssguard zijn NIET verantwoordelijk voor verlies van gegevens.</tran
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Laad %1 als systeem opstart</translation>
|
<translation>Laad %1 als systeem opstart</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Javascript aanzetten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation>Externe plugins gebaseerd op NPAPI aanzetten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation>Automatisch afbeeldingen laden</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation><html><head/><body><p>Indien aangevinkt, wordt standaard de systeem webbrowser gebruikt.</p></body></html></translation>
|
<translation><html><head/><body><p>Indien aangevinkt, wordt standaard de systeem webbrowser gebruikt.</p></body></html></translation>
|
||||||
@ -2286,22 +2010,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation>Werkende database</translation>
|
<translation>Werkende database</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation>Muisbeweging werkt met middelste muisknop. Mogelijke muisbewegingen zijn:
|
|
||||||
|
|
||||||
. vorige webpagina (sleep muis links),
|
|
||||||
|
|
||||||
.volgende webpagina(sleep muis rechts),
|
|
||||||
|
|
||||||
.herlaad huidige webpagina(sleep muis omhoog),
|
|
||||||
|
|
||||||
Open nieuw webbrowser pagina(sleep muis omlaag).</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation>Gebruik aangepaste externe webbrowser</translation>
|
<translation>Gebruik aangepaste externe webbrowser</translation>
|
||||||
@ -2358,46 +2066,18 @@ Open nieuw webbrowser pagina(sleep muis omlaag).</translation>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation>Werkende database is ok.</translation>
|
<translation>Werkende database is ok.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation>Melding maken van</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation>(Pictogram in systeemvak is niet beschikbaar.)</translation>
|
<translation>(Pictogram in systeemvak is niet beschikbaar.)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation>Linkerbenedenhoek</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation>Linkerbovenenhoek</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation>Rechterbenedenhoek</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation>Rechterbovenhoek</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation>Intern bericht browser lettertypen</translation>
|
<translation>Intern bericht browser lettertypen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation>Standaard lettertype</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation>Merk op dat de snelheid van de gebruikte MySQL server en wachttijd van de gebruikte verbinding ZWAAR invloed heeft op de uiteindelijke prestaties van deze toepassing. Met langzame database connecties leidt dit tot slechte prestaties tijdens het browsen feeds of berichten.</translation>
|
<translation>Merk op dat de snelheid van de gebruikte MySQL server en wachttijd van de gebruikte verbinding ZWAAR invloed heeft op de uiteindelijke prestaties van deze toepassing. Met langzame database connecties leidt dit tot slechte prestaties tijdens het browsen feeds of berichten.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation>Fancy && moderne popup meldingen (Dit gebruikt OS natieve meldingen via D-Bus indien beschikbaar.)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation>E-mail</translation>
|
<translation>E-mail</translation>
|
||||||
@ -2406,24 +2086,32 @@ Open nieuw webbrowser pagina(sleep muis omlaag).</translation>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation>Meldingen aanzetten</translation>
|
<translation>Meldingen aanzetten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation>Achtergrondkleur</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation>Verander</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation>Open de download manager wanneer een nieuwe download start</translation>
|
<translation>Open de download manager wanneer een nieuwe download start</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
|
<translation>Statusbalk</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enable D-Bus notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2589,10 +2277,6 @@ Open nieuw webbrowser pagina(sleep muis omlaag).</translation>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Selekteer de automatische bijwerk strategie voor deze feed.Standaard automatische bijwerken strategie betekent dat de feed zal worden bijgewerkt in tijd tussenpauzes ingesteld in RSSguard instelling.</translation>
|
<translation>Selekteer de automatische bijwerk strategie voor deze feed.Standaard automatische bijwerken strategie betekent dat de feed zal worden bijgewerkt in tijd tussenpauzes ingesteld in RSSguard instelling.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minuten</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Titel</translation>
|
<translation>Titel</translation>
|
||||||
@ -3110,10 +2794,34 @@ Ga naar RRSguard website en download het handmatig.</translation>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>Tik Website adres hier</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3292,14 +3000,6 @@ Ga naar RRSguard website en download het handmatig.</translation>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Contextmenu voor berichten</translation>
|
<translation>Contextmenu voor berichten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Berischt zonder URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>Bericht '%s' bevat geen geldige URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>Probleem om externe webbrowser te starten</translation>
|
<translation>Probleem om externe webbrowser te starten</translation>
|
||||||
@ -3316,6 +3016,10 @@ Ga naar RRSguard website en download het handmatig.</translation>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation>Externe e-mail client kon niet worden gestart.</translation>
|
<translation>Externe e-mail client kon niet worden gestart.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Krantweergave</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3395,6 +3099,25 @@ Ga naar RRSguard website en download het handmatig.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<source>unknown content</source>
|
<source>unknown content</source>
|
||||||
<extracomment>Network status.</extracomment>
|
<extracomment>Network status.</extracomment>
|
||||||
|
<translation>onbekende inhoud</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3648,25 +3371,21 @@ Account ID: %1</translation>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Feed update progresbalk</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update label</source>
|
<source>Feed update label</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Feed update label</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File download progress bar</source>
|
<source>File download progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Bestandsdownload progresbar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File download label</source>
|
<source>File download label</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Bestandsdownload label</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Toolbar spacer</source>
|
<source>Toolbar spacer</source>
|
||||||
@ -3719,11 +3438,6 @@ Ongelezen nieuws: %2</translation>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Blader door feeds en berichten</translation>
|
<translation>Blader door feeds en berichten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Webbrowser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation>Toont het hoofdmenu.</translation>
|
<translation>Toont het hoofdmenu.</translation>
|
||||||
@ -3732,15 +3446,26 @@ Ongelezen nieuws: %2</translation>
|
|||||||
<source>Main menu</source>
|
<source>Main menu</source>
|
||||||
<translation>Hoofdmenu</translation>
|
<translation>Hoofdmenu</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open new web browser tab.</source>
|
|
||||||
<translation>Open een nieuw webbrowser tabblad.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source>Downloads</source>
|
||||||
<translation>Downloads</translation>
|
<translation>Downloads</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> and </source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ToolBarEditor</name>
|
<name>ToolBarEditor</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3853,215 +3578,4 @@ Laatste login: %5</translation>
|
|||||||
<translation>Kan geen feed toevoegen omdat een andere kritieke operatie aan de gang is.</translation>
|
<translation>Kan geen feed toevoegen omdat een andere kritieke operatie aan de gang is.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Navigatie venster</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Terug</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Vooruit</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Herlaad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Stop</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Geen titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Zoom verlagen.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Reset zoom naar standaard.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Zoom verhogen.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Geschreven door </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Krantweergave</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Ga terug.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Ga vooruit.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Vernieuw huidige webpagina.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Stop het laden van pagina.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Herlaad webpagina</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>URL kopiëren</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Kopiëer afbeelding</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>URL afbeelding kopiëren</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Open link in nieuw tabblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Volg koppeling</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Open afbeelding in nieuw tabblad</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Webbrowser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Afbeelding</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Koppeling</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Vernieuw huidige webpagina.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Selectie kopiëren</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation>Kopiëer huidige selectie naar het klembord.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation>Kopiëer link url naar klembord.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation>Kopiëer afbeelding naar klembord.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation>Kopiëer afbeeldings url naar klembord.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation>Open deze link in nieuw tabblad.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation>Open link in dit tabblad.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Open deze afbeelding in dit tabblad.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation>Open koppeling in externe browser</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation>Open de hyperlink in externe browser.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation>Print</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation>Print huidige webpagina.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation>HTML web paginas (*.html)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation>Kies bestemming bestand voor de web pagina</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation>Kan webpagina niet opslaan</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation>Kan webpagina niet opslaan omdat bestand niet beschrijfbaar is.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation>Doel opslaan als...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation>Download inhoud van de koppeling.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation>Pagina opslaan als...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation>Afbeelding opslaan op schijf.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation>Afbeelding opslaan als...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation>Bron_pagina</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation>Zoek "%1" met google...</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,174 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_BR" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="pt_BR" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Adicionar assinatura</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation>Outra assinatura</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation>O título escolhido está correto.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation>O título escolhido está vazio.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation>A URL fornecida está correta.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation>A URL fornecida está vazia.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation>Título</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation>Endereço</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation>Regras personalizadas</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation>Configurações do Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation>Ativar o Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation>Note que o Adblock pode deixar o aplicativo um pouco lento caso você tenha muitas inscrições. Muitas regras não são boas para o desempenho. Também, certifique-se de reiniciar o aplicativo após desativar o Adblock para reduzir o uso de memória. O Adblock é conhecido por usar muita memória do sistema.
|
|
||||||
|
|
||||||
Note também que alguns recursos são armazenados pelo navegador interno. Sendo assim, após alterar algumas regras ou inscrições, elas serão totalmente aplicadas somente para novas instâncias do aplicativo. Certifique-se de reiniciar o RSS Guard para uma melhor experiência com o Adblock.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation>Opções</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation>Regras do filtro</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation>Usar somente parte essencial do Easylist (para melhor desempenho)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Adicionar regra</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Remover regra</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Adicionar inscrição</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation>Remover inscrição</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation>Atualizar inscrições</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation>Guia de criação de regras</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation>Exibir configuraçõe&s do Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation>Desativar em %1</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation>Desativar somente nesta página</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation>Janelas popup bloqueadas</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation>%1 com (%2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation>Nenhum conteúdo bloqueado</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation>Algum conteúdo bloqueado - clique para editar regra</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation>Adblock - ativo e em execução</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation>Adblock - não está em execução</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation>Não foi possível carregar a inscrição!</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation>Por favor, digite sua regra aqui</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation>%1 (atualizado recentemente)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation>%1 (erro: %2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Adicionar regra</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Remover regra</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -273,33 +103,11 @@ Note também que alguns recursos são armazenados pelo navegador interno. Sendo
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>MySQL database not available</source>
|
<source>MySQL database not available</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Banco da dados MySQL não disponível</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>O %1 não pode usar o armazenamento MySQL, ele não está disponível. O %1 irá alterar para o banco de dados SQLite. Inicie seu servidor MySQL e faça os ajustes nas configurações do aplicativo.</translation>
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation>Este site não contém nenhum feed.</translation>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation><numerusform>Clique para adicionar deste site.
|
|
||||||
Este site contém %n feed.</numerusform><numerusform>Clique para adicionar deste site.
|
|
||||||
Este site contêm %n feeds.</numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation>Não suportado</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation>A conta fornecida não suporta adicionar feeds.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1057,10 +865,6 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Selecione a estratégia de atualização automática para este feed. A estratégia padrão significa que o feed será atualizado em intervalos de tempo definidos nas configurações do aplicativo.</translation>
|
<translation>Selecione a estratégia de atualização automática para este feed. A estratégia padrão significa que o feed será atualizado em intervalos de tempo definidos nas configurações do aplicativo.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minutos</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Alguns feeds necessitam de autenticação, incluindo feeds do GMail. Esquemas de autenticação BASIC, NTLM-2 e DIGEST-MD5 são suportados.</translation>
|
<translation>Alguns feeds necessitam de autenticação, incluindo feeds do GMail. Esquemas de autenticação BASIC, NTLM-2 e DIGEST-MD5 são suportados.</translation>
|
||||||
@ -1295,22 +1099,10 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>&Configurações</translation>
|
<translation>&Configurações</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>A&ba atual</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Adicionar aba</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Mensagens</translation>
|
<translation>&Mensagens</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>Navegador da &Web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Alterar &importância das mensagens selecionadas</translation>
|
<translation>Alterar &importância das mensagens selecionadas</translation>
|
||||||
@ -1327,14 +1119,6 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Altera para o modo tela cheia.</translation>
|
<translation>Altera para o modo tela cheia.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Adiciona uma nova aba ao navegador.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Fecha a aba atual do navegador.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Nenhuma ação disponível</translation>
|
<translation>Nenhuma ação disponível</translation>
|
||||||
@ -1367,22 +1151,10 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation>&Excluir mensagens selecionadas</translation>
|
<translation>&Excluir mensagens selecionadas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Configurações</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Oculta ou exibe o menu principal.</translation>
|
<translation>Oculta ou exibe o menu principal.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation>&Fechar todas as abas, exceto a atual</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation>&Fechar aba atual</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation>Marcar mensagens selecionadas como &lidas</translation>
|
<translation>Marcar mensagens selecionadas como &lidas</translation>
|
||||||
@ -1399,10 +1171,6 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation>Abrir mensagens selecionadas no navegador &interno</translation>
|
<translation>Abrir mensagens selecionadas no navegador &interno</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation>Abrir artigos fonte selecionados no navegador &interno</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation>Selecionar &próxima mensagem</translation>
|
<translation>Selecionar &próxima mensagem</translation>
|
||||||
@ -1415,18 +1183,6 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation>Verificar por at&ualizações</translation>
|
<translation>Verificar por at&ualizações</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>Ativar &JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation>Ativar &plugins externos</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation>Carregar &imagens automaticamente</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Exibir/ocultar</translation>
|
<translation>Exibir/ocultar</translation>
|
||||||
@ -1467,10 +1223,6 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation>Cabeçalhos da lista de &feeds/mensagens</translation>
|
<translation>Cabeçalhos da lista de &feeds/mensagens</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation>Fecha todas as abas, exceto a atual.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation>Relatar um &bug (GitHub)...</translation>
|
<translation>Relatar um &bug (GitHub)...</translation>
|
||||||
@ -1856,14 +1608,6 @@ ou esta função ainda não foi implementada.</translation>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation>Abrir novas abas como clique duplo do botão esquerdo do mouse na barra de abas</translation>
|
<translation>Abrir novas abas como clique duplo do botão esquerdo do mouse na barra de abas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Ativar gestos do mouse</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation>Adicionar novas abas (com links) após a aba ativa</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -2009,10 +1753,6 @@ Os autores deste aplicativo NÃO são responsáveis pela perda de dados.</transl
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation>banco de dados na memória alterado</translation>
|
<translation>banco de dados na memória alterado</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Navegador da web interno</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Navegador da web externo</translation>
|
<translation>Navegador da web externo</translation>
|
||||||
@ -2041,10 +1781,6 @@ Os autores deste aplicativo NÃO são responsáveis pela perda de dados.</transl
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Atualizar todos os feeds a cada</translation>
|
<translation>Atualizar todos os feeds a cada</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minutos</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Tempo limite de conexão</translation>
|
<translation>Tempo limite de conexão</translation>
|
||||||
@ -2165,18 +1901,6 @@ Os autores deste aplicativo NÃO são responsáveis pela perda de dados.</transl
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Executar o %1 na inicialização do sistema operacional</translation>
|
<translation>Executar o %1 na inicialização do sistema operacional</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Ativar JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation>Ativar plugins externos baseados em NPAPI</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation>Carregar imagens automaticamente</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation><html><head/><body><p>Se desmarcado, então o navegador padrão do sistema será usado.</p></body></html></translation>
|
<translation><html><head/><body><p>Se desmarcado, então o navegador padrão do sistema será usado.</p></body></html></translation>
|
||||||
@ -2284,18 +2008,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation>Banco de dados ativo</translation>
|
<translation>Banco de dados ativo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation>Os gestos do mouse funcionam o o botão do meio. Os gestos possíveis são:
|
|
||||||
• página anterior (arraste o mouse para a esquerda),
|
|
||||||
• próxima página (arraste o mouse para a direita),
|
|
||||||
• recarregar página atual (arraste o mouse para cima),
|
|
||||||
• abrir nova aba no navegador (arraste o mouse para baixo).</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation>Usar navegador externo personalizado</translation>
|
<translation>Usar navegador externo personalizado</translation>
|
||||||
@ -2352,46 +2064,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation>O banco de dados ativo está correto.</translation>
|
<translation>O banco de dados ativo está correto.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation>Posição da notificação</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation>(Ícone na área de notificação não está disponível.)</translation>
|
<translation>(Ícone na área de notificação não está disponível.)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation>Canto inferior esquerdo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation>Canto superior esquerdo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation>Canto inferior direito</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation>Canto superior direito</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation>Fontes do navegador de mensagens interno</translation>
|
<translation>Fontes do navegador de mensagens interno</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation>Fonte padrão</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation>Note que a velocidade do servidor MySQL usado e a latência da conexão influenciam FORTEMENTE no desempenho final deste aplicativo. Usar conexões lentas ao banco de dados ocasionam um desempenho ruim ao navegar por feeds ou mensagens.</translation>
|
<translation>Note que a velocidade do servidor MySQL usado e a latência da conexão influenciam FORTEMENTE no desempenho final deste aplicativo. Usar conexões lentas ao banco de dados ocasionam um desempenho ruim ao navegar por feeds ou mensagens.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation>Notificações popup modernas (Isto usa as notificações nativas do sistema via D-Bus, se disponível.)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation>E-mail</translation>
|
<translation>E-mail</translation>
|
||||||
@ -2400,24 +2084,32 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation>Ativar notificações</translation>
|
<translation>Ativar notificações</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation>Cor de fundo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation>Alterar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation>Abrir gerenciador de download ao iniciar um novo download</translation>
|
<translation>Abrir gerenciador de download ao iniciar um novo download</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
|
<translation>Barra de status</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enable D-Bus notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>&Change font</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -2583,10 +2275,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Selecione a estratégia de atualização automática para este feed. A estratégia padrão significa que o feed será atualizado em intervalos de tempo definidos nas configurações do aplicativo.</translation>
|
<translation>Selecione a estratégia de atualização automática para este feed. A estratégia padrão significa que o feed será atualizado em intervalos de tempo definidos nas configurações do aplicativo.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation> minutos</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Título</translation>
|
<translation>Título</translation>
|
||||||
@ -3104,10 +2792,34 @@ Vá até o site do aplicativo para obter manualmente.</translation>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>O endereço do site vai aqui</translation>
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3286,14 +2998,6 @@ Vá até o site do aplicativo para obter manualmente.</translation>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Menu de contexto para mensagens</translation>
|
<translation>Menu de contexto para mensagens</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Mensagem sem URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>A mensagem '%s' não possui URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>Problema ao iniciar o navegador externo</translation>
|
<translation>Problema ao iniciar o navegador externo</translation>
|
||||||
@ -3310,6 +3014,10 @@ Vá até o site do aplicativo para obter manualmente.</translation>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation>O cliente de e-mail externo não pôde ser iniciado.</translation>
|
<translation>O cliente de e-mail externo não pôde ser iniciado.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Visualização da publicação</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3389,6 +3097,25 @@ Vá até o site do aplicativo para obter manualmente.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<source>unknown content</source>
|
<source>unknown content</source>
|
||||||
<extracomment>Network status.</extracomment>
|
<extracomment>Network status.</extracomment>
|
||||||
|
<translation>conteúdo desconhecido</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
@ -3642,25 +3369,21 @@ ID da Conta: %1</translation>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Barra de progresso de atualização de feeds</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update label</source>
|
<source>Feed update label</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Rótulo da atualização de feeds</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File download progress bar</source>
|
<source>File download progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Barra de progresso do download de arquivos</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File download label</source>
|
<source>File download label</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Rótulo do download de arquivos</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Toolbar spacer</source>
|
<source>Toolbar spacer</source>
|
||||||
@ -3712,11 +3435,6 @@ Notícias não lidas: %2</translation>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Navegue pelo seus feeds e mensagens</translation>
|
<translation>Navegue pelo seus feeds e mensagens</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Navegador da web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation>Exibe o menu principal.</translation>
|
<translation>Exibe o menu principal.</translation>
|
||||||
@ -3725,15 +3443,26 @@ Notícias não lidas: %2</translation>
|
|||||||
<source>Main menu</source>
|
<source>Main menu</source>
|
||||||
<translation>Menu principal</translation>
|
<translation>Menu principal</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open new web browser tab.</source>
|
|
||||||
<translation>Abre uma nova aba no navegador.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source>Downloads</source>
|
||||||
<translation>Downloads</translation>
|
<translation>Downloads</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> and </source>
|
||||||
|
<translation type="unfinished"/>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ToolBarEditor</name>
|
<name>ToolBarEditor</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3846,215 +3575,4 @@ Servidor: %2
|
|||||||
<translation>Não é possível adicionar feeds porque outra operação crítica está em curso.</translation>
|
<translation>Não é possível adicionar feeds porque outra operação crítica está em curso.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Painel de navegação</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Voltar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Avançar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Recarregar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Parar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Sem título</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Diminui o zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Restaura o zoom para o padrão.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Aumenta o zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Escrito por </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Visualização da publicação</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Volta.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Avança.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Recarrega a página atual.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Interrompe o carregamento da página.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Recarregar página</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>Copiar URL do link</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Copiar imagem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Copiar URL da imagem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Abrir link em uma nova aba</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Seguir link</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Abrir imagem em um nova aba</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Navegador da web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Imagem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Hyperlink</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Recarrega a página atual.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Copiar seleção</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation>Copia a seleção atual para a área de transferência.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation>Copia a URL do link para a área de transferência.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation>Copia a imagem para a área de transferência.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation>Copia a URL da imagem para a área de transferência.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation>Abre este hyperlink em uma nova aba.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation>Abre o hyperlink em uma nova aba.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Abre esta imagem em uma nova aba.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation>Abrir link no navegador externo</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation>Abre o hyperlink no navegador externo.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation>Imprimir</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation>Imprime a página atual.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation>Páginas HTML (*.html)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation>Selecione o arquivo de destino para a página da web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation>Não foi possível salvar a página da web</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation>A página não pôde ser salva pois o arquivo de destino não possui permissão de escrita.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation>Salvar destino como...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation>Baixa o conteúdo do hyperlink.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation>Salvar página como...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation>Salva a imagem em disco.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation>Salvar imagem como...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation>página_de_origem</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation>Pesquisar "%1" no Google...</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1,174 +1,4 @@
|
|||||||
<?xml version="1.0" ?><!DOCTYPE TS><TS language="sv_SE" version="2.1">
|
<?xml version="1.0" ?><!DOCTYPE TS><TS language="sv_SE" version="2.1">
|
||||||
<context>
|
|
||||||
<name>AdBlockAddSubscriptionDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Lägg till prenumeration</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Another subscription</source>
|
|
||||||
<translation>En prenumeration till</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is okay.</source>
|
|
||||||
<translation>Angivet namn är okay.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered title is empty.</source>
|
|
||||||
<translation>Namn saknas.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is okay.</source>
|
|
||||||
<translation>Angiven URL är okay.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Entered url is empty.</source>
|
|
||||||
<translation>URL saknas.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Title</source>
|
|
||||||
<translation>Titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Address</source>
|
|
||||||
<translation>Adress</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockCustomList</name>
|
|
||||||
<message>
|
|
||||||
<source>Custom rules</source>
|
|
||||||
<translation>Anpassade regler</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockDialog</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock settings</source>
|
|
||||||
<translation>Adblock-inställningar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable Adblock</source>
|
|
||||||
<translation>Aktivera Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</source>
|
|
||||||
<translation>Notera att Adblock kan göra programmet märkbart långsammare vid aktivering av stora prenumerationer. För många regler är inte bra för prestanda. Tillse också att programmet startas om efter att Adblock inaktiveras, om du vill minska minnesanvändningen. Adblock är känt för att använda mycket systemminne.
|
|
||||||
|
|
||||||
Notera också att vissa resurser cachelagras av den interna webbläsaren. Om du ändrar några filterregler eller prenumerationer, verkställs ändringarna till fullo, först i nya programinstanser. Starta därför om RSS Guard, för bästa Adblock-upplevelse.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Options</source>
|
|
||||||
<translation>Alternativ</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Filter rules</source>
|
|
||||||
<translation>Filterregler</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Use only essential part of EasyList (for performance reasons)</source>
|
|
||||||
<translation>Använd endast viktiga delar av EasyList (av prestandaskäl)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Lägg till regel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Ta bort regel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add subscription</source>
|
|
||||||
<translation>Lägg till prenumeration</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove subscription</source>
|
|
||||||
<translation>Ta bort prenumeration</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Update subscriptions</source>
|
|
||||||
<translation>Uppdatera prenumerationer</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Rules writing guide</source>
|
|
||||||
<translation>Regelguide</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockIcon</name>
|
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show Adblock &settings</source>
|
|
||||||
<translation>Visa Adblock-&inställningar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable on %1</source>
|
|
||||||
<translation>Inaktivera för %1</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Disable only on this page</source>
|
|
||||||
<translation>Inaktivera endast på denna sida</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked popup windows</source>
|
|
||||||
<translation>Blockerade popup-fönster</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 with (%2)</source>
|
|
||||||
<translation>%1 med (%2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No content blocked</source>
|
|
||||||
<translation>Inget innehåll blockerat</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Blocked some content - click to edit rule</source>
|
|
||||||
<translation>Blockerade visst innehåll - Klicka för att redigera regel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - up and running</source>
|
|
||||||
<translation>Adblock - Aktiverat</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Adblock - not running</source>
|
|
||||||
<translation>Adblock - Inaktiverat</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockSubscription</name>
|
|
||||||
<message>
|
|
||||||
<source>Cannot load subscription!</source>
|
|
||||||
<translation>Kan inte läsa in prenumeration!</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>AdBlockTreeWidget</name>
|
|
||||||
<message>
|
|
||||||
<source>Please write your rule here</source>
|
|
||||||
<translation>Ange din regel här</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (recently updated)</source>
|
|
||||||
<translation>%1 (nyligen uppdaterad)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>%1 (error: %2)</source>
|
|
||||||
<translation>%1 (Fel: %2)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Add rule</source>
|
|
||||||
<translation>Lägg till regel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Remove rule</source>
|
|
||||||
<translation>Ta bort regel</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>Application</name>
|
<name>Application</name>
|
||||||
<message>
|
<message>
|
||||||
@ -273,33 +103,11 @@ Notera också att vissa resurser cachelagras av den interna webbläsaren. Om du
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>MySQL database not available</source>
|
<source>MySQL database not available</source>
|
||||||
<translation type="unfinished"/>
|
<translation>MySQL databas inte tillgänglig</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
<source>%1 cannot use MySQL storage, it is not available. %1 is now switching to SQLite database. Start your MySQL server and make adjustments in application settings.</source>
|
||||||
<translation type="unfinished"/>
|
<translation>%1 kan inte använda MySQL-lagringen, den är inte tillgänglig. %1 växlar nu till SQLite databas. Starta din MySQL-server och justera programinställningarna.</translation>
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>DiscoverFeedsButton</name>
|
|
||||||
<message>
|
|
||||||
<source>This website does not contain any feeds.</source>
|
|
||||||
<translation>Webbsidan innehåller inga flöden.</translation>
|
|
||||||
</message>
|
|
||||||
<message numerus="yes">
|
|
||||||
<source>Click me to add feeds from this website.
|
|
||||||
This website contains %n feed(s).</source>
|
|
||||||
<translation><numerusform>Klicka för att lägga till flöden från webbsidan.
|
|
||||||
Denna webbsida innehåller %n flöde.</numerusform><numerusform>Klicka för att lägga till flöden från webbsidan.
|
|
||||||
Denna webbsida innehåller %n flöden.</numerusform></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Not supported</source>
|
|
||||||
<translation>Stöds ej</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Given account does not support adding feeds.</source>
|
|
||||||
<translation>Angivet kontot stöder inte tillägg av nya flöden.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -1057,10 +865,6 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Välj uppdateringsstrategi för flödet. Standard autouppdatering, innebär att flödet kommer att uppdateras med tidsintervall angivna i programinställningarna.</translation>
|
<translation>Välj uppdateringsstrategi för flödet. Standard autouppdatering, innebär att flödet kommer att uppdateras med tidsintervall angivna i programinställningarna.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minuter </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
<source>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</source>
|
||||||
<translation>Vissa flöden kräver autentisering. Inklusive Gmail-flöden. BASIC, NTLM-2 och DIGEST-MD5 autentiseringsscheman stöds.</translation>
|
<translation>Vissa flöden kräver autentisering. Inklusive Gmail-flöden. BASIC, NTLM-2 och DIGEST-MD5 autentiseringsscheman stöds.</translation>
|
||||||
@ -1295,22 +1099,10 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>&Settings</source>
|
<source>&Settings</source>
|
||||||
<translation>&Inställningar</translation>
|
<translation>&Inställningar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Current tab</source>
|
|
||||||
<translation>Aktuell &flik</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Add tab</source>
|
|
||||||
<translation>&Lägg till flik</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>&Messages</source>
|
<source>&Messages</source>
|
||||||
<translation>&Meddelanden</translation>
|
<translation>&Meddelanden</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Web browser</source>
|
|
||||||
<translation>&Webbläsare</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Switch &importance of selected messages</source>
|
<source>Switch &importance of selected messages</source>
|
||||||
<translation>Växla &prioritet för markerade meddelanden</translation>
|
<translation>Växla &prioritet för markerade meddelanden</translation>
|
||||||
@ -1327,14 +1119,6 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>Switch fullscreen mode.</source>
|
<source>Switch fullscreen mode.</source>
|
||||||
<translation>Växla fönster-/fullskärmsläge.</translation>
|
<translation>Växla fönster-/fullskärmsläge.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Add new web browser tab.</source>
|
|
||||||
<translation>Lägg till ny webbläsarflik.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Close current web browser tab.</source>
|
|
||||||
<translation>Stäng aktuell webbläsarflik.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>No actions available</source>
|
<source>No actions available</source>
|
||||||
<translation>Inga åtgärder tillgängliga</translation>
|
<translation>Inga åtgärder tillgängliga</translation>
|
||||||
@ -1367,22 +1151,10 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>&Delete selected messages</source>
|
<source>&Delete selected messages</source>
|
||||||
<translation>&Ta bort markerade meddelanden</translation>
|
<translation>&Ta bort markerade meddelanden</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Settings</source>
|
|
||||||
<translation>Inställningar</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Hides or displays the main menu.</source>
|
<source>Hides or displays the main menu.</source>
|
||||||
<translation>Dölj/Visa huvudmenyn.</translation>
|
<translation>Dölj/Visa huvudmenyn.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>&Close all tabs except current one</source>
|
|
||||||
<translation>&Stäng alla flikar utom den aktuella</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>&Close current tab</source>
|
|
||||||
<translation>&Stäng aktuell flik</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Mark &selected messages as &read</source>
|
<source>Mark &selected messages as &read</source>
|
||||||
<translation>Märk markerade &meddelanden som &lästa</translation>
|
<translation>Märk markerade &meddelanden som &lästa</translation>
|
||||||
@ -1399,10 +1171,6 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>Open selected messages in &internal browser</source>
|
<source>Open selected messages in &internal browser</source>
|
||||||
<translation>Öppna markerade meddelanden i &intern webbläsare</translation>
|
<translation>Öppna markerade meddelanden i &intern webbläsare</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open selected source articles in &internal browser</source>
|
|
||||||
<translation>Öppna markerade källartiklar i &intern webbläsare</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Select &next message</source>
|
<source>Select &next message</source>
|
||||||
<translation>Gå till &nästa meddelande</translation>
|
<translation>Gå till &nästa meddelande</translation>
|
||||||
@ -1415,18 +1183,6 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>Check for &updates</source>
|
<source>Check for &updates</source>
|
||||||
<translation>Sök efter &uppdateringar</translation>
|
<translation>Sök efter &uppdateringar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable &JavaScript</source>
|
|
||||||
<translation>Aktivera &JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external &plugins</source>
|
|
||||||
<translation>Aktivera externa &tillägg</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load &images</source>
|
|
||||||
<translation>Läs in &bilder automatiskt</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Show/hide</source>
|
<source>Show/hide</source>
|
||||||
<translation>Dölj/Visa</translation>
|
<translation>Dölj/Visa</translation>
|
||||||
@ -1467,10 +1223,6 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>&Feed/message list headers</source>
|
<source>&Feed/message list headers</source>
|
||||||
<translation>&Kolumnrubriker</translation>
|
<translation>&Kolumnrubriker</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Close all tabs except current one.</source>
|
|
||||||
<translation>Stäng alla flikar utom aktuell.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Report a &bug (GitHub)...</source>
|
<source>Report a &bug (GitHub)...</source>
|
||||||
<translation>Rapportera ett &fel (GitHub)...</translation>
|
<translation>Rapportera ett &fel (GitHub)...</translation>
|
||||||
@ -1856,14 +1608,6 @@ att funktionen inte är implementerad än.</translation>
|
|||||||
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
<source>Open new tabs with left mouse button double-click on tab bar</source>
|
||||||
<translation>Öppna nya flikar med dubbelklick i flikfältet</translation>
|
<translation>Öppna nya flikar med dubbelklick i flikfältet</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable mouse gestures</source>
|
|
||||||
<translation>Aktivera musgester</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Queue new tabs (with hyperlinks) after the active tab</source>
|
|
||||||
<translation>Öppna nya flikar (med hyperlänkar) efter aktuell flik</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>no icon theme</source>
|
<source>no icon theme</source>
|
||||||
<extracomment>Label for disabling icon theme.</extracomment>
|
<extracomment>Label for disabling icon theme.</extracomment>
|
||||||
@ -2010,10 +1754,6 @@ Utvecklaren av detta program, är INTE ansvarig för förlorad data.</translatio
|
|||||||
<source>in-memory database switched</source>
|
<source>in-memory database switched</source>
|
||||||
<translation>Minnesdatabas växlad</translation>
|
<translation>Minnesdatabas växlad</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Internal web browser</source>
|
|
||||||
<translation>Intern webbläsare</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>External web browser</source>
|
<source>External web browser</source>
|
||||||
<translation>Extern webbläsare</translation>
|
<translation>Extern webbläsare</translation>
|
||||||
@ -2042,10 +1782,6 @@ Utvecklaren av detta program, är INTE ansvarig för förlorad data.</translatio
|
|||||||
<source>Auto-update all feeds every</source>
|
<source>Auto-update all feeds every</source>
|
||||||
<translation>Auto-uppdatera alla flöden varje</translation>
|
<translation>Auto-uppdatera alla flöden varje</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minuter</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed connection timeout</source>
|
<source>Feed connection timeout</source>
|
||||||
<translation>Anslutnings-timeout för flöden</translation>
|
<translation>Anslutnings-timeout för flöden</translation>
|
||||||
@ -2166,18 +1902,6 @@ Utvecklaren av detta program, är INTE ansvarig för förlorad data.</translatio
|
|||||||
<source>Launch %1 on operating system startup</source>
|
<source>Launch %1 on operating system startup</source>
|
||||||
<translation>Starta %1 vid systemstart</translation>
|
<translation>Starta %1 vid systemstart</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Enable JavaScript</source>
|
|
||||||
<translation>Aktivera JavaScript</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Enable external plugins based on NPAPI</source>
|
|
||||||
<translation>Aktivera externa tillägg baserade på NPAPI</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Auto-load images</source>
|
|
||||||
<translation>Läs in bilder automatiskt</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
<source><html><head/><body><p>If unchecked, then default system-wide web browser is used.</p></body></html></source>
|
||||||
<translation><html><head/><body><p>Om kryssrutan lämnas omarkerad, används systemets standardwebbläsare.</p></body></html></translation>
|
<translation><html><head/><body><p>Om kryssrutan lämnas omarkerad, används systemets standardwebbläsare.</p></body></html></translation>
|
||||||
@ -2285,18 +2009,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database</source>
|
<source>Working database</source>
|
||||||
<translation>Arbetsdatabas</translation>
|
<translation>Arbetsdatabas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</source>
|
|
||||||
<translation>Musgester aktiveras med mushjulsknappen. Aktuella musgester är:
|
|
||||||
• föregående sida (dra musen åt vänster)
|
|
||||||
• nästa sida (dra musen åt höger)
|
|
||||||
• uppdatera aktuell webbsida (dra musen uppåt)
|
|
||||||
• öppna ny webbläsarflik (dra musen neråt)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Use custom external web browser</source>
|
<source>Use custom external web browser</source>
|
||||||
<translation>Använd anpassad extern webbläsare</translation>
|
<translation>Använd anpassad extern webbläsare</translation>
|
||||||
@ -2353,46 +2065,18 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Working database is ok.</source>
|
<source>Working database is ok.</source>
|
||||||
<translation>Arbetsdatabasen är OK.</translation>
|
<translation>Arbetsdatabasen är OK.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Notification position</source>
|
|
||||||
<translation>Aviseringsposition</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>(Tray icon is not available.)</source>
|
<source>(Tray icon is not available.)</source>
|
||||||
<translation>(meddelandefältsikon ej tillgänglig)</translation>
|
<translation>(meddelandefältsikon ej tillgänglig)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Bottom-left corner</source>
|
|
||||||
<translation>Vänster nederkant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-left corner</source>
|
|
||||||
<translation>Vänster överkant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Bottom-right corner</source>
|
|
||||||
<translation>Höger nederkant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Top-right corner</source>
|
|
||||||
<translation>Höger överkant</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Internal message browser fonts</source>
|
<source>Internal message browser fonts</source>
|
||||||
<translation>Teckensnitt för intern meddelandeläsare</translation>
|
<translation>Teckensnitt för intern meddelandeläsare</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Standard font</source>
|
|
||||||
<translation>Standardteckensnitt</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
<source>Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.</source>
|
||||||
<translation>Notera att hastigheten på den använda MySQL-servern och latensen för aktuellt anslutningsmedium, KRAFTIGT påverkar detta programs prestanda. Användning av långsamma databasanslutningar leder till dålig prestanda vid navigering bland flöden och meddelanden.</translation>
|
<translation>Notera att hastigheten på den använda MySQL-servern och latensen för aktuellt anslutningsmedium, KRAFTIGT påverkar detta programs prestanda. Användning av långsamma databasanslutningar leder till dålig prestanda vid navigering bland flöden och meddelanden.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</source>
|
|
||||||
<translation>Tjusiga && moderna popup-aviseringar (Använder systemets integrerade aviseringar via D-Bus, om tillgängligt.)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>E-mail</source>
|
<source>E-mail</source>
|
||||||
<translation>E-post</translation>
|
<translation>E-post</translation>
|
||||||
@ -2401,25 +2085,33 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Enable notifications</source>
|
<source>Enable notifications</source>
|
||||||
<translation>Aktivera aviseringar</translation>
|
<translation>Aktivera aviseringar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Background color</source>
|
|
||||||
<translation>Bakgrundsfärg</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Change</source>
|
|
||||||
<translation>Ändra</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Open download manager when new download is started</source>
|
<source>Open download manager when new download is started</source>
|
||||||
<translation>Öppna nedladdningshanteraren när ny nedladdning startas</translation>
|
<translation>Öppna nedladdningshanteraren när ny nedladdning startas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Remember opened web browser tabs</source>
|
<source>Statusbar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Statusfält</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Statusbar</source>
|
<source>Enable D-Bus notifications</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Aktivera D-bus-aviseringar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Change font</source>
|
||||||
|
<translation>&Ändra teckensnitt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Font preview</source>
|
||||||
|
<translation>Teckengranskning</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select new font for message viewer</source>
|
||||||
|
<translation>Välj nytt teckensnitt för meddelandevyn</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> (not available)</source>
|
||||||
|
<translation>(ej tillgänglig)</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -2584,10 +2276,6 @@ File filter for external e-mail selection dialog.</extracomment>
|
|||||||
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
<source>Select the auto-update strategy for this feed. Default auto-update strategy means that the feed will be update in time intervals set in application settings.</source>
|
||||||
<translation>Välj uppdateringsstrategi för flödet. Global auto-uppdatering, innebär att flödet kommer att uppdateras med tidsintervall angivna i programinställningarna.</translation>
|
<translation>Välj uppdateringsstrategi för flödet. Global auto-uppdatering, innebär att flödet kommer att uppdateras med tidsintervall angivna i programinställningarna.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source> minutes</source>
|
|
||||||
<translation>minuter</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Title</source>
|
<source>Title</source>
|
||||||
<translation>Titel</translation>
|
<translation>Titel</translation>
|
||||||
@ -3104,10 +2792,34 @@ Gå till programmets hemsida för att hämta den manuellt.</translation>
|
|||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>LocationLineEdit</name>
|
<name>MessagePreviewer</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Website address goes here</source>
|
<source>You clicked link "%1". You can download the link contents or open it in external web browser.</source>
|
||||||
<translation>Webbadress anges här</translation>
|
<translation>Du klickade på länken "%1". Du kan ladda ner länkinnehållet eller öppna den i extern webbläsare.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>What action do you want to take?</source>
|
||||||
|
<translation>Vad vill du göra?</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open in external browser</source>
|
||||||
|
<translation>Öppna i extern webbläsare</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation>Ladda ner</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as read</source>
|
||||||
|
<translation>Markera meddelandet som läst</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Mark message as unread</source>
|
||||||
|
<translation>Markera meddelandet som oläst</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Switch message importance</source>
|
||||||
|
<translation>Växla meddelandeprioritet</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3286,14 +2998,6 @@ Gå till programmets hemsida för att hämta den manuellt.</translation>
|
|||||||
<source>Context menu for messages</source>
|
<source>Context menu for messages</source>
|
||||||
<translation>Kontextmeny för meddelanden</translation>
|
<translation>Kontextmeny för meddelanden</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Meesage without URL</source>
|
|
||||||
<translation>Meddelande utan URL</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Message '%s' does not contain URL.</source>
|
|
||||||
<translation>Meddelande '%s' innehåller ingen URL.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Problem with starting external web browser</source>
|
<source>Problem with starting external web browser</source>
|
||||||
<translation>Problem med att starta extern webbläsare</translation>
|
<translation>Problem med att starta extern webbläsare</translation>
|
||||||
@ -3310,6 +3014,10 @@ Gå till programmets hemsida för att hämta den manuellt.</translation>
|
|||||||
<source>External e-mail client could not be started.</source>
|
<source>External e-mail client could not be started.</source>
|
||||||
<translation>Extern e-postklient kunde inte startas.</translation>
|
<translation>Extern e-postklient kunde inte startas.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Newspaper view</source>
|
||||||
|
<translation>Tidningsvy</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>NetworkFactory</name>
|
<name>NetworkFactory</name>
|
||||||
@ -3389,7 +3097,26 @@ Gå till programmets hemsida för att hämta den manuellt.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<source>unknown content</source>
|
<source>unknown content</source>
|
||||||
<extracomment>Network status.</extracomment>
|
<extracomment>Network status.</extracomment>
|
||||||
<translation type="unfinished"/>
|
<translation>okänt innehåll</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>NewspaperPreviewer</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation>Format</translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>Show more messages (%n remaining)</source>
|
||||||
|
<translation><numerusform>Visa fler meddelande (% återstår)</numerusform><numerusform>Visa fler meddelanden (% återstår)</numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages</source>
|
||||||
|
<translation>Kan inte visa fler meddelanden</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot show more messages because parent feed was removed.</source>
|
||||||
|
<translation>Kan inte visa fler meddelanden eftersom överordnat flöde tagits bort.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@ -3640,25 +3367,21 @@ Konto-ID: %1</translation>
|
|||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StatusBar</name>
|
<name>StatusBar</name>
|
||||||
<message>
|
|
||||||
<source>Adblock</source>
|
|
||||||
<translation>Adblock</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update progress bar</source>
|
<source>Feed update progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Förloppsindikator för flödesuppdatering</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Feed update label</source>
|
<source>Feed update label</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Flödesuppdateringsetikett</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File download progress bar</source>
|
<source>File download progress bar</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Förloppsindikator för nedladdning</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File download label</source>
|
<source>File download label</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Nedladdningsetikett</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Toolbar spacer</source>
|
<source>Toolbar spacer</source>
|
||||||
@ -3710,11 +3433,6 @@ Olästa nyheter: %2</translation>
|
|||||||
<source>Browse your feeds and messages</source>
|
<source>Browse your feeds and messages</source>
|
||||||
<translation>Bläddra bland dina flöden och meddelanden</translation>
|
<translation>Bläddra bland dina flöden och meddelanden</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<extracomment>Web browser default tab title.</extracomment>
|
|
||||||
<translation>Webbläsare</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Displays main menu.</source>
|
<source>Displays main menu.</source>
|
||||||
<translation>Visar den primära menyn.</translation>
|
<translation>Visar den primära menyn.</translation>
|
||||||
@ -3723,15 +3441,26 @@ Olästa nyheter: %2</translation>
|
|||||||
<source>Main menu</source>
|
<source>Main menu</source>
|
||||||
<translation>Huvudmeny</translation>
|
<translation>Huvudmeny</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Open new web browser tab.</source>
|
|
||||||
<translation>Öppna ny webbläsarflik.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Downloads</source>
|
<source>Downloads</source>
|
||||||
<translation>Nedladdningar</translation>
|
<translation>Nedladdningar</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>TimeSpinBox</name>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n hour(s)</source>
|
||||||
|
<translation><numerusform>%n timma</numerusform><numerusform>%n timmar</numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message numerus="yes">
|
||||||
|
<source>%n minute(s)</source>
|
||||||
|
<translation><numerusform>%n minut</numerusform><numerusform>%n minuter</numerusform></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> and </source>
|
||||||
|
<translation>och</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ToolBarEditor</name>
|
<name>ToolBarEditor</name>
|
||||||
<message>
|
<message>
|
||||||
@ -3844,215 +3573,4 @@ Senast inloggad: %5</translation>
|
|||||||
<translation>Kan inte lägga till flöde, eftersom en annan kritisk åtgärd pågår.</translation>
|
<translation>Kan inte lägga till flöde, eftersom en annan kritisk åtgärd pågår.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>WebBrowser</name>
|
|
||||||
<message>
|
|
||||||
<source>Navigation panel</source>
|
|
||||||
<translation>Navigationspanel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Back</source>
|
|
||||||
<translation>Tillbaka</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Forward</source>
|
|
||||||
<translation>Framåt</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload</source>
|
|
||||||
<translation>Uppdatera</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop</source>
|
|
||||||
<translation>Stopp</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Zoom </source>
|
|
||||||
<translation>Zoom </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>No title</source>
|
|
||||||
<extracomment>Webbrowser tab title when no title is available.</extracomment>
|
|
||||||
<translation>Ingen titel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Decrease zoom.</source>
|
|
||||||
<translation>Mindre zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reset zoom to default.</source>
|
|
||||||
<translation>Återställ zoomläget till standard.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Increase zoom.</source>
|
|
||||||
<translation>Ökad zoom.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Written by </source>
|
|
||||||
<translation>Skriven av </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Newspaper view</source>
|
|
||||||
<translation>Tidningsvy</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go back.</source>
|
|
||||||
<translation>Gå tillbaka.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Go forward.</source>
|
|
||||||
<translation>Gå framåt.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Uppdatera aktuell webbsida.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Stop web page loading.</source>
|
|
||||||
<translation>Stoppa inläsning av webbsidan.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>unknown author</source>
|
|
||||||
<translation type="unfinished"/>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>WebView</name>
|
|
||||||
<message>
|
|
||||||
<source>Reload web page</source>
|
|
||||||
<translation>Uppdatera webbsidan</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url</source>
|
|
||||||
<translation>Kopiera länk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image</source>
|
|
||||||
<translation>Kopiera bild</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url</source>
|
|
||||||
<translation>Kopiera bildadress</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in new tab</source>
|
|
||||||
<translation>Öppna länk i ny flik</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Follow link</source>
|
|
||||||
<translation>Följ länk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open image in new tab</source>
|
|
||||||
<translation>Öppna bild i ny flik</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web browser</source>
|
|
||||||
<translation>Webbläsare</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Image</source>
|
|
||||||
<translation>Bild</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Hyperlink</source>
|
|
||||||
<translation>Hyperlänk</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Reload current web page.</source>
|
|
||||||
<translation>Uppdatera aktuell webbsida.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy selection</source>
|
|
||||||
<translation>Kopiera markerat</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copies current selection into the clipboard.</source>
|
|
||||||
<translation>Kopiera aktuell markering till Urklipp.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy link url to clipboard.</source>
|
|
||||||
<translation>Kopiera länkadress till Urklipp.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image to clipboard.</source>
|
|
||||||
<translation>Kopiera bild till Urklipp.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Copy image url to clipboard.</source>
|
|
||||||
<translation>Kopiera bildadress till Urklipp.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this hyperlink in new tab.</source>
|
|
||||||
<translation>Öppna länken i ny flik.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in this tab.</source>
|
|
||||||
<translation>Öppna länken i samma flik.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open this image in this tab.</source>
|
|
||||||
<translation>Öppna bilden i samma flik.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open link in external browser</source>
|
|
||||||
<translation>Öppna länk i extern webbläsare</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Open the hyperlink in external browser.</source>
|
|
||||||
<translation>Öppna länken i extern webbläsare.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print</source>
|
|
||||||
<translation>Skriv ut</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Print current web page.</source>
|
|
||||||
<translation>Skriv ut aktuell webbsida</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>HTML web pages (*.html)</source>
|
|
||||||
<translation>HTML-webbsidor (*.html)</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Select destination file for web page</source>
|
|
||||||
<translation>Ange målfil för webbsidan</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot save web page</source>
|
|
||||||
<translation>Kan inte spara webbsidan</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Web page cannot be saved because destination file is not writtable.</source>
|
|
||||||
<translation>Webbsidan kan inte sparas eftersom målfilen inte är skrivbar.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save target as...</source>
|
|
||||||
<translation>Spara målet som...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Download content from the hyperlink.</source>
|
|
||||||
<translation>Ladda ner innehåll från hyperlänk.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save page as...</source>
|
|
||||||
<translation>Spara sida som...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image to disk.</source>
|
|
||||||
<translation>Spara bild på disk.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Save image as...</source>
|
|
||||||
<translation>Spara bild som...</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>source_page</source>
|
|
||||||
<translation>source_page</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Search "%1" via Google...</source>
|
|
||||||
<translation>Sök "%1" via Google...</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
</TS>
|
@ -1 +1 @@
|
|||||||
Subproject commit 572da127bb14842bba6f84e6315a5ecefb44ed07
|
Subproject commit 2392b936c08eac92a6a34361a916a739f53836d0
|
@ -1 +0,0 @@
|
|||||||
ICON 1 DISCARDABLE "@PROJECT_SOURCE_DIR@/resources/graphics/rssguard_os2.ico"
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -6,8 +6,5 @@
|
|||||||
<email>rotter.martinos@gmail.com</email>
|
<email>rotter.martinos@gmail.com</email>
|
||||||
</author>
|
</author>
|
||||||
<style></style>
|
<style></style>
|
||||||
<markup_wrapper>PGh0bWw+DQogIDxoZWFkPg0KICAgIDxzdHlsZT4gICANCiAgICAgIGJvZHkgeyAgICAgDQogICAgICAgIG1hcmdpbjogMHB4Ow0KICAgICAgICBwYWRkaW5nOiAwcHg7DQogICAgICB9DQogICAgDQogICAgICBwcmUgew0KICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7DQogICAgICB9DQoNCiAgICAgIC5oZWFkZXJ0ZXh0IHsNCiAgICAgICAgZm9udC1zaXplOiAyMHB4Ow0KICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KICAgICAgfQ0KDQogICAgICAuaGVhZGVyIHsNCiAgICAgICAgZm9udC1zaXplOiAxN3B4Ow0KICAgICAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLHJnYmEoODQsIDEzMiwgNTMsIDEpKSwgY29sb3Itc3RvcCgxMDAlLHJnYmEoODQsIDE0MCwgNTMsIDEpKSk7DQogICAgICAgIHBhZGRpbmc6IDZweDsNCiAgICAgICAgbWFyZ2luOiAwcHggYXV0bzsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICBib3JkZXI6IDAuNXB4IHNvbGlkIGJsYWNrOw0KICAgICAgfQ0KDQogICAgICAuaGVhZGVyIGEgew0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICB9DQogICAgICANCiAgICAgIC5oZWFkZXIgLmVuY2xvc3VyZSB7DQogICAgICAgIGNvbG9yOiBibGFjazsNCiAgICAgIH0NCg0KICAgICAgLmNvbnRlbnQgew0KICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTsNCiAgICAgICAgZm9udC1zaXplOiAxNnB4Ow0KICAgICAgICBtYXJnaW46IDBweCBhdXRvOw0KICAgICAgICBwYWRkaW5nOiA2cHg7DQogICAgICAgIHBhZGRpbmctdG9wOiAxMnB4Ow0KICAgICAgfQ0KICAgICAgDQogICAgICAuY29udGFpbmVyIHsNCiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsNCiAgICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7DQogICAgICAgIG1hcmdpbjogMTBweDsNCiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDhweCAwcHggcmdiYSg1MCwgNTAsIDUwLCAwLjYyKTsNCiAgICAgIH0NCiAgICA8L3N0eWxlPg0KICAgIDx0aXRsZT4NCiAgICAgICUxDQogICAgPC90aXRsZT4NCiAgPC9oZWFkPg0KICA8Ym9keT4NCiAgICAlMg0KICA8L2JvZHk+DQo8L2h0bWw+</markup_wrapper>
|
|
||||||
<markup>PGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlcnRleHQiPg0KICAgICAgICAgICUxDQogICAgICAgIDwvZGl2Pg0KICAgICAgICAlMiAoJTUpDQogICAgICAgIDxicj4NCiAgICAgICAgPGEgaHJlZj0iJTMiPiUzPC9hPg0KICAgICAgICAlNg0KICAgICAgPC9kaXY+DQogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCiAgICAgICAgJTQgDQogICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4=</markup>
|
|
||||||
<markup_enclosure>PGEgY2xhc3M9ImVuY2xvc3VyZSIgaHJlZj0iJTMiPiUzPC9hPg==</markup_enclosure>
|
|
||||||
<data>LyoNCiAqIEluc3BpcmVkIGJ5IFF1aXRlUlNTICJncmVlbiIgc2tpbi4NCiAqIENvcHlyaWdodCAoQykgPD0gMjAxMyBieSBRdWl0ZVJTUyB0ZWFtDQogKiBDb3B5cmlnaHQgKEMpIDIwMTQgYnkgTWFydGluIFJvdHRlciA8cm90dGVyLm1hcnRpbm9zQGdtYWlsLmNvbT4NCiAqLw0KICANClFUcmVlVmlldzo6YnJhbmNoOmhhcy1zaWJsaW5nczohYWRqb2lucy1pdGVtICB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOmhhcy1zaWJsaW5nczphZGpvaW5zLWl0ZW0gew0KICBib3JkZXItaW1hZ2U6IHVybChxc3MvZHVtbXkucG5nKSAwOw0KfQ0KDQpRVHJlZVZpZXc6OmJyYW5jaDohaGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3M6YWRqb2lucy1pdGVtICB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOmhhcy1jaGlsZHJlbjohaGFzLXNpYmxpbmdzOmNsb3NlZCwNClFUcmVlVmlldzo6YnJhbmNoOmNsb3NlZDpoYXMtY2hpbGRyZW46aGFzLXNpYmxpbmdzICB7DQogIGJvcmRlci1pbWFnZTogbm9uZTsNCiAgaW1hZ2U6IHVybChxc3MvYnJhbmNoLWNsb3NlZC5wbmcpOw0KfQ0KDQpRVHJlZVZpZXc6OmJyYW5jaDpvcGVuOmhhcy1jaGlsZHJlbjohaGFzLXNpYmxpbmdzLA0KUVRyZWVWaWV3OjpicmFuY2g6b3BlbjpoYXMtY2hpbGRyZW46aGFzLXNpYmxpbmdzICB7DQogIGJvcmRlci1pbWFnZTogbm9uZTsNCiAgaW1hZ2U6IHVybChxc3MvYnJhbmNoLW9wZW4ucG5nKTsNCn0NCg0KUVRyZWVWaWV3OjppdGVtIHsNCiAgcGFkZGluZzogMXB4IDFweCAxcHggMXB4Ow0KfSANCg0KUVRyZWVWaWV3W2hpZGVUcmVlPSJ0cnVlIl06OmJyYW5jaDohaGFzLWNobGlkcmVuOmhhc1NpYmxpbmdzIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogbm9uZTsNCn0NCg0KUVN0YXR1c0Jhcjo6aXRlbSB7DQogIGJvcmRlcjogbm9uZTsNCn0NCg0KV2ViQnJvd3NlciBRUHJvZ3Jlc3NCYXIgew0KICBib3JkZXI6IDFweCBzb2xpZCAjQTVBNUE1Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGJvcmRlci1sZWZ0OiBub25lOw0KICBib3JkZXItcmlnaHQ6IG5vbmU7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgI2Y0ZjRmNCwgc3RvcDowLjQgI0VDRUNFQyBzdG9wOjAuNSAjREVERURFLCBzdG9wOjEgI2Y0ZjRmNCk7DQp9DQoNCldlYkJyb3dzZXIgUVByb2dyZXNzQmFyOjpjaHVuayB7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgIzkwRTg5MCwgc3RvcDowLjQgIzdDRDA3Qywgc3RvcDowLjUgIzYwQzA2MCwgc3RvcDoxICM2MEQwNjApOw0KICB3aWR0aDogMXB4Ow0KfQ0KDQpRTWVudUJhciB7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgI2UwZWVlMCwgc3RvcDowLjQgI2Q4ZWVkOCwgc3RvcDowLjUgI2NjZWVjYywgc3RvcDoxICNlMGVlZTApOw0KICBjb2xvcjogIzAwMDAwMDsNCiAgcGFkZGluZzogMXB4Ow0KfQ0KDQpRTWVudUJhcjo6aXRlbSB7DQogIHBhZGRpbmc6IDNweCA2cHg7DQogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KfQ0KDQpRTWVudUJhcjo6aXRlbTpzZWxlY3RlZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICM4NGNjODQ7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgI2U5ZmZlOSwgc3RvcDowLjQgI2UxZWVlMSwgc3RvcDowLjUgI2Q5ZWVkOSwgc3RvcDoxICNlOWZmZTkpOw0KfQ0KDQpRTWVudUJhcjo6aXRlbTpwcmVzc2VkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzM0YWEzNDsNCiAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCiAgYmFja2dyb3VuZDogcWxpbmVhcmdyYWRpZW50KHgxOjAsIHkxOjAsIHgyOjAsIHkyOjEsIHN0b3A6MCAjN2FjYzdhLCBzdG9wOjAuNCAjNzBjODcwLCBzdG9wOjAuNSAjNjBjNDYwLCBzdG9wOjEgIzdhY2M3YSk7DQogIGNvbG9yOiB3aGl0ZTsNCn0=</data>
|
<data>LyoNCiAqIEluc3BpcmVkIGJ5IFF1aXRlUlNTICJncmVlbiIgc2tpbi4NCiAqIENvcHlyaWdodCAoQykgPD0gMjAxMyBieSBRdWl0ZVJTUyB0ZWFtDQogKiBDb3B5cmlnaHQgKEMpIDIwMTQgYnkgTWFydGluIFJvdHRlciA8cm90dGVyLm1hcnRpbm9zQGdtYWlsLmNvbT4NCiAqLw0KICANClFUcmVlVmlldzo6YnJhbmNoOmhhcy1zaWJsaW5nczohYWRqb2lucy1pdGVtICB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOmhhcy1zaWJsaW5nczphZGpvaW5zLWl0ZW0gew0KICBib3JkZXItaW1hZ2U6IHVybChxc3MvZHVtbXkucG5nKSAwOw0KfQ0KDQpRVHJlZVZpZXc6OmJyYW5jaDohaGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3M6YWRqb2lucy1pdGVtICB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOmhhcy1jaGlsZHJlbjohaGFzLXNpYmxpbmdzOmNsb3NlZCwNClFUcmVlVmlldzo6YnJhbmNoOmNsb3NlZDpoYXMtY2hpbGRyZW46aGFzLXNpYmxpbmdzICB7DQogIGJvcmRlci1pbWFnZTogbm9uZTsNCiAgaW1hZ2U6IHVybChxc3MvYnJhbmNoLWNsb3NlZC5wbmcpOw0KfQ0KDQpRVHJlZVZpZXc6OmJyYW5jaDpvcGVuOmhhcy1jaGlsZHJlbjohaGFzLXNpYmxpbmdzLA0KUVRyZWVWaWV3OjpicmFuY2g6b3BlbjpoYXMtY2hpbGRyZW46aGFzLXNpYmxpbmdzICB7DQogIGJvcmRlci1pbWFnZTogbm9uZTsNCiAgaW1hZ2U6IHVybChxc3MvYnJhbmNoLW9wZW4ucG5nKTsNCn0NCg0KUVRyZWVWaWV3OjppdGVtIHsNCiAgcGFkZGluZzogMXB4IDFweCAxcHggMXB4Ow0KfSANCg0KUVRyZWVWaWV3W2hpZGVUcmVlPSJ0cnVlIl06OmJyYW5jaDohaGFzLWNobGlkcmVuOmhhc1NpYmxpbmdzIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogbm9uZTsNCn0NCg0KUVN0YXR1c0Jhcjo6aXRlbSB7DQogIGJvcmRlcjogbm9uZTsNCn0NCg0KV2ViQnJvd3NlciBRUHJvZ3Jlc3NCYXIgew0KICBib3JkZXI6IDFweCBzb2xpZCAjQTVBNUE1Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGJvcmRlci1sZWZ0OiBub25lOw0KICBib3JkZXItcmlnaHQ6IG5vbmU7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgI2Y0ZjRmNCwgc3RvcDowLjQgI0VDRUNFQyBzdG9wOjAuNSAjREVERURFLCBzdG9wOjEgI2Y0ZjRmNCk7DQp9DQoNCldlYkJyb3dzZXIgUVByb2dyZXNzQmFyOjpjaHVuayB7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgIzkwRTg5MCwgc3RvcDowLjQgIzdDRDA3Qywgc3RvcDowLjUgIzYwQzA2MCwgc3RvcDoxICM2MEQwNjApOw0KICB3aWR0aDogMXB4Ow0KfQ0KDQpRTWVudUJhciB7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgI2UwZWVlMCwgc3RvcDowLjQgI2Q4ZWVkOCwgc3RvcDowLjUgI2NjZWVjYywgc3RvcDoxICNlMGVlZTApOw0KICBjb2xvcjogIzAwMDAwMDsNCiAgcGFkZGluZzogMXB4Ow0KfQ0KDQpRTWVudUJhcjo6aXRlbSB7DQogIHBhZGRpbmc6IDNweCA2cHg7DQogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KfQ0KDQpRTWVudUJhcjo6aXRlbTpzZWxlY3RlZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICM4NGNjODQ7DQogIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTowLCB5MTowLCB4MjowLCB5MjoxLCBzdG9wOjAgI2U5ZmZlOSwgc3RvcDowLjQgI2UxZWVlMSwgc3RvcDowLjUgI2Q5ZWVkOSwgc3RvcDoxICNlOWZmZTkpOw0KfQ0KDQpRTWVudUJhcjo6aXRlbTpwcmVzc2VkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgIzM0YWEzNDsNCiAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCiAgYmFja2dyb3VuZDogcWxpbmVhcmdyYWRpZW50KHgxOjAsIHkxOjAsIHgyOjAsIHkyOjEsIHN0b3A6MCAjN2FjYzdhLCBzdG9wOjAuNCAjNzBjODcwLCBzdG9wOjAuNSAjNjBjNDYwLCBzdG9wOjEgIzdhY2M3YSk7DQogIGNvbG9yOiB3aGl0ZTsNCn0=</data>
|
||||||
</skin>
|
</skin>
|
File diff suppressed because one or more lines are too long
@ -6,8 +6,5 @@
|
|||||||
<email>rotter.martinos@gmail.com</email>
|
<email>rotter.martinos@gmail.com</email>
|
||||||
</author>
|
</author>
|
||||||
<style/>
|
<style/>
|
||||||
<markup_wrapper>PGh0bWw+DQogIDxoZWFkPg0KICAgIDxzdHlsZT4NCiAgICAgIGJvZHkgew0KICAgICAgICBtYXJnaW46IDBweDsNCiAgICAgICAgcGFkZGluZzogMHB4Ow0KICAgICAgfQ0KICAgIA0KICAgICAgcHJlIHsNCiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOw0KICAgICAgfQ0KDQogICAgICAuaGVhZGVydGV4dCB7DQogICAgICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsNCiAgICAgIH0NCg0KICAgICAgLmhlYWRlciB7DQogICAgICAgIGZvbnQtc2l6ZTogMTdweDsNCiAgICAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCgwJSxyZ2JhKDk5LDEzNSwyMjksMSkpLCBjb2xvci1zdG9wKDEwMCUscmdiYSg2NCwxMDksMjM2LDEpKSk7DQogICAgICAgIHBhZGRpbmc6IDZweDsNCiAgICAgICAgbWFyZ2luOiAwcHggYXV0bzsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICBib3JkZXI6IDAuNXB4IHNvbGlkIGJsYWNrOw0KICAgICAgfQ0KDQogICAgICAuaGVhZGVyIGEgew0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOw0KICAgICAgfQ0KICAgICAgDQogICAgICAuaGVhZGVyIC5lbmNsb3N1cmUgew0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgICAgIGNvbG9yOiBibGFjazsNCiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOw0KICAgICAgfQ0KICAgICAgDQogICAgICAuZW5jbG9zdXJlOmhvdmVyLCAuaGVhZGVyIGE6aG92ZXIgew0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCiAgICAgIH0NCg0KICAgICAgLmNvbnRlbnQgew0KICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTsNCiAgICAgICAgZm9udC1zaXplOiAxNnB4Ow0KICAgICAgICBtYXJnaW46IDBweCBhdXRvOw0KICAgICAgICBwYWRkaW5nOiA2cHg7DQogICAgICAgIHBhZGRpbmctdG9wOiAxMnB4Ow0KICAgICAgfQ0KICAgICAgDQogICAgICAuY29udGFpbmVyIHsNCiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsNCiAgICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7DQogICAgICAgIG1hcmdpbjogMTBweDsNCiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDE2cHggMHB4IHJnYmEoNTAsIDUwLCA1MCwgMC42Mik7DQogICAgICB9DQogICAgPC9zdHlsZT4NCiAgICA8dGl0bGU+DQogICAgICAlMQ0KICAgIDwvdGl0bGU+DQogIDwvaGVhZD4NCiAgPGJvZHk+DQogICAgJTINCiAgPC9ib2R5Pg0KPC9odG1sPg==</markup_wrapper>
|
|
||||||
<markup>PGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlcnRleHQiPg0KICAgICAgICAgICUxDQogICAgICAgIDwvZGl2Pg0KICAgICAgICAlMiAoJTUpDQogICAgICAgIDxicj4NCiAgICAgICAgPGEgaHJlZj0iJTMiPiUzPC9hPg0KICAgICAgICAlNg0KICAgICAgPC9kaXY+DQogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCiAgICAgICAgJTQgDQogICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4=</markup>
|
|
||||||
<markup_enclosure>PGEgY2xhc3M9ImVuY2xvc3VyZSIgaHJlZj0iJTMiPiUzPC9hPg==</markup_enclosure>
|
|
||||||
<data>UVRyZWVWaWV3OjpicmFuY2g6aGFzLXNpYmxpbmdzOiFhZGpvaW5zLWl0ZW0gIHsNCiAgYm9yZGVyLWltYWdlOiB1cmwocXNzL2R1bW15LnBuZykgMDsNCn0NCg0KUVRyZWVWaWV3OjpicmFuY2g6aGFzLXNpYmxpbmdzOmFkam9pbnMtaXRlbSB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOiFoYXMtY2hpbGRyZW46IWhhcy1zaWJsaW5nczphZGpvaW5zLWl0ZW0gIHsNCiAgYm9yZGVyLWltYWdlOiB1cmwocXNzL2R1bW15LnBuZykgMDsNCn0NCg0KUVRyZWVWaWV3OjpicmFuY2g6aGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3M6Y2xvc2VkLA0KUVRyZWVWaWV3OjpicmFuY2g6Y2xvc2VkOmhhcy1jaGlsZHJlbjpoYXMtc2libGluZ3MgIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogdXJsKHFzcy9icmFuY2gtY2xvc2VkLnBuZyk7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOm9wZW46aGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3MsDQpRVHJlZVZpZXc6OmJyYW5jaDpvcGVuOmhhcy1jaGlsZHJlbjpoYXMtc2libGluZ3MgIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogdXJsKHFzcy9icmFuY2gtb3Blbi5wbmcpOw0KfQ0KDQpRVHJlZVZpZXc6Oml0ZW0gew0KICBwYWRkaW5nOiAxcHggMXB4IDFweCAxcHg7DQp9IA0KDQpRVHJlZVZpZXdbaGlkZVRyZWU9InRydWUiXTo6YnJhbmNoOiFoYXMtY2hsaWRyZW46aGFzU2libGluZ3Mgew0KICBib3JkZXItaW1hZ2U6IG5vbmU7DQogIGltYWdlOiBub25lOw0KfQ0KDQpRU3RhdHVzQmFyOjppdGVtIHsNCiAgYm9yZGVyOiBub25lOw0KfQ==</data>
|
<data>UVRyZWVWaWV3OjpicmFuY2g6aGFzLXNpYmxpbmdzOiFhZGpvaW5zLWl0ZW0gIHsNCiAgYm9yZGVyLWltYWdlOiB1cmwocXNzL2R1bW15LnBuZykgMDsNCn0NCg0KUVRyZWVWaWV3OjpicmFuY2g6aGFzLXNpYmxpbmdzOmFkam9pbnMtaXRlbSB7DQogIGJvcmRlci1pbWFnZTogdXJsKHFzcy9kdW1teS5wbmcpIDA7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOiFoYXMtY2hpbGRyZW46IWhhcy1zaWJsaW5nczphZGpvaW5zLWl0ZW0gIHsNCiAgYm9yZGVyLWltYWdlOiB1cmwocXNzL2R1bW15LnBuZykgMDsNCn0NCg0KUVRyZWVWaWV3OjpicmFuY2g6aGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3M6Y2xvc2VkLA0KUVRyZWVWaWV3OjpicmFuY2g6Y2xvc2VkOmhhcy1jaGlsZHJlbjpoYXMtc2libGluZ3MgIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogdXJsKHFzcy9icmFuY2gtY2xvc2VkLnBuZyk7DQp9DQoNClFUcmVlVmlldzo6YnJhbmNoOm9wZW46aGFzLWNoaWxkcmVuOiFoYXMtc2libGluZ3MsDQpRVHJlZVZpZXc6OmJyYW5jaDpvcGVuOmhhcy1jaGlsZHJlbjpoYXMtc2libGluZ3MgIHsNCiAgYm9yZGVyLWltYWdlOiBub25lOw0KICBpbWFnZTogdXJsKHFzcy9icmFuY2gtb3Blbi5wbmcpOw0KfQ0KDQpRVHJlZVZpZXc6Oml0ZW0gew0KICBwYWRkaW5nOiAxcHggMXB4IDFweCAxcHg7DQp9IA0KDQpRVHJlZVZpZXdbaGlkZVRyZWU9InRydWUiXTo6YnJhbmNoOiFoYXMtY2hsaWRyZW46aGFzU2libGluZ3Mgew0KICBib3JkZXItaW1hZ2U6IG5vbmU7DQogIGltYWdlOiBub25lOw0KfQ0KDQpRU3RhdHVzQmFyOjppdGVtIHsNCiAgYm9yZGVyOiBub25lOw0KfQ==</data>
|
||||||
</skin>
|
</skin>
|
@ -1,32 +1,33 @@
|
|||||||
3.1.1
|
3.1.1
|
||||||
—————
|
—————
|
||||||
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
Main:
|
||||||
PLEASE, FILL THIS SURVEY.
|
|
||||||
|
|
||||||
http://goo.gl/forms/GcvPYgS2a8
|
▪ Internal web browser was REMOVED. This is because old Qt WebKit web component will be removed from Qt and new Qt component for web viewing is based on Chromium, which is fucking joke. Some people hate Chromium because of many (technocal, philosophical, etical) reasons. Moreover, it lacks some useful features and is memory hungry. It is also very buggy in Qt now. Therefore now internal web browser is gone. Message preview component now uses much lighter solution and still can display certain HTML subset. RSS Guard was tweaked to be more friendly to external web browser. Double-clicking any message results in it being opened via external web browser.
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
▪ RSS Guard now depends only Qt 5.6 or higher.
|
||||||
|
|
||||||
Added:
|
Added:
|
||||||
|
|
||||||
|
▪ Global auto-update feed interval spinbox now has better format. (issue #176)
|
||||||
|
▪ Message preview's font is now fully adjustable in settings. (issue #177)
|
||||||
▪ RSS Guard now automatically switches to SQLite backend if MySQL is not available on program startup.
|
▪ RSS Guard now automatically switches to SQLite backend if MySQL is not available on program startup.
|
||||||
▪ Opened web browser tabs now can be saved. (issue #126)
|
▪ Newspaper view now allows marking individual messages read/unread/starred/unstarred.
|
||||||
▪ Added experimental support for tweakable statusbar. (issue #158)
|
▪ Added experimental support for tweakable statusbar. (issue #158)
|
||||||
▪ Opening of download manager when new file download starts is now optional. (issue #165)
|
▪ Opening of download manager when new file download starts is now optional. (issue #165)
|
||||||
|
|
||||||
Fixed:
|
Fixed:
|
||||||
|
|
||||||
▪ When user selects "Save as..." for some file from internal web browser, file selection dialog is always shown. (bug #174)
|
▪ Download manager now correctly displays download progress/info.
|
||||||
▪ Better detection of MySQL server status. (bug #169)
|
▪ Better detection of MySQL server status. (bug #169)
|
||||||
▪ Ordering of messages is now done on SQL server (stands for both MySQL and SQLite). (bug #172)
|
▪ Ordering of messages is now done on SQL server (stands for both MySQL and SQLite). (bug #172)
|
||||||
▪ Now title of the RSS/ATOM message is taken into account when deciding message "uniqueness". (bug #171)
|
▪ Now title of the RSS/ATOM message is taken into account when deciding message "uniqueness". (bug #171)
|
||||||
▪ MySQL scripts improved. (bug #170)
|
▪ MySQL scripts improved. (bug #170)
|
||||||
▪ Fixed little problem with feed list hiding. (bug #163)
|
▪ Fixed little problem with feed list hiding. (bug #163)
|
||||||
▪ Web browser search context menu item now trims the searched string. (bug #168)
|
|
||||||
|
|
||||||
Changed:
|
Changed:
|
||||||
|
|
||||||
▪ Better performance when recalculating counts of all/unread messages in categories with many feeds.
|
▪ Better performance when recalculating counts of all/unread messages in categories with many feeds.
|
||||||
|
▪ Custom notification popup window is now removed, it was buggy on Windows 10. Windows 10 offers good built-in alternative. On Linux, we rely on D-Bus notifications.
|
||||||
|
|
||||||
3.1.0
|
3.1.0
|
||||||
—————
|
—————
|
||||||
|
@ -162,12 +162,7 @@ void MessagesModel::setupHeaderData() {
|
|||||||
Qt::ItemFlags MessagesModel::flags(const QModelIndex &index) const {
|
Qt::ItemFlags MessagesModel::flags(const QModelIndex &index) const {
|
||||||
Q_UNUSED(index)
|
Q_UNUSED(index)
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemNeverHasChildren;
|
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemNeverHasChildren;
|
||||||
#else
|
|
||||||
|
|
||||||
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant MessagesModel::data(int row, int column, int role) const {
|
QVariant MessagesModel::data(int row, int column, int role) const {
|
||||||
|
@ -70,13 +70,10 @@ QModelIndex MessagesProxyModel::getNextUnreadItemIndex(int default_row, int max_
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MessagesProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const {
|
bool MessagesProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const {
|
||||||
// FIXME: V případě hodně položke je to pomalé.
|
|
||||||
// V případě, že do messagelistu budu zobrazovat řekněme
|
|
||||||
// více než 4 000 zpráv, tak tady vracet automaticky false,
|
|
||||||
// neprovádět skutečně porovnávání.
|
|
||||||
Q_UNUSED(left)
|
Q_UNUSED(left)
|
||||||
Q_UNUSED(right)
|
Q_UNUSED(right)
|
||||||
|
|
||||||
|
// NOTE: Porovnání se provádí již při dotazu v databázi, netřeba řešit zde.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,11 +104,6 @@
|
|||||||
#define PLACEHOLDER_UNREAD_COUNTS "%unread"
|
#define PLACEHOLDER_UNREAD_COUNTS "%unread"
|
||||||
#define PLACEHOLDER_ALL_COUNTS "%all"
|
#define PLACEHOLDER_ALL_COUNTS "%all"
|
||||||
|
|
||||||
#define ADBLOCK_CUSTOM_LIST_FILENAME "custom_rules.txt"
|
|
||||||
#define ADBLOCK_BASE_DIRECTORY_NAME "data/adblock"
|
|
||||||
#define ADBLOCK_FILTERS_HELP "https://adblockplus.org/en/filters"
|
|
||||||
#define ADBLOCK_EASYLIST_URL "https://easylist-downloads.adblockplus.org/easylist.txt"
|
|
||||||
|
|
||||||
#define BACKUP_NAME_SETTINGS "config"
|
#define BACKUP_NAME_SETTINGS "config"
|
||||||
#define BACKUP_SUFFIX_SETTINGS ".ini.backup"
|
#define BACKUP_SUFFIX_SETTINGS ".ini.backup"
|
||||||
#define BACKUP_NAME_DATABASE "database"
|
#define BACKUP_NAME_DATABASE "database"
|
||||||
@ -152,16 +147,12 @@
|
|||||||
#define APP_THEME_SUFFIX ".png"
|
#define APP_THEME_SUFFIX ".png"
|
||||||
|
|
||||||
#ifndef QSL
|
#ifndef QSL
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
// Thin macro wrapper for literal strings.
|
// Thin macro wrapper for literal strings.
|
||||||
// They are much more memory efficient and faster.
|
// They are much more memory efficient and faster.
|
||||||
// Use it for all literals except for two cases:
|
// Use it for all literals except for two cases:
|
||||||
// a) Methods which take QLatin1String (use QLatin1String for literal argument too),
|
// a) Methods which take QLatin1String (use QLatin1String for literal argument too),
|
||||||
// b) Construction of empty literals "", use QString() instead of QStringLiteral("").
|
// b) Construction of empty literals "", use QString() instead of QStringLiteral("").
|
||||||
#define QSL(x) QStringLiteral(x)
|
#define QSL(x) QStringLiteral(x)
|
||||||
#else
|
|
||||||
#define QSL(x) QLatin1String(x)
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef QL1S
|
#ifndef QL1S
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include "miscellaneous/databasefactory.h"
|
#include "miscellaneous/databasefactory.h"
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/feedsview.h"
|
#include "gui/feedsview.h"
|
||||||
#include "gui/messagebox.h"
|
#include "gui/messagebox.h"
|
||||||
#include "gui/systemtrayicon.h"
|
#include "gui/systemtrayicon.h"
|
||||||
@ -84,9 +83,6 @@ FormMain::FormMain(QWidget *parent, Qt::WindowFlags f)
|
|||||||
loadSize();
|
loadSize();
|
||||||
|
|
||||||
m_statusBar->loadChangeableActions();
|
m_statusBar->loadChangeableActions();
|
||||||
|
|
||||||
// Initialize the web factory.
|
|
||||||
WebFactory::instance()->loadState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FormMain::~FormMain() {
|
FormMain::~FormMain() {
|
||||||
@ -113,14 +109,8 @@ QList<QAction*> FormMain::allActions() const {
|
|||||||
actions << m_ui->m_actionSwitchStatusBar;
|
actions << m_ui->m_actionSwitchStatusBar;
|
||||||
actions << m_ui->m_actionSwitchMessageListOrientation;
|
actions << m_ui->m_actionSwitchMessageListOrientation;
|
||||||
|
|
||||||
// Add web browser actions.
|
|
||||||
actions << m_ui->m_actionAddBrowser;
|
|
||||||
actions << m_ui->m_actionCloseCurrentTab;
|
|
||||||
actions << m_ui->m_actionCloseAllTabs;
|
|
||||||
|
|
||||||
// Add feeds/messages actions.
|
// Add feeds/messages actions.
|
||||||
actions << m_ui->m_actionOpenSelectedSourceArticlesExternally;
|
actions << m_ui->m_actionOpenSelectedSourceArticlesExternally;
|
||||||
actions << m_ui->m_actionOpenSelectedSourceArticlesInternally;
|
|
||||||
actions << m_ui->m_actionOpenSelectedMessagesInternally;
|
actions << m_ui->m_actionOpenSelectedMessagesInternally;
|
||||||
actions << m_ui->m_actionMarkAllItemsRead;
|
actions << m_ui->m_actionMarkAllItemsRead;
|
||||||
actions << m_ui->m_actionMarkSelectedItemsAsRead;
|
actions << m_ui->m_actionMarkSelectedItemsAsRead;
|
||||||
@ -362,16 +352,6 @@ void FormMain::setupIcons() {
|
|||||||
m_ui->m_actionSwitchMessageListOrientation->setIcon(icon_theme_factory->fromTheme(QSL("view-switch-layout-direction")));
|
m_ui->m_actionSwitchMessageListOrientation->setIcon(icon_theme_factory->fromTheme(QSL("view-switch-layout-direction")));
|
||||||
m_ui->m_menuShowHide->setIcon(icon_theme_factory->fromTheme(QSL("view-switch")));
|
m_ui->m_menuShowHide->setIcon(icon_theme_factory->fromTheme(QSL("view-switch")));
|
||||||
|
|
||||||
// Web browser.
|
|
||||||
m_ui->m_actionAddBrowser->setIcon(icon_theme_factory->fromTheme(QSL("list-add")));
|
|
||||||
m_ui->m_actionCloseCurrentTab->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
|
||||||
m_ui->m_actionCloseAllTabs->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
|
||||||
m_ui->m_menuCurrentTab->setIcon(icon_theme_factory->fromTheme(QSL("list-current")));
|
|
||||||
m_ui->m_menuWebSettings->setIcon(icon_theme_factory->fromTheme(QSL("application-settings")));
|
|
||||||
m_ui->m_actionWebAutoloadImages->setIcon(icon_theme_factory->fromTheme(QSL("image-generic")));
|
|
||||||
m_ui->m_actionWebEnableExternalPlugins->setIcon(icon_theme_factory->fromTheme(QSL("web-flash")));
|
|
||||||
m_ui->m_actionWebEnableJavascript->setIcon(icon_theme_factory->fromTheme(QSL("web-javascript")));
|
|
||||||
|
|
||||||
// Feeds/messages.
|
// Feeds/messages.
|
||||||
m_ui->m_menuAddItem->setIcon(icon_theme_factory->fromTheme(QSL("item-new")));
|
m_ui->m_menuAddItem->setIcon(icon_theme_factory->fromTheme(QSL("item-new")));
|
||||||
m_ui->m_actionStopRunningItemsUpdate->setIcon(icon_theme_factory->fromTheme(QSL("go-stop")));
|
m_ui->m_actionStopRunningItemsUpdate->setIcon(icon_theme_factory->fromTheme(QSL("go-stop")));
|
||||||
@ -388,7 +368,6 @@ void FormMain::setupIcons() {
|
|||||||
m_ui->m_actionMarkSelectedMessagesAsRead->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-read")));
|
m_ui->m_actionMarkSelectedMessagesAsRead->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-read")));
|
||||||
m_ui->m_actionMarkSelectedMessagesAsUnread->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread")));
|
m_ui->m_actionMarkSelectedMessagesAsUnread->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread")));
|
||||||
m_ui->m_actionSwitchImportanceOfSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-favorite")));
|
m_ui->m_actionSwitchImportanceOfSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-favorite")));
|
||||||
m_ui->m_actionOpenSelectedSourceArticlesInternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-internal")));
|
|
||||||
m_ui->m_actionOpenSelectedSourceArticlesExternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-external")));
|
m_ui->m_actionOpenSelectedSourceArticlesExternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-external")));
|
||||||
m_ui->m_actionOpenSelectedMessagesInternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-internal")));
|
m_ui->m_actionOpenSelectedMessagesInternally->setIcon(icon_theme_factory->fromTheme(QSL("item-open-internal")));
|
||||||
m_ui->m_actionSendMessageViaEmail->setIcon(icon_theme_factory->fromTheme(QSL("item-send-email")));
|
m_ui->m_actionSendMessageViaEmail->setIcon(icon_theme_factory->fromTheme(QSL("item-send-email")));
|
||||||
@ -409,11 +388,6 @@ void FormMain::setupIcons() {
|
|||||||
m_ui->m_actionAddFeedIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-feed")));
|
m_ui->m_actionAddFeedIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-feed")));
|
||||||
m_ui->m_actionAddCategoryIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-category")));
|
m_ui->m_actionAddCategoryIntoSelectedAccount->setIcon(icon_theme_factory->fromTheme(QSL("folder-category")));
|
||||||
|
|
||||||
// Setup icons for underlying components: opened web browsers...
|
|
||||||
foreach (WebBrowser *browser, WebBrowser::runningWebBrowsers()) {
|
|
||||||
browser->setupIcons();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup icons on TabWidget too.
|
// Setup icons on TabWidget too.
|
||||||
m_ui->m_tabWidget->setupIcons();
|
m_ui->m_tabWidget->setupIcons();
|
||||||
|
|
||||||
@ -508,39 +482,6 @@ void FormMain::createConnections() {
|
|||||||
connect(m_ui->m_actionReportBugBitBucket, SIGNAL(triggered()), this, SLOT(reportABugOnBitBucket()));
|
connect(m_ui->m_actionReportBugBitBucket, SIGNAL(triggered()), this, SLOT(reportABugOnBitBucket()));
|
||||||
connect(m_ui->m_actionDonate, SIGNAL(triggered()), this, SLOT(donate()));
|
connect(m_ui->m_actionDonate, SIGNAL(triggered()), this, SLOT(donate()));
|
||||||
connect(m_ui->m_actionDisplayWiki, SIGNAL(triggered()), this, SLOT(showWiki()));
|
connect(m_ui->m_actionDisplayWiki, SIGNAL(triggered()), this, SLOT(showWiki()));
|
||||||
|
|
||||||
// Menu "Web browser" connections.
|
|
||||||
connect(m_ui->m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(loadWebBrowserMenu(int)));
|
|
||||||
connect(m_ui->m_actionCloseCurrentTab, SIGNAL(triggered()), m_ui->m_tabWidget, SLOT(closeCurrentTab()));
|
|
||||||
connect(m_ui->m_actionAddBrowser, SIGNAL(triggered()), m_ui->m_tabWidget, SLOT(addEmptyBrowser()));
|
|
||||||
connect(m_ui->m_actionCloseAllTabs, SIGNAL(triggered()), m_ui->m_tabWidget, SLOT(closeAllTabsExceptCurrent()));
|
|
||||||
connect(m_ui->m_actionWebAutoloadImages, SIGNAL(toggled(bool)), WebFactory::instance(), SLOT(switchImages(bool)));
|
|
||||||
connect(m_ui->m_actionWebEnableExternalPlugins, SIGNAL(toggled(bool)), WebFactory::instance(), SLOT(switchPlugins(bool)));
|
|
||||||
connect(m_ui->m_actionWebEnableJavascript, SIGNAL(toggled(bool)), WebFactory::instance(), SLOT(switchJavascript(bool)));
|
|
||||||
|
|
||||||
connect(WebFactory::instance(), SIGNAL(imagesLoadingSwitched(bool)), m_ui->m_actionWebAutoloadImages, SLOT(setChecked(bool)));
|
|
||||||
connect(WebFactory::instance(), SIGNAL(javascriptSwitched(bool)), m_ui->m_actionWebEnableJavascript, SLOT(setChecked(bool)));
|
|
||||||
connect(WebFactory::instance(), SIGNAL(pluginsSwitched(bool)), m_ui->m_actionWebEnableExternalPlugins, SLOT(setChecked(bool)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void FormMain::loadWebBrowserMenu(int index) {
|
|
||||||
const WebBrowser *active_browser = m_ui->m_tabWidget->widget(index)->webBrowser();
|
|
||||||
|
|
||||||
m_ui->m_menuCurrentTab->clear();
|
|
||||||
|
|
||||||
if (active_browser != NULL) {
|
|
||||||
m_ui->m_menuCurrentTab->setEnabled(true);
|
|
||||||
m_ui->m_menuCurrentTab->addActions(active_browser->globalMenu());
|
|
||||||
|
|
||||||
if (m_ui->m_menuCurrentTab->actions().size() == 0) {
|
|
||||||
m_ui->m_menuCurrentTab->insertAction(NULL, m_ui->m_actionNoActions);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ui->m_menuCurrentTab->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ui->m_actionCloseCurrentTab->setEnabled(m_ui->m_tabWidget->tabBar()->tabType(index) == TabBar::Closable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::backupDatabaseSettings() {
|
void FormMain::backupDatabaseSettings() {
|
||||||
|
@ -78,9 +78,6 @@ class FormMain : public QMainWindow {
|
|||||||
void updateRecycleBinMenu();
|
void updateRecycleBinMenu();
|
||||||
void updateAccountsMenu();
|
void updateAccountsMenu();
|
||||||
|
|
||||||
// Loads web browser menu if user selects to change tabs.
|
|
||||||
void loadWebBrowserMenu(int index);
|
|
||||||
|
|
||||||
// Displays various dialogs.
|
// Displays various dialogs.
|
||||||
void backupDatabaseSettings();
|
void backupDatabaseSettings();
|
||||||
void restoreDatabaseSettings();
|
void restoreDatabaseSettings();
|
||||||
|
@ -100,30 +100,6 @@
|
|||||||
<addaction name="m_actionCleanupDatabase"/>
|
<addaction name="m_actionCleanupDatabase"/>
|
||||||
<addaction name="m_actionDownloadManager"/>
|
<addaction name="m_actionDownloadManager"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="m_menuWebBrowser">
|
|
||||||
<property name="title">
|
|
||||||
<string>&Web browser</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QMenu" name="m_menuCurrentTab">
|
|
||||||
<property name="title">
|
|
||||||
<string>&Current tab</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QMenu" name="m_menuWebSettings">
|
|
||||||
<property name="title">
|
|
||||||
<string>Settings</string>
|
|
||||||
</property>
|
|
||||||
<addaction name="m_actionWebEnableJavascript"/>
|
|
||||||
<addaction name="m_actionWebEnableExternalPlugins"/>
|
|
||||||
<addaction name="m_actionWebAutoloadImages"/>
|
|
||||||
</widget>
|
|
||||||
<addaction name="m_actionAddBrowser"/>
|
|
||||||
<addaction name="m_actionCloseCurrentTab"/>
|
|
||||||
<addaction name="m_actionCloseAllTabs"/>
|
|
||||||
<addaction name="separator"/>
|
|
||||||
<addaction name="m_menuWebSettings"/>
|
|
||||||
<addaction name="m_menuCurrentTab"/>
|
|
||||||
</widget>
|
|
||||||
<widget class="QMenu" name="m_menuFeeds">
|
<widget class="QMenu" name="m_menuFeeds">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Feeds && categories</string>
|
<string>Feeds && categories</string>
|
||||||
@ -160,7 +136,6 @@
|
|||||||
<string>&Messages</string>
|
<string>&Messages</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="m_actionOpenSelectedSourceArticlesExternally"/>
|
<addaction name="m_actionOpenSelectedSourceArticlesExternally"/>
|
||||||
<addaction name="m_actionOpenSelectedSourceArticlesInternally"/>
|
|
||||||
<addaction name="m_actionOpenSelectedMessagesInternally"/>
|
<addaction name="m_actionOpenSelectedMessagesInternally"/>
|
||||||
<addaction name="m_actionSendMessageViaEmail"/>
|
<addaction name="m_actionSendMessageViaEmail"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
@ -195,7 +170,6 @@
|
|||||||
<addaction name="m_menuFeeds"/>
|
<addaction name="m_menuFeeds"/>
|
||||||
<addaction name="m_menuMessages"/>
|
<addaction name="m_menuMessages"/>
|
||||||
<addaction name="m_menuRecycleBin"/>
|
<addaction name="m_menuRecycleBin"/>
|
||||||
<addaction name="m_menuWebBrowser"/>
|
|
||||||
<addaction name="m_menuTools"/>
|
<addaction name="m_menuTools"/>
|
||||||
<addaction name="m_menuHelp"/>
|
<addaction name="m_menuHelp"/>
|
||||||
</widget>
|
</widget>
|
||||||
@ -252,39 +226,6 @@
|
|||||||
<string notr="true">F</string>
|
<string notr="true">F</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="m_actionAddBrowser">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Add tab</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Add new web browser tab.</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">Ctrl+T</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionCloseAllTabs">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Close all tabs except current one</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Close all tabs except current one.</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionCloseCurrentTab">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Close current tab</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Close current web browser tab.</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionUpdateAllItems">
|
<action name="m_actionUpdateAllItems">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Update &all items</string>
|
<string>Update &all items</string>
|
||||||
@ -398,14 +339,6 @@
|
|||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="m_actionOpenSelectedSourceArticlesInternally">
|
|
||||||
<property name="text">
|
|
||||||
<string>Open selected source articles in &internal browser</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true"/>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionNoActions">
|
<action name="m_actionNoActions">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@ -544,39 +477,6 @@
|
|||||||
<string notr="true">M</string>
|
<string notr="true">M</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="m_actionWebEnableJavascript">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable &JavaScript</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">J</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionWebEnableExternalPlugins">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable external &plugins</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">P</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionWebAutoloadImages">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto-load &images</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string notr="true">I</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="m_actionReportBugGitHub">
|
<action name="m_actionReportBugGitHub">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Report a &bug (GitHub)...</string>
|
<string>Report a &bug (GitHub)...</string>
|
||||||
|
@ -30,9 +30,7 @@
|
|||||||
#include "miscellaneous/skinfactory.h"
|
#include "miscellaneous/skinfactory.h"
|
||||||
#include "miscellaneous/textfactory.h"
|
#include "miscellaneous/textfactory.h"
|
||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
#include "network-web/webbrowsernetworkaccessmanager.h"
|
|
||||||
#include "network-web/silentnetworkaccessmanager.h"
|
#include "network-web/silentnetworkaccessmanager.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/systemtrayicon.h"
|
#include "gui/systemtrayicon.h"
|
||||||
#include "gui/feedmessageviewer.h"
|
#include "gui/feedmessageviewer.h"
|
||||||
#include "gui/feedsview.h"
|
#include "gui/feedsview.h"
|
||||||
@ -50,6 +48,7 @@
|
|||||||
#include <QColorDialog>
|
#include <QColorDialog>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
|
#include <QFontDialog>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
|
||||||
|
|
||||||
@ -85,7 +84,6 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
|
|||||||
<< tr("Author")
|
<< tr("Author")
|
||||||
<< tr("E-mail"));
|
<< tr("E-mail"));
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
// Setup languages.
|
// Setup languages.
|
||||||
m_ui->m_treeLanguages->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
m_ui->m_treeLanguages->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
||||||
m_ui->m_treeLanguages->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
m_ui->m_treeLanguages->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
||||||
@ -98,20 +96,6 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
|
|||||||
m_ui->m_treeSkins->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
m_ui->m_treeSkins->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
|
||||||
m_ui->m_treeSkins->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
|
m_ui->m_treeSkins->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
|
||||||
m_ui->m_treeSkins->header()->setSectionResizeMode(3, QHeaderView::ResizeToContents);
|
m_ui->m_treeSkins->header()->setSectionResizeMode(3, QHeaderView::ResizeToContents);
|
||||||
#else
|
|
||||||
// Setup languages.
|
|
||||||
m_ui->m_treeLanguages->header()->setResizeMode(0, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeLanguages->header()->setResizeMode(1, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeLanguages->header()->setResizeMode(2, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeLanguages->header()->setResizeMode(3, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeLanguages->header()->setResizeMode(4, QHeaderView::ResizeToContents);
|
|
||||||
|
|
||||||
// Setup skins.
|
|
||||||
m_ui->m_treeSkins->header()->setResizeMode(0, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeSkins->header()->setResizeMode(1, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeSkins->header()->setResizeMode(2, QHeaderView::ResizeToContents);
|
|
||||||
m_ui->m_treeSkins->header()->setResizeMode(3, QHeaderView::ResizeToContents);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Establish needed connections.
|
// Establish needed connections.
|
||||||
connect(m_ui->m_buttonBox, SIGNAL(accepted()), this, SLOT(saveSettings()));
|
connect(m_ui->m_buttonBox, SIGNAL(accepted()), this, SLOT(saveSettings()));
|
||||||
@ -135,7 +119,13 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
|
|||||||
connect(m_ui->m_cmbDatabaseDriver, SIGNAL(currentIndexChanged(int)), this, SLOT(selectSqlBackend(int)));
|
connect(m_ui->m_cmbDatabaseDriver, SIGNAL(currentIndexChanged(int)), this, SLOT(selectSqlBackend(int)));
|
||||||
connect(m_ui->m_btnDownloadsTargetDirectory, SIGNAL(clicked()), this, SLOT(selectDownloadsDirectory()));
|
connect(m_ui->m_btnDownloadsTargetDirectory, SIGNAL(clicked()), this, SLOT(selectDownloadsDirectory()));
|
||||||
connect(m_ui->m_checkMysqlShowPassword, SIGNAL(toggled(bool)), this, SLOT(switchMysqlPasswordVisiblity(bool)));
|
connect(m_ui->m_checkMysqlShowPassword, SIGNAL(toggled(bool)), this, SLOT(switchMysqlPasswordVisiblity(bool)));
|
||||||
connect(m_ui->m_btnChangeNotificationColor, SIGNAL(clicked()), this, SLOT(selectNewNotificationColor()));
|
connect(m_ui->m_btnChangeMessagesFont, SIGNAL(clicked()), this, SLOT(changeMessagesFont()));
|
||||||
|
|
||||||
|
connect(m_ui->m_checkEnableNotifications, &QCheckBox::toggled, [=](bool checked) {
|
||||||
|
if (!checked) {
|
||||||
|
m_ui->m_checkEnableDBusNotifications->setChecked(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Load all settings.
|
// Load all settings.
|
||||||
loadGeneral();
|
loadGeneral();
|
||||||
@ -168,14 +158,6 @@ void FormSettings::onSkinSelected(QTreeWidgetItem *current, QTreeWidgetItem *pre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::selectNewNotificationColor() {
|
|
||||||
QColorDialog dialog(m_ui->m_lblNotificationColor->color(), this);
|
|
||||||
|
|
||||||
if (dialog.exec() == QDialog::Accepted) {
|
|
||||||
m_ui->m_lblNotificationColor->setColor(dialog.selectedColor());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FormSettings::loadDownloads() {
|
void FormSettings::loadDownloads() {
|
||||||
m_ui->m_checkOpenManagerWhenDownloadStarts->setChecked(m_settings->value(GROUP(Downloads),
|
m_ui->m_checkOpenManagerWhenDownloadStarts->setChecked(m_settings->value(GROUP(Downloads),
|
||||||
SETTING(Downloads::ShowDownloadsWhenNewDownloadStarts)).toBool());
|
SETTING(Downloads::ShowDownloadsWhenNewDownloadStarts)).toBool());
|
||||||
@ -262,8 +244,12 @@ void FormSettings::loadFeedsMessages() {
|
|||||||
m_ui->m_cmbMessagesDateTimeFormat->setCurrentIndex(index_format);
|
m_ui->m_cmbMessagesDateTimeFormat->setCurrentIndex(index_format);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ui->m_cmbMessageFontStandard->setCurrentIndex(m_ui->m_cmbMessageFontStandard->findText(m_settings->value(GROUP(Messages),
|
m_ui->m_lblMessagesFont->setText(tr("Font preview"));
|
||||||
SETTING(Messages::PreviewerFontStandard)).toString()));
|
QFont fon;
|
||||||
|
fon.fromString(m_settings->value(GROUP(Messages),
|
||||||
|
SETTING(Messages::PreviewerFontStandard)).toString());
|
||||||
|
m_ui->m_lblMessagesFont->setFont(fon);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::initializeMessageDateFormats() {
|
void FormSettings::initializeMessageDateFormats() {
|
||||||
@ -278,6 +264,17 @@ void FormSettings::initializeMessageDateFormats() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FormSettings::changeMessagesFont() {
|
||||||
|
bool ok;
|
||||||
|
QFont new_font = QFontDialog::getFont(&ok, m_ui->m_lblMessagesFont->font(),
|
||||||
|
this, tr("Select new font for message viewer"),
|
||||||
|
QFontDialog::DontUseNativeDialog);
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
m_ui->m_lblMessagesFont->setFont(new_font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void FormSettings::saveFeedsMessages() {
|
void FormSettings::saveFeedsMessages() {
|
||||||
m_settings->setValue(GROUP(Messages), Messages::KeepCursorInCenter, m_ui->m_checkKeppMessagesInTheMiddle->isChecked());
|
m_settings->setValue(GROUP(Messages), Messages::KeepCursorInCenter, m_ui->m_checkKeppMessagesInTheMiddle->isChecked());
|
||||||
m_settings->setValue(GROUP(Messages), Messages::ClearReadOnExit, m_ui->m_checkRemoveReadMessagesOnExit->isChecked());
|
m_settings->setValue(GROUP(Messages), Messages::ClearReadOnExit, m_ui->m_checkRemoveReadMessagesOnExit->isChecked());
|
||||||
@ -291,7 +288,7 @@ void FormSettings::saveFeedsMessages() {
|
|||||||
m_ui->m_cmbMessagesDateTimeFormat->itemData(m_ui->m_cmbMessagesDateTimeFormat->currentIndex()).toString());
|
m_ui->m_cmbMessagesDateTimeFormat->itemData(m_ui->m_cmbMessagesDateTimeFormat->currentIndex()).toString());
|
||||||
|
|
||||||
// Save fonts.
|
// Save fonts.
|
||||||
m_settings->setValue(GROUP(Messages), Messages::PreviewerFontStandard, m_ui->m_cmbMessageFontStandard->currentFont().family());
|
m_settings->setValue(GROUP(Messages), Messages::PreviewerFontStandard, m_ui->m_lblMessagesFont->font().toString());
|
||||||
|
|
||||||
qApp->mainForm()->tabWidget()->feedMessageViewer()->loadMessageViewerFonts();
|
qApp->mainForm()->tabWidget()->feedMessageViewer()->loadMessageViewerFonts();
|
||||||
qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->sourceModel()->updateAutoUpdateStatus();
|
qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->sourceModel()->updateAutoUpdateStatus();
|
||||||
@ -401,16 +398,10 @@ void FormSettings::onProxyTypeChanged(int index) {
|
|||||||
|
|
||||||
void FormSettings::loadBrowser() {
|
void FormSettings::loadBrowser() {
|
||||||
// Load settings of web browser GUI.
|
// Load settings of web browser GUI.
|
||||||
m_ui->m_checkMouseGestures->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::GesturesEnabled)).toBool());
|
|
||||||
m_ui->m_checkQueueTabs->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::QueueTabs)).toBool());
|
|
||||||
m_ui->m_cmbExternalBrowserPreset->addItem(tr("Opera 12 or older"), QSL("-nosession %1"));
|
m_ui->m_cmbExternalBrowserPreset->addItem(tr("Opera 12 or older"), QSL("-nosession %1"));
|
||||||
m_ui->m_txtExternalBrowserExecutable->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString());
|
m_ui->m_txtExternalBrowserExecutable->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString());
|
||||||
m_ui->m_txtExternalBrowserArguments->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString());
|
m_ui->m_txtExternalBrowserArguments->setText(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString());
|
||||||
m_ui->m_grpCustomExternalBrowser->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool());
|
m_ui->m_grpCustomExternalBrowser->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool());
|
||||||
m_ui->m_checkAutoLoadImages->setChecked(WebFactory::instance()->autoloadImages());
|
|
||||||
m_ui->m_checkEnableJavascript->setChecked(WebFactory::instance()->javascriptEnabled());
|
|
||||||
m_ui->m_checkEnablePlugins->setChecked(WebFactory::instance()->pluginsEnabled());
|
|
||||||
m_ui->m_checkRememberOpenedTabs->setChecked(m_settings->value(GROUP(Browser), SETTING(Browser::RememberBrowserTabs)).toBool());
|
|
||||||
|
|
||||||
// Load settings of e-mail.
|
// Load settings of e-mail.
|
||||||
m_ui->m_cmbExternalEmailPreset->addItem(tr("Mozilla Thunderbird"), QSL("-compose \"subject='%1',body='%2'\""));
|
m_ui->m_cmbExternalEmailPreset->addItem(tr("Mozilla Thunderbird"), QSL("-compose \"subject='%1',body='%2'\""));
|
||||||
@ -422,20 +413,13 @@ void FormSettings::loadBrowser() {
|
|||||||
void FormSettings::saveBrowser() {
|
void FormSettings::saveBrowser() {
|
||||||
// Save settings of GUI of web browser.
|
// Save settings of GUI of web browser.
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserEnabled, m_ui->m_grpCustomExternalBrowser->isChecked());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserEnabled, m_ui->m_grpCustomExternalBrowser->isChecked());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::GesturesEnabled, m_ui->m_checkMouseGestures->isChecked());
|
|
||||||
m_settings->setValue(GROUP(Browser), Browser::QueueTabs, m_ui->m_checkQueueTabs->isChecked());
|
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserExecutable, m_ui->m_txtExternalBrowserExecutable->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserExecutable, m_ui->m_txtExternalBrowserExecutable->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserArguments, m_ui->m_txtExternalBrowserArguments->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalBrowserArguments, m_ui->m_txtExternalBrowserArguments->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::RememberBrowserTabs, m_ui->m_checkRememberOpenedTabs->isChecked());
|
|
||||||
|
|
||||||
// Save settings of e-mail.
|
// Save settings of e-mail.
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text());
|
||||||
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked());
|
m_settings->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked());
|
||||||
|
|
||||||
WebFactory::instance()->switchImages(m_ui->m_checkAutoLoadImages->isChecked());
|
|
||||||
WebFactory::instance()->switchJavascript(m_ui->m_checkEnableJavascript->isChecked());
|
|
||||||
WebFactory::instance()->switchPlugins(m_ui->m_checkEnablePlugins->isChecked());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::loadProxy() {
|
void FormSettings::loadProxy() {
|
||||||
@ -463,7 +447,6 @@ void FormSettings::saveProxy() {
|
|||||||
|
|
||||||
// Reload settings for all network access managers.
|
// Reload settings for all network access managers.
|
||||||
SilentNetworkAccessManager::instance()->loadSettings();
|
SilentNetworkAccessManager::instance()->loadSettings();
|
||||||
WebBrowserNetworkAccessManager::instance()->loadSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::loadLanguage() {
|
void FormSettings::loadLanguage() {
|
||||||
@ -720,14 +703,14 @@ void FormSettings::loadInterface() {
|
|||||||
m_ui->m_checkHideWhenMinimized->setChecked(m_settings->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool());
|
m_ui->m_checkHideWhenMinimized->setChecked(m_settings->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool());
|
||||||
|
|
||||||
// Load fancy notification settings.
|
// Load fancy notification settings.
|
||||||
m_ui->m_grpNotifications->setChecked(m_settings->value(GROUP(GUI), SETTING(GUI::UseFancyNotifications)).toBool());
|
m_ui->m_checkEnableNotifications->setChecked(m_settings->value(GROUP(GUI), SETTING(GUI::EnableNotifications)).toBool());
|
||||||
m_ui->m_cmbNotificationPosition->addItem(tr("Bottom-left corner"), Qt::BottomLeftCorner);
|
|
||||||
m_ui->m_cmbNotificationPosition->addItem(tr("Top-left corner"), Qt::TopLeftCorner);
|
#if defined(Q_OS_LINUX)
|
||||||
m_ui->m_cmbNotificationPosition->addItem(tr("Bottom-right corner"), Qt::BottomRightCorner);
|
m_ui->m_checkEnableDBusNotifications->setChecked(m_settings->value(GROUP(GUI), SETTING(GUI::UseFancyNotifications)).toBool());
|
||||||
m_ui->m_cmbNotificationPosition->addItem(tr("Top-right corner"), Qt::TopRightCorner);
|
#else
|
||||||
m_ui->m_cmbNotificationPosition->setCurrentIndex(m_ui->m_cmbNotificationPosition->findData(static_cast<Qt::Corner>(m_settings->value(GROUP(GUI), SETTING(GUI::FancyNotificationsPosition)).toInt())));
|
m_ui->m_checkEnableDBusNotifications->setText(m_ui->m_checkEnableDBusNotifications->text() + tr(" (not available)"));
|
||||||
m_ui->m_grpBaseNotifications->setChecked(m_settings->value(GROUP(GUI), SETTING(GUI::EnableNotifications)).toBool());
|
m_ui->m_checkEnableDBusNotifications->setEnabled(false);
|
||||||
m_ui->m_lblNotificationColor->setColor(m_settings->value(GROUP(GUI), SETTING(GUI::NotificationBackgroundColor)).value<QColor>());
|
#endif
|
||||||
|
|
||||||
// Load settings of icon theme.
|
// Load settings of icon theme.
|
||||||
const QString current_theme = qApp->icons()->currentIconTheme();
|
const QString current_theme = qApp->icons()->currentIconTheme();
|
||||||
@ -749,15 +732,7 @@ void FormSettings::loadInterface() {
|
|||||||
m_ui->m_cmbIconTheme->setCurrentIndex(0);
|
m_ui->m_cmbIconTheme->setCurrentIndex(0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
m_ui->m_cmbIconTheme->setCurrentText(current_theme);
|
m_ui->m_cmbIconTheme->setCurrentText(current_theme);
|
||||||
#else
|
|
||||||
int theme_index = m_ui->m_cmbIconTheme->findText(current_theme);
|
|
||||||
|
|
||||||
if (theme_index >= 0) {
|
|
||||||
m_ui->m_cmbIconTheme->setCurrentIndex(theme_index);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load skin.
|
// Load skin.
|
||||||
@ -829,10 +804,8 @@ void FormSettings::saveInterface() {
|
|||||||
m_settings->setValue(GROUP(GUI), GUI::HideMainWindowWhenMinimized, m_ui->m_checkHideWhenMinimized->isChecked());
|
m_settings->setValue(GROUP(GUI), GUI::HideMainWindowWhenMinimized, m_ui->m_checkHideWhenMinimized->isChecked());
|
||||||
|
|
||||||
// Save notifications.
|
// Save notifications.
|
||||||
m_settings->setValue(GROUP(GUI), GUI::UseFancyNotifications, m_ui->m_grpNotifications->isChecked());
|
m_settings->setValue(GROUP(GUI), GUI::UseFancyNotifications, m_ui->m_checkEnableDBusNotifications->isChecked());
|
||||||
m_settings->setValue(GROUP(GUI), GUI::EnableNotifications, m_ui->m_grpBaseNotifications->isChecked());
|
m_settings->setValue(GROUP(GUI), GUI::EnableNotifications, m_ui->m_checkEnableNotifications->isChecked());
|
||||||
m_settings->setValue(GROUP(GUI), GUI::FancyNotificationsPosition, static_cast<Qt::Corner>(m_ui->m_cmbNotificationPosition->itemData(m_ui->m_cmbNotificationPosition->currentIndex()).toInt()));
|
|
||||||
m_settings->setValue(GROUP(GUI), GUI::NotificationBackgroundColor, m_ui->m_lblNotificationColor->color());
|
|
||||||
|
|
||||||
// Save selected icon theme.
|
// Save selected icon theme.
|
||||||
QString selected_icon_theme = m_ui->m_cmbIconTheme->itemData(m_ui->m_cmbIconTheme->currentIndex()).toString();
|
QString selected_icon_theme = m_ui->m_cmbIconTheme->itemData(m_ui->m_cmbIconTheme->currentIndex()).toString();
|
||||||
@ -866,7 +839,6 @@ void FormSettings::saveInterface() {
|
|||||||
|
|
||||||
qApp->mainForm()->tabWidget()->checkTabBarVisibility();
|
qApp->mainForm()->tabWidget()->checkTabBarVisibility();
|
||||||
qApp->mainForm()->tabWidget()->feedMessageViewer()->refreshVisualProperties();
|
qApp->mainForm()->tabWidget()->feedMessageViewer()->refreshVisualProperties();
|
||||||
qApp->notification()->loadSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FormSettings::eventFilter(QObject *obj, QEvent *e) {
|
bool FormSettings::eventFilter(QObject *obj, QEvent *e) {
|
||||||
|
@ -62,7 +62,6 @@ class FormSettings : public QDialog {
|
|||||||
void loadInterface();
|
void loadInterface();
|
||||||
void saveInterface();
|
void saveInterface();
|
||||||
void onSkinSelected(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
void onSkinSelected(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||||
void selectNewNotificationColor();
|
|
||||||
|
|
||||||
void loadDownloads();
|
void loadDownloads();
|
||||||
void saveDownloads();
|
void saveDownloads();
|
||||||
@ -103,6 +102,7 @@ class FormSettings : public QDialog {
|
|||||||
|
|
||||||
void loadFeedsMessages();
|
void loadFeedsMessages();
|
||||||
void initializeMessageDateFormats();
|
void initializeMessageDateFormats();
|
||||||
|
void changeMessagesFont();
|
||||||
void saveFeedsMessages();
|
void saveFeedsMessages();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -125,13 +125,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkRememberOpenedTabs">
|
|
||||||
<property name="text">
|
|
||||||
<string>Remember opened web browser tabs</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="m_pageDataStorage">
|
<widget class="QWidget" name="m_pageDataStorage">
|
||||||
@ -424,8 +417,8 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>782</width>
|
<width>100</width>
|
||||||
<height>451</height>
|
<height>30</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
@ -502,8 +495,8 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>776</width>
|
<width>167</width>
|
||||||
<height>425</height>
|
<height>219</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<layout class="QFormLayout" name="formLayout">
|
||||||
@ -613,7 +606,14 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<string>Tray area && notifications</string>
|
<string>Tray area && notifications</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QFormLayout" name="formLayout_3">
|
<layout class="QFormLayout" name="formLayout_3">
|
||||||
<item row="1" column="0" colspan="2">
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="m_checkEnableNotifications">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable notifications</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
<widget class="QGroupBox" name="m_grpTray">
|
<widget class="QGroupBox" name="m_grpTray">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Tray icon</string>
|
<string>Tray icon</string>
|
||||||
@ -642,79 +642,14 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="2">
|
<item row="0" column="1">
|
||||||
<widget class="QGroupBox" name="m_grpBaseNotifications">
|
<widget class="QCheckBox" name="m_checkEnableDBusNotifications">
|
||||||
<property name="title">
|
<property name="styleSheet">
|
||||||
<string>Enable notifications</string>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="flat">
|
<property name="text">
|
||||||
<bool>false</bool>
|
<string>Enable D-Bus notifications</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_16">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="m_grpNotifications">
|
|
||||||
<property name="title">
|
|
||||||
<string>Fancy && modern popup notifications (This uses OS native notifications via D-Bus if available.)</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QFormLayout" name="formLayout_23">
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="m_lblNotificationPosition">
|
|
||||||
<property name="text">
|
|
||||||
<string>Notification position</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QComboBox" name="m_cmbNotificationPosition"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="label_13">
|
|
||||||
<property name="text">
|
|
||||||
<string>Background color</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_17">
|
|
||||||
<item>
|
|
||||||
<widget class="ColorLabel" name="m_lblNotificationColor">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="m_btnChangeNotificationColor">
|
|
||||||
<property name="text">
|
|
||||||
<string>Change</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
@ -946,70 +881,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="m_tabInternalBrowser">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Internal web browser</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QFormLayout" name="formLayout_4">
|
|
||||||
<property name="fieldGrowthPolicy">
|
|
||||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0" colspan="2">
|
|
||||||
<widget class="QCheckBox" name="m_checkQueueTabs">
|
|
||||||
<property name="text">
|
|
||||||
<string>Queue new tabs (with hyperlinks) after the active tab</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkEnableJavascript">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable JavaScript</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkEnablePlugins">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable external plugins based on NPAPI</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="m_checkAutoLoadImages">
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto-load images</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0" colspan="2">
|
|
||||||
<widget class="QCheckBox" name="m_checkMouseGestures">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable mouse gestures</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0" colspan="2">
|
|
||||||
<widget class="QLabel" name="m_lblMouseGestures">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Mouse gestures work with middle mouse button. Possible gestures are:
|
|
||||||
• previous web page (drag mouse left),
|
|
||||||
• next web page (drag mouse right),
|
|
||||||
• reload current web page (drag mouse up),
|
|
||||||
• open new web browser tab (drag mouse down).</string>
|
|
||||||
</property>
|
|
||||||
<property name="indent">
|
|
||||||
<number>20</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="m_tabExternalBrowser">
|
<widget class="QWidget" name="m_tabExternalBrowser">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>External web browser</string>
|
<string>External web browser</string>
|
||||||
@ -1397,25 +1268,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QSpinBox" name="m_spinAutoUpdateInterval">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string> minutes</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>5</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>240</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>15</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -1477,6 +1329,19 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="TimeSpinBox" name="m_spinAutoUpdateInterval">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="accelerated">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="m_tabMessages">
|
<widget class="QWidget" name="m_tabMessages">
|
||||||
@ -1522,30 +1387,34 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Internal message browser fonts</string>
|
<string>Internal message browser fonts</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QFormLayout" name="formLayout_24">
|
<layout class="QHBoxLayout" name="horizontalLayout_16">
|
||||||
<item row="0" column="0">
|
<item>
|
||||||
<widget class="QLabel" name="label_12">
|
<widget class="QLabel" name="m_lblMessagesFont">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Standard font</string>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item>
|
||||||
<widget class="QFontComboBox" name="m_cmbMessageFontStandard">
|
<widget class="QPushButton" name="m_btnChangeMessagesFont">
|
||||||
<property name="sizePolicy">
|
<property name="text">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<string>&Change font</string>
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="editable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizeAdjustPolicy">
|
|
||||||
<enum>QComboBox::AdjustToContents</enum>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -1668,9 +1537,9 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ColorLabel</class>
|
<class>TimeSpinBox</class>
|
||||||
<extends>QLabel</extends>
|
<extends>QDoubleSpinBox</extends>
|
||||||
<header>colorlabel.h</header>
|
<header>timespinbox.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
@ -1698,11 +1567,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
<tabstop>m_cmbSelectToolBar</tabstop>
|
<tabstop>m_cmbSelectToolBar</tabstop>
|
||||||
<tabstop>m_treeLanguages</tabstop>
|
<tabstop>m_treeLanguages</tabstop>
|
||||||
<tabstop>m_tabBrowserProxy</tabstop>
|
<tabstop>m_tabBrowserProxy</tabstop>
|
||||||
<tabstop>m_checkQueueTabs</tabstop>
|
|
||||||
<tabstop>m_checkEnableJavascript</tabstop>
|
|
||||||
<tabstop>m_checkEnablePlugins</tabstop>
|
|
||||||
<tabstop>m_checkAutoLoadImages</tabstop>
|
|
||||||
<tabstop>m_checkMouseGestures</tabstop>
|
|
||||||
<tabstop>m_grpCustomExternalBrowser</tabstop>
|
<tabstop>m_grpCustomExternalBrowser</tabstop>
|
||||||
<tabstop>m_txtExternalBrowserExecutable</tabstop>
|
<tabstop>m_txtExternalBrowserExecutable</tabstop>
|
||||||
<tabstop>m_btnExternalBrowserExecutable</tabstop>
|
<tabstop>m_btnExternalBrowserExecutable</tabstop>
|
||||||
@ -1763,22 +1627,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
<connection>
|
|
||||||
<sender>m_checkAutoUpdate</sender>
|
|
||||||
<signal>toggled(bool)</signal>
|
|
||||||
<receiver>m_spinAutoUpdateInterval</receiver>
|
|
||||||
<slot>setEnabled(bool)</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>324</x>
|
|
||||||
<y>48</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>597</x>
|
|
||||||
<y>49</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
<connection>
|
||||||
<sender>m_checkMessagesDateTimeFormat</sender>
|
<sender>m_checkMessagesDateTimeFormat</sender>
|
||||||
<signal>toggled(bool)</signal>
|
<signal>toggled(bool)</signal>
|
||||||
@ -1811,38 +1659,6 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
<connection>
|
|
||||||
<sender>m_grpNotifications</sender>
|
|
||||||
<signal>toggled(bool)</signal>
|
|
||||||
<receiver>m_lblNotificationPosition</receiver>
|
|
||||||
<slot>setEnabled(bool)</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>625</x>
|
|
||||||
<y>77</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>326</x>
|
|
||||||
<y>84</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>m_grpNotifications</sender>
|
|
||||||
<signal>toggled(bool)</signal>
|
|
||||||
<receiver>m_cmbNotificationPosition</receiver>
|
|
||||||
<slot>setEnabled(bool)</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>625</x>
|
|
||||||
<y>77</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>696</x>
|
|
||||||
<y>84</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
<connection>
|
||||||
<sender>m_rbDownloadsAskEachFile</sender>
|
<sender>m_rbDownloadsAskEachFile</sender>
|
||||||
<signal>toggled(bool)</signal>
|
<signal>toggled(bool)</signal>
|
||||||
@ -1860,18 +1676,18 @@ Authors of this application are NOT responsible for lost data.</string>
|
|||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
<connection>
|
<connection>
|
||||||
<sender>m_grpBaseNotifications</sender>
|
<sender>m_checkAutoUpdate</sender>
|
||||||
<signal>toggled(bool)</signal>
|
<signal>toggled(bool)</signal>
|
||||||
<receiver>m_grpNotifications</receiver>
|
<receiver>m_spinAutoUpdateInterval</receiver>
|
||||||
<slot>setEnabled(bool)</slot>
|
<slot>setEnabled(bool)</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
||||||
<x>624</x>
|
<x>324</x>
|
||||||
<y>82</y>
|
<y>71</y>
|
||||||
</hint>
|
</hint>
|
||||||
<hint type="destinationlabel">
|
<hint type="destinationlabel">
|
||||||
<x>624</x>
|
<x>707</x>
|
||||||
<y>89</y>
|
<y>72</y>
|
||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
|
@ -1,92 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "gui/discoverfeedsbutton.h"
|
|
||||||
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "miscellaneous/iconfactory.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
#include "gui/tabwidget.h"
|
|
||||||
#include "gui/feedmessageviewer.h"
|
|
||||||
#include "gui/feedsview.h"
|
|
||||||
#include "core/feedsmodel.h"
|
|
||||||
#include "services/abstract/serviceroot.h"
|
|
||||||
|
|
||||||
#include <QVariant>
|
|
||||||
|
|
||||||
|
|
||||||
DiscoverFeedsButton::DiscoverFeedsButton(QWidget *parent) : QToolButton(parent), m_addresses(QStringList()) {
|
|
||||||
setEnabled(false);
|
|
||||||
setIcon(qApp->icons()->fromTheme(QSL("folder-feed")));
|
|
||||||
setPopupMode(QToolButton::InstantPopup);
|
|
||||||
}
|
|
||||||
|
|
||||||
DiscoverFeedsButton::~DiscoverFeedsButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::clearFeedAddresses() {
|
|
||||||
setFeedAddresses(QStringList());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::setFeedAddresses(const QStringList &addresses) {
|
|
||||||
setEnabled(!addresses.isEmpty());
|
|
||||||
setToolTip(addresses.isEmpty() ?
|
|
||||||
tr("This website does not contain any feeds.") :
|
|
||||||
tr("Click me to add feeds from this website.\nThis website contains %n feed(s).", 0, addresses.size()));
|
|
||||||
|
|
||||||
if (menu() == NULL) {
|
|
||||||
// Initialize the menu.
|
|
||||||
setMenu(new QMenu(this));
|
|
||||||
connect(menu(), SIGNAL(triggered(QAction*)), this, SLOT(linkTriggered(QAction*)));
|
|
||||||
connect(menu(), SIGNAL(aboutToShow()), this, SLOT(fillMenu()));
|
|
||||||
}
|
|
||||||
|
|
||||||
menu()->hide();
|
|
||||||
m_addresses = addresses;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::linkTriggered(QAction *action) {
|
|
||||||
const QString url = action->property("url").toString();
|
|
||||||
ServiceRoot *root = static_cast<ServiceRoot*>(action->property("root").value<void*>());
|
|
||||||
|
|
||||||
if (root->supportsFeedAdding()) {
|
|
||||||
root->addNewFeed(url);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qApp->showGuiMessage(tr("Not supported"),
|
|
||||||
tr("Given account does not support adding feeds."),
|
|
||||||
QSystemTrayIcon::Warning,
|
|
||||||
qApp->mainForm(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiscoverFeedsButton::fillMenu() {
|
|
||||||
menu()->clear();
|
|
||||||
|
|
||||||
foreach (const ServiceRoot *root, qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->sourceModel()->serviceRoots()) {
|
|
||||||
QMenu *root_menu = menu()->addMenu(root->icon(), root->title());
|
|
||||||
|
|
||||||
foreach (const QString &url, m_addresses) {
|
|
||||||
if (root->supportsFeedAdding()) {
|
|
||||||
QAction *url_action = root_menu->addAction(root->icon(), url);
|
|
||||||
|
|
||||||
url_action->setProperty("url", url);
|
|
||||||
url_action->setProperty("root", QVariant::fromValue((void*) root));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -29,7 +29,6 @@
|
|||||||
#include "services/standard/standardserviceroot.h"
|
#include "services/standard/standardserviceroot.h"
|
||||||
#include "services/standard/standardfeed.h"
|
#include "services/standard/standardfeed.h"
|
||||||
#include "services/standard/standardfeedsimportexportmodel.h"
|
#include "services/standard/standardfeedsimportexportmodel.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/messagesview.h"
|
#include "gui/messagesview.h"
|
||||||
#include "gui/feedsview.h"
|
#include "gui/feedsview.h"
|
||||||
#include "gui/statusbar.h"
|
#include "gui/statusbar.h"
|
||||||
@ -37,6 +36,7 @@
|
|||||||
#include "gui/messagebox.h"
|
#include "gui/messagebox.h"
|
||||||
#include "gui/messagestoolbar.h"
|
#include "gui/messagestoolbar.h"
|
||||||
#include "gui/feedstoolbar.h"
|
#include "gui/feedstoolbar.h"
|
||||||
|
#include "gui/messagepreviewer.h"
|
||||||
#include "gui/dialogs/formdatabasecleanup.h"
|
#include "gui/dialogs/formdatabasecleanup.h"
|
||||||
#include "gui/dialogs/formmain.h"
|
#include "gui/dialogs/formmain.h"
|
||||||
#include "exceptions/applicationexception.h"
|
#include "exceptions/applicationexception.h"
|
||||||
@ -64,7 +64,7 @@ FeedMessageViewer::FeedMessageViewer(QWidget *parent)
|
|||||||
m_toolBarMessages(new MessagesToolBar(tr("Toolbar for messages"), this)),
|
m_toolBarMessages(new MessagesToolBar(tr("Toolbar for messages"), this)),
|
||||||
m_messagesView(new MessagesView(this)),
|
m_messagesView(new MessagesView(this)),
|
||||||
m_feedsView(new FeedsView(this)),
|
m_feedsView(new FeedsView(this)),
|
||||||
m_messagesBrowser(new WebBrowser(this)) {
|
m_messagesBrowser(new MessagePreviewer(this)) {
|
||||||
initialize();
|
initialize();
|
||||||
initializeViews();
|
initializeViews();
|
||||||
loadMessageViewerFonts();
|
loadMessageViewerFonts();
|
||||||
@ -116,12 +116,14 @@ void FeedMessageViewer::loadSize() {
|
|||||||
default_msg_section_size).toInt());
|
default_msg_section_size).toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedMessageViewer::loadMessageViewerFonts() {
|
void FeedMessageViewer::loadMessageViewerFonts() {
|
||||||
const Settings *settings = qApp->settings();
|
m_messagesBrowser->reloadFontSettings();
|
||||||
QWebSettings *view_settings = m_messagesBrowser->view()->settings();
|
|
||||||
|
// TODO: TODO
|
||||||
view_settings->setFontFamily(QWebSettings::StandardFont, settings->value(GROUP(Messages),
|
//QWebEngineSettings *view_settings = m_messagesBrowser->view()->settings();
|
||||||
SETTING(Messages::PreviewerFontStandard)).toString());
|
|
||||||
|
//view_settings->setFontFamily(QWebEngineSettings::StandardFont, settings->value(GROUP(Messages),
|
||||||
|
// SETTING(Messages::PreviewerFontStandard)).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedMessageViewer::quit() {
|
void FeedMessageViewer::quit() {
|
||||||
@ -192,7 +194,6 @@ void FeedMessageViewer::updateMessageButtonsAvailability() {
|
|||||||
form_main->m_ui->m_actionMarkSelectedMessagesAsUnread->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionMarkSelectedMessagesAsUnread->setEnabled(atleast_one_message_selected);
|
||||||
form_main->m_ui->m_actionOpenSelectedMessagesInternally->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionOpenSelectedMessagesInternally->setEnabled(atleast_one_message_selected);
|
||||||
form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally->setEnabled(atleast_one_message_selected);
|
||||||
form_main->m_ui->m_actionOpenSelectedSourceArticlesInternally->setEnabled(atleast_one_message_selected);
|
|
||||||
form_main->m_ui->m_actionSendMessageViaEmail->setEnabled(one_message_selected);
|
form_main->m_ui->m_actionSendMessageViaEmail->setEnabled(one_message_selected);
|
||||||
form_main->m_ui->m_actionSwitchImportanceOfSelectedMessages->setEnabled(atleast_one_message_selected);
|
form_main->m_ui->m_actionSwitchImportanceOfSelectedMessages->setEnabled(atleast_one_message_selected);
|
||||||
}
|
}
|
||||||
@ -238,11 +239,13 @@ void FeedMessageViewer::createConnections() {
|
|||||||
connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::MessageHighlighter)), m_messagesView, SLOT(filterMessages(MessagesModel::MessageHighlighter)));
|
connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::MessageHighlighter)), m_messagesView, SLOT(filterMessages(MessagesModel::MessageHighlighter)));
|
||||||
|
|
||||||
// Message changers.
|
// Message changers.
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), m_messagesBrowser, SLOT(clear()));
|
connect(m_messagesView, SIGNAL(currentMessageRemoved()), m_messagesBrowser, SLOT(clear()));
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), m_messagesBrowser, SLOT(navigateToMessages(QList<Message>)));
|
connect(m_messagesView, SIGNAL(currentMessageChanged(Message,RootItem*)), m_messagesBrowser, SLOT(loadMessage(Message,RootItem*)));
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), this, SLOT(updateMessageButtonsAvailability()));
|
connect(m_messagesView, SIGNAL(currentMessageRemoved()), this, SLOT(updateMessageButtonsAvailability()));
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), this, SLOT(updateMessageButtonsAvailability()));
|
connect(m_messagesView, SIGNAL(currentMessageChanged(Message,RootItem*)), this, SLOT(updateMessageButtonsAvailability()));
|
||||||
|
connect(m_messagesBrowser, SIGNAL(requestMessageListReload(bool)), m_messagesView, SLOT(reloadSelections(bool)));
|
||||||
|
|
||||||
|
|
||||||
connect(m_feedsView, SIGNAL(itemSelected(RootItem*)), this, SLOT(updateFeedButtonsAvailability()));
|
connect(m_feedsView, SIGNAL(itemSelected(RootItem*)), this, SLOT(updateFeedButtonsAvailability()));
|
||||||
connect(qApp->feedUpdateLock(), SIGNAL(locked()), this, SLOT(updateFeedButtonsAvailability()));
|
connect(qApp->feedUpdateLock(), SIGNAL(locked()), this, SLOT(updateFeedButtonsAvailability()));
|
||||||
connect(qApp->feedUpdateLock(), SIGNAL(unlocked()), this, SLOT(updateFeedButtonsAvailability()));
|
connect(qApp->feedUpdateLock(), SIGNAL(unlocked()), this, SLOT(updateFeedButtonsAvailability()));
|
||||||
@ -252,18 +255,16 @@ void FeedMessageViewer::createConnections() {
|
|||||||
|
|
||||||
// State of many messages is changed, then we need
|
// State of many messages is changed, then we need
|
||||||
// to reload selections.
|
// to reload selections.
|
||||||
connect(m_feedsView->sourceModel(), SIGNAL(reloadMessageListRequested(bool)), m_messagesView, SLOT(reloadSelections(bool)));
|
connect(m_feedsView->sourceModel(), SIGNAL(reloadMessageListRequested(bool)),
|
||||||
|
m_messagesView, SLOT(reloadSelections(bool)));
|
||||||
connect(m_feedsView->sourceModel(), SIGNAL(feedsUpdateFinished()), this, SLOT(onFeedsUpdateFinished()));
|
connect(m_feedsView->sourceModel(), SIGNAL(feedsUpdateFinished()), this, SLOT(onFeedsUpdateFinished()));
|
||||||
connect(m_feedsView->sourceModel(), SIGNAL(feedsUpdateStarted()), this, SLOT(onFeedsUpdateStarted()));
|
connect(m_feedsView->sourceModel(), SIGNAL(feedsUpdateStarted()), this, SLOT(onFeedsUpdateStarted()));
|
||||||
|
|
||||||
// Message openers.
|
// Message openers.
|
||||||
connect(m_messagesView, SIGNAL(openLinkMiniBrowser(QString)), m_messagesBrowser, SLOT(navigateToUrl(QString)));
|
connect(m_messagesView, SIGNAL(openMessagesInNewspaperView(RootItem*,QList<Message>)),
|
||||||
connect(m_messagesView, SIGNAL(openMessagesInNewspaperView(QList<Message>)),
|
m_messagesView, SLOT(createNewspaperView(RootItem*,QList<Message>)));
|
||||||
form_main->m_ui->m_tabWidget, SLOT(addBrowserWithMessages(QList<Message>)));
|
connect(m_feedsView, SIGNAL(openMessagesInNewspaperView(RootItem*,QList<Message>)),
|
||||||
connect(m_messagesView, SIGNAL(openLinkNewTab(QString)),
|
m_messagesView, SLOT(createNewspaperView(RootItem*,QList<Message>)));
|
||||||
form_main->m_ui->m_tabWidget, SLOT(addLinkedBrowser(QString)));
|
|
||||||
connect(m_feedsView, SIGNAL(openMessagesInNewspaperView(QList<Message>)),
|
|
||||||
form_main->m_ui->m_tabWidget, SLOT(addBrowserWithMessages(QList<Message>)));
|
|
||||||
|
|
||||||
// Toolbar forwardings.
|
// Toolbar forwardings.
|
||||||
connect(form_main->m_ui->m_actionAddFeedIntoSelectedAccount, SIGNAL(triggered()),
|
connect(form_main->m_ui->m_actionAddFeedIntoSelectedAccount, SIGNAL(triggered()),
|
||||||
@ -282,8 +283,6 @@ void FeedMessageViewer::createConnections() {
|
|||||||
SIGNAL(triggered()), m_messagesView, SLOT(markSelectedMessagesUnread()));
|
SIGNAL(triggered()), m_messagesView, SLOT(markSelectedMessagesUnread()));
|
||||||
connect(form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
connect(form_main->m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesExternally()));
|
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesExternally()));
|
||||||
connect(form_main->m_ui->m_actionOpenSelectedSourceArticlesInternally,
|
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedSourceMessagesInternally()));
|
|
||||||
connect(form_main->m_ui->m_actionOpenSelectedMessagesInternally,
|
connect(form_main->m_ui->m_actionOpenSelectedMessagesInternally,
|
||||||
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedMessagesInternally()));
|
SIGNAL(triggered()), m_messagesView, SLOT(openSelectedMessagesInternally()));
|
||||||
connect(form_main->m_ui->m_actionSendMessageViaEmail,
|
connect(form_main->m_ui->m_actionSendMessageViaEmail,
|
||||||
@ -351,10 +350,7 @@ void FeedMessageViewer::initialize() {
|
|||||||
m_toolBarMessages->setMovable(false);
|
m_toolBarMessages->setMovable(false);
|
||||||
m_toolBarMessages->setAllowedAreas(Qt::TopToolBarArea);
|
m_toolBarMessages->setAllowedAreas(Qt::TopToolBarArea);
|
||||||
m_toolBarMessages->loadChangeableActions();
|
m_toolBarMessages->loadChangeableActions();
|
||||||
|
|
||||||
// Finish web/message browser setup.
|
|
||||||
m_messagesBrowser->setNavigationBarVisible(false);
|
|
||||||
|
|
||||||
// Now refresh visual setup.
|
// Now refresh visual setup.
|
||||||
refreshVisualProperties();
|
refreshVisualProperties();
|
||||||
}
|
}
|
||||||
|
@ -23,11 +23,14 @@
|
|||||||
#include "core/messagesmodel.h"
|
#include "core/messagesmodel.h"
|
||||||
#include "core/feeddownloader.h"
|
#include "core/feeddownloader.h"
|
||||||
|
|
||||||
|
#include <QTextBrowser>
|
||||||
|
|
||||||
|
|
||||||
class WebBrowser;
|
class WebBrowser;
|
||||||
class MessagesView;
|
class MessagesView;
|
||||||
class MessagesToolBar;
|
class MessagesToolBar;
|
||||||
class FeedsToolBar;
|
class FeedsToolBar;
|
||||||
|
class MessagePreviewer;
|
||||||
class FeedsView;
|
class FeedsView;
|
||||||
class StandardFeed;
|
class StandardFeed;
|
||||||
class QToolBar;
|
class QToolBar;
|
||||||
@ -44,7 +47,7 @@ class FeedMessageViewer : public TabContent {
|
|||||||
|
|
||||||
// WebBrowser getter from TabContent interface.
|
// WebBrowser getter from TabContent interface.
|
||||||
inline WebBrowser *webBrowser() const {
|
inline WebBrowser *webBrowser() const {
|
||||||
return m_messagesBrowser;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FeedsView getter.
|
// FeedsView getter.
|
||||||
@ -131,7 +134,7 @@ class FeedMessageViewer : public TabContent {
|
|||||||
FeedsView *m_feedsView;
|
FeedsView *m_feedsView;
|
||||||
QWidget *m_feedsWidget;
|
QWidget *m_feedsWidget;
|
||||||
QWidget *m_messagesWidget;
|
QWidget *m_messagesWidget;
|
||||||
WebBrowser *m_messagesBrowser;
|
MessagePreviewer *m_messagesBrowser;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FEEDMESSAGEVIEWER_H
|
#endif // FEEDMESSAGEVIEWER_H
|
||||||
|
@ -319,11 +319,11 @@ void FeedsView::markAllItemsRead() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FeedsView::openSelectedItemsInNewspaperMode() {
|
void FeedsView::openSelectedItemsInNewspaperMode() {
|
||||||
const QList<Message> messages = m_sourceModel->messagesForItem(selectedItem());
|
RootItem *selected_item = selectedItem();
|
||||||
|
const QList<Message> messages = m_sourceModel->messagesForItem(selected_item);
|
||||||
|
|
||||||
if (!messages.isEmpty()) {
|
if (!messages.isEmpty()) {
|
||||||
emit openMessagesInNewspaperView(messages);
|
emit openMessagesInNewspaperView(selected_item, messages);
|
||||||
QTimer::singleShot(150, this, SLOT(markSelectedItemRead()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,15 +433,9 @@ QMenu *FeedsView::initializeContextMenuOtherItem(RootItem *clicked_item) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FeedsView::setupAppearance() {
|
void FeedsView::setupAppearance() {
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
// Setup column resize strategies.
|
// Setup column resize strategies.
|
||||||
header()->setSectionResizeMode(FDS_MODEL_TITLE_INDEX, QHeaderView::Stretch);
|
header()->setSectionResizeMode(FDS_MODEL_TITLE_INDEX, QHeaderView::Stretch);
|
||||||
header()->setSectionResizeMode(FDS_MODEL_COUNTS_INDEX, QHeaderView::ResizeToContents);
|
header()->setSectionResizeMode(FDS_MODEL_COUNTS_INDEX, QHeaderView::ResizeToContents);
|
||||||
#else
|
|
||||||
// Setup column resize strategies.
|
|
||||||
header()->setResizeMode(FDS_MODEL_TITLE_INDEX, QHeaderView::Stretch);
|
|
||||||
header()->setResizeMode(FDS_MODEL_COUNTS_INDEX, QHeaderView::ResizeToContents);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setUniformRowHeights(true);
|
setUniformRowHeights(true);
|
||||||
setAnimated(true);
|
setAnimated(true);
|
||||||
|
@ -99,7 +99,7 @@ class FeedsView : public QTreeView {
|
|||||||
void itemSelected(RootItem *item);
|
void itemSelected(RootItem *item);
|
||||||
|
|
||||||
// Requests opening of given messages in newspaper mode.
|
// Requests opening of given messages in newspaper mode.
|
||||||
void openMessagesInNewspaperView(const QList<Message> &messages);
|
void openMessagesInNewspaperView(RootItem *root, const QList<Message> &messages);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void markSelectedItemReadStatus(RootItem::ReadStatus read);
|
void markSelectedItemReadStatus(RootItem::ReadStatus read);
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "gui/locationlineedit.h"
|
|
||||||
|
|
||||||
#include "network-web/googlesuggest.h"
|
|
||||||
|
|
||||||
#include <QMouseEvent>
|
|
||||||
|
|
||||||
|
|
||||||
LocationLineEdit::LocationLineEdit(QWidget *parent)
|
|
||||||
: BaseLineEdit(parent), m_mouseSelectsAllText(true), m_googleSuggest(new GoogleSuggest(this)) {
|
|
||||||
setPlaceholderText(tr("Website address goes here"));
|
|
||||||
connect(this, SIGNAL(submitted(QString)), m_googleSuggest, SLOT(preventSuggest()));
|
|
||||||
}
|
|
||||||
|
|
||||||
LocationLineEdit::~LocationLineEdit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void LocationLineEdit::focusOutEvent(QFocusEvent *event) {
|
|
||||||
BaseLineEdit::focusOutEvent(event);
|
|
||||||
|
|
||||||
// User now left text box, when he enters it again and clicks,
|
|
||||||
// then all text should be selected.
|
|
||||||
m_mouseSelectsAllText = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LocationLineEdit::mousePressEvent(QMouseEvent *event) {
|
|
||||||
if (m_mouseSelectsAllText) {
|
|
||||||
event->ignore();
|
|
||||||
selectAll();
|
|
||||||
|
|
||||||
// User clicked and all text was selected.
|
|
||||||
m_mouseSelectsAllText = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
BaseLineEdit::mousePressEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
224
src/gui/messagepreviewer.cpp
Normal file
224
src/gui/messagepreviewer.cpp
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "gui/messagepreviewer.h"
|
||||||
|
|
||||||
|
#include "miscellaneous/application.h"
|
||||||
|
#include "network-web/webfactory.h"
|
||||||
|
#include "gui/messagebox.h"
|
||||||
|
#include "gui/dialogs/formmain.h"
|
||||||
|
#include "services/abstract/serviceroot.h"
|
||||||
|
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <QToolBar>
|
||||||
|
#include <QSqlQuery>
|
||||||
|
|
||||||
|
|
||||||
|
MessagePreviewer::MessagePreviewer(QWidget *parent) : QWidget(parent),
|
||||||
|
m_ui(new Ui::MessagePreviewer) {
|
||||||
|
m_ui->setupUi(this);
|
||||||
|
m_ui->m_txtMessage->viewport()->setAutoFillBackground(true);
|
||||||
|
|
||||||
|
connect(m_ui->m_txtMessage, &QTextBrowser::anchorClicked, [=](const QUrl &url) {
|
||||||
|
// User clicked some URL. Open it in external browser or download?
|
||||||
|
MessageBox box(qApp->mainForm());
|
||||||
|
|
||||||
|
box.setText(tr("You clicked link \"%1\". You can download the link contents or open it in external web browser.").arg(url.toString()));
|
||||||
|
box.setInformativeText(tr("What action do you want to take?"));
|
||||||
|
QAbstractButton *btn_open = box.addButton(tr("Open in external browser"), QMessageBox::AcceptRole);
|
||||||
|
QAbstractButton *btn_download = box.addButton(tr("Download"), QMessageBox::RejectRole);
|
||||||
|
QAbstractButton *btn_cancel = box.addButton(QMessageBox::Cancel);
|
||||||
|
|
||||||
|
box.setDefaultButton(QMessageBox::Cancel);
|
||||||
|
box.exec();
|
||||||
|
|
||||||
|
if (box.clickedButton() == btn_open) {
|
||||||
|
WebFactory::instance()->openUrlInExternalBrowser(url.toString());
|
||||||
|
}
|
||||||
|
else if (box.clickedButton() == btn_download) {
|
||||||
|
qApp->downloadManager()->download(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
btn_download->deleteLater();
|
||||||
|
btn_open->deleteLater();
|
||||||
|
btn_cancel->deleteLater();
|
||||||
|
});
|
||||||
|
|
||||||
|
m_toolBar = new QToolBar(this);
|
||||||
|
m_toolBar->setOrientation(Qt::Vertical);
|
||||||
|
m_ui->m_layout->addWidget(m_toolBar, 0, 0, -1, 1);
|
||||||
|
|
||||||
|
connect(m_actionMarkRead = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-read"), tr("Mark message as read")),
|
||||||
|
&QAction::triggered,
|
||||||
|
this,
|
||||||
|
&MessagePreviewer::markMessageAsRead);
|
||||||
|
connect(m_actionMarkUnread = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-unread"), tr("Mark message as unread")),
|
||||||
|
&QAction::triggered,
|
||||||
|
this,
|
||||||
|
&MessagePreviewer::markMessageAsUnread);
|
||||||
|
connect(m_actionSwitchImportance = m_toolBar->addAction(qApp->icons()->fromTheme("mail-mark-favorite"), tr("Switch message importance")),
|
||||||
|
&QAction::triggered,
|
||||||
|
this,
|
||||||
|
&MessagePreviewer::switchMessageImportance);
|
||||||
|
|
||||||
|
m_actionSwitchImportance->setCheckable(true);
|
||||||
|
|
||||||
|
reloadFontSettings();
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
MessagePreviewer::~MessagePreviewer() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::reloadFontSettings() {
|
||||||
|
const Settings *settings = qApp->settings();
|
||||||
|
QFont fon;
|
||||||
|
|
||||||
|
fon.fromString(settings->value(GROUP(Messages),
|
||||||
|
SETTING(Messages::PreviewerFontStandard)).toString());
|
||||||
|
|
||||||
|
m_ui->m_txtMessage->setFont(fon);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::clear() {
|
||||||
|
m_ui->m_lblTitle->clear();
|
||||||
|
m_ui->m_txtMessage->clear();
|
||||||
|
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::loadMessage(const Message &message, RootItem *root) {
|
||||||
|
m_message = message;
|
||||||
|
m_root = root;
|
||||||
|
|
||||||
|
if (!m_root.isNull()) {
|
||||||
|
updateButtons();
|
||||||
|
m_actionSwitchImportance->setChecked(m_message.m_isImportant);
|
||||||
|
|
||||||
|
m_ui->m_lblTitle->setText(m_message.m_title);
|
||||||
|
m_ui->m_txtMessage->setHtml(prepareHtmlForMessage(m_message));
|
||||||
|
|
||||||
|
updateTitle();
|
||||||
|
show();
|
||||||
|
|
||||||
|
m_ui->m_txtMessage->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::markMessageAsRead() {
|
||||||
|
if (!m_root.isNull()) {
|
||||||
|
if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(),
|
||||||
|
QList<Message>() << m_message,
|
||||||
|
RootItem::Read)) {
|
||||||
|
QSqlQuery query_read_msg(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings));
|
||||||
|
query_read_msg.setForwardOnly(true);
|
||||||
|
|
||||||
|
query_read_msg.prepare(QSL("UPDATE Messages SET is_read = :read WHERE id = :id;"));
|
||||||
|
query_read_msg.bindValue(QSL(":id"), m_message.m_id);
|
||||||
|
query_read_msg.bindValue(QSL(":read"), 1);
|
||||||
|
query_read_msg.exec();
|
||||||
|
|
||||||
|
m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(),
|
||||||
|
QList<Message>() << m_message,
|
||||||
|
RootItem::Read);
|
||||||
|
|
||||||
|
emit requestMessageListReload(false);
|
||||||
|
m_message.m_isRead = true;
|
||||||
|
updateButtons();
|
||||||
|
updateTitle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::markMessageAsUnread() {
|
||||||
|
if (!m_root.isNull()) {
|
||||||
|
if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(),
|
||||||
|
QList<Message>() << m_message,
|
||||||
|
RootItem::Unread)) {
|
||||||
|
QSqlQuery query_read_msg(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings));
|
||||||
|
query_read_msg.setForwardOnly(true);
|
||||||
|
|
||||||
|
query_read_msg.prepare(QSL("UPDATE Messages SET is_read = :read WHERE id = :id;"));
|
||||||
|
query_read_msg.bindValue(QSL(":id"), m_message.m_id);
|
||||||
|
query_read_msg.bindValue(QSL(":read"), 0);
|
||||||
|
query_read_msg.exec();
|
||||||
|
|
||||||
|
m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(),
|
||||||
|
QList<Message>() << m_message,
|
||||||
|
RootItem::Unread);
|
||||||
|
|
||||||
|
emit requestMessageListReload(false);
|
||||||
|
m_message.m_isRead = false;
|
||||||
|
updateButtons();
|
||||||
|
updateTitle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::switchMessageImportance(bool checked) {
|
||||||
|
if (!m_root.isNull()) {
|
||||||
|
if (m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(),
|
||||||
|
QList<ImportanceChange>() << ImportanceChange(m_message,
|
||||||
|
m_message.m_isImportant ?
|
||||||
|
RootItem::NotImportant :
|
||||||
|
RootItem::Important))) {
|
||||||
|
QSqlQuery query_read_msg(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings));
|
||||||
|
query_read_msg.setForwardOnly(true);
|
||||||
|
|
||||||
|
query_read_msg.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;"));
|
||||||
|
query_read_msg.bindValue(QSL(":id"), m_message.m_id);
|
||||||
|
query_read_msg.bindValue(QSL(":important"), (int) checked);
|
||||||
|
query_read_msg.exec();
|
||||||
|
|
||||||
|
m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(),
|
||||||
|
QList<ImportanceChange>() << ImportanceChange(m_message,
|
||||||
|
m_message.m_isImportant ?
|
||||||
|
RootItem::NotImportant :
|
||||||
|
RootItem::Important));
|
||||||
|
|
||||||
|
emit requestMessageListReload(false);
|
||||||
|
m_message.m_isImportant = checked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::updateButtons() {
|
||||||
|
m_actionMarkRead->setEnabled(!m_message.m_isRead);
|
||||||
|
m_actionMarkUnread->setEnabled(m_message.m_isRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagePreviewer::updateTitle() {
|
||||||
|
QFont fon = m_ui->m_lblTitle->font();
|
||||||
|
fon.setBold(!m_message.m_isRead);
|
||||||
|
m_ui->m_lblTitle->setFont(fon);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MessagePreviewer::prepareHtmlForMessage(const Message &message) {
|
||||||
|
QString html = QString("<p>[url] <a href=\"%1\">%1</a></p>").arg(message.m_url);
|
||||||
|
|
||||||
|
foreach (const Enclosure &enc, message.m_enclosures) {
|
||||||
|
html += QString("<p>[%2] <a href=\"%1\">%1</a></p>").arg(enc.m_url, enc.m_mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!message.m_enclosures.isEmpty()) {
|
||||||
|
html += "<hr/>";
|
||||||
|
}
|
||||||
|
|
||||||
|
html += message.m_contents;
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
73
src/gui/messagepreviewer.h
Normal file
73
src/gui/messagepreviewer.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef MESSAGEPREVIEWER_H
|
||||||
|
#define MESSAGEPREVIEWER_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include "ui_messagepreviewer.h"
|
||||||
|
|
||||||
|
#include "core/message.h"
|
||||||
|
#include "services/abstract/rootitem.h"
|
||||||
|
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MessagePreviewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
class QToolBar;
|
||||||
|
|
||||||
|
class MessagePreviewer : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MessagePreviewer(QWidget *parent = 0);
|
||||||
|
virtual ~MessagePreviewer();
|
||||||
|
|
||||||
|
void reloadFontSettings();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void clear();
|
||||||
|
void loadMessage(const Message &message, RootItem *root);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void markMessageAsRead();
|
||||||
|
void markMessageAsUnread();
|
||||||
|
void switchMessageImportance(bool checked);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void requestMessageListReload(bool mark_current_as_read);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updateButtons();
|
||||||
|
void updateTitle();
|
||||||
|
QString prepareHtmlForMessage(const Message &message);
|
||||||
|
|
||||||
|
QToolBar *m_toolBar;
|
||||||
|
QScopedPointer<Ui::MessagePreviewer> m_ui;
|
||||||
|
Message m_message;
|
||||||
|
QPointer<RootItem> m_root;
|
||||||
|
|
||||||
|
QAction *m_actionMarkRead;
|
||||||
|
QAction *m_actionMarkUnread;
|
||||||
|
QAction *m_actionSwitchImportance;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MESSAGEPREVIEWER_H
|
79
src/gui/messagepreviewer.ui
Normal file
79
src/gui/messagepreviewer.ui
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MessagePreviewer</class>
|
||||||
|
<widget class="QWidget" name="MessagePreviewer">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>502</width>
|
||||||
|
<height>396</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="m_layout">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="m_lblTitle">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>18</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QTextBrowser" name="m_txtMessage">
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Plain</enum>
|
||||||
|
</property>
|
||||||
|
<property name="tabChangesFocus">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="openLinks">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -24,6 +24,7 @@
|
|||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
#include "gui/dialogs/formmain.h"
|
#include "gui/dialogs/formmain.h"
|
||||||
#include "gui/messagebox.h"
|
#include "gui/messagebox.h"
|
||||||
|
#include "gui/newspaperpreviewer.h"
|
||||||
#include "gui/styleditemdelegatewithoutfocus.h"
|
#include "gui/styleditemdelegatewithoutfocus.h"
|
||||||
|
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
@ -51,7 +52,7 @@ MessagesView::~MessagesView() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MessagesView::createConnections() {
|
void MessagesView::createConnections() {
|
||||||
connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(openSelectedSourceMessagesInternallyNoNewTab()));
|
connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(openSelectedSourceMessagesExternally()));
|
||||||
|
|
||||||
// Adjust columns when layout gets changed.
|
// Adjust columns when layout gets changed.
|
||||||
connect(header(), SIGNAL(geometriesChanged()), this, SLOT(adjustColumns()));
|
connect(header(), SIGNAL(geometriesChanged()), this, SLOT(adjustColumns()));
|
||||||
@ -96,7 +97,7 @@ void MessagesView::reloadSelections(bool mark_current_index_read) {
|
|||||||
else {
|
else {
|
||||||
// Messages were probably removed from the model, nothing can
|
// Messages were probably removed from the model, nothing can
|
||||||
// be selected and no message can be displayed.
|
// be selected and no message can be displayed.
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +150,6 @@ void MessagesView::initializeContextMenu() {
|
|||||||
m_contextMenu->addActions(QList<QAction*>() <<
|
m_contextMenu->addActions(QList<QAction*>() <<
|
||||||
qApp->mainForm()->m_ui->m_actionSendMessageViaEmail <<
|
qApp->mainForm()->m_ui->m_actionSendMessageViaEmail <<
|
||||||
qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally <<
|
qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesExternally <<
|
||||||
qApp->mainForm()->m_ui->m_actionOpenSelectedSourceArticlesInternally <<
|
|
||||||
qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally <<
|
qApp->mainForm()->m_ui->m_actionOpenSelectedMessagesInternally <<
|
||||||
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead <<
|
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead <<
|
||||||
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread <<
|
qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread <<
|
||||||
@ -181,12 +181,6 @@ void MessagesView::mousePressEvent(QMouseEvent *event) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Qt::MiddleButton: {
|
|
||||||
// Open selected messages in new tab on mouse middle button click.
|
|
||||||
openSelectedSourceMessagesInternally();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -208,12 +202,13 @@ void MessagesView::selectionChanged(const QItemSelection &selected, const QItemS
|
|||||||
// Set this message as read only if current item
|
// Set this message as read only if current item
|
||||||
// wasn't changed by "mark selected messages unread" action.
|
// wasn't changed by "mark selected messages unread" action.
|
||||||
m_sourceModel->setMessageRead(mapped_current_index.row(), RootItem::Read);
|
m_sourceModel->setMessageRead(mapped_current_index.row(), RootItem::Read);
|
||||||
|
message.m_isRead = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit currentMessagesChanged(QList<Message>() << message);
|
emit currentMessageChanged(message, m_sourceModel->loadedItem());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool()) {
|
if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool()) {
|
||||||
@ -231,13 +226,11 @@ void MessagesView::loadItem(RootItem *item) {
|
|||||||
m_sourceModel->setSort(col, ord);
|
m_sourceModel->setSort(col, ord);
|
||||||
m_sourceModel->loadMessages(item);
|
m_sourceModel->loadMessages(item);
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
// Messages are loaded, make sure that previously
|
// Messages are loaded, make sure that previously
|
||||||
// active message is not shown in browser.
|
// active message is not shown in browser.
|
||||||
// BUG: Qt 5 is probably bugged here. Selections
|
// BUG: Qt 5 is probably bugged here. Selections
|
||||||
// should be cleared automatically when SQL model is reset.
|
// should be cleared automatically when SQL model is reset.
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesView::openSelectedSourceMessagesExternally() {
|
void MessagesView::openSelectedSourceMessagesExternally() {
|
||||||
@ -258,34 +251,6 @@ void MessagesView::openSelectedSourceMessagesExternally() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesView::openSelectedSourceMessagesInternally() {
|
|
||||||
foreach (const QModelIndex &index, selectionModel()->selectedRows()) {
|
|
||||||
const Message message = m_sourceModel->messageAt(m_proxyModel->mapToSource(index).row());
|
|
||||||
|
|
||||||
if (message.m_url.isEmpty()) {
|
|
||||||
MessageBox::show(this,
|
|
||||||
QMessageBox::Warning,
|
|
||||||
tr("Meesage without URL"),
|
|
||||||
tr("Message '%s' does not contain URL.").arg(message.m_title));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emit openLinkNewTab(message.m_url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally, mark opened messages as read.
|
|
||||||
if (!selectionModel()->selectedRows().isEmpty()) {
|
|
||||||
QTimer::singleShot(0, this, SLOT(markSelectedMessagesRead()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessagesView::openSelectedSourceMessagesInternallyNoNewTab() {
|
|
||||||
if (selectionModel()->selectedRows().size() == 1) {
|
|
||||||
emit openLinkMiniBrowser(
|
|
||||||
m_sourceModel->messageAt(m_proxyModel->mapToSource(selectionModel()->selectedRows().at(0)).row()).m_url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MessagesView::openSelectedMessagesInternally() {
|
void MessagesView::openSelectedMessagesInternally() {
|
||||||
QList<Message> messages;
|
QList<Message> messages;
|
||||||
|
|
||||||
@ -294,7 +259,7 @@ void MessagesView::openSelectedMessagesInternally() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!messages.isEmpty()) {
|
if (!messages.isEmpty()) {
|
||||||
emit openMessagesInNewspaperView(messages);
|
emit openMessagesInNewspaperView(m_sourceModel->loadedItem(), messages);
|
||||||
|
|
||||||
// Finally, mark opened messages as read.
|
// Finally, mark opened messages as read.
|
||||||
QTimer::singleShot(0, this, SLOT(markSelectedMessagesRead()));
|
QTimer::singleShot(0, this, SLOT(markSelectedMessagesRead()));
|
||||||
@ -374,7 +339,7 @@ void MessagesView::deleteSelectedMessages() {
|
|||||||
reselectIndexes(QModelIndexList() << last_item);
|
reselectIndexes(QModelIndexList() << last_item);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,7 +367,7 @@ void MessagesView::restoreSelectedMessages() {
|
|||||||
reselectIndexes(QModelIndexList() << last_item);
|
reselectIndexes(QModelIndexList() << last_item);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,7 +455,7 @@ void MessagesView::searchMessages(const QString &pattern) {
|
|||||||
m_proxyModel->setFilterRegExp(pattern);
|
m_proxyModel->setFilterRegExp(pattern);
|
||||||
|
|
||||||
if (selectionModel()->selectedRows().size() == 0) {
|
if (selectionModel()->selectedRows().size() == 0) {
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Scroll to selected message, it could become scrolled out due to filter change.
|
// Scroll to selected message, it could become scrolled out due to filter change.
|
||||||
@ -502,11 +467,21 @@ void MessagesView::filterMessages(MessagesModel::MessageHighlighter filter) {
|
|||||||
m_sourceModel->highlightMessages(filter);
|
m_sourceModel->highlightMessages(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MessagesView::createNewspaperView(RootItem *selected_item, const QList<Message> &messages) {
|
||||||
|
NewspaperPreviewer *prev = new NewspaperPreviewer(selected_item, messages, this);
|
||||||
|
int index = qApp->mainForm()->tabWidget()->addTab(prev,
|
||||||
|
qApp->icons()->fromTheme(QSL("item-newspaper")),
|
||||||
|
tr("Newspaper view"),
|
||||||
|
TabBar::Closable);
|
||||||
|
qApp->mainForm()->tabWidget()->setCurrentIndex(index);
|
||||||
|
|
||||||
|
connect(prev, SIGNAL(requestMessageListReload(bool)), this, SLOT(reloadSelections(bool)));
|
||||||
|
}
|
||||||
|
|
||||||
void MessagesView::adjustColumns() {
|
void MessagesView::adjustColumns() {
|
||||||
if (header()->count() > 0 && !m_columnsAdjusted) {
|
if (header()->count() > 0 && !m_columnsAdjusted) {
|
||||||
m_columnsAdjusted = true;
|
m_columnsAdjusted = true;
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
// Setup column resize strategies.
|
// Setup column resize strategies.
|
||||||
header()->setSectionResizeMode(MSG_DB_ID_INDEX, QHeaderView::Interactive);
|
header()->setSectionResizeMode(MSG_DB_ID_INDEX, QHeaderView::Interactive);
|
||||||
header()->setSectionResizeMode(MSG_DB_READ_INDEX, QHeaderView::ResizeToContents);
|
header()->setSectionResizeMode(MSG_DB_READ_INDEX, QHeaderView::ResizeToContents);
|
||||||
@ -519,20 +494,6 @@ void MessagesView::adjustColumns() {
|
|||||||
header()->setSectionResizeMode(MSG_DB_DCREATED_INDEX, QHeaderView::Interactive);
|
header()->setSectionResizeMode(MSG_DB_DCREATED_INDEX, QHeaderView::Interactive);
|
||||||
header()->setSectionResizeMode(MSG_DB_CONTENTS_INDEX, QHeaderView::Interactive);
|
header()->setSectionResizeMode(MSG_DB_CONTENTS_INDEX, QHeaderView::Interactive);
|
||||||
header()->setSectionResizeMode(MSG_DB_PDELETED_INDEX, QHeaderView::Interactive);
|
header()->setSectionResizeMode(MSG_DB_PDELETED_INDEX, QHeaderView::Interactive);
|
||||||
#else
|
|
||||||
// Setup column resize strategies.
|
|
||||||
header()->setResizeMode(MSG_DB_ID_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_READ_INDEX, QHeaderView::ResizeToContents);
|
|
||||||
header()->setResizeMode(MSG_DB_DELETED_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_IMPORTANT_INDEX, QHeaderView::ResizeToContents);
|
|
||||||
header()->setResizeMode(MSG_DB_FEED_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_TITLE_INDEX, QHeaderView::Stretch);
|
|
||||||
header()->setResizeMode(MSG_DB_URL_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_AUTHOR_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_DCREATED_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_CONTENTS_INDEX, QHeaderView::Interactive);
|
|
||||||
header()->setResizeMode(MSG_DB_PDELETED_INDEX, QHeaderView::Interactive);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Hide columns.
|
// Hide columns.
|
||||||
hideColumn(MSG_DB_ID_INDEX);
|
hideColumn(MSG_DB_ID_INDEX);
|
||||||
@ -558,5 +519,5 @@ void MessagesView::onSortIndicatorChanged(int column, Qt::SortOrder order) {
|
|||||||
|
|
||||||
// Repopulate the shit.
|
// Repopulate the shit.
|
||||||
m_sourceModel->sort(column, order);
|
m_sourceModel->sort(column, order);
|
||||||
emit currentMessagesRemoved();
|
emit currentMessageRemoved();
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,6 @@ class MessagesView : public QTreeView {
|
|||||||
|
|
||||||
// Message manipulators.
|
// Message manipulators.
|
||||||
void openSelectedSourceMessagesExternally();
|
void openSelectedSourceMessagesExternally();
|
||||||
void openSelectedSourceMessagesInternally();
|
|
||||||
void openSelectedSourceMessagesInternallyNoNewTab();
|
|
||||||
void openSelectedMessagesInternally();
|
void openSelectedMessagesInternally();
|
||||||
void sendSelectedMessageViaEmail();
|
void sendSelectedMessageViaEmail();
|
||||||
|
|
||||||
@ -80,6 +78,8 @@ class MessagesView : public QTreeView {
|
|||||||
void searchMessages(const QString &pattern);
|
void searchMessages(const QString &pattern);
|
||||||
void filterMessages(MessagesModel::MessageHighlighter filter);
|
void filterMessages(MessagesModel::MessageHighlighter filter);
|
||||||
|
|
||||||
|
void createNewspaperView(RootItem *selected_item, const QList<Message> &messages);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
// Marks given indexes as selected.
|
// Marks given indexes as selected.
|
||||||
void reselectIndexes(const QModelIndexList &indexes);
|
void reselectIndexes(const QModelIndexList &indexes);
|
||||||
@ -94,11 +94,11 @@ class MessagesView : public QTreeView {
|
|||||||
// Link/message openers.
|
// Link/message openers.
|
||||||
void openLinkNewTab(const QString &link);
|
void openLinkNewTab(const QString &link);
|
||||||
void openLinkMiniBrowser(const QString &link);
|
void openLinkMiniBrowser(const QString &link);
|
||||||
void openMessagesInNewspaperView(const QList<Message> &messages);
|
void openMessagesInNewspaperView(RootItem *root, const QList<Message> &messages);
|
||||||
|
|
||||||
// Notify others about message selections.
|
// Notify others about message selections.
|
||||||
void currentMessagesChanged(const QList<Message> &messages);
|
void currentMessageChanged(const Message &message, RootItem *root);
|
||||||
void currentMessagesRemoved();
|
void currentMessageRemoved();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Creates needed connections.
|
// Creates needed connections.
|
||||||
|
61
src/gui/newspaperpreviewer.cpp
Normal file
61
src/gui/newspaperpreviewer.cpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "gui/newspaperpreviewer.h"
|
||||||
|
|
||||||
|
#include "gui/messagepreviewer.h"
|
||||||
|
#include "gui/dialogs/formmain.h"
|
||||||
|
#include "miscellaneous/application.h"
|
||||||
|
|
||||||
|
#include <QScrollBar>
|
||||||
|
|
||||||
|
|
||||||
|
NewspaperPreviewer::NewspaperPreviewer(RootItem *root, QList<Message> messages, QWidget *parent)
|
||||||
|
: TabContent(parent), m_ui(new Ui::NewspaperPreviewer), m_root(root), m_messages(messages) {
|
||||||
|
m_ui->setupUi(this);
|
||||||
|
connect(m_ui->m_btnShowMoreMessages, SIGNAL(clicked(bool)), this, SLOT(showMoreMessages()));
|
||||||
|
showMoreMessages();
|
||||||
|
}
|
||||||
|
|
||||||
|
NewspaperPreviewer::~NewspaperPreviewer() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void NewspaperPreviewer::showMoreMessages() {
|
||||||
|
if (!m_root.isNull()) {
|
||||||
|
int current_scroll = m_ui->scrollArea->verticalScrollBar()->value();
|
||||||
|
|
||||||
|
for (int i = 0; i < 10 && !m_messages.isEmpty(); i++) {
|
||||||
|
Message msg = m_messages.takeFirst();
|
||||||
|
MessagePreviewer *prev = new MessagePreviewer(this);
|
||||||
|
|
||||||
|
connect(prev, SIGNAL(requestMessageListReload(bool)), this, SIGNAL(requestMessageListReload(bool)));
|
||||||
|
prev->setFixedHeight(300);
|
||||||
|
prev->loadMessage(msg, m_root);
|
||||||
|
m_ui->m_layout->insertWidget(m_ui->m_layout->count() - 2, prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ui->m_btnShowMoreMessages->setText(tr("Show more messages (%n remaining)", "", m_messages.size()));
|
||||||
|
m_ui->m_btnShowMoreMessages->setEnabled(!m_messages.isEmpty());
|
||||||
|
m_ui->scrollArea->verticalScrollBar()->setValue(current_scroll);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qApp->showGuiMessage(tr("Cannot show more messages"),
|
||||||
|
tr("Cannot show more messages because parent feed was removed."),
|
||||||
|
QSystemTrayIcon::Warning,
|
||||||
|
qApp->mainForm(), true);
|
||||||
|
}
|
||||||
|
}
|
103
src/gui/discoverfeedsbutton.h → src/gui/newspaperpreviewer.h
Executable file → Normal file
103
src/gui/discoverfeedsbutton.h → src/gui/newspaperpreviewer.h
Executable file → Normal file
@ -1,45 +1,58 @@
|
|||||||
// This file is part of RSS Guard.
|
// This file is part of RSS Guard.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
//
|
//
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
// (at your option) any later version.
|
// (at your option) any later version.
|
||||||
//
|
//
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
// GNU General Public License for more details.
|
// GNU General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#ifndef DISCOVERFEEDSBUTTON_H
|
#ifndef NEWSPAPERPREVIEWER_H
|
||||||
#define DISCOVERFEEDSBUTTON_H
|
#define NEWSPAPERPREVIEWER_H
|
||||||
|
|
||||||
#include <QToolButton>
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include "gui/tabcontent.h"
|
||||||
class DiscoverFeedsButton : public QToolButton {
|
|
||||||
Q_OBJECT
|
#include "ui_newspaperpreviewer.h"
|
||||||
|
|
||||||
public:
|
#include "core/message.h"
|
||||||
// Constructors.
|
#include "services/abstract/rootitem.h"
|
||||||
explicit DiscoverFeedsButton(QWidget *parent = 0);
|
|
||||||
virtual ~DiscoverFeedsButton();
|
#include <QPointer>
|
||||||
|
|
||||||
// Feed addresses manipulators.
|
|
||||||
void clearFeedAddresses();
|
namespace Ui {
|
||||||
void setFeedAddresses(const QStringList &addresses);
|
class NewspaperPreviewer;
|
||||||
|
}
|
||||||
private slots:
|
|
||||||
// User chose any of addresses.
|
class RootItem;
|
||||||
void linkTriggered(QAction *action);
|
|
||||||
void fillMenu();
|
class NewspaperPreviewer : public TabContent {
|
||||||
|
Q_OBJECT
|
||||||
private:
|
|
||||||
QStringList m_addresses;
|
public:
|
||||||
};
|
explicit NewspaperPreviewer(RootItem *root, QList<Message> messages, QWidget *parent = 0);
|
||||||
|
virtual ~NewspaperPreviewer();
|
||||||
#endif // DISCOVERFEEDSBUTTON_H
|
|
||||||
|
private slots:
|
||||||
|
void showMoreMessages();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void requestMessageListReload(bool mark_current_as_read);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QScopedPointer<Ui::NewspaperPreviewer> m_ui;
|
||||||
|
QPointer<RootItem> m_root;
|
||||||
|
QList<Message> m_messages;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // NEWSPAPERPREVIEWER_H
|
102
src/gui/newspaperpreviewer.ui
Normal file
102
src/gui/newspaperpreviewer.ui
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>NewspaperPreviewer</class>
|
||||||
|
<widget class="QWidget" name="NewspaperPreviewer">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>398</width>
|
||||||
|
<height>298</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="m_layout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="m_btnLayout">
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="m_btnShowMoreMessages">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>246</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -24,23 +24,15 @@
|
|||||||
#include "miscellaneous/textfactory.h"
|
#include "miscellaneous/textfactory.h"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <QGraphicsDropShadowEffect>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#if defined(Q_OS_MAC)
|
|
||||||
#include <Carbon/Carbon.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
#include <QtDBus>
|
#include <QtDBus>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
Notification::Notification() : QWidget(0), m_title(QString()), m_text(QString()), m_icon(QPixmap()), m_screen(-1),
|
Notification::Notification(QObject *parent) : QObject(parent), m_title(QString()), m_text(QString()), m_icon(QPixmap()),
|
||||||
m_width(-1), m_height(-1), m_padding(5), m_widgetMargin(2 * m_padding), m_timerId(0), m_clickTarget(NULL),
|
m_timerId(0), m_clickTarget(NULL), m_clickSlot(NULL) {
|
||||||
m_clickSlot(NULL) {
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
m_dBusActiveNotification = 0;
|
m_dBusActiveNotification = 0;
|
||||||
@ -62,18 +54,17 @@ Notification::Notification() : QWidget(0), m_title(QString()), m_text(QString())
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setupWidget();
|
|
||||||
loadSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Notification::~Notification() {
|
Notification::~Notification() {
|
||||||
qDebug("Destroying Notification instance.");
|
qDebug("Destroying Notification instance.");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notification::areFancyNotificationsEnabled() {
|
#if defined(Q_OS_LINUX)
|
||||||
|
bool Notification::areDBusNotificationsEnabled() {
|
||||||
return qApp->settings()->value(GROUP(GUI), SETTING(GUI::UseFancyNotifications)).toBool();
|
return qApp->settings()->value(GROUP(GUI), SETTING(GUI::UseFancyNotifications)).toBool();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool Notification::areNotificationsEnabled() {
|
bool Notification::areNotificationsEnabled() {
|
||||||
return qApp->settings()->value(GROUP(GUI), SETTING(GUI::EnableNotifications)).toBool();
|
return qApp->settings()->value(GROUP(GUI), SETTING(GUI::EnableNotifications)).toBool();
|
||||||
@ -118,17 +109,7 @@ void Notification::notify(const QString &text, const QString &title, const QIcon
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (m_clickTarget != NULL && m_clickSlot != NULL) {
|
|
||||||
// Connect invokation target.
|
|
||||||
connect(this, SIGNAL(clicked()), m_clickTarget, m_clickSlot, Qt::QueuedConnection);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show it.
|
// Show it.
|
||||||
updateGeometries();
|
|
||||||
|
|
||||||
QTimer::singleShot(20, this, SLOT(show()));
|
|
||||||
QTimer::singleShot(0, this, SLOT(repaint()));
|
|
||||||
|
|
||||||
m_timerId = startTimer(TRAY_ICON_BUBBLE_TIMEOUT);
|
m_timerId = startTimer(TRAY_ICON_BUBBLE_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,13 +119,6 @@ void Notification::notify(const QString &text, const QString &title, QSystemTray
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Notification::cancel() {
|
void Notification::cancel() {
|
||||||
hide();
|
|
||||||
|
|
||||||
if (m_clickTarget != NULL && m_clickSlot != NULL) {
|
|
||||||
// Disconnect previous bubble click signalling.
|
|
||||||
disconnect(this, SIGNAL(clicked()), m_clickTarget, m_clickSlot);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_clickSlot = NULL;
|
m_clickSlot = NULL;
|
||||||
m_clickTarget = NULL;
|
m_clickTarget = NULL;
|
||||||
|
|
||||||
@ -153,6 +127,11 @@ void Notification::cancel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Notification::timerEvent(QTimerEvent *event) {
|
||||||
|
QObject::timerEvent(event);
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
void Notification::notificationClosed(uint id, uint reason) {
|
void Notification::notificationClosed(uint id, uint reason) {
|
||||||
if (m_clickTarget != NULL && m_clickSlot != NULL && m_dBusActiveNotification == id && reason == 2) {
|
if (m_clickTarget != NULL && m_clickSlot != NULL && m_dBusActiveNotification == id && reason == 2) {
|
||||||
@ -160,162 +139,3 @@ void Notification::notificationClosed(uint id, uint reason) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Notification::updateGeometries() {
|
|
||||||
// Calculate width and height of notification with given icon and text.
|
|
||||||
QFont bold_font = font();
|
|
||||||
bold_font.setBold(true);
|
|
||||||
QFontMetrics bold_metrics(bold_font);
|
|
||||||
|
|
||||||
m_width = m_padding +
|
|
||||||
m_icon.width() + m_padding + /* contents */ qMax(TextFactory::stringWidth(m_title, bold_metrics),
|
|
||||||
TextFactory::stringWidth(m_text, fontMetrics())) +
|
|
||||||
m_padding;
|
|
||||||
m_height = m_padding +
|
|
||||||
/* contents */
|
|
||||||
qMax(m_icon.height(),
|
|
||||||
TextFactory::stringHeight(m_title, bold_metrics) + m_padding + TextFactory::stringHeight(m_text, fontMetrics())) +
|
|
||||||
m_padding;
|
|
||||||
|
|
||||||
// Calculate real position.
|
|
||||||
int x, y;
|
|
||||||
QRect screen_geometry = QApplication::desktop()->availableGeometry(m_screen);
|
|
||||||
|
|
||||||
switch (m_position) {
|
|
||||||
case Qt::BottomLeftCorner:
|
|
||||||
x = m_widgetMargin;
|
|
||||||
y = screen_geometry.height() - m_widgetMargin - m_height;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Qt::TopLeftCorner:
|
|
||||||
x = m_widgetMargin;
|
|
||||||
y = m_widgetMargin;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Qt::TopRightCorner:
|
|
||||||
x = screen_geometry.width() - m_widgetMargin - m_width;
|
|
||||||
y = m_widgetMargin;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Qt::BottomRightCorner:
|
|
||||||
default:
|
|
||||||
x = screen_geometry.width() - m_widgetMargin - m_width;
|
|
||||||
y = screen_geometry.height() - m_widgetMargin - m_height;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
setGeometry(x, y, m_width, m_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::paintEvent(QPaintEvent *event) {
|
|
||||||
Q_UNUSED(event)
|
|
||||||
|
|
||||||
QPainter painter(this);
|
|
||||||
painter.setFont(font());
|
|
||||||
|
|
||||||
if (!underMouse()) {
|
|
||||||
painter.setOpacity(0.88);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
painter.setOpacity(0.97);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw background.
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
painter.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::Qt4CompatiblePainting);
|
|
||||||
#else
|
|
||||||
painter.setRenderHints(QPainter::HighQualityAntialiasing);
|
|
||||||
#endif
|
|
||||||
painter.setBrush(m_backgroundColor);
|
|
||||||
|
|
||||||
painter.setPen(Qt::NoPen);
|
|
||||||
painter.drawRoundedRect(0, 0, width(), height(), 5.0, 5.0);
|
|
||||||
|
|
||||||
// Draw icon.
|
|
||||||
painter.drawPixmap(m_padding, m_padding, m_icon);
|
|
||||||
|
|
||||||
// Draw text.
|
|
||||||
painter.setPen(Qt::black);
|
|
||||||
|
|
||||||
// Needed heighs/widths.
|
|
||||||
int title_height = TextFactory::stringHeight(m_title, fontMetrics());
|
|
||||||
int remaining_width = width() - m_padding - m_icon.width() - m_padding /* - here comes contents */ - m_padding;
|
|
||||||
int remaining_height = height() - m_padding - title_height - m_padding /* - here comes contents */ - m_padding;
|
|
||||||
|
|
||||||
painter.drawText(m_padding + m_icon.width() + m_padding, m_padding + title_height + m_padding,
|
|
||||||
remaining_width, remaining_height,
|
|
||||||
Qt::AlignLeft, m_text);
|
|
||||||
|
|
||||||
// Draw heading.
|
|
||||||
QFont font = painter.font();
|
|
||||||
font.setBold(true);
|
|
||||||
painter.setFont(font);
|
|
||||||
|
|
||||||
painter.drawText(m_padding + m_icon.width() + m_padding, m_padding,
|
|
||||||
remaining_width, remaining_height,
|
|
||||||
Qt::AlignHCenter | Qt::AlignTop, m_title);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::mousePressEvent(QMouseEvent *event) {
|
|
||||||
QWidget::mousePressEvent(event);
|
|
||||||
emit clicked();
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::enterEvent(QEvent *event) {
|
|
||||||
QWidget::enterEvent(event);
|
|
||||||
repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::leaveEvent(QEvent *event) {
|
|
||||||
QWidget::leaveEvent(event);
|
|
||||||
repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::timerEvent(QTimerEvent *event) {
|
|
||||||
QWidget::timerEvent(event);
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::loadSettings() {
|
|
||||||
m_position = static_cast<Qt::Corner>(qApp->settings()->value(GROUP(GUI), SETTING(GUI::FancyNotificationsPosition)).toInt());
|
|
||||||
m_backgroundColor = qApp->settings()->value(GROUP(GUI), SETTING(GUI::NotificationBackgroundColor)).value<QColor>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Notification::setupWidget() {
|
|
||||||
// Set window flags.
|
|
||||||
Qt::WindowFlags window_flags = Qt::FramelessWindowHint | Qt::WindowSystemMenuHint |
|
|
||||||
Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint;
|
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
window_flags |= Qt::WindowDoesNotAcceptFocus;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (Q_OS_MAC)
|
|
||||||
window_flags |= Qt::SubWindow;
|
|
||||||
#else
|
|
||||||
window_flags |= Qt::Tool;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setWindowFlags(window_flags);
|
|
||||||
|
|
||||||
// Set widget attributes.
|
|
||||||
setAttribute(Qt::WA_TranslucentBackground);
|
|
||||||
setAttribute(Qt::WA_X11DoNotAcceptFocus);
|
|
||||||
setAttribute(Qt::WA_ShowWithoutActivating);
|
|
||||||
|
|
||||||
#if defined (Q_OS_MAC)
|
|
||||||
winId();
|
|
||||||
|
|
||||||
int setAttr[] = {kHIWindowBitDoesNotHide, kHIWindowBitDoesNotCycle, kHIWindowBitNoShadow, 0};
|
|
||||||
int clearAttr[] = {0};
|
|
||||||
HIWindowChangeAttributes(qt_mac_window_for(this), setAttr, clearAttr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Window will be meant to be on top, but should not steal focus.
|
|
||||||
setFocusPolicy(Qt::NoFocus);
|
|
||||||
|
|
||||||
QFont fon(font());
|
|
||||||
fon.setPointSize(fon.pointSize() + 5);
|
|
||||||
setFont(fon);
|
|
||||||
}
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#ifndef NOTIFICATION_H
|
#ifndef NOTIFICATION_H
|
||||||
#define NOTIFICATION_H
|
#define NOTIFICATION_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QObject>
|
||||||
|
|
||||||
#include <QSystemTrayIcon>
|
#include <QSystemTrayIcon>
|
||||||
|
|
||||||
@ -27,15 +27,18 @@
|
|||||||
class QDBusInterface;
|
class QDBusInterface;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class Notification : public QWidget {
|
// Wraps D-Bus notifications.
|
||||||
|
class Notification : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructors.
|
// Constructors.
|
||||||
explicit Notification();
|
explicit Notification(QObject *parent = 0);
|
||||||
virtual ~Notification();
|
virtual ~Notification();
|
||||||
|
|
||||||
static bool areFancyNotificationsEnabled();
|
#if defined(Q_OS_LINUX)
|
||||||
|
static bool areDBusNotificationsEnabled();
|
||||||
|
#endif
|
||||||
static bool areNotificationsEnabled();
|
static bool areNotificationsEnabled();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@ -48,42 +51,18 @@ class Notification : public QWidget {
|
|||||||
// Cancels display of the notification.
|
// Cancels display of the notification.
|
||||||
void cancel();
|
void cancel();
|
||||||
|
|
||||||
// Loads settings.
|
|
||||||
void loadSettings();
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
public slots:
|
public slots:
|
||||||
void notificationClosed(uint id, uint reason);
|
void notificationClosed(uint id, uint reason);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent *event);
|
|
||||||
void mousePressEvent(QMouseEvent *event);
|
|
||||||
void enterEvent(QEvent *event);
|
|
||||||
void leaveEvent(QEvent *event);
|
|
||||||
void timerEvent(QTimerEvent *event);
|
void timerEvent(QTimerEvent *event);
|
||||||
|
|
||||||
signals:
|
|
||||||
void clicked();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupWidget();
|
|
||||||
void updateGeometries();
|
|
||||||
|
|
||||||
QColor m_backgroundColor;
|
|
||||||
QString m_title;
|
QString m_title;
|
||||||
QString m_text;
|
QString m_text;
|
||||||
QPixmap m_icon;
|
QPixmap m_icon;
|
||||||
|
|
||||||
// Defaults to -1, which means "default" (primary) screen.
|
|
||||||
int m_screen;
|
|
||||||
Qt::Corner m_position;
|
|
||||||
|
|
||||||
// Is calculated according to contents.
|
|
||||||
int m_width;
|
|
||||||
int m_height;
|
|
||||||
int m_padding;
|
|
||||||
int m_widgetMargin;
|
|
||||||
int m_timerId;
|
int m_timerId;
|
||||||
|
|
||||||
QObject *m_clickTarget;
|
QObject *m_clickTarget;
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#include "gui/dialogs/formmain.h"
|
#include "gui/dialogs/formmain.h"
|
||||||
#include "gui/tabwidget.h"
|
#include "gui/tabwidget.h"
|
||||||
#include "gui/plaintoolbutton.h"
|
#include "gui/plaintoolbutton.h"
|
||||||
#include "network-web/adblock/adblockicon.h"
|
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
|
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
@ -33,13 +32,6 @@ StatusBar::StatusBar(QWidget *parent) : QStatusBar(parent) {
|
|||||||
setSizeGripEnabled(false);
|
setSizeGripEnabled(false);
|
||||||
setContentsMargins(2, 2, 2, 2);
|
setContentsMargins(2, 2, 2, 2);
|
||||||
|
|
||||||
m_adBlockIcon = new AdBlockIcon(this);
|
|
||||||
m_adBlockIcon->activate();
|
|
||||||
m_adBlockIcon->setObjectName(QSL("m_adBlockIcon"));
|
|
||||||
|
|
||||||
m_adBlockIconAction = new QAction(qApp->icons()->fromTheme("web-adblock"), tr("Adblock"), this);
|
|
||||||
m_adBlockIconAction->setObjectName(QSL("m_adBlockIconAction"));
|
|
||||||
|
|
||||||
m_barProgressFeeds = new QProgressBar(this);
|
m_barProgressFeeds = new QProgressBar(this);
|
||||||
m_barProgressFeeds->setTextVisible(false);
|
m_barProgressFeeds->setTextVisible(false);
|
||||||
m_barProgressFeeds->setFixedWidth(100);
|
m_barProgressFeeds->setFixedWidth(100);
|
||||||
@ -88,7 +80,7 @@ QList<QAction*> StatusBar::availableActions() const {
|
|||||||
QList<QAction*> actions = qApp->userActions();
|
QList<QAction*> actions = qApp->userActions();
|
||||||
|
|
||||||
// Now, add placeholder actions for custom stuff.
|
// Now, add placeholder actions for custom stuff.
|
||||||
actions << m_adBlockIconAction << m_barProgressDownloadAction << m_barProgressFeedsAction <<
|
actions << m_barProgressDownloadAction << m_barProgressFeedsAction <<
|
||||||
m_lblProgressDownloadAction << m_lblProgressFeedsAction;
|
m_lblProgressDownloadAction << m_lblProgressFeedsAction;
|
||||||
|
|
||||||
return actions;
|
return actions;
|
||||||
@ -121,13 +113,7 @@ void StatusBar::loadChangeableActions(const QStringList &action_names) {
|
|||||||
QAction *action_to_add;
|
QAction *action_to_add;
|
||||||
QWidget *widget_to_add;
|
QWidget *widget_to_add;
|
||||||
|
|
||||||
if (matching_action == m_adBlockIconAction) {
|
if (matching_action == m_barProgressDownloadAction) {
|
||||||
widget_to_add = m_adBlockIcon;
|
|
||||||
action_to_add = m_adBlockIconAction;
|
|
||||||
|
|
||||||
widget_to_add->setVisible(true);
|
|
||||||
}
|
|
||||||
else if (matching_action == m_barProgressDownloadAction) {
|
|
||||||
widget_to_add = m_barProgressDownload;
|
widget_to_add = m_barProgressDownload;
|
||||||
action_to_add = m_barProgressDownloadAction;
|
action_to_add = m_barProgressDownloadAction;
|
||||||
|
|
||||||
@ -170,7 +156,7 @@ void StatusBar::loadChangeableActions(const QStringList &action_names) {
|
|||||||
action_to_add->setProperty("type", SPACER_ACTION_NAME);
|
action_to_add->setProperty("type", SPACER_ACTION_NAME);
|
||||||
action_to_add->setProperty("name", tr("Toolbar spacer"));
|
action_to_add->setProperty("name", tr("Toolbar spacer"));
|
||||||
}
|
}
|
||||||
else {
|
else if (matching_action != NULL) {
|
||||||
// Add originally toolbar action.
|
// Add originally toolbar action.
|
||||||
PlainToolButton *tool_button = new PlainToolButton(this);
|
PlainToolButton *tool_button = new PlainToolButton(this);
|
||||||
tool_button->reactOnActionChange(matching_action);
|
tool_button->reactOnActionChange(matching_action);
|
||||||
@ -181,13 +167,21 @@ void StatusBar::loadChangeableActions(const QStringList &action_names) {
|
|||||||
connect(tool_button, SIGNAL(clicked(bool)), matching_action, SLOT(trigger()));
|
connect(tool_button, SIGNAL(clicked(bool)), matching_action, SLOT(trigger()));
|
||||||
connect(matching_action, SIGNAL(changed()), tool_button, SLOT(reactOnActionChange()));
|
connect(matching_action, SIGNAL(changed()), tool_button, SLOT(reactOnActionChange()));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
action_to_add = NULL;
|
||||||
|
widget_to_add = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
action_to_add->setProperty("should_remove_widget", true);
|
if (action_to_add != NULL) {
|
||||||
|
action_to_add->setProperty("should_remove_widget", true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
action_to_add->setProperty("widget", QVariant::fromValue((void*) widget_to_add));
|
if (action_to_add != NULL && widget_to_add != NULL) {
|
||||||
addPermanentWidget(widget_to_add);
|
action_to_add->setProperty("widget", QVariant::fromValue((void*) widget_to_add));
|
||||||
addAction(action_to_add);
|
addPermanentWidget(widget_to_add);
|
||||||
|
addAction(action_to_add);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
class QProgressBar;
|
class QProgressBar;
|
||||||
class PlainToolButton;
|
class PlainToolButton;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class AdBlockIcon;
|
|
||||||
|
|
||||||
class StatusBar : public QStatusBar, public BaseBar {
|
class StatusBar : public QStatusBar, public BaseBar {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -66,9 +65,6 @@ class StatusBar : public QStatusBar, public BaseBar {
|
|||||||
|
|
||||||
QLabel *m_lblProgressDownload;
|
QLabel *m_lblProgressDownload;
|
||||||
QAction *m_lblProgressDownloadAction;
|
QAction *m_lblProgressDownloadAction;
|
||||||
|
|
||||||
AdBlockIcon* m_adBlockIcon;
|
|
||||||
QAction *m_adBlockIconAction;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // STATUSBAR_H
|
#endif // STATUSBAR_H
|
||||||
|
@ -21,8 +21,6 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
|
|
||||||
class WebBrowser;
|
|
||||||
|
|
||||||
// Base class for all widgets which are placed inside tabs of TabWidget
|
// Base class for all widgets which are placed inside tabs of TabWidget
|
||||||
class TabContent : public QWidget {
|
class TabContent : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -43,10 +41,6 @@ class TabContent : public QWidget {
|
|||||||
m_index = index;
|
m_index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obtains instance contained in this TabContent or nullptr.
|
|
||||||
// This can be used for obtaining the menu from the instance and so on.
|
|
||||||
virtual WebBrowser *webBrowser() const = 0;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int m_index;
|
int m_index;
|
||||||
};
|
};
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
#include "miscellaneous/settings.h"
|
#include "miscellaneous/settings.h"
|
||||||
#include "miscellaneous/textfactory.h"
|
#include "miscellaneous/textfactory.h"
|
||||||
#include "miscellaneous/iconfactory.h"
|
#include "miscellaneous/iconfactory.h"
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "gui/tabbar.h"
|
#include "gui/tabbar.h"
|
||||||
#include "gui/feedmessageviewer.h"
|
#include "gui/feedmessageviewer.h"
|
||||||
#include "gui/plaintoolbutton.h"
|
#include "gui/plaintoolbutton.h"
|
||||||
@ -34,7 +33,6 @@
|
|||||||
|
|
||||||
TabWidget::TabWidget(QWidget *parent) : QTabWidget(parent), m_menuMain(NULL) {
|
TabWidget::TabWidget(QWidget *parent) : QTabWidget(parent), m_menuMain(NULL) {
|
||||||
setTabBar(new TabBar(this));
|
setTabBar(new TabBar(this));
|
||||||
setupCornerButton();
|
|
||||||
setupMainMenuButton();
|
setupMainMenuButton();
|
||||||
createConnections();
|
createConnections();
|
||||||
}
|
}
|
||||||
@ -43,16 +41,6 @@ TabWidget::~TabWidget() {
|
|||||||
qDebug("Destroying TabWidget instance.");
|
qDebug("Destroying TabWidget instance.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabWidget::setupCornerButton() {
|
|
||||||
m_btnAddTab = new PlainToolButton(this);
|
|
||||||
m_btnAddTab->setAutoRaise(true);
|
|
||||||
m_btnAddTab->setPadding(3);
|
|
||||||
m_btnAddTab->setToolTip(tr("Open new web browser tab."));
|
|
||||||
m_btnAddTab->setIcon(qApp->icons()->fromTheme(QSL("list-add")));
|
|
||||||
|
|
||||||
connect(m_btnAddTab, SIGNAL(clicked()), this, SLOT(addEmptyBrowser()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TabWidget::setupMainMenuButton() {
|
void TabWidget::setupMainMenuButton() {
|
||||||
m_btnMainMenu = new PlainToolButton(this);
|
m_btnMainMenu = new PlainToolButton(this);
|
||||||
m_btnMainMenu->setAutoRaise(true);
|
m_btnMainMenu->setAutoRaise(true);
|
||||||
@ -71,7 +59,6 @@ void TabWidget::openMainMenu() {
|
|||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuView);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuView);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuFeeds);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuFeeds);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuMessages);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuMessages);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuWebBrowser);
|
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuTools);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuTools);
|
||||||
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuHelp);
|
m_menuMain->addMenu(qApp->mainForm()->m_ui->m_menuHelp);
|
||||||
}
|
}
|
||||||
@ -104,17 +91,12 @@ void TabWidget::checkTabBarVisibility() {
|
|||||||
|
|
||||||
if (should_be_visible) {
|
if (should_be_visible) {
|
||||||
setCornerWidget(m_btnMainMenu, Qt::TopLeftCorner);
|
setCornerWidget(m_btnMainMenu, Qt::TopLeftCorner);
|
||||||
setCornerWidget(m_btnAddTab, Qt::TopRightCorner);
|
|
||||||
|
|
||||||
m_btnMainMenu->setVisible(true);
|
m_btnMainMenu->setVisible(true);
|
||||||
m_btnAddTab->setVisible(true);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setCornerWidget(0, Qt::TopLeftCorner);
|
setCornerWidget(0, Qt::TopLeftCorner);
|
||||||
setCornerWidget(0, Qt::TopRightCorner);
|
setCornerWidget(0, Qt::TopRightCorner);
|
||||||
|
|
||||||
m_btnMainMenu->setVisible(false);
|
m_btnMainMenu->setVisible(false);
|
||||||
m_btnAddTab->setVisible(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tabBar()->setVisible(should_be_visible);
|
tabBar()->setVisible(should_be_visible);
|
||||||
@ -158,13 +140,6 @@ void TabWidget::initializeTabs() {
|
|||||||
tr("Feeds"),
|
tr("Feeds"),
|
||||||
TabBar::FeedReader);
|
TabBar::FeedReader);
|
||||||
setTabToolTip(index_of_browser, tr("Browse your feeds and messages"));
|
setTabToolTip(index_of_browser, tr("Browse your feeds and messages"));
|
||||||
|
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::RememberBrowserTabs)).toBool()) {
|
|
||||||
foreach (const QString &url, qApp->settings()->value(GROUP(Browser), SETTING(Browser::OpenedBrowserTabs)).toString().split(QL1S("##"),
|
|
||||||
QString::SkipEmptyParts)) {
|
|
||||||
addBrowser(true, false, QUrl::fromUserInput(url));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabWidget::setupIcons() {
|
void TabWidget::setupIcons() {
|
||||||
@ -175,38 +150,6 @@ void TabWidget::setupIcons() {
|
|||||||
if (tabBar()->tabType(index) == TabBar::FeedReader) {
|
if (tabBar()->tabType(index) == TabBar::FeedReader) {
|
||||||
setTabIcon(index, qApp->icons()->fromTheme(QSL("folder-feed")));
|
setTabIcon(index, qApp->icons()->fromTheme(QSL("folder-feed")));
|
||||||
}
|
}
|
||||||
// Other indexes probably contain WebBrowsers.
|
|
||||||
else {
|
|
||||||
const WebBrowser *active_browser = widget(index)->webBrowser();
|
|
||||||
|
|
||||||
if (active_browser != NULL && active_browser->icon().isNull()) {
|
|
||||||
// We found WebBrowser instance of this tab page, which
|
|
||||||
// has no suitable icon, load a new one from the icon theme.
|
|
||||||
setTabIcon(index, qApp->icons()->fromTheme(QSL("text-html")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup corner button icon.
|
|
||||||
m_btnAddTab->setIcon(qApp->icons()->fromTheme(QSL("list-add")));
|
|
||||||
}
|
|
||||||
|
|
||||||
void TabWidget::quit() {
|
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::RememberBrowserTabs)).toBool()) {
|
|
||||||
QStringList store_urls;
|
|
||||||
|
|
||||||
for (int i = 0; i < count(); i++) {
|
|
||||||
if (tabBar()->tabType(i) == TabBar::Closable) {
|
|
||||||
// We have tab with web browser.
|
|
||||||
QUrl url = widget(i)->webBrowser()->view()->url();
|
|
||||||
|
|
||||||
if (url.isValid() && !url.isEmpty()) {
|
|
||||||
store_urls.append(url.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::OpenedBrowserTabs, store_urls.join(QSL("##")));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,69 +239,6 @@ int TabWidget::insertTab(int index, QWidget *widget, const QString &label, const
|
|||||||
return tab_index;
|
return tab_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TabWidget::addBrowserWithMessages(const QList<Message> &messages) {
|
|
||||||
const int new_index = addBrowser(false, true);
|
|
||||||
WebBrowser *browser = static_cast<WebBrowser*>(widget(new_index));
|
|
||||||
|
|
||||||
browser->setNavigationBarVisible(false);
|
|
||||||
browser->navigateToMessages(messages);
|
|
||||||
|
|
||||||
return new_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addEmptyBrowser() {
|
|
||||||
return addBrowser(false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addLinkedBrowser(const QString &initial_url) {
|
|
||||||
return addLinkedBrowser(QUrl(initial_url));
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addLinkedBrowser(const QUrl &initial_url) {
|
|
||||||
return addBrowser(qApp->settings()->value(GROUP(Browser), SETTING(Browser::QueueTabs)).toBool(), false, initial_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
int TabWidget::addBrowser(bool move_after_current, bool make_active, const QUrl &initial_url) {
|
|
||||||
// Create new WebBrowser.
|
|
||||||
WebBrowser *browser = new WebBrowser(this);
|
|
||||||
browser->setupIcons();
|
|
||||||
|
|
||||||
int final_index;
|
|
||||||
|
|
||||||
if (move_after_current) {
|
|
||||||
// Insert web browser after current tab.
|
|
||||||
final_index = insertTab(currentIndex() + 1, browser, qApp->icons()->fromTheme(QSL("text-html")),
|
|
||||||
tr("Web browser"), TabBar::Closable);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Add new browser as the last tab.
|
|
||||||
final_index = addTab(browser, qApp->icons()->fromTheme(QSL("text-html")),
|
|
||||||
//: Web browser default tab title.
|
|
||||||
tr("Web browser"),
|
|
||||||
TabBar::Closable);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make connections.
|
|
||||||
connect(browser, SIGNAL(titleChanged(int,QString)), this, SLOT(changeTitle(int,QString)));
|
|
||||||
connect(browser, SIGNAL(iconChanged(int,QIcon)), this, SLOT(changeIcon(int,QIcon)));
|
|
||||||
|
|
||||||
// Setup the tab index.
|
|
||||||
browser->setIndex(final_index);
|
|
||||||
|
|
||||||
// Load initial web page if desired.
|
|
||||||
if (initial_url.isValid()) {
|
|
||||||
browser->navigateToUrl(initial_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make new web browser active if desired.
|
|
||||||
if (make_active) {
|
|
||||||
setCurrentIndex(final_index);
|
|
||||||
browser->setFocus(Qt::OtherFocusReason);
|
|
||||||
}
|
|
||||||
|
|
||||||
return final_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TabWidget::changeIcon(int index, const QIcon &new_icon) {
|
void TabWidget::changeIcon(int index, const QIcon &new_icon) {
|
||||||
setTabIcon(index, new_icon);
|
setTabIcon(index, new_icon);
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
class QMenu;
|
class QMenu;
|
||||||
class PlainToolButton;
|
class PlainToolButton;
|
||||||
class Message;
|
class Message;
|
||||||
|
class RootItem;
|
||||||
class FeedMessageViewer;
|
class FeedMessageViewer;
|
||||||
|
|
||||||
class TabWidget : public QTabWidget {
|
class TabWidget : public QTabWidget {
|
||||||
@ -75,14 +76,11 @@ class TabWidget : public QTabWidget {
|
|||||||
return m_feedMessageViewer;
|
return m_feedMessageViewer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void quit();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Creates necesary connections.
|
// Creates necesary connections.
|
||||||
void createConnections();
|
void createConnections();
|
||||||
|
|
||||||
// Sets up properties of custom corner button.
|
// Sets up properties of custom corner button.
|
||||||
void setupCornerButton();
|
|
||||||
void setupMainMenuButton();
|
void setupMainMenuButton();
|
||||||
|
|
||||||
// Handlers of insertin/removing of tabs.
|
// Handlers of insertin/removing of tabs.
|
||||||
@ -113,22 +111,7 @@ class TabWidget : public QTabWidget {
|
|||||||
// Closes all "closable" tabs except the active tab.
|
// Closes all "closable" tabs except the active tab.
|
||||||
void closeAllTabsExceptCurrent();
|
void closeAllTabsExceptCurrent();
|
||||||
|
|
||||||
// Open single or multiple (newspaper mode) messages in new tab.
|
|
||||||
int addBrowserWithMessages(const QList<Message> &messages);
|
|
||||||
|
|
||||||
// Adds new WebBrowser tab to global TabWidget.
|
|
||||||
int addEmptyBrowser();
|
|
||||||
|
|
||||||
// Adds new WebBrowser with link. This is used when user
|
|
||||||
// selects to "Open link in new tab.".
|
|
||||||
int addLinkedBrowser(const QUrl &initial_url = QUrl());
|
|
||||||
int addLinkedBrowser(const QString &initial_url);
|
|
||||||
|
|
||||||
// General method for adding WebBrowsers.
|
|
||||||
int addBrowser(bool move_after_current, bool make_active, const QUrl &initial_url = QUrl());
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PlainToolButton *m_btnAddTab;
|
|
||||||
PlainToolButton *m_btnMainMenu;
|
PlainToolButton *m_btnMainMenu;
|
||||||
QMenu *m_menuMain;
|
QMenu *m_menuMain;
|
||||||
FeedMessageViewer *m_feedMessageViewer;
|
FeedMessageViewer *m_feedMessageViewer;
|
||||||
|
61
src/gui/timespinbox.cpp
Normal file
61
src/gui/timespinbox.cpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "gui/timespinbox.h"
|
||||||
|
|
||||||
|
|
||||||
|
TimeSpinBox::TimeSpinBox(QWidget *parent) : QDoubleSpinBox(parent) {
|
||||||
|
setMinimum(5.0);
|
||||||
|
setAccelerated(true);
|
||||||
|
setDecimals(0);
|
||||||
|
setMaximum(10000000.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeSpinBox::~TimeSpinBox() {
|
||||||
|
}
|
||||||
|
|
||||||
|
double TimeSpinBox::valueFromText(const QString &text) const {
|
||||||
|
bool ok;
|
||||||
|
double value = text.toDouble(&ok);
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TimeSpinBox::textFromValue(double val) const {
|
||||||
|
int minutes_total = (int)val;
|
||||||
|
int minutes_val = minutes_total % 60;
|
||||||
|
int hours_val = (minutes_total - minutes_val) / 60;
|
||||||
|
|
||||||
|
QString hours = tr("%n hour(s)", "", hours_val);
|
||||||
|
QString minutes = tr("%n minute(s)", "", minutes_val);
|
||||||
|
|
||||||
|
return hours + tr(" and ") + minutes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TimeSpinBox::fixup(QString &input) const {
|
||||||
|
bool ok;
|
||||||
|
double value = input.toDouble(&ok);
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
input = textFromValue(value);
|
||||||
|
}
|
||||||
|
}
|
30
src/gui/locationlineedit.h → src/gui/timespinbox.h
Executable file → Normal file
30
src/gui/locationlineedit.h → src/gui/timespinbox.h
Executable file → Normal file
@ -15,30 +15,20 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#ifndef LOCATIONLINEEDIT_H
|
#ifndef TIMESPINBOX_H
|
||||||
#define LOCATIONLINEEDIT_H
|
#define TIMESPINBOX_H
|
||||||
|
|
||||||
#include "gui/baselineedit.h"
|
#include <QDoubleSpinBox>
|
||||||
|
|
||||||
|
|
||||||
class WebBrowser;
|
class TimeSpinBox : public QDoubleSpinBox {
|
||||||
class GoogleSuggest;
|
|
||||||
|
|
||||||
class LocationLineEdit : public BaseLineEdit {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructors and destructors.
|
explicit TimeSpinBox(QWidget *parent = 0);
|
||||||
explicit LocationLineEdit(QWidget *parent = 0);
|
virtual ~TimeSpinBox();
|
||||||
virtual ~LocationLineEdit();
|
|
||||||
|
|
||||||
protected:
|
double valueFromText(const QString &text) const;
|
||||||
void focusOutEvent(QFocusEvent *event);
|
QString textFromValue(double val) const;
|
||||||
void mousePressEvent(QMouseEvent *event);
|
void fixup(QString &input) const;
|
||||||
|
|
||||||
private:
|
|
||||||
bool m_mouseSelectsAllText;
|
|
||||||
GoogleSuggest *m_googleSuggest;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LOCATIONLINEEDIT_H
|
#endif // TIMESPINBOX_H
|
@ -56,11 +56,7 @@ int main(int argc, char *argv[]) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Setup debug output system.
|
// Setup debug output system.
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
qInstallMessageHandler(Debugging::debugHandler);
|
qInstallMessageHandler(Debugging::debugHandler);
|
||||||
#else
|
|
||||||
qInstallMsgHandler(Debugging::debugHandler);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Instantiate base application object.
|
// Instantiate base application object.
|
||||||
Application application(APP_LOW_NAME, argc, argv);
|
Application application(APP_LOW_NAME, argc, argv);
|
||||||
@ -100,7 +96,7 @@ int main(int argc, char *argv[]) {
|
|||||||
main_window.setWindowTitle(APP_LONG_NAME);
|
main_window.setWindowTitle(APP_LONG_NAME);
|
||||||
|
|
||||||
// Now is a good time to initialize dynamic keyboard shortcuts.
|
// Now is a good time to initialize dynamic keyboard shortcuts.
|
||||||
DynamicShortcuts::load(qApp->userActions());
|
DynamicShortcuts::load(qApp->userActions());
|
||||||
|
|
||||||
// Display main window.
|
// Display main window.
|
||||||
if (qApp->settings()->value(GROUP(GUI), SETTING(GUI::MainWindowStartsHidden)).toBool() && SystemTrayIcon::isSystemTrayActivated()) {
|
if (qApp->settings()->value(GROUP(GUI), SETTING(GUI::MainWindowStartsHidden)).toBool() && SystemTrayIcon::isSystemTrayActivated()) {
|
||||||
@ -137,7 +133,6 @@ int main(int argc, char *argv[]) {
|
|||||||
QTimer::singleShot(STARTUP_UPDATE_DELAY, application.system(), SLOT(checkForUpdatesOnStartup()));
|
QTimer::singleShot(STARTUP_UPDATE_DELAY, application.system(), SLOT(checkForUpdatesOnStartup()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Enter global event loop.
|
// Enter global event loop.
|
||||||
return Application::exec();
|
return Application::exec();
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
#include "gui/statusbar.h"
|
#include "gui/statusbar.h"
|
||||||
#include "gui/dialogs/formmain.h"
|
#include "gui/dialogs/formmain.h"
|
||||||
#include "exceptions/applicationexception.h"
|
#include "exceptions/applicationexception.h"
|
||||||
#include "adblock/adblockmanager.h"
|
|
||||||
|
|
||||||
#include "services/abstract/serviceroot.h"
|
#include "services/abstract/serviceroot.h"
|
||||||
#include "services/standard/standardserviceroot.h"
|
#include "services/standard/standardserviceroot.h"
|
||||||
@ -220,7 +219,8 @@ void Application::showGuiMessage(const QString &title, const QString &message,
|
|||||||
bool show_at_least_msgbox, const QIcon &custom_icon,
|
bool show_at_least_msgbox, const QIcon &custom_icon,
|
||||||
QObject *invokation_target, const char *invokation_slot) {
|
QObject *invokation_target, const char *invokation_slot) {
|
||||||
if (Notification::areNotificationsEnabled()) {
|
if (Notification::areNotificationsEnabled()) {
|
||||||
if (Notification::areFancyNotificationsEnabled()) {
|
#if defined(Q_OS_LINUX)
|
||||||
|
if (Notification::areDBusNotificationsEnabled()) {
|
||||||
// Show OSD instead if tray icon bubble, depending on settings.
|
// Show OSD instead if tray icon bubble, depending on settings.
|
||||||
if (custom_icon.isNull()) {
|
if (custom_icon.isNull()) {
|
||||||
notification()->notify(message, title, message_type, invokation_target, invokation_slot);
|
notification()->notify(message, title, message_type, invokation_target, invokation_slot);
|
||||||
@ -235,6 +235,12 @@ void Application::showGuiMessage(const QString &title, const QString &message,
|
|||||||
trayIcon()->showMessage(title, message, message_type, TRAY_ICON_BUBBLE_TIMEOUT, invokation_target, invokation_slot);
|
trayIcon()->showMessage(title, message, message_type, TRAY_ICON_BUBBLE_TIMEOUT, invokation_target, invokation_slot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (SystemTrayIcon::isSystemTrayActivated()) {
|
||||||
|
trayIcon()->showMessage(title, message, message_type, TRAY_ICON_BUBBLE_TIMEOUT, invokation_target, invokation_slot);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (show_at_least_msgbox) {
|
if (show_at_least_msgbox) {
|
||||||
@ -275,11 +281,9 @@ void Application::onAboutToQuit() {
|
|||||||
system()->removeTrolltechJunkRegistryKeys();
|
system()->removeTrolltechJunkRegistryKeys();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mainForm()->tabWidget()->quit();
|
|
||||||
mainForm()->tabWidget()->feedMessageViewer()->quit();
|
mainForm()->tabWidget()->feedMessageViewer()->quit();
|
||||||
database()->saveDatabase();
|
database()->saveDatabase();
|
||||||
mainForm()->saveSize();
|
mainForm()->saveSize();
|
||||||
AdBlockManager::instance()->save();
|
|
||||||
|
|
||||||
if (locked_safely) {
|
if (locked_safely) {
|
||||||
// Application obtained permission to close in a safe way.
|
// Application obtained permission to close in a safe way.
|
||||||
|
@ -131,15 +131,15 @@ class Application : public QtSingleApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline QString tempFolderPath() {
|
inline QString tempFolderPath() {
|
||||||
return IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::TempLocation);
|
return IOFactory::getSystemFolder(QStandardPaths::TempLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QString documentsFolderPath() {
|
inline QString documentsFolderPath() {
|
||||||
return IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::DocumentsLocation);
|
return IOFactory::getSystemFolder(QStandardPaths::DocumentsLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QString homeFolderPath() {
|
inline QString homeFolderPath() {
|
||||||
return IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::HomeLocation);
|
return IOFactory::getSystemFolder(QStandardPaths::HomeLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
void backupDatabaseSettings(bool backup_database, bool backup_settings,
|
void backupDatabaseSettings(bool backup_database, bool backup_settings,
|
||||||
|
@ -62,7 +62,6 @@ const char *Debugging::typeToString(QtMsgType type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
void Debugging::debugHandler(QtMsgType type, const QMessageLogContext &placement, const QString &message) {
|
void Debugging::debugHandler(QtMsgType type, const QMessageLogContext &placement, const QString &message) {
|
||||||
#ifndef QT_NO_DEBUG_OUTPUT
|
#ifndef QT_NO_DEBUG_OUTPUT
|
||||||
performLog(qPrintable(message), type, placement.file, placement.function, placement.line);
|
performLog(qPrintable(message), type, placement.file, placement.function, placement.line);
|
||||||
@ -72,13 +71,3 @@ void Debugging::debugHandler(QtMsgType type, const QMessageLogContext &placement
|
|||||||
Q_UNUSED(message)
|
Q_UNUSED(message)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
void Debugging::debugHandler(QtMsgType type, const char *message) {
|
|
||||||
#ifndef QT_NO_DEBUG_OUTPUT
|
|
||||||
performLog(message, type);
|
|
||||||
#else
|
|
||||||
Q_UNUSED(type)
|
|
||||||
Q_UNUSED(message)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@ -25,12 +25,7 @@ class Debugging {
|
|||||||
public:
|
public:
|
||||||
// Specifies format of output console messages.
|
// Specifies format of output console messages.
|
||||||
// NOTE: QT_NO_DEBUG_OUTPUT - disables debug outputs completely!!!
|
// NOTE: QT_NO_DEBUG_OUTPUT - disables debug outputs completely!!!
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
static void debugHandler(QtMsgType type, const QMessageLogContext &placement, const QString &message);
|
static void debugHandler(QtMsgType type, const QMessageLogContext &placement, const QString &message);
|
||||||
#else
|
|
||||||
static void debugHandler(QtMsgType type, const char *message);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void performLog(const char *message, QtMsgType type, const char *file = 0, const char *function = 0, int line = -1);
|
static void performLog(const char *message, QtMsgType type, const char *file = 0, const char *function = 0, int line = -1);
|
||||||
static const char *typeToString(QtMsgType type);
|
static const char *typeToString(QtMsgType type);
|
||||||
|
|
||||||
|
@ -30,12 +30,8 @@
|
|||||||
IOFactory::IOFactory() {
|
IOFactory::IOFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::StandardLocation location) {
|
QString IOFactory::getSystemFolder(QStandardPaths::StandardLocation location) {
|
||||||
#if QT_VERSION >= 0x050000
|
return QStandardPaths::writableLocation(location);
|
||||||
return SYSTEM_FOLDER_ENUM::writableLocation(location);
|
|
||||||
#else
|
|
||||||
return SYSTEM_FOLDER_ENUM::storageLocation(location);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString IOFactory::ensureUniqueFilename(const QString &name, const QString &append_format) {
|
QString IOFactory::ensureUniqueFilename(const QString &name, const QString &append_format) {
|
||||||
|
@ -22,13 +22,7 @@
|
|||||||
|
|
||||||
#include "definitions/definitions.h"
|
#include "definitions/definitions.h"
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
#define SYSTEM_FOLDER_ENUM QStandardPaths
|
|
||||||
#else
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#define SYSTEM_FOLDER_ENUM QDesktopServices
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
class IOFactory {
|
class IOFactory {
|
||||||
@ -39,7 +33,7 @@ class IOFactory {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Returns system-wide folder according to type.
|
// Returns system-wide folder according to type.
|
||||||
static QString getSystemFolder(SYSTEM_FOLDER_ENUM::StandardLocation location);
|
static QString getSystemFolder(QStandardPaths::StandardLocation location);
|
||||||
|
|
||||||
// Checks given file if it exists and if it does, then generates non-existing new file
|
// Checks given file if it exists and if it does, then generates non-existing new file
|
||||||
// according to format.
|
// according to format.
|
||||||
|
@ -76,12 +76,7 @@ QList<Language> Localization::installedLanguages() const {
|
|||||||
new_language.m_version = translator.translate("QObject", "LANG_VERSION");
|
new_language.m_version = translator.translate("QObject", "LANG_VERSION");
|
||||||
new_language.m_author = translator.translate("QObject", "LANG_AUTHOR");
|
new_language.m_author = translator.translate("QObject", "LANG_AUTHOR");
|
||||||
new_language.m_email = translator.translate("QObject", "LANG_EMAIL");
|
new_language.m_email = translator.translate("QObject", "LANG_EMAIL");
|
||||||
|
|
||||||
#if QT_VERSION >= 0x040800
|
|
||||||
new_language.m_name = QLocale(new_language.m_code).nativeLanguageName();
|
new_language.m_name = QLocale(new_language.m_code).nativeLanguageName();
|
||||||
#else
|
|
||||||
new_language.m_name = translator.translate("QObject", "LANG_NAME");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
languages << new_language;
|
languages << new_language;
|
||||||
}
|
}
|
||||||
|
@ -19,11 +19,9 @@
|
|||||||
|
|
||||||
#include "miscellaneous/application.h"
|
#include "miscellaneous/application.h"
|
||||||
#include "miscellaneous/iofactory.h"
|
#include "miscellaneous/iofactory.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <QWebSettings>
|
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
|
|
||||||
|
|
||||||
@ -64,7 +62,7 @@ DKEY Messages::KeepCursorInCenter = "keep_cursor_center";
|
|||||||
DVALUE(bool) Messages::KeepCursorInCenterDef = false;
|
DVALUE(bool) Messages::KeepCursorInCenterDef = false;
|
||||||
|
|
||||||
DKEY Messages::PreviewerFontStandard = "previewer_font_standard";
|
DKEY Messages::PreviewerFontStandard = "previewer_font_standard";
|
||||||
NON_CONST_DVALUE(QString) Messages::PreviewerFontStandardDef = QString();
|
NON_CONST_DVALUE(QString) Messages::PreviewerFontStandardDef = QFont().toString();
|
||||||
|
|
||||||
// GUI.
|
// GUI.
|
||||||
DKEY GUI::ID = "gui";
|
DKEY GUI::ID = "gui";
|
||||||
@ -75,9 +73,6 @@ DVALUE(char*) GUI::SplitterFeedsDef = "";
|
|||||||
DKEY GUI::SplitterMessages = "splitter_messages";
|
DKEY GUI::SplitterMessages = "splitter_messages";
|
||||||
DVALUE(char*) GUI::SplitterMessagesDef = "";
|
DVALUE(char*) GUI::SplitterMessagesDef = "";
|
||||||
|
|
||||||
DKEY GUI::NotificationBackgroundColor = "notification_background_color";
|
|
||||||
DVALUE(QColor) GUI::NotificationBackgroundColorDef = QColor(220, 220, 220);
|
|
||||||
|
|
||||||
DKEY GUI::ToolbarStyle = "toolbar_style";
|
DKEY GUI::ToolbarStyle = "toolbar_style";
|
||||||
DVALUE(Qt::ToolButtonStyle) GUI::ToolbarStyleDef = Qt::ToolButtonIconOnly;
|
DVALUE(Qt::ToolButtonStyle) GUI::ToolbarStyleDef = Qt::ToolButtonIconOnly;
|
||||||
|
|
||||||
@ -85,7 +80,7 @@ DKEY GUI::FeedsToolbarActions = "feeds_toolbar";
|
|||||||
DVALUE(char*) GUI::FeedsToolbarActionsDef = "m_actionUpdateAllItems,m_actionStopRunningItemsUpdate,m_actionMarkAllItemsRead";
|
DVALUE(char*) GUI::FeedsToolbarActionsDef = "m_actionUpdateAllItems,m_actionStopRunningItemsUpdate,m_actionMarkAllItemsRead";
|
||||||
|
|
||||||
DKEY GUI::StatusbarActions = "status_bar";
|
DKEY GUI::StatusbarActions = "status_bar";
|
||||||
DVALUE(char*) GUI::StatusbarActionsDef = "m_lblProgressFeedsAction,m_barProgressFeedsAction,m_actionUpdateAllItems,m_actionUpdateSelectedItems,m_actionStopRunningItemsUpdate,m_adBlockIconAction,m_actionFullscreen,m_actionQuit";
|
DVALUE(char*) GUI::StatusbarActionsDef = "m_lblProgressFeedsAction,m_barProgressFeedsAction,m_actionUpdateAllItems,m_actionUpdateSelectedItems,m_actionStopRunningItemsUpdate,m_actionFullscreen,m_actionQuit";
|
||||||
|
|
||||||
DKEY GUI::MainWindowInitialSize = "window_size";
|
DKEY GUI::MainWindowInitialSize = "window_size";
|
||||||
DKEY GUI::MainWindowInitialPosition = "window_position";
|
DKEY GUI::MainWindowInitialPosition = "window_position";
|
||||||
@ -123,9 +118,6 @@ DVALUE(bool) GUI::EnableNotificationsDef = true;
|
|||||||
DKEY GUI::UseFancyNotifications = "use_fancy_notifications";
|
DKEY GUI::UseFancyNotifications = "use_fancy_notifications";
|
||||||
DVALUE(bool) GUI::UseFancyNotificationsDef = true;
|
DVALUE(bool) GUI::UseFancyNotificationsDef = true;
|
||||||
|
|
||||||
DKEY GUI::FancyNotificationsPosition = "fancy_notifications_position";
|
|
||||||
DVALUE(Qt::Corner) GUI::FancyNotificationsPositionDef = Qt::BottomRightCorner;
|
|
||||||
|
|
||||||
DKEY GUI::TabCloseMiddleClick = "tab_close_mid_button";
|
DKEY GUI::TabCloseMiddleClick = "tab_close_mid_button";
|
||||||
DVALUE(bool) GUI::TabCloseMiddleClickDef = true;
|
DVALUE(bool) GUI::TabCloseMiddleClickDef = true;
|
||||||
|
|
||||||
@ -181,13 +173,13 @@ DKEY Downloads::AlwaysPromptForFilename = "prompt_for_filename";
|
|||||||
DVALUE(bool) Downloads::AlwaysPromptForFilenameDef = false;
|
DVALUE(bool) Downloads::AlwaysPromptForFilenameDef = false;
|
||||||
|
|
||||||
DKEY Downloads::TargetDirectory = "target_directory";
|
DKEY Downloads::TargetDirectory = "target_directory";
|
||||||
DVALUE(QString) Downloads::TargetDirectoryDef = IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::DesktopLocation);
|
DVALUE(QString) Downloads::TargetDirectoryDef = IOFactory::getSystemFolder(QStandardPaths::DesktopLocation);
|
||||||
|
|
||||||
DKEY Downloads::RemovePolicy = "remove_policy";
|
DKEY Downloads::RemovePolicy = "remove_policy";
|
||||||
DVALUE(int) Downloads::RemovePolicyDef = DownloadManager::Never;
|
DVALUE(int) Downloads::RemovePolicyDef = DownloadManager::Never;
|
||||||
|
|
||||||
DKEY Downloads::TargetExplicitDirectory = "target_explicit_directory";
|
DKEY Downloads::TargetExplicitDirectory = "target_explicit_directory";
|
||||||
DVALUE(QString) Downloads::TargetExplicitDirectoryDef = IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::DesktopLocation);
|
DVALUE(QString) Downloads::TargetExplicitDirectoryDef = IOFactory::getSystemFolder(QStandardPaths::DesktopLocation);
|
||||||
|
|
||||||
DKEY Downloads::ShowDownloadsWhenNewDownloadStarts = "show_downloads_on_new_download_start";
|
DKEY Downloads::ShowDownloadsWhenNewDownloadStarts = "show_downloads_on_new_download_start";
|
||||||
DVALUE(bool) Downloads::ShowDownloadsWhenNewDownloadStartsDef = true;
|
DVALUE(bool) Downloads::ShowDownloadsWhenNewDownloadStartsDef = true;
|
||||||
@ -241,42 +233,9 @@ DVALUE(char*) Database::ActiveDriverDef = APP_DB_SQLITE_DRIVER;
|
|||||||
// Keyboard.
|
// Keyboard.
|
||||||
DKEY Keyboard::ID = "keyboard";
|
DKEY Keyboard::ID = "keyboard";
|
||||||
|
|
||||||
// Adblock.
|
|
||||||
DKEY AdBlock::ID = "adblock";
|
|
||||||
|
|
||||||
DKEY AdBlock::Enabled = "enabled";
|
|
||||||
DVALUE(bool) AdBlock::EnabledDef = false;
|
|
||||||
|
|
||||||
DKEY AdBlock::UseLimitedEasyList = "use_limited_easylist";
|
|
||||||
DVALUE(bool) AdBlock::UseLimitedEasyListDef = true;
|
|
||||||
|
|
||||||
DKEY AdBlock::DisabledRules = "disabled_rules";
|
|
||||||
DVALUE(QStringList) AdBlock::DisabledRulesDef = QStringList();
|
|
||||||
|
|
||||||
DKEY AdBlock::LastUpdated = "last_updated";
|
|
||||||
DVALUE(QDateTime) AdBlock::LastUpdatedDef = QDateTime();
|
|
||||||
|
|
||||||
// Web browser.
|
// Web browser.
|
||||||
DKEY Browser::ID = "browser";
|
DKEY Browser::ID = "browser";
|
||||||
|
|
||||||
DKEY Browser::GesturesEnabled = "gestures_enabled";
|
|
||||||
DVALUE(bool) Browser::GesturesEnabledDef = true;
|
|
||||||
|
|
||||||
DKEY Browser::JavascriptEnabled = "enable_javascript";
|
|
||||||
DVALUE(bool) Browser::JavascriptEnabledDef = true;
|
|
||||||
|
|
||||||
DKEY Browser::ImagesEnabled = "enable_images";
|
|
||||||
DVALUE(bool) Browser::ImagesEnabledDef = true;
|
|
||||||
|
|
||||||
DKEY Browser::PluginsEnabled = "enable_plugins";
|
|
||||||
DVALUE(bool) Browser::PluginsEnabledDef = false;
|
|
||||||
|
|
||||||
DKEY Browser::RememberBrowserTabs = "remember_browser_tabs";
|
|
||||||
DVALUE(bool)Browser::RememberBrowserTabsDef = false;
|
|
||||||
|
|
||||||
DKEY Browser::OpenedBrowserTabs = "opened_browser_tabs";
|
|
||||||
DVALUE(QString)Browser::OpenedBrowserTabsDef = QString();
|
|
||||||
|
|
||||||
DKEY Browser::CustomExternalBrowserEnabled = "custom_external_browser";
|
DKEY Browser::CustomExternalBrowserEnabled = "custom_external_browser";
|
||||||
DVALUE(bool) Browser::CustomExternalBrowserEnabledDef = false;
|
DVALUE(bool) Browser::CustomExternalBrowserEnabledDef = false;
|
||||||
|
|
||||||
@ -295,8 +254,6 @@ DVALUE(QString) Browser::CustomExternalEmailExecutableDef = QString();
|
|||||||
DKEY Browser::CustomExternalEmailArguments = "external_email_arguments";
|
DKEY Browser::CustomExternalEmailArguments = "external_email_arguments";
|
||||||
DVALUE(char*) Browser::CustomExternalEmailArgumentsDef = "";
|
DVALUE(char*) Browser::CustomExternalEmailArgumentsDef = "";
|
||||||
|
|
||||||
DKEY Browser::QueueTabs = "queue_tabs";
|
|
||||||
DVALUE(bool) Browser::QueueTabsDef = true;
|
|
||||||
|
|
||||||
// Categories.
|
// Categories.
|
||||||
DKEY CategoriesExpandStates::ID = "categories_expand_states";
|
DKEY CategoriesExpandStates::ID = "categories_expand_states";
|
||||||
@ -304,7 +261,7 @@ DKEY CategoriesExpandStates::ID = "categories_expand_sta
|
|||||||
Settings::Settings(const QString &file_name, Format format, const SettingsProperties::SettingsType &status, QObject *parent)
|
Settings::Settings(const QString &file_name, Format format, const SettingsProperties::SettingsType &status, QObject *parent)
|
||||||
: QSettings(file_name, format, parent), m_initializationStatus(status) {
|
: QSettings(file_name, format, parent), m_initializationStatus(status) {
|
||||||
// Perform last-minute initializations.
|
// Perform last-minute initializations.
|
||||||
Messages::PreviewerFontStandardDef = QWebSettings::globalSettings()->fontFamily(QWebSettings::StandardFont);
|
Messages::PreviewerFontStandardDef = qApp->font().family();
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings::~Settings() {
|
Settings::~Settings() {
|
||||||
@ -357,11 +314,6 @@ Settings *Settings::setupSettings(QObject *parent) {
|
|||||||
// Portable settings are available, use them.
|
// Portable settings are available, use them.
|
||||||
new_settings = new Settings(properties.m_absoluteSettingsFileName, QSettings::IniFormat, properties.m_type, parent);
|
new_settings = new Settings(properties.m_absoluteSettingsFileName, QSettings::IniFormat, properties.m_type, parent);
|
||||||
|
|
||||||
// Construct icon cache in the same path.
|
|
||||||
const QString web_path = properties.m_baseDirectory + QDir::separator() + QString(APP_DB_WEB_PATH);
|
|
||||||
QDir(web_path).mkpath(web_path);
|
|
||||||
QWebSettings::setIconDatabasePath(web_path);
|
|
||||||
|
|
||||||
// Check if portable settings are available.
|
// Check if portable settings are available.
|
||||||
if (properties.m_type == SettingsProperties::Portable) {
|
if (properties.m_type == SettingsProperties::Portable) {
|
||||||
qDebug("Initializing settings in '%s' (portable way).", qPrintable(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName)));
|
qDebug("Initializing settings in '%s' (portable way).", qPrintable(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName)));
|
||||||
|
@ -92,9 +92,6 @@ namespace GUI {
|
|||||||
KEY SplitterMessages;
|
KEY SplitterMessages;
|
||||||
VALUE(char*) SplitterMessagesDef;
|
VALUE(char*) SplitterMessagesDef;
|
||||||
|
|
||||||
KEY NotificationBackgroundColor;
|
|
||||||
VALUE(QColor) NotificationBackgroundColorDef;
|
|
||||||
|
|
||||||
KEY ToolbarStyle;
|
KEY ToolbarStyle;
|
||||||
VALUE(Qt::ToolButtonStyle) ToolbarStyleDef;
|
VALUE(Qt::ToolButtonStyle) ToolbarStyleDef;
|
||||||
|
|
||||||
@ -140,9 +137,6 @@ namespace GUI {
|
|||||||
KEY UseFancyNotifications;
|
KEY UseFancyNotifications;
|
||||||
VALUE(bool) UseFancyNotificationsDef;
|
VALUE(bool) UseFancyNotificationsDef;
|
||||||
|
|
||||||
KEY FancyNotificationsPosition;
|
|
||||||
VALUE(Qt::Corner) FancyNotificationsPositionDef;
|
|
||||||
|
|
||||||
KEY TabCloseMiddleClick;
|
KEY TabCloseMiddleClick;
|
||||||
VALUE(bool) TabCloseMiddleClickDef;
|
VALUE(bool) TabCloseMiddleClickDef;
|
||||||
|
|
||||||
@ -269,45 +263,10 @@ namespace Keyboard {
|
|||||||
KEY ID;
|
KEY ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adblock.
|
|
||||||
namespace AdBlock {
|
|
||||||
KEY ID;
|
|
||||||
|
|
||||||
KEY Enabled;
|
|
||||||
VALUE(bool) EnabledDef;
|
|
||||||
|
|
||||||
KEY UseLimitedEasyList;
|
|
||||||
VALUE(bool) UseLimitedEasyListDef;
|
|
||||||
|
|
||||||
KEY DisabledRules;
|
|
||||||
VALUE(QStringList) DisabledRulesDef;
|
|
||||||
|
|
||||||
KEY LastUpdated;
|
|
||||||
VALUE(QDateTime) LastUpdatedDef;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Web browser.
|
// Web browser.
|
||||||
namespace Browser {
|
namespace Browser {
|
||||||
KEY ID;
|
KEY ID;
|
||||||
|
|
||||||
KEY GesturesEnabled;
|
|
||||||
VALUE(bool) GesturesEnabledDef;
|
|
||||||
|
|
||||||
KEY JavascriptEnabled;
|
|
||||||
VALUE(bool) JavascriptEnabledDef;
|
|
||||||
|
|
||||||
KEY ImagesEnabled;
|
|
||||||
VALUE(bool) ImagesEnabledDef;
|
|
||||||
|
|
||||||
KEY PluginsEnabled;
|
|
||||||
VALUE(bool) PluginsEnabledDef;
|
|
||||||
|
|
||||||
KEY RememberBrowserTabs;
|
|
||||||
VALUE(bool)RememberBrowserTabsDef;
|
|
||||||
|
|
||||||
KEY OpenedBrowserTabs;
|
|
||||||
VALUE(QString)OpenedBrowserTabsDef;
|
|
||||||
|
|
||||||
KEY CustomExternalBrowserEnabled;
|
KEY CustomExternalBrowserEnabled;
|
||||||
VALUE(bool) CustomExternalBrowserEnabledDef;
|
VALUE(bool) CustomExternalBrowserEnabledDef;
|
||||||
|
|
||||||
@ -325,9 +284,6 @@ namespace Browser {
|
|||||||
|
|
||||||
KEY CustomExternalEmailArguments;
|
KEY CustomExternalEmailArguments;
|
||||||
VALUE(char*) CustomExternalEmailArgumentsDef;
|
VALUE(char*) CustomExternalEmailArgumentsDef;
|
||||||
|
|
||||||
KEY QueueTabs;
|
|
||||||
VALUE(bool) QueueTabsDef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Categories.
|
// Categories.
|
||||||
|
@ -135,19 +135,6 @@ Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const {
|
|||||||
|
|
||||||
// Obtain version.
|
// Obtain version.
|
||||||
skin.m_version = skin_node.attributes().namedItem(QSL("version")).toAttr().value();
|
skin.m_version = skin_node.attributes().namedItem(QSL("version")).toAttr().value();
|
||||||
|
|
||||||
// Obtain layout markup wrapper.
|
|
||||||
skin.m_layoutMarkupWrapper = skin_node.namedItem(QSL("markup_wrapper")).toElement().text();
|
|
||||||
skin.m_layoutMarkupWrapper = QByteArray::fromBase64(skin.m_layoutMarkupWrapper.toLocal8Bit());
|
|
||||||
|
|
||||||
// Obtain layout markup.
|
|
||||||
skin.m_layoutMarkup = skin_node.namedItem(QSL("markup")).toElement().text();
|
|
||||||
skin.m_layoutMarkup = QByteArray::fromBase64(skin.m_layoutMarkup.toLocal8Bit());
|
|
||||||
|
|
||||||
// Obtain enclosure hyperlink wrapper.
|
|
||||||
skin.m_enclosureMarkup = skin_node.namedItem(QSL("markup_enclosure")).toElement().text();
|
|
||||||
skin.m_enclosureMarkup = QByteArray::fromBase64(skin.m_enclosureMarkup.toLocal8Bit());
|
|
||||||
|
|
||||||
// Obtain other information.
|
// Obtain other information.
|
||||||
skin.m_baseName = QString(skin_name).replace(QDir::separator(), '/');
|
skin.m_baseName = QString(skin_name).replace(QDir::separator(), '/');
|
||||||
|
|
||||||
@ -157,8 +144,7 @@ Skin SkinFactory::skinInfo(const QString &skin_name, bool *ok) const {
|
|||||||
|
|
||||||
if (ok != NULL) {
|
if (ok != NULL) {
|
||||||
*ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() &&
|
*ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() &&
|
||||||
!skin.m_baseName.isEmpty() && !skin.m_email.isEmpty() &&
|
!skin.m_baseName.isEmpty() && !skin.m_email.isEmpty();
|
||||||
!skin.m_layoutMarkup.isEmpty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return skin;
|
return skin;
|
||||||
|
@ -32,9 +32,6 @@ struct Skin {
|
|||||||
QString m_email;
|
QString m_email;
|
||||||
QString m_version;
|
QString m_version;
|
||||||
QString m_rawData;
|
QString m_rawData;
|
||||||
QString m_layoutMarkupWrapper;
|
|
||||||
QString m_layoutMarkup;
|
|
||||||
QString m_enclosureMarkup;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(Skin)
|
Q_DECLARE_METATYPE(Skin)
|
||||||
|
@ -33,12 +33,7 @@
|
|||||||
#include <QDomAttr>
|
#include <QDomAttr>
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
#include <QFutureWatcher>
|
#include <QFutureWatcher>
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
#include <QtConcurrent/QtConcurrentRun>
|
#include <QtConcurrent/QtConcurrentRun>
|
||||||
#else
|
|
||||||
#include <QtConcurrentRun>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef QPair<UpdateInfo, QNetworkReply::NetworkError> UpdateCheck;
|
typedef QPair<UpdateInfo, QNetworkReply::NetworkError> UpdateCheck;
|
||||||
|
@ -1,129 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockaddsubscriptiondialog.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "miscellaneous/iconfactory.h"
|
|
||||||
#include "gui/lineeditwithstatus.h"
|
|
||||||
|
|
||||||
#include <QPushButton>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockAddSubscriptionDialog::AdBlockAddSubscriptionDialog(QWidget *parent)
|
|
||||||
: QDialog(parent), m_ui(new Ui::AdBlockAddSubscriptionDialog) {
|
|
||||||
m_ui->setupUi(this);
|
|
||||||
|
|
||||||
setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog | Qt::WindowSystemMenuHint);
|
|
||||||
setWindowIcon(qApp->icons()->fromTheme("web-adblock"));
|
|
||||||
|
|
||||||
setTabOrder(m_ui->m_cmbPresets, m_ui->m_txtTitle->lineEdit());
|
|
||||||
setTabOrder(m_ui->m_txtTitle->lineEdit(), m_ui->m_txtUrl->lineEdit());
|
|
||||||
setTabOrder(m_ui->m_txtUrl->lineEdit(), m_ui->m_buttonBox);
|
|
||||||
|
|
||||||
loadPresets();
|
|
||||||
|
|
||||||
connect(m_ui->m_cmbPresets, SIGNAL(currentIndexChanged(int)), this, SLOT(onSubscriptionPresetChanged(int)));
|
|
||||||
connect(m_ui->m_txtTitle->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(checkInputs()));
|
|
||||||
connect(m_ui->m_txtUrl->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(checkInputs()));
|
|
||||||
|
|
||||||
onSubscriptionPresetChanged(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockAddSubscriptionDialog::loadPresets() {
|
|
||||||
m_knownSubscriptions << Subscription("EasyList (English)", ADBLOCK_EASYLIST_URL)
|
|
||||||
<< Subscription("Fanboy's List (English)", "http://www.fanboy.co.nz/adblock/fanboy-adblock.txt")
|
|
||||||
<< Subscription("Adversity (English)", "https://raw.githubusercontent.com/Hubird-au/Adversity/master/Adversity.txt")
|
|
||||||
<< Subscription("BSI Lista Polska (Polish)", "http://www.bsi.info.pl/filtrABP.txt")
|
|
||||||
<< Subscription("Easylist Czech and Slovak (Czech)", "https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt")
|
|
||||||
<< Subscription("dutchblock (Dutch)", "http://groenewoudt.net/dutchblock/list.txt")
|
|
||||||
<< Subscription("Filtros Nauscopicos (Spanish)", "http://abp.mozilla-hispano.org/nauscopio/filtros.txt")
|
|
||||||
<< Subscription("hufilter (Hungarian)", "http://www.hufilter.hu/hufilter.txt")
|
|
||||||
<< Subscription("IsraelList (Hebrew)", "http://secure.fanboy.co.nz/israelilist/IsraelList.txt")
|
|
||||||
<< Subscription("Lista Basa (Polish)", "http://plok.studentlive.pl/abp.txt")
|
|
||||||
<< Subscription("NLBlock (Dutch)", "http://www.verzijlbergh.com/adblock/nlblock.txt")
|
|
||||||
<< Subscription("Peter Lowe's list (English)", "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblockplus&mimetype=plaintext")
|
|
||||||
<< Subscription("PLgeneral (Polish)", "http://www.niecko.pl/adblock/adblock.txt")
|
|
||||||
<< Subscription("Schacks Adblock Plus liste (Danish)", "http://adblock.schack.dk/block.txt")
|
|
||||||
<< Subscription("Xfiles (Italian)", "http://mozilla.gfsolone.com/filtri.txt")
|
|
||||||
<< Subscription("Adblock Warning Removal List", "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt")
|
|
||||||
<< Subscription("EasyPrivacy (English)", "http://easylist-downloads.adblockplus.org/easyprivacy.txt")
|
|
||||||
<< Subscription("Antisocial (English)", "https://raw.githubusercontent.com/Hubird-au/Adversity/master/Antisocial.txt")
|
|
||||||
<< Subscription("RuAdList+EasyList (Russian, Ukrainian)", "https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt")
|
|
||||||
<< Subscription("RU AdList (Russian, Ukrainian)", "https://easylist-downloads.adblockplus.org/advblock.txt")
|
|
||||||
<< Subscription("ABPindo (Indonesian)", "https://raw.githubusercontent.com/heradhis/indonesianadblockrules/master/subscriptions/abpindo.txt")
|
|
||||||
<< Subscription("ChinaList (Chinese)", "http://adblock-chinalist.googlecode.com/svn/trunk/adblock.txt")
|
|
||||||
<< Subscription("Malware Domains list", "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt") <<
|
|
||||||
Subscription(tr("Another subscription"), QString());
|
|
||||||
|
|
||||||
foreach (const Subscription &subscription, m_knownSubscriptions) {
|
|
||||||
m_ui->m_cmbPresets->addItem(subscription.m_title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockAddSubscriptionDialog::title() const {
|
|
||||||
return m_ui->m_txtTitle->lineEdit()->text();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockAddSubscriptionDialog::url() const {
|
|
||||||
return m_ui->m_txtUrl->lineEdit()->text();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockAddSubscriptionDialog::onSubscriptionPresetChanged(int index) {
|
|
||||||
const Subscription subscription = m_knownSubscriptions.at(index);
|
|
||||||
|
|
||||||
// "Other" entry.
|
|
||||||
if (subscription.m_url.isEmpty()) {
|
|
||||||
m_ui->m_txtTitle->lineEdit()->clear();
|
|
||||||
m_ui->m_txtUrl->lineEdit()->clear();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ui->m_txtTitle->lineEdit()->setText( subscription.m_title);
|
|
||||||
m_ui->m_txtTitle->lineEdit()->setCursorPosition(0);
|
|
||||||
m_ui->m_txtUrl->lineEdit()->setText(subscription.m_url);
|
|
||||||
m_ui->m_txtUrl->lineEdit()->setCursorPosition(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockAddSubscriptionDialog::checkInputs() {
|
|
||||||
bool is_ok = true;
|
|
||||||
|
|
||||||
if (!m_ui->m_txtTitle->lineEdit()->text().simplified().isEmpty()) {
|
|
||||||
m_ui->m_txtTitle->setStatus(WidgetWithStatus::Ok, tr("Entered title is okay."));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ui->m_txtTitle->setStatus(WidgetWithStatus::Error, tr("Entered title is empty."));
|
|
||||||
is_ok = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_ui->m_txtUrl->lineEdit()->text().simplified().isEmpty()) {
|
|
||||||
m_ui->m_txtUrl->setStatus(WidgetWithStatus::Ok, tr("Entered url is okay."));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ui->m_txtUrl->setStatus(WidgetWithStatus::Error, tr("Entered url is empty."));
|
|
||||||
is_ok = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(is_ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockAddSubscriptionDialog::~AdBlockAddSubscriptionDialog() {
|
|
||||||
qDebug("Destroying AdBlockAddSubscriptionDialog instance.");
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKADDSUBSCRIPTIONDIALOG_H
|
|
||||||
#define ADBLOCKADDSUBSCRIPTIONDIALOG_H
|
|
||||||
|
|
||||||
#include <QDialog>
|
|
||||||
|
|
||||||
#include "ui_adblockaddsubscriptiondialog.h"
|
|
||||||
|
|
||||||
#include <QVector>
|
|
||||||
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class AdBlockAddSubscriptionDialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
class AdBlockAddSubscriptionDialog : public QDialog {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit AdBlockAddSubscriptionDialog(QWidget *parent = 0);
|
|
||||||
virtual ~AdBlockAddSubscriptionDialog();
|
|
||||||
|
|
||||||
QString title() const;
|
|
||||||
QString url() const;
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
// Index of selected list changed.
|
|
||||||
void onSubscriptionPresetChanged(int index);
|
|
||||||
void checkInputs();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void loadPresets();
|
|
||||||
|
|
||||||
struct Subscription {
|
|
||||||
public:
|
|
||||||
QString m_title;
|
|
||||||
QString m_url;
|
|
||||||
|
|
||||||
explicit Subscription() {
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit Subscription(const QString &title, const QString &url) {
|
|
||||||
m_title = title;
|
|
||||||
m_url = url;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
QScopedPointer<Ui::AdBlockAddSubscriptionDialog> m_ui;
|
|
||||||
QVector<Subscription> m_knownSubscriptions;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKADDSUBSCRIPTIONDIALOG_H
|
|
@ -1,114 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>AdBlockAddSubscriptionDialog</class>
|
|
||||||
<widget class="QDialog" name="AdBlockAddSubscriptionDialog">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>557</width>
|
|
||||||
<height>142</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Add subscription</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QFormLayout">
|
|
||||||
<item row="0" column="0" colspan="2">
|
|
||||||
<widget class="QComboBox" name="m_cmbPresets"/>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="m_lblTitle">
|
|
||||||
<property name="text">
|
|
||||||
<string>Title</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>m_txtTitle</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QLabel" name="m_lblUrl">
|
|
||||||
<property name="text">
|
|
||||||
<string>Address</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>m_txtUrl</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QDialogButtonBox" name="m_buttonBox">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0" colspan="2">
|
|
||||||
<spacer name="m_vertSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="LineEditWithStatus" name="m_txtTitle" native="true"/>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="LineEditWithStatus" name="m_txtUrl" native="true"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<customwidgets>
|
|
||||||
<customwidget>
|
|
||||||
<class>LineEditWithStatus</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>lineeditwithstatus.h</header>
|
|
||||||
<container>1</container>
|
|
||||||
</customwidget>
|
|
||||||
</customwidgets>
|
|
||||||
<resources/>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>m_buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>AdBlockAddSubscriptionDialog</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>m_buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>AdBlockAddSubscriptionDialog</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
@ -1,81 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockblockednetworkreply.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "network-web/adblock/adblockrule.h"
|
|
||||||
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QTimer>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockBlockedNetworkReply::AdBlockBlockedNetworkReply(const AdBlockRule *rule, QObject *parent)
|
|
||||||
: QNetworkReply(parent) {
|
|
||||||
setOperation(QNetworkAccessManager::GetOperation);
|
|
||||||
setError(QNetworkReply::ContentAccessDenied, QString("Adblock: %1 (%2)").arg(rule->subscription()->title(), rule->filter()));
|
|
||||||
open(QIODevice::ReadOnly);
|
|
||||||
QTimer::singleShot(0, this, SLOT(delayedFinished()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockBlockedNetworkReply::abort() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockBlockedNetworkReply::setRequest(const QNetworkRequest &request) {
|
|
||||||
QNetworkReply::setRequest(request);
|
|
||||||
setUrl(request.url());
|
|
||||||
}
|
|
||||||
|
|
||||||
qint64 AdBlockBlockedNetworkReply::readData(char *data, qint64 maxSize) {
|
|
||||||
Q_UNUSED(data);
|
|
||||||
Q_UNUSED(maxSize);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockBlockedNetworkReply::delayedFinished() {
|
|
||||||
emit error(QNetworkReply::ContentAccessDenied);
|
|
||||||
emit finished();
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ADBLOCKBLOCKEDNETWORKREPLY_H
|
|
||||||
#define ADBLOCKBLOCKEDNETWORKREPLY_H
|
|
||||||
|
|
||||||
#include <QNetworkReply>
|
|
||||||
|
|
||||||
|
|
||||||
class AdBlockRule;
|
|
||||||
class AdBlockSubscription;
|
|
||||||
|
|
||||||
class AdBlockBlockedNetworkReply : public QNetworkReply{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AdBlockBlockedNetworkReply(const AdBlockRule *rule, QObject *parent = 0);
|
|
||||||
|
|
||||||
void abort();
|
|
||||||
void setRequest(const QNetworkRequest &request);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
qint64 readData(char *data, qint64 maxSize);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void delayedFinished();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKBLOCKEDNETWORKREPLY_H
|
|
||||||
|
|
@ -1,213 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockdialog.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "network-web/adblock/adblocktreewidget.h"
|
|
||||||
#include "network-web/adblock/adblockaddsubscriptiondialog.h"
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "miscellaneous/iconfactory.h"
|
|
||||||
#include "gui/tabwidget.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
|
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QInputDialog>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockDialog::AdBlockDialog(QWidget* parent) : QDialog(parent), m_ui(new Ui::AdBlockDialog),
|
|
||||||
m_manager(AdBlockManager::instance()), m_currentTreeWidget(NULL),
|
|
||||||
m_currentSubscription(NULL), m_loaded(false), m_useLimitedEasyList(false) {
|
|
||||||
m_ui->setupUi(this);
|
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog | Qt::WindowSystemMenuHint);
|
|
||||||
setWindowIcon(qApp->icons()->fromTheme("web-adblock"));
|
|
||||||
|
|
||||||
m_ui->m_checkEnable->setChecked(m_manager->isEnabled());
|
|
||||||
m_ui->m_checkUseLimitedEasyList->setVisible(false);
|
|
||||||
m_ui->m_btnOptions->setIcon(qApp->icons()->fromTheme("web-adblock"));
|
|
||||||
m_ui->m_btnOptions->setText(m_ui->m_btnOptions->text() + " ");
|
|
||||||
|
|
||||||
// Setup the menu.
|
|
||||||
setupMenu();
|
|
||||||
|
|
||||||
// Initialize connections.
|
|
||||||
createConnections();
|
|
||||||
|
|
||||||
// Load the contents.
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockDialog::~AdBlockDialog() {
|
|
||||||
qDebug("Destroying AdBlockDialog instance.");
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::setupMenu() {
|
|
||||||
QMenu *menu = new QMenu(m_ui->m_btnOptions);
|
|
||||||
|
|
||||||
m_actionAddRule = menu->addAction(tr("Add rule"), this, SLOT(addRule()));
|
|
||||||
m_actionRemoveRule = menu->addAction(tr("Remove rule"), this, SLOT(removeRule()));
|
|
||||||
menu->addSeparator();
|
|
||||||
m_actionAddSubscription = menu->addAction(tr("Add subscription"), this, SLOT(addSubscription()));
|
|
||||||
m_actionRemoveSubscription = menu->addAction(tr("Remove subscription"), this, SLOT(removeSubscription()));
|
|
||||||
menu->addAction(tr("Update subscriptions"), m_manager, SLOT(updateAllSubscriptions()));
|
|
||||||
menu->addSeparator();
|
|
||||||
menu->addAction(tr("Rules writing guide"), this, SLOT(learnAboutRules()));
|
|
||||||
|
|
||||||
m_ui->m_btnOptions->setMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::createConnections() {
|
|
||||||
connect(m_ui->m_btnOptions->menu(), SIGNAL(aboutToShow()), this, SLOT(aboutToShowMenu()));
|
|
||||||
connect(m_ui->m_checkEnable, SIGNAL(toggled(bool)), this, SLOT(enableAdBlock(bool)));
|
|
||||||
connect(m_ui->m_txtFilter, SIGNAL(textChanged(QString)), this, SLOT(filterString(QString)));
|
|
||||||
connect(m_ui->m_tabs, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int)));
|
|
||||||
connect(m_ui->m_buttonBox, SIGNAL(accepted()), this, SLOT(close()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::showRule(const AdBlockRule *rule) const {
|
|
||||||
const AdBlockSubscription *subscription = rule->subscription();
|
|
||||||
|
|
||||||
if (subscription == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < m_ui->m_tabs->count(); i++) {
|
|
||||||
AdBlockTreeWidget *tree_widget = qobject_cast<AdBlockTreeWidget*>(m_ui->m_tabs->widget(i));
|
|
||||||
|
|
||||||
if (subscription == tree_widget->subscription()) {
|
|
||||||
tree_widget->showRule(rule);
|
|
||||||
m_ui->m_tabs->setCurrentIndex(i);
|
|
||||||
tree_widget->setFocus();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::addRule() {
|
|
||||||
m_currentTreeWidget->addRule();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::removeRule() {
|
|
||||||
m_currentTreeWidget->removeRule();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::addSubscription() {
|
|
||||||
QScopedPointer<AdBlockAddSubscriptionDialog> dialog(new AdBlockAddSubscriptionDialog(this));
|
|
||||||
|
|
||||||
if (dialog.data()->exec() == QDialog::Accepted) {
|
|
||||||
const QString title = dialog.data()->title();
|
|
||||||
const QString url = dialog.data()->url();
|
|
||||||
|
|
||||||
if (AdBlockSubscription *subscription = m_manager->addSubscription(title, url)) {
|
|
||||||
AdBlockTreeWidget *tree = new AdBlockTreeWidget(subscription, this);
|
|
||||||
connect(tree, SIGNAL(refreshStatusChanged(bool)), this, SLOT(setDisabled(bool)));
|
|
||||||
|
|
||||||
const int index = m_ui->m_tabs->insertTab(m_ui->m_tabs->count() - 1, tree, subscription->title());
|
|
||||||
m_ui->m_tabs->setCurrentIndex(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//delete dialog.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::removeSubscription() {
|
|
||||||
if (m_manager->removeSubscription(m_currentSubscription)) {
|
|
||||||
delete m_currentTreeWidget;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::currentChanged(int index) {
|
|
||||||
if (index != -1) {
|
|
||||||
m_currentTreeWidget = qobject_cast<AdBlockTreeWidget*>(m_ui->m_tabs->widget(index));
|
|
||||||
m_currentSubscription = m_currentTreeWidget->subscription();
|
|
||||||
|
|
||||||
const bool is_easylist = m_currentSubscription->url() == QUrl(ADBLOCK_EASYLIST_URL);
|
|
||||||
m_ui->m_checkUseLimitedEasyList->setEnabled(is_easylist && m_ui->m_checkEnable->isChecked());
|
|
||||||
m_ui->m_checkUseLimitedEasyList->setVisible(is_easylist);
|
|
||||||
|
|
||||||
m_ui->m_txtFilter->blockSignals(true);
|
|
||||||
m_ui->m_txtFilter->clear();
|
|
||||||
m_ui->m_txtFilter->blockSignals(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::filterString(const QString &string) {
|
|
||||||
if (m_currentTreeWidget && m_ui->m_checkEnable->isChecked()) {
|
|
||||||
m_currentTreeWidget->filterString(string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::enableAdBlock(bool state) {
|
|
||||||
m_manager->setEnabled(state);
|
|
||||||
|
|
||||||
if (state) {
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::aboutToShowMenu() {
|
|
||||||
const bool subscription_editable = m_currentSubscription && m_currentSubscription->canEditRules();
|
|
||||||
const bool subscription_removable = m_currentSubscription && m_currentSubscription->canBeRemoved();
|
|
||||||
|
|
||||||
m_actionAddRule->setEnabled(subscription_editable);
|
|
||||||
m_actionRemoveRule->setEnabled(subscription_editable);
|
|
||||||
m_actionRemoveSubscription->setEnabled(subscription_removable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::learnAboutRules() {
|
|
||||||
qApp->mainForm()->tabWidget()->addBrowser(true, true, QUrl(ADBLOCK_FILTERS_HELP));
|
|
||||||
QTimer::singleShot(100, this, SLOT(close()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::loadSubscriptions() {
|
|
||||||
for (int i = 0; i < m_ui->m_tabs->count(); ++i) {
|
|
||||||
qobject_cast<AdBlockTreeWidget*>(m_ui->m_tabs->widget(i))->refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::load() {
|
|
||||||
if (m_loaded || !m_ui->m_checkEnable->isChecked()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (AdBlockSubscription *subscription, m_manager->subscriptions()) {
|
|
||||||
AdBlockTreeWidget *tree = new AdBlockTreeWidget(subscription, this);
|
|
||||||
|
|
||||||
connect(tree, SIGNAL(refreshStatusChanged(bool)), this, SLOT(setDisabled(bool)));
|
|
||||||
m_ui->m_tabs->addTab(tree, subscription->title());
|
|
||||||
}
|
|
||||||
|
|
||||||
m_useLimitedEasyList = m_manager->useLimitedEasyList();
|
|
||||||
m_ui->m_checkUseLimitedEasyList->setChecked(m_useLimitedEasyList);
|
|
||||||
m_loaded = true;
|
|
||||||
|
|
||||||
QTimer::singleShot(100, this, SLOT(loadSubscriptions()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockDialog::closeEvent(QCloseEvent *event) {
|
|
||||||
if (m_ui->m_checkUseLimitedEasyList->isChecked() != m_useLimitedEasyList) {
|
|
||||||
m_manager->setUseLimitedEasyList(m_ui->m_checkUseLimitedEasyList->isChecked());
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget::closeEvent(event);
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKDIALOG_H
|
|
||||||
#define ADBLOCKDIALOG_H
|
|
||||||
|
|
||||||
#include <QDialog>
|
|
||||||
|
|
||||||
#include "ui_adblockdialog.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class AdBlockDialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
class AdBlockSubscription;
|
|
||||||
class AdBlockTreeWidget;
|
|
||||||
class AdBlockManager;
|
|
||||||
class AdBlockRule;
|
|
||||||
|
|
||||||
class AdBlockDialog : public QDialog {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit AdBlockDialog(QWidget *parent = 0);
|
|
||||||
virtual ~AdBlockDialog();
|
|
||||||
|
|
||||||
void showRule(const AdBlockRule *rule) const;
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void addRule();
|
|
||||||
void removeRule();
|
|
||||||
|
|
||||||
void addSubscription();
|
|
||||||
void removeSubscription();
|
|
||||||
|
|
||||||
void currentChanged(int index);
|
|
||||||
void filterString(const QString &string);
|
|
||||||
void enableAdBlock(bool state);
|
|
||||||
|
|
||||||
void aboutToShowMenu();
|
|
||||||
void learnAboutRules();
|
|
||||||
|
|
||||||
void loadSubscriptions();
|
|
||||||
void load();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void closeEvent(QCloseEvent *event);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setupMenu();
|
|
||||||
void createConnections();
|
|
||||||
|
|
||||||
QScopedPointer<Ui::AdBlockDialog> m_ui;
|
|
||||||
AdBlockManager *m_manager;
|
|
||||||
AdBlockTreeWidget *m_currentTreeWidget;
|
|
||||||
AdBlockSubscription *m_currentSubscription;
|
|
||||||
|
|
||||||
QAction *m_actionAddRule;
|
|
||||||
QAction *m_actionRemoveRule;
|
|
||||||
QAction *m_actionAddSubscription;
|
|
||||||
QAction *m_actionRemoveSubscription;
|
|
||||||
|
|
||||||
bool m_loaded;
|
|
||||||
bool m_useLimitedEasyList;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKDIALOG_H
|
|
@ -1,154 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>AdBlockDialog</class>
|
|
||||||
<widget class="QDialog" name="AdBlockDialog">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>535</width>
|
|
||||||
<height>466</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>Adblock settings</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="m_checkEnable">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable Adblock</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="m_lblInfo">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Note that Adblock may significantly slow this application down once you activate huge subscriptions. Too many rules is not good for performance. Also, make sure you restart application after you disable Adblock if you wish to have low memory footprint. Adblock is known to use much system memory.
|
|
||||||
|
|
||||||
Also note that some resources are cached by internal web browser. Thus, after changing some rules or subscriptions they will fully apply only for new application instances. Make sure you restart RSS Guard for best Adblock experience.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QWidget" name="m_adBlockWidget" native="true">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item row="4" column="0" colspan="2">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="m_btnOptions">
|
|
||||||
<property name="text">
|
|
||||||
<string>Options</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="m_txtFilter">
|
|
||||||
<property name="placeholderText">
|
|
||||||
<string>Filter rules</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QTabWidget" name="m_tabs"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="m_checkUseLimitedEasyList">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Use only essential part of EasyList (for performance reasons)</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="m_buttonBox">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Close</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<tabstops>
|
|
||||||
<tabstop>m_checkEnable</tabstop>
|
|
||||||
<tabstop>m_tabs</tabstop>
|
|
||||||
<tabstop>m_btnOptions</tabstop>
|
|
||||||
<tabstop>m_txtFilter</tabstop>
|
|
||||||
<tabstop>m_checkUseLimitedEasyList</tabstop>
|
|
||||||
</tabstops>
|
|
||||||
<resources/>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>m_checkEnable</sender>
|
|
||||||
<signal>toggled(bool)</signal>
|
|
||||||
<receiver>m_adBlockWidget</receiver>
|
|
||||||
<slot>setEnabled(bool)</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>106</x>
|
|
||||||
<y>39</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>349</x>
|
|
||||||
<y>74</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>m_buttonBox</sender>
|
|
||||||
<signal>clicked(QAbstractButton*)</signal>
|
|
||||||
<receiver>AdBlockDialog</receiver>
|
|
||||||
<slot>close()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>434</x>
|
|
||||||
<y>440</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>272</x>
|
|
||||||
<y>230</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
@ -1,187 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockicon.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockrule.h"
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "network-web/webpage.h"
|
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "gui/plaintoolbutton.h"
|
|
||||||
#include "gui/tabwidget.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QMouseEvent>
|
|
||||||
#include <QWebFrame>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockIcon::AdBlockIcon(QWidget *window, QWidget *parent)
|
|
||||||
: PlainToolButton(parent), m_window(window), m_menuAction(NULL), m_enabled(false) {
|
|
||||||
connect(this, SIGNAL(clicked(QPoint)), this, SLOT(showMenu(QPoint)));
|
|
||||||
connect(AdBlockManager::instance(), SIGNAL(enabledChanged(bool)), this, SLOT(setEnabled(bool)));
|
|
||||||
}
|
|
||||||
|
|
||||||
QAction *AdBlockIcon::menuAction() {
|
|
||||||
if (m_menuAction == NULL) {
|
|
||||||
m_menuAction = new QAction(tr("Adblock"), this);
|
|
||||||
m_menuAction->setMenu(new QMenu(this));
|
|
||||||
|
|
||||||
connect(m_menuAction->menu(), SIGNAL(aboutToShow()), this, SLOT(createMenu()));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_menuAction->setIcon(m_enabled ? qApp->icons()->fromTheme("web-adblock") : qApp->icons()->fromTheme("web-adblock"));
|
|
||||||
|
|
||||||
return m_menuAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockIcon::activate() {
|
|
||||||
setEnabled(AdBlockManager::instance()->shouldBeEnabled());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockIcon::createMenu(QMenu *menu) {
|
|
||||||
if (menu == NULL) {
|
|
||||||
menu = qobject_cast<QMenu*>(sender());
|
|
||||||
|
|
||||||
if (menu == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->clear();
|
|
||||||
|
|
||||||
AdBlockManager *manager = AdBlockManager::instance();
|
|
||||||
AdBlockCustomList *custom_list = manager->customList();
|
|
||||||
|
|
||||||
WebPage *page = qApp->mainForm()->tabWidget()->currentWidget()->webBrowser()->view()->page();
|
|
||||||
const QUrl page_url = page->mainFrame()->url();
|
|
||||||
|
|
||||||
menu->addAction(tr("Show Adblock &settings"), manager, SLOT(showDialog()));
|
|
||||||
menu->addSeparator();
|
|
||||||
|
|
||||||
if (!page_url.host().isEmpty() && m_enabled && manager->canRunOnScheme(page_url.scheme())) {
|
|
||||||
const QString host = page_url.host().contains(QLatin1String("www.")) ? page_url.host().mid(4) : page_url.host();
|
|
||||||
const QString host_filter = QString("@@||%1^$document").arg(host);
|
|
||||||
const QString page_filter = QString("@@|%1|$document").arg(page_url.toString());
|
|
||||||
|
|
||||||
QAction *act;
|
|
||||||
|
|
||||||
act = menu->addAction(tr("Disable on %1").arg(host));
|
|
||||||
act->setCheckable(true);
|
|
||||||
act->setChecked(custom_list->containsFilter(host_filter));
|
|
||||||
act->setData(host_filter);
|
|
||||||
connect(act, SIGNAL(triggered()), this, SLOT(toggleCustomFilter()));
|
|
||||||
|
|
||||||
act = menu->addAction(tr("Disable only on this page"));
|
|
||||||
act->setCheckable(true);
|
|
||||||
act->setChecked(custom_list->containsFilter(page_filter));
|
|
||||||
act->setData(page_filter);
|
|
||||||
connect(act, SIGNAL(triggered()), this, SLOT(toggleCustomFilter()));
|
|
||||||
|
|
||||||
menu->addSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_blockedPopups.isEmpty()) {
|
|
||||||
menu->addAction(tr("Blocked popup windows"))->setEnabled(false);
|
|
||||||
|
|
||||||
for (int i = 0; i < m_blockedPopups.count(); i++) {
|
|
||||||
const QPair<AdBlockRule*,QUrl> &pair = m_blockedPopups.at(i);
|
|
||||||
|
|
||||||
const QString address = pair.second.toString().right(55);
|
|
||||||
QString action_text = tr("%1 with (%2)").arg(address,
|
|
||||||
pair.first->filter()).replace(QLatin1Char('&'), QLatin1String("&&"));
|
|
||||||
|
|
||||||
QAction *action = menu->addAction(action_text, manager, SLOT(showRule()));
|
|
||||||
action->setData(QVariant::fromValue((void*)pair.first));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->addSeparator();
|
|
||||||
|
|
||||||
const QVector<WebPage::AdBlockedEntry> entries = page->adBlockedEntries();
|
|
||||||
|
|
||||||
if (entries.isEmpty()) {
|
|
||||||
menu->addAction(tr("No content blocked"))->setEnabled(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
menu->addAction(tr("Blocked some content - click to edit rule"))->setEnabled(false);
|
|
||||||
|
|
||||||
foreach (const WebPage::AdBlockedEntry &entry, entries) {
|
|
||||||
QString address = entry.url.toString().right(55);
|
|
||||||
QString action_text = tr("%1 with (%2)").arg(address,
|
|
||||||
entry.rule->filter()).replace(QLatin1Char('&'), QLatin1String("&&"));
|
|
||||||
|
|
||||||
QAction *action = menu->addAction(action_text, manager, SLOT(showRule()));
|
|
||||||
action->setData(QVariant::fromValue((void*)entry.rule));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockIcon::showMenu(const QPoint &pos) {
|
|
||||||
QMenu menu;
|
|
||||||
createMenu(&menu);
|
|
||||||
menu.exec(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockIcon::toggleCustomFilter() {
|
|
||||||
const QAction *action = qobject_cast<QAction*>(sender());
|
|
||||||
|
|
||||||
if (action == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString filter = action->data().toString();
|
|
||||||
AdBlockManager *manager = AdBlockManager::instance();
|
|
||||||
AdBlockCustomList *custom_list = manager->customList();
|
|
||||||
|
|
||||||
if (custom_list->containsFilter(filter)) {
|
|
||||||
custom_list->removeFilter(filter);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
AdBlockRule *rule = new AdBlockRule(filter, custom_list);
|
|
||||||
custom_list->addRule(rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockIcon::setEnabled(bool enabled) {
|
|
||||||
if (enabled) {
|
|
||||||
setToolTip(tr("Adblock - up and running"));
|
|
||||||
setIcon(qApp->icons()->fromTheme("web-adblock"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setToolTip(tr("Adblock - not running"));
|
|
||||||
setIcon(qApp->icons()->fromTheme("web-adblock-disabled"));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_enabled = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockIcon::mouseReleaseEvent(QMouseEvent *event) {
|
|
||||||
if (event->button() == Qt::LeftButton) {
|
|
||||||
emit clicked(event->globalPos());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
QToolButton::mouseReleaseEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockIcon::~AdBlockIcon() {
|
|
||||||
qDebug("Destroying AdBlockIcon instance.");
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKICON_H
|
|
||||||
#define ADBLOCKICON_H
|
|
||||||
|
|
||||||
#include "gui/plaintoolbutton.h"
|
|
||||||
|
|
||||||
|
|
||||||
class QMenu;
|
|
||||||
class QUrl;
|
|
||||||
class AdBlockRule;
|
|
||||||
|
|
||||||
class AdBlockIcon : public PlainToolButton {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit AdBlockIcon(QWidget *window, QWidget *parent = 0);
|
|
||||||
virtual ~AdBlockIcon();
|
|
||||||
|
|
||||||
QAction *menuAction();
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void activate();
|
|
||||||
void setEnabled(bool enabled);
|
|
||||||
void createMenu(QMenu *menu = NULL);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void showMenu(const QPoint &pos);
|
|
||||||
void toggleCustomFilter();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void mouseReleaseEvent(QMouseEvent *event);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void clicked(QPoint);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QWidget *m_window;
|
|
||||||
QAction *m_menuAction;
|
|
||||||
QVector<QPair<AdBlockRule*,QUrl> > m_blockedPopups;
|
|
||||||
bool m_enabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKICON_H
|
|
@ -1,357 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockdialog.h"
|
|
||||||
#include "network-web/adblock/adblockmatcher.h"
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "network-web/adblock/adblockblockednetworkreply.h"
|
|
||||||
#include "network-web/adblock/adblockicon.h"
|
|
||||||
#include "network-web/webpage.h"
|
|
||||||
#include "network-web/silentnetworkaccessmanager.h"
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "miscellaneous/settings.h"
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QTextStream>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QWebFrame>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockManager *AdBlockManager::s_adBlockManager = NULL;
|
|
||||||
|
|
||||||
AdBlockManager::AdBlockManager(QObject* parent)
|
|
||||||
: QObject(parent), m_loaded(false), m_enabled(false), m_useLimitedEasyList(true),
|
|
||||||
m_subscriptions(QList<AdBlockSubscription*>()), m_matcher(new AdBlockMatcher(this)) {
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockManager::~AdBlockManager() {
|
|
||||||
qDeleteAll(m_subscriptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockManager *AdBlockManager::instance() {
|
|
||||||
if (s_adBlockManager == NULL) {
|
|
||||||
s_adBlockManager = new AdBlockManager(SilentNetworkAccessManager::instance());
|
|
||||||
}
|
|
||||||
|
|
||||||
return s_adBlockManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::setEnabled(bool enabled) {
|
|
||||||
if (m_enabled == enabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_enabled = enabled;
|
|
||||||
emit enabledChanged(enabled);
|
|
||||||
qApp->settings()->setValue(GROUP(AdBlock), AdBlock::Enabled, m_enabled);
|
|
||||||
|
|
||||||
// Load subscriptions and other data.
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<AdBlockSubscription*> AdBlockManager::subscriptions() const {
|
|
||||||
return m_subscriptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
QNetworkReply *AdBlockManager::block(const QNetworkRequest &request) {
|
|
||||||
const QString url_string = request.url().toEncoded().toLower();
|
|
||||||
const QString url_domain = request.url().host().toLower();
|
|
||||||
const QString url_scheme = request.url().scheme().toLower();
|
|
||||||
|
|
||||||
if (!isEnabled() || !canRunOnScheme(url_scheme)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *blocked_rule = m_matcher->match(request, url_domain, url_string);
|
|
||||||
|
|
||||||
if (blocked_rule != NULL) {
|
|
||||||
QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100));
|
|
||||||
WebPage *web_page = static_cast<WebPage*>(v.value<void*>());
|
|
||||||
|
|
||||||
if (WebPage::isPointerSafeToUse(web_page)) {
|
|
||||||
if (!canBeBlocked(web_page->mainFrame()->url())) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
web_page->addAdBlockRule(blocked_rule, request.url());
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockBlockedNetworkReply *reply = new AdBlockBlockedNetworkReply(blocked_rule, this);
|
|
||||||
reply->setRequest(request);
|
|
||||||
|
|
||||||
return reply;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList AdBlockManager::disabledRules() const {
|
|
||||||
return m_disabledRules;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::addDisabledRule(const QString &filter) {
|
|
||||||
m_disabledRules.append(filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::removeDisabledRule(const QString &filter) {
|
|
||||||
m_disabledRules.removeOne(filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSubscription *AdBlockManager::addSubscription(const QString &title, const QString &url) {
|
|
||||||
if (title.isEmpty() || url.isEmpty()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString file_name = IOFactory::filterBadCharsFromFilename(title.toLower()) + QL1S(".txt");
|
|
||||||
const QString file_path = IOFactory::ensureUniqueFilename(baseSubscriptionDirectory() + QDir::separator() + file_name);
|
|
||||||
QFile file(file_path);
|
|
||||||
|
|
||||||
if (!file.open(QFile::WriteOnly | QFile::Truncate | QFile::Unbuffered)) {
|
|
||||||
qWarning("Cannot write to file '%s'.",qPrintable(file_path));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
file.write(QString("Title: %1\nUrl: %2\n[Adblock Plus 1.1.1]").arg(title, url).toLatin1());
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
AdBlockSubscription *subscription = new AdBlockSubscription(title, this);
|
|
||||||
subscription->setUrl(QUrl(url));
|
|
||||||
subscription->setFilePath(file_path);
|
|
||||||
subscription->loadSubscription(m_disabledRules);
|
|
||||||
|
|
||||||
// This expects that there is at least "Custom rules" subscription available in
|
|
||||||
// active subscriptions.
|
|
||||||
m_subscriptions.insert(m_subscriptions.size() - 1, subscription);
|
|
||||||
m_matcher->update();
|
|
||||||
|
|
||||||
return subscription;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockManager::removeSubscription(AdBlockSubscription *subscription) {
|
|
||||||
if (!m_subscriptions.contains(subscription) || !subscription->canBeRemoved()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
QFile::remove(subscription->filePath());
|
|
||||||
m_subscriptions.removeOne(subscription);
|
|
||||||
delete subscription;
|
|
||||||
m_matcher->update();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockCustomList *AdBlockManager::customList() const {
|
|
||||||
foreach (AdBlockSubscription *subscription, m_subscriptions) {
|
|
||||||
AdBlockCustomList *list = qobject_cast<AdBlockCustomList*>(subscription);
|
|
||||||
|
|
||||||
if (list != NULL) {
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockManager::baseSubscriptionDirectory() {
|
|
||||||
QString directory;
|
|
||||||
|
|
||||||
if (qApp->settings()->type() == SettingsProperties::Portable) {
|
|
||||||
directory = qApp->applicationDirPath();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
directory = qApp->homeFolderPath() + QDir::separator() + QString(APP_LOW_H_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
directory += QString(QDir::separator()) + ADBLOCK_BASE_DIRECTORY_NAME;
|
|
||||||
return QDir::toNativeSeparators(directory);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockManager::shouldBeEnabled() const {
|
|
||||||
return qApp->settings()->value(GROUP(AdBlock), SETTING(AdBlock::Enabled)).toBool();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::load() {
|
|
||||||
if (m_loaded) {
|
|
||||||
// It is already loaded: subscriptions are loaded from files into objects,
|
|
||||||
// enabled status is determined, disabled rules are also determined.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Settings *settings = qApp->settings();
|
|
||||||
m_enabled = settings->value(GROUP(AdBlock), SETTING(AdBlock::Enabled)).toBool();
|
|
||||||
m_useLimitedEasyList = settings->value(GROUP(AdBlock), SETTING(AdBlock::UseLimitedEasyList)).toBool();
|
|
||||||
m_disabledRules = settings->value(GROUP(AdBlock), SETTING(AdBlock::DisabledRules)).toStringList();
|
|
||||||
|
|
||||||
if (!m_enabled) {
|
|
||||||
// We loaded settings, but Adblock should be disabled. Do not continue to save memory.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDir adblock_dir(baseSubscriptionDirectory());
|
|
||||||
|
|
||||||
if (!adblock_dir.exists()) {
|
|
||||||
adblock_dir.mkpath(adblock_dir.absolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (const QString &file_name, adblock_dir.entryList(QStringList(QL1S("*.txt")), QDir::Files)) {
|
|
||||||
if (file_name == QSL(ADBLOCK_CUSTOM_LIST_FILENAME)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString absolute_path = adblock_dir.absoluteFilePath(file_name);
|
|
||||||
QFile file(absolute_path);
|
|
||||||
|
|
||||||
if (!file.open(QFile::ReadOnly)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream stream(&file);
|
|
||||||
stream.setCodec("UTF-8");
|
|
||||||
const QString title = stream.readLine(1024).remove(QSL("Title: "));
|
|
||||||
const QUrl url = QUrl(stream.readLine(1024).remove(QSL("Url: ")));
|
|
||||||
|
|
||||||
// Close the file.
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
if (title.isEmpty() || !url.isValid()) {
|
|
||||||
qWarning("Invalid subscription file '%s'.", qPrintable(absolute_path));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSubscription *subscription = new AdBlockSubscription(title, this);
|
|
||||||
subscription->setUrl(url);
|
|
||||||
subscription->setFilePath(absolute_path);
|
|
||||||
|
|
||||||
m_subscriptions.append(subscription);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append list for "Custom rules".
|
|
||||||
m_subscriptions.append(new AdBlockCustomList(this));
|
|
||||||
|
|
||||||
// Load all subscriptions, including obligatory "Custom rules" list.
|
|
||||||
foreach (AdBlockSubscription *subscription, m_subscriptions) {
|
|
||||||
subscription->loadSubscription(m_disabledRules);
|
|
||||||
|
|
||||||
connect(subscription, SIGNAL(subscriptionChanged()), m_matcher, SLOT(update()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notify matcher about loaded subscriptions
|
|
||||||
// and mark all this shit as loaded.
|
|
||||||
m_matcher->update();
|
|
||||||
m_loaded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::updateAllSubscriptions() {
|
|
||||||
foreach (AdBlockSubscription *subscription, m_subscriptions) {
|
|
||||||
subscription->updateSubscription();
|
|
||||||
}
|
|
||||||
|
|
||||||
qApp->settings()->setValue(GROUP(AdBlock), AdBlock::LastUpdated, QDateTime::currentDateTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::save() {
|
|
||||||
if (m_loaded) {
|
|
||||||
foreach (AdBlockSubscription *subscription, m_subscriptions) {
|
|
||||||
subscription->saveSubscription();
|
|
||||||
}
|
|
||||||
|
|
||||||
Settings *settings = qApp->settings();
|
|
||||||
settings->setValue(GROUP(AdBlock), AdBlock::Enabled, m_enabled);
|
|
||||||
settings->setValue(GROUP(AdBlock), AdBlock::UseLimitedEasyList, m_useLimitedEasyList);
|
|
||||||
settings->setValue(GROUP(AdBlock), AdBlock::DisabledRules, m_disabledRules);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockManager::isEnabled() const {
|
|
||||||
return m_enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockManager::canRunOnScheme(const QString &scheme) const {
|
|
||||||
return !(scheme == QL1S("file") || scheme == QL1S("qrc") || scheme == QL1S("data") || scheme == QL1S("abp"));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockManager::useLimitedEasyList() const {
|
|
||||||
return m_useLimitedEasyList;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::setUseLimitedEasyList(bool use_limited) {
|
|
||||||
m_useLimitedEasyList = use_limited;
|
|
||||||
|
|
||||||
foreach (AdBlockSubscription *subscription, m_subscriptions) {
|
|
||||||
if (subscription->url() == QUrl(ADBLOCK_EASYLIST_URL)) {
|
|
||||||
// User really has EasyList activated, update it.
|
|
||||||
subscription->updateSubscription();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockManager::canBeBlocked(const QUrl &url) const {
|
|
||||||
return !m_matcher->adBlockDisabledForUrl(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockManager::elementHidingRules() const {
|
|
||||||
return m_matcher->elementHidingRules();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockManager::elementHidingRulesForDomain(const QUrl &url) const {
|
|
||||||
if (!isEnabled() || !canRunOnScheme(url.scheme()) || !canBeBlocked(url)) {
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
// Acid3 doesn't like the way element hiding rules are embedded into page
|
|
||||||
else if (url.host() == QL1S("acid3.acidtests.org")) {
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return m_matcher->elementHidingRulesForDomain(url.host());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSubscription *AdBlockManager::subscriptionByName(const QString &name) const {
|
|
||||||
foreach (AdBlockSubscription *subscription, m_subscriptions) {
|
|
||||||
if (subscription->title() == name) {
|
|
||||||
return subscription;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockDialog *AdBlockManager::showDialog() {
|
|
||||||
QPointer<AdBlockDialog> form_pointer = new AdBlockDialog(qApp->mainForm());
|
|
||||||
form_pointer.data()->setModal(true);
|
|
||||||
form_pointer.data()->show();
|
|
||||||
form_pointer.data()->raise();
|
|
||||||
form_pointer.data()->activateWindow();
|
|
||||||
return form_pointer.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockManager::showRule() {
|
|
||||||
if (QAction *action = qobject_cast<QAction*>(sender())) {
|
|
||||||
const AdBlockRule* rule = static_cast<const AdBlockRule*>(action->data().value<void*>());
|
|
||||||
|
|
||||||
if (rule != NULL) {
|
|
||||||
showDialog()->showRule(rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,102 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKMANAGER_H
|
|
||||||
#define ADBLOCKMANAGER_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QPointer>
|
|
||||||
|
|
||||||
|
|
||||||
class QUrl;
|
|
||||||
class QNetworkReply;
|
|
||||||
class QNetworkRequest;
|
|
||||||
|
|
||||||
class AdBlockRule;
|
|
||||||
class AdBlockDialog;
|
|
||||||
class AdBlockMatcher;
|
|
||||||
class AdBlockCustomList;
|
|
||||||
class AdBlockSubscription;
|
|
||||||
|
|
||||||
class AdBlockManager : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit AdBlockManager(QObject* parent = 0);
|
|
||||||
virtual ~AdBlockManager();
|
|
||||||
|
|
||||||
void load();
|
|
||||||
void save();
|
|
||||||
|
|
||||||
bool isEnabled() const;
|
|
||||||
bool canRunOnScheme(const QString &scheme) const;
|
|
||||||
|
|
||||||
bool useLimitedEasyList() const;
|
|
||||||
void setUseLimitedEasyList(bool use_limited);
|
|
||||||
|
|
||||||
QString elementHidingRules() const;
|
|
||||||
QString elementHidingRulesForDomain(const QUrl &url) const;
|
|
||||||
|
|
||||||
AdBlockSubscription *subscriptionByName(const QString &name) const;
|
|
||||||
QList<AdBlockSubscription*> subscriptions() const;
|
|
||||||
|
|
||||||
QNetworkReply *block(const QNetworkRequest &request);
|
|
||||||
|
|
||||||
QStringList disabledRules() const;
|
|
||||||
void addDisabledRule(const QString &filter);
|
|
||||||
void removeDisabledRule(const QString &filter);
|
|
||||||
|
|
||||||
AdBlockSubscription *addSubscription(const QString &title, const QString &url);
|
|
||||||
bool removeSubscription(AdBlockSubscription* subscription);
|
|
||||||
|
|
||||||
AdBlockCustomList *customList() const;
|
|
||||||
|
|
||||||
bool shouldBeEnabled() const;
|
|
||||||
|
|
||||||
static QString baseSubscriptionDirectory();
|
|
||||||
static AdBlockManager *instance();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void enabledChanged(bool enabled);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setEnabled(bool enabled);
|
|
||||||
void showRule();
|
|
||||||
void updateAllSubscriptions();
|
|
||||||
|
|
||||||
AdBlockDialog *showDialog();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool canBeBlocked(const QUrl &url) const;
|
|
||||||
|
|
||||||
bool m_loaded;
|
|
||||||
bool m_enabled;
|
|
||||||
bool m_useLimitedEasyList;
|
|
||||||
|
|
||||||
QList<AdBlockSubscription*> m_subscriptions;
|
|
||||||
AdBlockMatcher* m_matcher;
|
|
||||||
QStringList m_disabledRules;
|
|
||||||
|
|
||||||
static AdBlockManager* s_adBlockManager;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKMANAGER_H
|
|
||||||
|
|
@ -1,240 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmatcher.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
#include "network-web/adblock/adblockrule.h"
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockMatcher::AdBlockMatcher(AdBlockManager *manager) : QObject(manager), m_manager(manager) {
|
|
||||||
connect(manager, SIGNAL(enabledChanged(bool)), this, SLOT(enabledChanged(bool)));
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockMatcher::~AdBlockMatcher() {
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockMatcher::match(const QNetworkRequest &request, const QString &url_domain,
|
|
||||||
const QString &url_string) const {
|
|
||||||
// Exception rules.
|
|
||||||
if (m_networkExceptionTree.find(request, url_domain, url_string)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0, count = m_networkExceptionRules.size(); i < count; i++) {
|
|
||||||
const AdBlockRule *rule = m_networkExceptionRules.at(i);
|
|
||||||
|
|
||||||
if (rule->networkMatch(request, url_domain, url_string)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Block rules.
|
|
||||||
if (const AdBlockRule* rule = m_networkBlockTree.find(request, url_domain, url_string)) {
|
|
||||||
return rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0, count = m_networkBlockRules.size(); i < count; i++) {
|
|
||||||
const AdBlockRule *rule = m_networkBlockRules.at(i);
|
|
||||||
|
|
||||||
if (rule->networkMatch(request, url_domain, url_string)) {
|
|
||||||
return rule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockMatcher::adBlockDisabledForUrl(const QUrl &url) const {
|
|
||||||
for (int i = 0, count = m_documentRules.size(); i < count; i++) {
|
|
||||||
if (m_documentRules.at(i)->urlMatch(url)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockMatcher::elemHideDisabledForUrl(const QUrl &url) const {
|
|
||||||
if (adBlockDisabledForUrl(url)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0, count = m_elemhideRules.size(); i < count; i++) {
|
|
||||||
if (m_elemhideRules.at(i)->urlMatch(url)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockMatcher::elementHidingRules() const {
|
|
||||||
return m_elementHidingRules;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockMatcher::elementHidingRulesForDomain(const QString &domain) const {
|
|
||||||
QString rules;
|
|
||||||
int added_rules_count = 0;
|
|
||||||
|
|
||||||
for (int i = 0, count = m_domainRestrictedCssRules.size(); i < count; i++) {
|
|
||||||
const AdBlockRule *rule = m_domainRestrictedCssRules.at(i);
|
|
||||||
|
|
||||||
if (!rule->matchDomain(domain)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (added_rules_count == 1000) {
|
|
||||||
rules.append(rule->cssSelector());
|
|
||||||
rules.append(QL1S("{display:none !important;}\n"));
|
|
||||||
added_rules_count = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rules.append(rule->cssSelector() + QL1C(','));
|
|
||||||
added_rules_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (added_rules_count != 0) {
|
|
||||||
rules = rules.left(rules.size() - 1);
|
|
||||||
rules.append(QLatin1String("{display:none !important;}\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return rules;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockMatcher::update() {
|
|
||||||
clear();
|
|
||||||
|
|
||||||
QHash<QString, const AdBlockRule*> css_rules_hash;
|
|
||||||
QVector<const AdBlockRule*> exception_css_rules;
|
|
||||||
|
|
||||||
foreach (const AdBlockSubscription *subscription, m_manager->subscriptions()) {
|
|
||||||
foreach (const AdBlockRule *rule, subscription->allRules()) {
|
|
||||||
// Don't add internally disabled rules to cache
|
|
||||||
if (rule->isInternalDisabled()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rule->isCssRule()) {
|
|
||||||
// We will add only enabled css rules to cache, because there is no enabled/disabled
|
|
||||||
// check on match. They are directly embedded to pages.
|
|
||||||
if (!rule->isEnabled()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rule->isException()) {
|
|
||||||
exception_css_rules.append(rule);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
css_rules_hash.insert(rule->cssSelector(), rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (rule->isDocument()) {
|
|
||||||
m_documentRules.append(rule);
|
|
||||||
}
|
|
||||||
else if (rule->isElemhide()) {
|
|
||||||
m_elemhideRules.append(rule);
|
|
||||||
}
|
|
||||||
else if (rule->isException()) {
|
|
||||||
if (!m_networkExceptionTree.add(rule)) {
|
|
||||||
m_networkExceptionRules.append(rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!m_networkBlockTree.add(rule)) {
|
|
||||||
m_networkBlockRules.append(rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (const AdBlockRule *rule, exception_css_rules) {
|
|
||||||
const AdBlockRule *original_rule = css_rules_hash.value(rule->cssSelector());
|
|
||||||
|
|
||||||
// If we don't have this selector, the exception does nothing.
|
|
||||||
if (original_rule == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockRule *copied_rule = original_rule->copy();
|
|
||||||
|
|
||||||
copied_rule->m_options |= AdBlockRule::DomainRestrictedOption;
|
|
||||||
copied_rule->m_blockedDomains.append(rule->m_allowedDomains);
|
|
||||||
css_rules_hash[rule->cssSelector()] = copied_rule;
|
|
||||||
m_createdRules.append(copied_rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apparently, excessive amount of selectors for one CSS rule is not what WebKit likes.
|
|
||||||
// (In my testings, 4931 is the number that makes it crash)
|
|
||||||
// So let's split it by 1000 selectors.
|
|
||||||
int hiding_rules_count = 0;
|
|
||||||
|
|
||||||
QHashIterator<QString,const AdBlockRule*> it(css_rules_hash);
|
|
||||||
|
|
||||||
while (it.hasNext()) {
|
|
||||||
it.next();
|
|
||||||
const AdBlockRule *rule = it.value();
|
|
||||||
|
|
||||||
if (rule->isDomainRestricted()) {
|
|
||||||
m_domainRestrictedCssRules.append(rule);
|
|
||||||
}
|
|
||||||
else if (hiding_rules_count == 1000) {
|
|
||||||
m_elementHidingRules.append(rule->cssSelector());
|
|
||||||
m_elementHidingRules.append(QL1S("{display:none !important;} "));
|
|
||||||
hiding_rules_count = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_elementHidingRules.append(rule->cssSelector() + QL1C(','));
|
|
||||||
hiding_rules_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hiding_rules_count != 0) {
|
|
||||||
m_elementHidingRules = m_elementHidingRules.left(m_elementHidingRules.size() - 1);
|
|
||||||
m_elementHidingRules.append(QLatin1String("{display:none !important;} "));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockMatcher::clear() {
|
|
||||||
m_networkExceptionTree.clear();
|
|
||||||
m_networkExceptionRules.clear();
|
|
||||||
|
|
||||||
m_networkBlockTree.clear();
|
|
||||||
m_networkBlockRules.clear();
|
|
||||||
|
|
||||||
m_domainRestrictedCssRules.clear();
|
|
||||||
m_elementHidingRules.clear();
|
|
||||||
m_documentRules.clear();
|
|
||||||
m_elemhideRules.clear();
|
|
||||||
|
|
||||||
qDeleteAll(m_createdRules);
|
|
||||||
m_createdRules.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockMatcher::enabledChanged(bool enabled) {
|
|
||||||
if (enabled) {
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKMATCHER_H
|
|
||||||
#define ADBLOCKMATCHER_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QVector>
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocksearchtree.h"
|
|
||||||
|
|
||||||
|
|
||||||
class AdBlockManager;
|
|
||||||
class AdBlockRule;
|
|
||||||
|
|
||||||
class AdBlockMatcher : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AdBlockMatcher(AdBlockManager *manager);
|
|
||||||
virtual ~AdBlockMatcher();
|
|
||||||
|
|
||||||
const AdBlockRule *match(const QNetworkRequest &request, const QString &url_domain, const QString &url_string) const;
|
|
||||||
|
|
||||||
bool adBlockDisabledForUrl(const QUrl &url) const;
|
|
||||||
bool elemHideDisabledForUrl(const QUrl &url) const;
|
|
||||||
|
|
||||||
QString elementHidingRules() const;
|
|
||||||
QString elementHidingRulesForDomain(const QString &domain) const;
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void update();
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void enabledChanged(bool enabled);
|
|
||||||
|
|
||||||
private:
|
|
||||||
AdBlockManager *m_manager;
|
|
||||||
|
|
||||||
QVector<AdBlockRule*> m_createdRules;
|
|
||||||
QVector<const AdBlockRule*> m_networkExceptionRules;
|
|
||||||
QVector<const AdBlockRule*> m_networkBlockRules;
|
|
||||||
QVector<const AdBlockRule*> m_domainRestrictedCssRules;
|
|
||||||
QVector<const AdBlockRule*> m_documentRules;
|
|
||||||
QVector<const AdBlockRule*> m_elemhideRules;
|
|
||||||
|
|
||||||
QString m_elementHidingRules;
|
|
||||||
AdBlockSearchTree m_networkBlockTree;
|
|
||||||
AdBlockSearchTree m_networkExceptionTree;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKMATCHER_H
|
|
@ -1,683 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2009, Zsombor Gegesy <gzsombor@gmail.com>
|
|
||||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockrule.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
#include "network-web/webfactory.h"
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QString>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QWebFrame>
|
|
||||||
#include <QWebPage>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockRule::AdBlockRule(const QString &filter, AdBlockSubscription* subscription)
|
|
||||||
: m_subscription(subscription), m_type(StringContainsMatchRule), m_caseSensitivity(Qt::CaseInsensitive), m_isEnabled(true),
|
|
||||||
m_isException(false), m_isInternalDisabled(false), m_regExp(NULL) {
|
|
||||||
setFilter(filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockRule::~AdBlockRule() {
|
|
||||||
delete m_regExp;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockRule *AdBlockRule::copy() const {
|
|
||||||
AdBlockRule* rule = new AdBlockRule();
|
|
||||||
|
|
||||||
rule->m_subscription = m_subscription;
|
|
||||||
rule->m_type = m_type;
|
|
||||||
rule->m_options = m_options;
|
|
||||||
rule->m_exceptions = m_exceptions;
|
|
||||||
rule->m_filter = m_filter;
|
|
||||||
rule->m_matchString = m_matchString;
|
|
||||||
rule->m_caseSensitivity = m_caseSensitivity;
|
|
||||||
rule->m_isEnabled = m_isEnabled;
|
|
||||||
rule->m_isException = m_isException;
|
|
||||||
rule->m_isInternalDisabled = m_isInternalDisabled;
|
|
||||||
rule->m_allowedDomains = m_allowedDomains;
|
|
||||||
rule->m_blockedDomains = m_blockedDomains;
|
|
||||||
|
|
||||||
if (m_regExp != NULL) {
|
|
||||||
rule->m_regExp = new RegExp();
|
|
||||||
rule->m_regExp->regExp = m_regExp->regExp;
|
|
||||||
rule->m_regExp->matchers = m_regExp->matchers;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSubscription *AdBlockRule::subscription() const {
|
|
||||||
return m_subscription;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::setSubscription(AdBlockSubscription *subscription) {
|
|
||||||
m_subscription = subscription;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockRule::filter() const {
|
|
||||||
return m_filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::setFilter(const QString &filter) {
|
|
||||||
m_filter = filter;
|
|
||||||
parseFilter();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isCssRule() const {
|
|
||||||
return m_type == CssRule;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockRule::cssSelector() const {
|
|
||||||
return m_matchString;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isDocument() const {
|
|
||||||
return hasOption(DocumentOption);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isElemhide() const {
|
|
||||||
return hasOption(ElementHideOption);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isDomainRestricted() const {
|
|
||||||
return hasOption(DomainRestrictedOption);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isException() const {
|
|
||||||
return m_isException;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isComment() const {
|
|
||||||
return m_filter.startsWith(QL1C('!'));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isEnabled() const {
|
|
||||||
return m_isEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::setEnabled(bool enabled) {
|
|
||||||
m_isEnabled = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isSlow() const {
|
|
||||||
return m_regExp != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isInternalDisabled() const {
|
|
||||||
return m_isInternalDisabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::urlMatch(const QUrl &url) const {
|
|
||||||
if (!hasOption(DocumentOption) && !hasOption(ElementHideOption)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return networkMatch(QNetworkRequest(url), url.host(), url.toEncoded());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::networkMatch(const QNetworkRequest &request, const QString &domain, const QString &encoded_url) const {
|
|
||||||
if (m_type == CssRule || !m_isEnabled || m_isInternalDisabled) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool matched = false;
|
|
||||||
|
|
||||||
if (m_type == StringContainsMatchRule) {
|
|
||||||
matched = encoded_url.contains(m_matchString, m_caseSensitivity);
|
|
||||||
}
|
|
||||||
else if (m_type == DomainMatchRule) {
|
|
||||||
matched = isMatchingDomain(domain, m_matchString);
|
|
||||||
}
|
|
||||||
else if (m_type == StringEndsMatchRule) {
|
|
||||||
matched = encoded_url.endsWith(m_matchString, m_caseSensitivity);
|
|
||||||
}
|
|
||||||
else if (m_type == RegExpMatchRule) {
|
|
||||||
if (!isMatchingRegExpStrings(encoded_url)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
matched = (m_regExp->regExp.indexIn(encoded_url) != -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matched) {
|
|
||||||
// Check domain restrictions.
|
|
||||||
if (hasOption(DomainRestrictedOption) && !matchDomain(domain)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check third-party restriction.
|
|
||||||
if (hasOption(ThirdPartyOption) && !matchThirdParty(request)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check object restrictions.
|
|
||||||
if (hasOption(ObjectOption) && !matchObject(request)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check subdocument restriction.
|
|
||||||
if (hasOption(SubdocumentOption) && !matchSubdocument(request)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check xmlhttprequest restriction
|
|
||||||
if (hasOption(XMLHttpRequestOption) && !matchXmlHttpRequest(request)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check image restriction
|
|
||||||
if (hasOption(ImageOption) && !matchImage(encoded_url)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return matched;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::matchDomain(const QString &domain) const {
|
|
||||||
if (!m_isEnabled) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasOption(DomainRestrictedOption)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_blockedDomains.isEmpty()) {
|
|
||||||
foreach (const QString &d, m_allowedDomains) {
|
|
||||||
if (isMatchingDomain(domain, d)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (m_allowedDomains.isEmpty()) {
|
|
||||||
foreach (const QString &d, m_blockedDomains) {
|
|
||||||
if (isMatchingDomain(domain, d)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach (const QString &d, m_blockedDomains) {
|
|
||||||
if (isMatchingDomain(domain, d)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (const QString &d, m_allowedDomains) {
|
|
||||||
if (isMatchingDomain(domain, d)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::matchThirdParty(const QNetworkRequest &request) const {
|
|
||||||
const QString referer = request.attribute(QNetworkRequest::Attribute(QNetworkRequest::User + 151), QString()).toString();
|
|
||||||
|
|
||||||
if (referer.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Third-party matching should be performed on second-level domains.
|
|
||||||
const QString refererHost = WebFactory::instance()->toSecondLevelDomain(QUrl(referer));
|
|
||||||
const QString host = WebFactory::instance()->toSecondLevelDomain(request.url());
|
|
||||||
|
|
||||||
bool match = refererHost != host;
|
|
||||||
|
|
||||||
return hasException(ThirdPartyOption) ? !match : match;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::matchObject(const QNetworkRequest &request) const {
|
|
||||||
bool match = request.attribute(QNetworkRequest::Attribute(QNetworkRequest::User + 150)).toString() == QL1S("object");
|
|
||||||
|
|
||||||
return hasException(ObjectOption) ? !match : match;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::matchSubdocument(const QNetworkRequest &request) const {
|
|
||||||
QWebFrame *originatingFrame = static_cast<QWebFrame*>(request.originatingObject());
|
|
||||||
|
|
||||||
if (originatingFrame == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWebPage *page = originatingFrame->page();
|
|
||||||
|
|
||||||
if (page == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool match = !(originatingFrame == page->mainFrame());
|
|
||||||
|
|
||||||
return hasException(SubdocumentOption) ? !match : match;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::matchXmlHttpRequest(const QNetworkRequest &request) const {
|
|
||||||
bool match = request.rawHeader("X-Requested-With") == QByteArray("XMLHttpRequest");
|
|
||||||
|
|
||||||
return hasException(XMLHttpRequestOption) ? !match : match;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::matchImage(const QString &encoded_url) const {
|
|
||||||
bool match = encoded_url.endsWith(QL1S(".png")) ||
|
|
||||||
encoded_url.endsWith(QL1S(".jpg")) ||
|
|
||||||
encoded_url.endsWith(QL1S(".gif")) ||
|
|
||||||
encoded_url.endsWith(QL1S(".jpeg"));
|
|
||||||
|
|
||||||
return hasException(ImageOption) ? !match : match;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::parseFilter() {
|
|
||||||
QString parsed_line = m_filter;
|
|
||||||
|
|
||||||
// Empty rule or just comment.
|
|
||||||
if (m_filter.trimmed().isEmpty() || m_filter.startsWith(QL1C('!'))) {
|
|
||||||
// We want to differentiate rule disabled by user and rule disabled in subscription file
|
|
||||||
// m_isInternalDisabled is also used when rule is disabled due to all options not being supported.
|
|
||||||
m_isEnabled = false;
|
|
||||||
m_isInternalDisabled = true;
|
|
||||||
m_type = Invalid;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CSS Element hiding rule.
|
|
||||||
if (parsed_line.contains(QL1S("##")) || parsed_line.contains(QL1S("#@#"))) {
|
|
||||||
m_type = CssRule;
|
|
||||||
int pos = parsed_line.indexOf(QL1C('#'));
|
|
||||||
|
|
||||||
// Domain restricted rule
|
|
||||||
if (!parsed_line.startsWith(QL1S("##"))) {
|
|
||||||
QString domains = parsed_line.left(pos);
|
|
||||||
parseDomains(domains, QL1C(','));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_isException = parsed_line.at(pos + 1) == QL1C('@');
|
|
||||||
m_matchString = parsed_line.mid(m_isException ? pos + 3 : pos + 2);
|
|
||||||
|
|
||||||
// CSS rule cannot have more options -> stop parsing.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exception always starts with @@
|
|
||||||
if (parsed_line.startsWith(QL1S("@@"))) {
|
|
||||||
m_isException = true;
|
|
||||||
parsed_line = parsed_line.mid(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse all options following $ char.
|
|
||||||
int optionsIndex = parsed_line.indexOf(QL1C('$'));
|
|
||||||
if (optionsIndex >= 0) {
|
|
||||||
const QStringList options = parsed_line.mid(optionsIndex + 1).split(QL1C(','), QString::SkipEmptyParts);
|
|
||||||
|
|
||||||
int handledOptions = 0;
|
|
||||||
foreach (const QString &option, options) {
|
|
||||||
if (option.startsWith(QL1S("domain="))) {
|
|
||||||
parseDomains(option.mid(7), QL1C('|'));
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option == QL1S("match-case")) {
|
|
||||||
m_caseSensitivity = Qt::CaseSensitive;
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option.endsWith(QL1S("third-party"))) {
|
|
||||||
setOption(ThirdPartyOption);
|
|
||||||
setException(ThirdPartyOption, option.startsWith(QL1C('~')));
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option.endsWith(QL1S("object"))) {
|
|
||||||
setOption(ObjectOption);
|
|
||||||
setException(ObjectOption, option.startsWith(QL1C('~')));
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option.endsWith(QL1S("subdocument"))) {
|
|
||||||
setOption(SubdocumentOption);
|
|
||||||
setException(SubdocumentOption, option.startsWith(QL1C('~')));
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option.endsWith(QL1S("xmlhttprequest"))) {
|
|
||||||
setOption(XMLHttpRequestOption);
|
|
||||||
setException(XMLHttpRequestOption, option.startsWith(QL1C('~')));
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option.endsWith(QL1S("image"))) {
|
|
||||||
setOption(ImageOption);
|
|
||||||
setException(ImageOption, option.startsWith(QL1C('~')));
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option == QL1S("document") && m_isException) {
|
|
||||||
setOption(DocumentOption);
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option == QL1S("elemhide") && m_isException) {
|
|
||||||
setOption(ElementHideOption);
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
else if (option == QL1S("collapse")) {
|
|
||||||
// Hiding placeholders of blocked elements is enabled by default.
|
|
||||||
++handledOptions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we don't handle all options, it's safer to just disable this rule.
|
|
||||||
if (handledOptions != options.count()) {
|
|
||||||
m_isInternalDisabled = true;
|
|
||||||
m_type = Invalid;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
parsed_line = parsed_line.left(optionsIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rule is classic regexp.
|
|
||||||
if (parsed_line.startsWith(QL1C('/')) && parsed_line.endsWith(QL1C('/'))) {
|
|
||||||
parsed_line = parsed_line.mid(1);
|
|
||||||
parsed_line = parsed_line.left(parsed_line.size() - 1);
|
|
||||||
|
|
||||||
m_type = RegExpMatchRule;
|
|
||||||
m_regExp = new RegExp();
|
|
||||||
m_regExp->regExp = QRegExp(parsed_line, m_caseSensitivity);
|
|
||||||
m_regExp->matchers = createStringMatchers(parseRegExpFilter(parsed_line));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove starting and ending wildcards (*).
|
|
||||||
if (parsed_line.startsWith(QL1C('*'))) {
|
|
||||||
parsed_line = parsed_line.mid(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parsed_line.endsWith(QL1C('*'))) {
|
|
||||||
parsed_line = parsed_line.left(parsed_line.size() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// We can use fast string matching for domain here.
|
|
||||||
if (filterIsOnlyDomain(parsed_line)) {
|
|
||||||
parsed_line = parsed_line.mid(2);
|
|
||||||
parsed_line = parsed_line.left(parsed_line.size() - 1);
|
|
||||||
|
|
||||||
m_type = DomainMatchRule;
|
|
||||||
m_matchString = parsed_line;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If rule contains only | at end, we can also use string matching.
|
|
||||||
if (filterIsOnlyEndsMatch(parsed_line)) {
|
|
||||||
parsed_line = parsed_line.left(parsed_line.size() - 1);
|
|
||||||
|
|
||||||
m_type = StringEndsMatchRule;
|
|
||||||
m_matchString = parsed_line;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we still find a wildcard (*) or separator (^) or (|)
|
|
||||||
// we must modify parsedLine to comply with QzRegExp.
|
|
||||||
if (parsed_line.contains(QL1C('*')) ||
|
|
||||||
parsed_line.contains(QL1C('^')) ||
|
|
||||||
parsed_line.contains(QL1C('|'))
|
|
||||||
) {
|
|
||||||
m_type = RegExpMatchRule;
|
|
||||||
m_regExp = new RegExp;
|
|
||||||
m_regExp->regExp = QRegExp(createRegExpFromFilter(parsed_line), m_caseSensitivity);
|
|
||||||
m_regExp->matchers = createStringMatchers(parseRegExpFilter(parsed_line));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We haven't found anything that needs use of regexp, yay!
|
|
||||||
m_type = StringContainsMatchRule;
|
|
||||||
m_matchString = parsed_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::parseDomains(const QString &domains, const QChar &separator) {
|
|
||||||
QStringList domains_list = domains.split(separator, QString::SkipEmptyParts);
|
|
||||||
|
|
||||||
foreach (const QString domain, domains_list) {
|
|
||||||
if (!domain.isEmpty()) {
|
|
||||||
if (domain.startsWith(QL1C('~'))) {
|
|
||||||
m_blockedDomains.append(domain.mid(1));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_allowedDomains.append(domain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_blockedDomains.isEmpty() || !m_allowedDomains.isEmpty()) {
|
|
||||||
setOption(DomainRestrictedOption);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::filterIsOnlyDomain(const QString &filter) const {
|
|
||||||
if (!filter.endsWith(QL1C('^')) || !filter.startsWith(QL1S("||"))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < filter.size(); i++) {
|
|
||||||
switch (filter.at(i).toLatin1()) {
|
|
||||||
case '/':
|
|
||||||
case ':':
|
|
||||||
case '?':
|
|
||||||
case '=':
|
|
||||||
case '&':
|
|
||||||
case '*':
|
|
||||||
return false;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::filterIsOnlyEndsMatch(const QString &filter) const {
|
|
||||||
for (int i = 0; i < filter.size(); ++i) {
|
|
||||||
switch (filter.at(i).toLatin1()) {
|
|
||||||
case '^':
|
|
||||||
case '*':
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case '|':
|
|
||||||
return i == filter.size() - 1;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool wordCharacter(const QChar &c) {
|
|
||||||
return c.isLetterOrNumber() || c.isMark() || c == QL1C('_');
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockRule::createRegExpFromFilter(const QString &filter) const {
|
|
||||||
QString parsed;
|
|
||||||
parsed.reserve(filter.size());
|
|
||||||
|
|
||||||
bool hadWildcard = false; // Filter multiple wildcards.
|
|
||||||
|
|
||||||
for (int i = 0; i < filter.size(); i++) {
|
|
||||||
const QChar c = filter.at(i);
|
|
||||||
|
|
||||||
switch (c.toLatin1()) {
|
|
||||||
case '^':
|
|
||||||
parsed.append(QL1S("(?:[^\\w\\d\\-.%]|$)"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '*':
|
|
||||||
if (!hadWildcard)
|
|
||||||
parsed.append(QL1S(".*"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '|':
|
|
||||||
if (i == 0) {
|
|
||||||
if (filter.size() > 1 && filter.at(1) == QL1C('|')) {
|
|
||||||
parsed.append(QL1S("^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?"));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parsed.append('^');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (i == filter.size() - 1) {
|
|
||||||
parsed.append(QL1C('$'));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Fall through.
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (!wordCharacter(c)) {
|
|
||||||
parsed.append(QL1C('\\') + c);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
parsed.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hadWildcard = c == QL1C('*');
|
|
||||||
}
|
|
||||||
|
|
||||||
return parsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QStringMatcher> AdBlockRule::createStringMatchers(const QStringList &filters) const {
|
|
||||||
QList<QStringMatcher> matchers;
|
|
||||||
matchers.reserve(filters.size());
|
|
||||||
|
|
||||||
foreach (const QString &filter, filters) {
|
|
||||||
matchers.append(QStringMatcher(filter, m_caseSensitivity));
|
|
||||||
}
|
|
||||||
|
|
||||||
return matchers;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isMatchingDomain(const QString &domain, const QString &pattern) const {
|
|
||||||
if (pattern == domain) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!domain.endsWith(pattern)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int index = domain.indexOf(pattern);
|
|
||||||
|
|
||||||
return index > 0 && domain[index - 1] == QLatin1Char('.');
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::isMatchingRegExpStrings(const QString &url) const {
|
|
||||||
Q_ASSERT(m_regExp);
|
|
||||||
|
|
||||||
foreach (const QStringMatcher &matcher, m_regExp->matchers) {
|
|
||||||
if (matcher.indexIn(url) == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Split regexp filter into strings that can be used with QString::contains.
|
|
||||||
// Don't use parts that contains only 1 char and duplicated parts.
|
|
||||||
QStringList AdBlockRule::parseRegExpFilter(const QString &filter) const {
|
|
||||||
QStringList list;
|
|
||||||
int start_pos = -1;
|
|
||||||
|
|
||||||
for (int i = 0; i < filter.size(); i++) {
|
|
||||||
const QChar c = filter.at(i);
|
|
||||||
|
|
||||||
// Meta characters in AdBlock rules are "| * ^".
|
|
||||||
if (c == QL1C('|') || c == QL1C('*') || c == QL1C('^')) {
|
|
||||||
const QString sub = filter.mid(start_pos, i - start_pos);
|
|
||||||
|
|
||||||
if (sub.size() > 1) {
|
|
||||||
list.append(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
start_pos = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString sub = filter.mid(start_pos);
|
|
||||||
|
|
||||||
if (sub.size() > 1) {
|
|
||||||
list.append(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
list.removeDuplicates();
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::hasOption(const AdBlockRule::RuleOption &opt) const {
|
|
||||||
return (m_options & opt);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockRule::hasException(const AdBlockRule::RuleOption &opt) const {
|
|
||||||
return (m_exceptions & opt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::setOption(const AdBlockRule::RuleOption &opt) {
|
|
||||||
m_options |= opt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockRule::setException(const AdBlockRule::RuleOption &opt, bool on) {
|
|
||||||
if (on) {
|
|
||||||
m_exceptions |= opt;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,180 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ADBLOCKRULE_H
|
|
||||||
#define ADBLOCKRULE_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QStringList>
|
|
||||||
|
|
||||||
class QNetworkRequest;
|
|
||||||
class QUrl;
|
|
||||||
|
|
||||||
class AdBlockSubscription;
|
|
||||||
|
|
||||||
class AdBlockRule {
|
|
||||||
friend class AdBlockMatcher;
|
|
||||||
friend class AdBlockSearchTree;
|
|
||||||
friend class AdBlockSubscription;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AdBlockRule(const QString &filter = QString(), AdBlockSubscription* subscription = NULL);
|
|
||||||
virtual ~AdBlockRule();
|
|
||||||
|
|
||||||
AdBlockRule *copy() const;
|
|
||||||
|
|
||||||
AdBlockSubscription *subscription() const;
|
|
||||||
void setSubscription(AdBlockSubscription *subscription);
|
|
||||||
|
|
||||||
QString filter() const;
|
|
||||||
void setFilter(const QString &filter);
|
|
||||||
|
|
||||||
bool isCssRule() const;
|
|
||||||
QString cssSelector() const;
|
|
||||||
|
|
||||||
bool isDocument() const;
|
|
||||||
bool isElemhide() const;
|
|
||||||
|
|
||||||
bool isDomainRestricted() const;
|
|
||||||
bool isException() const;
|
|
||||||
|
|
||||||
bool isComment() const;
|
|
||||||
bool isEnabled() const;
|
|
||||||
void setEnabled(bool enabled);
|
|
||||||
|
|
||||||
bool isSlow() const;
|
|
||||||
bool isInternalDisabled() const;
|
|
||||||
|
|
||||||
bool urlMatch(const QUrl &url) const;
|
|
||||||
bool networkMatch(const QNetworkRequest &request, const QString &domain, const QString &encoded_url) const;
|
|
||||||
|
|
||||||
bool matchDomain(const QString &domain) const;
|
|
||||||
bool matchThirdParty(const QNetworkRequest &request) const;
|
|
||||||
bool matchObject(const QNetworkRequest &request) const;
|
|
||||||
bool matchSubdocument(const QNetworkRequest &request) const;
|
|
||||||
bool matchXmlHttpRequest(const QNetworkRequest &request) const;
|
|
||||||
bool matchImage(const QString &encoded_url) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool isMatchingDomain(const QString &domain, const QString &pattern) const;
|
|
||||||
bool isMatchingRegExpStrings(const QString &url) const;
|
|
||||||
QStringList parseRegExpFilter(const QString &filter) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum RuleType {
|
|
||||||
CssRule = 0,
|
|
||||||
DomainMatchRule = 1,
|
|
||||||
RegExpMatchRule = 2,
|
|
||||||
StringEndsMatchRule = 3,
|
|
||||||
StringContainsMatchRule = 4,
|
|
||||||
Invalid = 5
|
|
||||||
};
|
|
||||||
|
|
||||||
enum RuleOption {
|
|
||||||
DomainRestrictedOption = 1,
|
|
||||||
ThirdPartyOption = 2,
|
|
||||||
ObjectOption = 4,
|
|
||||||
SubdocumentOption = 8,
|
|
||||||
XMLHttpRequestOption = 16,
|
|
||||||
ImageOption = 32,
|
|
||||||
|
|
||||||
// Exception only options.
|
|
||||||
DocumentOption = 64,
|
|
||||||
ElementHideOption = 128
|
|
||||||
};
|
|
||||||
|
|
||||||
Q_DECLARE_FLAGS(RuleOptions, RuleOption)
|
|
||||||
|
|
||||||
inline bool hasOption(const RuleOption &opt) const;
|
|
||||||
inline bool hasException(const RuleOption &opt) const;
|
|
||||||
|
|
||||||
inline void setOption(const RuleOption &opt);
|
|
||||||
inline void setException(const RuleOption &opt, bool on);
|
|
||||||
|
|
||||||
void parseFilter();
|
|
||||||
void parseDomains(const QString &domains, const QChar &separator);
|
|
||||||
bool filterIsOnlyDomain(const QString &filter) const;
|
|
||||||
bool filterIsOnlyEndsMatch(const QString &filter) const;
|
|
||||||
QString createRegExpFromFilter(const QString &filter) const;
|
|
||||||
QList<QStringMatcher> createStringMatchers(const QStringList &filters) const;
|
|
||||||
|
|
||||||
AdBlockSubscription *m_subscription;
|
|
||||||
|
|
||||||
RuleType m_type;
|
|
||||||
RuleOptions m_options;
|
|
||||||
RuleOptions m_exceptions;
|
|
||||||
|
|
||||||
// Original rule filter.
|
|
||||||
QString m_filter;
|
|
||||||
|
|
||||||
// Parsed rule for string matching (CSS Selector for CSS rules).
|
|
||||||
QString m_matchString;
|
|
||||||
|
|
||||||
// Case sensitivity for string matching.
|
|
||||||
Qt::CaseSensitivity m_caseSensitivity;
|
|
||||||
|
|
||||||
bool m_isEnabled;
|
|
||||||
bool m_isException;
|
|
||||||
bool m_isInternalDisabled;
|
|
||||||
|
|
||||||
QStringList m_allowedDomains;
|
|
||||||
QStringList m_blockedDomains;
|
|
||||||
|
|
||||||
struct RegExp {
|
|
||||||
public:
|
|
||||||
explicit RegExp() {
|
|
||||||
}
|
|
||||||
|
|
||||||
QRegExp regExp;
|
|
||||||
QList<QStringMatcher> matchers;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Use dynamic allocation to save memory
|
|
||||||
RegExp *m_regExp;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKRULE_H
|
|
||||||
|
|
@ -1,137 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocksearchtree.h"
|
|
||||||
#include "network-web/adblock/adblockrule.h"
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockSearchTree::AdBlockSearchTree() : m_root(new Node()) {
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSearchTree::~AdBlockSearchTree() {
|
|
||||||
deleteNode(m_root);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSearchTree::clear() {
|
|
||||||
deleteNode(m_root);
|
|
||||||
m_root = new Node();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockSearchTree::add(const AdBlockRule *rule) {
|
|
||||||
if (rule->m_type != AdBlockRule::StringContainsMatchRule) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString filter = rule->m_matchString;
|
|
||||||
const int len = filter.size();
|
|
||||||
|
|
||||||
if (len <= 0) {
|
|
||||||
qWarning("Inserting rule with filter len <= 0!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Node *node = m_root;
|
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
const QChar c = filter.at(i);
|
|
||||||
|
|
||||||
if (!node->children.contains(c)) {
|
|
||||||
Node *n = new Node();
|
|
||||||
n->c = c;
|
|
||||||
|
|
||||||
node->children[c] = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
node = node->children[c];
|
|
||||||
}
|
|
||||||
|
|
||||||
node->rule = rule;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockSearchTree::find(const QNetworkRequest &request, const QString &domain,
|
|
||||||
const QString &url_string) const {
|
|
||||||
const int len = url_string.size();
|
|
||||||
|
|
||||||
if (len <= 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QChar *string = url_string.constData();
|
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
const AdBlockRule *rule = prefixSearch(request, domain, url_string, string++, len - i);
|
|
||||||
|
|
||||||
if (rule != NULL) {
|
|
||||||
return rule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockSearchTree::prefixSearch(const QNetworkRequest &request, const QString &domain,
|
|
||||||
const QString &url_string, const QChar* string, int len) const {
|
|
||||||
if (len <= 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
QChar c = string[0];
|
|
||||||
|
|
||||||
if (!m_root->children.contains(c)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Node *node = m_root->children[c];
|
|
||||||
|
|
||||||
for (int i = 1; i < len; i++) {
|
|
||||||
const QChar c = (++string)[0];
|
|
||||||
|
|
||||||
if (node->rule && node->rule->networkMatch(request, domain, url_string)) {
|
|
||||||
return node->rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!node->children.contains(c)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
node = node->children[c];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node->rule && node->rule->networkMatch(request, domain, url_string)) {
|
|
||||||
return node->rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSearchTree::deleteNode(Node *node) {
|
|
||||||
if (node == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QHashIterator<QChar,Node*> i(node->children);
|
|
||||||
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
deleteNode(i.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
delete node;
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKSEARCHTREE_H
|
|
||||||
#define ADBLOCKSEARCHTREE_H
|
|
||||||
|
|
||||||
#include <QChar>
|
|
||||||
#include <QHash>
|
|
||||||
|
|
||||||
|
|
||||||
class QNetworkRequest;
|
|
||||||
class AdBlockRule;
|
|
||||||
|
|
||||||
class AdBlockSearchTree {
|
|
||||||
public:
|
|
||||||
explicit AdBlockSearchTree();
|
|
||||||
virtual ~AdBlockSearchTree();
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
bool add(const AdBlockRule *rule);
|
|
||||||
const AdBlockRule *find(const QNetworkRequest &request, const QString &domain, const QString &url_string) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct Node {
|
|
||||||
public:
|
|
||||||
QChar c;
|
|
||||||
const AdBlockRule *rule;
|
|
||||||
QHash<QChar,Node*> children;
|
|
||||||
|
|
||||||
Node() : c(0) , rule(0) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void deleteNode(Node *node);
|
|
||||||
const AdBlockRule *prefixSearch(const QNetworkRequest &request, const QString &domain,
|
|
||||||
const QString &url_string, const QChar* string, int len) const;
|
|
||||||
|
|
||||||
Node *m_root;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKSEARCHTREE_H
|
|
@ -1,393 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
#include "network-web/adblock/adblocksearchtree.h"
|
|
||||||
#include "network-web/downloader.h"
|
|
||||||
#include "miscellaneous/iofactory.h"
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
#include "exceptions/applicationexception.h"
|
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QWebPage>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockSubscription::AdBlockSubscription(const QString &title, QObject *parent)
|
|
||||||
: QObject(parent), m_title(title), m_downloadingSubscription(false), m_updated(false) {
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockSubscription::title() const {
|
|
||||||
return m_title;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::setTitle(const QString &title) {
|
|
||||||
m_title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AdBlockSubscription::filePath() const {
|
|
||||||
return m_filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::setFilePath(const QString &path) {
|
|
||||||
m_filePath = path;
|
|
||||||
}
|
|
||||||
|
|
||||||
QUrl AdBlockSubscription::url() const {
|
|
||||||
return m_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::setUrl(const QUrl &url) {
|
|
||||||
m_url = url;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::loadSubscription(const QStringList &disabled_rules) {
|
|
||||||
QFile file(m_filePath);
|
|
||||||
|
|
||||||
if (!file.exists()) {
|
|
||||||
qWarning("Cannot load subscription '%s'. Requesting its update.", qPrintable(title()));
|
|
||||||
QTimer::singleShot(0, this, SLOT(updateSubscription()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file.open(QFile::ReadOnly)) {
|
|
||||||
qWarning("Unable to open subscription file '%s' for reading.", qPrintable(QDir::toNativeSeparators(m_filePath)));
|
|
||||||
QTimer::singleShot(0, this, SLOT(updateSubscription()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream textStream(&file);
|
|
||||||
textStream.setCodec("UTF-8");
|
|
||||||
|
|
||||||
// Header is on 3rd line.
|
|
||||||
textStream.readLine(1024);
|
|
||||||
textStream.readLine(1024);
|
|
||||||
QString header = textStream.readLine(1024);
|
|
||||||
|
|
||||||
if (!header.startsWith(QL1S("[Adblock")) || m_title.isEmpty()) {
|
|
||||||
qWarning("Invalid format of subscription file '%s'.", qPrintable(QDir::toNativeSeparators(m_filePath)));
|
|
||||||
file.close();
|
|
||||||
QTimer::singleShot(0, this, SLOT(updateSubscription()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_rules.clear();
|
|
||||||
|
|
||||||
while (!textStream.atEnd()) {
|
|
||||||
AdBlockRule *rule = new AdBlockRule(textStream.readLine(), this);
|
|
||||||
|
|
||||||
if (disabled_rules.contains(rule->filter())) {
|
|
||||||
rule->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_rules.append(rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
// Initial update.
|
|
||||||
if (m_rules.isEmpty() && !m_updated) {
|
|
||||||
QTimer::singleShot(0, this, SLOT(updateSubscription()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::saveSubscription() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::updateSubscription() {
|
|
||||||
if (m_downloadingSubscription || !m_url.isValid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_downloadingSubscription = true;
|
|
||||||
|
|
||||||
Downloader *downloader = new Downloader();
|
|
||||||
|
|
||||||
connect(downloader, SIGNAL(completed(QNetworkReply::NetworkError,QByteArray)), this, SLOT(subscriptionDownloaded()));
|
|
||||||
downloader->downloadFile(m_url.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockSubscription::subscriptionDownloaded() {
|
|
||||||
Downloader *downloader = qobject_cast<Downloader*>(sender());
|
|
||||||
|
|
||||||
if (downloader == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool error = false;
|
|
||||||
QByteArray response = QString::fromUtf8(downloader->lastOutputData()).toUtf8();
|
|
||||||
|
|
||||||
if (response.startsWith(' ')) {
|
|
||||||
// Deal with " [Adblock".
|
|
||||||
response = response.remove(0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (downloader->lastOutputError() != QNetworkReply::NoError ||
|
|
||||||
!response.startsWith(QByteArray("[Adblock")) ||
|
|
||||||
!saveDownloadedData(response)) {
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
downloader->deleteLater();
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
emit subscriptionError(tr("Cannot load subscription!"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
loadSubscription(AdBlockManager::instance()->disabledRules());
|
|
||||||
|
|
||||||
emit subscriptionUpdated();
|
|
||||||
emit subscriptionChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_downloadingSubscription = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockSubscription::saveDownloadedData(const QByteArray &data) {
|
|
||||||
QFile file(m_filePath);
|
|
||||||
|
|
||||||
if (!file.open(QFile::ReadWrite | QFile::Truncate)) {
|
|
||||||
qWarning("Unable to open subscription file '%s' for writting.", qPrintable(QDir::toNativeSeparators(m_filePath)));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write subscription header
|
|
||||||
file.write(QString("Title: %1\nUrl: %2\n").arg(title(), url().toString()).toUtf8());
|
|
||||||
|
|
||||||
if (AdBlockManager::instance()->useLimitedEasyList() && m_url == QUrl(ADBLOCK_EASYLIST_URL)) {
|
|
||||||
// Third-party advertisers rules are with start domain (||) placeholder which needs regexps
|
|
||||||
// So we are ignoring it for keeping good performance
|
|
||||||
// But we will use whitelist rules at the end of list
|
|
||||||
|
|
||||||
QByteArray part1 = data.left(data.indexOf(QL1S("!-----------------------------Third-party adverts-----------------------------!")));
|
|
||||||
QByteArray part2 = data.mid(data.indexOf(QL1S("!---------------------------------Whitelists----------------------------------!")));
|
|
||||||
|
|
||||||
file.write(part1);
|
|
||||||
file.write(part2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
file.write(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.flush();
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockSubscription::rule(int offset) const{
|
|
||||||
if (offset >= 0 && m_rules.size() > offset) {
|
|
||||||
return m_rules[offset];
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QVector<AdBlockRule*> AdBlockSubscription::allRules() const {
|
|
||||||
return m_rules;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockSubscription::enableRule(int offset) {
|
|
||||||
if (offset >= 0 && m_rules.size() > offset) {
|
|
||||||
AdBlockRule *rule = m_rules[offset];
|
|
||||||
rule->setEnabled(true);
|
|
||||||
AdBlockManager::instance()->removeDisabledRule(rule->filter());
|
|
||||||
|
|
||||||
emit subscriptionChanged();
|
|
||||||
|
|
||||||
return rule;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockSubscription::disableRule(int offset) {
|
|
||||||
if (offset >= 0 && m_rules.size() > offset) {
|
|
||||||
AdBlockRule *rule = m_rules[offset];
|
|
||||||
rule->setEnabled(false);
|
|
||||||
AdBlockManager::instance()->addDisabledRule(rule->filter());
|
|
||||||
|
|
||||||
emit subscriptionChanged();
|
|
||||||
|
|
||||||
return rule;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockSubscription::canEditRules() const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockSubscription::canBeRemoved() const {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int AdBlockSubscription::addRule(AdBlockRule *rule) {
|
|
||||||
Q_UNUSED(rule)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockSubscription::removeRule(int offset) {
|
|
||||||
Q_UNUSED(offset)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockSubscription::replaceRule(AdBlockRule *rule, int offset) {
|
|
||||||
Q_UNUSED(rule)
|
|
||||||
Q_UNUSED(offset)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSubscription::~AdBlockSubscription() {
|
|
||||||
qDeleteAll(m_rules);
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockCustomList::AdBlockCustomList(QObject *parent) : AdBlockSubscription(tr("Custom rules"), parent) {
|
|
||||||
setTitle(tr("Custom rules"));
|
|
||||||
setFilePath(AdBlockManager::baseSubscriptionDirectory() + QDir::separator() + ADBLOCK_CUSTOM_LIST_FILENAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockCustomList::~AdBlockCustomList() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockCustomList::saveSubscription() {
|
|
||||||
QFile file(m_filePath);
|
|
||||||
|
|
||||||
if (!file.open(QFile::WriteOnly | QFile::Truncate)) {
|
|
||||||
qWarning("Unable to open custom subscription file '%s' for writting.", qPrintable(QDir::toNativeSeparators(m_filePath)));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream textStream(&file);
|
|
||||||
textStream.setCodec("UTF-8");
|
|
||||||
textStream << "Title: " << title() << endl;
|
|
||||||
textStream << "Url: " << url().toString() << endl;
|
|
||||||
textStream << "[Adblock Plus 1.1.1]" << endl;
|
|
||||||
|
|
||||||
foreach (const AdBlockRule *rule, m_rules) {
|
|
||||||
textStream << rule->filter() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
file.flush();
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockCustomList::canEditRules() const {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockCustomList::canBeRemoved() const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockCustomList::containsFilter(const QString &filter) const {
|
|
||||||
foreach (const AdBlockRule *rule, m_rules) {
|
|
||||||
if (rule->filter() == filter) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockCustomList::removeFilter(const QString &filter) {
|
|
||||||
for (int i = 0; i < m_rules.size(); i++) {
|
|
||||||
const AdBlockRule *rule = m_rules.at(i);
|
|
||||||
|
|
||||||
if (rule->filter() == filter) {
|
|
||||||
return removeRule(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int AdBlockCustomList::addRule(AdBlockRule *rule) {
|
|
||||||
m_rules.append(rule);
|
|
||||||
emit subscriptionChanged();
|
|
||||||
|
|
||||||
return m_rules.size() - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AdBlockCustomList::removeRule(int offset) {
|
|
||||||
if (offset >= 0 && m_rules.size() > offset) {
|
|
||||||
AdBlockRule *rule = m_rules.at(offset);
|
|
||||||
const QString filter = rule->filter();
|
|
||||||
|
|
||||||
m_rules.remove(offset);
|
|
||||||
emit subscriptionChanged();
|
|
||||||
|
|
||||||
AdBlockManager::instance()->removeDisabledRule(filter);
|
|
||||||
delete rule;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const AdBlockRule *AdBlockCustomList::replaceRule(AdBlockRule *rule, int offset) {
|
|
||||||
if (offset >= 0 && m_rules.size() > offset) {
|
|
||||||
AdBlockRule *oldRule = m_rules.at(offset);
|
|
||||||
m_rules[offset] = rule;
|
|
||||||
emit subscriptionChanged();
|
|
||||||
|
|
||||||
delete oldRule;
|
|
||||||
return m_rules[offset];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,141 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2009, Benjamin C. Meyer <ben@meyerhome.net>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the Benjamin Meyer nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ADBLOCKSUBSCRIPTION_H
|
|
||||||
#define ADBLOCKSUBSCRIPTION_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#include <QVector>
|
|
||||||
#include <QUrl>
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockrule.h"
|
|
||||||
#include "network-web/adblock/adblocksearchtree.h"
|
|
||||||
|
|
||||||
|
|
||||||
class QNetworkRequest;
|
|
||||||
class QNetworkReply;
|
|
||||||
class QUrl;
|
|
||||||
class FollowRedirectReply;
|
|
||||||
|
|
||||||
class AdBlockSubscription : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AdBlockSubscription(const QString &title, QObject *parent = 0);
|
|
||||||
virtual ~AdBlockSubscription();
|
|
||||||
|
|
||||||
QString title() const;
|
|
||||||
void setTitle(const QString &title);
|
|
||||||
|
|
||||||
QString filePath() const;
|
|
||||||
void setFilePath(const QString &path);
|
|
||||||
|
|
||||||
QUrl url() const;
|
|
||||||
void setUrl(const QUrl &url);
|
|
||||||
|
|
||||||
virtual void loadSubscription(const QStringList &disabled_rules);
|
|
||||||
virtual void saveSubscription();
|
|
||||||
|
|
||||||
const AdBlockRule *rule(int offset) const;
|
|
||||||
QVector<AdBlockRule*> allRules() const;
|
|
||||||
|
|
||||||
const AdBlockRule *enableRule(int offset);
|
|
||||||
const AdBlockRule *disableRule(int offset);
|
|
||||||
|
|
||||||
virtual bool canEditRules() const;
|
|
||||||
virtual bool canBeRemoved() const;
|
|
||||||
|
|
||||||
virtual int addRule(AdBlockRule *rule);
|
|
||||||
virtual bool removeRule(int offset);
|
|
||||||
virtual const AdBlockRule *replaceRule(AdBlockRule *rule, int offset);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void updateSubscription();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void subscriptionChanged();
|
|
||||||
void subscriptionUpdated();
|
|
||||||
void subscriptionError(const QString &message);
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void subscriptionDownloaded();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual bool saveDownloadedData(const QByteArray &data);
|
|
||||||
|
|
||||||
QVector<AdBlockRule*> m_rules;
|
|
||||||
QString m_title;
|
|
||||||
QString m_filePath;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool m_downloadingSubscription;
|
|
||||||
QUrl m_url;
|
|
||||||
bool m_updated;
|
|
||||||
};
|
|
||||||
|
|
||||||
class AdBlockCustomList : public AdBlockSubscription {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AdBlockCustomList(QObject* parent = 0);
|
|
||||||
virtual ~AdBlockCustomList();
|
|
||||||
|
|
||||||
void saveSubscription();
|
|
||||||
|
|
||||||
bool canEditRules() const;
|
|
||||||
bool canBeRemoved() const;
|
|
||||||
|
|
||||||
bool containsFilter(const QString &filter) const;
|
|
||||||
bool removeFilter(const QString &filter);
|
|
||||||
|
|
||||||
int addRule(AdBlockRule *rule);
|
|
||||||
bool removeRule(int offset);
|
|
||||||
const AdBlockRule *replaceRule(AdBlockRule *rule, int offset);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKSUBSCRIPTION_H
|
|
||||||
|
|
@ -1,341 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocktreewidget.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblocksubscription.h"
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QKeyEvent>
|
|
||||||
#include <QClipboard>
|
|
||||||
#include <QInputDialog>
|
|
||||||
|
|
||||||
|
|
||||||
AdBlockTreeWidget::AdBlockTreeWidget(AdBlockSubscription *subscription, QWidget *parent)
|
|
||||||
: QTreeWidget(parent), m_subscription(subscription), m_topItem(NULL),
|
|
||||||
m_itemChangingBlock(false), m_refreshAllItemsNeeded(true) {
|
|
||||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
|
||||||
setHeaderHidden(true);
|
|
||||||
setAlternatingRowColors(true);
|
|
||||||
setFrameStyle(QFrame::NoFrame);
|
|
||||||
|
|
||||||
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuRequested(QPoint)));
|
|
||||||
connect(this, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
|
|
||||||
connect(m_subscription, SIGNAL(subscriptionUpdated()), this, SLOT(subscriptionUpdated()));
|
|
||||||
connect(m_subscription, SIGNAL(subscriptionError(QString)), this, SLOT(subscriptionError(QString)));
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockSubscription *AdBlockTreeWidget::subscription() const {
|
|
||||||
return m_subscription;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::showRule(const AdBlockRule *rule) {
|
|
||||||
if (m_topItem == NULL && rule) {
|
|
||||||
// Dialog is not loaded yet. Mark rule for late loading.
|
|
||||||
m_ruleToBeSelected = rule->filter();
|
|
||||||
}
|
|
||||||
else if (!m_ruleToBeSelected.isEmpty()) {
|
|
||||||
QList<QTreeWidgetItem*> items = findItems(m_ruleToBeSelected, Qt::MatchRecursive);
|
|
||||||
|
|
||||||
if (!items.isEmpty()) {
|
|
||||||
QTreeWidgetItem *item = items.at(0);
|
|
||||||
|
|
||||||
setCurrentItem(item);
|
|
||||||
scrollToItem(item, QAbstractItemView::PositionAtCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ruleToBeSelected.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::contextMenuRequested(const QPoint &pos) {
|
|
||||||
if (!m_subscription->canEditRules()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem *item = itemAt(pos);
|
|
||||||
|
|
||||||
if (item != NULL) {
|
|
||||||
QMenu menu;
|
|
||||||
menu.addAction(tr("Add rule"), this, SLOT(addRule()));
|
|
||||||
menu.addSeparator();
|
|
||||||
|
|
||||||
QAction *delete_action = menu.addAction(tr("Remove rule"), this, SLOT(removeRule()));
|
|
||||||
|
|
||||||
if (item->parent() == NULL) {
|
|
||||||
delete_action->setDisabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu.exec(viewport()->mapToGlobal(pos));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::itemChanged(QTreeWidgetItem *item) {
|
|
||||||
m_refreshAllItemsNeeded = true;
|
|
||||||
|
|
||||||
if (item == NULL || m_itemChangingBlock) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_itemChangingBlock = true;
|
|
||||||
|
|
||||||
int offset = item->data(0, Qt::UserRole + 10).toInt();
|
|
||||||
const AdBlockRule *old_rle = m_subscription->rule(offset);
|
|
||||||
|
|
||||||
if (item->checkState(0) == Qt::Unchecked && old_rle->isEnabled()) {
|
|
||||||
// Disable rule.
|
|
||||||
const AdBlockRule *rule = m_subscription->disableRule(offset);
|
|
||||||
|
|
||||||
adjustItemFeatures(item, rule);
|
|
||||||
}
|
|
||||||
else if (item->checkState(0) == Qt::Checked && !old_rle->isEnabled()) {
|
|
||||||
// Enable rule
|
|
||||||
const AdBlockRule *rule = m_subscription->enableRule(offset);
|
|
||||||
|
|
||||||
adjustItemFeatures(item, rule);
|
|
||||||
}
|
|
||||||
else if (m_subscription->canEditRules()) {
|
|
||||||
// Custom rule has been changed
|
|
||||||
AdBlockRule *new_rule = new AdBlockRule(item->text(0), m_subscription);
|
|
||||||
const AdBlockRule *rule = m_subscription->replaceRule(new_rule, offset);
|
|
||||||
|
|
||||||
adjustItemFeatures(item, rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_itemChangingBlock = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::copyFilter() {
|
|
||||||
QTreeWidgetItem *item = currentItem();
|
|
||||||
|
|
||||||
if (item != NULL) {
|
|
||||||
Application::clipboard()->setText(item->text(0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::addRule() {
|
|
||||||
if (!m_subscription->canEditRules()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString new_rule = QInputDialog::getText(this, tr("Add rule"), tr("Please write your rule here"));
|
|
||||||
if (new_rule.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AdBlockRule *rule = new AdBlockRule(new_rule, m_subscription);
|
|
||||||
int offset = m_subscription->addRule(rule);
|
|
||||||
|
|
||||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
|
||||||
item->setText(0, new_rule);
|
|
||||||
item->setData(0, Qt::UserRole + 10, offset);
|
|
||||||
item->setFlags(item->flags() | Qt::ItemIsEditable);
|
|
||||||
|
|
||||||
m_itemChangingBlock = true;
|
|
||||||
m_topItem->addChild(item);
|
|
||||||
m_itemChangingBlock = false;
|
|
||||||
|
|
||||||
adjustItemFeatures(item, rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::removeRule() {
|
|
||||||
QTreeWidgetItem *item = currentItem();
|
|
||||||
if (item == NULL || !m_subscription->canEditRules() || item == m_topItem) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int offset = item->data(0, Qt::UserRole + 10).toInt();
|
|
||||||
m_subscription->removeRule(offset);
|
|
||||||
delete item;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::subscriptionUpdated() {
|
|
||||||
refresh();
|
|
||||||
|
|
||||||
m_itemChangingBlock = true;
|
|
||||||
m_topItem->setText(0, tr("%1 (recently updated)").arg(m_subscription->title()));
|
|
||||||
m_itemChangingBlock = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::subscriptionError(const QString &message) {
|
|
||||||
refresh();
|
|
||||||
|
|
||||||
m_itemChangingBlock = true;
|
|
||||||
m_topItem->setText(0, tr("%1 (error: %2)").arg(m_subscription->title(), message));
|
|
||||||
m_itemChangingBlock = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::adjustItemFeatures(QTreeWidgetItem *item, const AdBlockRule *rule) {
|
|
||||||
if (!rule->isEnabled()) {
|
|
||||||
QFont font;
|
|
||||||
font.setItalic(true);
|
|
||||||
item->setForeground(0, QColor(Qt::gray));
|
|
||||||
|
|
||||||
if (!rule->isComment()) {
|
|
||||||
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
|
||||||
item->setCheckState(0, Qt::Unchecked);
|
|
||||||
item->setFont(0, font);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
|
||||||
item->setCheckState(0, Qt::Checked);
|
|
||||||
|
|
||||||
if (rule->isException()) {
|
|
||||||
item->setForeground(0, QColor(Qt::darkGreen));
|
|
||||||
item->setFont(0, QFont());
|
|
||||||
}
|
|
||||||
else if (rule->isCssRule()) {
|
|
||||||
item->setForeground(0, QColor(Qt::darkBlue));
|
|
||||||
item->setFont(0, QFont());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
item->setForeground(0, QColor());
|
|
||||||
item->setFont(0, QFont());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::keyPressEvent(QKeyEvent* event) {
|
|
||||||
if (event->key() == Qt::Key_C && event->modifiers() & Qt::ControlModifier) {
|
|
||||||
copyFilter();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->key() == Qt::Key_Delete) {
|
|
||||||
removeRule();
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidget::keyPressEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::refresh() {
|
|
||||||
// Disable GUI editing for parent.
|
|
||||||
emit refreshStatusChanged(true);
|
|
||||||
setUpdatesEnabled(false);
|
|
||||||
|
|
||||||
m_itemChangingBlock = true;
|
|
||||||
clear();
|
|
||||||
|
|
||||||
QFont bold_font;
|
|
||||||
bold_font.setBold(true);
|
|
||||||
|
|
||||||
m_topItem = new QTreeWidgetItem(this);
|
|
||||||
m_topItem->setText(0, m_subscription->title());
|
|
||||||
m_topItem->setFont(0, bold_font);
|
|
||||||
m_topItem->setExpanded(true);
|
|
||||||
addTopLevelItem(m_topItem);
|
|
||||||
|
|
||||||
const QVector<AdBlockRule*> &all_rules = m_subscription->allRules();
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
foreach (const AdBlockRule *rule, all_rules) {
|
|
||||||
QTreeWidgetItem *item = new QTreeWidgetItem(m_topItem);
|
|
||||||
item->setText(0, rule->filter());
|
|
||||||
item->setData(0, Qt::UserRole + 10, index);
|
|
||||||
|
|
||||||
if (m_subscription->canEditRules()) {
|
|
||||||
item->setFlags(item->flags() | Qt::ItemIsEditable);
|
|
||||||
}
|
|
||||||
|
|
||||||
adjustItemFeatures(item, rule);
|
|
||||||
index++;
|
|
||||||
|
|
||||||
if (index % 100 == 0) {
|
|
||||||
qApp->processEvents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
showRule(0);
|
|
||||||
m_itemChangingBlock = false;
|
|
||||||
setUpdatesEnabled(true);
|
|
||||||
emit refreshStatusChanged(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::clear() {
|
|
||||||
QTreeWidget::clear();
|
|
||||||
m_allTreeItems.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::addTopLevelItem(QTreeWidgetItem *item) {
|
|
||||||
m_allTreeItems.append(item);
|
|
||||||
QTreeWidget::addTopLevelItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::iterateAllItems(QTreeWidgetItem *parent)
|
|
||||||
{
|
|
||||||
int count = parent ? parent->childCount() : topLevelItemCount();
|
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
QTreeWidgetItem *item = parent ? parent->child(i) : topLevelItem(i);
|
|
||||||
|
|
||||||
if (item->childCount() == 0) {
|
|
||||||
m_allTreeItems.append(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
iterateAllItems(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> AdBlockTreeWidget::allItems() {
|
|
||||||
if (m_refreshAllItemsNeeded) {
|
|
||||||
m_allTreeItems.clear();
|
|
||||||
iterateAllItems(0);
|
|
||||||
m_refreshAllItemsNeeded = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_allTreeItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdBlockTreeWidget::filterString(const QString &string) {
|
|
||||||
QList<QTreeWidgetItem*> all_items = allItems();
|
|
||||||
QList<QTreeWidgetItem*> parents;
|
|
||||||
bool string_empty = string.isEmpty();
|
|
||||||
|
|
||||||
foreach (QTreeWidgetItem *item, all_items) {
|
|
||||||
bool contains_string = string_empty || item->text(0).contains(string, Qt::CaseInsensitive);
|
|
||||||
|
|
||||||
if (contains_string) {
|
|
||||||
item->setHidden(false);
|
|
||||||
|
|
||||||
if (item->parent() != NULL) {
|
|
||||||
if (!parents.contains(item->parent())) {
|
|
||||||
parents << item->parent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
item->setHidden(true);
|
|
||||||
|
|
||||||
if (item->parent() != NULL) {
|
|
||||||
item->parent()->setHidden(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < parents.size(); i++) {
|
|
||||||
QTreeWidgetItem *parentItem = parents.at(i);
|
|
||||||
parentItem->setHidden(false);
|
|
||||||
parentItem->setExpanded(true);
|
|
||||||
|
|
||||||
if (parentItem->parent() != NULL && !parents.contains(parentItem->parent())) {
|
|
||||||
parents << parentItem->parent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
// Copyright (C) 2010-2014 by David Rosca <nowrep@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ADBLOCKTREEWIDGET_H
|
|
||||||
#define ADBLOCKTREEWIDGET_H
|
|
||||||
|
|
||||||
#include <QTreeWidget>
|
|
||||||
|
|
||||||
|
|
||||||
class AdBlockSubscription;
|
|
||||||
class AdBlockRule;
|
|
||||||
|
|
||||||
class AdBlockTreeWidget : public QTreeWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit AdBlockTreeWidget(AdBlockSubscription* subscription, QWidget* parent = 0);
|
|
||||||
|
|
||||||
AdBlockSubscription *subscription() const;
|
|
||||||
|
|
||||||
void showRule(const AdBlockRule *rule);
|
|
||||||
void refresh();
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void addRule();
|
|
||||||
void removeRule();
|
|
||||||
void filterString(const QString &string);
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void contextMenuRequested(const QPoint &pos);
|
|
||||||
void itemChanged(QTreeWidgetItem *item);
|
|
||||||
void copyFilter();
|
|
||||||
|
|
||||||
void subscriptionUpdated();
|
|
||||||
void subscriptionError(const QString &message);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void keyPressEvent(QKeyEvent *event);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void refreshStatusChanged(bool started);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void adjustItemFeatures(QTreeWidgetItem *item, const AdBlockRule *rule);
|
|
||||||
void addTopLevelItem(QTreeWidgetItem *item);
|
|
||||||
QList<QTreeWidgetItem*> allItems();
|
|
||||||
void iterateAllItems(QTreeWidgetItem *parent);
|
|
||||||
|
|
||||||
AdBlockSubscription *m_subscription;
|
|
||||||
QTreeWidgetItem *m_topItem;
|
|
||||||
|
|
||||||
QString m_ruleToBeSelected;
|
|
||||||
bool m_itemChangingBlock;
|
|
||||||
|
|
||||||
bool m_refreshAllItemsNeeded;
|
|
||||||
QList<QTreeWidgetItem*> m_allTreeItems;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ADBLOCKTREEWIDGET_H
|
|
@ -38,19 +38,16 @@
|
|||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QWebSettings>
|
|
||||||
|
|
||||||
|
|
||||||
DownloadItem::DownloadItem(bool is_direct_download, QNetworkReply *reply, QWidget *parent) : QWidget(parent),
|
DownloadItem::DownloadItem(QNetworkReply *reply, QWidget *parent) : QWidget(parent),
|
||||||
m_ui(new Ui::DownloadItem), m_reply(reply),
|
m_ui(new Ui::DownloadItem), m_reply(reply),
|
||||||
m_bytesReceived(0), m_requestFileName(false), m_startedSaving(false), m_finishedDownloading(false),
|
m_bytesReceived(0), m_requestFileName(false), m_startedSaving(false), m_finishedDownloading(false),
|
||||||
m_gettingFileName(false), m_canceledFileSelect(false) {
|
m_gettingFileName(false), m_canceledFileSelect(false) {
|
||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
m_ui->m_btnTryAgain->hide();
|
m_ui->m_btnTryAgain->hide();
|
||||||
|
|
||||||
m_requestFileName = is_direct_download ?
|
m_requestFileName = qApp->settings()->value(GROUP(Downloads), SETTING(Downloads::AlwaysPromptForFilename)).toBool();
|
||||||
qApp->settings()->value(GROUP(Downloads), SETTING(Downloads::AlwaysPromptForFilename)).toBool() :
|
|
||||||
true;
|
|
||||||
|
|
||||||
connect(m_ui->m_btnStopDownload, SIGNAL(clicked()), this, SLOT(stop()));
|
connect(m_ui->m_btnStopDownload, SIGNAL(clicked()), this, SLOT(stop()));
|
||||||
connect(m_ui->m_btnOpenFile, SIGNAL(clicked()), this, SLOT(openFile()));
|
connect(m_ui->m_btnOpenFile, SIGNAL(clicked()), this, SLOT(openFile()));
|
||||||
@ -319,7 +316,7 @@ void DownloadItem::metaDataChanged() {
|
|||||||
void DownloadItem::downloadProgress(qint64 bytes_received, qint64 bytes_total) {
|
void DownloadItem::downloadProgress(qint64 bytes_received, qint64 bytes_total) {
|
||||||
QTime now = QTime::currentTime();
|
QTime now = QTime::currentTime();
|
||||||
|
|
||||||
if (m_lastProgressTime.msecsTo(now) < 25) {
|
if (m_lastProgressTime.isValid() && m_lastProgressTime.msecsTo(now) < 25) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +400,7 @@ void DownloadItem::updateDownloadInfoLabel() {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
info = tr("%1 of %2 - download completed").arg(DownloadManager::dataString(m_bytesReceived),
|
info = tr("%1 of %2 - download completed").arg(DownloadManager::dataString(m_bytesReceived),
|
||||||
DownloadManager::dataString(bytes_total));
|
DownloadManager::dataString(m_bytesReceived));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,17 +499,17 @@ int DownloadManager::downloadProgress() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadManager::download(const QNetworkRequest &request, bool direct_download) {
|
void DownloadManager::download(const QNetworkRequest &request) {
|
||||||
if (!request.url().isEmpty()) {
|
if (!request.url().isEmpty()) {
|
||||||
handleUnsupportedContent(m_networkManager->get(request), direct_download);
|
handleUnsupportedContent(m_networkManager->get(request));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadManager::download(const QUrl &url, bool direct_download) {
|
void DownloadManager::download(const QUrl &url) {
|
||||||
download(QNetworkRequest(url), direct_download);
|
download(QNetworkRequest(url));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadManager::handleUnsupportedContent(QNetworkReply *reply, bool direct_download) {
|
void DownloadManager::handleUnsupportedContent(QNetworkReply *reply) {
|
||||||
if (reply == NULL || reply->url().isEmpty()) {
|
if (reply == NULL || reply->url().isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -525,7 +522,7 @@ void DownloadManager::handleUnsupportedContent(QNetworkReply *reply, bool direct
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DownloadItem *item = new DownloadItem(direct_download, reply, this);
|
DownloadItem *item = new DownloadItem(reply, this);
|
||||||
addItem(item);
|
addItem(item);
|
||||||
|
|
||||||
if (!item->m_canceledFileSelect && qApp->settings()->value(GROUP(Downloads),
|
if (!item->m_canceledFileSelect && qApp->settings()->value(GROUP(Downloads),
|
||||||
@ -603,14 +600,12 @@ void DownloadManager::updateRow(DownloadItem *item) {
|
|||||||
|
|
||||||
int old_height = m_ui->m_viewDownloads->rowHeight(row);
|
int old_height = m_ui->m_viewDownloads->rowHeight(row);
|
||||||
m_ui->m_viewDownloads->setRowHeight(row, qMax(old_height, item->minimumSizeHint().height()));
|
m_ui->m_viewDownloads->setRowHeight(row, qMax(old_height, item->minimumSizeHint().height()));
|
||||||
QWebSettings *globalSettings = QWebSettings::globalSettings();
|
|
||||||
|
|
||||||
// Remove the item if:
|
// Remove the item if:
|
||||||
// a) It is not downloading and private browsing is enabled.
|
// a) It is not downloading and private browsing is enabled.
|
||||||
// OR
|
// OR
|
||||||
// b) Item is already downloaded and it should be remove from downloader list.
|
// b) Item is already downloaded and it should be remove from downloader list.
|
||||||
bool remove = (!item->downloading() && globalSettings->testAttribute(QWebSettings::PrivateBrowsingEnabled)) ||
|
bool remove = item->downloadedSuccessfully() && removePolicy() == DownloadManager::OnSuccessfullDownload;
|
||||||
(item->downloadedSuccessfully() && removePolicy() == DownloadManager::OnSuccessfullDownload);
|
|
||||||
|
|
||||||
if (remove) {
|
if (remove) {
|
||||||
m_model->removeRow(row);
|
m_model->removeRow(row);
|
||||||
@ -673,7 +668,7 @@ void DownloadManager::load() {
|
|||||||
bool done = settings->value(GROUP(Downloads), QString(Downloads::ItemDone).arg(i), true).toBool();
|
bool done = settings->value(GROUP(Downloads), QString(Downloads::ItemDone).arg(i), true).toBool();
|
||||||
|
|
||||||
if (!url.isEmpty() && !file_name.isEmpty()) {
|
if (!url.isEmpty() && !file_name.isEmpty()) {
|
||||||
DownloadItem *item = new DownloadItem(false, 0, this);
|
DownloadItem *item = new DownloadItem(0, this);
|
||||||
item->m_output.setFileName(file_name);
|
item->m_output.setFileName(file_name);
|
||||||
item->m_url = url;
|
item->m_url = url;
|
||||||
|
|
||||||
@ -829,7 +824,3 @@ QMimeData *DownloadModel::mimeData(const QModelIndexList &indexes) const {
|
|||||||
mimeData->setUrls(urls);
|
mimeData->setUrls(urls);
|
||||||
return mimeData;
|
return mimeData;
|
||||||
}
|
}
|
||||||
|
|
||||||
WebBrowser *DownloadManager::webBrowser() const {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
@ -42,7 +42,7 @@ class DownloadItem : public QWidget {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructors.
|
// Constructors.
|
||||||
explicit DownloadItem(bool is_direct_download, QNetworkReply *reply = 0, QWidget *parent = 0);
|
explicit DownloadItem(QNetworkReply *reply = 0, QWidget *parent = 0);
|
||||||
virtual ~DownloadItem();
|
virtual ~DownloadItem();
|
||||||
|
|
||||||
bool downloading() const;
|
bool downloading() const;
|
||||||
@ -108,7 +108,6 @@ class DownloadManager : public TabContent {
|
|||||||
explicit DownloadManager(QWidget *parent = 0);
|
explicit DownloadManager(QWidget *parent = 0);
|
||||||
virtual ~DownloadManager();
|
virtual ~DownloadManager();
|
||||||
|
|
||||||
WebBrowser *webBrowser() const;
|
|
||||||
QNetworkAccessManager *networkManager() const;
|
QNetworkAccessManager *networkManager() const;
|
||||||
|
|
||||||
int totalDownloads() const;
|
int totalDownloads() const;
|
||||||
@ -125,9 +124,9 @@ class DownloadManager : public TabContent {
|
|||||||
static QString dataString(qint64 size);
|
static QString dataString(qint64 size);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void download(const QNetworkRequest &request, bool direct_download = false);
|
void download(const QNetworkRequest &request);
|
||||||
void download(const QUrl &url, bool direct_download = false);
|
void download(const QUrl &url);
|
||||||
void handleUnsupportedContent(QNetworkReply *reply, bool direct_download = false);
|
void handleUnsupportedContent(QNetworkReply *reply);
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
@ -1,204 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// You may use this file under the terms of the BSD license as follows:
|
|
||||||
//
|
|
||||||
// "Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in
|
|
||||||
// the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
|
|
||||||
// of its contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
|
|
||||||
#include "network-web/googlesuggest.h"
|
|
||||||
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
#include "network-web/silentnetworkaccessmanager.h"
|
|
||||||
#include "gui/locationlineedit.h"
|
|
||||||
|
|
||||||
#include <QListWidget>
|
|
||||||
#include <QXmlStreamReader>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QKeyEvent>
|
|
||||||
#include <QDomDocument>
|
|
||||||
#include <QTextCodec>
|
|
||||||
|
|
||||||
|
|
||||||
GoogleSuggest::GoogleSuggest(LocationLineEdit *editor, QObject *parent)
|
|
||||||
: QObject(parent), editor(editor), popup(new QListWidget()), m_enteredText(QString()) {
|
|
||||||
popup->setWindowFlags(Qt::Popup);
|
|
||||||
popup->setFocusPolicy(Qt::NoFocus);
|
|
||||||
popup->setFocusProxy(editor);
|
|
||||||
popup->setMouseTracking(true);
|
|
||||||
popup->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
||||||
popup->setFrameStyle(QFrame::Box | QFrame::Plain);
|
|
||||||
popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
||||||
popup->installEventFilter(this);
|
|
||||||
|
|
||||||
timer = new QTimer(this);
|
|
||||||
timer->setSingleShot(true);
|
|
||||||
timer->setInterval(500);
|
|
||||||
|
|
||||||
connect(popup.data(), SIGNAL(itemClicked(QListWidgetItem*)), SLOT(doneCompletion()));
|
|
||||||
connect(timer, SIGNAL(timeout()), SLOT(autoSuggest()));
|
|
||||||
connect(editor, SIGNAL(textEdited(QString)), timer, SLOT(start()));
|
|
||||||
}
|
|
||||||
|
|
||||||
GoogleSuggest::~GoogleSuggest() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GoogleSuggest::eventFilter(QObject *object, QEvent *event) {
|
|
||||||
if (object != popup.data()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->type() == QEvent::MouseButtonPress) {
|
|
||||||
popup->hide();
|
|
||||||
editor->setFocus();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event->type() == QEvent::KeyPress) {
|
|
||||||
bool consumed = false;
|
|
||||||
const int key = static_cast<QKeyEvent*>(event)->key();
|
|
||||||
|
|
||||||
switch (key) {
|
|
||||||
case Qt::Key_Enter:
|
|
||||||
case Qt::Key_Return:
|
|
||||||
doneCompletion();
|
|
||||||
consumed = true;
|
|
||||||
|
|
||||||
case Qt::Key_Escape:
|
|
||||||
editor->setFocus();
|
|
||||||
popup->hide();
|
|
||||||
consumed = true;
|
|
||||||
|
|
||||||
case Qt::Key_Up:
|
|
||||||
case Qt::Key_Down:
|
|
||||||
case Qt::Key_Home:
|
|
||||||
case Qt::Key_End:
|
|
||||||
case Qt::Key_PageUp:
|
|
||||||
case Qt::Key_PageDown:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
editor->setFocus();
|
|
||||||
editor->event(event);
|
|
||||||
popup->hide();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return consumed;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::showCompletion(const QStringList &choices) {
|
|
||||||
if (choices.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
popup->setUpdatesEnabled(false);
|
|
||||||
popup->clear();
|
|
||||||
|
|
||||||
foreach (const QString &choice, choices) {
|
|
||||||
new QListWidgetItem(choice, popup.data());
|
|
||||||
}
|
|
||||||
|
|
||||||
popup->setCurrentItem(popup->item(0));
|
|
||||||
popup->adjustSize();
|
|
||||||
popup->setUpdatesEnabled(true);
|
|
||||||
popup->resize(editor->width(), popup->sizeHintForRow(0) * qMin(7, choices.count()) + 3);
|
|
||||||
popup->move(editor->mapToGlobal(QPoint(0, editor->height())));
|
|
||||||
popup->setFocus();
|
|
||||||
popup->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::doneCompletion() {
|
|
||||||
timer->stop();
|
|
||||||
popup->hide();
|
|
||||||
editor->setFocus();
|
|
||||||
|
|
||||||
QListWidgetItem *item = popup->currentItem();
|
|
||||||
|
|
||||||
if (item != NULL) {
|
|
||||||
editor->submit(QString(GOOGLE_SEARCH_URL).arg(item->text()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::preventSuggest() {
|
|
||||||
timer->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::autoSuggest() {
|
|
||||||
m_enteredText = QUrl::toPercentEncoding(editor->text());
|
|
||||||
QString url = QString(GOOGLE_SUGGEST_URL).arg(m_enteredText);
|
|
||||||
|
|
||||||
connect(SilentNetworkAccessManager::instance()->get(QNetworkRequest(QString(url))), SIGNAL(finished()),
|
|
||||||
this, SLOT(handleNetworkData()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void GoogleSuggest::handleNetworkData() {
|
|
||||||
QScopedPointer<QNetworkReply> reply(static_cast<QNetworkReply*>(sender()));
|
|
||||||
|
|
||||||
if (!reply->error()) {
|
|
||||||
QStringList choices;
|
|
||||||
QDomDocument xml;
|
|
||||||
QByteArray response = reply->readAll();
|
|
||||||
|
|
||||||
const QTextCodec *c = QTextCodec::codecForUtfText(response);
|
|
||||||
xml.setContent(c->toUnicode(response));
|
|
||||||
|
|
||||||
QDomNodeList suggestions = xml.elementsByTagName(QSL("suggestion"));
|
|
||||||
|
|
||||||
for (int i = 0; i < suggestions.size(); i++) {
|
|
||||||
const QDomElement element = suggestions.at(i).toElement();
|
|
||||||
|
|
||||||
if (element.attributes().contains(QSL("data"))) {
|
|
||||||
choices.append(element.attribute(QSL("data")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (choices.isEmpty()) {
|
|
||||||
choices.append(m_enteredText);
|
|
||||||
}
|
|
||||||
|
|
||||||
showCompletion(choices);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,82 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
// You may use this file under the terms of the BSD license as follows:
|
|
||||||
//
|
|
||||||
// "Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in
|
|
||||||
// the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
|
|
||||||
// of its contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
|
|
||||||
#ifndef GOOGLESUGGEST_H
|
|
||||||
#define GOOGLESUGGEST_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
|
|
||||||
class LocationLineEdit;
|
|
||||||
class QNetworkReply;
|
|
||||||
class QTimer;
|
|
||||||
class QListWidget;
|
|
||||||
class QNetworkAccessManager;
|
|
||||||
|
|
||||||
class GoogleSuggest : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors.
|
|
||||||
explicit GoogleSuggest(LocationLineEdit *editor, QObject *parent = 0);
|
|
||||||
virtual ~GoogleSuggest();
|
|
||||||
|
|
||||||
bool eventFilter(QObject *object, QEvent *event);
|
|
||||||
void showCompletion(const QStringList &choices);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void doneCompletion();
|
|
||||||
void preventSuggest();
|
|
||||||
void autoSuggest();
|
|
||||||
void handleNetworkData();
|
|
||||||
|
|
||||||
private:
|
|
||||||
LocationLineEdit *editor;
|
|
||||||
QScopedPointer<QListWidget> popup;
|
|
||||||
QTimer *timer;
|
|
||||||
QString m_enteredText;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // GOOGLESUGGEST_H
|
|
@ -132,11 +132,7 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList<QString> &u
|
|||||||
QNetworkReply::NetworkError network_result;
|
QNetworkReply::NetworkError network_result;
|
||||||
|
|
||||||
foreach (const QString &url, urls) {
|
foreach (const QString &url, urls) {
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
const QString google_s2_with_url = QString("http://www.google.com/s2/favicons?domain=%1").arg(url.toHtmlEscaped());
|
const QString google_s2_with_url = QString("http://www.google.com/s2/favicons?domain=%1").arg(url.toHtmlEscaped());
|
||||||
#else
|
|
||||||
const QString google_s2_with_url = QString("http://www.google.com/s2/favicons?domain=%1").arg(Qt::escape(url));
|
|
||||||
#endif
|
|
||||||
QByteArray icon_data;
|
QByteArray icon_data;
|
||||||
network_result = downloadFile(google_s2_with_url, timeout, icon_data).first;
|
network_result = downloadFile(google_s2_with_url, timeout, icon_data).first;
|
||||||
|
|
||||||
|
@ -1,321 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/webbrowser.h"
|
|
||||||
|
|
||||||
#include "definitions/definitions.h"
|
|
||||||
#include "network-web/webbrowsernetworkaccessmanager.h"
|
|
||||||
#include "network-web/webpage.h"
|
|
||||||
#include "network-web/webview.h"
|
|
||||||
#include "network-web/networkfactory.h"
|
|
||||||
#include "miscellaneous/skinfactory.h"
|
|
||||||
#include "gui/dialogs/formmain.h"
|
|
||||||
#include "gui/tabwidget.h"
|
|
||||||
#include "gui/feedmessageviewer.h"
|
|
||||||
#include "gui/feedsview.h"
|
|
||||||
#include "services/standard/standardserviceroot.h"
|
|
||||||
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QHBoxLayout>
|
|
||||||
#include <QToolBar>
|
|
||||||
#include <QAction>
|
|
||||||
#include <QWebFrame>
|
|
||||||
#include <QWidgetAction>
|
|
||||||
#include <QSlider>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QProgressBar>
|
|
||||||
#include <QToolButton>
|
|
||||||
#include <QClipboard>
|
|
||||||
|
|
||||||
|
|
||||||
QList<WebBrowser*> WebBrowser::m_runningWebBrowsers;
|
|
||||||
|
|
||||||
WebBrowser::WebBrowser(QWidget *parent)
|
|
||||||
: TabContent(parent),
|
|
||||||
m_layout(new QVBoxLayout(this)),
|
|
||||||
m_toolBar(new QToolBar(tr("Navigation panel"), this)),
|
|
||||||
m_webView(new WebView(this)),
|
|
||||||
m_txtLocation(new LocationLineEdit(this)),
|
|
||||||
m_actionBack(m_webView->pageAction(QWebPage::Back)),
|
|
||||||
m_actionForward(m_webView->pageAction(QWebPage::Forward)),
|
|
||||||
m_actionReload(m_webView->pageAction(QWebPage::Reload)),
|
|
||||||
m_actionStop(m_webView->pageAction(QWebPage::Stop)) {
|
|
||||||
// Add this new instance to the global list of web browsers.
|
|
||||||
// NOTE: This is used primarily for dynamic icon theme switching.
|
|
||||||
m_runningWebBrowsers.append(this);
|
|
||||||
|
|
||||||
// Initialize the components and layout.
|
|
||||||
initializeLayout();
|
|
||||||
|
|
||||||
setTabOrder(m_txtLocation, m_toolBar);
|
|
||||||
setTabOrder(m_toolBar, m_webView);
|
|
||||||
|
|
||||||
createConnections();
|
|
||||||
initializeZoomWidget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::initializeZoomWidget() {
|
|
||||||
// Initializations.
|
|
||||||
m_zoomButtons = new QWidget(this);
|
|
||||||
QLabel *zoom_label = new QLabel(tr("Zoom "), m_zoomButtons);
|
|
||||||
QHBoxLayout *layout = new QHBoxLayout(m_zoomButtons);
|
|
||||||
QToolButton *button_decrease = new QToolButton(m_zoomButtons);
|
|
||||||
m_btnResetZoom = new QToolButton(m_zoomButtons);
|
|
||||||
QToolButton *button_increase = new QToolButton(m_zoomButtons);
|
|
||||||
|
|
||||||
// Set texts.
|
|
||||||
button_decrease->setText(QSL("-"));
|
|
||||||
button_decrease->setToolTip(tr("Decrease zoom."));
|
|
||||||
m_btnResetZoom->setText(QSL("100%"));
|
|
||||||
m_btnResetZoom->setToolTip(tr("Reset zoom to default."));
|
|
||||||
button_increase->setText(QSL("+"));
|
|
||||||
button_increase->setToolTip(tr("Increase zoom."));
|
|
||||||
|
|
||||||
// Setup layout.
|
|
||||||
layout->addWidget(zoom_label);
|
|
||||||
layout->addWidget(button_decrease);
|
|
||||||
layout->addWidget(m_btnResetZoom);
|
|
||||||
layout->addWidget(button_increase);
|
|
||||||
layout->setSpacing(2);
|
|
||||||
layout->setMargin(3);
|
|
||||||
m_zoomButtons->setLayout(layout);
|
|
||||||
|
|
||||||
// Make connections.
|
|
||||||
connect(button_increase, SIGNAL(clicked()), this, SLOT(increaseZoom()));
|
|
||||||
connect(button_decrease, SIGNAL(clicked()), this, SLOT(decreaseZoom()));
|
|
||||||
connect(m_btnResetZoom, SIGNAL(clicked()), this, SLOT(resetZoom()));
|
|
||||||
|
|
||||||
m_actionZoom = new QWidgetAction(this);
|
|
||||||
m_actionZoom->setDefaultWidget(m_zoomButtons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::initializeLayout() {
|
|
||||||
m_toolBar->setFloatable(false);
|
|
||||||
m_toolBar->setMovable(false);
|
|
||||||
m_toolBar->setAllowedAreas(Qt::TopToolBarArea);
|
|
||||||
|
|
||||||
// Modify action texts.
|
|
||||||
m_actionBack->setText(tr("Back"));
|
|
||||||
m_actionBack->setToolTip(tr("Go back."));
|
|
||||||
m_actionForward->setText(tr("Forward"));
|
|
||||||
m_actionForward->setToolTip(tr("Go forward."));
|
|
||||||
m_actionReload->setText(tr("Reload"));
|
|
||||||
m_actionReload->setToolTip(tr("Reload current web page."));
|
|
||||||
m_actionStop->setText(tr("Stop"));
|
|
||||||
m_actionStop->setToolTip(tr("Stop web page loading."));
|
|
||||||
|
|
||||||
m_btnDiscoverFeeds = new DiscoverFeedsButton(this);
|
|
||||||
|
|
||||||
QWidgetAction *act_discover = new QWidgetAction(this);
|
|
||||||
|
|
||||||
act_discover->setDefaultWidget(m_btnDiscoverFeeds);
|
|
||||||
|
|
||||||
// Add needed actions into toolbar.
|
|
||||||
m_toolBar->addAction(m_actionBack);
|
|
||||||
m_toolBar->addAction(m_actionForward);
|
|
||||||
m_toolBar->addAction(m_actionReload);
|
|
||||||
m_toolBar->addAction(m_actionStop);
|
|
||||||
m_toolBar->addAction(act_discover);
|
|
||||||
m_toolBar->addWidget(m_txtLocation);
|
|
||||||
|
|
||||||
m_loadingWidget = new QWidget(this);
|
|
||||||
m_loadingWidget->setFixedHeight(15);
|
|
||||||
|
|
||||||
// Initialize dynamic progress bar which will be displayed
|
|
||||||
// at the bottom of web browser.
|
|
||||||
m_lblProgress = new QLabel(this);
|
|
||||||
m_loadingProgress = new QProgressBar(this);
|
|
||||||
m_loadingProgress->setFixedHeight(15);
|
|
||||||
m_loadingProgress->setMinimum(0);
|
|
||||||
m_loadingProgress->setTextVisible(false);
|
|
||||||
m_loadingProgress->setMaximum(100);
|
|
||||||
m_loadingProgress->setAttribute(Qt::WA_TranslucentBackground);
|
|
||||||
|
|
||||||
m_loadingLayout = new QHBoxLayout();
|
|
||||||
m_loadingLayout->setMargin(0);
|
|
||||||
m_loadingLayout->addWidget(m_lblProgress, 0, Qt::AlignVCenter);
|
|
||||||
m_loadingLayout->addWidget(m_loadingProgress, 1, Qt::AlignVCenter);
|
|
||||||
m_loadingWidget->setLayout(m_loadingLayout);
|
|
||||||
|
|
||||||
// Setup layout.
|
|
||||||
m_layout->addWidget(m_toolBar);
|
|
||||||
m_layout->addWidget(m_webView);
|
|
||||||
m_layout->addWidget(m_loadingWidget);
|
|
||||||
m_layout->setMargin(0);
|
|
||||||
m_layout->setSpacing(0);
|
|
||||||
|
|
||||||
m_loadingWidget->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onLoadingStarted() {
|
|
||||||
m_loadingProgress->setValue(0);
|
|
||||||
m_loadingWidget->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onLoadingProgress(int progress) {
|
|
||||||
m_loadingProgress->setValue(progress);
|
|
||||||
m_lblProgress->setText(QString(QSL(" %1 kB / %2 kB")).arg(m_webView->page()->bytesReceived() / 1000).arg(m_webView->page()->totalBytes() / 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onLoadingFinished(bool success) {
|
|
||||||
if (success) {
|
|
||||||
// Let's check if there are any feeds defined on the web and eventually
|
|
||||||
// display "Add feeds" button.
|
|
||||||
m_btnDiscoverFeeds->setFeedAddresses(NetworkFactory::extractFeedLinksFromHtmlPage(m_webView->url(), m_webView->page()->toHtml()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_btnDiscoverFeeds->clearFeedAddresses();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_loadingWidget->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::createConnections() {
|
|
||||||
// When user confirms new url, then redirect to it.
|
|
||||||
connect(m_txtLocation,SIGNAL(submitted(QString)), this, SLOT(navigateToUrl(QString)));
|
|
||||||
// If new page loads, then update current url.
|
|
||||||
connect(m_webView, SIGNAL(urlChanged(QUrl)), this, SLOT(updateUrl(QUrl)));
|
|
||||||
|
|
||||||
// Connect this WebBrowser to global TabWidget.
|
|
||||||
TabWidget *tab_widget = qApp->mainForm()->tabWidget();
|
|
||||||
connect(m_webView, SIGNAL(newTabRequested()), tab_widget, SLOT(addEmptyBrowser()));
|
|
||||||
connect(m_webView, SIGNAL(linkMiddleClicked(QUrl)), tab_widget, SLOT(addLinkedBrowser(QUrl)));
|
|
||||||
|
|
||||||
// Change location textbox status according to webpage status.
|
|
||||||
connect(m_webView, SIGNAL(loadStarted()), this, SLOT(onLoadingStarted()));
|
|
||||||
connect(m_webView, SIGNAL(loadProgress(int)), this, SLOT(onLoadingProgress(int)));
|
|
||||||
connect(m_webView, SIGNAL(loadFinished(bool)), this, SLOT(onLoadingFinished(bool)));
|
|
||||||
|
|
||||||
// Forward title/icon changes.
|
|
||||||
connect(m_webView, SIGNAL(titleChanged(QString)), this, SLOT(onTitleChanged(QString)));
|
|
||||||
connect(m_webView, SIGNAL(iconChanged()), this, SLOT(onIconChanged()));
|
|
||||||
|
|
||||||
// Misc connections.
|
|
||||||
connect(m_webView, SIGNAL(zoomFactorChanged()), this, SLOT(updateZoomGui()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onIconChanged() {
|
|
||||||
emit iconChanged(m_index, m_webView->icon());
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::onTitleChanged(const QString &new_title) {
|
|
||||||
if (new_title.isEmpty()) {
|
|
||||||
//: Webbrowser tab title when no title is available.
|
|
||||||
emit titleChanged(m_index, tr("No title"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emit titleChanged(m_index, new_title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::updateUrl(const QUrl &url) {
|
|
||||||
QString url_string = url.toString();
|
|
||||||
|
|
||||||
m_txtLocation->setText(url_string);
|
|
||||||
setNavigationBarVisible(url_string != INTERNAL_URL_EMPTY && url_string != INTERNAL_URL_NEWSPAPER);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::navigateToUrl(const QUrl &url) {
|
|
||||||
if (url.isValid()) {
|
|
||||||
m_webView->load(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::navigateToMessages(const QList<Message> &messages) {
|
|
||||||
Skin skin = qApp->skins()->currentSkin();
|
|
||||||
QString messages_layout;
|
|
||||||
QString single_message_layout = skin.m_layoutMarkup;
|
|
||||||
|
|
||||||
foreach (const Message &message, messages) {
|
|
||||||
QString enclosures;
|
|
||||||
|
|
||||||
foreach (const Enclosure &enclosure, message.m_enclosures) {
|
|
||||||
enclosures += skin.m_enclosureMarkup.arg(enclosure.m_url);
|
|
||||||
|
|
||||||
if (!enclosure.m_mimeType.isEmpty()) {
|
|
||||||
enclosures += QL1S(" [") + enclosure.m_mimeType + QL1S("]");
|
|
||||||
}
|
|
||||||
|
|
||||||
enclosures += QL1S("<br>");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!enclosures.isEmpty()) {
|
|
||||||
enclosures = enclosures.prepend(QSL("<br>"));
|
|
||||||
}
|
|
||||||
|
|
||||||
messages_layout.append(single_message_layout.arg(message.m_title,
|
|
||||||
tr("Written by ") + (message.m_author.isEmpty() ?
|
|
||||||
tr("unknown author") :
|
|
||||||
message.m_author),
|
|
||||||
message.m_url,
|
|
||||||
message.m_contents,
|
|
||||||
message.m_created.toString(Qt::DefaultLocaleShortDate),
|
|
||||||
enclosures));
|
|
||||||
}
|
|
||||||
|
|
||||||
QString layout_wrapper = skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"), messages_layout);
|
|
||||||
|
|
||||||
m_webView->setHtml(layout_wrapper, QUrl(INTERNAL_URL_NEWSPAPER));
|
|
||||||
emit iconChanged(m_index, qApp->icons()->fromTheme(QSL("item-newspaper")));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::updateZoomGui() {
|
|
||||||
m_btnResetZoom->setText(QString(QSL("%1%")).arg(QString::number(m_webView->zoomFactor() * 100, 'f', 0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::increaseZoom() {
|
|
||||||
m_webView->increaseWebPageZoom();
|
|
||||||
updateZoomGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::decreaseZoom() {
|
|
||||||
m_webView->decreaseWebPageZoom();
|
|
||||||
updateZoomGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::resetZoom() {
|
|
||||||
m_webView->resetWebPageZoom();
|
|
||||||
updateZoomGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::navigateToUrl(const QString &textual_url) {
|
|
||||||
// Prepare input url.
|
|
||||||
QString better_url = textual_url;
|
|
||||||
better_url = better_url.replace(QL1C('\\'), QL1C('/'));
|
|
||||||
|
|
||||||
navigateToUrl(QUrl::fromUserInput(better_url));
|
|
||||||
}
|
|
||||||
|
|
||||||
WebBrowser::~WebBrowser() {
|
|
||||||
qDebug("Destroying WebBrowser instance.");
|
|
||||||
|
|
||||||
// Remove this instance from the global list of web browsers.
|
|
||||||
m_runningWebBrowsers.removeAll(this);
|
|
||||||
|
|
||||||
// Delete members. Do not use scoped pointers here.
|
|
||||||
delete m_layout;
|
|
||||||
delete m_zoomButtons;
|
|
||||||
delete m_actionZoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowser::setupIcons() {
|
|
||||||
m_actionBack->setIcon(qApp->icons()->fromTheme(QSL("go-previous")));
|
|
||||||
m_actionForward->setIcon(qApp->icons()->fromTheme(QSL("go-next")));
|
|
||||||
m_actionReload->setIcon(qApp->icons()->fromTheme(QSL("go-refresh")));
|
|
||||||
m_actionStop->setIcon(qApp->icons()->fromTheme(QSL("go-stop")));
|
|
||||||
m_webView->setupIcons();
|
|
||||||
}
|
|
@ -1,171 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef WEBBROWSER_H
|
|
||||||
#define WEBBROWSER_H
|
|
||||||
|
|
||||||
#include "gui/tabcontent.h"
|
|
||||||
|
|
||||||
#include "core/messagesmodel.h"
|
|
||||||
#include "network-web/webview.h"
|
|
||||||
#include "gui/locationlineedit.h"
|
|
||||||
#include "gui/discoverfeedsbutton.h"
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QWidgetAction>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QToolBar>
|
|
||||||
|
|
||||||
|
|
||||||
class QToolButton;
|
|
||||||
class QVBoxLayout;
|
|
||||||
class QHBoxLayout;
|
|
||||||
class QProgressBar;
|
|
||||||
class QMenu;
|
|
||||||
class QLabel;
|
|
||||||
class WebBrowserNetworkAccessManager;
|
|
||||||
class TabWidget;
|
|
||||||
|
|
||||||
class WebBrowser : public TabContent {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors and destructors.
|
|
||||||
explicit WebBrowser(QWidget *parent = 0);
|
|
||||||
virtual ~WebBrowser();
|
|
||||||
|
|
||||||
// Reloads icons for all buttons.
|
|
||||||
void setupIcons();
|
|
||||||
|
|
||||||
// Returns icon associated with currently loaded website.
|
|
||||||
inline QIcon icon() const {
|
|
||||||
return m_webView->icon();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline WebView *view() const {
|
|
||||||
return m_webView;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets this WebBrowser instance as focused.
|
|
||||||
inline void setFocus(Qt::FocusReason reason) {
|
|
||||||
m_txtLocation->setFocus(reason);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns this instance.
|
|
||||||
// NOTE: This is needed due to TabContent interface.
|
|
||||||
inline WebBrowser *webBrowser() const {
|
|
||||||
return const_cast<WebBrowser*>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns global menu for this web browser.
|
|
||||||
inline virtual QList<QAction*> globalMenu() const {
|
|
||||||
QList<QAction*> browser_menu;
|
|
||||||
|
|
||||||
// Add needed actions into the menu.
|
|
||||||
browser_menu.append(m_actionZoom);
|
|
||||||
|
|
||||||
return browser_menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns list of all running web browsers.
|
|
||||||
static inline QList<WebBrowser*> runningWebBrowsers() {
|
|
||||||
return m_runningWebBrowsers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
// Switches visibility of navigation bar.
|
|
||||||
inline void setNavigationBarVisible(bool visible) {
|
|
||||||
m_toolBar->setVisible(visible);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loads new url into the web browser.
|
|
||||||
void navigateToUrl(const QString &url);
|
|
||||||
void navigateToUrl(const QUrl &url);
|
|
||||||
|
|
||||||
// Navigates to messages, used also as "newspaper" view.
|
|
||||||
void navigateToMessages(const QList<Message> &messages);
|
|
||||||
|
|
||||||
// Clears contents.
|
|
||||||
inline void clear() {
|
|
||||||
if (m_webView->url() != QUrl()) {
|
|
||||||
m_webView->setHtml("<html><body></body></html>", QUrl(INTERNAL_URL_EMPTY));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zoom manipulators.
|
|
||||||
void increaseZoom();
|
|
||||||
void decreaseZoom();
|
|
||||||
void resetZoom();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Creates necessary connections.
|
|
||||||
void createConnections();
|
|
||||||
|
|
||||||
// Initializes all buttons and widgets, which are needed for "Zoom" menu item.
|
|
||||||
void initializeZoomWidget();
|
|
||||||
|
|
||||||
// Initializes layout.
|
|
||||||
void initializeLayout();
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void onLoadingStarted();
|
|
||||||
void onLoadingProgress(int progress);
|
|
||||||
void onLoadingFinished(bool success);
|
|
||||||
|
|
||||||
// Updates zoom-related gui.
|
|
||||||
void updateZoomGui();
|
|
||||||
|
|
||||||
// Updates url (for example on location text box).
|
|
||||||
void updateUrl(const QUrl &url);
|
|
||||||
|
|
||||||
// Title/icon is changed.
|
|
||||||
void onTitleChanged(const QString &new_title);
|
|
||||||
void onIconChanged();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
// User requests opening of new tab or clicks the link
|
|
||||||
// with middle mouse button
|
|
||||||
void newTabRequested();
|
|
||||||
void linkMiddleClicked(const QUrl &link_url);
|
|
||||||
|
|
||||||
// Title/icon is changed.
|
|
||||||
void iconChanged(int index, const QIcon &icon);
|
|
||||||
void titleChanged(int index, const QString &title);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QVBoxLayout *m_layout;
|
|
||||||
QToolBar *m_toolBar;
|
|
||||||
WebView *m_webView;
|
|
||||||
LocationLineEdit *m_txtLocation;
|
|
||||||
QWidget *m_zoomButtons;
|
|
||||||
QToolButton *m_btnResetZoom;
|
|
||||||
QWidget *m_loadingWidget;
|
|
||||||
QHBoxLayout *m_loadingLayout;
|
|
||||||
QProgressBar *m_loadingProgress;
|
|
||||||
QLabel *m_lblProgress;
|
|
||||||
DiscoverFeedsButton *m_btnDiscoverFeeds;
|
|
||||||
|
|
||||||
QWidgetAction *m_actionZoom;
|
|
||||||
QAction *m_actionBack;
|
|
||||||
QAction *m_actionForward;
|
|
||||||
QAction *m_actionReload;
|
|
||||||
QAction *m_actionStop;
|
|
||||||
|
|
||||||
static QList<WebBrowser*> m_runningWebBrowsers;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // WEBBROWSER_H
|
|
@ -1,70 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "network-web/webbrowsernetworkaccessmanager.h"
|
|
||||||
|
|
||||||
#include "miscellaneous/application.h"
|
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
|
||||||
|
|
||||||
#include <QNetworkReply>
|
|
||||||
|
|
||||||
|
|
||||||
QPointer<WebBrowserNetworkAccessManager> WebBrowserNetworkAccessManager::s_instance;
|
|
||||||
|
|
||||||
WebBrowserNetworkAccessManager::WebBrowserNetworkAccessManager(WebPage *page, QObject *parent)
|
|
||||||
: BaseNetworkAccessManager(parent), m_page(page) {
|
|
||||||
connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
|
|
||||||
this, SLOT(onAuthenticationRequired(QNetworkReply*,QAuthenticator*)));
|
|
||||||
}
|
|
||||||
|
|
||||||
WebBrowserNetworkAccessManager::~WebBrowserNetworkAccessManager() {
|
|
||||||
qDebug("Destroying WebBrowserNetworkAccessManager instance.");
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebBrowserNetworkAccessManager::onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) {
|
|
||||||
Q_UNUSED(authenticator);
|
|
||||||
|
|
||||||
// FIXME: Support authentication for web pages.
|
|
||||||
qDebug("URL '%s' requested authentication but username/password is not available.", qPrintable(reply->url().toString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
QNetworkReply *WebBrowserNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) {
|
|
||||||
if (m_page != NULL) {
|
|
||||||
QNetworkRequest page_request = request;
|
|
||||||
m_page->populateNetworkRequest(page_request);
|
|
||||||
return WebBrowserNetworkAccessManager::instance()->createRequest(op, page_request, outgoingData);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (op == QNetworkAccessManager::GetOperation) {
|
|
||||||
QNetworkReply *reply = AdBlockManager::instance()->block(request);
|
|
||||||
|
|
||||||
if (reply != NULL) {
|
|
||||||
return reply;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return BaseNetworkAccessManager::createRequest(op, request, outgoingData);
|
|
||||||
}
|
|
||||||
|
|
||||||
WebBrowserNetworkAccessManager *WebBrowserNetworkAccessManager::instance() {
|
|
||||||
if (s_instance.isNull()) {
|
|
||||||
s_instance = new WebBrowserNetworkAccessManager(0, qApp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return s_instance;
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
// This file is part of RSS Guard.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
|
||||||
//
|
|
||||||
// RSS Guard is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// RSS Guard is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef WEBBROWSERNETWORKACCESSMANAGER_H
|
|
||||||
#define WEBBROWSERNETWORKACCESSMANAGER_H
|
|
||||||
|
|
||||||
#include "network-web/basenetworkaccessmanager.h"
|
|
||||||
|
|
||||||
#include "webpage.h"
|
|
||||||
|
|
||||||
#include <QPointer>
|
|
||||||
|
|
||||||
|
|
||||||
// This is network access manager for web browsers.
|
|
||||||
class WebBrowserNetworkAccessManager : public BaseNetworkAccessManager {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructors and destructors.
|
|
||||||
explicit WebBrowserNetworkAccessManager(WebPage *page = 0, QObject *parent = 0);
|
|
||||||
virtual ~WebBrowserNetworkAccessManager();
|
|
||||||
|
|
||||||
// Returns pointer to global network access manager
|
|
||||||
// used by ALL web browsers and download manager.
|
|
||||||
static WebBrowserNetworkAccessManager *instance();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData);
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
|
|
||||||
|
|
||||||
private:
|
|
||||||
WebPage *m_page;
|
|
||||||
|
|
||||||
static QPointer<WebBrowserNetworkAccessManager> s_instance;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // WEBBROWSERNETWORKACCESSMANAGER_H
|
|
@ -1,9 +1,25 @@
|
|||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include "network-web/webfactory.h"
|
#include "network-web/webfactory.h"
|
||||||
|
|
||||||
#include "miscellaneous/application.h"
|
#include "miscellaneous/application.h"
|
||||||
|
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include <QWebSettings>
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
@ -13,28 +29,19 @@ QPointer<WebFactory> WebFactory::s_instance;
|
|||||||
|
|
||||||
WebFactory::WebFactory(QObject *parent)
|
WebFactory::WebFactory(QObject *parent)
|
||||||
: QObject(parent), m_escapes(QMap<QString, QString>()),
|
: QObject(parent), m_escapes(QMap<QString, QString>()),
|
||||||
m_deEscapes(QMap<QString, QString>()),
|
m_deEscapes(QMap<QString, QString>()) {
|
||||||
m_globalSettings(QWebSettings::globalSettings()) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WebFactory::~WebFactory() {
|
WebFactory::~WebFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebFactory::loadState() {
|
|
||||||
const Settings *settings = qApp->settings();
|
|
||||||
|
|
||||||
switchJavascript(settings->value(GROUP(Browser), SETTING(Browser::JavascriptEnabled)).toBool(), false);
|
|
||||||
switchImages(settings->value(GROUP(Browser), SETTING(Browser::ImagesEnabled)).toBool(), false);
|
|
||||||
switchPlugins(settings->value(GROUP(Browser), SETTING(Browser::PluginsEnabled)).toBool(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebFactory::sendMessageViaEmail(const Message &message) {
|
bool WebFactory::sendMessageViaEmail(const Message &message) {
|
||||||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
||||||
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
||||||
const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString();
|
const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString();
|
||||||
|
|
||||||
return QProcess::startDetached(QString("\"") + browser + QSL("\" ") + arguments.arg(message.m_title,
|
return QProcess::startDetached(QString("\"") + browser + QSL("\" ") + arguments.arg(message.m_title,
|
||||||
stripTags(message.m_contents)));
|
stripTags(message.m_contents)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Send it via mailto protocol.
|
// Send it via mailto protocol.
|
||||||
@ -66,33 +73,6 @@ bool WebFactory::openUrlInExternalBrowser(const QString &url) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebFactory::switchJavascript(bool enable, bool save_settings) {
|
|
||||||
if (save_settings) {
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::JavascriptEnabled, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_globalSettings->setAttribute(QWebSettings::JavascriptEnabled, enable);
|
|
||||||
emit javascriptSwitched(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebFactory::switchPlugins(bool enable, bool save_settings) {
|
|
||||||
if (save_settings) {
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::PluginsEnabled, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_globalSettings->setAttribute(QWebSettings::PluginsEnabled, enable);
|
|
||||||
emit pluginsSwitched(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebFactory::switchImages(bool enable, bool save_settings) {
|
|
||||||
if (save_settings) {
|
|
||||||
qApp->settings()->setValue(GROUP(Browser), Browser::ImagesEnabled, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_globalSettings->setAttribute(QWebSettings::AutoLoadImages, enable);
|
|
||||||
emit imagesLoadingSwitched(enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
WebFactory *WebFactory::instance() {
|
WebFactory *WebFactory::instance() {
|
||||||
if (s_instance.isNull()) {
|
if (s_instance.isNull()) {
|
||||||
s_instance = new WebFactory(qApp);
|
s_instance = new WebFactory(qApp);
|
||||||
@ -101,18 +81,6 @@ WebFactory *WebFactory::instance() {
|
|||||||
return s_instance;
|
return s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebFactory::javascriptEnabled() const {
|
|
||||||
return m_globalSettings->testAttribute(QWebSettings::JavascriptEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebFactory::pluginsEnabled() const {
|
|
||||||
return m_globalSettings->testAttribute(QWebSettings::PluginsEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebFactory::autoloadImages() const {
|
|
||||||
return m_globalSettings->testAttribute(QWebSettings::AutoLoadImages);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString WebFactory::stripTags(QString text) {
|
QString WebFactory::stripTags(QString text) {
|
||||||
return text.remove(QRegExp(QSL("<[^>]*>")));
|
return text.remove(QRegExp(QSL("<[^>]*>")));
|
||||||
}
|
}
|
||||||
@ -146,7 +114,6 @@ QString WebFactory::deEscapeHtml(const QString &text) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString WebFactory::toSecondLevelDomain(const QUrl &url) {
|
QString WebFactory::toSecondLevelDomain(const QUrl &url) {
|
||||||
#if QT_VERSION >= 0x040800
|
|
||||||
const QString top_level_domain = url.topLevelDomain();
|
const QString top_level_domain = url.topLevelDomain();
|
||||||
const QString url_host = url.host();
|
const QString url_host = url.host();
|
||||||
|
|
||||||
@ -165,19 +132,6 @@ QString WebFactory::toSecondLevelDomain(const QUrl &url) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return domain + top_level_domain;
|
return domain + top_level_domain;
|
||||||
#else
|
|
||||||
QString domain = url.host();
|
|
||||||
|
|
||||||
if (domain.count(QL1C('.')) == 0) {
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
while (domain.count(QL1C('.')) != 1) {
|
|
||||||
domain = domain.mid(domain.indexOf(QL1C('.')) + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return domain;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebFactory::generetaEscapes() {
|
void WebFactory::generetaEscapes() {
|
||||||
|
@ -1,3 +1,20 @@
|
|||||||
|
// This file is part of RSS Guard.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011-2016 by Martin Rotter <rotter.martinos@gmail.com>
|
||||||
|
//
|
||||||
|
// RSS Guard is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// RSS Guard is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#ifndef WEBFACTORY_H
|
#ifndef WEBFACTORY_H
|
||||||
#define WEBFACTORY_H
|
#define WEBFACTORY_H
|
||||||
|
|
||||||
@ -9,7 +26,7 @@
|
|||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
|
|
||||||
class QWebSettings;
|
class QWebEngineSettings;
|
||||||
|
|
||||||
class WebFactory : public QObject {
|
class WebFactory : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -18,11 +35,6 @@ class WebFactory : public QObject {
|
|||||||
// Destructor.
|
// Destructor.
|
||||||
virtual ~WebFactory();
|
virtual ~WebFactory();
|
||||||
|
|
||||||
// Loads the web settings directly from
|
|
||||||
// application settings and notifies the rest of
|
|
||||||
// the world about current situation.
|
|
||||||
void loadState();
|
|
||||||
|
|
||||||
// Strips "<....>" (HTML, XML) tags from given text.
|
// Strips "<....>" (HTML, XML) tags from given text.
|
||||||
QString stripTags(QString text);
|
QString stripTags(QString text);
|
||||||
|
|
||||||
@ -34,11 +46,6 @@ class WebFactory : public QObject {
|
|||||||
// count .co.uk (and others) as second-level domain
|
// count .co.uk (and others) as second-level domain
|
||||||
QString toSecondLevelDomain(const QUrl &url);
|
QString toSecondLevelDomain(const QUrl &url);
|
||||||
|
|
||||||
// Switchers.
|
|
||||||
bool javascriptEnabled() const;
|
|
||||||
bool pluginsEnabled() const;
|
|
||||||
bool autoloadImages() const;
|
|
||||||
|
|
||||||
// Singleton getter.
|
// Singleton getter.
|
||||||
static WebFactory *instance();
|
static WebFactory *instance();
|
||||||
|
|
||||||
@ -47,16 +54,6 @@ class WebFactory : public QObject {
|
|||||||
bool openUrlInExternalBrowser(const QString &url);
|
bool openUrlInExternalBrowser(const QString &url);
|
||||||
bool sendMessageViaEmail(const Message &message);
|
bool sendMessageViaEmail(const Message &message);
|
||||||
|
|
||||||
// Switchers.
|
|
||||||
void switchJavascript(bool enable, bool save_settings = true);
|
|
||||||
void switchPlugins(bool enable, bool save_settings = true);
|
|
||||||
void switchImages(bool enable, bool save_settings = true);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void javascriptSwitched(bool enabled);
|
|
||||||
void pluginsSwitched(bool enabled);
|
|
||||||
void imagesLoadingSwitched(bool enabled);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Constructor.
|
// Constructor.
|
||||||
explicit WebFactory(QObject *parent = 0);
|
explicit WebFactory(QObject *parent = 0);
|
||||||
@ -67,7 +64,6 @@ class WebFactory : public QObject {
|
|||||||
|
|
||||||
QMap<QString, QString> m_escapes;
|
QMap<QString, QString> m_escapes;
|
||||||
QMap<QString, QString> m_deEscapes;
|
QMap<QString, QString> m_deEscapes;
|
||||||
QWebSettings *m_globalSettings;
|
|
||||||
|
|
||||||
// Singleton.
|
// Singleton.
|
||||||
static QPointer<WebFactory> s_instance;
|
static QPointer<WebFactory> s_instance;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user